首页 > 解决方案 > Delphi:如何将 VCL 表单嵌入到面板中

问题描述

窗体“Form1”包含一个面板。

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

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

我正在使用 VCL 表单。

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

如何在面板中放置表格

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.

该窗体在启动时不显示,并且 Form2 未嵌入在 Form1 中。

标签: user-interfacedelphiembedvcl

解决方案


为了将来参考,当您发布有关代码的问题时,复制粘贴实际代码告知可能显示的错误

在您的问题的第一版中,您的代码Form1在相同形式的构造函数中重新创建。一段时间后,程序因资源不足错误而失败。

在您的第二版中,您更正了对代码的错误引用,Form1Form2仍然缺少一begin .. end对围绕您要设置的属性的with Form2 do. 此错误会导致堆栈溢出,因为您将Form1parent设置Panel1为 的子级Form1,因此陷入了鸡蛋-鸡蛋困境。

因为您没有提及这些错误中的任何一个,所以只能得出结论,您的代码与您发布的代码不同,或者您认为错误消息并不重要。错误的!因此,请认真学习并注意发布实际代码告知任何错误消息

此外,如果您的问题是关于表单的外观,请发布.dfm文件内容。


使用以下代码Form2显示嵌入Panel1Form1我删除了宽度和高度设置以保持图像更小):

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;

在此处输入图像描述

TopLeft属性看起来不像预期的那样。这是因为该TForm.Position属性的默认值是poDefaultPosOnly这意味着表单绕过TopLeft设置并将其留给操作系统来决定位置。然而,由于表单被赋予了一个不适用的父级,并且表单只是放置在位置 0,0。在下面添加有关position属性的行(或在Form2设计器中设置)。

...
Parent := Panel1;
Position := poDesigned; // add this line
BorderStyle := bsNone;  // and this for a better embedded appearance
Top := 10;
...

结果现在是:

在此处输入图像描述


推荐阅读