这只是大型项目的一部分。我在表单上有一个文本框,当单击它旁边的命令按钮时,我想调出一个看起来与文本框对齐的表单。这个想法是让它看起来像一个下拉框。但唯一的问题是这个'下拉'是另一种形式和一种形式。
这是我到目前为止所做的,表格显示正常。
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上,我只是关闭它。
有人可以告诉我我在这里失踪了吗?
谢谢!
答案 0 :(得分:2)
你所缺少的是模态的运作方式。当应用程序中有模态窗口时,您无法与其他窗口进行交互,因为这些其他窗口已被禁用。
当你在frmPopup上调用ShowModal
时,由于上述原因,TfrmSetupTaxes表单被禁用。由于你已经将frmPopup作为frmSetupTaxes的子项,因此它也被禁用。
你不能通过使用模态来锻炼这个设计,你必须设计另一种机制。
答案 1 :(得分:0)
这是最好的发现之一,至少对我而言;)
经过大量的挖掘和指导,我意识到它超出了我的范围。我无法弄清楚适用于各种操作系统的“正确”方式(至少是Windows和Ubuntu)。
最后,我聘请了一位专家(不,不是来自任何论坛网站)并付钱让他给我看。希望它可以帮助其他开发人员,我认为最好将其发布在这里。
在回答之前,我要非常感谢Sertac-Akyuz,他向我展示了某些事情是不可能的。我还通过他们的链接发现 某些解决方案,但它们不符合我的需求。
现在,在回答之前,我必须遵守我的规则。
我不应该使用任何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;
就是这样!
关键是NOT设置弹出窗口的父属性。然后使用ClientToScreen(我甚至没有梦想使用的功能)。它完美地完成了这项工作。