2015-05-22 7 views
6

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.

risposta

7

Variant può contenere qualsiasi valore di data, come dimostra il codice (assegnazione V := d2; non produce errori).

L'errore viene generato durante la conversione in stringa che il compilatore delega al sistema operativo su piattaforme Windows. Ciò non riesce perché OLE Automation specifica mezzanotte, 1 gennaio 0100 come valore di data di automazione OLE minimo valido.

+0

Pensavo che Delphi avesse smesso di usare le varianti di Windows molte versioni fa. Ma le varianti si basano ancora su automazione OLE? – Svip

+2

L'intero punto del tipo Variant è che è un tipo di interoperabilità –

+2

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

Problemi correlati