Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2011.08.14;
Скачать: [xml.tar.bz2];

Вниз

Глюк со встраиваемыми панелями MS Office при OLE   Найти похожие ветки 

 
bss   (2011-02-17 20:51) [0]

Берем TOleContainer и загружает туда MS Word документ, при этом у панели стоит alClient. И вроде бы все хорошо...

Но стоит, допустим, выбрать в меню "Правка" -> "Буфер обмена" - то встраивается панелька справа. Потом если эту панель закрыть - то Word уже не расширяется дальше...

Наглядно ситуация представлена на картинке:

http://www.onlinedisk.ru/view/611028

Как показывают исследования - при появлении панели буфера обмена на форме появляется новый компонент в массиве Components формы (собственно, панель инструментов также инплейсится...). Потом когда нажимаешь крестик - видимо, OLE-элемент уничтожается, но компонент об этом не знает и остается на форме. Не давая растянуться обратно на всю ширину самому Word-документу...

Куда хоть копнуть можно?


 
sniknik ©   (2011-02-17 22:10) [1]

вместо alClient поставь Anchors:= [akLeft,akTop,akRight,akBottom];


 
bss   (2011-02-17 22:18) [2]

рассматривал этот вариант. Дело в том, что панель инструментов Word"а встраивается по тому же принципу. Соответственно, если align <> alClient то она встраивается вверху и перекрывает часть Word-документа.


 
bss   (2011-02-18 16:34) [3]

