User interface Delphi:如何将VCL表单嵌入到面板中
表单“Form1”包含一个面板 在这个面板上,我们想嵌入第二个表单“Form2” 但不仅要嵌入组件,还要嵌入功能 我使用的是VCL表格 我已经在这个页面上尝试了这个教程User interface Delphi:如何将VCL表单嵌入到面板中,user-interface,delphi,embed,vcl,User Interface,Delphi,Embed,Vcl,表单“Form1”包含一个面板 在这个面板上,我们想嵌入第二个表单“Form2” 但不仅要嵌入组件,还要嵌入功能 我使用的是VCL表格 我已经在这个页面上尝试了这个教程 表单在启动时不显示,表单2也不嵌入到表单1中。为了便于将来参考,当您发布有关代码的问题时,请复制-粘贴实际代码,并通知可能显示的错误 在问题的第一版中,您的代码在同一表单的构造函数中重新创建了Form1。一段时间后,程序失败,出现资源不足错误 在您的第二版中,您更正了对Form1到Form2的错误引用,您的代码仍然缺少一个b
表单在启动时不显示,表单2也不嵌入到表单1中。为了便于将来参考,当您发布有关代码的问题时,请复制-粘贴实际代码,并通知可能显示的错误 在问题的第一版中,您的代码在同一表单的构造函数中重新创建了
Form1
。一段时间后,程序失败,出现资源不足错误
在您的第二版中,您更正了对Form1
到Form2
的错误引用,您的代码仍然缺少一个begin。。结束
使用Form2 do围绕要在之后设置的属性配对。此错误导致堆栈溢出,因为您正在将Form1
父级设置为Panel1
,它是Form1
的子级,这是一个鸡蛋两难的问题
因为您没有提到这些错误中的任何一个,所以只能得出结论,您的代码与您发布的代码不同,或者您认为错误消息并不重要。错了!因此,请学习本课程并注意发布实际代码,告知任何错误消息
另外,如果您的问题是关于表单的外观,请发布.dfm
文件内容
使用以下代码Form2
显示嵌入Form1
的Panel1
(我删除了宽度和高度设置以保持图像较小):
顶部
和左侧
属性的外观与预期不符。这是因为TForm.Position
属性的默认值是poDefaultPosOnly
,这意味着表单绕过顶部
和左侧
设置,由操作系统决定位置。但是,由于该表单被赋予了一个不适用于这两种情况的父级,并且该表单仅放置在位置0,0处。在下面添加有关位置
属性的行(或在表单2中设置它)
现在的结果是:
仔细查看您在过程TForm1.FormCreate(发送方:TObject)中编写的内容
。我们想嵌入第二个表单“Form2”,那么为什么要使用TForm1
?为什么要嵌入TForm
,而不是使用TFrame
TForm
是一个自由浮动的窗口,它从来没有被嵌入过TFrame
是专门为嵌入而设计的。您缺少with子句后面的begin/end对。@RemyLebeau TFrame没有TForm拥有的所有事件,如OnCreate/OnDestroy、OnShow等,因此我可以理解人们为什么要使用它。此外,他可能正在重用另一个表单,不想将其重构为一个TFrame代码>在这里可能很有价值。@Uwe毕竟,我听从了你的建议
unit parent;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, child;
type
TForm1 = class(TForm)
Panel1: TPanel;
procedure FormCreate(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
Form2 := TForm2.Create(Panel1);
with Form2 do
Name := 'MyForm';
Parent := Panel1;
Width := 500;
Height := 500;
Top := 10;
Left := 10;
Show;
end;
end.
unit child;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TForm2 = class(TForm)
btnCalc: TButton;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Label1: TLabel;
procedure btnCalcClick(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
procedure TForm2.btnCalcClick(Sender: TObject);
begin
edit3.Text:=edit1.Text+edit2.Text;
end;
end.
procedure TForm1.FormCreate(Sender: TObject);
begin
Form2 := TForm2.Create(Panel1);
with Form2 do
begin
Name := 'MyForm';
Parent := Panel1;
Top := 10;
Left := 10;
Show;
end;
end;
...
Parent := Panel1;
Position := poDesigned; // add this line
BorderStyle := bsNone; // and this for a better embedded appearance
Top := 10;
...