【码霸】【北京】歼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