powered by simpleCommunicator - 2.0.37     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / OleContainer - как обновлять при ресайзе формы
32 сообщений из 32, показаны все 2 страниц
OleContainer - как обновлять при ресайзе формы
    #40093584
GrigoriyFomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть форма, на которой лежит OleContainer OCMain.
У него свойство Align:=alClient
Как сделать, чтоб при изменении размеров формы корректно изменял размер контейнера? Сейчас при ресайзе формы белый лист ворда с содержимым остается прежнего размера - как на вложенном изображении.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
  
  OCMain.CreateObjectFromFile(Fullfname,false);  
  OCMain.DoVerb(ovPrimary);
  OCMain.OleObjectInterface.QueryInterface(IOleInPlaceObject, IOPO);
  IOPO.UIDeactivate;
  IOPO := nil;
  OCMain.Run;



И еще - как запретить редактирование документа?
Строка
Код: pascal
1.
  OCMain.OleObject.Protect(3)



в зависимости от места расположения в коде открытия файла в олеконтейнере, то вызывает ошибку "интерфейс не поддерживает метод протект", то вызывает "сбой при удаленном вызове процедуры".
...
Рейтинг: 0 / 0
OleContainer - как обновлять при ресайзе формы
    #40093585
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GrigoriyFomin,

1. вот нафига тебе этот глючный олеконтейнер, используй ворд как сом-сервер, как все люди.

2. Ворд документ может быть открыт с флагом ReadOnly.

3. Ворд документ имеет свойство Final, установи его в True.
...
Рейтинг: 0 / 0
OleContainer - как обновлять при ресайзе формы
    #40093597
GrigoriyFomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ъъъъъ,

ну я просто другого способа отображать содержимое форда в СВОЕМ окне не знаю, поэтому его и использую. А можно как-то по-другому? Мне надо в моем окне показывать ворд без его панелей с моей собственной панелью инструментов
...
Рейтинг: 0 / 0
OleContainer - как обновлять при ресайзе формы
    #40093636
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Передавай в контейрер события ресайза и там внутри его обрабатывай.

Это если контейнер самописный. Если нет - ищи его методы для ресайза.
...
Рейтинг: 0 / 0
OleContainer - как обновлять при ресайзе формы
    #40093748
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GrigoriyFomin,

вообще, TOleControl сам следит за размером
ищите в Vcl.OleCtrls
Код: pascal
1.
FOleInPlaceObject.SetObjectRects
...
Рейтинг: 0 / 0
OleContainer - как обновлять при ресайзе формы
    #40094976
GrigoriyFomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, решил не плодить тем, спрошу тут. Много часов пытаюсь побудить - не получается, перегуглил все, что можно.
Задача - сохранить вордовский документ с паролем на открытие:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
procedure TdpFrEventText.SaveEventText;
var wa,wd: Variant;
begin
	WA:=IDispatch(OCMain.OleObject.Application);// as WordApplication;
	WD:=WA.ActiveDocument;
	wd.SaveAs2(FileName := fullfname,Password:='123',AddToRecentFiles:=false);
end;


уж как я только не пробовал, и через SaveAs, и просто Save. Изменения в файле сохраняются, пароль - нет. Макросы VBA говорят, что я все делаю правильно. Что я не учел? Спасибо заранее
...
Рейтинг: 0 / 0
OleContainer - как обновлять при ресайзе формы
    #40095008
Фотография peter64
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GrigoriyFomin,
а так :
document.Protect(Password := yourPassword);
document.SaveAs(yourFileName);
document.Close;
...
Рейтинг: 0 / 0
OleContainer - как обновлять при ресайзе формы
    #40095091
GrigoriyFomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
peter64
GrigoriyFomin,
а так :
document.Protect(Password := yourPassword);
document.SaveAs(yourFileName);
document.Close;

он требует еще один обязательный параметр Type.
Код: pascal
1.
 aDoc.Protect Type:=wdAllowOnlyRevisions, Password:=strPassword 


и он защищает только от модификации, сам документ при любом типе будет виден.

Ни в какую не воспринимает пароль при SaveAs2. Хоть бери сами ворды жмакай GZip и паролируй...
...
Рейтинг: 0 / 0
OleContainer - как обновлять при ресайзе формы
    #40095106
GrigoriyFomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
может после SaveAs2 нужно еще какие-то методы вызвать?
...
Рейтинг: 0 / 0
OleContainer - как обновлять при ресайзе формы
    #40095116
GrigoriyFomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не ,это какое-то издевательство от ворда. Делаю так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
	WA:=IDispatch(OCMain.OleObject.Application);// as WordApplication;
	WD:=WA.ActiveDocument;

