Olá galera, nesta Quick Tips, irei mostrar, basicamente, como podemos modificar nossos componentes do Delphi, veja este poderoso recurso que podemos fazer com um simples DateTimePicker, fazendo com que o mesmo possa exibir valores de nosso banco de dados, assim como o DBEdit.
Vamos inicialmente criar uma unit, e salvar a mesma como DBDateTimePicker.pas .
Na mesma vamos agora declarar a Classe TDateTimePicker
unit DBDateTimePicker;
interface
uses
SysUtils, Classes, Controls, ComCtrls, DBCtrls, DB, Messages;
type
TDateTimePicker = class(ComCtrls.TDateTimePicker)
private
{ Private declarations }
FDataLink: TFieldDataLink;
function GetDataField: string;
function GetDataSource: TDataSource;
procedure SetDataField(const Value: string);
procedure SetDataSource(const Value: TDataSource);
procedure DataChange(Sender: TObject);
protected
{ Protected declarations }
procedure UpdateData(Sender: TObject);
procedure Change; override;
procedure CMExit(var Msg: TMessage); message CM_EXIT;
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
{ Published declarations }
property DataField: string read GetDataField write SetDataField;
property DataSource: TDataSource read GetDataSource write SetDataSource;
end;
implementation
uses
Variants;
{ TDBDateTimePicker }
procedure TDateTimePicker.Change;
begin
if not FDataLink.Editing then
FDataLink.Edit;
FDataLink.Modified;
inherited;
end;
procedure TDateTimePicker.CMExit(var Msg: TMessage);
begin
try
FDataLink.UpdateRecord;
except
on Exception do
SetFocus;
end;
end;
constructor TDateTimePicker.Create(AOwner: TComponent);
begin
inherited;
FDataLink:=TFieldDataLink.Create;
FDataLink.OnDataChange := DataChange;
FDataLink.OnUpdateData := UpdateData;
Self.Date := Now;
end;
procedure TDateTimePicker.DataChange(Sender: TObject);
begin
if Assigned(FDataLink.DataSource) and Assigned(FDataLink.Field) then
begin
if FDataLink.Field.AsDateTime <> StrToDate( '30/12/1899' ) then
Self.Date:=FDataLink.Field.AsDateTime
else
Self.Date := Now;
end;
end;
destructor TDateTimePicker.Destroy;
begin
FDataLink.Free;
inherited;
end;
function TDateTimePicker.GetDataField: string;
begin
Result:=FDataLink.FieldName;
end;
function TDateTimePicker.GetDataSource: TDataSource;
begin
Result:=FDataLink.DataSource;
end;
procedure TDateTimePicker.SetDataField(const Value: string);
begin
FDataLink.FieldName := Value;
end;
procedure TDateTimePicker.SetDataSource(const Value: TDataSource);
begin
FDataLink.DataSource := Value;
end;
procedure TDateTimePicker.UpdateData(Sender: TObject);
begin
FDataLink.Field.AsDateTime := Self.Date;
end;
end.
Fico por aqui até a próxima parte.
Um abraço
Wesley Y
wyamazack@rwsolution.com.br
Olá galera, nesta Quick Tips, iremos continuar vendo o nosso componente DBDateTimePicker, que serve para podermos trabalhar de forma igual a um DBEdit, só que usando o DateTimePicker.
Como usar então agora nosso DBDateTimePicker?
Simplesmente adicionar a Uses DBDateTimePicker.pas, no Formulário onde deseja ter este controle, neste caso, não irá funcionar automaticamente, pois precisamos configurar as propriedades do mesmo fisicamente, mesmo assim precisamos dar uma “pernada” no compilador do Delphi, como ?.
Vejamos como é simples, ao incluir um TDateTimePicker, e compilar o projeto, você verá que o mesmo se encarrega de dar uses em ComCtrl, unit esta que contém a classe TDateTimePicker. Até ai nenhum mistério. O uses é dado pelo Delphi. Vejamos agora ao adicionar a uses o nosso DBDateTimePicker.
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DBDateTimePicker, ComCtrl;
Da maneira que esta, o Delphi não fará diferença ao executar, teste para ver, e entender melhor o exemplo.
Agora da maneira correta.
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrl, DBDateTimePicker;
Vamos agora fazer o tão espero exemplo de comportamento, no evento onCreate do seu Formulário precisamos configura as propriedades DataField e DataSource, como fazemos com os componentes DBEdit, DBCombobox.
procedure TFrmPrincipal.FormCreate(Sender: TObject);
begin
EdtDataNascimento.DataField := 'DATANASCIMENTO';
EdtDataNascimento.DataSource:= DSCLIENTE;
EdtDataCadastro.DataField := 'DATACADASTRO';
EdtDataCadastro.DataSource:= DSCLIENTE;
EdtDataEmissao.DataField := 'DATAEMISSAO';
EdtDataEmissao.DataSource:= DSCLIENTE;
{ Obs: Podemos notar que não nos prendemos apenas a usar um unit DateTimePicker, mas sim vários, isso mesmo você pode usar agora seu DateTimePicker para vários controles na mesma tela, igual a um DBEdit, ou DBCombobox como mencionado }
end;
Feito isso basta executar seu projeto, e veja o resultado como é simples. Antes podíamos configurar a propriedade EditMask, do nosso Field(dentro do ClientDataSet), agora não precisamos mais fazer isso, basta usarmos o famoso DateTimePicker, que por sinal no Windows Vista/ Win7, tem uns efeitos bem legais, dando um ar mais agradável para nossos sistemas e satisfazendo os clientes.
Até Fico por aqui ate à próxima Quick Tips.
Um abraço
Wesley Y
wyamazack@rwsolution.com.br