喫茶XRAYトップページ

[スレッド全体
]

[1111] [自動生成]と[選択可能なフォーム]返信 削除
2007/2/16 (金) 12:35:15 Mr.XRAY
参考までにこれは以下の様なことです.

■自動生成フォームと使用可能フォーム

(1)新規プロジェクト作成
(2)[ファイル][新規作成][フォーム]でForm2ができる.
(3)この時[プロジェクト][ソース表示]でプロジェクトのソースは以下のようになる.

    program Project1;

    uses
      Forms,
      Unit1 in 'Unit1.pas' {Form1},
      Unit2 in 'Unit2.pas' {Form2};

    {$R *.RES}

    begin
      Application.Initialize;
      Application.CreateForm(TForm1, Form1);
      Application.CreateForm(TForm2, Form2);  //Form1の後にForm2が生成される
      Application.Run;                        //最初の生成Form1がメインフォーム
    end.


(4)[プロジェクト][オプション]で表示されるダイアログで左のリストから
   [フォーム](Delphi7で[フォーム]タブ)を選択し,[自動作成フォーム作
   成]から[使用可能フォーム]へ移動.
   プロジェクトのソースは以下の様になる.
   (Delphi7では各々
   [自動作成フォーム]は[自動作成の対象]
   [使用可能なフォーム]は[選択可能なフォーム]となっている)
 
    program Project1;

    uses
      Forms,
      Unit1 in 'Unit1.pas' {Form1},
      Unit2 in 'Unit2.pas' {Form2};

    {$R *.RES}

    begin
      Application.Initialize;
      Application.CreateForm(TForm1, Form1);  //Form2は生成されない
      Application.Run;
    end.
 
つまり使用可能フォームは,メインフォーム(アプリ実行開始)表示の時は生成されま
せん.何故このようにするかというと,この時Form2が使用するメモリを節約できる
ことと,プロジェクトの管理上に便利だからです.多くのアプリはこのような方法を
とっていると思われます.
では,Form2はどのように実行時に生成するかというと,例えば


■使用可能フォームの生成

(1)Form1にTButton(Button1)を一つ配置
(2)Unit1のコードをアクティブにして[ファイル][ユニットを使う]でUnit2を選択
(3)Button1のクリックイベントを以下のようにする

rocedure TForm1.Button1Click(Sender: TObject);
begin
     Form2:=TForm2.Create(Self);
     try
       if Form2.ShowModal=mrOK then begin
       end;
     finally
       FreeAndNil(Form2);  //使い終わったら解放する
     end;
end;

以上が自動作成フォームと使用可能なフォームの説明ですが,順三さんのプロジェクト
の様子が不明なものですからお聞きしました.



[1112] Re:[自動生成]と[選択可能なフォーム]返信 削除
2007/2/17 (土) 18:54:37 順三
▼ Mr.XRAYさん
> 参考までにこれは以下の様なことです.
>
> ■自動生成フォームと使用可能フォーム
>

 ご丁寧に解説頂きありがとうございました。
 何も考えずに、ある人の作ったプロジェクトの作り方をまねして
 使っていました。私の作っているプロジェクトは、すべて選択可能な
 フォームです。
 ただ、ShowModalでなくShowしていて、複数のWindowを開けるように
 しています。明示的にFreeAndNilをしてないのは、問題があるでしょうか。

 

[1114] Re2:[自動生成]と[選択可能なフォーム]返信 削除
2007/2/17 (土) 20:58:20 Mr.XRAY
▼ 順三さん

>  ただ、ShowModalでなくShowしていて、複数のWindowを開けるように
>  しています。明示的にFreeAndNilをしてないのは、問題があるでしょうか。


明示的にFreeAndNilしなくてもアプリの終了時に自動的に解放破棄してくれます。
もし、Freeにしたければ、ShowするFormのOnCloseイベントに

rocedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
     Action:=caFree;
end;

と書けば、フォームは閉じ,そのフォームに割り当てたすべてのメモリが解放さ
れます(ヘルプより)。
ShowしたフォームをShowの後でFreeしたらなくなちゃいますからね(笑)。

[▼次のスレッド]
INCM/CMT
Cyclamen v3.82