3

我正在使用德尔福 XE2。非常不言自明的问题。我有一个变体,其中存储了一个字符(例如'?'),我想将其转换为 AnsiChar。如果我不能投射它,那么我该如何转换它。我试图以通常的方式进行投射,但没有奏效。我试过在谷歌上搜索,没有找到直接的答案。我对unicode转换的理论不感兴趣。我正在寻找一两行delphi代码中的参考信息。

4

2 回答 2

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;
于 2013-10-24T06:21:36.367 回答
5

如果您的变体持有 AnsiChar(存储为 AnsiString),您可以访问 的VString字段,TVarData然后将值转换为 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];

如果您的变体持有一个 Char(它存储为一个字符串),您可以访问该VUString字段,TVarData然后将值转换为 AnsiString。像这样

 v:=String('a');
 if (TVarData(v).VType=varUString) and (TVarData(v).VUString<>nil) then
   a:= AnsiString(VarToStr(v))[1];
于 2013-10-24T06:00:36.250 回答