Форум: "Corba";
Текущий архив: 2007.04.01;
Скачать: [xml.tar.bz2];
ВнизActiveX-компонент+ Word Найти похожие ветки
← →
just (2005-09-26 17:40) [0]Здравствуйте!
Пишу 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. Если решу проблемы, то обязательно сообщу об этом.
← →
just (2005-10-14 13:17) [1]никто не сталкивался хотя бы с первой проблемой? Главное во всех учебниках и статьях по созданию ActiveX в delphi - не описывается этот важный момент! Скачивал даже исходники примеров из одной книги, другие примеры - так у них тоже не сохраняется ничего!
← →
just (2005-10-27 10:40) [2]а со второй порблемой кто-нибудь сталкивался:
2. Как программно запретить (если это возможно, конечно): удаление и перемещение OLE-объекта в Word"е? Еще - в Word"е есть: Элемент управления -> Конструктор форм, как пользователю запретить переходить в режим конструктора объекта? Знаю только, как убрать панель "Элемент управления": WordApplication1.ActiveDocument.CommandBars["Control Toolbox"].Set_Visible(false);
← →
wal © (2005-10-31 10:38) [3]1. Нужно реализовать IPersist... интерфейсы
← →
just (2005-10-31 12:57) [4]2wal © (31.10.05 10:38) [3]
имеешь ввиду IPersistPropertyBag - про него везде написано. Реализовал как у Елмановой написано в ее книге "Delphi и COM":
http://www.piter.com/chapt.phtml?id=978594723149
Все то же. не помогло.
← →
wal © (2005-10-31 14:14) [5]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-11-01 09:57) [6]а что прописывать в функциях 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-11-01 10:54) [7]Дык в виндовском хелпе описано
Страницы: 1 вся ветка
Форум: "Corba";
Текущий архив: 2007.04.01;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.037 c