私は現在、既存のDelphiアプリケーション用のウィンドウシステムを作成しています。
現在、このプログラムは、必要な順序でモーダルに表示される多数のフルサイズのフォームで構成されており、ユーザーが移動することはできません。私の目的は、これらすべてのフォームを移動できるようにすることです。以前はフォームが互いに積み重ねられていましたが、移動できなかったため、背景のフォームはユーザーに表示されませんでした。これまでの私の解決策は、新しい子を開くときに「親」フォームを非表示にし、その子を閉じるときにそれを再表示することでした。
残念ながら、各子はshowModalで呼び出されるため、親フォームを表示する呼び出しは、モーダルプロセスが完了し、子フォームが非表示になるまで行われないため、フォームが表示されていない場所で一瞬のフラッシュが表示されます。
プロセスの完了後にモーダルフォームが自動的に非表示になるのを防ぐ方法はありますか?これにより、親フォームが再び表示されたら、手動で非表示にすることができます。各子フォームのFormHideイベントでこれをスケジュールしようとしましたが、子フォームが自分の子の1つを開くときにも非表示になるため、これは機能しません。
編集:
これが私がこれまでにレミーのアドバイスに基づいて持っているものです
procedure openModalChild(child: TForm; parent: TForm);
var
WindowList: Pointer;
SaveFocusCount: Integer;
SaveCursor: TCursor;
SaveCount: Integer;
ActiveWindow: HWnd;
Result: integer;
begin
CancelDrag;
with child do begin
Application.ModalStarted;
try
ActiveWindow := GetActiveWindow;
WindowList := DisableTaskWindows(0);
//set the window to fullscreen if required
setScreenMode(child);
try
Show; //show the child form
try
SendMessage(Handle, CM_ACTIVATE, 0, 0);
ModalResult := 0;
repeat
Application.HandleMessage;
//if Forms.Application.FTerminate then ModalResult := mrCancel else
if ModalResult <> 0 then closeModal(child as TCustomForm);
until ModalResult <> 0;
Result := ModalResult;
SendMessage(Handle, CM_DEACTIVATE, 0, 0);
if GetActiveWindow <> Handle then ActiveWindow := 0;
finally
parent.Show;
Hide;
end;
finally
EnableTaskWindows(WindowList);
parent.Show; //reshow the parent form
if ActiveWindow <> 0 then SetActiveWindow(ActiveWindow);
end;
finally
Application.ModalFinished;
end;
end;
end;
これはうまく機能しますが、唯一の問題は、子がエスケープされた後でもアクティブな繰り返しループが中断しないため、親フォームが再表示されないことです。これを解決する方法はありますか?