adbdate.pas

来自「delphi编程控件」· PAS 代码 · 共 543 行

PAS
543
字号
unit adbdate;
(*
 COPYRIGHT (c) RSD Software 1997 - 98
 All Rights Reserved.
*)

interface
{$I aclver.inc}
uses Classes, SysUtils, ADateCtl, DB, DBTables {$IFDEF DELPHI3_0}, dbctrls{$ENDIF};

type
TAutoDBDateControl = class(TCustomAutoDateControl)
private
  FDateLink : TFieldDataLink;
  FBeginDateLink : TFieldDataLink;
  FEndDateLink : TFieldDataLink;
  FUpdateFlag : Boolean;

  procedure DateChange(Sender: TObject);
  procedure UpdateDate(Sender: TObject);
  procedure BeginDateChange(Sender: TObject);
  procedure UpdateBeginDate(Sender: TObject);
  procedure EndDateChange(Sender: TObject);
  procedure UpdateEndDate(Sender: TObject);
  function GetDateFieldName: String;
  function GetBeginDateFieldName: String;
  function GetEndDateFieldName: String;
  function GetDataSource: TDataSource;
  function GetDateField: TField;
  function GetBeginDateField: TField;
  function GetEndDateField: TField;
  procedure SetDateField(const Value: String);
  procedure SetBeginDateField(const Value: String);
  procedure SetEndDateField(const Value: String);
  procedure SetDataSource(Value: TDataSource);
protected
  procedure Notification(AComponent: TComponent;
    Operation: TOperation); override;
  procedure DoDateChange; override;
  procedure DoBeginDateChange; override;
  procedure DoEndDateChange; override;
public
  constructor Create(AOwner: TComponent); override;
  destructor Destroy; override;

  property DateField: TField read GetDateField;
  property BeginDateField: TField read GetBeginDateField;
  property EndDateField: TField read GetEndDateField;
published
  property DateDataField: string read GetDateFieldName write SetDateField;
  property BeginDateDataField: string read GetBeginDateFieldName write SetBeginDateField;
  property EndDateDataField: string read GetEndDateFieldName write SetEndDateField;    
  property DataSource: TDataSource read GetDataSource write SetDataSource;
  { Property SelectPeriod must be first. }
  property SelectPeriod;
  property Align;
  property DragCursor;
  property DragMode;
  property Enabled;
  property Font;
{$IFDEF DELPHI3_0}
  property ImeMode;
  property ImeName;
{$ENDIF}
  property ParentFont;
  property ParentShowHint;
  property PopupMenu;
  property ShowHint;
  property StartOfWeek;
  property TabOrder;
  property TabStop;
  property Visible;
  property OnDateChange;
  property OnBeginDateChange;
  property OnEndDateChange;
  property OnClick;
  property OnDblClick;
  property OnDragDrop;
  property OnDragOver;
  property OnEndDrag;
  property OnEnter;
  property OnExit;
  property OnKeyDown;
  property OnKeyPress;
  property OnKeyUp;
  property OnMouseDown;
  property OnMouseMove;
  property OnMouseUp;
  property OnStartDrag;
end;

TAutoDBDateEdit = class(TCustomAutoDateEdit)
private
  FDateLink : TFieldDataLink;
  FBeginDateLink : TFieldDataLink;
  FEndDateLink : TFieldDataLink;
  FUpdateFlag : Boolean;

  procedure DateChange(Sender: TObject);
  procedure UpdateDate(Sender: TObject);
  procedure BeginDateChange(Sender: TObject);
  procedure UpdateBeginDate(Sender: TObject);
  procedure EndDateChange(Sender: TObject);
  procedure UpdateEndDate(Sender: TObject);
  function GetDateFieldName: String;
  function GetBeginDateFieldName: String;
  function GetEndDateFieldName: String;
  function GetDataSource: TDataSource;
  function GetDateField: TField;
  function GetBeginDateField: TField;
  function GetEndDateField: TField;
  procedure SetDateField(const Value: String);
  procedure SetBeginDateField(const Value: String);
  procedure SetEndDateField(const Value: String);
  procedure SetDataSource(Value: TDataSource);
protected
  procedure Notification(AComponent: TComponent;
    Operation: TOperation); override;
  procedure DoDateChange; override;
  procedure DoBeginDateChange; override;
  procedure DoEndDateChange; override;
  procedure Change; override;
