Como colocar um DateTimePicker no DBGrid?
Fala galera do Show Delphi, tudo beleza?
O DBGrid padrão do Delphi já nos oferece muitas funcionalidades, mas há certas funções importantes no uso do dia a dia dos usuários que infelizmente não existem por padrão.
Uma delas é o preenchimento de datas, onde o usuário precisa informar tudo, inclusive as barras (“/”), e ainda ele pode informar algo incorreto e parecer um erro na tela, o que acaba se tornando em uma experiência menos agradável ao cliente.
Bem, e o que fazer?
Uma solução para este tipo de situação é colocar um DateTimePicker dentro do DBGrid, assim o usuário terá todas as funções do calendário e também os possíveis erros de validação de data serão evitados.
Maravilha, mas como fazer isso?
Vamos lá, o código é simples, mas não em um lugar único.
Atualizando a informação do Field.
1
2
3
4
5
6
7
8
| procedure TForm1.DateTimePicker1Change(Sender: TObject);
begin
{ Fazendo o seu dataset receber o valor informado no DateTimePicker }
if ClientDataSet1.State in dsEditModes then
begin
ClientDataSet1DATA.AsDateTime := DateTimePicker1.Date;
end;
end; |
procedure TForm1.DateTimePicker1Change(Sender: TObject);
begin
{ Fazendo o seu dataset receber o valor informado no DateTimePicker }
if ClientDataSet1.State in dsEditModes then
begin
ClientDataSet1DATA.AsDateTime := DateTimePicker1.Date;
end;
end;
Mantendo a naturalidade de passar o foco pelas colunas.
1
2
3
4
5
| procedure TForm1.DateTimePicker1Exit(Sender: TObject);
begin
{ Seta o foco de volta para o DBGrid depois de sair do DateTimePicker }
DBGrid1.SetFocus;
end; |
procedure TForm1.DateTimePicker1Exit(Sender: TObject);
begin
{ Seta o foco de volta para o DBGrid depois de sair do DateTimePicker }
DBGrid1.SetFocus;
end;
Mandendo o DateTimePicker, quando não usado.
1
2
3
4
5
6
| procedure TForm1.DBGrid1ColExit(Sender: TObject);
begin
{ Deixa o DateTimePicker invisivível ao sair do foco na coluna. }
if DBGrid1.SelectedField.FieldName = 'DATA' then
DateTimePicker1.Visible := False;
end; |
procedure TForm1.DBGrid1ColExit(Sender: TObject);
begin
{ Deixa o DateTimePicker invisivível ao sair do foco na coluna. }
if DBGrid1.SelectedField.FieldName = 'DATA' then
DateTimePicker1.Visible := False;
end;
Fazendo o DateTimePicker ficar exatamente na frente do DBGrid.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
{ Faz o DateTimePicker ficar exatamente na frente do DBGrid }
if (gdFocused in State) then
begin
if (Column.Field.FieldName = 'DATA') then
with DateTimePicker1 do
begin
Left := Rect.Left + DBGrid1.Left + 1;
Top := Rect.Top + DBGrid1.Top + 1;
Width := Rect.Right - Rect.Left + 2;
Width := Rect.Right - Rect.Left + 2;
Height := Rect.Bottom - Rect.Top + 2;
Visible := True;
end;
end;
end; |
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
{ Faz o DateTimePicker ficar exatamente na frente do DBGrid }
if (gdFocused in State) then
begin
if (Column.Field.FieldName = 'DATA') then
with DateTimePicker1 do
begin
Left := Rect.Left + DBGrid1.Left + 1;
Top := Rect.Top + DBGrid1.Top + 1;
Width := Rect.Right - Rect.Left + 2;
Width := Rect.Right - Rect.Left + 2;
Height := Rect.Bottom - Rect.Top + 2;
Visible := True;
end;
end;
end;
Fazendo o DateTimePicker receber os eventos de KeyPress.
1
2
3
4
5
6
7
8
9
10
11
12
| procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin
if (Key = Chr(9)) then
Exit;
{ Seta os eventos de key press do dbgrid para o DateTimePicker1 }
if (DBGrid1.SelectedField.FieldName = 'DATA') then
begin
DateTimePicker1.SetFocus;
SendMessage(DateTimePicker1.Handle, WM_Char, word(Key), 0);
end;
end; |
procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin
if (Key = Chr(9)) then
Exit;
{ Seta os eventos de key press do dbgrid para o DateTimePicker1 }
if (DBGrid1.SelectedField.FieldName = 'DATA') then
begin
DateTimePicker1.SetFocus;
SendMessage(DateTimePicker1.Handle, WM_Char, word(Key), 0);
end;
end;
Parece complicado? Preparamos um vídeo para ajudar no entendimento.
Se preferir, podes fazer o download dos arquivos do exemplo.
Download “Exemplo DateTimePicker no DBGrid”
DateTimePicker_DBGrid.zip – Baixado 126 vezes – 55,29 KB
Dúvidas? Deixe o seu comentário!
Um abraço e até o próximo post.
-
Giovani Da Cruz
-
5.684 views
- 2 comentários
- 18 de maio de 2020
Está gostando do conteúdo? Considere pagar um cafezinho para nossa equipe!
Posts Relacionados - Continue Aprendendo
Boa dica, parabéns.
Boa dica, parabéns.