Delphi:如何将VCL表单嵌入面板

时间:2019-06-11 18:45:14

标签: user-interface delphi embed vcl

“ Form1”表单包含一个面板。

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

但是不仅应该嵌入组件,还应该嵌入功能。

我正在使用VCL表单。

我已经在此页面上尝试过本教程。

How to put a form in panel

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中。

1 个答案:

答案 0 :(得分:1)

供以后参考,当您发布有关代码的问题时,请复制并粘贴实际代码告知可能的显示错误

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

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

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

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


Form2的{​​{1}}中嵌入了以下代码Panel1(我删除了宽度和高度设置以保持图像较小):

Form1

enter image description here

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; Top属性看起来不符合预期。这是因为Left属性的默认值为TForm.Position,这意味着表单会绕过poDefaultPosOnlyTop设置,然后将其留给操作系统来决定位置。但是,由于为表单提供了一个父级,该父级也不适用,并且表单仅放置在0,0位置。在下面添加有关Left属性的行(或在position设计器中进行设置)。

Form2

现在的结果是:

enter image description here