Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: ActiveX/СОМ/CORBA > OleContainer ActiveX ms word


Автор: rith2 23.7.2009, 18:43
Привет.

Ситуация - ActiveX Library -> ActiveXForm -> на ней OleContainer -> в него загружается документ ms word -> Компонент регистрируется.

Проблема - Если АктивХ компонент в пределах одного  приложения вызывается >1 раза, то есть несколько экземпляров ms word в OleContainer'е , то у них блокируется панель инструментов, кроме документа ms word, который был открыт самым последним. Печатать можно, но панель с инструментами заблочена.

Как я понял проблема эта распространенная и связана с тем, что документы ворда както криво вешаются на один и тотже процесс ms word... 

Пробовал создавать свой WordApplication и у него создавать  WordDocument - не катит. 

В Королевстве Делфи было решение:

"....У объекта TOleContainer имеется внутренняя переменная FDocView, указывающая на интерфейс IOleDocumentView и инициализирующаяся в начале активизации OleContainerа: ...В свою очередь, у интерфейса IOleDocumentView есть метод Show(fShow: BOOL): .....Для "оживления" заблокированных документов, достаточно вызвать этот метод с параметром "false". Добавляем процедуру (или функцию с возможностью обработки ошибок, кому как больше нравится) ShowView(fShow : boolean) в TOleContainer:" (с) Королевство Делфи

Не прокатил метод.

На японском форуме вроде на решение наткнулся, но там по нему какаято дискуссия идет... а японский я не знаю smile . Пробовал переводить переводчиком в гугле - понятного мало.

Помогите а? Бьюсь над проблемой этой а выхода не видно :(((

Автор: rith2 2.8.2009, 14:14
Пока занимался другими вопросами и сейчас снова вернулся к этой проблеме... вот так вот работает приложение:

Код

var
  TApp: TWordApplication;
 TDoc: TWordDocument;
  Template,Param:OleVariant;
  FileName, FilePath: OleVariant;
  FileNum:String;
begin
  randomize;
  FileNum:= IntToStr(Random(50000)); //номер присоединяемый к имени файла
  
    TApp:= TWordApplication.Create(Application);
    TApp.AutoConnect:= True;
    TApp.ConnectKind:= ckNewInstance;
    Template:= 'normal'; Param:= False;
    TApp.Documents.AddOld(Template, Param);  

    TDoc:= TWordDocument.Create(Application);
    TDoc.ConnectTo(TApp.ActiveDocument);
    FileName:= 'file'+FileNum+'.doc'; //имя файла
    TDoc.SaveAs(FileName); //сохраняется

    FilePath:= TDoc.Path+'\'+FileName;

   OleCont.CreateObjectFromFile(FilePath, False); //загрузка в контейнер
   OleCont.DoVerb(ovShow);
   OleCont.SetFocus;



По разному пробовал - остановился на следующем - создается файл, ему присваивается случайное имя. Сохраняется в "Мои документы", откуда загружается в ОлеКонтейнер. Весь проект сохранен как .ocx компонент, который загружается в стороннем приложении. 

Вызываем в этом стороннем приложении этот компонент - ворд грузится (создается процесс WinWord), все работает
Вызываем еще раз в стороннем приложении этот компонент (создаетс еще один процесс) - панель инструментов у 1го открытого документа умирает, будто бы Enabled:= False. У только что открытого документа все работает...   

Хотя текст добавлять получается....

ничего уже не понимаю.. все работает в разных процессах, почему такие косяки с панелью инструментов???? smile 

Автор: rith2 2.8.2009, 15:07
и даже у них какбы не Enаbled:= False (имхо тогда иконки должны стать бесцветными), а будто бы фокус чтоли у панели получить не получается....

Автор: Данкинг 2.8.2009, 16:38
Т.е. через "createoleobject" тоже не получается?

Автор: rith2 2.8.2009, 20:46
Цитата(Данкинг @ 2.8.2009,  16:38)
Т.е. через "createoleobject" тоже не получается?

Не получается...

Единственно как получается это если приконнектить файл к контейнеру через

OleContainer.CreateLinkToFile

Но документ открывается тогда не в окне приложения а совсем в отдельном, что не подходит....

ваще мыслей нет как быть, вроде бы ощущение, что решение гдето близко, но где именно понять не могу  smile 

Автор: rith2 3.8.2009, 18:59
Скачал тут компонент (вернее демку)... называется Ultra Office Control - осх компонент позволящий осуществлять загрузку приложений мс офис в свою программу - заметил, что при создании, например, нескольких копий документов у ворда - запускается лишь один вордовский процес... 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)