如何让关闭按钮在 Delphi 上打开一个新表单

How to make close button open a new form on Delphi

我需要任何表单上的“x”按钮都不会关闭表单,而是在 delphi 上打开另外 3 个随机表单,我不知道该怎么做,请帮忙

只需使用表单的 OnCloseQuery 事件来检测用户是否试图关闭您的表单(通过单击 top-right 角落的关闭按钮,通过 double-clicking 表单的标题栏图标,通过选择关闭系统菜单项,通过按 Alt+F4 等)。

然后将 CanClose 设置为 False,然后打开您的三个新表单:

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  CanClose := False;
  Form2.Show;
  Form3.Show;
  Form4.Show;
end;

根据 的建议,您可以使用表单的 OnCloseQuery 事件。但是,该方法的问题是该事件也在系统 reboot/shutdown 期间触发,您不想阻止它。如果 OnCloseQuery returns CanClose=False 在系统关闭期间,关闭将被取消。

另一种选择是使用表单的 OnClose 事件,将其 Action 参数设置为 caNone,例如:

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caNone;
  Form2.Show;
  Form3.Show;
  Form4.Show;
end;

但是,最好的选择是仅处理 user-initiated 闭包(X 按钮、ALT-F4 等)让表单处理 WM_SYSCOMMAND 消息以查找 SC_CLOSE 通知,例如:

procedure TForm1.WndProc(var Message: TMessage);
begin
  if (Message.Msg = WM_SYSCOMMAND) and (Message.WParam and $FFF0 = SC_CLOSE) then
  begin
    Message.Result := 0;
    Form2.Show;
    Form3.Show;
    Form4.Show;
  end
  else
    inherited;
end;

这样,system-initiated闭包就不会受到阻碍了。