如何将变体转换为(或转换为)AnsiChar?

时间:2013-10-24 04:48:18

标签: delphi delphi-xe2

我正在使用Delphi XE2。非常自我解释的问题。我有一个变体,我存储一个单个字符(例如'?'),我想把它作为一个AnsiChar。如果我无法施放它,那么我该如何转换它。我试图用通常的方式施放铸造,但它没有用。我尝试在Google上搜索,但没有找到直接的答案。我对unicode转换理论不感兴趣。我在一行或两行delphi代码中寻找参考信息。

2 个答案:

答案 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 :(得分:5)

如果您的变体持有AnsiChar(存储为AnsiString),您可以访问VString的{​​{1}}字段,然后将值转换为AnsiString。像这样

TVarData

如果您的变量持有Char(存储为字符串),则可以访问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]; 的{​​{1}}字段,然后将值转换为AnsiString。像这样

VUString