delphi - 显示组件的模态表单
问题描述
我在显示自定义组件的模式表单时遇到问题。在应用程序启动期间,CustomComponent 创建一个用户不可见的自定义表单 (CreateMenu)。当用户单击组件时(在运行时),将显示自定义表单(MouseClick),这是一个带有按钮 - 命令的表单。
当我使用 ShowModal 方法显示组件的菜单表单时,父表单被阻止,并且显示的菜单表单也被阻止。下面是创建自定义表单(在自定义组件中)并显示它的代码。
procedure TCustomComponent.MouseClick(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X: integer; Y: integer);
begin
self.Repaint;
self.PMenuForm.Left := self.Left; // p.x;
self.PMenuForm.Top := self.Top + self.Height + 5; // p.Y+self.Height+5;
PMenuForm.ShowModal;
end;
procedure TCustomComponent.CreateMenu(title: string);
begin
if PMenuForm = nil then
begin
PMenuForm := TForm.Create(self.Parent);
PMenuForm.Parent := self.Parent;
PMenuForm.ParentWindow := self.Parent.Handle;
PMenuForm.FormStyle := fsStayOnTop;
PMenuForm.Enabled := true;
PMenuForm.Visible := false;
PMenuForm.BorderWidth := 2;
PMenuForm.BorderStyle := bsNone;
PMenuForm.BorderIcons := [];
PMenuForm.caption := title;
PMenuFormTitle := TLabel.Create(PMenuForm);
PMenuFormTitle.Left := 0;
PMenuFormTitle.Top := 0;
PMenuFormTitle.Margins.Left := 5;
PMenuFormTitle.AutoSize := true;
PMenuFormTitle.Visible := true;
PMenuFormTitle.Parent := PMenuForm;
PMenuFormTitle.Font.Color := MakeColor($FFFFFF);
PMenuFormTitle.Font.Size := 10;
PMenuFormTitle.Font.Style := [fsBold];
PMenuFormTitle.Color := MakeColor($0000CC);
PMenuFormTitle.Transparent := false;
PMenuFormTitle.caption := title;
PMenuFormTitle.Layout := tlCenter;
PMenuFormTitle.Alignment := taLeftJustify;
PMenuFormTitle.AutoSize := false;
if PMenuFormTitle.Width < 55 then
PMenuFormTitle.Width := 65;
if PMenuFormTitle.Height < 10 then
PMenuFormTitle.Width := 10;
PMenuFormItems[0] := TBitBtn.Create(PMenuForm);
PMenuFormItems[0].Parent := PMenuForm;
PMenuFormItems[0].ParentWindow := PMenuForm.ClientHandle;
PMenuFormItems[0].tag := 0;
PMenuFormItems[0].Enabled := true;
PMenuFormItems[0].Visible := true;
PMenuFormItems[0].Top := 0;
PMenuFormItems[0].Left := PMenuFormTitle.Width - 22;
PMenuFormItems[0].caption := 'X';
PMenuFormItems[0].Font.Style := [fsBold];
PMenuFormItems[0].Width := 20;
PMenuFormItems[0].Height := PMenuFormTitle.Height;
PMenuFormItems[0].OnClick := self.MenuItemClick;
PMenuForm.AutoSize := true;
self.PMenuFormItemsCount := 0;
self.OnMouseDown := self.MouseClick;
self.Cursor := crHandPoint;
end;
end;
感谢您的任何建议。
澄清: 1. Blocked 表示父窗体和显示的菜单窗体都没有响应,未启用。此外,菜单表单上的每个按钮都没有响应,即。不响应鼠标悬停,并且不能被点击(它不是灰色的,虽然只是不响应点击和其他任何东西)
- 旨在父表单被“阻止”/无响应,但这也会影响显示的菜单表单 - 它也无响应(按钮)。
解决方案
这是有意的,从 Delphi 的第一个版本开始。最古老的在线 html 文档来自 Delphi 2007,其中ShowModal
文档:
用于
ShowModal
将表单显示为模态表单。模态表单是应用程序在表单关闭之前无法继续运行的表单。因此,ShowModal
在表单关闭之前不会返回。当表单关闭时,它会返回ModalResult
属性的值。
如果您的问题实际上是关于如何解决菜单也被阻止的问题:
- 不要使用
ShowModal
, butShow
,并准备好表单现在不再是模态的,因此用户可以在表单和其他应用程序之间来回切换 - 以模态形式显示菜单
推荐阅读
- javascript - Centering Footer Content
- nuget - 使用 Azure Devops 发布 Nuget 包
- java - 从操作框菜单项打开新活动并关闭实际活动
- java - MethodHandle 比 Reflection 慢?
- python - MNIST 数据集缺失类
- python - 在 python 2.7.10 中从 flask_mysqldb 导入 MySQL 时出错
- javascript - 使用 getElementById 验证函数
- reactjs - React Native - 如何使 ScrollView 组件的垂直滚动条永久化?
- python - 调用函数进行打印时,我如何让它从我的 void 函数中获取用户输入?
- java - JavaFX 如何在运行时创建 Flash 消息