![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ActiveX-компонент+ Word [Delphi, Windows]
just © (2005-09-26 17:40:00)Здравствуйте!
Пишу 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. Если решу проблемы, то обязательно сообщу об этом.
wal (2005-11-01 10:54:00) [1]Дык в виндовском хелпе описано
just (2005-11-01 09:57:00) [2]а что прописывать в функциях IPersistStorage?
function IPersistStorage.IsDirty = PersistStorageIsDirty;
function IPersistStorage.InitNew = PersistStorageInitNew;
function IPersistStorage.Load = PersistStorageLoad;
function IPersistStorage.Save = PersistStorageSave;
function IPersistStorage.SaveCompleted = PersistStorageSaveCompleted;
function IPersistStorage.HandsOffStorage = PersistStorageHandsOffStorage;
function IPersistStorage.GetClassID = PersistStorageGetClassID;
function PersistStorageIsDirty: HResult; stdcall;
function PersistStorageInitNew(const stg: IStorage): HResult; stdcall;
function PersistStorageLoad(const stg: IStorage): HResult; stdcall;
function PersistStorageSave(const stgSave: IStorage; fSameAsLoad: BOOL): HResult; stdcall;
function PersistStorageSaveCompleted(const stgNew: IStorage): HResult; stdcall;
function PersistStorageHandsOffStorage: HResult; stdcall;
function PersistStorageGetClassID(out classID: TCLSID): HResult; stdcall;
У Елмановой про IPersistPropertyBag написано, а про IPersistStorage не нашел. Кто-нить знает?
wal (2005-10-31 14:14:00) [3]IPersistPropertyBag - используется только веб-браузерами в конструкции типа
<OBJECT classid=" http://www.miamachina.it/analogclock.py">
<PARAM name="height" value="40" valuetype="data">
<PARAM name="width" value="40" valuetype="data">
</OBJECT>
Есть еще IPersistFile, IPersistStorage, IPersistStream, IPersistStreamInit, IPersistTextStream. Кого из них использует ворд, я не в курсе, скорее всего IPersistStorage.
С уважением
just (2005-10-31 12:57:00) [4]2wal © (31.10.05 10:38) [3]
имеешь ввиду IPersistPropertyBag - про него везде написано. Реализовал как у Елмановой написано в ее книге "Delphi и COM":
http://www.piter.com/chapt.phtml?id=978594723149
Все то же. не помогло.
wal (2005-10-31 10:38:00) [5]1. Нужно реализовать IPersist...интерфейсы
just (2005-10-27 10:40:00) [6]а со второй порблемой кто-нибудь сталкивался:
2. Как программно запретить (если это возможно, конечно): удаление и перемещение OLE-объекта в Word'е? Еще - в Word'е есть: Элемент управления -> Конструктор форм, как пользователю запретить переходить в режим конструктора объекта? Знаю только, как убрать панель "Элемент управления": WordApplication1.ActiveDocument.CommandBars['Control Toolbox'].Set_Visible(false);
just (2005-10-14 13:17:00) [7]никто не сталкивался хотя бы с первой проблемой? Главное во всех учебниках и статьях по созданию ActiveX в delphi - не описывается этот важный момент! Скачивал даже исходники примеров из одной книги, другие примеры - так у них тоже не сохраняется ничего!