Delphiのどのバージョンについては言及していません...
新しいDelphiバージョンでは、TCustomFormにPopupModeとPopupParentの2つの新しいプロパティが追加されています。モーダルダイアログのPopupParentを、そのダイアログを作成しているフォームに設定すると、子フォームがその親の上にとどまるようになります。通常、説明している問題を修正します。
このプロパティのペアはDelphi2006で追加されたと思いますが、2005年であった可能性があります。Delphi2007以降では間違いなく存在します。
編集:Delphi 7を使用していることを確認した後、私が持っている唯一の提案は、モーダルフォームを表示するコードで、フォームの作成を無効にし、戻ったときに再度有効にすることです。これにより、作成ウィンドウが入力を受け取らないようにする必要があります。これにより、Zオーダーを正しく保つことができます。
このようなものが機能する可能性があります(D7を使用しなくなったため、テストされていません)。
procedure TForm1.ShowForm2;
begin
Self.Enabled := False;
try
with TForm2.Create(nil) do
begin
try
if ShowModal = mrOk then
// Returned OK. Do something;
finally
Free;
end;
end;
finally
Self.Enabled := True;
end;
end;
Form2がモーダルウィンドウを作成する場合(前述のとおり)、プロセスを繰り返します。Form2を無効にし、Form3を作成してモーダルで表示し、戻ってきたらForm2を再度有効にします。私が示したように、必ずtry..finallyを使用してください。これにより、モーダルフォームで問題が発生した場合に、作成フォームが常に再度有効になります。