2

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

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

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 上,因此我将其关闭。

有人可以告诉我我在这里缺少什么吗?

谢谢!

4

2 回答 2

2

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

当您调用ShowModalfrmPopup 时,由于上述原因,TfrmSetupTaxes 表单被禁用。由于您已将 frmPopup 设为 frmSetupTaxes 的子项,因此它也会被禁用。

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

于 2013-01-09T01:35:21.040 回答
0

这是最好的发现之一,至少对我来说是这样;)

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

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

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

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

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

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

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

现在答案...

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 (我什至没有梦想使用的功能)。它完美地完成了这项工作。

于 2013-01-11T03:46:22.190 回答