www.pudn.com > TMS.Component.Pack.v5.0.rar > AdvDBDateTimePicker.pas, change:2009-01-24,size:11166b


{***********************************************************************}
{ TAdvDBDateTimePicker component                                        } 
{ for Delphi & C++ Builder                                              } 
{                                                                       } 
{ written by :                                                          } 
{            TMS Software                                               } 
{            copyright © 2007 - 2008                                    } 
{            Email : info@tmssoftware.com                               } 
{            Website : http://www.tmssoftware.com                       } 
{                                                                       } 
{ The source code is given as is. The author is not responsible         } 
{ for any possible damage done due to the use of this code.             } 
{ The component can be freely used in any application. The source       } 
{ code remains property of the writer and may not be distributed        } 
{ freely as such.                                                       } 
{***********************************************************************} 
 
unit AdvDBDateTimePicker; 
 
{$I TMSDEFS.INC} 
 
interface 
 
uses 
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, 
  StdCtrls, DB, DBCtrls, AdvDateTimePicker; 
 
type 
  TAdvDBDateTimePicker = class(TAdvDateTimePicker) 
  private 
    { Private declarations } 
    FDataLink: TFieldDataLink; 
    FOldState: TDataSetState; 
    FIsEditing: Boolean; 
    FInternalCall: boolean; 
    FNewDate: TDateTime; 
    FNullDate: Boolean; 
    FInternalChange: Boolean; 
    function GetDataField: string; 
    function GetDataSource: TDataSource; 
    procedure SetDataField(const Value: string); 
    procedure SetDataSource(const Value: TDataSource); 
    procedure DataUpdate(Sender: TObject); 
    procedure DataChange(Sender: TObject); 
    procedure ActiveChange(Sender: TObject); 
    procedure HandleKey(Key: word); 
    procedure CNNotify(var Message: TWMNotify); message CN_NOTIFY; 
    procedure WMKeyDown(var Message: TWMKeyDown); message WM_KEYDOWN; 
    {$IFNDEF TMSDOTNET} 
    procedure CMGetDataLink(var Message: TMessage); message CM_GETDATALINK; 
    {$ENDIF} 
  protected 
    { Protected declarations } 
    procedure Change; override; 
    procedure Notification(AComponent: TComponent; Operation: TOperation); override; 
    procedure Loaded; override; 
    function EditCanModify: Boolean; virtual; 
    procedure DoExit; override; 
    procedure TimePickerChanged; override; 
    procedure TimePickerKeyPress(Sender: TObject; var Key: Char); override; 
    procedure SetDateTimeEx(const Value: TDateTime); override; 
  public 
    { Public declarations } 
    constructor Create(aOwner:TComponent); override; 
    destructor Destroy; override; 
    {$IFDEF DELPHI4_LVL} 
    function ExecuteAction(Action: TBasicAction): Boolean; override; 
    function UpdateAction(Action: TBasicAction): Boolean; override; 
    {$ENDIF} 
  published 
    { Published declarations } 
    property DataField: string read GetDataField write SetDataField; 
    property DataSource: TDataSource read GetDataSource write SetDataSource; 
  end; 
 
implementation 
 
uses 
  CommCtrl; 
//------------------------------------------------------------------------------ 
 
{ TAdvDBDateTimePicker } 
 
procedure TAdvDBDateTimePicker.Change; 
var 
  d: TDateTime; 
begin          
  if self.Text = '' then 
  begin 
    FNullDate:= true; 
    if not FInternalCall then 
      if EditCanModify then 
      begin 
        FNewDate := -1; 
        FDataLink.Modified; 
      end; 
  end 
  else 
  begin 
    inherited; 
 
    FNullDate := false; 
    d := self.DateTime; 
    if not FInternalCall then 
    begin 
      if EditCanModify then 
      begin 
        FNewDate := d; 
        FDataLink.Modified; 
      end; 
      //else 
        //DataChange(FDataLink.DataSet); 
    end; 
  end; 
end; 
 
//------------------------------------------------------------------------------ 
 
{$IFNDEF TMSDOTNET} 
procedure TAdvDBDateTimePicker.CMGetDataLink(var Message: TMessage); 
begin 
  Message.Result := Integer(FDataLink); 
end; 
{$ENDIF} 
 
//------------------------------------------------------------------------------ 
 
procedure TAdvDBDateTimePicker.Notification(AComponent: TComponent; 
  Operation: TOperation); 
begin 
  inherited Notification(AComponent, Operation); 
  if (csDestroying in ComponentState) then 
    Exit; 
 
  if (Operation = opRemove) and (FDataLink <> nil) and 
    (AComponent = DataSource) then DataSource := nil; 
end; 
 
//------------------------------------------------------------------------------ 
 
constructor TAdvDBDateTimePicker.Create(aOwner: TComponent); 
begin 
  inherited Create(AOwner); 
  FDataLink := TFieldDataLink.Create; 
  FDataLink.Control := Self; 
  FDataLink.OnDataChange := DataChange; 
  FDataLink.OnUpdateData := DataUpdate; 
  FDataLink.OnActiveChange := ActiveChange; 
 
  FInternalCall:= false; 
  FNewDate:= Self.DateTime; 
  FNullDate:= false; 
end; 
 
//------------------------------------------------------------------------------ 
 
procedure TAdvDBDateTimePicker.DataChange(Sender: TObject); 
begin 
 
  if not Assigned(FDataLink.DataSet) then 
    Exit; 
 
  if FIsEditing then 
    Exit; 
 
  FInternalChange := True; 
  if Assigned(FDataLink.Field) then 
  begin 
    if not (FDataLink.DataSet.State = dsInsert) then 
    begin 
      if (FOldState <> dsInsert)  then 
      begin 
        FInternalCall:= true; 
        if FDataLink.Field.AsString = '' then 
        begin 
          self.DateTime := -1; 
          self.Text := ''; 
        end 
        else 
        begin 
          self.DateTime := FDataLink.Field.AsDateTime; 
        end; 
        FInternalCall:= false; 
      end 
      else 
      begin 
        self.DateTime := FDataLink.Field.AsDateTime; 
        FNewDate := self.DateTime; 
      end; 
 
    end; 
 
    if (FDataLink.DataSet.State = dsInsert) then 
    begin 
      self.DateTime := FDataLink.Field.AsDateTime; 
      FNewDate := self.DateTime; 
    end; 
  end; 
 
  FOldState := FDataLink.DataSet.State; 
  FInternalChange := False; 
end; 
 
//------------------------------------------------------------------------------ 
 
procedure TAdvDBDateTimePicker.DataUpdate(Sender: TObject); 
begin 
  if Assigned(FDataLink.Field) and FDataLink.Editing then 
  begin 
    if FNullDate then 
      FDataLink.Field.AsString:= '' 
    else 
      FDataLink.Field.AsDateTime := FNewDate; 
  end; 
end; 
 
//------------------------------------------------------------------------------ 
 
destructor TAdvDBDateTimePicker.Destroy; 
begin 
  FDataLink.Free; 
  FDataLink := nil; 
  inherited Destroy; 
end; 
 
//------------------------------------------------------------------------------ 
 
procedure TAdvDBDateTimePicker.DoExit; 
begin 
  inherited; 
  if FDataLink.Editing then 
  begin 
    DataUpdate(Self); 
  end; 
   
end; 
 
//------------------------------------------------------------------------------ 
 
function TAdvDBDateTimePicker.GetDataField: string; 
begin 
  Result := FDataLink.FieldName; 
end; 
 
//------------------------------------------------------------------------------ 
 
function TAdvDBDateTimePicker.GetDataSource: TDataSource; 
begin 
  Result := FDataLink.DataSource; 
end; 
 
//------------------------------------------------------------------------------ 
 
procedure TAdvDBDateTimePicker.SetDataField(const Value: string); 
begin 
  FDataLink.FieldName := Value; 
end; 
 
//------------------------------------------------------------------------------ 
 
procedure TAdvDBDateTimePicker.SetDataSource(const Value: TDataSource); 
begin 
  FDataLink.DataSource := Value; 
end; 
 
//------------------------------------------------------------------------------ 
 
procedure TAdvDBDateTimePicker.Loaded; 
begin 
  inherited Loaded; 
  if (Kind = dkDateTime) and not Assigned(FTimePicker) then 
    CreateTimePicker; 
  DateTime := DateTime; 
end; 
 
//------------------------------------------------------------------------------ 
 
procedure TAdvDBDateTimePicker.ActiveChange(Sender: TObject); 
begin 
  if Assigned(FDataLink) then 
  begin 
    if Assigned(FDataLink.DataSet) then 
    begin 
      if not FDataLink.DataSet.Active then 
        Text := ''; 
    end 
    else 
    begin 
      Text := ''; 
    end; 
  end; 
end; 
 
//------------------------------------------------------------------------------ 
 
{$IFDEF DELPHI4_LVL} 
 
function TAdvDBDateTimePicker.ExecuteAction(Action: TBasicAction): Boolean; 
begin 
  Result := inherited ExecuteAction(Action) or (FDataLink <> nil) and 
    FDataLink.ExecuteAction(Action); 
end; 
 
function TAdvDBDateTimePicker.UpdateAction(Action: TBasicAction): Boolean; 
begin 
  Result := inherited UpdateAction(Action) or (FDataLink <> nil) and 
    FDataLink.UpdateAction(Action); 
end; 
 
{$ENDIF} 
 
//------------------------------------------------------------------------------ 
 
function TAdvDBDateTimePicker.EditCanModify: Boolean; 
begin 
  FDataLink.OnDataChange := nil; 
  try 
    Result := FDataLink.Edit; 
  finally 
    FDataLink.OnDataChange := DataChange; 
end; 
end; 
 
//------------------------------------------------------------------------------ 
 
procedure TAdvDBDateTimePicker.TimePickerChanged; 
begin 
  Change; 
  inherited; 
end; 
 
//------------------------------------------------------------------------------ 
 
procedure TAdvDBDateTimePicker.WMKeyDown(var Message: TWMKeyDown); 
begin 
  inherited; 
  HandleKey(Message.CharCode); 
end; 
 
//------------------------------------------------------------------------------ 
 
procedure TAdvDBDateTimePicker.TimePickerKeyPress(Sender: TObject; 
  var Key: Char); 
begin 
  inherited; 
  HandleKey(Integer(key)); 
end; 
 
//------------------------------------------------------------------------------ 
 
procedure TAdvDBDateTimePicker.HandleKey(Key: word); 
begin 
  if (key = VK_ESCAPE) then 
  begin 
    if FDataLink.Editing and Assigned(FDataLink.DataSet) and (FDataLink.DataSet.Active) then 
    begin 
      if Assigned(FDataLink.Field) then 
        FNewDate := FDataLink.Field.AsDateTime; 
      FDataLink.Reset; 
      FDataLink.DataSet.Cancel; 
    end; 
  end; 
end; 
 
//------------------------------------------------------------------------------ 
 
procedure TAdvDBDateTimePicker.SetDateTimeEx(const Value: TDateTime); 
begin 
  inherited; 
  if not (csLoading in ComponentState) and not FInternalChange then 
    Change; 
end; 
 
//------------------------------------------------------------------------------ 
 
procedure TAdvDBDateTimePicker.CNNotify(var Message: TWMNotify); 
begin 
  inherited; 
  with Message, NMHdr^ do 
  begin 
    if (code = DTN_CLOSEUP) then 
    begin 
      if not (FDataLink.DataSet.State in [dsEdit, dsInsert]) then 
        DataChange(FDataLink.DataSet); 
    end; 
  end; 
end; 
//------------------------------------------------------------------------------ 
 
 
{$IFDEF FREEWARE} 
{$I TRIAL.INC} 
{$ENDIF} 
 
 
 
end.