//	wd.Protect(Type:=0, Password := '111');
//  wd.saveAs(fullfname);
	wd.SaveAs2(
FileName:=fullfname,
FileFormat:=12,
//LockComments:=False,
Password:='123',
AddToRecentFiles:=False,
WritePassword:='456'
//ReadOnlyRecommended:=False,
//EmbedTrueTypeFonts:=False,
//SaveNativePictureFormat:=True,
//SaveFormsData:=False,
//SaveAsAOCELetter:=False,
//Encoding:=65001,
//InsertLineBreaks:=True,
//AllowSubstitutions:=False,
//LineEnding:=0,
//AddBiDiMarks:=False,
//CompatibilityMode:=65535
);


Он, зараза, пароль на запись сохраняет, при открытии документа спрашивает пароль на запись либо открыть в режиме только чтения. Как с ним бороться?
...
Рейтинг: 0 / 0
OleContainer - как обновлять при ресайзе формы
    #40095117
Фотография peter64
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GrigoriyFomin,
в доке пишут https://docs.microsoft.com/en-us/office/vba/api/word.saveas2#example] про WdProtectionType так:
wdAllowOnlyComments 1 (Разрешите добавление только примечаний в документ.)
wdAllowOnlyFormFields 2 (Разрешить добавление контента в документ только с помощью полей формы.)
wdAllowOnlyReading 3 (Разрешение доступа к документу только для чтения.)
wdAllowOnlyRevisions 0 (Разрешить только изменения существующего контента.)
wdNoProtection -1 (Не применяйте защиту к документу.)
и пример на VB :
Sub SaveWithPassword(docCurrent As Document, strPWD As String)
With docCurrent
.SaveAs2 WritePassword:=strPWD
End With
End Sub
...
Рейтинг: 0 / 0
OleContainer - как обновлять при ресайзе формы
    #40095119
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Самоочевидная идея - сразу открывать только на чтение - не работает?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
OleContainer - как обновлять при ресайзе формы
    #40095130
GrigoriyFomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

у меня типа своя система хранения документов. Копирую пустую болванку на нужное место, открываю ее в олеконтейнере, пользоваитель в ней работает, вносит свои тексты и нажимает мое ""Сохранить". И тут я этот документ должен сохранить уже с паролем, чтоб никто не смог его открыть и ЧИТАТЬ. Получается только сохранить с паролем на сохранение, а пароль на открытие - игнорится. Метод Protect не дает желаемого результата - он защищает документ от модификации, но открыть его для чтения - никаких проблем
...
Рейтинг: 0 / 0
OleContainer - как обновлять при ресайзе формы
    #40095131
GrigoriyFomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
peter64
GrigoriyFomin,

Sub SaveWithPassword(docCurrent As Document, strPWD As String)
With docCurrent
.SaveAs2 WritePassword:=strPWD
End With
End Sub

то работает, но документ открыть можно в режиме "только чтение". Мне надо, чтоб его без пароля вообще открыть нельзя было.
...
Рейтинг: 0 / 0
OleContainer - как обновлять при ресайзе формы
    #40095135
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не поможет?
https://docs.microsoft.com/ru-ru/office/vba/api/word.wdsaveformatwdFormatEncodedText 7 Кодированный текстовый формат.
...
Рейтинг: 0 / 0
OleContainer - как обновлять при ресайзе формы
    #40095136
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GrigoriyFomin,

А покажите макрос, который сохраняет правильно
...
Рейтинг: 0 / 0
OleContainer - как обновлять при ресайзе формы
    #40095145
GrigoriyFomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
    Selection.TypeText Text:="qweqweqwe"
    ChangeFileOpenDirectory "B:\"
    ActiveDocument.SaveAs2 FileName:="qweqweqwe.docx", FileFormat:= _
        wdFormatXMLDocument, LockComments:=False, Password:="123", _
        AddToRecentFiles:=True, WritePassword:="", ReadOnlyRecommended:=False, _
        EmbedTrueTypeFonts:=False, SaveNativePictureFormat:=False, SaveFormsData _
        :=False, SaveAsAOCELetter:=False, CompatibilityMode:=14


Я все эти поля перенес - все равно не сохраняется пароль на открытие
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
var wa,wd: Variant;
begin
	WA:=IDispatch(OCMain.OleObject.Application);// as WordApplication;
	WD:=WA.ActiveDocument;

//	wd.Protect(Type:=0, Password := '111');
//  wd.saveAs(fullfname);
	wa.ChangeFileOpenDirectory(extractfilepath(fullfname));
	wd.SaveAs2(

FileName:=ExtractFileName(fullfname),
FileFormat:=12,
LockComments:=False,
Password:='123',
AddToRecentFiles:=False,
WritePassword:='',
ReadOnlyRecommended:=False,
EmbedTrueTypeFonts:=False,
SaveNativePictureFormat:=False,
SaveFormsData:=False,
SaveAsAOCELetter:=False,
CompatibilityMode:=14
);
...
Рейтинг: 0 / 0
OleContainer - как обновлять при ресайзе формы
    #40095151
