<strong>
unit</strong> uDBCalendarView;
<strong>interface</strong>
<strong>uses</strong>
System.Classes, Vcl.WinXCalendars, Data.DB, VCL.DBCtrls;
<strong>type</strong>
TDBCalendarView = <strong>class</strong>(TCalendarView)
<strong>private</strong>
FDataLink: TFieldDataLink;
<strong>procedure</strong> DataChange(Sender: TObject);
<strong>procedure</strong> SetDataField(const Value: string);
<strong>procedure</strong> SetDataSource(const Value: TDataSource);
<strong>function</strong> GetDataField: string;
<strong>function</strong> GetDataSource: TDataSource;
<strong>function</strong> GetField: TField;
<strong>function</strong> GetFieldDate: TDate;
<strong>protected</strong>
<strong>procedure</strong> Loaded; <strong>override</strong>;
<strong>procedure</strong> Notification(AComponent: TComponent;
Operation: TOperation); <strong>override</strong>;
<strong>public</strong>
<strong>constructor</strong> Create(AOwner: TComponent);
<strong>destructor</strong> Destroy; <strong>override</strong>;
<strong>property</strong> Field: TField <strong>read</strong> GetField;
<strong>published</strong>
<strong>property</strong> DataField: <strong>string</strong> <strong>read</strong> GetDataField <strong>write</strong> SetDataField;
<strong>property</strong> DataSource: TDataSource <strong>read</strong> GetDataSource <strong>write</strong> SetDataSource;
<strong>end</strong>;
<strong>implementation</strong>
<strong>uses</strong>
System.SysUtils;
<em>{ TDBCalendarView }</em>
<strong>constructor</strong> TDBCalendarView.Create(AOwner: TComponent);
<strong>begin</strong>
<strong>inherited</strong> Create(AOwner);
Enabled := False; <em>// read-only</em>
FDataLink := TFieldDataLink.Create;
FDataLink.Control := Self;
FDataLink.OnDataChange := DataChange;
<strong>end</strong>;
<strong>destructor</strong> TDBCalendarView.Destroy;
<strong>begin</strong>
FDataLink.Free;
<strong>inherited</strong>;
<strong>end</strong>;
<strong>procedure</strong> TDBCalendarView.Loaded;
<strong>begin</strong>
<strong>inherited</strong> Loaded;
<strong>if</strong> (csDesigning <strong>in</strong> ComponentState) <strong>then</strong> DataChange(Self);
<strong>end</strong>;
<strong>procedure</strong> TDBCalendarView.Notification(AComponent: TComponent;
Operation: TOperation);
<strong>begin</strong>
<strong>inherited</strong> Notification(AComponent, Operation);
<strong>if</strong> (Operation = opRemove) <strong>and</strong> (FDataLink <> <strong>nil</strong>) <strong>and</strong>
(AComponent = DataSource) <strong>then</strong> DataSource := <strong>nil</strong>;
<strong>end</strong>;
<strong>procedure</strong> TDBCalendarView.DataChange(Sender: TObject);
<strong>begin</strong>
self.Date := GetFieldDate;
<strong>end</strong>;
<strong>function</strong> TDBCalendarView.GetField: TField;
<strong>begin</strong>
Result := FDataLink.Field;
<strong>end</strong>;
<strong>function</strong> TDBCalendarView.GetDataField: <strong>string</strong>;
<strong>begin</strong>
Result := FDataLink.FieldName;
<strong>end</strong>;
<strong>procedure</strong> TDBCalendarView.SetDataField(<strong>const</strong> Value: <strong>string</strong>);
<strong>begin</strong>
FDataLink.FieldName := Value;
<strong>end</strong>;
<strong>function</strong> TDBCalendarView.GetDataSource: TDataSource;
<strong>begin</strong>
Result := FDataLink.DataSource;
<strong>end</strong>;
<strong>procedure</strong> TDBCalendarView.SetDataSource(<strong>const</strong> Value: TDataSource);
<strong>begin</strong>
<strong>if</strong> <strong>not</strong> (FDataLink.DataSourceFixed <strong>and</strong> (csLoading <strong>in</strong> ComponentState)) <strong>then</strong>
FDataLink.DataSource := Value;
<strong>if</strong> Value <> <strong>nil</strong> <strong>then</strong> Value.FreeNotification(Self);
<strong>end</strong>;
<strong>function</strong> TDBCalendarView.GetFieldDate: TDate;
<strong>begin</strong>
<strong>if</strong> FDataLink.Field <> <strong>nil</strong> <strong>then</strong>
<strong>begin</strong>
<strong>if</strong> (FDataLink.Field.DataType <strong>in</strong> [ftDate, ftDateTime, ftTimeStamp, ftTime]) <strong>then</strong>
Result := FDataLink.Field.AsDateTime
<strong>else</strong>
Result := Now;
<strong>end</strong>
<strong>else</strong>
<strong>if</strong> csDesigning <strong>in</strong> ComponentState <strong>then</strong> Result := Now;
<strong>end</strong>;
<strong>end</strong>.