- 締切済み
フォームの生成と破棄
C++Builder5.0の質問です。 フォーム(Form1)に複数のボタンを配置し、メニュー画面としました。 ボタンを押すと他の画面(Form2~5)に移れるようにしました。 ボタンには TForm2 *Form2 = new TForm2(this); Form2 -> Show(); Close(); ↑ Form2からForm5まであります。 と記述し、 Form2から5には「戻る」ボタンを設け、Form1(メニュー画面)に 戻れるようにしました。 Form2~5の「戻る」ボタンには TForm1 *Form1 = new TForm1(this); Form1 -> Show(); Close(); と記述しました。 また、全てのフォームのFormCloseイベントには自分のフォームを破棄するために delete Form2; 等と記述しました。 この状態でメニュー画面からForm2~5を開いたり閉じたりすることを 繰り返すと、不定期的に動作が固まってしまいます。 この原因はなんでしょうか。 Ver.はBCB5.0(Pro.)です。 御回答をよろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- BLACKTALON
- ベストアンサー率37% (110/293)
そんなにメモリは食わないと思います、としか言えないです。 少なくとも10個、20個ぐらいでは実用に耐えうる程度のメモリ しか食わないと思います。 で、補足説明と自分の若干の質問の勘違いとを修正して考えますと、 若干の疑問と問題点がうかびました。 まず、Form1だけを自動生成している以上、Form1をClose(); したらアプリが終わってしまう気がするんですが(^^;; ですのでForm1->Visible = false;が適当かと。 あとForm1もdeleteしてないかどうかご確認願います。 (自動生成しているのでしちゃまずいです) 次にForm1を自動生成していることから、Form1のインスタンスは 既にできているので、Form1->Show();かForm1->Visible = true; でいいかと。 どうせなら全部自動生成しない方がいいかもしれないですね。 なんか回答というかアドバイスにしかならなくて申し訳ないです。
- BLACKTALON
- ベストアンサー率37% (110/293)
一般的にC++Builderでフォームを新規作成すると 自動的にインスタンスは生成される仕様になっているのですが、 その対策はされているのでしょうか? #プロジェクト-オプションのフォームタブの自動生成の対象 Builderではフォームはnewせずにそのままコンパイラに生成させて FormX->Show();してFormX->Close();するのが自然だと思います。 ただしForm1だけはClose();するとプログラム閉じてしまうんで、 Form1->Visible = false; するのが適当だと思います。 Close()はForm1以外はインスタンスは残ったままです。 ちなみにデストラクトも自動でやってくれるはずです。 メモリの関係でどうしても自分でインスタンスを生成したい場合は ヘルプでTFormを検索して関連項目を当たってください。 ほぼ必要な項目はこの中にあるはずです。
補足
御返事有り難うございました。 自動生成に対象にはForm1だけを指定しています。 「コンパイラに生成させて」とは、自動生成の対象に 全てのフォームを指定するという意味でしょうか。 その場合、メモリが大量に消費されてしまうという 問題は発生しないのでしょうか。 よろしければ御回答をお願いします。
お礼
御返事頂きましてありがとうございました。 間違いがありましたので訂正します。 Form2~5を表示させた後、Form1のClose()は行ってはおらず、Form1->Hide();としていました。 また、Form2からForm1へ戻る時は、Form1->Show(); としていました。 すべてのフォームを自動生成する方法で行いたいと 思います。