public
  constructor Create(AOwner: TComponent); override;
  destructor Destroy; override;

  property DateField: TField read GetDateField;
  property BeginDateField: TField read GetBeginDateField;
  property EndDateField: TField read GetEndDateField;
published
  property DateDataField: string read GetDateFieldName write SetDateField;
  property BeginDateDataField: string read GetBeginDateFieldName write SetBeginDateField;
  property EndDateDataField: string read GetEndDateFieldName write SetEndDateField;
  property DataSource: TDataSource read GetDataSource write SetDataSource;
  { Property SelectPeriod must be first. }
  property SelectPeriod;
  property AutoSelect;
  property AutoSize;
  property BorderStyle;
  property Color;
  property Ctl3D;
  property DragCursor;
  property DragMode;
  property Enabled;
  property Font;
  {$IFDEF DELPHI3_0}
   property ImeMode;
   property ImeName;
 {$ENDIF}
  property ParentColor;
  property ParentCtl3D;
  property ParentFont;
  property ParentShowHint;
  property PopupMenu;
  property ReadOnly;
  property ShowHint;
  property TabOrder;
  property TabStop;
  property Visible;
  property OnDateChange;
  property OnBeginDateChange;
  property OnEndDateChange;
  property OnChange;
  property OnClick;
  property OnDblClick;
  property OnDragDrop;
  property OnDragOver;
  property OnEndDrag;
  property OnEnter;
  property OnExit;
  property OnKeyDown;
  property OnKeyPress;
  property OnKeyUp;
  property OnMouseDown;
  property OnMouseMove;
  property OnMouseUp;
  property OnStartDrag;
end;

implementation
{TAutoDBDateControl}
constructor TAutoDBDateControl.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FDateLink := TFieldDataLink.Create;
  FDateLink.Control := self;
  FDateLink.OnDataChange := DateChange;
  FDateLink.OnUpdateData := UpdateDate;
  FBeginDateLink := TFieldDataLink.Create;
  FBeginDateLink.Control := self;
  FBeginDateLink.OnDataChange := BeginDateChange;
  FBeginDateLink.OnUpdateData := UpdateBeginDate;
  FEndDateLink := TFieldDataLink.Create;
  FEndDateLink.Control := self;
  FEndDateLink.OnDataChange := EndDateChange;
  FEndDateLink.OnUpdateData := UpdateEndDate;
  FUpdateFlag := False;
end;

destructor TAutoDBDateControl.Destroy;
begin
  FDateLink.Free;
  FBeginDateLink.Free;
  FEndDateLink.Free;
  inherited Destroy;
end;

procedure TAutoDBDateControl.Notification(AComponent: TComponent;  Operation: TOperation);
begin
  inherited Notification(AComponent, Operation);
  if (Operation = opRemove) and (FDateLink <> Nil) and
    (AComponent = DataSource) then DataSource := nil;
end;

procedure TAutoDBDateControl.DoDateChange;
begin
  if(FDateLink <> Nil) And (FDateLink.Field <> Nil) then
    UpdateDate(self);
  inherited DoDateChange;
end;

procedure TAutoDBDateControl.DoBeginDateChange;
begin
  if(FBeginDateLink <> Nil) And (FBeginDateLink.Field <> Nil) then
    UpdateBeginDate(self);
  inherited DoBeginDateChange;
end;

procedure TAutoDBDateControl.DoEndDateChange;
begin
  if(FEndDateLink <> Nil) And (FEndDateLink.Field <> Nil) then
    UpdateEndDate(self);
  inherited DoEndDateChange;
end;

procedure TAutoDBDateControl.DateChange(Sender: TObject);
begin
  if (FDateLink.Field <> Nil) And Not FUpdateFlag then begin
    FUpdateFlag := True;
    if(FDateLink.Field.IsNull) then begin
      Date := SysUtils.Date;
      FDateLink.Field.AsDateTime := Date;
    end else Date := FDateLink.Field.AsDateTime;
    FUpdateFlag := False;
  end;
end;

procedure TAutoDBDateControl.UpdateDate(Sender: TObject);
begin
  if Not FUpdateFlag then begin
    FUpdateFlag := True;
    FDateLink.Edit;
    if FDateLink.Editing then
      FDateLink.Field.AsDateTime := Date;
    FUpdateFlag := False;
  end;
