delphi VariantToString  
官方Delphi 学习QQ群: 682628230(三千人)
频道

delphi VariantToString


【码霸】【北京】歼10(287413288) 2022/1/28 22:48:13
Vartype

【码霸】【北京】歼10(287413288) 2022/1/28 22:48:37
返回具体的Variant数据类型

【码霸】【北京】歼10(287413288) 2022/1/28 22:48:42
然后作具体转换

【码农】[大庆]软件高手(599081722) 2022/1/28 22:50:09
那样的话,有些类型我都不知道它是什么

【码农】[大庆]软件高手(599081722) 2022/1/28 22:50:23
用最简单的VarToStr试试看吧

【码霸】【北京】歼10(287413288) 2022/1/28 22:51:30
TVarData = packed record
   case Integer of
     0: (VType: TVarType;
         case Integer of
           0: (Reserved1: Word;
               case Integer of
                 0: (Reserved2, Reserved3: Word;
                     case Integer of
                       varSmallInt: (VSmallInt: SmallInt);
                       varInteger:  (VInteger: Integer);
                       varSingle:   (VSingle: Single);
                       varDouble:   (VDouble: Double);
                       varCurrency: (VCurrency: Currency);
                       varDate:     (VDate: TDateTime);
                       varOleStr:   (VOleStr: PWideChar);
                       varDispatch: (VDispatch: Pointer);
                       varError:    (VError: HRESULT);
                       varBoolean:  (VBoolean: WordBool);
                       varUnknown:  (VUnknown: Pointer);
                       varShortInt: (VShortInt: ShortInt);
                       varByte:     (VByte: Byte);
                       varWord:     (VWord: Word);
                       varLongWord: (VLongWord: LongWord);
                       varInt64:    (VInt64: Int64);
                       varUInt64:   (VUInt64: UInt64);
                       varString:   (VString: Pointer);
                       varAny:      (VAny: Pointer);
                       varArray:    (VArray: PVarArray);
                       varByRef:    (VPointer: Pointer);
                       varUString:  (VUString: Pointer);
                       varRecord:   (VRecord: TVarRecord);
                       //$ffff:     (VLargest: TLargestVarData);
                    );
                 1: (VLongs: array[0..{$IFDEF CPUX64}4{$ELSE}2{$ENDIF}] of LongInt);
              );
           2: (VWords: array [0..{$IFDEF CPUX64}10{$ELSE}6{$ENDIF}] of Word);
           3: (VBytes: array [0..{$IFDEF CPUX64}21{$ELSE}13{$ENDIF}] of Byte);
         );
     1: (RawData: array [0..{$IFDEF CPUX64}5{$ELSE}3{$ENDIF}] of LongInt);
 end;

【码霸】【北京】歼10(287413288) 2022/1/28 22:52:10
variant 是通用类型,不过里面有个字段,描述了具体的原始类型

【码霸】【北京】歼10(287413288) 2022/1/28 22:54:04
function VariantToString(const vData:Variant):string;
var
 Int_,vType,Size:Integer;
 Smallint_:Smallint;
 Single_ :Single;
 Double_ :Double;
 b:Byte;
 Value:string;
begin
 vType := VarType(vData);
 if vType = varOleStr then vType := varString;
 Result := MoveVarToStr(vType,Sizeof(Integer));
 case vType of
   varEmpty,varNull: begin  end;
   varSmallint:
     begin
       Smallint_ := vData;
       Result := Result + MoveVarToStr(Smallint_,Sizeof(Smallint_));
     end;
   varInteger :
     begin
       int_ := vData;
       Result := Result + MoveVarToStr(int_,Sizeof(int_));
     end;
   VarSingle:
     begin
       Single_ := vData;
       Result := Result + MoveVarToStr(Single_,Sizeof(Single_));
     end;
   varDouble,varCurrency,varDate:
    begin
      Double_ := vData;
      Result := Result + MoveVarToStr(Double_,Sizeof(Double_));
    end;
   varBoolean:
     begin
       if Boolean(vData) then b := 1 else b := 0;
       Result := Result  + char(b);
     end;
   varByte:
     begin
       b := vData;
       Result := Result + char(b);
     end;
   varString {,varOleStr} :
     begin
       Value := vData;
       Size  :=Length(Value);
       Result := Result + MoveVarToStr(Size,Sizeof(Integer)) +
         MoveVarToStr(Pointer(Value)^,Size);
     end;
   varArray or VarByte:
     begin
       Value := Sharetools.VariantArrayToString(vData);
       Size  :=Length(Value);
       Result := Result + MoveVarToStr(Size,Sizeof(Integer)) +
         MoveVarToStr(Pointer(Value)^,Size);
     end;
   else
     raise exception.Create('UnKnow Type');
 end;
end;

【码霸】【北京】歼10(287413288) 2022/1/28 22:54:13
以前D7的代码

【码霸】【北京】歼10(287413288) 2022/1/28 22:54:53
function MoveVarToStr(var P;iSize:Integer):string;
begin
 SetLength(Result,iSize);
 Move(Pointer(P),Pointer(Result)^,iSize);
end;



推荐分享
图文皆来源于网络,内容仅做公益性分享,版权归原作者所有,如有侵权请告知删除!
 

Copyright © 2014 DelphiW.com 开发 源码 文档 技巧 All Rights Reserved
晋ICP备14006235号-8 晋公网安备 14108102000087号

执行时间: 0.045906066894531 seconds