Как правильно использовать Word в TOleContainer в TForm с макетом -?

Интересно, каков предлагаемый способ встраивания и управления MS Word в TForm с точки зрения макета -? В настоящее время я (1 )поставил две TPanel на TForm. alBottomTPanel имеет одну TButton, а alClientTPanel имеет alNoneTOleContainer. (2 )настроить макет в обработчике событий TMainForm.FormCreate.

Проблема в том, что MS Word любит занимать все пространство родительской формы. Только четвертый способ, показанный ниже, кажется приемлемым. Основываясь на испытании -и ошибке -, кажется необходимым использовать вспомогательную форму -вместо TPanel для размещения TOleContainer. (Кроме того, Windows.SetParent кажется необходимым. )Интересно, правильно ли использовать вспомогательную -форму?

PS :Delphi XE, Word 2010, Windows 7

PS :веб-страницы, связанные с «размещением внешних приложений»:

Сайт Бинь Ли

Сайт Деборы

Как выполнить оболочку для другого приложения, чтобы оно отображалось в форме Delphi

Новый взгляд на TOleContainer

Открыть документ Word в Delphi?

Delphi и Word (SimpChn)

PS :веб-страницы, связанные с "Формой в панели (sub -form )":

как сделать прозрачную форму внутри панели?

Delphi -OleContainer -PowerPoint -Автозапуск

FreePascal/Lazarus MultiDoc

TForm в панели

Как создать форму Delphi, содержащую несколько «дочерних» форм, которые можно перемещать/изменять и показывать активированными

пример кода

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.

6
задан Community 23 May 2017 в 12:22
поделиться