我正在使用Delphi XE2,我遇到了一个问题,在从DBLookupCombo框中选择一个选项时,会显示一个模态对话框。
但是出现了一个问题,即当显示模式对话框时,LookupCombo将保留在模态对话框的顶部。
这只是一个小小的化妆品问题,但它让我很生气。以编程方式使用“SendToBack”编程无效。
关于这个问题我还能做些什么吗?
代码段:
else if (getUserName <> cboUserName.Text) and (userHasPerm2 = 1) then
begin
ValidUser := false;
frmValidateUser := TfrmValidateUser.Create(self);
frmValidateUser.txtUsername.ReadOnly := true;
frmValidateUser.txtUsername.enabled := false;
frmValidateUser.FormStyle := fsStayOnTop;
cboUsername.SendToBack;
frmValidateUser.ShowModal;
因此,如果所选用户不是登录用户且没有适当的权限,则ValidateUser表单将以模态方式显示。正如你所看到的,我已经尝试将from风格设置为“保持最佳状态”,并将组合框设置为“sendtoback”,但没有成功。
答案 0 :(得分:0)
弹出窗口(下拉矩形)的行为与此类似。将组合框发送到后面没有帮助,因为模态对话框不知道这一点。
您可以尝试将frmValidateUser.FormStyle
设置为fsStayOnTop
。如果这没有帮助,那么你必须告诉Windows将对话框设置为非常顶部:
SetWindowPos(frmValidateUser.Handle, HWND_TOPMOST, 0,0,0,0, SWP_NOMOVE+SWP_NOSIZE);
但说实话,这不是一个好的解决方案。此对话框还将隐藏可能从其他应用程序甚至Windows本身弹出的任何其他最顶层消息。
为什么不尝试在下拉列表消失后弹出对话框?
更新:我尝试通过创建一个只有一个组合框的简单表单来复制问题。在组合框的OnSelect-Event中,我只需创建一个相同形式的新实例,并使其出现在与组合框相同的坐标上;
procedure TForm1.ComboBoxSelect(Sender: TObject);
Var
f : TForm1;
p : TPoint;
begin
f := TForm1.Create(nil);
p := ComboBox.ClientToScreen(point(0,0));
f.Left := p.x;
f.Top := p.y;
f.ShowModal;
end;
(请原谅这个愚蠢的变量名,但对于像这样的简单测试,我认为没关系。)
该应用程序按预期工作。选择条目后,下拉列表将消失,并显示新表单。