2013-10-24 100 views
3

我正在使用Delphi XE2。很自我解釋的問題。我有一個變體,我在其中存儲單個字符(例如'?'),我想將它轉換爲AnsiChar。如果我不能投射它,那我該如何轉換它。我試圖按照通常的方式投射,但沒有奏效。我試着在Google上搜索,發現沒有簡單的答案。我對unicode轉換理論不感興趣。我正在尋找一行或兩行delphi代碼中的參考信息。如何將變體轉換爲(或轉換爲)AnsiChar?

+0

它是如何被存儲於變形。它應該被存儲爲一個整體類型。 –

+0

這只是一廂情願的想法。事實上,你沒有在這個變體中存儲的角色。您已在變體中存儲了一個字符串。這當然是你爲什麼試圖失敗的原因。如果您想存儲單個字符,請這樣做而不是使用字符串。 –

+0

我認爲這是諷刺,但我不確定你在做什麼 –

回答

6

這是做這件事:

v : Variant; 
a : AnsiChar; 
... 
v := AnsiChar('a'); // Will be stored as an AnsiString 
// Check variant 
if VarIsStr(v) and (Length(AnsiString(v)) = 1) then 
    a := AnsiString(v)[1]; // Cast variant holding an AnsiString to an AnsiChar 
//Another way 
if (VarType(v) = varString) and (Length(AnsiString(v)) = 1) then 
    a := AnsiString(v)[1]; // Cast variant holding an AnsiString to an AnsiChar 

的變體可以容納不同的字符串類型(AnsiString類型= varString,的UnicodeString = varUString和WideString的= varOleStr)。

如果要存儲的屬於ANSIChar在你變一個字節:

v := Byte(AnsiChar('A')); // Will be stored as a byte 
if (VarType(v) = varByte) then 
    a := AnsiChar(Byte(v)); 

注:存儲的ANSIChar類型爲一個字節與一個AnsiString類型是比較喜歡的,因爲你避免堆分配。


注意到在您指定的變量爲註釋:

v := 'c'; 

這意味着你的變種字符串將在varUString格式。

if (Vartype(v) = varUString) and (Length(String(v)) = 1) then 
    a := AnsiChar(String(v)[1]); 

如果您想覆蓋所有的基地,有一個參加的所有變型的轉換例程:

function GiveMeThatAnsiCharFromVariant(const v: Variant; var a: AnsiChar): Boolean; 
// Accepts UnicodeString,AnsiString,WideString,byte for conversion to AnsiChar; 
begin 
    Result := False; 
    if VarIsStr(v) then 
    begin 
    case VarType(v) of 
    varString : 
     if (Length(AnsiString(v)) = 1) then 
     begin 
     a := AnsiChar(AnsiString(v)[1]); 
     Result := True; 
     end; 
    varUString : 
     if (Length(String(v)) = 1) then 
     begin 
     a := AnsiChar(String(v)[1]); 
     Result := True; 
     end; 
    varOleStr : 
     if (Length(Widestring(v)) = 1) then 
     begin 
     a := AnsiChar(Widestring(v)[1]); 
     Result := True; 
     end; 
    end; 
    end 
    else 
    begin 
    if (VarType(v) = varByte) then 
    begin 
     a := AnsiChar(Byte(v)); 
     Result := True; 
    end; 
    end; 
end; 
+1

+1用於識別在變體中存儲字符的正確方法 –

5

如果你的變種持有一個AnsiChar(存儲爲AnsiString),你可以訪問TVarDataVString字段,然後將該值轉換爲AnsiString。像這樣

var 
v : Variant; 
a : AnsiChar; 
begin 
v:=AnsiString('a'); //this is a variant holding a single AnsiChar 
if (TVarData(v).VType=varString) and (TVarData(v).VString<>nil) then 
    a:=AnsiString(TVarData(v).VString)[1];// or a:= AnsiString(v)[1]; 

如果變體抱着一個字符(被存儲爲一個字符串),你可以訪問TVarDataVUString領域再投價值AnsiString類型。像這樣

v:=String('a'); 
if (TVarData(v).VType=varUString) and (TVarData(v).VUString<>nil) then 
    a:= AnsiString(VarToStr(v))[1]; 
相關問題