お世話になっております。
Delphi2007,XPです。
ダイアログやツールボックス類をたくさん作る必要があるので、フォームを100個ぐらい使うプログラムを作ろうとしていますが、普通に作ってもだいじょうぶでしょうか。
(メモリとか、動作スピードとか)
フォームをたくさん使うときに、何か特に必要な処理とかがありましたら、教えてください。
よろしくお願いします。
必要な時に生成 Create 不要になったら廃棄 Free
使い回せる物は流用(TPageControl TabVisible := False とかで)
ありがとうございます。
必要な時に生成 Create が、便利でいいと思いました。
画面右上のファイル→project1.exe→右クリック→ソース表示→
Application.Initialize;
の下にある、
Application.CreateForm(TForm2, Form2);
を削除し、任意のFormの好きな場所に
Application.CreateForm(TForm2, Form2);
を置いてもいいんですよね。
このとき、何度も
Application.CreateForm(TForm2, Form2);
を実行すると、何個もForm2ができます。
それぞれのself.Nameを調べると、
Form2_1,Form2_2,Form2_3・・・となりますが、
Form2_1.freeとしようとしても、エラーとなります。
何個もできたFormの内、どのFormを廃棄するかを指定するには、どうしたらよいでしょうか?
よろしくお願いします。
>Application.CreateForm(TForm2, Form2); を削除し
いちいち自分で消さなくても、プロジェクトのオプションで「自動生成」の対象から外せばいいです。
ついでに ツール>環境オプション>モジュール作成時>自動生成の対象に追加 も確認を。私は滅多に自動生成を使わないのでオフにしています。
> このとき、何度も
> Application.CreateForm(TForm2, Form2);
> を実行すると、何個もForm2ができます。
CraeteFormの2番目の引数は「作成したフォームを格納する変数」です。
同じ変数を指定したら、当然同じ変数に上書きされます。
(ちなみにForm.Nameはあくまで識別のための文字列で、変数名とは無関係です)
いくつ同じフォームを作っても、変数が指しているのは最後に作った一つだけなので、削除できるのもその一つだけです。
(まあ、Screen.Formsからたどれないこともないですが)
CreaetFormを使うと自動的にApplicationがOwnerになります。
動的にフォームを作成する場合は、作る人が自分をOwnerにしてCreateで作成するのが普通です。
同じ型のフォームを複数作成するのだったら、配列なりObjectListなり使ってちゃんと管理しないといけませんね。
my_form2[index] := TForm2.Create(Self);
...
my_form2[index].Free;
ありがとうございます。
けど さんとtor さんのご指導を合わせると、
Form1(メインフォーム)以外のフォームを「自動生成」の対象から外して、それらのフォームを使いたい時には生成 Create し、使い終わったら Free 廃棄するという事でよろしいでしょうか。
Formも配列で管理できるということが分かり、とてもよかったです。
ありがとうございました。
こんにちは.
既に解決済みということでが.
>普通に作ってもだいじょうぶでしょうか。
Windows 98の時代に,数えたことはありませんが,数10個のフォームを使用するアプリを
いくつも作成しています.
そのアプリを起動して,ワードもエクセルも起動しても,いままで問題が発生したことは
あません.作成したアプリのバグ以外では(笑).
私の作成するアプリでは,ほとんどの場合,前面に表示するフォームは1つですから,
その度Createして,表示が終わればFreeしています.
(もちろん,既にレスにあるように,自動生成からは外しておきます)
このCreateしてFreeする方法は,
procedure TForm2.Button1Click(Sender: TObject);
begin
Form3 := TForm3.Create(Self);
try
//Form3を使用した何かの処理
finally
FreeAndNil(Form3);
end;
end;
という感じです.これはどのコンポーネントでも「普通」の使い方ですね.
もし自動生成で全てのフォームを作成するとその分リソースが必要です.
上のリストのように必要な時に生成すればリソースの節約にもなります.
また,必要なときに生成すれば,たとえEXEが大きくても,リソースの読み込みが少なくなる
ので起動が速くなります(最近のOSではありま関係ないかも知れませんが).
アプリあるいは,アプリの特定の部分では,複数のフォームを切り換えて表示したいことも
あるでしょう.そんな場合,これもすでにレスがありますが,TPageControlなどの利用も
考えられます.
また,TFormPanelというコンポーネントを使用すると切換えが便利です.
たとえば,以下のページでは,このTFormPanelを使用しています.
http://mrxray.on.coocan.jp/Delphi/plSamples/T110_FormPanel.htm
なお,この方法が「普通」かどうかは定かではありません(笑).
1つのフォームを複数表示させる方法 http://khe00221.image.coocan.jp/Tips/Component/TForm/002/index.html
ありがとうございます。
TPageControlについて、調べてみましたが、これを使って複数のフォームを切り換えて表示すると言うのが、よく分かりませんでした。
なんとなく、Microsoftエクセルでシートを切り替える、みたいな使い方しか分かりませんでしたが、フォームを切り替えるには、どうしたらよいでしょうか。
よろしくお願いします。
例えばTPageControlの各ぺージにPanelを配置
表示したいフォームがForm3で
Form1のPage1に配置したPanelがPanel4でここに表示したければ
Form3.Parent:=Form1.Panel4;
でどうでしょうか。
PageControlの中にFormを入れてしまったら、たしかに毎度表示・消去する手間は省けますが
他のタブを表示している間もフォームは存在し続けるので、一度に使用するリソースは増えてしまいます。
質問の趣旨からすると不適当なのでは?
同じ種類のフォームを何枚も表示するかわりに、一枚で済ませて中身をタブで切り替えるとか
Form A,B,C に共通する項目がいくつもある場合、それらを一枚のフォームにまとめて
それぞれのフォームで違う部分だけタブで切り替えて見せるようにするとか
そういった趣旨ならわからなくもないですが……
ありがとうございます。
フォームのParentに、他のフォームのPanelを指定するのは、ちょっとびっくりしましたが、そのとおりになりました。
でも、torさんの言うとおり、一度に使用するリソースが増えるかも知れませんね。
それでも、何かの時に使えそうです。
結局、道具の数を減らして、使った後はすぐに片付けるというのが、いちばんいいということでしょうか。
ありがとうございました。
ツイート | ![]() |