拉撒路 - 儿童模态形式无反应

时间:2013-01-08 09:35:43

标签: forms modal-dialog lazarus

这只是大型项目的一部分。我在表单上有一个文本框,当单击它旁边的命令按钮时,我想调出一个看起来与文本框对齐的表单。这个想法是让它看起来像一个下拉框。但唯一的问题是这个'下拉'是另一种形式和一种形式。

这是我到目前为止所做的,表格显示正常。

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上,我只是关闭它。

有人可以告诉我我在这里失踪了吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

你所缺少的是模态的运作方式。当应用程序中有模态窗口时,您无法与其他窗口进行交互,因为这些其他窗口已被禁用。

当你在frmPopup上调用ShowModal时,由于上述原因,TfrmSetupTaxes表单被禁用。由于你已经将frmPopup作为frmSetupTaxes的子项,因此它也被禁用。

你不能通过使用模态来锻炼这个设计,你必须设计另一种机制。

答案 1 :(得分:0)

这是最好的发现之一,至少对我而言;)

经过大量的挖掘和指导,我意识到它超出了我的范围。我无法弄清楚适用于各种操作系统的“正确”方式(至少是Windows和Ubuntu)。

最后,我聘请了一位专家(不,不是来自任何论坛网站)并付钱让他给我看。希望它可以帮助其他开发人员,我认为最好将其发布在这里。

在回答之前,我要非常感谢Sertac-Akyuz,他向我展示了某些事情是不可能的。我还通过他们的链接发现 某些解决方案,但它们不符合我的需求。

现在,在回答之前,我必须遵守我的规则。

  1. 我不应该使用任何Windows特定的功能或API,因为我希望能够在Windows和Ubuntu之间移植我的工作(至少现在)。

  2. 没有使用MDI表格。再次出于跨平台原因。

  3. 没有使用第三方插件或产品。

  4. 现在回答......

    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;
    

    就是这样!

    关键是NOT设置弹出窗口的父属性。然后使用ClientToScreen(我甚至没有梦想使用的功能)。它完美地完成了这项工作。