Форум: "Прочее";
Текущий архив: 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.003 c