2017-07-26 110 views
0

这里是我的代码:不兼容的类型:“TCloseEvent”和“过程”

unit Unit1; 

interface 

uses 
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, 
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; 

type 
    TForm1 = class(TForm) 
    Button1: TButton; 
    procedure FormClose(Sender: TObject; var Action: TCloseAction); 
    procedure Button1Click(Sender: TObject); 
    private 
    { Déclarations privées } 
    public 
    { Déclarations publiques } 
    end; 

    TForm2 = class(TForm) 
    procedure FormClose(Sender: TObject; var Action: TCloseAction); 
    private 
    { Déclarations privées } 
    public 
    { Déclarations publiques } 
    // I try to put it here but the same problem 
    //procedure FormClose(Sender: TObject; var Action: TCloseAction); 
    end; 
var 
    Form1: TForm1; 
    Form2: TForm2; 
implementation 

{$R *.dfm} 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
Form2 := TForm2.CreateNew(Application); 
Form2.Parent := Self; 
Form2.OnClose := TForm2.FormClose; 
Form2.Show; 
end; 

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); 
begin 
    ShowMessage('Form1Close'); 
end; 

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction); 
begin 
    ShowMessage('Form2Close'); 
end; 
end. 

当我尝试分配FormCloseOnClose事件Form2的,我得到了以下错误消息:

[Dcc32错误] Unit1.pas(40):E2010不兼容的类型: 'TCloseEvent' 和 '过程'

当我将其更改为:

Form2.OnClose := FormClose; 

它工作正常,但就是喜欢Self.FormClose,而不是TForm2.FormClose程序。

如何将TForm2.FormClose指定为Form2.Onclose

+0

我没有意识到这是甚至有可能在同一个单位两种形式......显然,两个班都正常。但是,这两种形式是否也共享相同的DFM?那将如何工作? –

+0

@Jerry dfm仅定义一个表单的属性。另一个没有dfm,因此使用了CreateNew。 –

回答

3

变化TForm2.FormCloseForm2.FormClose

Form2.OnClose := Form2.FormClose; 

不过,既然你想用属于你刚刚创建相同对象的句柄相关联的OnClose事件,这将是更好的只是移动TForm2到拥有自己的设计时DFM独立的单元,然后你可以指定在设计时的TForm2.OnClose事件,让DFM把它挂你,当TForm2.Create()是在运行时调用:

unit Unit1; 

interface 

uses 
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, 
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; 

type 
    TForm1 = class(TForm) 
    Button1: TButton; 
    procedure FormClose(Sender: TObject; var Action: TCloseAction); 
    procedure Button1Click(Sender: TObject); 
    private 
    { Déclarations privées } 
    public 
    { Déclarations publiques } 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 

uses 
    Unit2; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    Form2 := TForm2.Create(Application); 
    Form2.Parent := Self; 
    Form2.Show; 
end; 

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); 
begin 
    ShowMessage('Form1Close'); 
end; 

end. 

unit Unit2; 

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) 
    procedure FormClose(Sender: TObject; var Action: TCloseAction); 
    private 
    { Déclarations privées } 
    public 
    { Déclarations publiques } 
    end; 

var 
    Form2: TForm2; 

implementation 

{$R *.dfm} 

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction); 
begin 
    ShowMessage('Form2Close'); 
end; 

end. 
+0

谢谢你,有时候人们完全失去了他们的焦点:) – Sami