Help D3 new component

De: Jmh <sky58...@nospam.skynet.be>
Objet: Help D3 new component.
Date : lundi 16 ao?t 1999 17:19

Hi,

As i needed a data oriented TDateTimePicker (missing in Delphi 3), i decided
to write it myself.
But there is a slight problem: the table is not updated.
I use the message CN_COMMAND and the NotifyCode value CBN_EDITCHANGE to
detect a change and then set DataLink.Modified, but i found out that the
message was not used !?(my procedure TDBDateTimePicker.CNCommand(var
Message:TWMCommand), is never called.
The only way i got it to work, was to set FDataLink.Modified in CMExit it
works, but then the table is being updated even if the data has not changed
!
How do i detect a change in the DateTimePicker combobox ? See the code
below.

Thanks for the hint,
Regards,
Jmh.

TDBDateTimePicker code
-------------------------------------

unit XDBDateTimePicker;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ComCtrls, DB, DBCtrls, DsgnIntf;

type
  EDBDateTimePicker  = Class(Exception);

  TDBDateTimePicker = class(TDateTimePicker)
  private
    FDataLink :TFieldDataLink;
    FReadOnly :Boolean;
    Procedure SetDataSource(Value:TDataSource);
    Function  GetDataSource:TDataSource;
    Procedure SetDataField(Value:String);
    Function  GetDataField:String;
    Procedure DataChange(Sender:TObject);
    Procedure UpdateData(Sender:TObject);
    Procedure CNCommand(var Message:TWMCommand);Message CN_COMMAND;
    Procedure CMExit(var Message:TCMExit);Message CM_EXIT;
  protected
  public
    Constructor Create(AOwner:TComponent);Override;
    Destructor  Destroy;Override;
    Procedure   Loaded;Override;
  published
    Property DataSource:TDataSource Read GetDataSource Write SetDataSource;
    Property DataField :String      Read GetDataField  Write SetDataField;
    Property ReadOnly  :Boolean     Read FReadOnly     Write FReadOnly
Default False;
  end;

procedure Register;

implementation

Constructor TDBDateTimePicker.Create(AOwner:TComponent);
begin
Inherited Create(AOwner);
FDatalink:=TFieldDataLink.Create;
FDataLink.OnDataChange:=DataChange;
FDataLink.OnUpdateData:=UpdateData;
FReadOnly:=False;
end;

Destructor TDBDateTimePicker.Destroy;
begin
FDataLink.OnDataChange:=Nil;
FDataLink.OnUpdateData:=Nil;
FDataLink.Free;
FDataLink:=Nil;
Inherited Destroy;
end;

Procedure TDBDateTimePicker.Loaded;
begin
Inherited Loaded;
end;

Procedure TDBDateTimePicker.SetDataSource(Value:TDataSource);
begin
FDataLink.DataSource:=Value;
end;

Function TDBDateTimePicker.GetDataSource:TDataSource;
begin
Result:=FDataLink.DataSource;
end;

Procedure TDBDateTimePicker.SetDataField(Value:String);
begin
FDataLink.FieldName:=Value;
end;

Function TDBDateTimePicker.GetDataField:String;
begin
Result:=FDataLink.FieldName;
end;

Procedure TDBDateTimePicker.DataChange(Sender:TObject);
begin
if(FDataLink.Field <> Nil)then
  begin
  case Kind of
    dtkDate:Date:=FDataLink.Field.AsDateTime;
    dtkTime:Time:=FDataLink.Field.AsDateTime;
  end;
  end;
end;

Procedure TDBDateTimePicker.UpdateData(Sender: TObject);
begin
if(FDataLink.Field <> Nil)and(FReadOnly = False)then
  begin
  case Kind of
    dtkDate:FDataLink.Field.AsDateTime:=Date;
    dtkTime:FDataLink.Field.AsDateTime:=Time;
  end;
  end;
end;

Procedure TDBDateTimePicker.CNCommand(var Message:TWMCommand);
begin
if(Message.NotifyCode = CBN_EDITCHANGE)then
  begin
  if(FDataLink <> Nil)then FDataLink.Modified;
  end;
Inherited;
end;

procedure TDBDateTimePicker.CMExit(var Message:TCMExit);
begin
try
  if(FDataLink <> Nil)then FDataLink.UpdateRecord;
except
  On Exception do SetFocus;
end;
Inherited;
end;

procedure Register;
begin
RegisterComponents('XDBControls', [TDBDateTimePicker]);
end;

end.