【Delphi】「表示中のウィンドウをモーダルに出来ません」エラーへの対応
フォームを動的に表示するアプリケーションを作っている際に理不尽なエラーが起こったのでメモ.
procedure TFormUndistortionTool.ButtonUndistortExecuteClick(Sender: TObject); var aForm : TFormUndistortionParameter; begin aForm := TFormUndistortionParameter.Create( Self ); try aForm.ShowModal; finally FreeAndNIL( aForm ); end; end;
こんな感じに,ボタンをクリック時にフォームを表示するコードを実行すると,下図のエラーが発生.
ひと通り悩んで,表示しようとしていたフォームの Visibleプロパティが True となっていたことが原因っぽいことが判明.Visibleが有効なので,すでに表示中であるという判定がなされているよう.そこで,プロパティパネルで初期値は False とし,OnFormShowイベント時に True に変更するように指定すると,無事表示したフォームが開けた.但し,フォームだけ表示を有効にしても,中のコンポーネントは表示されないので下図のようなのっぺらぼうなフォームが出来てしまう.
procedure TFormUndistortionParameter.FormShow(Sender: TObject); var i : Integer; begin for i := 0 to ComponentCount - 1 do ( Components[i] as TControl ).Visible := True; end;
こんな感じにフォーム上のコンポーネントの表示を一斉に有効にして,対応した.フレームワークで作る際はこんな面倒くさい処理を挟まなくても,問題なく作れたんだけど,ちょっとスクラッチで書こうとすると色々問題が出てくる.たいへん.