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 スタイルを「stay on top」に設定し、コンボボックスを「sendtoback」に設定しようとしましたが、成功しませんでした。

4

1 に答える 1

0

ポップアップ ウィンドウ (ドロップダウンの四角形) は次のように動作します。モーダルダイアログはこれを認識していないため、コンボボックスを背面に送信しても役に立ちません。

を に設定してみてfrmValidateUser.FormStyleくださいfsStayOnTop。これで問題が解決しない場合は、Windows にダイアログを一番上に設定するように指示する必要があります

SetWindowPos(frmValidateUser.Handle, HWND_TOPMOST, 0,0,0,0, SWP_NOMOVE+SWP_NOSIZE);

しかし、正直なところ、それは良い解決策ではありません。このダイアログは、他のアプリケーションや Windows 自体からポップアップする可能性があるその他の最上位メッセージも非表示にします。

ドロップダウンが消えた後、ダイアログをポップアップさせてみませんか?

更新:コンボボックスが1つしかない単純なフォームを作成して、問題を再現しようとしました。コンボボックスの 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 に答える