-PR-
締切り
済み

フォームの生成と破棄

  • 困ってます
  • 質問No.50051
  • 閲覧数250
  • ありがとう数3
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 67% (39/58)

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
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

回答 (全2件)

  • 回答No.1
レベル11

ベストアンサー率 37% (110/293)

一般的にC++Builderでフォームを新規作成すると 自動的にインスタンスは生成される仕様になっているのですが、 その対策はされているのでしょうか? #プロジェクト-オプションのフォームタブの自動生成の対象 Builderではフォームはnewせずにそのままコンパイラに生成させて FormX->Show();してFormX->Close();するのが自然だと思います。 ただしF ...続きを読む
一般的にC++Builderでフォームを新規作成すると
自動的にインスタンスは生成される仕様になっているのですが、
その対策はされているのでしょうか?
#プロジェクト-オプションのフォームタブの自動生成の対象

Builderではフォームはnewせずにそのままコンパイラに生成させて
FormX->Show();してFormX->Close();するのが自然だと思います。
ただしForm1だけはClose();するとプログラム閉じてしまうんで、
Form1->Visible = false;
するのが適当だと思います。
Close()はForm1以外はインスタンスは残ったままです。

ちなみにデストラクトも自動でやってくれるはずです。

メモリの関係でどうしても自分でインスタンスを生成したい場合は
ヘルプでTFormを検索して関連項目を当たってください。
ほぼ必要な項目はこの中にあるはずです。
補足コメント
Richi

お礼率 67% (39/58)

御返事有り難うございました。

自動生成に対象にはForm1だけを指定しています。
「コンパイラに生成させて」とは、自動生成の対象に
全てのフォームを指定するという意味でしょうか。
その場合、メモリが大量に消費されてしまうという
問題は発生しないのでしょうか。
よろしければ御回答をお願いします。
投稿日時 - 2001-03-12 01:03:10


  • 回答No.2
レベル11

ベストアンサー率 37% (110/293)

そんなにメモリは食わないと思います、としか言えないです。 少なくとも10個、20個ぐらいでは実用に耐えうる程度のメモリ しか食わないと思います。 で、補足説明と自分の若干の質問の勘違いとを修正して考えますと、 若干の疑問と問題点がうかびました。 まず、Form1だけを自動生成している以上、Form1をClose(); したらアプリが終わってしまう気がするんですが(^^;; ですのでF ...続きを読む
そんなにメモリは食わないと思います、としか言えないです。
少なくとも10個、20個ぐらいでは実用に耐えうる程度のメモリ
しか食わないと思います。

で、補足説明と自分の若干の質問の勘違いとを修正して考えますと、
若干の疑問と問題点がうかびました。

まず、Form1だけを自動生成している以上、Form1をClose();
したらアプリが終わってしまう気がするんですが(^^;;
ですのでForm1->Visible = false;が適当かと。
あとForm1もdeleteしてないかどうかご確認願います。
(自動生成しているのでしちゃまずいです)

次にForm1を自動生成していることから、Form1のインスタンスは
既にできているので、Form1->Show();かForm1->Visible = true;
でいいかと。

どうせなら全部自動生成しない方がいいかもしれないですね。

なんか回答というかアドバイスにしかならなくて申し訳ないです。
お礼コメント
Richi

お礼率 67% (39/58)

御返事頂きましてありがとうございました。

間違いがありましたので訂正します。
Form2~5を表示させた後、Form1のClose()は行ってはおらず、Form1->Hide();としていました。
また、Form2からForm1へ戻る時は、Form1->Show();
としていました。

すべてのフォームを自動生成する方法で行いたいと
思います。
投稿日時 - 2001-03-12 10:02:45
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