FormCreate程序

时间:2017-08-01 10:41:26

标签: delphi delphi-10-seattle

我的项目中有两个单位如下:

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按钮。

我该怎么做?

1 个答案:

答案 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等重要事件。针对零的测试表明设计薄弱。我认为前方存在问题。