1

私はこの奇妙な問題に遭遇し続けます。それはほとんどランダムに見えますが、私はアプリケーションを実行してフォームを開き、それを使っていくつかの作業を行い、それを閉じます。次にそのフォームの別のインスタンスを開くと、既存のフォームに関するエラーメッセージが表示されます。これは非常に奇妙で、エラーを常に再現することはできませんでした。

それが助けになるなら、私はまだDelphi6を使用しています。これが起こっている理由や、それを防ぐために私にできることはありますか?

4

3 に答える 3

4

フォームを閉じたときにフォームが非表示になっていないことを確認しますか?

これはMDIフォームのデフォルトですが、他の人が同じことをしているのを見てきました(フォームの再表示を高速化するため)。

編集(コメントをくれたCosmin Prundに感謝します!):

OnCloseフォームのイベントをフックし、CloseActionパラメーターの値を確認します。の場合caHide、フォームは非表示になります。

caFree一時的なハックはに割り当てることかもしれませんCloseActionが、より良い解決策は、イベントハンドラーのスタックを監視して、OnCloseそこに到達した方法と、そもそも何が原因であるかを確認することCloseActionですcaHide

注:これらの状況では、VCLの機能を確認したいことがよくあります。debug DCUsしたがって、プロジェクトでを有効にすることをお勧めします。その方法については、このブログ記事debug DCUsを参照してください(リンクで検索してください)。

--jeroen

于 2010-07-07T05:18:47.750 に答える
0

コードを提供していませんが、両方のフォームインスタンスに同じコンポーネント名を付けているようで、両方のフォームの所有者は同じです(おそらくアプリケーションオブジェクト)。

同じ名前のコンポーネントを別のコンポーネントが所有することはできません。各フォームインスタンスに異なる名前を付けるか、Nameプロパティに値を付けないで、RTLに新しく作成したインスタンスの一意のコンポーネント名を選択させる必要があります。

これが当てはまらない場合は、フォームインスタンスを作成するためのコードを提供してください。これにより、フォームに他に何が問題があるかを確認できます。

于 2010-07-06T21:15:21.787 に答える
0
 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;
于 2012-04-26T08:56:20.843 に答える