никто не работает с ole? (


 
bss   (2011-02-19 16:58) [4]

не верится, что среди такого широкого круга профессионалов нету человека, который не разбирался с проблемой...


 
bss   (2011-02-21 11:27) [5]

Удалено модератором


 
bss   (2011-03-04 18:49) [6]

Удалено модератором


 
Andy BitOff ©   (2011-03-04 19:03) [7]

Удалено модератором


 
bss   (2011-03-16 12:18) [8]

Никто не знает ответа? (


 
anton773   (2011-03-16 18:38) [9]


> bss   (16.03.11 12:18) [8]
> Никто не знает ответа? (

Да нету ответа на твой вопрос. Сам недавно бился с похожей проблемой. Одолеть не смог. По всей видимости причина в изначальной глчности (недоработке) компонента TOleContainer


 
bss   (2011-04-05 14:51) [10]

угу, там по коду панель не удаляется (

Может, есть аналог TOleContainer, лишенный данного недостатка?


 
clickmaker ©   (2011-04-05 15:11) [11]

> Может, есть аналог TOleContainer

унаследуй свой. Тем более, если кривой код известен


 
bss   (2011-04-06 11:58) [12]

Там наследование не получится, метод статический, если только VCL перепахивать... Очень не хочется. К тому же, там достаточно нетривиальная для меня логика, надо хорошо понимать в этих уведомлениях...


 
sniknik ©   (2011-04-06 15:59) [13]

а VCL то может и не виноват... я тогда, когда пробовал смотрел WinDowse-ом, под "глюком" "чистая" виндовая форма только остается. т.е. это сам объект не "раздвинулся". хотя должен, событие то (закрытие формы) у него внутри произошло, VCL про него не в курсе.


 
sniknik ©   (2011-04-06 16:00) [14]

> "чистая" виндовая форма
т.е. дельфевская. виндовое было бы окно ;).


 
bss   (2011-04-07 11:55) [15]

А вот и не правда твоя.

Когда COM хочет панельку прицепить - он об этом соответствующим образом уведомляет. VCL-код создает по переданным параметрам определенной ширины TPanel с соответствующим выравниванием. И именно в эту панельку рисуется доп. панелька офиса (как пример). При этом, ширина TOleContainer на форме уменьшается.

А потом панелька с точки зрения офиса убивается, а вот на форуме остается TPanel до деактивации OLE-компонента, тогда все доп. созданные панельки убиваются.


 
sniknik ©   (2011-04-07 14:46) [16]

> При этом, ширина TOleContainer на форме уменьшается.
у меня получалось так
__________________________________________
|    меню офиса, панельки быстрого запуска   |
|________________________________________|
                                      |
                                      |  пустое место
       документ                  |  с "просветом"
       офиса                      |  формы дельфи
                                      |
__________________________________________
|    подвал, строка состояния офиса...           |
|________________________________________|


куда должна уменьшиться ширина TOleContainer-а если "сверху" и "снизу" "козырьки"? или она умеет "обтекать"?


 
sniknik ©   (2011-04-07 14:47) [17]

а блин, кривое форматирование... разделение должно быть ровное и посередине ширины.
надеюсь понятно и так.


 
sniknik ©   (2011-04-07 15:03) [18]

> И именно в эту панельку рисуется доп. панелька офиса (как пример).
т.е. вместо одного "знакоместа" под обьект у тебя выходит куча под каждый контрол объекта?
вряд ли. т.к. бредово.

> VCL-код создает по переданным параметрам определенной ширины TPanel с соответствующим выравниванием.
ничего там не создано
WinDowse видит "чистую" форму под курсором. когда там пусто, и ту же форму как родителя контейнера, когда там что то есть.
... насколько помню. перепроверю вечером.


 
sniknik ©   (2011-04-07 20:04) [19]

> перепроверю вечером.
ну вот проверил.
когда TOleContainer не активен, на форме только он, под ним только форма и апликейшин (единственно дельфевые объекты)
когда открывается документ, TOleContainer "сжимается", в нем лежит собственно только документ.
все панельки, и форма про которую речь в топике, имеют тип  MsoCommandBarDok (очевидно не VCL) и "докируются" не в контейнер почему то, а на родительскую, дельфевую форму... и похоже ожидается, что дальше, за них отвечает именно эта форма...
т.е. если поставить форме драгмоде = dmAutomatic, то панельки однажды "сняв" с формы, удается и назад вставить. попутно влияя и на размеры, и положение контейнера и этих "пустышек". т.е если например на место буфера обмена, довольно широкое, вставить узкую панель инструментов, то положение объектов "подгоняется"...

что дает в общем то надежду на то что от "глюка" можно избавиться...
т.е. это не VCL, и не глюк, просто не понятая логика MS... недоделки использующего при использовании (надо поискать чего они там от нас хотят ...).


 
sniknik ©   (2011-04-07 20:28) [20]

а вот и решение...
у TOleContainer  поставить AllowActiveDoc = false;


 
sniknik ©   (2011-04-07 20:43) [21]

> а вот и решение...
поторопился... чего то менял, менял,  с этими "dock"-ами и ворд стал открываться поверх, в своем окне. не могу назад вернуть... ;(


 
bss   (2011-04-20 21:09) [22]


> поторопился... чего то менял, менял,  с этими "dock"-ами
> и ворд стал открываться поверх, в своем окне. не могу назад
> вернуть... ;(

такое происходит, если:

AllowActiveDoc = false
AllowInPlace = false

Заменить что-нибудь на true.


 
sniknik ©   (2011-04-20 21:24) [23]

> такое происходит, если:
нет. в смысле, да оно происходит... но говорил не об  этом, а об исправлении "глюка" из топика. вот что у меня тогда "потерялось".

чтобы оно и "вставлено" было, и глюка не было. добиться не смог потом, а впрочем не очень и пытался, бросил после нескольких неудачных попыток. и больше не возвращался к ним (кому это в конце концов нужно? мне или автору темы? пытайся если хочешь)


 
bss   (2011-04-21 22:44) [24]

Я перепробовал различные варианты. Вылечить глюк - не получилось. Более того, судя по мучениям и просмотру исходника компонента - глюк вылечить и не получается. Есть код (блин если честно сейчас влом искать) - который создает панельки по требованию OLE, но нет кода, реагирующего на удаление компонента, только когда OLE-контейнер становится неактивным, происходит удаление всех док-панелей.

Соответственно, вроде как выходит, что глюк не победить.

Если офис создает новую панельку - ей отводится место, сам олеконтейнер при этом изменяет свои размеры (уменьшается, в той стороне куда прилеплена новая панель).

Есть вариант, когда W&E открыывается в своем окне. Вариант устраивает, но нужно уметь ловить моменты, когда "мой" документ закрывается. При этом TOleContainer явно об этом узнает, потому что во время активации на нем появляются аля "штрихи", а когда закрывают документ - штрихи пропадают, но мне нужно отловить этот момент и пока я не знаю как...


 
Andy BitOff ©   (2011-04-21 23:12) [25]

> bss   (21.04.11 22:44) [24]
> Есть вариант, когда W&E открыывается в своем окне. Вариант
> устраивает, но нужно уметь ловить моменты, когда "мой" документ
> закрывается

TWordApplication
procedure WordAppDocumentBeforeSave(ASender: TObject; const Doc: _Document; var SaveAsUI, Cancel: WordBool);
procedure WordAppDocumentBeforeClose(ASender: TObject; const Doc: _Document; var Cancel: WordBool);



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2011.08.14;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.004 c
6-1240371968
MultIfleX
2009-04-22 07:46
2011.08.14
pcap packet format


15-1303475554
OW
2011-04-22 16:32
2011.08.14
Графы. Задачка. Забыл как доказать, не напомните?


2-1304106723
novichek
2011-04-29 23:52
2011.08.14
idHttp RSConnectionClosedGracefully


1-1261153710
d@vinchi
2009-12-18 19:28
2011.08.14
Работа с кодаками G.XXX и протоколом RTP в Delphi?


15-1303811932
prodex
2011-04-26 13:58
2011.08.14
Как оценивать стоимость программы?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский