Данный материал мной лично не проверен, но возможно, будет полезен,
особенно в части передачи объектов через Variant и обратно.
unit VariantsUtil;
interface
uses
Variants,
SysUtils
;
type
TVariantArray = array of Variant;
//: convert an array of const to an array of variants
procedure ConstArrayToVariantArray(const AValues : array of const;
var ADest: TVariantArray);
//: convert an array of variant to a text representation
function VariantArrayToString(const AVarArray: TVariantArray): string;
//: convert a variant to an integer
function Var2Int(Value: Variant): Integer;
//: convert a variant to a pointer
function Var2Ptr(Value: Variant): Pointer;
//: convert a pointer to a variant
function Ptr2Var(Value: Pointer): Variant;
//: convert a variant to an object
function Var2Obj(Value: Variant): TObject;
//: convert an object to a variant
function Obj2Var(Value: TObject): Variant;
//: convert a variant to an interface
function Var2Intf(Value: Variant): IInterface;
//: convert an interface to a variant
function Intf2Var(Value: IInterface): Variant;
implementation
// ConstArrayToVariantArray
//
procedure ConstArrayToVariantArray(const AValues : array of const;
var ADest: TVariantArray);
var
i : Integer;
begin
SetLength(ADest, Length(AValues));
for i := Low(AValues) to High(AValues) do
begin
with AValues[i] do
begin
case VType of
vtInteger: ADest[i] := VInteger;
vtInt64: ADest[i] := VInt64^;
vtBoolean: ADest[i] := VBoolean;
vtChar: ADest[i] := VChar;
vtExtended: ADest[i] := VExtended^;
vtString: ADest[i] := VString^;
vtPointer: ADest[i] := Integer(VPointer);
vtPChar: ADest[i] := StrPas(VPChar);
vtObject: ADest[i]:= Pointer(VObject);
vtAnsiString: ADest[i] := String(VAnsiString);
vtCurrency: ADest[i] := VCurrency^;
vtVariant: ADest[i] := VVariant^;
vtInterface: ADest[i]:= Integer(VPointer);
else
raise Exception.Create ('invalid data type ' + IntToStr(VType))
end;
end;
end;
end;
// VariantArrayToString
//
function VariantArrayToString(const AVarArray: TVariantArray): string;
var
I: Integer;
begin
Result := '';
for i := Low(AVarArray) to High(AVarArray) do
begin
if Length(Result) > 0 then
Result := Result + ', ';
if VarIsNull(AVarArray[I]) then
Result := Result + 'ignored'
else
Result := Result + VarToStr(AVarArray[I]);
end;
Result := '('+Result+')';
end;
function Var2Int(Value: Variant): Integer;
begin
Result := Value;
end;
function Var2Ptr(Value: Variant): Pointer;
begin
Result := Pointer(Var2Int(Value));
end;
function Ptr2Var(Value: Pointer): Variant;
begin
Result := Integer(Value);
end;
function Var2Obj(Value: Variant): TObject;
begin
Result := TObject(Var2Ptr(Value));
end;
function Obj2Var(Value: TObject): Variant;
begin
Result := pointer(Value);
end;
function Var2Intf(Value: Variant): IInterface;
begin
Result := IInterface(Var2Ptr(Value));
end;
function Intf2Var(Value: IInterface): Variant;
begin
Result := Ptr2Var(Value);
end;
end.
Free Pascal Справочник v0.05 © 2007-2025 Igor Salnikov aka SunDoctor