De todas las respuestas dadas, la que más me gusta es la de
Mick, de hecho, yo haría algo así:
Código Delphi
[-]
function fechasValidas: Boolean;
var
creacion, aprobacion, emision_ant, emision_f: TDateTime;
begin
creacion := StrToDateDef(fecha_creacion.text ,MaxDouble);
aprobacion := StrToDateDef(fecha_aprovacion.text ,MaxDouble);
emision_ant:= StrToDateDef(fecha_emision_f_ant.text,MaxDouble);
emision_f := StrToDateDef(fecha_emision_f.text ,MaxDouble);
Result := aprobacion <> maxdouble;
result := result and creacion <= aprobacion;
if emision_ant <> maxdouble then
begin
result := result and aprobacion <= emision_ant;
if emision_f <> maxdouble then
result := result and emision_ant <= emision_f
end;
else
begin
result := result and creacion <= aprobacion;
if emision_f <> maxdouble then
result := result and aprobacion <= emision_F
end;
end;
Si delphi tiene desactivada la directiva "Complete Boolean evaluation" (por defecto creo que sí en Tools --> enviroment), las comparaciones serían tremendamente efectivas.
El punto es usar Result una y otra vez y siempre como primera condición de comparación, si ya es false, Delphi detecta que está unida la comparación con un "and" y no evalúa la condición de la derecha del "and", directamente devuelve falso.
Creo que las comparaciones están correctas.
Saludos