首页 > 解决方案 > 显示组件的模态表单

问题描述

我在显示自定义组件的模式表单时遇到问题。在应用程序启动期间,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 表示父窗体和显示的菜单窗体都没有响应,未启用。此外,菜单表单上的每个按钮都没有响应,即。不响应鼠标悬停,并且不能被点击(它不是灰色的,虽然只是不响应点击和其他任何东西)

  1. 旨在父表单被“阻止”/无响应,但这也会影响显示的菜单表单 - 它也无响应(按钮)。

标签: delphidelphi-10.2-tokyo

解决方案


这是有意的,从 Delphi 的第一个版本开始。最古老的在线 html 文档来自 Delphi 2007,其中ShowModal文档:

用于ShowModal将表单显示为模态表单。模态表单是应用程序在表单关闭之前无法继续运行的表单。因此,ShowModal在表单关闭之前不会返回。当表单关闭时,它会返回ModalResult属性的值。

如果您的问题实际上是关于如何解决菜单也被阻止的问题:

  • 不要使用ShowModal, but Show,并准备好表单现在不再是模态的,因此用户可以在表单和其他应用程序之间来回切换
  • 以模态形式显示菜单

推荐阅读