显示组件的模态形式

时间:2018-08-31 15:34:57

标签: delphi delphi-10.2-tokyo

我在显示来自自定义组件的模式形式时遇到问题。在应用程序启动期间,CustomComponent创建一个用户不可见的自定义窗体(CreateMenu)。当用户单击组件时(在运行时),将显示自定义表单(MouseClick),该表单是带有按钮-命令的表单。

当我使用ShowModal方法显示组件的菜单形式时,“父”形式被阻止,并且所示的菜单形式也被阻止。下面是用于创建自定义表单(在自定义组件中)并显示它的代码。

TRANSFORM Sum([dbo_RX Reporting].Price) AS SumOfPrice
SELECT [dbo_RX Reporting].[Master Drug Name], Sum([dbo_RX Reporting].Price) AS Total
FROM [dbo_RX Reporting]
WHERE ((([dbo_RX Reporting].[Therapeutic Class]) Like "*Analg*") AND (([dbo_RX Reporting].Period) Like "2018*") AND (([dbo_RX Reporting].[Plan Name])="Alabama"))
GROUP BY  [dbo_RX Reporting].[Master Drug Name]
PIVOT [dbo_RX Reporting].Period;


Master Drug Name           Total    201804       201805       201806    201807
ACETAMINOPHEN           $1,311.72   $335.27     $330.92     $286.47     $359.06 
ACETAMINOPHEN/CODEINE   $2,399.87   $891.89     $543.60     $658.08     $306.30 
ALLOPURINOL               $976.27   $215.98     $234.16     $263.96     $262.17 
Amrix                   $1,065.14             $1,065.14         
APAP                    $1,526.08   $415.34     $524.56     $297.04     $289.14 

谢谢您的任何建议。

说明: 1.阻止表示父窗体和显示的菜单窗体均无响应,未启用。同样,菜单窗体上的每个按钮都没有响应,即。不响应鼠标悬停,也无法单击(尽管不响应单击和其他任何操作,它不会显示为灰色)

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

3 个答案:

答案 0 :(得分:0)

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

  

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

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

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

答案 1 :(得分:0)

此行:PMenuFormItems[0].OnClick := self.MenuItemClick;表示self(CustomComponent)具有方法MenuItemClick。实施了吗?它是做什么的?

这就是单击位按钮PMenuFormItems[0]的地方。如果这没有导致设置PMenuForm.ModalResult或没有专门关闭PMenuForm,则无响应继续。

您的代码中有两项设置

//    PMenuForm.ParentWindow := self.Parent.Handle;
//    PMenuFormItems[0].ParentWindow := PMenuForm.ClientHandle;

我不得不过时。他们引起了AV:s

它们在您的代码中毫无用处,就像documented

  

如果Parent不为nil(Delphi)或   NULL(C ++)。

对于这两者,您都设置了Parent属性-

答案 2 :(得分:0)

PMenuForm被阻止的原因是,作为父控件,您已经在另一个窗体上设置了一个控件,这意味着窗体的窗口实际上是另一个窗体的子窗口。

因此,当该窗体被ShowModal调用阻止时,您的PMenuForm将无法接收OnClick消息,因为这样做必须从父窗体或组件转发该消息,在这种情况下,父窗体或组件在此情况下被禁用。

因此,恐怕您将不得不使用其他方法来实现您的期望。这就是我要做的。

正常显示您的PMenuForm,但禁用表单上的其他控件。您可以通过以下方式轻松实现此目的:将控件放在面板上,然后简单地禁用面板,这又会禁用放置在面板上的所有子控件。如果您的应用程序具有多种形式,您还可以禁用其他形式,从而获得与使用模式形式相似的效果。