Betrachten Sie den folgenden Code ein:Warum kann eine Variante keine TDateTime vor 100 CE enthalten?
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;
Der erste Aufruf von Writedate
erfolgreich sein wird, und die Ausgabe '01 wird -01-0100' . Der zweite Aufruf wird jedoch mit einem Fehler "ungültiges Argument" fehlschlagen. Wenn Sie den Code überprüfen, können Sie sehen, dass der Variant
des 99-12-31 Datums einen EVariantInvalidArgError
Fehler aufweist.
Allerdings, wenn ich FormatDateTime('c', TDateTime(V))
auf entweder TDateTime
aufrufen, werden beide erfolgreich sein. In der Tat, zu jedem Zeitpunkt, wenn die Variant
enthält eine TDateTime
, deren Datum vor 100 CE ist, zeigt die IDE eine EVariantInvalidArgError
bei der Überprüfung ihres Wertes.
Es scheint seltsam, dass die Variant
nicht mit dem vor 100 CE-Datum umgehen kann, wenn TDateTime
kann. Ist das ein Fehler in Delphi? Ich finde es rechts zwischen 99 und 100 CE, um ein bisschen verdächtig zu sein.
Ich dachte Delphi verwendet Windows Varianten vor vielen Versionen. Aber Varianten verlassen sich immer noch auf OLE Automation? – Svip
Der gesamte Punkt des Variant-Typs besteht darin, dass es sich um einen Interop-Typ handelt. –
Es gibt mehrere Variantenkonvertierungen, die an die OLE-Automatisierung delegiert werden. Sie transformieren eine 'VT_DATE'-Variante in eine Zeichenfolge. Dies geschieht durch Aufruf der API 'VarBstrFromDate' in' oleaut32.dll' (siehe 'System.Variants' und' System.VarUtils'). Sie können durch den Code gehen (kompiliert mit debug dcus) und sehen Sie selbst. –