我的项目中有两个单位如下:
1 - Connexion单位:
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
表单时应该触发该过程。
应用程序运行时没有任何错误,但应在B
表单上创建FMain
按钮。
我该怎么做?
答案 0 :(得分:4)
Constructor FormCreate(Sender: TObject);overload;
错了。它应该是:
procedure FormCreate(Sender: TObject);
另一个问题是您必须将OnCreate
事件设置为引用FormCreate
。在对象检查器的事件页面中执行此操作。
这也需要你有一个你看来没有的这个表格的dfm文件。恢复dfm文件后,您可以以相同的方式设置OnClose
事件处理程序。您需要切换到Create
而不是CreateNew
。
您无法在代码中设置OnCreate
事件处理程序,因为表单已经创建。
如果有充分的理由不拥有dfm文件并在代码中执行所有操作,那么您可能需要添加构造函数。通过覆盖虚拟构造函数来做到这一点:
constructor Create(AOwner: TComponent); override;
最后,问题中的很多代码看起来都很可疑,我应该看到。奇怪地使用全局变量。奇怪的命名。从课堂外设置OnClose
等重要事件。针对零的测试表明设计薄弱。我认为前方存在问题。