gpt4 book ai didi

delphi - 如何在 Delphi 中以编程方式创建带有几个组件的表单

转载 作者:行者123 更新时间:2023-12-03 14:40:56 25 4
gpt4 key购买 nike

我正在使用 Delphi 7,我正在尝试以编程方式创建一个表单。这是我的表单类 stub :

unit clsTStudentInfoForm;

interface

uses Forms;

type
TStudentInfoForm = class (TForm)

end;

implementation


end.

我的主窗体上还有一个按钮(这只是一个常规窗体,应该在运行时创建并显示上面的窗体),单击时它会创建学生窗体并将其显示为模式窗口。它确实显示了表格,但上面什么也没有。您唯一能做的就是单击窗口右上角的关闭按钮将其关闭。

procedure TLibraryForm.btnShowStudentIfoFormClick(Sender: TObject);
var
f : TStudentInfoForm;
begin
f := TStudentInfoForm.CreateNew(Self);
f.ShowModal;
f.Free;
f := nil;
end;

enter image description here

我不知道如何将组件添加到以编程方式创建的表单中(不是在运行时,而是添加到源代码中)。您能帮我编写一些代码,在学生表单中添加“确定”按钮并设置标题以及表单的高度和宽度(代码必须写入学生表单文件中)吗?

任何建议和示例都将受到高度赞赏。谢谢。

最佳答案

默认情况下(即:使用所有默认 IDE 配置设置),会自动创建新设计的表单。仅显示主窗体,可以显示辅助窗体:

procedure TForm1.Button1Click(Sender: TObject);
begin
Form2.Show;
Form3.ShowModal;
end;

禁用此自动创建选项是一种很好的常见做法。转至:工具 >(环境)选项 > (VCL) 设计器 > 模块创建选项,然后禁用/取消选中“自动创建表单和数据模块”选项。

相反,仅在需要时创建(已设计的)表单:

procedure TForm1.Button1Click(Sender: TObject);
var
Form: TForm2;
begin
Form := TForm2.Create(Self);
Form.Show;
end;

这也说明辅助表单的全局变量是不需要的,并且最好的做法是尽快删除它们以防止错误使用:

type
TForm2 = class(TForm)
end;

//var
// Form2: TForm2; << Always delete these global variable

implementation
<小时/>

如果您不想使用表单设计器设置此类辅助表单,则需要在运行时在代码中创建所有控件。如下:

unit Unit2;

interface

uses
Classes, Forms, StdCtrls;

type
TForm2 = class(TForm)
private
FButton: TButton;
public
constructor CreateNew(AOwner: TComponent; Dummy: Integer = 0); override;
end;

implementation

{ TForm2 }

constructor TForm2.CreateNew(AOwner: TComponent; Dummy: Integer = 0);
begin
inherited CreateNew(AOwner);
FButton := TButton.Create(Self);
FButton.SetBounds(10, 10, 60, 24);
FButton.Caption := 'OK';
FButton.Parent := Self;
end;

end.

如您所见,我使用了 CreateNew 构造函数。这是necessary对于 T(Custom)Form 衍生品:

Use CreateNew instead of Create to create a form without using the associated .DFM file to initialize it. Always use CreateNew if the TCustomForm descendant is not a TForm object or a descendant of TForm.

对于所有其他容器控件(例如 TPanelTFrame 等),您可以重写默认构造函数 Create

按如下方式调用此表单:

procedure TForm1.Button1Click(Sender: TObject);
var
Form: TForm2;
begin
Form := TForm2.Create(nil);
try
Form.ShowModal;
finally
Form.Free;
end;
end;

或者:

procedure TForm1.Button1Click(Sender: TObject);
begin
FForm := TForm2.CreateNew(Application);
FForm.Show;
end;

在最后一种情况下,表单不会被释放,而是在关闭时被隐藏,因此您需要将其引用存储在私有(private)字段 (FForm) 中,并在稍后释放它。或者您可以自动完成:

unit Unit2;

interface

uses
Classes, Forms, StdCtrls;

type
TForm2 = class(TForm)
private
FButton: TButton;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
public
constructor CreateNew(AOwner: TComponent; Dummy: Integer = 0); override;
end;

implementation

{ TForm2 }

constructor TForm2.CreateNew(AOwner: TComponent; Dummy: Integer = 0);
begin
inherited CreateNew(AOwner);
OnClose := FormClose;
FButton := TButton.Create(Self);
FButton.SetBounds(10, 10, 60, 24);
FButton.Caption := 'OK';
FButton.Parent := Self;
end;

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;

end.

现在,您可以在不存储引用的情况下调用它:

procedure TForm1.Button1Click(Sender: TObject);
begin
TForm2.CreateNew(Self).Show;
end;
<小时/>

是否将 SelfApplicationnil 作为新表单的所有者传递取决于您希望何时将其自动销毁如果您不手动或通过 OnClose 事件释放它。使用

  • Self:当调用表单被销毁时,将销毁新表单。当调用表单不是主表单时,这特别有用。
  • Application:应用程序结束时将销毁新表单。这将是我的首选。
  • nil:不会破坏新表单并导致应用程序完成时内存泄漏。不过,当 Windows 终止进程时,内存最终会被释放。

关于delphi - 如何在 Delphi 中以编程方式创建带有几个组件的表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16112924/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com