powered by simpleCommunicator - 2.0.37     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / OleContainer - как обновлять при ресайзе формы
7 сообщений из 32, страница 2 из 2
OleContainer - как обновлять при ресайзе формы
    #40095214
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite
Однако, если сделать так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
var
  App: WordApplication;
  Doc: WordDocument;
begin
  App := IDispatch(OleContainer1.OleObject.Application) as WordApplication;
  Doc := App.ActiveDocument;
  Doc.SaveAs2('C:\asd1.docx', wdFormatXMLDocument, False, '22222', False, EmptyParam, False, False, False, False,
    False, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, wdWord2013);



То не работает.
Кажется, что Word как самостоятельное приложение и Word как объект в контейнере ведут себя по разному...
Сохранить из контейнера без пароля, загрузить уже обычным вордом через простое OLE и уже им сохранить с паролем.

...
Рейтинг: 0 / 0
OleContainer - как обновлять при ресайзе формы
    #40095215
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Из нюансов..

Код: pascal
1.
2.
3.
4.
var
  Doc: WordDocument;
begin
  Doc := IDispatch(OleContainer1.OleObject) as WordDocument;



В OleObject лежит WordDocument он же _Document

При чем, когда документ самостоятельный, то работает даже так (указываем пароль как атрибут документа, а при сохранении игнорируем параметр)
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
var
  App: WordApplication;
  Doc: WordDocument;
begin
  App := CoWordApplication.Create();
  Doc := App.Documents.Add('Normal', False, wdNewBlankDocument, True);
  App.Selection.TypeText('ZZZ');
  Doc.Password := '22222';
  Doc.SaveAs2('C:\asd.docx', wdFormatXMLDocument, False, EmptyParam, False, EmptyParam, False, False, False, False,
    False, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, wdWord2013);
  App.Quit(False, EmptyParam, EmptyParam);
end;




Но такой же способ когда word в контейнере - не работает.
...
Рейтинг: 0 / 0
OleContainer - как обновлять при ресайзе формы
    #40095217
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и таки да..
Word самостоятельный это:
Word.Application с CLSID {000209FF-0000-0000-C000-000000000046}

Word в контейнере это Word.Document с CLSID {F4754C9B-64F5-4B40-8AF4-679732AC0607}

Описания этого CLSID не нашел.. Также его нет в TLB

При чем легко работает такой каст:
Код: pascal
1.
2.
3.
4.
var
  Doc: WordDocument;
begin
  Doc := IDispatch(OleContainer1.OleObject) as WordDocument;
...
Рейтинг: 0 / 0
OleContainer - как обновлять при ресайзе формы
    #40095225
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite
{000209FF-0000-0000-C000-000000000046}
AppID: Word.Application, Word.Application.10, Word.Application.8 (Приложение Microsoft Word)

X-Cite
{F4754C9B-64F5-4B40-8AF4-679732AC0607}
AppID: Word.Document.12 (Документ Word 2007)
...
Рейтинг: 0 / 0
OleContainer - как обновлять при ресайзе формы
    #40095232
GrigoriyFomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
X-Cite

Но такой же способ когда word в контейнере - не работает.

Больше вызывает недоумение, почему в методе SaveAs2 параметр Password не срабатывает, а WritePassword - отрабатывает. Этож просто 2 параметра одной функции.
...
Рейтинг: 0 / 0
OleContainer - как обновлять при ресайзе формы
    #40095234
GrigoriyFomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вообщем, по совету ответивших пользователей накрапал такой рабочий код:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
var
  App: variant; //Это локальные переменные для сохранения пароля через костыли
  Doc: variant;
begin
  WordDoc.saveas(fullfname);
OCMain.Close;
application.ProcessMessages;
//Вот тут магия, которая почему-то работает - пароль сохраняется отлично
  App := CreateOleObject('Word.Application');
  App.Visible := False;
  App.Documents.Open(fullfname);
  Doc:=App.ActiveDocument;
  Doc.Password := '123';
  Doc.Save;
  Doc.close;
  App.Quit(False, EmptyParam, EmptyParam);
  App:=Unassigned;



Правда, теперь после отработки кода появляются 3 таких сообщения в логе IDE:
Код: plaintext
1.
Debug Output:
onecore\com\combase\dcomrem\call.cxx(4907)\combase.dll!76E50725: (caller: 76E33198) ReturnHr(1) tid(11b4) 800706BA Сервер RPC недоступен.
Что делаю не так? и как искать ошибку?

И теперь сам же породил новую проблему - как загрузить закриптованный файл ворда через CreateObjectFromFile???
Опять снимать пароль через костыль в виде App := CreateOleObject('Word.Application'); ?
...
Рейтинг: 0 / 0
OleContainer - как обновлять при ресайзе формы
    #40095297
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GrigoriyFomin
почему в методе SaveAs2 параметр Password не срабатывает, а WritePassword - отрабатывает. Этож просто 2 параметра одной функции.
Функциональность не реализована. По хорошему метод должен был вернуть E_INVALIDARG, но сделали вот так.
GrigoriyFomin
Опять снимать пароль через костыль в виде App := CreateOleObject('Word.Application'); ?
А может в контейнер можно засунуть Word.Application, а не Word.Document?
...
Рейтинг: 0 / 0
7 сообщений из 32, страница 2 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / OleContainer - как обновлять при ресайзе формы
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]