掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
カスタムコントロール:独自イベントを作成するには? (ID:21601)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
たぶんクラス型プロパティの使い方以前に、クラスのインスタンスとInteger型のような 普通の変数の使い方とごっちゃになっている部分があるんじゃないかと思います。 コメントに対するつっこみは大歓迎なので、上級者の方でもおかしいと思ったら、ゼヒつっこみいれてください。 ---[実装部]--- {TMyPersistent} //他のクラスからプロパティをコピるとき用 procedure TMyPersistent.Assign(aSource:TPersistent); begin inherited Assign(aSource); if aSource is TMyPersistent then begin //aSource が TMyPersistent クラスか、その継承クラスであれば //TMyPersistentで新たに定義したプロパティのみ更新する。 //TMyPersistentからさらに継承したクラスは、そのクラスで定義 //されたプロパティのみ更新するようにしておけばいい。 //そのための 「inherited Assign(aSource);」 MyTag := TMyPersistent(aSource).MyTag; end; end; procedure TMyPersistent.SetMyTag(const Value: Integer); begin //通常は、値に変化があったときのみ更新する。 //不要なイベントが発生させないためでもある。 if FMyTag <> Value then begin FMyTag := Value; if Assigned(FOnChanging) then FOnChanging(Self); end; end; {TMyCustomControl} constructor TMyCustomControl.Create(aOwner: TComponent); begin //きっちり inherited 入れておく inherited Create(AOwner); //クラス型プロパティのインスタンスは、自分で生成しておかないと //いけません。 FMyPersistent := TMyPersistent.Create; //TMyPersistent のプロパティ変更イベントは、このクラスで受け取ります。 //このクラスを使用するフォーム?とかでイベントを設定しません。 //TMyPersistentは、TMyCustomControlの影に隠れる方が望ましいでしょう。 FMyPersistent.OnChanging := MyPersistentChange; end; destructor TMyCustomControl.Destroy; begin //当然、破棄も自分で面倒をみます FMyPersistent.Free; //忘れずに... inherited Destory; end; procedure TMyCustomControl.SetMyPersistent(const aValue:TMyPersistent); begin //FMyPersistent := aValue; //↑これでは、自分で用意したインスタンスが失われていまいます。 //クラス型プロパティは、基本的にプロパティ値の複写のみ行い、 //変数そのものを置き換えることはしません。 //それは一般的に Assign メソッドで行われます。 FMyPersistent.Assign(aValue); //FMyPersistent := aValue; とした時点で、FMyPersistent <> nil だった場合、 //それまでの MyPersistent はどこにいくのでしょう? //誰からも参照されず、いわゆるメモリーリークです。 //状況により、FMyPersistent := aValue; とする記述もありですが、 //クラスのインスタンスは、所有者をはっきりさせておくべきです。 end; procedure TMyCustomControl.MyPersistentChange(aObject: TObject); begin //inherited ; //↑上位クラスに同名メソッドがある場合にしか使用できません //ここで発生するイベントは、TMyCustomControlを貼り付けたフォーム等で //設計時に記述可能です。 if Assigned(FOnMyPersistentChange) then FOnMyPersistentChange(Aelf); Repaint; end;
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.