Несовместимые типы: TCloseEvent и Procedure.

Вот мой код:

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.

Когда я пытаюсь назначить FormClose на OnClose событие Form2, я получил следующее сообщение об ошибке:

[Ошибка Dcc32] Unit1.pas (40): E2010 Несовместимые типы: «TCloseEvent» и «Процедура»

Когда я меняю его на:

Form2.OnClose := FormClose;

Он работает нормально, но это похоже на Self.FormClose, а не на TForm2.FormClose процедуру.

Как я могу назначить TForm2.FormClose Form2.Onclose?


person Ilyes    schedule 26.07.2017    source источник
comment
Я не понимал, что можно даже иметь две формы в одном модуле ... Очевидно, что два класса - это нормально. Но используют ли обе эти формы один и тот же DFM? Как это вообще могло бы работать?   -  person Jerry Dodge    schedule 26.07.2017
comment
@Jerry dfm определяет только свойства одной формы. У другого нет dfm, отсюда и использование CreateNew.   -  person David Heffernan    schedule 27.07.2017


Ответы (1)


Измените TForm2.FormClose на Form2.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.
person Remy Lebeau    schedule 26.07.2017
comment
Спасибо, чувак, иногда люди полностью теряют концентрацию :) - person Ilyes; 26.07.2017