お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"一つのフォームを複数枚表示"




 

 同一のユニット(フォームの形式)で内容の異なるものを同時に複数枚表示
する方法です。複数の伝票を横に並べて見比べたりすることができるようにな
ります。

 デルファイでフォーム(HogeHoge.pas)を作り、メインユニットのボタンを
押すとそのフォームを表示するプログラムを普通に作ると次のようになりま
す。

 しかし、このままだと、何度ボタンを押しても、同じフォームが表示される
だけです。これを、ボタンを押すたびに新しいフォームが何枚でも出てくるよ
うにします。

 なお、 以下ではユニット  HogeHoge.pas  にある 「var  FormHogeHoge  :
TFormHogeHoge;」を「ユニット変数」と呼んでおきます。ユニットに初めから
定義されている変数という意味です。

    【最初の状態】
    ────
    unit HogeHoge ; interface
    uses ...
    type
      TFormHogeHoge = class(TForm)
        ...(フォームの内容・略)...
      end;
    var
      FormHogeHoge : TFormHogeHoge;
      { ↑ ユニット変数のフォームオブジェクト }
    implementation
      ...
    end.
    ────
    Unit Unit1 ; interface
    uses HogeHoge, ...
      ...
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      ..(表示内容の設定など・略)..
      HogeHoge.FormHogeHoge.show;
        { ↑ユニット変数のフォームオブジェクトを表示する }
    end;
    ────
    program Project1;
    uses
      Forms,
      HogeHoge in 'HogeHoge.PAS' {FormHogeHoge};
      Unit1 in 'UNIT1.PAS' {Form1};
    ...
    begin
      Application.CreateForm(TForm1, Form1);
      Application.CreateForm(TFormHogeHoge, FormHogeHoge);
        { ↑ユニット変数のフォームオブジェクトを作成する }
      Application.Run;
    end.
    ───

 まず、下準備として、フォームを表示する関数(ShowHogeHoge)を用意し、
公開し、他のフォームから表示する場合には、それを使うようにします。この
段階では内容的には上のものと全く変わりません。

 フォームを表示する関数 (ShowHogeHoge)では 「with  FormHogeHoge  do
begin」のよう「with」で囲っておくと、後で都合がいいです。

    【下準備の状態】
    ────
    unit HogeHoge ; interface
    uses ...
    procedure ShowHogeHoge( ACaller:TForm ; ... );      { ←公開 }
    type
      TFormHogeHoge = class(TForm)
        ...(フォームの内容・略)...
      end;
    var  FormHogeHoge : TFormHogeHoge;
      { ↑ ユニット変数のフォームオブジェクト、変わらず。 }
    implementation
      ...
    procedure ShowHogeHoge( ACaller:TForm ; ... );  ─┐ 表示関数
    begin                                            │ 追加
      with FormHogeHoge do begin                     │
          ..(表示内容の設定など・略)..             │
        show;                                        │
      end;                                           │
    end;                                          ─┘
    end.
    ────
    Unit Unit1 ; interface
    uses HogeHoge, ...
      ...
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      ShowHogeHoge( self, 表示内容の設定などを引数にする);  { 変更 }
    end;
    ────

 このようにしておくと、

 1 表示関数(ShowHogeHoge)の 「with FormHogeHoge do  begin」の行を
    「with TFormHogeHoge.Create(application) do  begin」に変える

だけで同一のフォームを何枚でも表示できるようになります。

 ただ、このままだとフォームを閉じた後にもフォームがメモリに残ってしま
うのでその対策が必要になります。次のようにします。

 2 フォームの OnClose イベントを作成し、その最後に「release」を追加
    する。

 3 ユニット変数を「release」するとトラブルの元なので、 オプション−
    プロジェクト−自動作成の対象から FormHogeHoge  を外し、 (これは、
    Project1 の「Application.CreateForm(TFormHogeHoge,FormHogeHoge);」
    を削除するのと同じです)。

 4 念のためユニット変数「var  FormHogeHoge : TFormHogeHoge;」自体を
    削除します。

    【複数表示版】
    ────
    unit HogeHoge ; interface
    uses ...
    procedure ShowHogeHoge( ACaller:TForm ; ... );  { 追加すみ }
    type
      TFormHogeHoge = class(TForm)
        ...(フォームの内容・略)...
      end;
    { var  FormHogeHoge : TFormHogeHoge; }
    { ↑ ユニット変数のフォームオブジェクトを削除する。 }
    implementation
      ...
    procedure ShowHogeHoge( ACaller:TForm ;... );   ─┐ 表示関数
    begin                                             │
      with TFormHogeHoge.Create(application) do begin │ ←with を変更
          ..(表示内容の設定など・略)..             │
        show;                                        │
      end;                                           │
    end;                                          ─┘
    procedure TFormHogeHoge.FormClose( ... );       ─┐
    begin                                             │
      release;                                        │ ← 追加
    end;                                            ─┘
    end.
    ────
    Unit Unit1 ; interface
    uses HogeHoge, ...
      ...
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      ShowHogeHoge( self, 表示内容の設定などを引数にする)   { 変わらず
}
    end;
    ────
    program Project1;
    uses
      Forms,
      HogeHoge in 'HogeHoge.PAS' {FormHogeHoge};    { ←たぶん、消える
}
      Unit1 in 'UNIT1.PAS' {Form1};
    ...
    begin
      Application.CreateForm(TForm1, Form1);
      { Application.CreateForm(TFormHogeHoge, FormHogeHoge); }
      { ↑ユニット変数のフォームオブジェクトの作成を削除する }
      Application.Run;
    end.
    ───

 以上ですが、もっと詳しい方がおられれば、添削をお願いいたします。

                              98/1/21(Wed) GGB03124 熊谷秀武

Original document by 熊谷秀武        氏 ID:(GGB03124)


ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum