|
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"自殺幇助パターンの例"
オブジェクトが自らの意志で自分を破棄したいときに,自分のメソッドの
中で直接,間接に自分をFreeすることはできないので,他のオブジェクトに
メソッドからリターンしてから自分を破棄するよう依頼します.
破棄したいオブジェクト 依頼されるオブジェクト
(TWinControlであること)
Button1 Form1
------------------------------------------------------------------
メソッドの起動(イベント発生)
↓
Clickメソッド −−−−−−−−→ イベントハンドラ
↓
RELEASEメッセージの「Post」
メッセージのキューイング
(Windowsによる)
↓
+←−−−−−−−−−−−−−−+
↓
一旦Application オブジェクトのメッセージループへ戻る
↓
+−−−−−−−−−−→ メッセージハンドラの呼出
↓
Freeの実行 ←−−−−−−−−−− 依頼されたオブジェクトを破棄
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Grids, DBGrids, ExtCtrls, DBCtrls, DB, DBTables, StdCtrls, Mask;
const
{ Private dow Messages by TN }
wm_TN = $3000;
TN_RELEASEOBJECT = wm_TN + 1; { 破棄メッセージの宣言 }
type
TForm1 = class(TForm)
Table1: TTable;
DataSource1: TDataSource;
DBNavigator1: TDBNavigator;
DBGrid1: TDBGrid;
DBEdit1: TDBEdit;
Label1: TLabel;
Label3: TLabel;
Label4: TLabel;
DBText1: TDBText;
DataSource2: TDataSource;
Query1: TQuery;
Label2: TLabel;
DBGrid2: TDBGrid;
Label5: TLabel;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ killmeの実体 }
procedure TNReleaseObject(var Message: TMessage);
message TN_RELEASEOBJECT;
{ killmeの遅延実施 }
procedure KillIt(Sender: TObject);
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.KillIt(Sender: TObject);
begin
{ メッセージをポストしたらリターンする }
PostMessage( Handle, TN_RELEASEOBJECT, 0, LongInt(Sender));
end;
procedure TForm1.TNReleaseObject(var Message: TMessage);
begin
TObject(Message.lParam).Free; { Destroyが多態してくれる }
end;
{ 自分のイベントの中で自殺幇助を依頼する }
procedure TForm1.Button1Click(Sender: TObject);
begin
KillIt(Sender);
end;
end.
TN(CQJ01721)
Original document by TN 氏 ID:(CQJ01721)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|