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

Вниз

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 вся ветка

Текущий архив: 2007.04.01;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.058 c
2-1173794474
Romm
2007-03-13 17:01
2007.04.01
Трей


11-1153305248
DmiSb
2006-07-19 14:34
2007.04.01
Не получается через ADO открыть *.dbf


1-1170856465
Badhabit
2007-02-07 16:54
2007.04.01
DBGrid и поле DateTime


2-1173248405
Oleg_teacher
2007-03-07 09:20
2007.04.01
Описание процедуры


1-1170597043
TStas
2007-02-04 16:50
2007.04.01
Как программно скачать из инета файл в определенное место?