MemoryStreamToOleVariant 等一些函數

function MemoryStreamToOleVariant(Strm: TMemoryStream):OleVariant;
var
   Data: PByteArray;
begin
  Result := VarArrayCreate ([0, Strm.Size - 1], varByte);
  Data := VarArrayLock(Result);
  try
    Strm.Position := 0;
    Strm.ReadBuffer(Data^, Strm.Size);
  finally
    VarArrayUnlock(Result);
  end;
end;


function VariantArrayToString(const V: OleVariant): string;
var
  P: Pointer;
  Size: Integer;
begin
  Result := '';
  if VarIsArray(V) and (VarType(V) and varTypeMask = varByte) then
  begin
    Size := VarArrayHighBound(V, 1) - VarArrayLowBound(V, 1) + 1;
    if Size > 0 then
    begin
      SetLength(Result, Size);
      P := VarArrayLock(V);
      try
        Move(P^, Result[1], Size);
      finally
        VarArrayUnlock(V);
      end;
    end;
  end;
end;


function OleVariantToMemoryStream(OV: OleVariant):TMemoryStream;
var
  Data: PByteArray;
  Size: integer;
begin
  Result := TMemoryStream.Create;
  try
    Size := VarArrayHighBound (OV, 1) - VarArrayLowBound
(OV, 1) + 1;
    Data := VarArrayLock(OV);
    try
      Result.Position := 0;
      Result.WriteBuffer(Data^, Size);
    finally
      VarArrayUnlock(OV);
    end;
  except
    Result.Free;
    Result := nil;
  end;
end;

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;


function MoveVarToStr(var P;iSize:Integer):string;
begin
  SetLength(Result,iSize);
  Move(Pointer(P),Pointer(Result)^,iSize);
end;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章