Free Pascal / Lazarus: почему в моем примере не вызывается событие «FormCloseQuery»? - PullRequest
0 голосов
/ 29 мая 2018

Я написал небольшую тестовую программу, чтобы опробовать FormCreate и процедуру FormCloseQuery.FormCreate работает нормально, но FormCloseQuery просто не хочет выполняться.Я что-то упустил?Нажатие «X» в окне формы или использование метода close, оба не работают!

procedure FormCreate(Sender: TObject); 
procedure FormCloseQuery(Sender: TObject; var CanClose: boolean);
(...)


procedure TForm1.FormCreate(Sender: TObject); 
  beginn
  //gets executed without problems
  end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  begin

  case MessageDlg('Question', mtConfirmation, [mbyes, mbno, mbcancel], 0) of

  mrYes:
  begin
    ShowMessage('yes');
    CanClose := true;
    end;

  mrNo:
  begin
    ShowMessage('no');
    CanClose := true;
    end;

  else
  begin
    ShowMessage('cancel');
    CanClose := true;
    end;

  end;
  end;

Вот полный код:

Файл lpr:

program project1;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Interfaces, // this includes the LCL widgetset
  Forms, Unit1
  { you can add units after this };

{$R *.res}

begin
  RequireDerivedFormResource:=True;
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

Единица-файл:

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: boolean);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
  ShowMessage('FormCreate Procedure wurde gestartet');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Close;
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin

  case MessageDlg('Question', mtConfirmation, [mbyes, mbno, mbcancel], 0) of

  mrYes:
  begin
    ShowMessage('yes');
    CanClose := true;
    end;

  mrNo:
  begin
    ShowMessage('no');
    CanClose := true;
    end;

  else
  begin
    ShowMessage('cancel');
    CanClose := true;
    end;

  end;
end;
end.

1 Ответ

0 голосов
/ 29 мая 2018

Решение состоит в том, чтобы подключить событие OnCloseQuery формы к этой процедуре.Вот краткое описание, как это сделать:

  • Откройте и выберите форму (в моем случае «Form1: TForm1») в инспекторе объектов (см. Пояснение ниже).
  • В инспекторе объектов перейдите на вкладку «события»
  • Найдите «OnCloseQuery» -Event и выберите «FormCloseQuery», если вы уже объявили и написали процедуру, как это было в моем примере.(Если вы не объявили / не реализовали его, дважды щелкните в раскрывающемся списке или нажмите кнопку рядом с ним, кнопку с тремя точками, и автоматически добавится пустая процедура «OnCloseQuery». Редактор кода будетперейти непосредственно к новой процедуре.)

Чтобы вызвать / выбрать форму в инспекторе объектов, откройте инспектор объектов (F11).Если вы смотрите на редактор кода, сначала откройте форму (F12) и нажмите на нее.Это должно поднять это в объекте инспектора.Убедитесь, что форма (верхний элемент в списке) выбрана и ни один из ее компонентов (например, кнопки и т. Д.).

Вот еще одно объяснение: http://www.delphigroups.info/2/b2/444056.html

...