1

重複の可能性:
別のフォームがモーダルで表示されたときに無効にならないフォームを作成するにはどうすればよいですか?

3 つのフォームを持つアプリケーションがあるとします。ワークフロー、ウィザード スタイルを通じてユーザーを導くメイン フォーム。ウィザードの特定のステップで時折表示されるモーダル ウィンドウ。3 番目の「情報」ウィンドウは、ユーザーがワークフローのどこにいるかに関係なく、いつでも表示できます。

モーダル ウィンドウがメイン フォームからフォーカスを奪うようにするにはどうすればよいですか?

メイン フレームから最も明白なInfoFrame.Create(nil).Showものを使用すると、モーダル フォームが表示されているときに情報ウィンドウが使用できなくなります。

興味深いことに、モーダル ウィンドウから情報ウィンドウを作成して表示すると、目的の方法で応答し、モーダル ウィンドウが閉じられた後も持続します。ただし、モーダル ウィンドウが再び表示されると、情報ウィンドウは強制的にバックグラウンドに移動し、応答しなくなります。

ShowModal別のフォームのプロシージャが呼び出された場合でも、情報ウィンドウを常に使用できるようにするにはどうすればよいですか?

私が取り組んでいる実際のアプリケーションでは、実際には約 12 の「ワークフロー」メイン ウィンドウ (それらの多くはモーダルでもあります) から数十のモーダル フォームがありますが、情報ウィンドウは 1 つだけです (複数のインスタンスが表示される場合があります)。 ShowModal へのすべての呼び出しを別のものに変更する必要はありませんが、それが唯一のオプションである場合、呼び出しをラップまたはサブクラス化することは嫌いではありません。

4

1 に答える 1

4

を使用しないShowModalで、代わりに使用を無効にMainFormEnableWindow(MainForm.Handle, False)、後で使用して再度有効にしEnableWindow(MainForm.Handle, True)ます。右側のウィンドウが常に上に表示されるようにするために、何かを追加する必要がある場合があります。

MainForm編集: 、またはモーダルフォームで何も変更したくない場合はInfoFrame、そのフォームが常に有効になっている にタイマーを追加できます。

procedure TInfoFrame.EnablerTimer(Sender: TObject);
begin
  if not IsWindowEnabled(Self.Handle) then
    EnableWindow(Self.Handle, True);
end;

そうすれば、別のフォームのInfoFrameを呼び出した後でも を使用できます。ShowModal

Edit2:@DavidHeffernanが指摘したように、タイマーではなく、このロジックを配置するのに適した場所は、のWM_ENABLEハンドラーですInfoFrame。ただし、アイデアは同じままです。

于 2012-10-30T14:51:27.050 に答える