2015-05-22 5 views
6

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.

Antwort

7

Variant kann einen beliebigen Datumswert enthalten, wie Ihr Code zeigt (Zuweisung V := d2; erzeugt keinen Fehler).

Der Fehler wird während der Konvertierung in Zeichenfolge, die der Compiler an das Betriebssystem auf Windows-Plattformen delegiert, ausgelöst. Dies schlägt fehl, da OLE Automation Mitternacht, 1. Januar 0100 als den minimalen gültigen Ole-Automatisierungsdatumswert angibt.

+0

Ich dachte Delphi verwendet Windows Varianten vor vielen Versionen. Aber Varianten verlassen sich immer noch auf OLE Automation? – Svip

+2

Der gesamte Punkt des Variant-Typs besteht darin, dass es sich um einen Interop-Typ handelt. –

+2

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. –

Verwandte Themen