我正在使用Delphi XE2。漂亮的自我解释性问题。我有一个变体,其中我存储一个字符(例如“?”),我想将其转换为AnsiChar。如果无法投放,该如何转换。我尝试过用通常的方式进行转换,但是没有用。我尝试在Google上进行搜索,但没有找到直接的答案。我对Unicode转换理论不感兴趣。我正在寻找一两行delphi代码中的参考信息。
这是一种方法:
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;
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句