FormCreate过程
FormCreate procedure
我的项目中有两个单元如下:
1 - 连接单元:
unit Connexion;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TFConn = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Déclarations privées }
public
{ Déclarations publiques }
end;
var
FConn: TFConn;
implementation
{$R *.dfm}
uses MainForm;
procedure TFConn.Button1Click(Sender: TObject);
begin
if not Assigned(FMain) then
begin
FMain := TFMain.CreateNew(Application);
FMain.OnClose := FMain.FormClose;
FMain.ShowModal;
end;
end;
end.
2 - MainForm 单元:
unit MainForm;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TFMain = class(TForm)
Constructor FormCreate(Sender: TObject);overload;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
end;
Var
FMain : TFMain;
implementation
Constructor TFMain.FormCreate(Sender: TObject);
var B : TButton;
begin
inherited;
B := TButton.Create(Self);
B.Parent := Self;
B.Caption := 'Button2';
end;
procedure tfmain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
FMain := Nil;
end;
end.
问题是 MainForm 单元中的程序 FormCreate
不工作,我知道我在声明中漏掉了一些东西,因为程序应该在创建 FMain
表单时触发。
应用程序 运行 没有任何错误,但它应该在 FMain
表单上创建 B
按钮。
我该怎么做?
Constructor FormCreate(Sender: TObject);overload;
错了。应该是:
procedure FormCreate(Sender: TObject);
另一个问题是您必须设置 OnCreate
事件来引用 FormCreate
。在对象检查器的事件页面中执行此操作。
这还需要您拥有此表格的 dfm 文件,而您似乎没有。恢复 dfm 文件后,您可以用相同的方式设置 OnClose
事件处理程序。您需要切换到 Create
而不是 CreateNew
。
您不能在代码中设置 OnCreate
事件处理程序,因为表单已经创建。
如果有充分的理由不使用 dfm 文件并在代码中执行所有操作,那么您可能需要添加构造函数。通过覆盖虚拟构造函数来做到这一点:
constructor Create(AOwner: TComponent); override;
最后,问题中的大部分代码看起来都可疑,我看到了吗?全局变量的奇怪使用。奇怪的命名。从 class 之外设置重要事件,例如 OnClose
。针对 nil 进行测试表明设计薄弱。我认为前面有问题。
我的项目中有两个单元如下:
1 - 连接单元:
unit Connexion;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TFConn = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Déclarations privées }
public
{ Déclarations publiques }
end;
var
FConn: TFConn;
implementation
{$R *.dfm}
uses MainForm;
procedure TFConn.Button1Click(Sender: TObject);
begin
if not Assigned(FMain) then
begin
FMain := TFMain.CreateNew(Application);
FMain.OnClose := FMain.FormClose;
FMain.ShowModal;
end;
end;
end.
2 - MainForm 单元:
unit MainForm;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TFMain = class(TForm)
Constructor FormCreate(Sender: TObject);overload;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
end;
Var
FMain : TFMain;
implementation
Constructor TFMain.FormCreate(Sender: TObject);
var B : TButton;
begin
inherited;
B := TButton.Create(Self);
B.Parent := Self;
B.Caption := 'Button2';
end;
procedure tfmain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
FMain := Nil;
end;
end.
问题是 MainForm 单元中的程序 FormCreate
不工作,我知道我在声明中漏掉了一些东西,因为程序应该在创建 FMain
表单时触发。
应用程序 运行 没有任何错误,但它应该在 FMain
表单上创建 B
按钮。
我该怎么做?
Constructor FormCreate(Sender: TObject);overload;
错了。应该是:
procedure FormCreate(Sender: TObject);
另一个问题是您必须设置 OnCreate
事件来引用 FormCreate
。在对象检查器的事件页面中执行此操作。
这还需要您拥有此表格的 dfm 文件,而您似乎没有。恢复 dfm 文件后,您可以用相同的方式设置 OnClose
事件处理程序。您需要切换到 Create
而不是 CreateNew
。
您不能在代码中设置 OnCreate
事件处理程序,因为表单已经创建。
如果有充分的理由不使用 dfm 文件并在代码中执行所有操作,那么您可能需要添加构造函数。通过覆盖虚拟构造函数来做到这一点:
constructor Create(AOwner: TComponent); override;
最后,问题中的大部分代码看起来都可疑,我看到了吗?全局变量的奇怪使用。奇怪的命名。从 class 之外设置重要事件,例如 OnClose
。针对 nil 进行测试表明设计薄弱。我认为前面有问题。