私はこの奇妙な問題に遭遇し続けます。それはほとんどランダムに見えますが、私はアプリケーションを実行してフォームを開き、それを使っていくつかの作業を行い、それを閉じます。次にそのフォームの別のインスタンスを開くと、既存のフォームに関するエラーメッセージが表示されます。これは非常に奇妙で、エラーを常に再現することはできませんでした。
それが助けになるなら、私はまだDelphi6を使用しています。これが起こっている理由や、それを防ぐために私にできることはありますか?
フォームを閉じたときにフォームが非表示になっていないことを確認しますか?
これはMDIフォームのデフォルトですが、他の人が同じことをしているのを見てきました(フォームの再表示を高速化するため)。
編集(コメントをくれたCosmin Prundに感謝します!):
OnClose
フォームのイベントをフックし、CloseAction
パラメーターの値を確認します。の場合caHide
、フォームは非表示になります。
caFree
一時的なハックはに割り当てることかもしれませんCloseAction
が、より良い解決策は、イベントハンドラーのスタックを監視して、OnClose
そこに到達した方法と、そもそも何が原因であるかを確認することCloseAction
ですcaHide
。
注:これらの状況では、VCLの機能を確認したいことがよくあります。debug DCUs
したがって、プロジェクトでを有効にすることをお勧めします。その方法については、このブログ記事debug DCUs
を参照してください(リンクで検索してください)。
--jeroen
コードを提供していませんが、両方のフォームインスタンスに同じコンポーネント名を付けているようで、両方のフォームの所有者は同じです(おそらくアプリケーションオブジェクト)。
同じ名前のコンポーネントを別のコンポーネントが所有することはできません。各フォームインスタンスに異なる名前を付けるか、Nameプロパティに値を付けないで、RTLに新しく作成したインスタンスの一意のコンポーネント名を選択させる必要があります。
これが当てはまらない場合は、フォームインスタンスを作成するためのコードを提供してください。これにより、フォームに他に何が問題があるかを確認できます。
function ShowOnce( AFormClass:TFormClass;AShowing:Boolean=True):TForm;
var
i : integer;
begin
Result := nil;
for i := 0 to Screen.FormCount -1 do
if Screen.Forms[i] is AFormClass then Result := Screen.Forms[i] as TForm;
if not assigned(Result) then
Result := AFormClass.Create(Application.MainForm); // Application or a parameter
if Showing then
Result.Show;
end;
サンプル1:
ShowOnce(TForm3);
サンプル2:
Form3:=ShowOnce(TForm3,False) as TForm3;
Form3.SomeProperty:=32;
Form3.Show;