Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.08.14;
Скачать: CL | DM;

Вниз

Глюк со встраиваемыми панелями 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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.009 c
2-1304245889
asdasx
2011-05-01 14:31
2011.08.14
Сравнение дробных чисел


15-1303461362
tesseract
2011-04-22 12:36
2011.08.14
Расчет стоимости владения оборудованием.


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


15-1303510486
Иксик
2011-04-23 02:14
2011.08.14
Пол Гэллико


15-1303354549
TorUser
2011-04-21 06:55
2011.08.14
Управление аудио каналами