Tips

フレームは一つフォームファイルに集中しがちなイベントハンドラを効率よく分割できる便利な機能だけどそのままでは使いづらく落とし穴にはまりがちなので注意点をまとめてみる。

  • 設計時にフレームを埋め込まずに実行時に生成する
    • フォームデザイナの段階で埋め込むとIDEがいろいろ文句を言ってくるので(詳細失念)
  • フォームと同様のイベントハンドラを記述出来るようにする
    • OnCreate/Destroy/Show/Hide/Close相当のものは欲しいところ

以上の問題を解決した薄いラッパーライブラリのサンプルの抜粋

フォーム側のコード。Frame_で始まる手続き・関数はFrameExユニットのもの。

// uses に FrameEx を追加

type
  TForm1 = class(TFormEx) // 継承元をTFormExに変更
    ...
  private
    { Private 宣言 }
    // フレームインスタンスを保持する変数を宣言
    FrameLog: TFrameLog;  
    FrameTreeView: TFrameTreeView;
  public
    { Public 宣言 }
  end;

 procedure TForm1.FormCreate(Sender: TObject);
 begin
   // フレームインスタンスを生成
   FrameLog := Frame_Create(
   	TFrameLog,  // フレーム型を指定
   	Self,  // Ownerを指定
   	TabSheetLog,  // Parentコントロールを指定。ここではタブシート
   	alClient // 100% 設定し忘れるのでここでFrame.Alignを指定するとよい
   	) as TFrameLog; 
   FrameTreeView := Frame_Create(TFrameTreeView, Self, Panel1, alClient) as  TFrameTreeView;
 end;

TFrameExを継承したくない場合は以下の手続きをフォームのイベントハンドラから明示的に呼び出す。

procedure Frame_CallShow(AOwnerForm: TComponent);
procedure Frame_CallHide(AOwnerForm: TComponent);
procedure Frame_CallDestroy(AOwnerForm: TComponent);
procedure Frame_CallClose(AOwnerForm: TComponent);
// procedure Frame_CallCreate(AOwnerForm: TComponent); これはFrame_Createから自動的に呼ばれる。

フレーム側のコード。[ファイル|新規作成|その他]フレームで作成したフレーム。

type
 TFrameLog = class(TFrame)
    ... // ここまでは普通のフレームのコード
 published 
   // イベントハンドラ相当のメソッドをpublishedで宣言する
   // FrameExユニットでは以下の5つをサポート
   procedure DoCreate;
   procedure DoDestroy;
   procedure DoShow;
   procedure DoHide;
   procedure DoClose;
 end;

添付のサンプルは左側のPanel1にツリービューのフレームを埋め込み、下のPageControl1のTabSheetLogにログ出力用のListViewを埋め込んだもの。


添付ファイル: fileFrameSample.zip 371件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2008-04-08 (火) 00:57:34 (881d)