Ver Mensaje Individual
  #5  
Antiguo 25-10-2013
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Reputación: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita