2017-07-26 14 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. 

私はForm2FormCloseOnCloseにイベントを割り当てるしようとすると、私は次のようなエラーメッセージを得た:

[DCC32エラー] Unit1.pas(40):E2010互換性のないタイプ: 'TCloseEvent' と 'プロシージャ' 私はそれを変更

Form2.OnClose := FormClose; 

それが正常に動作しますが、それはSelf.FormClose、ないTForm2.FormClose手順のようなものです。

TForm2.FormCloseForm2.Oncloseを割り当てるにはどうすればよいですか?

+0

私は同じユニットに二つの形式を持つことさえ可能だった気づいていなかった...明らかに、2つのクラスが正常です。しかし、これらの両方のフォームも同じDFMを共有していますか?それはどのように働くでしょうか? –

+0

@Jerry the dfmは、1つのフォームのプロパティのみを定義します。もう1つはdfmがないため、CreateNewを使用します。 –

答えて

3

変更TForm2.FormCloseForm2.FormCloseへ:あなたはOnCloseイベントは、作成したばかりの同じオブジェクトに属しているハンドラに関連付けるため、

Form2.OnClose := Form2.FormClose; 

しかし、それだけにTForm2を移動する方が良いだろう独自の設計時DFMを持つ独立したユニットは、その後、あなたは、設計時にTForm2.OnCloseイベントを割り当てて、TForm2.Create()は、実行時に呼び出されたときにDFMがあなたのためにそれをフックさせることができます:

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

関連する問題