0

我正在使用 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”,但没有成功。

4

1 回答 1

0

弹出窗口(下拉矩形)的行为是这样的。将组合框发送到后面没有帮助,因为模式对话框不知道这一点。

您可以尝试将 设置frmValidateUser.FormStylefsStayOnTop。如果这没有帮助,那么您必须告诉 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;

(请原谅愚蠢的变量名称,但对于像这样的简单测试,我认为没问题)。

该应用程序按预期工作。选择条目后,下拉列表消失并显示新表单。

于 2012-12-31T11:17:34.593 回答