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)的“正确”方法

最后,我雇了一位专家(不,不是来自任何论坛网站)并付钱让他给我看这个。希望它能帮助其他开发者,我想最好把它贴在这里

在回答之前,我要向塞尔塔克·阿库兹表示衷心的感谢,他向我展示了某些事情是不可能的。我还通过他们的链接发现有一些解决方案,但它们不符合我的需要

现在,在回答之前,这里是我必须遵守的规则

  • 我不应该使用任何特定于Windows的函数或API,因为我希望能够在Windows和Ubuntu之间移植我的工作(至少现在是这样)

  • 没有正在使用的MDI表单。同样是因为跨平台的原因

  • 没有使用第三方插件或产品

  • 现在答案是

    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的想法是能够在不同的操作系统之间轻松地移植应用程序。然而,我喜欢这个答案,这就是为什么我会选择它。它给了我不去看的方向。但我现在发现了一些事情,我想我明白了。一旦我确定,我会把它贴在这里。干杯我很高兴你已经解决了你的问题,但公平地说,你的帖子并没有回答这个问题——它问为什么模态子窗体会禁用它自己和它的父窗体。