Delphi - 在VCL样式中禁用[x]关闭按钮

5

我希望您能帮忙翻译一下关于 IT 技术的内容。需要翻译的内容是:在 DX Berlin 中使用 VCL 样式禁用 [X] 关闭按钮。

为什么这段代码在使用 VCL 样式时不起作用呢?

EnableMenuItem(GetSystemMenu(Form3.Handle, LongBool(False)),SC_CLOSE, MF_BYCOMMAND or MF_GRAYED);

1
似乎您在样式引擎中遇到了一个错误?您是否还注意到,如上所述禁用SC_CLOSE不会禁用Alt - F4,即使在非样式化的应用程序中也是如此。 - Tom Brunberg
@Tom 在 Delphi 10 Seattle 中,它似乎按预期工作。不过我还没有尝试过 10.1 Berlin。 - Jerry Dodge
@Jerry 你指的是什么正常工作?是指OP的问题还是我的关于Alt-F4的评论?我已在Seattle和Berlin两地进行过测试。 - Tom Brunberg
@Tom 关于你的评论,ALT-F4 的行为符合预期。除非我误解了你的意思。 - Jerry Dodge
@Jerry 取决于你的期望 :) 在 OP 的代码行之后,由于系统菜单“关闭 - Alt F4”在视觉上处于禁用状态,我会期望键盘组合键“Alt”和“F4”也被禁用,但实际上并没有(在 W7 上的 Seattle 和 Berlin)。 - Tom Brunberg
2个回答

5
如果在FormClose事件中将操作设置为caNone,尝试关闭窗体(点击红叉)时将不会发生任何事情。通过这种方式,您可以禁用按钮。
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 //You cannot type only caNone, otherwise you'll get a compiler error
 Action := TCloseAction.caNone;
end;

您可以在System.UITypes中找到caNone;阅读文档以获取更多信息。


好的,但我如何关闭我的窗体?退出程序吗?如果我使用Action:= TCloseAction.caNone,那很完美,但不会退出应用程序。 - Junior Oliveira
在表单中,声明一个私有的布尔变量,例如 AllowToClose,并将表单的 OnClose 事件改为 if not AllowToClose then Action := TCloseAction.caNone; 然后,当你想要通过程序关闭表单时,只需将 AllowToClose := True; 设置为真,并调用 Form.Close - Tom Brunberg
1
好的。非常感谢。 - Junior Oliveira
2
@JuniorOliveira 还要记得告知用户为什么此时无法关闭应用程序。我个人讨厌应用程序不想关闭,也不告诉我原因的情况。是的,我会找到关闭该应用程序的方法,无论您作为开发人员是否愿意(您始终可以从任务管理器中强制结束应用程序)。因此,请确保告诉您的用户为什么他们必须等待才能关闭应用程序。 - SilverWarior
OK. Thank you so much. - Junior Oliveira

1
使用VCL样式时,默认情况下,样式会影响所使用的字体的外观、窗体的客户区域以及窗体的边框(这还包括最小化、最大化和关闭按钮)。
因此,从我看来,您有两个选择:
1. 您可以将您的窗体的StyleElements属性更改为[seFont, seClient],这意味着样式仅适用于所使用的字体和窗体的客户区域,但窗体的边框区域将不受样式影响,并由操作系统渲染。 2. 您可以在运行时修改样式,以达到所需的效果。不幸的是,我没有足够的样式经验,无法为您提供如何实现此目的的示例。

好的。非常感谢。 - Junior Oliveira

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接