承接前文,TDBCalendar 已完成唯讀屬性與更新旗標機制。本節實作資料感知核心:
type
TDBCalendar = class(TCalendar)
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
private
FDataLink: TFieldDataLink;
end;
constructor TDBCalendar.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FReadOnly := True;
FDataLink := TFieldDataLink.Create; // 建立單欄位資料連結
end;
destructor TDBCalendar.Destroy;
begin
FDataLink.Free;
inherited Destroy;
end;
TFieldDataLink 專為單欄位綁定設計;亦有 TDataLink 支援整張表綁定。
type
TDBCalendar = class(TCalendar)
private
procedure DataChange(Sender: TObject);
end;
constructor TDBCalendar.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FReadOnly := True;
FDataLink := TFieldDataLink.Create;
FDataLink.OnDataChange := DataChange; // 綁定事件
end;
destructor TDBCalendar.Destroy;
begin
FDataLink.OnDataChange := nil; // 解除綁定防殘留呼叫
FDataLink.Free;
inherited Destroy;
end;
procedure TDBCalendar.DataChange(Sender: TObject);
begin
if FDataLink.Field = nil then
CalendarDate := 0 // 無欄位綁定 → 清空顯示
else
CalendarDate := FDataLink.Field.AsDateTime; // 同步欄位日期值
end;
資料來源指示變更 (換行、編輯後 Post、Refresh) → DataLink 觸發 OnDataChange → 元件同步顯示。AsDateTime 自動處理型別轉換。