2013-02-28 22 views
8
uses 
    SysUtils, Variants; 

var 
    VariantSingle: Variant; 
    VTSingle: TVarType; 
    SingleTest: Single; 
    VariantDouble: Variant; 
    DoubleTest: Double; 
    VTDouble: TVarType; 

begin 
    SingleTest := 1.234; 
    VariantSingle := SingleTest; 
    VTSingle := VarType(VariantSingle) and varTypeMask; 

    DoubleTest := 1.23456; 
    VariantDouble := DoubleTest; 
    VTDouble := VarType(VariantDouble) and varTypeMask; 

    WriteLn(Format('VarType: Single: %d, Double %d', [VTSingle, VTDouble])); 
end. 

irade çıkışı Yukarıdaki kod:Neden bir varyantı tek bir atama varDouble varyantı ile sonuçlanır?

VarType: Single:

varSingle = $0004; { vt_r4   4 } 
varDouble = $0005; { vt_r8   5 } 

Böylece System.pas itibaren 5

Çift 5, ben VTSingle beklediğiniz - değil 5
Neyi eksik?

cevap

5

Delphi kitaplıkları, _VarFromReal numaralı çağrı aracılığıyla tüm değişken nokta atamalarını varyantlara uygulamayı seçer. Ve bu işlev şuna benzer: Bu varDouble bir türünü kullanan

procedure _VarFromReal(var V: TVarData; const Value: Real); 
begin 
    if (V.VType and varDeepData) <> 0 then 
    VarClearDeep(V); 
    V.VType := varDouble; 
    V.VDouble := Value; 
end; 

Not söyledi. Ve Double için bir diğer ad olan Real'a örtülü bir dönüştürme içerir. Tasarımcıların neden bu özel rotayı seçtiklerini bilmiyorum, ancak bu seçimin sonucu gözlemlediğiniz davranış. Bu Single için tekrar o Double için SingleTest dönüştürmek ve rağmen

VariantSingle := VarAsType(SingleTest, varSingle); 

:

basit bir yolu

kullanabileceğiniz bir varSingle varyantı yapmak.

, o gereksiz dönüşüm önlemek Kendi yardımcı yazmak için:

VariantSingle := VarFromSingle(SingleTest); 

Bu yaklaşım bence doğru çözümdür:

function VarFromSingle(const Value: Single): Variant; 
begin 
    VarClear(Result); 
    TVarData(Result).VSingle := Value; 
    TVarData(Result).VType := varSingle; 
end; 

böyle çağırabilir.

+0

'_VarFromReal 'yordamını asm' den Pascal 'a çevirdiniz mi? En azından Delphi 2009'da, bir 'asm' prosedürü olarak uygulanır. –

+0

@AndreasRejbrand Modern Delphis ayrıca yeni x86 olmayan hedeflerin yararına Pascal sürümlerine sahiptir. Bu yüzden burada Pascal versiyonunu kullandım. –

İlgili konular