gpt4 book ai didi

delphi - 如何在 TForm 的 TOleContainer 中正确使用 Word(布局方面)?

转载 作者:行者123 更新时间:2023-12-03 15:02:30 25 4
gpt4 key购买 nike

我想知道在 TForm 中嵌入和控制 MS Word 的建议方法是什么?目前,我(1)在TForm上放置了两个TPanel。 alBottom TPanel 有一个 TButton,alClient TPanel 有一个 alNone TOleContainer。 (2) 在 TMainForm.FormCreate 事件处理程序中设置布局。

问题是 MS Word 喜欢占用其父窗体的所有空间。只有如下所示的第四种方式似乎可以提供可接受的布局。根据反复试验,似乎有必要使用子表单而不是 TPanel 来承载 TOleContainer。 (另外,Windows.SetParent 似乎是必要的。)我想知道子表单是否是正确的方法?

PS:Delphi XE、Word 2010、Windows 7

PS:与“托管外部应用程序”相关的网页:

Binh Ly's site

Deborah's site

How to shell to another app and have it appear in a delphi form

TOleContainer Revisited

Open word document in delphi?

Delphi & Word (SimpChn)

PS:“面板中的表单(子表单)”相关网页:

how to make a transparent form inside Panel?

Delphi - OleContainer - PowerPoint - AutoPlay

FreePascal/Lazarus MultiDoc

TForm in a panel

How to create a delphi form containing multiple 'child' forms that can be moved/sized and show activated

示例代码

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.

最佳答案

子表单是正确的方法。我们在生产环境中使用了这种方法并且它有效。我们在面板中托管了“子”表单。但是,我们修改了 TOleContainer 和 TOleForm,并添加了是否使用父窗体或最顶层窗体的标志:

procedure TOurOleContainer.InitObject;
...
begin
if FDrawInTopForm then
DocForm := GetParentForm(Self)
else
DocForm := TCustomForm(Parent);
...

其中FDrawInTopForm是我们引入的一个属性。我们还修改了:

function GetVCLFrameForm(Form: TCustomForm; DrawInTopForm: Boolean): IVCLFrameForm;
begin
if Form.OleFormObject = nil then TOleForm.Create(Form, DrawInTopForm);
Result := Form.OleFormObject as IVCLFrameForm;
end;

不幸的是,由于与客户的协议(protocol),我无法在这里发布完整的解决方案。

关于delphi - 如何在 TForm 的 TOleContainer 中正确使用 Word(布局方面)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11318492/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com