如何将一个变量转换为 AnsiChar 类型?

3
我正在使用Delphi XE2。问题很明显。我有一个变体,在其中存储一个单个字符(例如“?”),我想将其转换为AnsiChar类型。如果无法转换,则如何进行转换?我尝试了通常的强制类型转换方式,但它没有起作用。我已经尝试在Google上搜索,但没有找到直接的答案。我对Unicode转换的理论不感兴趣。我正在寻找一到两行Delphi代码的参考信息。

它在 Variant 中是如何存储的?它应该被存储为整数类型。 - David Heffernan
这只是一厢情愿的想法。事实上,您没有将字符存储在该变量中。您已经将字符串存储在变量中。这就是为什么您的强制转换尝试失败的原因。如果您想要存储单个字符,请直接这样做,而不是使用字符串。 - David Heffernan
我猜那是讽刺,但我不确定你想表达什么意思。 - David Heffernan
@Sam - 如果你真的需要一个特定的 AnsiChar,那么你的思考已经超越了“直观”、“抽象”等概念,而是关注于具体实现细节。顺便问一下,你需要一个 AnsiChar 的背景是什么?也就是说,你为什么需要一个 AnsiChar? - Chris Rolliston
如果需要,您也可以声明自己的变量类型,TCustomVariantType - LU RD
2个回答

7
这是一种方法:

这是一种做法:

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存储为variant中的一个字节:

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

注意:将AnsiChar存储为byte而不是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分。 - David Heffernan

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];

如果您的 variant 包含一个 Char(它被存储为 String),您可以访问 TVarData 的 VUString 字段,然后将该值转换为 AnsiString。如下所示:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接