



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.
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.
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; |
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; |
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; |
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; |
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; |
Parece complicado? Preparamos um vídeo para ajudar no entendimento.
Se preferir, podes fazer o download dos arquivos do exemplo.
[download id=”3952″]
Dúvidas? Deixe o seu comentário!
Um abraço e até o próximo post.
Você precisa fazer o login para publicar um comentário.
Boa dica, parabéns.
Boa dica, parabéns.