variant操作

function DataSetToVar(ADataSet: TDataSet;
Recs: Integer): olevariant;
var
DPW: TDataPacketWriter;
V: OleVariant;
BK: TBookMarkStr;
begin
if ADataSet <> nil then
try
  DPW := TDataPacketWriter.Create;
  DPW.PacketOptions := [grMetaData];
  ADataSet.DisableControls;
  BK := ADataSet.Bookmark;
  ADataSet.First;
  DPW.GetDataPacket(ADataSet, Recs, V);
finally
  DPW.Free;
  ADataSet.Bookmark := BK;
  ADataSet.EnableControls;
end;
Result := V;
end;
recs代表要转换的记录,-1为全部.
用法:
ClientDataSet1.Data := DataSetToVar(AdoQuery1, -1);

TARec=record  
        a:shortstring;  
        b:shortstring;  
        c:shortstring;  
  end  
   
   
  //     TARec   --->   Variant  
  function   RecordToVariant(value:TARec):OleVariant;  
  var  
      P:Pointer;  
  begin  
      Result   :=   VarArrayCreate([0,sizeof(TARec)],varByte);  
      P             :=   VarArrayLock(Result);  
      Move(value,P^,sizeof(P));  
      VarArrayUnlock(Result);  
  end;  
   
   
  //   OleVariant   ---->   TARec  
  function   VariantToRecord(value:OleVariant):TARec;  
  var  
      P:Pointer;  
  begin  
      P:=   VarArrayLock(value);  
      Move(P^,Result,sizeof(TARec));  
      VarArrayUnlock(value);  
  end;


如果你想进行流操作,可以用ClientDataSet1.SaveToStream和ClientDataSet1.LoadFromStream
也可用进行如下函数:
function VarToStream(Const Data: OleVariant): TStream;
var
P: Pointer;
Stream: TStream;
begin
Stream := TMemoryStream.Create;
P := VarArrayLock(Data);
try
  Stream.write(P^, VarArrayHighBound(Data, 1)+1);
finally
  VarArrayUnlock(Data);
end;
Result := Stream;
end;
function StreamToVar(Stream: TStream): OleVariant;
var
P: Pointer;
begin
Result := VarArrayCreate([0, Stream.size -1],Varbyte);
P := VarArrayLock(Result);
Try
  Stream.Position := 0;
  Stream.Read(P^, Stream.size);
Finally
  VarArrayUnlock(Result);
end;
end;

 

--VariantToBuff

procedure VariantToBuff(Const Data: OleVariant; Buf:Pointer; Var Len:Integer);
var
    P: Pointer;
begin
    Len:=VarArrayHighBound(Data, 1)+1;
    Buf:=AllocMem(Len);
    P := VarArrayLock(Data);
    Try
        if Len>0 then
            CopyMemory(Buf,P,Len);
    Finally
        VarArrayUnlock(Data);
    end;
end;



function BuffToVariant(Var Buf; Len:Integer): OleVariant;
var
    P: Pointer;
begin
    Result := VarArrayCreate([0, Len -1],Varbyte);
    P := VarArrayLock(Result);
    Try
        if Len>0 then
            CopyMemory(P, PChar(@Buf),Len);
    Finally
        VarArrayUnlock(Result);
    end;
end;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值