加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Delphi将数组变体转换为String

发布时间:2020-12-15 09:29:47 所属栏目:大数据 来源:网络整理
导读:在我的delphi程序中,我与web服务进行通信. 在WSDL导入中,我创建了以下函数 – function call(const sessionId: WideString; const resourcePath: WideString; const args: Variant): Variant; stdcall; 现在当我在我的代码中调用它时,我想看看返回的值是什么
在我的delphi程序中,我与web服务进行通信.

在WSDL导入中,我创建了以下函数 –

function  call(const sessionId: WideString; const resourcePath: WideString;
 const args: Variant): Variant; stdcall;

现在当我在我的代码中调用它时,我想看看返回的值是什么

var
p:WideString;
v:variant;
VarArray:variant;
begin

   //varArray := VarArrayCreate([0,50],varVariant);

   v := (httprio1 as  Mtest).call(a,'giftgit.gift','28184');


   //p := VarArrayget(V,[1] ) ;
   p := vartostr(v[1]);

我在最后一行得到了这个错误

无法将类型(数组变体)的变体转换为类型(字符串)

我试过varArray但同样的问题.
我该怎么解决这个问题?

谢谢

解决方法

该错误表明V [1]是变体数组.您可以检查它确实与VarIsArray(V [1])

我有几种方法可以帮助您显示它:

TPsVarDataType = (
    vdtDefault,// varEmpty
    vdtNull,vdtSmallint,vdtInteger,vdtSingle,vdtDouble,vdtCurrency,vdtDate,vdtOleStr,// varOleStr,varString,varUString
    vdtDispatch,vdtError,vdtBoolean,vdtVariant,vdtUnknown,vdtDecimal,vdtUndefined,vdtShortint,vdtByte,vdtWord,vdtLongWord,vdtInt64,{$IFDEF D2009_OR_LATER}
    vdtUInt64,{$ENDIF}
    vdtUnsupported
    {Usupported types
    VT_UI8  = 21,VT_INT  = 22,VT_UINT = 23,VT_VOID = 24,VT_HRESULT  = 25,VT_PTR  = 26,VT_SAFEARRAY    = 27,VT_CARRAY   = 28,VT_USERDEFINED  = 29,VT_LPSTR    = 30,VT_LPWSTR   = 31,VT_RECORD   = 36,VT_FILETIME = 64,VT_BLOB = 65,VT_STREAM   = 66,VT_STORAGE  = 67,VT_STREAMED_OBJECT  = 68,VT_STORED_OBJECT    = 69,VT_BLOB_OBJECT  = 70,VT_CF   = 71,VT_CLSID    = 72,VT_VERSIONED_STREAM = 73,VT_BSTR_BLOB    = 0xfff,VT_VECTOR   = 0x1000,VT_ARRAY    = 0x2000,VT_BYREF    = 0x4000,VT_RESERVED = 0x8000,VT_ILLEGAL  = 0xffff,VT_ILLEGALMASKED    = 0xfff,VT_TYPEMASK = 0xfff
    }
  );

const
  SPsVarDataTypes: array [TPsVarDataType] of string  = (
    'Default','Null','Smallint','Integer','Single','Double','Currency','Date','OleStr','Dispatch','Error','Boolean','Variant','Unknown','Decimal','Undefined','Shortint','Byte','Word','LongWord','Int64',{$IFDEF D2009_OR_LATER}
    'UInt64',{$ENDIF}
    'Unsupported'
  );

const
  SPsVarDataTypes: array [TPsVarDataType] of string  = (
    'Default',{$ENDIF}
    'Unsupported'
  );

  SPsVarArray = 'Array of %s';
  SPsVarByRef = '%s (Reference)';

function VariantToStr(V: Variant; IncludeType: Boolean = False): string;
begin
  if VarIsArray(V) then
    Result := VarArrayToStr(V)
  else
    case VarType(V) of
      varError:
        Result := Format('Error($%x)',[TVarData(v).VError]);
      varNull:
        Result := '#NULL';
      varEmpty:
        Result := '#EMPTY';
      varDate:
        Result := FormatDateTime(ShortDateFormat + ' ' + LongTimeFormat + '.zzz',V)
    else
      Result := VarToStr(V);
    end;
  if IncludeType then
    Result := Format('%s{%s}',[Result,VarTypeToString(VarType(V))]);
end;


function VarArrayToStr(v: Variant; Delimiter: Char = #0; LineDelimiter: Char =
    #13): string;
var
  i,j,d: Integer;
  line: string;
begin
  if VarIsArray(v) then
  begin
    if Delimiter = #0 then
      Delimiter := ListSeparator;
    if LineDelimiter = #0 then
      LineDelimiter := ListSeparator;
    d := VarArrayDimCount(v);
    // The elements
    case d of
      1:
      begin
        Result := '';
        for i := VarArrayLowBound(v,1) to VarArrayHighBound(v,1) do
          Result := Result + VariantToStr(v[i]) + Delimiter;
        if Length(Result) > 0 then
          SetLength(Result,Length(Result)-1);
      end;
      2:
      begin
        Result := '';
        if (VarArrayLowBound(v,1) <= VarArrayHighBound(v,1)) and
          (VarArrayLowBound(v,2) <= VarArrayHighBound(v,2)) then
        begin
          for i := VarArrayLowBound(v,1) do
          begin
            line := '';
            for j := VarArrayLowBound(v,2) to VarArrayHighBound(v,2) do
              line := line + VariantToStr(v[i,j]) + Delimiter;
            if Length(Result) > 0 then
              SetLength(line,Length(line)-1);
            Result := Result + LineDelimiter + Format('[%s]',[line]);
          end;
        end;
      end // 2
    else
      Result := 'Array Dim=' + IntToStr(d);
    end;
    Result := Format('[%s]',[Result]);
  end
  else
    Result := VarToStr(v);
end;


function VarTypeToString(varType: Integer): string;
var
  T: TPsVarDataType;
begin
  if varType = varString then
    Result := 'string'
  else
  begin
    T := VarTypeToPsVarDataType(varType);
    if T = vdtUnSupported then
      Result := IntToStr(varType and varTypeMask)
    else
      Result := SPsVarDataTypes[T];
  end;
  if (varType and varArray) <> 0 then
    Result := Format(SPsVarArray,[Result]);

  if (varType and varByRef) <> 0  then
    Result := Format(SPsVarByRef,[Result]);
end;


function VarTypeToPsVarDataType(Value: Word): TPsVarDataType;
var
  v: Word;
begin
  debugEnter('VarTypeToPsVarDataType');
  v := Value and varTypeMask;
  debugInt('Value',v);
  if v < Word(vdtUnsupported) then
    result := TPsVarDataType(v)
  else if v = varString then
    result := vdtOleStr
  {$IFDEF D2009_OR_LATER}
  else if v = varUString then
    result := vdtOleStr
  {$ENDIF}
  else
    result := vdtUnsupported;
  debugLeave;
end;

function PsVarDataTypeToVarType(Value: TPsVarDataType; IsArray: Boolean =
    False): Word;
begin
  if Value = vdtUnsupported then
    Result := varEmpty
  else
  begin
    Result := Word(Value);
    if IsArray then
      Result := Result or varArray;
  end;
end;

更新2012-09-20:好像我错过了字符串常量.添加.更新2012-11-02:TPsVarDataType,VarTypeToPsVarDataType()& VarTypeToPsVarDataType();

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读