ソス@ソスソスソスハ知ソス謔ェソスQソスJソスソスソスネ上あソスソス謔、ソスネ包ソスソスソスソスCソスxソスソスソスgソスフ擾ソスソスソス
|
ソスEC/C++
ソスEDelphi
ソスEVisual BasicソスソスソスSソスソス
ソス@(VB2-VB6ソスソス.NETソスソスソスp)
ソスEVisual Basic(VB2-VB6)
ソスEVisual Basic .NET
ソスEVisual C++
ソスEpapy's softwarelibrary
ソスソスソスハゑソスソスソスソスヌゑソスソスネゑソス謔、ソスネイソスxソスソスソスgソスソスソスソスソスフ包ソスソス@ソスソスソスソスソスソスソスソス閧「ソスワゑソスソスB
ソスソスソスソスfソス[ソス^ソスソスソスソスソスソスソスソスOソスソスソス[ソスoソスソスソスNソスソスソスXソスソスClassAソスニゑソスソスソスソスgソスpソスソスソストゑソスソスソス
FormAソスAFormBソスソスソスソスソスソスClassAソスフフソスBソス[ソスソスソスhソスマ撰ソスソスノ変会ソスソスソスソスソスソスソスソスソスソスニゑソスソスソス
OnChangeソスフようソスネ変更ソスソスmソス轤ケソスソスCソスxソスソスソスgソスソスソスソスソスソスソスソストゑソスソスワゑソスソスB
ソスソスソスソスソスソスFormAソスソスソス¥ソスソスソスソスソスソストゑソスソスソスニゑソスソスソス
ソスソスソスソスOnChangeソスCソスxソスソスソスgソスソスけ趣ソスソスソスソスFormAソスソスト描ソス謔オソストゑソスソスワゑソスソスB
ソスソスソスフイソスxソスソスソスgソスソスソスソスヘフソスHソス[ソスソスソスソスソスソスソスソスソスソス
ClassA.OnChange := FormAソスソスナ使ソスpソスソスソスソスけ趣ソスソスソス
ソスニゑソスソストゑソスソスト、ソスjソスソスソスソスソスソス
ClassA.OnChange := nil;
ソスニゑソスソスト受け趣ソスソスネゑソスソス謔、ソスノゑソスソストゑソスソスワゑソスソスB
FormAソスフ托ソスソスソスソスFormBソスソスソス¥ソスソスソスソスソスソストゑソスソスソスニゑソスソスソスソスソスlソスナゑソスソスB
ソスソスソスソスソスソスソスソスソスネのゑソスFormAソスAFormBソスニゑソスノ表ソスソスソスソスソスソスソス謔、ソスネとゑソスソスナゑソスソスB
FormAソスAFormBソスフどゑソスソスソスノゑソスCソスxソスソスソスgソス送りたソスソスソスフでゑソスソスソス
OnChangeAソスAOnChangeBソスニゑソスソストゑソスソス黷シソスソスFormAソスAFormBソスpソスフイソスxソスソスソスgソスニゑソスソスソス
ソスソスソス@ソスソスソスソスソスvソスソスソスソスソスソスソスムまゑソスソスソスB
ソスソスソスソスニ良ゑソスソスソスソス@ソスソスソスソスソスソスワゑソスソスソスソス轤イソスソスソスソスソス閧「ソスワゑソスソスB
ソスソスソスネみゑソスFormAソスソスFormBソスソスQソスニでゑソスソスワゑソスソスし逆ソスソスソスソスlソスナゑソスソスB
ソスワゑソスClassAソスソスFormAソスAFormBソスニゑソスノ参ソスニでゑソスソスワゑソスソスソスB
Delphi ソスフイソスxソスソスソスgソスヘソスソス¥ソスbソスhソス|ソスCソスソスソス^ソスソスミとつゑソスソスソスソスソスソスソスソスiソス[ソスナゑソスソスネゑソス
ソスvソスソスソスpソスeソスBソス[ソスニゑソスソスト趣ソスソスソスソスソスソスソストゑソスソスワゑソスソスBソスナゑソスソスソスソスソスAソスソスソスハの意厄ソスソスナのイソスxソスソスソスg
ソスnソスソスソスhソスソスソスヘ包ソスソスソスソスロ趣ソスソスナゑソスソスワゑソスソスソスBソスソスソスソスソスナ、ソスソスソスzソスソスマゑソスソスト、ソスソスソスソスソスフソスソス¥ソスbソスh
ソス|ソスCソスソスソス^ソス動的ソスノ保趣ソスソスソスソス驍アソスニゑソスlソスソスソスワゑソスソスBソスソスソスフ暦ソスナゑソス TNotifyEvent ソス^
ソスフソスソス¥ソスbソスhソス|ソスCソスソスソス^ソスフ難ソスソスIソスzソスソスソス TList ソスNソスソスソスXソスナ保趣ソスソスソスソスワゑソスソスBソスソスソス¥ソスbソスh
ソス直接追会ソスソスEソス除ソスナゑソスソスワゑソスソスフで、ソスソスソス黷ェソスヌのクソスソスソスXソスノ托ソスソスソスソストゑソスソス驍ゥソス明趣ソスソスI
ソスノ参ソスニゑソスソスソスKソスvソスヘゑソスソスソスワゑソスソスソスBソスQソスlソスノゑソスソストゑソスソスソスソスソスソスソスソスB
type
PNotifyEvent = ^TNotifyEvent;
TClassA = class(TObject)
private
EventList:TList;
function GetEventCount:integer;
protected
public
constructor Create;
destructor Destroy;override;
procedure AddNotifyEvent(ne:TNotifyEvent);
procedure DeleteNotifyEvent(ne:TNotifyEvent);
procedure Fire;
property EventCount:integer read GetEventCount;
end;
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private ソス骭セ }
public
ClassA:TClassA;
procedure Method1(Sender: TObject);
procedure Method2(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
//----------- TClassA ---------------
constructor TClassA.Create;
begin
EventList := TList.Create;
end;
destructor TClassA.Destroy;
var
i:integer;
begin
for i := 0 to EventList.Count-1 do
Dispose(PNotifyEvent(EventList[i]));
EventList.Free;
inherited;
end;
function TClassA.GetEventCount:integer;
begin
result := EventList.Count;
end;
procedure TClassA.AddNotifyEvent(ne:TNotifyEvent);
var
p:PNotifyEvent;
i:integer;
begin
for i := 0 to EventList.Count-1 do
if @TNotifyEvent(PNotifyEvent(EventList[i])^) = @ne then exit;
New(p);
p^ := ne;
EventList.Add(p)
end;
procedure TClassA.DeleteNotifyEvent(ne:TNotifyEvent);
var
i:integer;
begin
for i := 0 to EventList.Count-1 do
if @TNotifyEvent(EventList[i]^) = @ne then
begin
Dispose(PNotifyEvent(EventList[i]));
EventList.Delete(i);
break;
end;
end;
procedure TClassA.Fire;
var
i:integer;
begin
for i := 0 to EventList.Count-1 do
if Assigned(EventList[i]) then PNotifyEvent(EventList[i])^(self);
end;
//----------- TForm1 ---------------
procedure TForm1.FormCreate(Sender: TObject);
begin
ClassA := TClassA.Create;
ClassA.AddNotifyEvent(Method1);
ClassA.AddNotifyEvent(Method2);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
ClassA.Free;
end;
procedure TForm1.Method1(Sender: TObject);
begin
Memo1.Lines.Add('Method1 done');
end;
procedure TForm1.Method2(Sender: TObject);
begin
Memo1.Lines.Add('Method2 done');
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ClassA.Fire;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
ClassA.DeleteNotifyEvent(Method1);
ClassA.Fire;
end;
ClassAソスソスVCLソスナゑソスソスソスホ、TCollectionソスNソスソスソスXソスフ派ソスソスソスNソスソスソスXソスソスソス`ソスソスソスト、FormA, FormBソスソスvソスソスソスpソスeソスBソスノ趣ソスソスツとゑソスソスソスソスソスソスソスソスソスワゑソスソスB
TListViewソスソスColumnソスソスATStatusBarソスソスPanelsソスニ難ソスソスソスソスナゑソス
ソスソスソスソスソスbソスgソスヘ、ソスfソスUソスCソスソスソスソスソスノ設抵ソスナゑソスソス驍アソスニ。
ソスfソスソスソスソスソスbソスgソスヘ、TCollection, TCollectionItemソスフ抵ソス`ソスソスソスハ倒ソスネゑソスソスニでゑソス^^;
ソスfソスソスソスソスソスbソスgソスフ包ソスソスソスソス蛯ォソスソスソスナゑソスソスソスソスAソスソスソスソスソスソスソスソスソスソス@ソスソスソスソスソスニゑソスソスソスソスソスソスニで。
# ソスハゑソスUnitソスソスFormソスソスvソスソスソスpソスeソスBソスノゑソストるかソスヌゑソスソスソスソスヘ趣ソスソスソスソストまゑソスソスソスBソスソスソスソスソスソスけソスネゑソスソスB
> ClassAソスソスVCLソスナゑソスソスソスホ、TCollectionソスNソスソスソスXソスフ派ソスソスソスNソスソスソスXソスソスソス`ソスソスソスト、FormA, FormBソスソスvソスソスソスpソスeソスBソスノ趣ソスソスツとゑソスソスソスソスソスソスソスソスソスワゑソスソスB
ソスソスソス[ソズ、ソスソスソス¥ソスbソスhソス|ソスCソスソスソス^ソスフソスソスXソスgソスソスロ趣ソスソスソスソス驍アソスニと、ソスIソスuソスWソスFソスNソスgソスフソスソスXソスgソスソス
ソスロ趣ソスソスソスソス驍アソスニとは必ソスソスソスソスソスソスソスvソスソスソスネゑソスソスソスソスヌね。ソスKソスソスソスソスソスソスソスソスソスOソスフソスソス¥ソスbソスhソスソストび出ソスソス
ソスソスソスノゑソスソスソスニゑソスソスAソスソスソスソスソスソスソス TFormA ソスソス TFormB ソスフ宣言ソスソス TClassA ソスソスソス迪ゥソスソスソスネゑソスソスソスソス
ソストび出ソスソスソスソスソスニゑソスoソスソスソスネゑソスソスニ思ソスソスソスワゑソスソスソスソスヌ。
ソスソスソスAソスソスソス痰「ソスソスソストゑソスソスソスソスソスソスソスナゑソスソスB
ソストゑソスソスソスソスソスATFormAソスソスTFormBソスノは具ソスソスハの親ソスNソスソスソスXソスソスソスソスソスソスソスト、ソスソスソスソスソスソスソスソスOnChangeソスCソスxソスソスソスgソスソスソスソスソスソスフゑソスソスニ。
ClassAソスソスTFormAソスヘわかソスソスネゑソスソスソスソスAソスeソスNソスソスソスXソスヘわかソスソスニゑソスソスソスソスOソスソスB
TFormAソスATFormBソスフ派ソスソスソスソスソスNソスソスソスXソスソスソスBソスソスソスソスソスソストゑソスソスソスフでゑソスソスソスホ、ソスfソスソスソスソスNotifyEventソスソスソスソスソスソスソスXソスgソスソスソスソスソスルゑソスソスソスソスネ単ソスナゑソスソスヒ。
> ソスソスソス[ソズ、ソスソスソス¥ソスbソスhソス|ソスCソスソスソス^ソスフソスソスXソスgソスソスロ趣ソスソスソスソス驍アソスニと、ソスIソスuソスWソスFソスNソスgソスフソスソスXソスgソスソス
> ソスロ趣ソスソスソスソス驍アソスニとは必ソスソスソスソスソスソスソスvソスソスソスネゑソスソスソスソスヌね。
ソスソスソスソスフ場合ソスA
ソスEソスPソスNソスソスソスXソスフプソスソスソスpソスeソスBソスマ更ソスナ、ソスQソスツのフソスHソス[ソスソスソスソスOnChangeソスCソスxソスソスソスgソス発撰ソスソスソスソスソスソスソス
ソスニゑソスソスソスソスソスソスニゑソスソスニ暦ソスソスソスソスソスワゑソスソスソスソスB
ソスソスソス¥ソスbソスhソス|ソスCソスソスソス^ソスソスソスソスツ、ソスニゑソスソスソスソスソスソスAソスソスソスソスソスIソスノ、ソスQソスIソスuソスWソスFソスNソスgソスフイソスxソスソスソスgソスソストぶ、ソスニゑソスソスソスソスルゑソスソスソスソスかソスソス竄キソスソスソスソスソスニ思ソスソスソスワゑソスソスB
ソスワゑソスソスAソスソスソス¥ソスbソスhソス|ソスCソスソスソス^ソスフソスソスXソスgソスソスロ趣ソスソスソスソスソスソス鼾ソスフ抵ソスソスモ点ソスニゑソスソスト、ソスIソスuソスWソスFソスNソスgソスフ開ソスソスソスソスソスノソスソス¥ソスbソスhソス|ソスCソスソスソス^ソスソスソスソスソスソスソスニなゑソス_ソスソスソスソスソスソスニ思ソスソスソスワゑソスソスB
VCLソスIソスuソスWソスFソスNソスgソスニゑソスソストプソスソスソスpソスeソスBソスナ連ソスソスソスソスソスソス鼾ソスノは、Notificationソスソスソス¥ソスbソスhソスナ開ソスソスソスハ知ソスナゑソスソスソス_ソスソスAソスソスソス_ソスソスソスニ思ソスソスソスワゑソスソスB
ソスノゑソスソスフゑソスソスソスニゑソスソスbソスソスソスソスソスソスフはゑソスソスソスソスソスいソスナゑソスソスヒ。ソスソスソスソスソスノゑソスソスフテソス[ソス}ソスソスソスフゑソスソスソスソスソスソスいソスナゑソスソスソスソスB
C# ソスフデソスソスソスQソス[ソスgソスナは、ソス}ソスソスソス`ソスLソスソスソスXソスgソスナゑソスソスソスソスナゑソスソスソスソスヌ、Delphi ソスフイソスxソスソスソスgソスヘでゑソスソスネゑソスソスソス
ソスナゑソスソスソスヒ。ソスソスソスソスナゑソスソスいソスソスlソスソスソスソスソスソスソスニゑソスソスソスソスソスワゑソスソスソスソスB
ソスナ擾ソスソスノわたソスソスソスソスPソスノオソスuソスWソスFソスNソスgソスフソスソスXソスgソスソスロ趣ソスソスソスソスソスvソスソスソスpソスeソスBソス[ソスナゑソスソスソスソスじゑソスネゑソスソスソスソスAソスソス
ソスlソスソスソスソスソスソスナゑソスソスBソスナゑソスAソスソスソスソスソスソスフ抵ソスソスソス
> ソスワゑソスClassAソスソスFormAソスAFormBソスニゑソスノ参ソスニでゑソスソスワゑソスソスソスB
ソスソスソスニゑソスソスソスAソスソスソスXソスgソスソスソスフオソスuソスWソスFソスNソスgソスフクソスソスソスXソスソス¥ソス゚想ソス閧キソスソス謔、ソスネ趣ソスソスソスソスヘまゑソスソスソスソス謔、ソスノ思ソスソス
ソスワゑソスソスソスソスBソスソスソスハの擾ソスハクソスソスソスXソスソスgソスソスソスノゑソスソストゑソスAソスソスソス¥ソスbソスgソスソストび出ソスソスソスニゑソスソスノは具ソスフ的ソスネ会ソスソスハクソスソスソスX
ソスノキソスソスソスXソスgソスソスソスネゑソスソスソスホなゑソスワゑソスソスし。ソスソスソスソスソスソスソスソスソスト、ソスIソスuソスWソスFソスNソスgソスフソスソスXソスgソスソスロ趣ソスソスソスソスソス謔、ソスナゑソス
ソス¥ソス゚呼び出ソスソスソスソスソス¥ソスbソスhソスソスソスSソスト固抵ソスAソスソスソスソスソスト予ソス゚オソスuソスWソスFソスNソスgソスソスソスヌゑソスネクソスソスソスXソスフイソスソスソスXソス^ソスソスソスXソスソス
ソスソスソス驍ゥソスソスソスソスソスソスソストゑソスソスソスKソスvソスソスソスソスソスソスワゑソスソスBTCollection ソスソスgソスソスソス鼾ソスナゑソスソスソスソスソスナゑソスソスBソスソスソスソスノ対ゑソスソスソス
ソスソスソス¥ソスbソスhソスソスソスフゑソスフのソスソスXソスgソスナは、ソステ黙のオソスuソスWソスFソスNソスgソスQソスニゑソスソスnソスソスソスソス驍スソス゚、ソスソスソスソスソスIソスノゑソスソスソス
ソスソスソス¥ソスbソスhソスソスソスソスソスソスソスソスIソスuソスWソスFソスNソスgソスソスQソスニゑソスソスソスKソスvソスソスソスソスソスソスワゑソスソスソスBソスnソスソスソスhソスソスソスフ型ソスソスソスソスソスソスソスソスvソスソスソストゑソスソスソス
ソスソスOKソスナゑソスソスBソスニゑソスソスが SizeOf(TNotifyEvent) ソスニゑソスソストみゑソスホ包ソスソスソスソスソスワゑソスソス謔、ソスノ、ソスWソスoソスCソスgソスネのゑソス
ソスPソスソスソスネポソスCソスソスソス^ソスフソスソスXソスg TList ソスナはダソスソスソスナゑソスソスBソスソスナは、PNotifyEvent ソスソスソス`ソスソスソスト、New() ソスソス
Dispose() ソスナ追会ソスソス除ソスソスソストゑソスソスワゑソスソスフで、ソスソスソスソスソスソスニ変ゑソスソスソスソスソスソスソスソスソスノなゑソスソストゑソスソスワゑソスソスB
> ソスソスソス¥ソスbソスhソス|ソスCソスソスソス^ソスフソスソスXソスgソスソスロ趣ソスソスソスソスソスソス鼾ソスフ抵ソスソスモ点ソスニゑソスソスト、ソスIソスuソスWソスFソスNソスgソスフ開ソスソスソスソスソスノソスソス¥ソスbソスh
> ソス|ソスCソスソスソス^ソスソスソスソスソスソスソスニなゑソス_ソスソスソスソスソスソスニ思ソスソスソスワゑソスソスB
ソスソスソスソスソスナゑソスソスヒ。Add() ソスソスソスソスソスソスAソスソスソスソスソスソスソス Delete() ソスソスソスソスKソスvソスソスソスソスソスソスフは、Delphi ソスフ常道ソスソスソスソス
ソスvソスソスソスワゑソスソスソスソスヌ。ソスソスdソスノ登ソス^ソスソスソスソスソスソスAソスoソス^ソスソスソストなゑソスソスフゑソス Delete() ソスソスソストゑソスソスソスQソスノなゑソス謔、ソスソス
ソスソスソスソスソスソスソストゑソスソスソスワゑソスソスBソスソスニゑソスソスト出ソスソスソスソス TClassA ソスヘ、ソス{ソスソスソスヘ擾ソスソスソスソスネソスソスXソスgソスIソスuソスWソスFソスNソスgソスニゑソスソスラゑソス
ソスナ、ソスVソスソスソスノつゑソスソスソスソスソスNソスソスソスXソスソス has ソスソスソスソスソス謔、ソスノゑソスソスソスフゑソスソスソスソスzソスナゑソスソスソスソスヌ、ソスソスソスソスソスワではゑソスソストゑソス
ソスワゑソスソスソスB
jokソスソスソスソスAソスノゑソスソスフゑソスソスソスAソスソスソスソスソスソスソスソスソス閧ェソスニゑソスソスソスソスソスソスソスソスワゑソスソスB
ソスFソスXソスネプソスソスソスOソスソスソスソスソスナデソス[ソス^ソスフ構ソスソスソスソスソスソスlソスソスソスソスソスニゑソスソスAソスヌゑソスソスソスソストゑソスソスソスソスソスハ知ソスソスソスソスソスソス
ソスYソスソスナゑソスソスワゑソスソスフでゑソスソスB
ソスソスソス黷ェソスソスソスソスソスソスソスjソスbソスgソスソスナ上下ソスヨ係ソスソスソスソスソスソスNソスソスソスXソスフ場合ソスヘ擾ソスハに渡ソスソスソスソスソスソスA
ソスソスソスソスノ会ソスソスハに難ソスソスソスソスソスソスソスニでゑソスソスソスフでゑソスソスソスソスAソス繪コソスヨ係ソスソスソスソスソスソスソスNソスソスソスXソスフ場合ソスソス
ソスヌのようソスノゑソスソスソスホよいソスフゑソスソスニ搾ソスソスソスソストゑソスソスソスニゑソスソスソスナゑソスソスB
ソスQソスニに関ゑソスソストでゑソスソスソスソスAソスソスソスソスソスナゑソスソスソスClassAソスヘグソスソスソス[ソスoソスソスソスfソス[ソス^ソスナゑソスソスフゑソス
interfaceソスソスソスノゑソス
var
GDClassA : TClassA;
ソスニ抵ソス`ソスソスソストゑソスソスソスAソスワゑソスusesソスヘ趣ソスソスgソスソスソスgソスpソスソスソスソスNソスソスソスXソスネ外ソスヘ記ソスqソスソスソスネゑソス
ソスソスソスニで独暦ソスソスソスソスソスソスソス゚てゑソスソスワゑソスソスB
ソスワゑソスFormA,FormBソスヘグソスソスソス[ソスoソスソスソスfソス[ソス^ソスソスQソスニゑソスソスソスノ過ゑソスソスネゑソスソスフゑソス
implementationソスソスソスソスusesソスニゑソスソスト参ソスニ宣言ソスソスソストゑソスソスソスニゑソスソスソスソスソスソスCソスソスソス[ソスWソスナゑソスソスB
jokソスソスソスソスフサソスソスソスvソスソスソスナゑソスソスソスTListソスナ管暦ソスソスソスソスソスニゑソスソスソスソスソスソスzソスヘ思ソスソスソスツゑソスソスワゑソスソスソスナゑソスソスソス
ソスQソスlソスノなゑソスワゑソスソスB
ソスソスソスソスソスソスソスニ擾ソスソスソスソスgソスソスソスソスソスソスソスソスソスフで、ソスソスソスソスソスソスソスソスソスソスソスソスソスソスソス閧ヲソスワゑソスソスソスソスH
ソスニゑソスソスソスソスフは、ソスソスヤ最擾ソスソスフサソスソスソスvソスソスソスソスClassAソスノ対ゑソスソスソスFormA,FormBソスソスソスソスソス
OnChangeソスCソスxソスソスソスgソスニ鯉ソスソスソスソスワゑソスソスソスソスソスソスAソスソスソスロにゑソスClassAソスフようソスノ包ソスソスソスソスハ知ソスソスソスソスソスソスソスソスソスソス
ソスNソスソスソスXClassBソスソスソスソスンゑソスソスワゑソスソスB
ソスソスソス黷セソスソスソスネら今TPersistentソスソスソスソスClassAソスソスソスソスソストゑソスソスソスフゑソスTPersistentソスソスpソスソスソスソス
TPersistentExソスネどとゑソスソストゑソスソスフクソスソスソスXソスソス
procedure AddNotifyEvent(ne:TNotifyEvent);
ソスソスソスソスソスソスソスソストゑソスソスソスソスホ、ClassAソスAClassBソスニゑソスソスTPersistentExソスソスソスソスpソスソスソスソスソス驍アソスニゑソス
ソスeソスNソスソスソスXソスノソソス[ソスXソスソスソスソスソスソスKソスvソスソスソスソスソスソスソスネゑソスワゑソスソスソスヒ?
ソスソスソスソスソスソスソスソスソスxソスソスOnChangeソスCソスxソスソスソスgソスフ托ソスソスノゑソスソスニゑソスソスホ擾ソスソスソスソスソスソスソスハ知ソスソスソスソスCソスxソスソスソスg
OnRefreshソスソスソスうソスニゑソスソスソスソスニゑソスソスソスソスソスソスソスソスソスソスソスソスネりそソスソスソスナゑソスソスB
ソスソスソスフとゑソスソスフ包ソスソス@ソスニゑソスソスソス
ソスuソスソスソスソスソスフイソスxソスソスソスgソスハ知ソスソスヌ暦ソスソスソスソスソスTListソスソスソスソスソスノ用ソスモゑソスソスCソスxソスソスソスgソスソスQソスソスソスソスソスヌ暦ソスソスソスソスソスBソスv
ソスニゑソスソスソスソスソスソス@ソスソスソスyソスソスソスニ思ソスソスソスソスソスフでゑソスソスソス
ソスuソスCソスxソスソスソスgソスソスハ知ソスソスソスソスニゑソスソスソスソスソスソスソスソスソスPソスツのクソスソスソスXソスノゑソスソスソスBソスv
ソスニゑソスソスソスソスソスソスソスソスソスXソスyソスノなりそソスソスソスネ気ソスソスソスソスソスフでゑソスソスソスソスヌゑソスソスナゑソスソス蛯、ソスソスソスH
ソスネ前ソスソスhttp://www.borland.co.jp/cppbuilder/papers/vctocb/chap45.html
ソスソスdelphiソスノ移植ソスソスソスソスTObserver/TObservableソスRソスソスソス|ソス[ソスlソスソスソスgソスソスソスソスソスソスソスソスナゑソスソスソスソスgソスソスソスワゑソスソスソス
ソスソスソスソスソスソスニ抵ソスソスソスソスナゑソスソスソスソスネ会ソスObserver.pas
--------------
unit Observer;
interface
uses
SysUtils, Classes, Contnrs;
type
TUpdateEvent = procedure(Sender, Arg: TObject) of object;
TObserver = class;
TObservable = class(TComponent)
private
FObservers: TComponentList;
FChanged: Boolean;
function GetObservers(Index: Integer): TObserver;
protected
procedure AddObserver(Value: TObserver);
procedure RemoveObserver(Value: TObserver);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Notify(Arg : TObject);
procedure Changed(State: Boolean = True);
function HasChanged: Boolean;
property Observers[Index: Integer]: TObserver read GetObservers;
end;
TObserver = class(TComponent)
private
{ Private ソス骭セ }
FObservable: TObservable;
FOnUpdate: TUpdateEvent;
procedure SetObservable(const Value: TObservable);
protected
{ Protected ソス骭セ }
procedure DoUpdate(Arg : TObject);
public
{ Public ソス骭セ }
published
{ Published ソス骭セ }
property Observable: TObservable read FObservable write SetObservable;
property OnUpdate:TUpdateEvent read FOnUpdate write FOnUpdate;
end;
procedure Register;
implementation
(** ソスRソスソスソス|ソス[ソスlソスソスソスgソスoソス^ソス闡アソスソス **)
procedure Register;
begin
RegisterComponents('Samples', [TObserver, TObservable]);
end;
{ TObservable }
procedure TObservable.AddObserver(Value: TObserver);
begin
if FObservers.IndexOf(Value) < 0 then
FObservers.Add(Value);
end;
procedure TObservable.Changed(State: Boolean = True);
begin
FChanged := State;
end;
constructor TObservable.Create(AOwner: TComponent);
begin
inherited;
FObservers := TComponentList.Create(False);
FChanged := False;
end;
destructor TObservable.Destroy;
begin
FObservers.Free;
inherited;
end;
function TObservable.GetObservers(Index: Integer): TObserver;
begin
Result := FObservers[Index] as TObserver;
end;
function TObservable.HasChanged: Boolean;
begin
Result := FChanged;
end;
procedure TObservable.Notify(Arg : TObject);
var i: Integer;
begin
if FChanged then begin
for i := 0 to FObservers.Count -1 do
(FObservers[i] as TObserver).DoUpdate(Arg);
FChanged := False;
end;
end;
procedure TObservable.RemoveObserver(Value: TObserver);
begin
FObservers.Extract(Value);
end;
{ TObserver }
procedure TObserver.DoUpdate(Arg : TObject);
begin
if Assigned(FOnUpdate) then
FOnUpdate(Self, Arg);
end;
procedure TObserver.SetObservable(const Value: TObservable);
begin
if Assigned(FObservable) then
FObservable.RemoveObserver(Self);
FObservable := Value;
if Assigned(FObservable) then begin
FObservable.AddObserver(Self);
FObservable.FreeNotification(Self);
end;
end;
end.
----ソスソスソスソスソスワゑソス
ClassAソスフソスソスソスソスoソスソスTObservableソスソスソスソスソスト、Form1,2ソスソスTObserverソスソスuソスソスソスワゑソス
Form1.ObserverソスソスTObservableソスソスClassAソスソスObservableソスソスoソス^ソスソスソスソス
UpdateソスCソスxソスソスソスgソスノ通知ソスソスソス黷スソスソスsソスソスソスソスソスソスソスソスソスソスソスソスワゑソス
ClassAソスソスソスマ更ソスソスソス黷スソスソス
Observable1.Changed;
Observable1.Notify(Self);
ソスニ擾ソスソスソスソスニ登ソス^ソスソスソスソストゑソスソスソスObserverソスノ変更ソスハ知ソスソスソスsソスソスソスワゑソス
ソスソスソスフコソスソスソス|ソス[ソスlソスソスソスgソスフ暦ソスソス_ソスソスFreeNotificationソスソスgソスソスソストゑソスフゑソスObserverソスフ撰ソスソスソスソスソスソスソスソスソスソスIソスノ管暦ソスソスソスソスソスワゑソスソスB
ソスネのゑソスForm1ソスフ破ソスソスソスソスソスソスObservableソスソスソスソスObserverソスソス除ソスソスソスソスKソスvソスソスソスソスソスソスワゑソスソスソス
> sakiyama ソスソスソスソス
ソスソスソスホらしソスソスソスI ソスワゑソスソスソスソスソスソスソスソスソスナゑソスソスヒ。ソスfソスUソスpソス^ソスフ典ソス^ソスソスナゑソスソスソスソスソスソスH
ソスネゑソスルど、ソスoソス^ソスソスソスソスソスソスノゑソスソスソスハのクソスソスソスXソスフイソスソスソスXソス^ソスソスソスXソスソスuソスソスソスホ、ソスノゑソスソスフゑソスソスソスフようソスノオソスuソスWソスFソスNソスgソスソス
ソスソスソスXソスgソスナ管暦ソスソスナゑソスソスワゑソスソスヒ。ソスたソスソスソスヘ趣ソスソスソスソスフ包ソスソスノ気ソスソスソスソスソスト托ソスヌ的ソスネ趣ソスソス_ソスソスソスソスソスソスソストゑソスソスソスソス謔、ソスナゑソスソスB
ソスラ具ソスソスノなゑソスワゑソスソスソスソスB
> ソスソスソスフコソスソスソス|ソス[ソスlソスソスソスgソスフ暦ソスソス_ソスソスFreeNotificationソスソスgソスソスソストゑソスフゑソスObserverソスフ撰ソスソスソスソスソスソスソスソスソスソスIソスノ管暦ソスソスソスソスソスワゑソスソスB
ソスソスソスソスネゑソスナゑソスソスソスソスヌ、FObservable.FreeNotification(Self); ソスソス Observer ソスソス Observable ソスノ開ソスソスソスハ知ソスソスソスソス
ソスフは包ソスソスソスソスソスソスナゑソスソスソスソスヌ、ソスフ心ソスソス TObservable ソスフほゑソスソスナ通知ソスソスけゑソス FObservers ソスフソスソスXソスgソスソスXソスVソスソスソスソス
ソスRソス[ソスhソスソスソスソスソスソスソスソスソスソスワゑソスソスソスBNotification ソスソスソス¥ソスbソスhソスソス override ソスソスソスソスKソスvソスソスソスソスソスソスフではなゑソスソスナゑソスソス蛯、ソスソスソスH
> ソスソスソスソスネゑソスナゑソスソスソスソスヌ、FObservable.FreeNotification(Self); ソスソス Observer ソスソス > Observable ソスノ開ソスソスソスハ知ソスソスソスソス
> ソスフは包ソスソスソスソスソスソスナゑソスソスソスソスヌ、ソスフ心ソスソス TObservable ソスフほゑソスソスナ通知ソスソスけゑソス FObservers ソスフソスソスXソスgソスソスXソスVソスソスソスソス
> ソスRソス[ソスhソスソスソスソスソスソスソスソスソスソスワゑソスソスソスBNotification ソスソスソス¥ソスbソスhソスソス override ソスソスソスソスKソスvソスソスソスソスソスソスフではなゑソスソスナゑソスソス蛯、ソスソスソスH
ソスソスソスフ辺ゑソスVCLソスCソスソスソスノなゑソスソストまゑソスソスソス
FObserversソスソスTComponentListソスナゑソスソスフで、ソスoソス^ソスソスソスソストゑソスソスソスRソスソスソス|ソス[ソスlソスソスソスgソスソスFreeNotificationソスソス゚まゑソスソスワゑソス
ソスソスソスソスソスワゑソスソスソスB
FreeNotificationソスvソスソスワゑソスソスソスナゑソスソスソスソスヒ。
ソスネ前ソスソスTComponentListソスgソスソスソストまゑソスソスソスナゑソスソスソスソスフでゑソスソスフ厄ソスソスcソスナゑソスソスソス
> FreeNotificationソスvソスソスワゑソスソスソスナゑソスソスソスソスヒ。
ソスネゑソスルど、ソスソスソスソスネら分ソスソスソスソスワゑソスソスソスソスBソスソスソス閧ェソスニゑソスソスソスソスソスソスソスソスワゑソスソスソスソスB
ソスソスソス゚ゑソスネゑソスソスソスソスBソスKソスソスソスネゑソスソスニゑソスソスソスソスソストゑソスソスワゑソスソスワゑソスソスソスソスB
jokソスソスソスソスフゑソスソスソスソスソスソスソスソスハゑソスNotificationソスソスソスKソスvソスナゑソスソスヒ。
ObservableソスソスObserverソスフ会ソスソスソスソスソスソスソスソスソスソスソスソスノなゑソスソストゑソスソスワゑソスソスソスソスB
procedure TObserver.Notification(AComponent: TComponent;
Operation: TOperation);
begin
inherited;
if (Operation = opRemove) and (AComponent = FObservable) then
SetObservable(nil);
end;
ソスソスソスソスソスソスソスソスObserverソスソスソスソスソスツまでゑソスソスソスソスObservableソスソスソスソスソスソスソス痰「ソスワゑソスソスヒ。
FreeNotificationソスソスKソスvソスナゑソスソスB
BorlandソスソスModel/ObserverソスノはゑソスソスソスソスニゑソスソスソスソスナゑソスソスソスソスAソスソスソス痰「ソスソスソスト擾ソスソスソスソスソスソス謔、ソスナゑソスソスB
ソスソスソスツゑソスObservable/ObserverソスフどゑソスソスソスソスソスソスヌゑソスソスソスソスソスソスソスソスソスソスソスネゑソスソスネゑソスワゑソスソスB
> ソスソスソスツゑソスObservable/ObserverソスフどゑソスソスソスソスソスソスヌゑソスソスソスソスソスソスソスソスソスソスソスネゑソスソスネゑソスワゑソスソスB
ソスソスソスソスAソスたソスソスソスソスQソスdソスノ奇ソスソス痰「ソスソスソストゑソスソスソスソスソスソスニに気ソスソスソスツゑソスソスワゑソスソスソスソスBソスソスソス閧ェソスニゑソスソスソスソスソスソスソスソスワゑソスソスB
sakiyamaソスソスソスソスAソスソスソスソスソスソスソスソスソス閧ェソスニゑソスソスソスソスソスソスソスソスワゑソスソスB
ソスネゑソスルどイソスxソスソスソスgソスソスソスソスソスソスニ受け趣ソスソスソスソスソスソス黷シソスソスNソスソスソスXソスソスソスソス
ソスソスソスソスソスTComponentListソスノゑソスソスヌ暦ソスソスニは目ゑソスソスソスリでゑソスソスB
ソス¥ソス[ソスXソスソスQソスlソスノゑソスソストゑソスソスソスソスソスソスソスソスソスソスソスソスソスソストみゑソスソスソスソスニ思ソスソスソスワゑソスソスB
ソスソスソス閧ェソスニゑソスソスソスソスソスソスソスソスワゑソスソスソスソスB
ソスヘゑソスソス゚まゑソスソスト、ソス|ソスソスソスニ申ソスソスソスワゑソスソスB
takeソスlソスソスsakiyamaソスlソスフゑソスソスソス閧ゥソス轤「ソスいソスソスラ具ソスソスノなゑソスワゑソスソスソスソスソスソスA
ソスラ具ソスソスsソスソスソスナなんか暦ソスソスソスソスソス轤「ソスナゑソスソスB
takeソスlソスソスソス轤ソスソスFormAソスソスFormBソスフソソス[ソスXソスソスソスソスソスソストゑソスソスソスソスナゑソスソスソスソスH
>ソス¥ソス[ソスXソスソスQソスlソスノゑソスソストゑソスソスソスソスソスソスソスソスソスソスソスソスソスソストみゑソスソスソスソスニ思ソスソスソスワゑソスソスB
ソスuObserversソスvソスニゑソスソスソスソスPソス黷ェソスソスソスソスソスソスニ難しソスソスソスソスソスソスソスフでイソスxソスソスソスgソスソスソスソスソスソスソスソスSend
ソスけ趣ソス闡、ソスソスReceiveソスニゑソスソスソスソスソスソスAChangeソスヨ係ソスフフソスソスソスOソスソスgソスpソスソスソスネゑソスソス謔、ソスノゑソスソスワゑソスソスソスソスB
ソスソスソスヘほとゑソスソスsakiyamaソスlソスフソソス[ソスXソスソスソスフままでゑソスソスソスソスEソスEソスE
ソスソスソスネみに趣ソスソスロに本ソスヤでゑソスgソスpソスソスソストゑソスソスワゑソスソスソスソスソスソスノ厄ソスソスネゑソスソスソスソスソスソストゑソスソスワゑソスソスB
ソスソスソスソスソスハ知ソスソスCソスxソスソスソスgソスソスソスソスソス^ソスけ趣ソス閭ソスjソスbソスg MultiEvent.pasソスソス
ソスTソスソスソスvソスソスソスtソスHソス[ソスソス Unit1.pasソスソスレゑソスソストゑソスソスソスソスワゑソスソスB
TForm1.OnUpdate1ソスソスTForm1.OnUpdate2ソスフ抵ソスソスノ擾ソスソスソスソスソスuソスソスソスCソスNソス|ソスCソスソスソスgソスソスtソスソスソスソス
ソスソスソスソスソスソスソスソスソスソスソスソスソスソスソスB
unit MultiEvent;
interface
uses
SysUtils, Classes, Contnrs;
type
TMultiEventUpdateEvent = procedure(Sender, Arg: TObject) of object;
TMultiEventReceive = class;
TMultiEventSend = class(TComponent)
private
FObservers: TComponentList;
function GetObservers(Index: Integer): TMultiEventReceive;
protected
property Observers[Index: Integer]: TMultiEventReceive read GetObservers;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Add(Value: TMultiEventReceive);
procedure Delete(Value: TMultiEventReceive);
procedure Notify(Arg : TObject);
end;
TMultiEventReceive = class(TComponent)
private
{ Private ソス骭セ }
FObservable: TMultiEventSend;
FOnUpdate: TMultiEventUpdateEvent;
procedure SetObservable(const Value: TMultiEventSend);
protected
{ Protected ソス骭セ }
procedure DoUpdate(Arg : TObject);
public
{ Public ソス骭セ }
property Observable: TMultiEventSend read FObservable write SetObservable;
published
{ Published ソス骭セ }
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
property OnUpdate:TMultiEventUpdateEvent read FOnUpdate write FOnUpdate;
end;
implementation
{ TMultiEventSend }
procedure TMultiEventSend.Add(Value: TMultiEventReceive);
begin
if FObservers.IndexOf(Value) < 0 then
FObservers.Add(Value);
end;
constructor TMultiEventSend.Create(AOwner: TComponent);
begin
inherited;
FObservers := TComponentList.Create(False);
end;
destructor TMultiEventSend.Destroy;
begin
FObservers.Free;
inherited;
end;
function TMultiEventSend.GetObservers(Index: Integer): TMultiEventReceive;
begin
Result := FObservers[Index] as TMultiEventReceive;
end;
procedure TMultiEventSend.Notify(Arg : TObject);
var i: Integer;
begin
for i := 0 to FObservers.Count -1 do begin
(FObservers[i] as TMultiEventReceive).DoUpdate(Arg);
end;
end;
procedure TMultiEventSend.Delete(Value: TMultiEventReceive);
begin
FObservers.Extract(Value);
end;
{ TMultiEventReceive }
procedure TMultiEventReceive.DoUpdate(Arg : TObject);
begin
if Assigned(FOnUpdate) then
FOnUpdate(Self, Arg);
end;
procedure TMultiEventReceive.Notification(AComponent: TComponent;
Operation: TOperation);
begin
inherited;
if (Operation = opRemove) and (AComponent = FObservable) then
SetObservable(nil);
end;
procedure TMultiEventReceive.SetObservable(const Value: TMultiEventSend);
begin
if Assigned(FObservable) then begin
FObservable.Delete(Self);
end;
FObservable := Value;
if Assigned(FObservable) then begin
FObservable.Add(Self);
FObservable.FreeNotification(Self);
end;
end;
end.
------------------------------------------------------------------------------------
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
MultiEvent, StdCtrls;
type
TTestData = class(TPersistent)
private
{ Private ソス骭セ }
FEvents: TMultiEventSend;
FValue: Integer;
procedure SetValue(const Value: Integer);
public
{ Public ソス骭セ }
constructor Create;
destructor Destroy; override;
property Events : TMultiEventSend read FEvents write FEvents;
property Value : Integer read FValue write SetValue;
end;
type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private ソス骭セ }
FTest : TTestData;
FEvents1: TMultiEventReceive;
FEvents2: TMultiEventReceive;
procedure OnUpdate1(Sender, Arg: TObject);
procedure OnUpdate2(Sender, Arg: TObject);
public
{ Public ソス骭セ }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
{ TTestData }
constructor TTestData.Create;
begin
FEvents := TMultiEventSend.Create(nil);
end;
destructor TTestData.Destroy;
begin
FEvents.Free;
inherited;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FTest := TTestData.Create;
FEvents1 := TMultiEventReceive.Create(Self);
FEvents1.OnUpdate := OnUpdate1;
FEvents2 := TMultiEventReceive.Create(Self);
FEvents2.OnUpdate := OnUpdate2;
FTest.Events.Add(FEvents1);
FTest.Events.Add(FEvents2);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
FTest.Events.Delete(FEvents2);
FTest.Events.Delete(FEvents1);
FEvents2.Free;
FEvents1.Free;
FTest.Free;
end;
procedure TForm1.OnUpdate1(Sender, Arg: TObject);
var
s : string;
begin
s := '';
end;
procedure TForm1.OnUpdate2(Sender, Arg: TObject);
var
s : string;
begin
s := '';
end;
procedure TTestData.SetValue(const Value: Integer);
begin
FValue := Value;
FEvents.Notify(Self);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
FTest.Value := 0;
end;
end.