Интересно, каков предлагаемый способ встраивания и управления MS Word в TForm с точки зрения макета -? В настоящее время я (1 )поставил две TPanel на TForm. alBottom
TPanel имеет одну TButton, а alClient
TPanel имеет alNone
TOleContainer. (2 )настроить макет в обработчике событий TMainForm.FormCreate.
Проблема в том, что MS Word любит занимать все пространство родительской формы. Только четвертый способ, показанный ниже, кажется приемлемым. Основываясь на испытании -и ошибке -, кажется необходимым использовать вспомогательную форму -вместо TPanel для размещения TOleContainer. (Кроме того, Windows.SetParent кажется необходимым. )Интересно, правильно ли использовать вспомогательную -форму?
PS :Delphi XE, Word 2010, Windows 7
PS :веб-страницы, связанные с «размещением внешних приложений»:
Как выполнить оболочку для другого приложения, чтобы оно отображалось в форме Delphi
Открыть документ Word в Delphi?
PS :веб-страницы, связанные с "Формой в панели (sub -form )":
как сделать прозрачную форму внутри панели?
Delphi -OleContainer -PowerPoint -Автозапуск
unit uMainForm;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, OleCtnrs, ExtCtrls, StdCtrls;
type
TMainForm = class(TForm)
PanelOle: TPanel;
PanelBtn: TPanel;
OleContainer1: TOleContainer;
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
MainForm: TMainForm;
implementation
{$R *.dfm}
procedure TMainForm.FormCreate(Sender: TObject);
var
OleForm: TForm;
begin
////
//// 1
////
// OleContainer1.Parent := PanelOle;
// OleContainer1.Align := alClient;
//
////
//// 2
////
// Windows.SetParent(OleContainer1.Handle, PanelOle.Handle);
// OleContainer1.Align := alClient;
//
////
//// 3
////
// OleForm := TForm.Create(Self);
// OleForm.Parent := PanelOle;
// OleForm.Align := alClient;
// OleForm.Visible := True;
// OleContainer1.Parent := OleForm;
// OleContainer1.Align := alClient;
//
////
//// 4 Works!
////
// OleForm := TForm.Create(Self);
// Windows.SetParent(OleForm.Handle, PanelOle.Handle);
// OleForm.Align := alClient;
// OleForm.Visible := True;
// OleContainer1.Parent := OleForm;
// OleContainer1.Align := alClient;
//
////
//// 5
////
// OleForm := TForm.Create(Self);
// OleForm.Parent := PanelOle;
// OleForm.Align := alClient;
// OleForm.Visible := True;
// Windows.SetParent(OleContainer1.Handle,OleForm.Handle);
// OleContainer1.Align := alClient;
//
////
//// 6
////
// OleForm := TForm.Create(Self);
// Windows.SetParent(OleForm.Handle, PanelOle.Handle);
// OleForm.Align := alClient;
// OleForm.Visible := True;
// Windows.SetParent(OleContainer1.Handle,OleForm.Handle);
// OleContainer1.Align := alClient;
end;
procedure TMainForm.Button1Click(Sender: TObject);
var
// Declare the item to be a generic OleVariant to force late binding
Ds: OleVariant;
D: OleVariant;
begin
OleContainer1.CreateObjectFromFile('sample.docx', False);
OleContainer1.Run;
OleContainer1.AutoActivate := aaManual;
OleContainer1.DoVerb(ovShow); // not in FormCreate, in or after FormShow
Ds := OleContainer1.OleObject.Application.Documents;
Caption := IntToStr(Ds.Count);
end;
end.