Здравствуйте!
Пишу ActiveX-компонент для встраивания его в Word (и последующего его использования). Знаю COM-технологию (в частности разработка DLL'ек на базовом интерфейсе IUnknown и их использование), но писать OLE-объект для встраивания его в Word или Excel не приходилось. Здесь необходимо, как я понял, знать интерфейс IDispatch.
В общем, делаю так:
— File->New->ActiveX Library.
— File->New->Active Form.
— Создаю методы в TLB, потом код прописываю для них.
— Регистрирую и компилирую созданную библиотеку OCX. Как компонент ее пока не оформлял (DPK), чтоб он был на вкладке ActiveX в Delphi.
В Word этот объект можно добавить 2 способами:
1. Элемент управления->Элемент управления OCX->и из выбираешь из списка свой объект.
2. Программно:
WordApplication1.Visible:=true;
WordApplication1.Documents.Add(EmptyParam, EmptyParam,EmptyParam,EmptyParam);
ClassType:='My_Object.Grid';
WordApplication1.ActiveDocument.InlineShapes.AddOLEControl(ClassType,EmptyParam);
Все замечательно работает. Но...
Пока что возникли следующие проблемы:
1. Свойства (состояние) вставленного и измененного OLE-объекта не сохраняются. Просмотрев форумы, стало ясно, что сохранение не предусмотрено, его нужно прописать программно. Но конкретного решения данной проблемы не нашел. А это просто необходимо.
2. Как программно запретить (если это возможно, конечно): удаление и перемещение OLE-объекта в Word'е? Еще — в Word'е есть: Элемент управления -> Конструктор форм, как пользователю запретить переходить в режим конструктора объекта? Знаю только, как убрать панель "Элемент управления": WordApplication1.ActiveDocument.CommandBars['Control Toolbox'].Set_Visible(false);
3. Как можно обращаться в свойствам объекта, находящегося в Word, из клиентского приложения? Допустим, свойство Name есть по умолчанию, если я создаю OLE-объект (не важно программно или нет), то оно становится равным My_Object1, следующее — My_Object2 и т.д. Как его изменить его программно и как его считать? Еще: как вызывать методы объекта, находящегося в Word, из клиентского приложения?
Надеюсь на помощь, заранее спасибо!
P.S. Если решу проблемы, то обязательно сообщу об этом.
никто не сталкивался хотя бы с проблемой сохранения? Главное во всех учебниках и статьях по созданию ActiveX в delphi — не описывается этот важный момент! Скачивал даже исходники примеров из одной книги, другие примеры — так у них тоже не сохраняется ничего!
Здравствуйте, m-vic, Вы писали:
MV>никто не сталкивался хотя бы с проблемой сохранения? Главное во всех учебниках и статьях по созданию ActiveX в delphi — не описывается этот важный момент! Скачивал даже исходники примеров из одной книги, другие примеры — так у них тоже не сохраняется ничего!
В чем вопрос — как реализовать сохранение состояния контрола в Delphi или есть конкретная проблема именно в Word'е? Если второе, то аналогичная проблема существует в ATL и описана в Q241936
The problem occurs because ATL's implementation of IPersistStreamInit::Save and IPersistStreamInit::Load performs a QueryInterface call to get the IDispatch of the root control from which it will persist stock properties. Because Word wraps all embedded controls in an aggregated extender object, the QueryInterface call is returning the IDispatch of the Word extender and not the internal control. This causes the persist methods to fail when saving and loading the control in certain circumstances.
Здравствуйте, algol, Вы писали:
A>В чем вопрос — как реализовать сохранение состояния контрола в Delphi или есть конкретная проблема именно в Word'е? Если второе, то аналогичная проблема существует в ATL и описана в Q241936
A>
A>The problem occurs because ATL's implementation of IPersistStreamInit::Save and IPersistStreamInit::Load performs a QueryInterface call to get the IDispatch of the root control from which it will persist stock properties. Because Word wraps all embedded controls in an aggregated extender object, the QueryInterface call is returning the IDispatch of the Word extender and not the internal control. This causes the persist methods to fail when saving and loading the control in certain circumstances.
Я думаю, что вопрос в том, как реализовать сохранение состояния контрола в Delphi. Стандартные MS-ские активХ-ы же сохраняются! Например MS Equation, и другие. А что за проблема в Word'е?