SOU*_*ser 6 delphi layout ole ms-word
我想知道在TForm中嵌入和控制MS Word的建议方法是什么?目前,我(1)在TForm上放了两个TPanel.该alBottomTPanel有一个TButton的,而alClientTPanel有alNoneTOleContainer.(2)在TMainForm.FormCreate事件处理程序中设置布局.
问题是MS Word喜欢占用其父表单的所有空间.只有如下所示的第四种方式似乎给出了可接受的布局.基于反复试验,似乎有必要使用子表单而不是TPanel来托管TOleContainer.(另外,Windows.SetParent似乎是必要的.)我想知道子表单是否是正确的方法?
PS:Delphi XE,Word 2010,Windows 7
PS:与"托管外部应用程序"相关的网页:
PS:与"面板形式(子表格)"相关的网页:
Delphi - OleContainer - PowerPoint - AutoPlay
如何创建包含多个"子"表单的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.
Run Code Online (Sandbox Code Playgroud)
子表单是正确的方法。我们在生产环境中使用了这种方法并且它有效。我们在面板中托管了“子”表单。但是,我们修改了 TOleContainer 和 TOleForm,并添加了是否使用父表单或最顶层表单的标志:
procedure TOurOleContainer.InitObject;
...
begin
if FDrawInTopForm then
DocForm := GetParentForm(Self)
else
DocForm := TCustomForm(Parent);
...
Run Code Online (Sandbox Code Playgroud)
其中FDrawInTopForm是我们引入的一个属性。我们还修改了:
function GetVCLFrameForm(Form: TCustomForm; DrawInTopForm: Boolean): IVCLFrameForm;
begin
if Form.OleFormObject = nil then TOleForm.Create(Form, DrawInTopForm);
Result := Form.OleFormObject as IVCLFrameForm;
end;
Run Code Online (Sandbox Code Playgroud)
不幸的是,由于与客户的协议,我无法在这里发布完整的解决方案。
| 归档时间: |
|
| 查看次数: |
11092 次 |
| 最近记录: |