Bien, mi reacción es un poco tarde, pero aquí hay una solución para la nueva Delphi.
Utiliza sobrecargas de clases implícitas para que los registros de este tipo puedan usarse como si fueran variables TDateTime.
TDateRec = record
year,month,day,hour,minute,second,millisecond:word;
class operator implicit(aDateRec:TDateRec):TDateTime;
class operator implicit(aDateTime:TDateTime):TDateRec; // not needed
class operator implicit(aDateRec:TDateRec):String; // not needed
class operator implicit(aDateRec:String):TDateRec; // not needed
end;
Implementación:
uses DateUtils;
class operator TDateRec.Implicit(aDateRec:TDateRec):TDateTime;
begin
with aDateRec do // Yeah that's right you wankers. I like "with" :)
Result := encodeDateTime(Year,Month,Day,Hour,Minute,Second,Millisecond);
end;
class operator TDateRec.Implicit(aDateTime:TDateTime):TDateRec;
begin
with Result do
DecodeDateTime(aDateTime,Year,Month,Day,Hour,Minute,Second,Millisecond);
end;
class operator TDateRec.Implicit(aDateRec:TDateRec):String;
begin
Result := DateTimeToStr(aDateRec)
end;
class operator TDateRec.Implicit(aDateRec:String):TDateRec;
begin
Result := StrToDateTime(aDateRec)
end;
Ahora usted puede declarar su período como esto:
const
Date1:TDateRec=(Year:2009;month:05;day:11);
Date2:TDateRec=(Year:2009;month:05;day:11;hour:05);
Date3:TDateRec=(Year:2009;month:05;day:11;hour:05;minute:00);
Para ver si funciona, ejecute lo siguiente:
ShowMessage(Date1); // it can act like a string
ShowMessage(DateToStr(Date1)); // it can act like a date
Si Realmente quieres reemplazar todo tu Tdat Variables eTime con esto, probablemente necesite sobrecargar también a otros operadores (Agregar, restar, explícito, ...).
Gran pregunta: a menudo he querido hacer esto (más por tiempos que por fechas, pero el principio es muy similar - por ejemplo, quiero poner 6:45 pm en un TDateTime como const, etc.). Invariablemente termino haciendo algo como tu primer ejemplo, con comentarios, ¡y me duele cuando más tarde necesito cambiarlo! – robsoft
Esto parece algo que GExperts o DLangExtensions deberían poder hacer, ya sea como un experto para ingresar la fecha y/o la hora para crear una constante debidamente comentada, o como una cadena de conversión de preprocesador a TDateTime. Permitir formatos ISO 8601 solo debe eliminar toda ambigüedad. – mghie
@Mghie - buen punto. Una solución GExperts sería perfectamente aceptable para mí. Es cuando tengo que sacar la calculadora para comenzar a hacer divisiones que me frustran. :-) – robsoft