Si consideri il seguente codice:Perché una Variant non può contenere un TDateTime prima del 100 CE?
procedure Test;
function d1: Variant;
var
DDt: TDateTime;
begin
DDt := EncodeDate(100,1,1);
Result := DDt;
end;
function d2: Variant;
var
DDt: TDateTime;
begin
DDt := EncodeDate(99,12,31);
Result := DDt;
end;
procedure Writedate(V: Variant);
begin
Writeln(string(V));
end;
var
V: Variant;
begin
V := d1;
Writedate(V);
V := d2;
Writedate(V);
end;
La prima chiamata a Writedate
avrà successo, e l'uscita sarà '01 -01-0100' . La seconda chiamata, tuttavia, fallirà con un errore di "argomento non valido". Ispezionando il codice, è possibile vedere il Variant
della data 99-12-31 ha un errore EVariantInvalidArgError
.
Tuttavia, se chiamo FormatDateTime('c', TDateTime(V))
su TDateTime
, entrambi avranno esito positivo. Infatti, in qualsiasi momento in cui lo Variant
contiene uno TDateTime
, la cui data è precedente a 100 CE, l'IDE visualizzerà uno EVariantInvalidArgError
durante l'ispezione del suo valore.
Sembra strano che lo Variant
non sia in grado di gestire la data pre-100 CE, quando TDateTime
può. È un errore in Delphi? Trovo che sia a destra tra il 99 e il 100 CE per essere un po 'sospettoso.
Pensavo che Delphi avesse smesso di usare le varianti di Windows molte versioni fa. Ma le varianti si basano ancora su automazione OLE? – Svip
L'intero punto del tipo Variant è che è un tipo di interoperabilità –
Esistono diverse varianti di conversioni che sono delegate a OLE Automation. Stai lanciando una variante 'VT_DATE' a una stringa. Questo viene fatto chiamando l'API 'VarBstrFromDate' in' oleaut32.dll' (vedere 'System.Variants' e' System.VarUtils'). Puoi scorrere il codice (compilato con debug dcus) e vedere di persona. –