string类型中装的是一个上传过来的图片
我直接让string类型=olevariant类型,显示出来的就不是图片了(使用string就可以)
不知该如何正确地将string转换成olevariant?????

解决方案 »

  1.   

    老大你问问题能不能写明白些?你的string类型中装的是什么格式的?如果是string类型那是如何把它显示成图片的(使用什么控件?...)?能否把你操作的整个过程说一下?
      

  2.   

    操作图像,最好使用流,不要string,以下请参考://这里先给你两个函数,用来转换OLEVariant和TMemoryStream: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 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;
    //例子:
    假设服务器端有两个方法,SetBinary and GetBinary, 并且在服务程序的主窗口有两个TImage和一个Memo. 下面给出两个方法:procedure TBinaryDataObject.GetBinary(out BinaryData: OleVariant);
    var MemoryStream: TMemoryStream;
    begin
      MemoryStream := TMemoryStream.Create;
      try
        Form1.Image1.Picture.Bitmap.SaveToStream(MemoryStream);
        BinaryData := MemoryStreamToOleVariant(MemoryStream);
        Form1.Memo1.Lines.Add(format('Bitmap is send out, size=%d',[MemoryStream.size]));
      finally
        MemoryStream.Free;
      end;
    end;procedure TBinaryDataObject.SetBinary(BinaryData: OleVariant);
    var MemoryStream: TMemoryStream;
    begin
      try
        MemoryStream := OleVariantToMemoryStream(BinaryData);
        MemoryStream.Position := 0;
        Form1.Image2.Picture.Bitmap.LoadFromStream(MemoryStream);
        Form1.Memo1.Lines.Add(format('Bitmap is recieved, size=%d',[MemoryStream.size]));
      finally
        MemoryStream.free;
      end;
    end;与服务器相对应在客户端,同样有两个图像,一个用来发送给服务器,一个用来接受显示的图像,有下列两段程序:
      TForm1 = ....
        ....
      public
        { Public declarations }
        Binary: IBinaryDataObject; //IBinaryDataObject是服务器的COMObject
      end;implementationprocedure TForm1.ButtonPutPictureClick(Sender: TObject);
    var
      OV: OleVariant;
      Stream: TMemoryStream;
    begin
      if Binary = nil then
        Binary := CoBinaryDataObject.CreateRemote(你的服务器机器名);
        Stream := TMemoryStream.Create;
      try
        Image1.Picture.Bitmap.SaveToStream(Stream);
        OV := MemoryStreamToOleVariant(Stream);
        Binary.SetBinary(OV);
      finally
        Stream.free;
      end;
    end;procedure TForm1.ButtonGetPictureClick(Sender: TObject);
    var
      OV: OleVariant;
      Stream: TMemoryStream;
    begin
      if Binary = nil then
        Binary := CoBinaryDataObject.CreateRemote(你的服务器机器名);  Stream := TMemoryStream.Create;
      try
        Binary.GetBinary(OV);
        Stream := OleVariantToMemoryStream(OV);
        Stream.Position := 0;
        Image2.Picture.Bitmap.LoadFromStream(Stream);
      finally
        Stream.free;
      end;
    end;F1oneverest的声明:引用自DelphiBBS
      

  3.   

    我用web server application做的是一个isapi,我通过网页上的<input type=file>将图片上传,并将图片取出存到一个string里,我使用response.content:=string;可以在网页上显示图片,并且也可以做到将图片保存为文件,但我使用
    appendchunk(string)方法将其保存到数据库时,数据能保存,但是,它将string中的大于chr(128)的字符存为chr(0),所以我再次从image字段中读出图片是就显示不出来。我想是可能是数据类型在作怪,于是我想转换其数据类型试一试。请高手能够帮助一下解决,或提供好网页上传文件的保存方法,谢谢!
      

  4.   

    你的问题好像是在于String里存放了大于128的值
    Delphi将string转换为OleVariant是分为两步的,
    string->widestring->OleVaraint
    在string和Widestring相互转换的的时候,大于128的值转换为'?'
    所以先手工写个函数将string转换为Widestring
    然后将widestring付给Olevariant
    用widestring用作Com接口参数时,如果有元素值为0也会出问题,我用Delphi6+Update2,可以将含0的Widestring传递 
      

  5.   


    function StringToVariant(S: String): OleVariant;
    var
      AStream: TStringStream;
    begin
      if S <> '' then
      begin
        AStream := TStringStream.Create(S);
        try
          AStream.Seek(0, soFromBeginning);
          Result:=VarArraycreate([0, AStream.size-1], VarByte);
          OleBuffer:=VarArrayLock(Result);
          AStream.ReadBuffer(OleBuffer^, AStream.Size);
          VarArrayUnlock(Result);
        finally
          AStream.Free;
        end;
      end else
        Result := UnAssigned;
    end;
      

  6.   

    Function StrToWStr(const aStr:String):Widestring;
    var
      i,strNum:Integer;
      tmpREsult:WideString;
    begin
      result := '';
      strNum := Length(aStr);
      if strNum > 0 then
      begin
        SetLength(tmpResult,strNum);
        for i:= 1 to strNum do
          tmpResult[i] := WChar(aStr[i]);
        result := tmpResult;
      end;end;Function WStrToStr(const aWStr:WideString):String;
    var
      i,strNum:Integer;
      tmpREsult:String;
    begin
      result := '';
      strNum := Length(aWStr);
      if strNum > 0 then
      begin
        SetLength(tmpResult,strNum);
        for i:= 1 to strNum do
          tmpResult[i] := Char(aWStr[i]);
        result := tmpResult;
      end;
    end;将string付给olevariant,先转换为Widestring,再赋值,要是用缺省转换就会有问题
    同样,将olevariant转为string,应先付给一个widestring变量,再用转换函数转换为string.
    COM接口参数没有string类型,Delphi缺省的将string转为Widestring,如果你用了一个传递128~255之间字符的string变量,那么先自己先把string转为widestring
    而且用update2,D6编译后传递的就有些问题
      

  7.   

    保存问题已经解决,
    但存进去的数据读出来的不是图像(用asp可以读出图像)?
      

  8.   

    通过TMemoryStream来做中间转换!