end;

procedure TAutoDBDateControl.BeginDateChange(Sender: TObject);
begin
  if(FBeginDateLink.Field <> Nil) And Not FUpdateFlag then begin
    FUpdateFlag := True;
    BeginDate := FBeginDateLink.Field.AsDateTime;
    FUpdateFlag := False;
  end;
end;

procedure TAutoDBDateControl.UpdateBeginDate(Sender: TObject);
begin
  if Not FUpdateFlag then begin
    FUpdateFlag := True;
    FBeginDateLink.Edit;
    if FBeginDateLink.Editing then
      FBeginDateLink.Field.AsDateTime := BeginDate;
    FUpdateFlag := False;
  end;
end;

procedure TAutoDBDateControl.EndDateChange(Sender: TObject);
begin
  if (FEndDateLink.Field <> Nil) And Not FUpdateFlag then begin
    FUpdateFlag := True;
    EndDate := FEndDateLink.Field.AsDateTime;
    FUpdateFlag := False;
  end;
end;

procedure TAutoDBDateControl.UpdateEndDate(Sender: TObject);
begin
  if Not FUpdateFlag then begin
    FUpdateFlag := True;
    FEndDateLink.Edit;
    if FEndDateLink.Editing then
      FEndDateLink.Field.AsDateTime := Date;
    FUpdateFlag := False;
  end;
end;

function TAutoDBDateControl.GetDateFieldName: String;
begin
  Result := FDateLink.FieldName;
end;

function TAutoDBDateControl.GetBeginDateFieldName: String;
begin
  Result := FBeginDateLink.FieldName;
end;

function TAutoDBDateControl.GetEndDateFieldName: String;
begin
  Result := FEndDateLink.FieldName;
end;

function TAutoDBDateControl.GetDataSource: TDataSource;
begin
  Result := FDateLink.DataSource;
end;

function TAutoDBDateControl.GetDateField: TField;
begin
  Result := FDateLink.Field;
end;

function TAutoDBDateControl.GetBeginDateField: TField;
begin
  Result := FBeginDateLink.Field;
end;

function TAutoDBDateControl.GetEndDateField: TField;
begin
  Result := FEndDateLink.Field;
end;

procedure TAutoDBDateControl.SetDateField(const Value: String);
begin
  FDateLink.FieldName := Value;
end;

procedure TAutoDBDateControl.SetBeginDateField(const Value: String);
begin
  FBeginDateLink.FieldName := Value;
end;

procedure TAutoDBDateControl.SetEndDateField(const Value: String);
begin
  FEndDateLink.FieldName := Value;
end;

procedure TAutoDBDateControl.SetDataSource(Value: TDataSource);
begin
  FDateLink.DataSource := Value;
  FBeginDateLink.DataSource := Value;
  FEndDateLink.DataSource := Value;    
  if Value <> Nil then
    Value.FreeNotification(Self);
end;

{TAutoDBDateEdit}
constructor TAutoDBDateEdit.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FDateLink := TFieldDataLink.Create;
  FDateLink.Control := self;
  FDateLink.OnDataChange := DateChange;
  FDateLink.OnUpdateData := UpdateDate;
  FBeginDateLink := TFieldDataLink.Create;
  FBeginDateLink.Control := self;
  FBeginDateLink.OnDataChange := BeginDateChange;
  FBeginDateLink.OnUpdateData := UpdateBeginDate;
  FEndDateLink := TFieldDataLink.Create;
  FEndDateLink.Control := self;
  FEndDateLink.OnDataChange := EndDateChange;
  FEndDateLink.OnUpdateData := UpdateEndDate;
  FUpdateFlag := False;
end;

destructor TAutoDBDateEdit.Destroy;
begin
  FDateLink.Free;
  FBeginDateLink.Free;
  FEndDateLink.Free;
  inherited Destroy;
end;

procedure TAutoDBDateEdit.Notification(AComponent: TComponent;  Operation: TOperation);
begin
  inherited Notification(AComponent, Operation);
  if (Operation = opRemove) and (FDateLink <> Nil) and
    (AComponent = DataSource) then DataSource := nil;
end;

procedure TAutoDBDateEdit.DoDateChange;
begin
  if(FDateLink <> Nil) And (FDateLink.Field <> Nil) then
    UpdateDate(self);
  inherited DoDateChange;
end;

