我在显示来自自定义组件的模式形式时遇到问题。在应用程序启动期间,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.阻止表示父窗体和显示的菜单窗体均无响应,未启用。同样,菜单窗体上的每个按钮都没有响应,即。不响应鼠标悬停,也无法单击(尽管不响应单击和其他任何操作,它不会显示为灰色)
答案 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,但禁用表单上的其他控件。您可以通过以下方式轻松实现此目的:将控件放在面板上,然后简单地禁用面板,这又会禁用放置在面板上的所有子控件。如果您的应用程序具有多种形式,您还可以禁用其他形式,从而获得与使用模式形式相似的效果。