掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
動的フレームの再作成でエラー (ID:22548)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
はにわ(ばにわ?)さんへ 私も話しを脱線させたので、お詫びにSingletonパターン版を書いて見ました。 >また生成・表示されたフレームを一番上に表示するのにもすでにあるフレームをすべてhideしていますが、この点も効率のよい方法ありませんか? 上記もBringToFrontメソッドを使ってみました。 追伸 Frameさん、TObject.Freeヘルプの最後にもに >フォームを解放するには,Release メソッドを使います。Release メソッドは,すべてのイベントハンドラと,含まれているコンポーネントが実行を完了した後で,フォームを破棄し,フォームに割り当てられていたメモリを解放します。 と書かれています。それでもフォームをFree(FreeAndNil)で破棄するんですか? こんなこと常識だと思っていますたが・・・・(-_-;) はにわさん、長くしてしまってすみませんでした。もうこれ以上フォームの話はしません。m(__)m -------------------------------------------------------------------------------- unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private 宣言 } protected { protected 宣言 } public { Public 宣言 } end; var Form1: TForm1; implementation uses Unit2, Unit3; {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); begin TFrame2.GetInstance(self, 100, 100); end; procedure TForm1.Button2Click(Sender: TObject); begin TFrame3.GetInstance(self, 100, 300); end; end. -------------------------------------------------------------------------------- unit Unit2; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Unit1; type TFrame2 = class(TFrame) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private 宣言 } procedure CMRelease(var Message); message CM_Release; protected { protected 宣言 } public { Public 宣言 } class function GetInstance(AOwner: TComponent;ATop,ALeft: Integer): TFrame2; destructor Destroy; override; end; implementation {$R *.DFM} var Singleton: TFrame2; procedure TFrame2.Button1Click(Sender: TObject); begin PostMessage(Handle, CM_RELEASE, 0, 0); end; class function TFrame2.GetInstance(AOwner: TComponent;ATop,ALeft: Integer): TFrame2; begin if not Assigned(Singleton) then begin Singleton := TFrame2.Create(AOwner); end; Singleton.Top := ATop; Singleton.Left := ALeft; Singleton.parent := TForm(AOwner); Singleton.Show; Singleton.BringToFront; Result := Singleton; end; destructor TFrame2.Destroy; begin inherited; Singleton := nil; end; procedure TFrame2.CMRelease(var Message); begin Free; end; end. -------------------------------------------------------------------------------- unit Unit3; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Unit1; type TFrame3 = class(TFrame) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private 宣言 } procedure CMRelease(var Message); message CM_Release; public { Public 宣言 } class function GetInstance(AOwner: TComponent;ATop,ALeft: Integer): TFrame3; destructor Destroy; override; end; implementation {$R *.DFM} var Singleton: TFrame3; procedure TFrame3.Button1Click(Sender: TObject); begin PostMessage(Handle, CM_RELEASE, 0, 0); end; class function TFrame3.GetInstance(AOwner: TComponent; ATop,ALeft: Integer): TFrame3; begin if not Assigned(Singleton) then begin Singleton := TFrame3.Create(AOwner); end; Singleton.Top := ATop; Singleton.Left := ALeft; Singleton.parent := TForm(AOwner); Singleton.Show; Singleton.BringToFront; Result := Singleton; end; destructor TFrame3.Destroy; begin inherited; Singleton := nil; end; procedure TFrame3.CMRelease(var Message); begin Free; end; end.
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.