OnChange イベントの提供
日付(日)の変更 への移動
カレンダーのユーザーがカレンダー内の日付を変更できるようになったので、次に、アプリケーションがその変更に対応できるようにします。
TSampleCalendar への OnChange イベントの追加
- イベント、イベントを格納するフィールド、イベントを呼び出す動的メソッドを宣言します。
type TSampleCalendar = class(TCustomGrid) private FOnChange: TNotifyEvent; protected procedure Change; dynamic; . . . published property OnChange: TNotifyEvent read FOnChange write FOnChange; . . .
class PACKAGE TSampleCalendar : public TCustomGrid { private: TNotifyEvent FOnChange; . . . protected: virtual void __fastcall Change(); __published: __property TNotifyEvent OnChange = {read=FOnChange, write=FOnChange}; . . . }
Change メソッドを記述します。
procedure TSampleCalendar.Change; begin if Assigned(FOnChange) then FOnChange(Self); end;
void __fastcall TSampleCalendar::Change() { if(FOnChange != NULL) FOnChange(this); }
SetCalendarDate メソッドと SetDateElement メソッドの末尾に、Change を呼び出すステートメントを追加します。
procedure TSampleCalendar.SetCalendarDate(Value: TDateTime); begin FDate := Value; UpdateCalendar; Change; { this is the only new statement } end; procedure TSampleCalendar.SetDateElement(Index: Integer; Value: Integer); begin . { many statements setting element values } . . FDate := EncodeDate(AYear, AMonth, ADay); UpdateCalendar; Change; { this is new } end; end;
void __fastcall TSampleCalendar::SetCalendarDate(TDateTime Value) { FDate = Value; UpdateCalendar(); Change(); // this is the only new statement } void __fastcall TSampleCalendar::SetDateElement(int Index, int Value) { . . . // many statements setting element values FDate = TDateTime(AYear, AMonth, ADay); UpdateCalendar(); Change(); // this is new }
これで、カレンダー コンポーネントを使用するアプリケーションは、OnChange イベントのハンドラを割り当てることで、コンポーネントの日付の変化に応答できるようになりました。