Фотография peter64
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
OleContainer - как обновлять при ресайзе формы
    #40095170
GrigoriyFomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
peter64,

там очень сложно, я пробовал кусками от код, например, wd.password:='MyPass' ничего не меняет. Такое ощущение, что либо чего-то не хватает, то ли что-то не доделываю....
...
Рейтинг: 0 / 0
OleContainer - как обновлять при ресайзе формы
    #40095195
GrigoriyFomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
господа, не дайте разочароваться в дельфи, 25 лет на ней, неужели ничего нельзя сделать с паролированием файла ворда? пора, видимо, в вэб уходить переучиваться....
...
Рейтинг: 0 / 0
OleContainer - как обновлять при ресайзе формы
    #40095198
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GrigoriyFomin
там очень сложно, я пробовал кусками от код, например, wd.password:='MyPass' ничего не меняет. Такое ощущение, что либо чего-то не хватает, то ли что-то не доделываю....
Блин сделал запись макроса:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Sub SaveWithPassword()
    With ActiveDocument
        .ReadOnlyRecommended = False
        .Password = "123"
        .WritePassword = ""
        .RemovePersonalInformation = False
        .RemoveDateAndTime = False
    End With
    With Options
        .WarnBeforeSavingPrintingSendingMarkup = False
        .StoreRSIDOnSave = True
        .ShowMarkupOpenSave = True
    End With
    ChangeFileOpenDirectory "D:\"
    ActiveDocument.SaveAs2 FileName:="12345.docx", FileFormat:= _
        wdFormatXMLDocument, LockComments:=False, Password:="123", _
        AddToRecentFiles:=True, WritePassword:="", ReadOnlyRecommended:=False, _
        EmbedTrueTypeFonts:=False, SaveNativePictureFormat:=False, SaveFormsData _
        :=False, SaveAsAOCELetter:=False, CompatibilityMode:=15
End Sub


Проверил, макрос работает.
Повтори в виде OLE, да и все.
GrigoriyFomin
господа, не дайте разочароваться в дельфи, 25 лет на ней, неужели ничего нельзя сделать с паролированием файла ворда? пора, видимо, в вэб уходить переучиваться....
На вебе пароли для ворда через OLE лучше ставятся, да?
...
Рейтинг: 0 / 0
OleContainer - как обновлять при ресайзе формы
    #40095205
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GrigoriyFomin
господа, не дайте разочароваться в дельфи, 25 лет на ней, неужели ничего нельзя сделать с паролированием файла ворда? пора, видимо, в вэб уходить переучиваться....
Скорее уж все разочаруются в тебе. Уходи в веб и там шифруй файл ворда, а когда научишься - возвращайся и делай аналогично. Возможно к тому времени дойдёт, что делфи к ворду никаким боком не относится
...
Рейтинг: 0 / 0
OleContainer - как обновлять при ресайзе формы
    #40095206
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все работает...

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
uses
  Word_TLB;

procedure TForm2.Button1Click(Sender: TObject);
var
  App: WordApplication;
  Doc: WordDocument;
begin
  App := CoWordApplication.Create();
  App.Visible := True;
  Doc := App.Documents.Add('Normal', False, wdNewBlankDocument, True);
  App.Selection.TypeText('ZZZ');
  Doc.SaveAs2('C:\asd.docx', wdFormatXMLDocument, False, '22222', False, EmptyParam, False, False, False, False,
    False, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, wdWord2013);
end;



Запрашивает пароль...
...
Рейтинг: 0 / 0
OleContainer - как обновлять при ресайзе формы
    #40095208
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет.

GrigoriyFomin
господа, не дайте разочароваться в дельфи, 25 лет на ней, неужели ничего нельзя сделать с паролированием файла ворда? пора, видимо, в вэб уходить переучиваться....


Вот фрагменты из какого-то старого проекта:

Защита паролем:
Код: sql
1.
    <MyOleContainer>.OleObject.Application.ActiveDocument.Protect( wdAllowOnlyComments, False, <Password> );



Снятие защиты:
Код: pascal
1.
    <MyOleContainer>.OleObject.Application.ActiveDocument.Unprotect( <Password> );
...
Рейтинг: 0 / 0
OleContainer - как обновлять при ресайзе формы
    #40095209
Фотография 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 как объект в контейнере ведут себя по разному...
Учитывая что можно словить такое:

Код: pascal
1.
App.Documents.Add('Normal', False, wdNewBlankDocument, True);


Project Project2.exe raised exception class EOleException with message 'Метод или свойство Add недоступны, потому что данный документ находится в другом приложении'.
...
Рейтинг: 0 / 0
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
32 сообщений из 32, показаны все 2 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / OleContainer - как обновлять при ресайзе формы
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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