procedure TAutoDBDateEdit.DoBeginDateChange;
begin
  if(FBeginDateLink <> Nil) And (FBeginDateLink.Field <> Nil) then
    UpdateBeginDate(self);
  inherited DoBeginDateChange;
end;

procedure TAutoDBDateEdit.DoEndDateChange;
begin
  if(FEndDateLink <> Nil) And (FEndDateLink.Field <> Nil) then
    UpdateEndDate(self);
  inherited DoEndDateChange;
end;

procedure TAutoDBDateEdit.Change;
begin
  DoDateChange;
  DoBeginDateChange;
  DoEndDateChange;
end;

procedure TAutoDBDateEdit.DateChange(Sender: TObject);
begin
  if (FDateLink.Field <> Nil) and Not FUpdateFlag then begin
    FUpdateFlag := True;
    if FDateLink.Editing and FDateLink.Field.IsNull then begin 
      Date := SysUtils.Date;
      FDateLink.Field.AsDateTime := Date;
    end else Date := FDateLink.Field.AsDateTime;
    FUpdateFlag := False;
  end;
end;

procedure TAutoDBDateEdit.UpdateDate(Sender: TObject);
begin
  if Not FUpdateFlag then begin
    FUpdateFlag := True;
    FDateLink.Edit;
    if FDateLink.Editing then
      FDateLink.Field.AsDateTime := Date;
    FUpdateFlag := False;
  end;
end;

procedure TAutoDBDateEdit.BeginDateChange(Sender: TObject);
begin
  if(FBeginDateLink.Field <> Nil) And Not FUpdateFlag then begin
    FUpdateFlag := True;
    BeginDate := FBeginDateLink.Field.AsDateTime;
    FUpdateFlag := False;
  end;
end;

procedure TAutoDBDateEdit.UpdateBeginDate(Sender: TObject);
begin
  if Not FUpdateFlag then begin
    FUpdateFlag := True;
    FBeginDateLink.Edit;
    if FBeginDateLink.Editing then
      FBeginDateLink.Field.AsDateTime := BeginDate;
    FUpdateFlag := False;
  end;
end;

procedure TAutoDBDateEdit.EndDateChange(Sender: TObject);
begin
  if (FEndDateLink.Field <> Nil) And Not FUpdateFlag then begin
    FUpdateFlag := True;
    EndDate := FEndDateLink.Field.AsDateTime;
    FUpdateFlag := False;
  end;
end;

procedure TAutoDBDateEdit.UpdateEndDate(Sender: TObject);
begin
  if Not FUpdateFlag then begin
    FUpdateFlag := True;
    FEndDateLink.Edit;
    if FEndDateLink.Editing then
      FEndDateLink.Field.AsDateTime := Date;
    FUpdateFlag := False;
  end;
end;

function TAutoDBDateEdit.GetDateFieldName: String;
begin
  Result := FDateLink.FieldName;
end;

function TAutoDBDateEdit.GetBeginDateFieldName: String;
begin
  Result := FBeginDateLink.FieldName;
end;

function TAutoDBDateEdit.GetEndDateFieldName: String;
begin
  Result := FEndDateLink.FieldName;
end;

function TAutoDBDateEdit.GetDataSource: TDataSource;
begin
  Result := FDateLink.DataSource;
end;

function TAutoDBDateEdit.GetDateField: TField;
begin
  Result := FDateLink.Field;
end;

function TAutoDBDateEdit.GetBeginDateField: TField;
begin
  Result := FBeginDateLink.Field;
end;

function TAutoDBDateEdit.GetEndDateField: TField;
begin
  Result := FEndDateLink.Field;
end;

procedure TAutoDBDateEdit.SetDateField(const Value: String);
begin
  FDateLink.FieldName := Value;
end;

procedure TAutoDBDateEdit.SetBeginDateField(const Value: String);
begin
  FBeginDateLink.FieldName := Value;
end;

procedure TAutoDBDateEdit.SetEndDateField(const Value: String);
begin
  FEndDateLink.FieldName := Value;
end;

procedure TAutoDBDateEdit.SetDataSource(Value: TDataSource);
begin
  FDateLink.DataSource := Value;
  FBeginDateLink.DataSource := Value;
  FEndDateLink.DataSource := Value;    
  if Value <> Nil then
    Value.FreeNotification(Self);
end;

end.

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?