如果用户点击我的主表单上的 X ,我希望表单隐藏,而不是关闭。这听起来像是OnClose form event:
的工作使用OnClose在表单关闭时执行特殊处理。 OnClose事件指定在表单即将关闭时要调用的事件处理程序。例如,OnClose指定的处理程序可能会测试以确保数据输入表单中的所有字段在允许表单关闭之前具有有效内容。
表单由Close方法关闭,或者当用户从表单的系统菜单中选择Close时关闭。
TCloseEvent类型指向处理表单关闭的方法。 Action参数的值确定表单是否实际关闭。这些是Action的可能值:
- caNone :表单不允许关闭,因此没有任何反应。
- caHide :表单未关闭,只是隐藏。您的应用程序仍然可以访问隐藏的表单。
- caFree :表单已关闭,表单的所有已分配内存都已释放。
- caMinimize :表单最小化,而不是关闭。这是MDI子表单的默认操作。
我在一个空表格中测试一个表格:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caHide;
end;
现在,当我点击 X 时,(而不是隐藏)表单关闭,应用程序终止:
......这听起来像是 OnClose 事件......
的工作Vcl.Forms.pas
procedure TCustomForm.Close;
var
CloseAction: TCloseAction;
begin
if fsModal in FFormState then
ModalResult := mrCancel
else if CloseQuery then
begin
if FormStyle = fsMDIChild then
if biMinimize in BorderIcons then
CloseAction := caMinimize
else
CloseAction := caNone
else
CloseAction := caHide;
DoClose(CloseAction);
if CloseAction <> caNone then
begin
if Application.MainForm = Self then //Borland doesn't hate developers; it just hates me
Application.Terminate
else if CloseAction = caHide then
Hide
else if CloseAction = caMinimize then
WindowState := wsMinimized
else
Release;
end;
end;
end;
答案 0 :(得分:9)
当用户关闭窗口时,它会收到WM_CLOSE
消息,该消息会触发TForm
自行调用其Close()
方法。在项目的Close()
上调用MainForm
始终会终止该应用,因为这是TCustomForm.Close()
中的硬编码行为:
procedure TCustomForm.Close;
var
CloseAction: TCloseAction;
begin
if fsModal in FFormState then
ModalResult := mrCancel
else
if CloseQuery then
begin
if FormStyle = fsMDIChild then
if biMinimize in BorderIcons then
CloseAction := caMinimize else
CloseAction := caNone
else
CloseAction := caHide;
DoClose(CloseAction);
if CloseAction <> caNone then
if Application.MainForm = Self then Application.Terminate // <-- HERE
else if CloseAction = caHide then Hide
else if CloseAction = caMinimize then WindowState := wsMinimized
else Release;
end;
end;
只有辅助TForm
对象尊重OnClose
处理程序的输出。
要做你想要的,你可以:
直接处理WM_CLOSE
并跳过Close()
。
private
procedure WMClose(var Message: TMessage); message WM_CLOSE;
procedure TForm1.WMClose(var Message: TMessage);
begin
Hide;
// DO NOT call inherited ...
end;
让您的MainForm的OnClose
处理程序直接调用Hide()
并返回caNone
:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Hide;
Action := caNone;
end;
答案 1 :(得分:6)
尝试OnCloseQuery
事件。隐藏表单并将CanClose
设置为False。你应该很好。
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
Hide;
CanClose := False;
end;