掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
カスタムコントロール:独自イベントを作成するには? (ID:21590)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
>イベントを定義するにはどうしたものでしょうか まず、メッセージは関係なく、カスタムコントロールも関係ありません。 これは、ただの言語機構で、関数呼び出しに過ぎないと思っていただければ 理解しやすいのではないかと思います。 Delphiは、クラス宣言で TClassA = class private FValueA: string; FB: string; function GetA: string; //注目 procedure SetA( Value: string); //注目 public property A: string read GetA write SetA; //注目 property B: string read FB write FB; end; のようにすると var ClassA: TClassA; begin ClassA:= TClassA.Create; ClassA.A:='TEST'; // ...(1) Writeln( ClassA.A) // ...(2) ClassA.B:='TEST'; // ...(3) Writeln( ClassA.B);// ...(4) ClassA.Free; end; (1)で SetA が呼び出され (2)で GetA が呼び出される という機能があります。 また、read,writeで指定されたものが変数なら その変数に代入したり参照したりできるようになります。 (3)で FBに代入 (4)で FBを参照 なので 「手続き SetA」で、「手続き Test」を 呼び出すようにプログラムを書いておけば ClassA.Aに値を設定した時「手続き Test」も呼び出されます。 TClassA = class private FValueA: string; function GetA: string; function SetA( Value: string); procedure Test( Sender: TObject); //追加 public property A: string read GetA write SetA; end; function TClassA.SetA( Value: string); //※1 begin if FValueA<>Value then begin FValueA:=ValueA; Test(Self); end; end; このままでは、容易にはクラスの外から Test()の内部で 実行させるコードを変更することができないので、 Test を外部クラスから任意のコードが実行できるように Testを 空のオブジェクトにします。 それが、イベントと呼ばれていますが、実は、ただの関数の抜け殻です。 TClassA = class private FValueA: string; FOnTest: TNotifyEvent; //追加 function GetA: string; function SetA( Value: string); // procedure Test( Sender: TObject); //削除 public property A: string read GetA write SetA; property Test: TNotifyEvent read FOnTest write FOnTest; //追加 end; また、TNotifyEventの宣言は TNotifyEvent = procedure( Sender:TObject) of object となっています。 ので、これと引数があっていれば Testの実体として与えることができるようになります。 procedure Form1.FormCreate(Sender: TObject); begin ClassA:= TClassA.Create; ClassA.Test:= ClassATest; //注目 end; procedure Form1.Button1Click(Sender:TObject); begin ClassA.A:='プロパティの値を変更します'; end; procedure Form1.ClassATest( Sender: TObject); //注目 begin MessageDlg('Testが実行されました',mtInformation,[mbOK],0); end; TNotifyEventなどと名前がついておりますが。 TProcedureObject = procedure of object; に (Sender: TObject)という引数が加わっただけのオブジェクトのメソッドの型 に過ぎません。 最後に保護のために ※1 を以下のようにします。 function TClassA.SetA( Value: string); begin if FValueA<>Value then begin FValueA:=ValueA; if Assigned( FOnTest) then FOnTest(Self); //これ end; end; これで FOnTest=nil の時は実行しないようにできます。 蛇足ですが、一般的に TClassA = class public Test: TNotifyEvent; end; とは、書かないほうが良いようです。 TClassA = class private FOnTest: TNotifyEvent; public property Test: TNotifyEvent read FOnTest write FOnTest; //追加 end; スレッドとか、マルチタスクOSのメッセージプロシージャとか そういう事との絡みだと思いますが・・・ なぜなのかは、その道のプロに聞いたほうが良いでしょう。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.