zoukankan      html  css  js  c++  java
  • Variant <-->Record Variant <-->Stream

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

    //   OleVariant   ---->   TARec
    function VariantToRecord(value:OleVariant):TParamRecord;
    var P:Pointer;
    begin
      P:=VarArrayLock(value);
      Move(P^,Result,sizeof(TParamRecord));
      VarArrayUnlock(value);
    end;

     

    好像不好使。先留着。

    以下不知道好使否,也先留着。

    Variant --> Stream

    var ov: OleVariant;
      ms: TStream; p: Pointer;
    begin
      ov := dmMain.ComConnection.AppServer.TimeZone;
      ms := TMemoryStream.Create;
      ms.Position := 0;
      p := VarArrayLock(ov);
      ms.Write(p^, VarArrayHighBound(ov, 1)); //這句可否改進?
      VarArrayUnlock(ov);

      ms.Position := 0;
      ...
      ms.Free;
    end;

    Stream --> Variant

    function TTCanteenSvr.Get_TimeZone: OleVariant;
    var
      AStream: TStream;
      MyBuffer: Pointer;
    begin
      try
        AStream := TFileStream.Create(, fmOpenRead);
        Result := VarArrayCreate([0, AStream.Size - 1], VarByte);
        MyBuffer := VarArrayLock(Result);
        AStream.ReadBuffer(MyBuffer^, AStream.Size);
        VarArrayUnlock(Result);
      finally
        AStream.Free;
      end;

     

    Record --> Stream

     

    var r,r2:TStockInfo;p:Pointer;iRecSize,StringSize:Integer;
      pc:PChar;
      s:string;v:Variant;
      ms:TMemoryStream;
    begin
    //  TStockInfo=record
    //    SecurityID:string[12];
    //    CompanyID:string[12];
    //    InternalID:string[12];
    //  end;
      // 赋值Record
      r.SecurityID:='123';
      r.CompanyID:='456';
      r.InternalID:='789';
      iRecSize:=SizeOf(TStockInfo);
      StringSize:=SizeOf(string);
      GetMem(p,iRecSize);
      GetMem(pc,StringSize);
      ms:=TMemoryStream.Create;
      // Move测试
      Move(r,p^,iRecSize);  // 赋值到指针
      Move(p^,r2,iRecSize); // 赋值到验证Record
      ms.WriteBuffer(p,iRecSize);
      ms.SaveToFile(AppPath+'test.txt');
    //  ShowMessage(r2.SecurityID+','+r2.CompanyID+','+r2.InternalID);
      // 移动指针
      // 这里需要转换指针类型,string->PChar Integer->PInteger Double->PDouble 等等
    //  Inc(PChar(p),StringSize);   // 跳过SecurityID
      // 赋值CompanyID
    //  Move(P^,pc,StringSize);
    //  Move(P^,s,StringSize);
    //  ShowMessage(StrPas(pc));
    //  Dec(PChar(p),StringSize); // 回来
      FreeMem(p);               // 并且释放
      ms.Free;
    end;

  • 相关阅读:
    [Cerc2013]Magical GCD
    UVA 1393 Highways
    UVA 10214 Trees in a Wood
    [SDOI2010]大陆争霸
    Oracle逻辑读详解
    DBA_2PC_PENDING (转)
    oracle autotrace使用
    升级oracle 9i到10g
    VMware 虚拟机中添加新硬盘的方法(转载)
    ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var mysql (转)
  • 原文地址:https://www.cnblogs.com/key-ok/p/3380425.html
Copyright © 2011-2022 走看看