【Delphi】「表示中のウィンドウをモーダルに出来ません」エラーへの対応

フォームを動的に表示するアプリケーションを作っている際に理不尽なエラーが起こったのでメモ.

procedure TFormUndistortionTool.ButtonUndistortExecuteClick(Sender: TObject);
    var
        aForm : TFormUndistortionParameter;
    begin
    aForm := TFormUndistortionParameter.Create( Self );
    try
        aForm.ShowModal;
    finally
        FreeAndNIL( aForm );
        end;
    end;

こんな感じに,ボタンをクリック時にフォームを表示するコードを実行すると,下図のエラーが発生.

f:id:melank:20141023234938p:plain

ひと通り悩んで,表示しようとしていたフォームの Visibleプロパティが True となっていたことが原因っぽいことが判明.Visibleが有効なので,すでに表示中であるという判定がなされているよう.そこで,プロパティパネルで初期値は False とし,OnFormShowイベント時に True に変更するように指定すると,無事表示したフォームが開けた.但し,フォームだけ表示を有効にしても,中のコンポーネントは表示されないので下図のようなのっぺらぼうなフォームが出来てしまう.

f:id:melank:20141023235743p:plain

procedure TFormUndistortionParameter.FormShow(Sender: TObject);
    var
        i : Integer;
    begin
    for i := 0 to ComponentCount - 1 do
        ( Components[i] as TControl ).Visible := True;
    end;

こんな感じにフォーム上のコンポーネントの表示を一斉に有効にして,対応した.フレームワークで作る際はこんな面倒くさい処理を挟まなくても,問題なく作れたんだけど,ちょっとスクラッチで書こうとすると色々問題が出てくる.たいへん.