免费Pascal / Lazarus:为什么在我的例子中没有调用“FormCloseQuery”事件?

时间:2018-05-29 01:09:30

标签: lazarus freepascal

我写了一个小的测试程序来试用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-File:

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 :(得分:0)

解决方案是将表单的表单的OnCloseQuery事件连接到此过程。以下是如何操作的简短说明:

  • 在对象检查器中打开并选择表单(在我的情况下为#34; Form1:TForm1")(参见下面的说明)。
  • 在对象检查器中,转到选项卡" events"
  • 找到" OnCloseQuery" -Event并选择" FormCloseQuery"如果你已经声明并编写了程序,就像我的例子中那样。 (如果您尚未声明/实现它,请在下拉框中双击或单击旁边的按钮,带有三个点的那个,一个空的" OnCloseQuery" -procedure过程将是自动添加。代码编辑器将直接跳转到新程序。)

要在对象检查器中调出/选择表单,请打开对象检查器(F11)。如果您正在查看代码编辑器,请先打开表单(F12)并单击它。这应该在对象检查器中显示它。确保选择了表单(列表中的顶部元素),而没有选择任何组件(如按钮等)。

以下是另一种解释:http://www.delphigroups.info/2/b2/444056.html