Hola jocaro.
No sé que RDBMS estas usando, pero creo que existen soluciones mas sólidas (y simples) desde la misma base de datos.
Ahora respondiendo a tu pregunta, igual que
ElDioni, considero que el
TDateTimePicker da solución a los puntos primero, segundo y cuarto de tu consulta.
En cuanto al tercer punto, una opción es usar los eventos
OnGetText y
OnSetText del campo en cuestión y que también podes asignar en tiempo de diseño creando el campo persistente, ahorrándote así la asignación por código:
Código Delphi
[-]
...
procedure TForm1.FormCreate(Sender: TObject);
begin
Campo.ReadOnly := True;
DataSet.FieldByName('CAMPO').OnGetText := CampoGetText;
DataSet.FieldByName('CAMPO').OnSetText := CampoSetText;
end;
procedure TForm1.DateTimePicker1Change(Sender: TObject);
var
f : string;
begin
f := DateToStr(DateTimePicker1.Date);
f := Copy(f, 7, 4) + '/' + Copy(f, 4, 2) + '/' + Copy(f, 1, 2);
with DataSet do
begin
FieldByName('CAMPO').ReadOnly := False;
Edit;
FieldByName('CAMPO').AsString := f;
FieldByName('CAMPO').ReadOnly := True;
end;
end;
procedure TForm1.CampoGetText(Sender: TField; var Text: string; DisplayText: Boolean);
var
f: string;
begin
f := Sender.AsString;
if f > '' then
Text := Copy(f, 9, 2) + '/' + Copy(f, 6, 2) + '/' + Copy(f, 1, 4);
end;
procedure TForm1.CampoSetText(Sender: TField; const Text: string);
var
f: string;
begin
f := Text;
if f > '' then
Sender.AsString := Copy(f, 7, 4) + '/' + Copy(f, 4, 2)+ '/'+ Copy(f, 1, 2);
end;
...
procedure TForm1.FormDestroy(Sender: TObject);
begin
DataSet.FieldByName('CAMPO').OnGetText := nil;
DataSet.FieldByName('CAMPO').OnSetText := nil;
end;
De ese modo, mantendrá invertida la fecha en la tabla, pero la mostrará normal en todos los controles de datos sin más.
Notarás que por protección, el campo llamado "CAMPO" (así soy de ocurrente
), se mantiene en la condición
ReadOnly y solo sale de ella por un momento en el evento
OnChange del
TDateTimePicker, ya que no existe implementado ningún mecanismo de validación sobre la fecha ingresada en otros controles.
Saludos