2017-07-26 9 views
0

Voici mon code:types incompatibles: 'TCloseEvent' et 'procédure'

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. 

Lorsque je tente d'assigner FormClose à l'événement OnClose du Form2, je suis l'erreur suivante Msg:

[erreur dcc32] unit1.pas (40): E2010 types incompatibles: 'TCloseEvent' et 'procédure'

Quand je change à:

Form2.OnClose := FormClose; 

Il fonctionne très bien, mais qui est comme Self.FormClose, pas la procédure TForm2.FormClose.

Comment attribuer TForm2.FormClose à Form2.Onclose?

+0

Je ne savais pas qu'il était même possible d'avoir deux formes dans la même unité ... De toute évidence, deux classes sont normales. Mais ces deux formes partagent-elles le même DFM? Comment cela fonctionnerait-il? –

+0

@Jerry la dfm ne définit que les propriétés d'une forme. L'autre n'a pas de dfm, d'où l'utilisation de CreateNew. –

Répondre

3

changement TForm2.FormClose à Form2.FormClose:

Form2.OnClose := Form2.FormClose; 

Cependant, puisque vous souhaitez que l'événement OnClose à être associé à un gestionnaire qui appartient au même objet que vous venez de créer, il serait préférable de se déplacer juste TForm2 à un unité distincte avec sa propre conception du temps DFM, et vous pouvez affecter l'événement TForm2.OnClose à temps de conception et de laisser le crochet DFM vers le haut pour vous quand TForm2.Create() est appelé à l'exécution:

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

Merci l'homme, Parfois les gens perdent complètement leur focus :) – Sami