Forms Lazarus-儿童情态形式是无反应的
这只是一个更大项目的一部分。我在表单上有一个文本框,当单击它旁边的命令按钮时,我想显示一个与文本框对齐的表单。这个想法是让它看起来像一个下拉框。但唯一的问题是,这个“下拉列表”是另一种形式和模态 这就是我到目前为止所做的,表格显示的很好Forms Lazarus-儿童情态形式是无反应的,forms,modal-dialog,lazarus,Forms,Modal Dialog,Lazarus,这只是一个更大项目的一部分。我在表单上有一个文本框,当单击它旁边的命令按钮时,我想显示一个与文本框对齐的表单。这个想法是让它看起来像一个下拉框。但唯一的问题是,这个“下拉列表”是另一种形式和模态 这就是我到目前为止所做的,表格显示的很好 procedure TfrmSetupTaxes.cmdChangeParentClick(Sender: TObject); var Res : Integer; frmPopUp : TForm; begin frmPopUp := TfrmT
procedure TfrmSetupTaxes.cmdChangeParentClick(Sender: TObject);
var
Res : Integer;
frmPopUp : TForm;
begin
frmPopUp := TfrmTreePopUp.Create(nil);
frmPopUp.Parent := Self;
frmPopUp.Top:= self.rp.Top + self.EditItemCat.Top +
self.txtSelParentName.Top + self.txtSelParentName.Height + 3;
frmPopUp.Left:= self.rp.Left + self.EditItemCat.left + self.txtSelParentName.Left;
Res := frmPopUp.ShowModal;
end;
注意:“rp”是一个面板,“EditITemCat”是一个选项卡。这些仅用于定位
现在,我的问题来了
虽然表单出现了,但它似乎冻结了。它不响应,父窗体也不响应。因为我在IDE上,所以我只是关闭它
有人能告诉我我错过了什么吗
谢谢 你缺少的是模态的工作原理。当应用程序中存在模式窗口时,您无法与其他窗口交互,因为这些其他窗口已禁用 在frmPopup上调用
showmodel
时,TfrmSetupTaxes表单因上述原因被禁用。由于您已使frmPopup成为frmSetupTaxes的子对象,因此它也会被禁用
你不能通过使用模态来解决这个设计,你必须设计另一种机制。这是最好的发现之一,至少对我来说是如此;) 经过大量的挖掘和指导,我意识到这是我无法理解的。我无法找到适合各种操作系统(至少是Windows和Ubuntu)的“正确”方法 最后,我雇了一位专家(不,不是来自任何论坛网站)并付钱让他给我看这个。希望它能帮助其他开发者,我想最好把它贴在这里 在回答之前,我要向塞尔塔克·阿库兹表示衷心的感谢,他向我展示了某些事情是不可能的。我还通过他们的链接发现有一些解决方案,但它们不符合我的需要 现在,在回答之前,这里是我必须遵守的规则
procedure TfrmSetupTaxes.cmdChangeParentClick(Sender: TObject);
var
Res : Integer;
frmPopUp : TForm;
pt: TPoint;
begin
frmPopUp := TfrmTreePopUp.Create(self);
pt := txtSelParentName.ClientToScreen(Point(0, 0));
frmPopUp.Top := pt.y + txtSelParentName.Height;
frmPopUp.Left := pt.x;
Res := frmPopUp.ShowModal;
end;
就这样
关键是没有设置弹出窗口的父属性。然后使用ClientToScreen(一个我做梦都没想到会用到的功能)。这项工作做得很好。+1感谢您精彩的解释,尽管这不是解决方案。我现在知道我不能在这项技术上浪费时间。谢谢@itsols-不客气!我没有提到可能的解决方案,因为它比看起来更复杂。下拉表单可能由位于其前面的父表单所有(popupparent属性),然后您至少会遇到另外两个问题:及时停用和未激活外观。看看这个问题,它是Delphi标记的,但仍然相关。这个美妙的想法+1。我很惊讶为什么这样一个基本的任务没有在一种有这么多小部件和DB接口的语言中提供。@itsols-你的问题有没有什么方面是这个答案没有涵盖的?你的解释很好,但它还没有解决我的问题,因为我不能使用任何Windows API或Win特定的方法。我使用Lazarus的想法是能够在不同的操作系统之间轻松地移植应用程序。然而,我喜欢这个答案,这就是为什么我会选择它。它给了我不去看的方向。但我现在发现了一些事情,我想我明白了。一旦我确定,我会把它贴在这里。干杯我很高兴你已经解决了你的问题,但公平地说,你的帖子并没有回答这个问题——它问为什么模态子窗体会禁用它自己和它的父窗体。