User interface Delphi:如何将VCL表单嵌入到面板中

User interface Delphi:如何将VCL表单嵌入到面板中,user-interface,delphi,embed,vcl,User Interface,Delphi,Embed,Vcl,表单“Form1”包含一个面板 在这个面板上,我们想嵌入第二个表单“Form2” 但不仅要嵌入组件,还要嵌入功能 我使用的是VCL表格 我已经在这个页面上尝试了这个教程 表单在启动时不显示,表单2也不嵌入到表单1中。为了便于将来参考,当您发布有关代码的问题时,请复制-粘贴实际代码,并通知可能显示的错误 在问题的第一版中,您的代码在同一表单的构造函数中重新创建了Form1。一段时间后,程序失败,出现资源不足错误 在您的第二版中,您更正了对Form1到Form2的错误引用,您的代码仍然缺少一个b

表单“Form1”包含一个面板

在这个面板上,我们想嵌入第二个表单“Form2”

但不仅要嵌入组件,还要嵌入功能

我使用的是VCL表格

我已经在这个页面上尝试了这个教程


表单在启动时不显示,表单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;
...