string类型中装的是一个上传过来的图片
我直接让string类型=olevariant类型,显示出来的就不是图片了(使用string就可以)
不知该如何正确地将string转换成olevariant?????
我直接让string类型=olevariant类型,显示出来的就不是图片了(使用string就可以)
不知该如何正确地将string转换成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
appendchunk(string)方法将其保存到数据库时,数据能保存,但是,它将string中的大于chr(128)的字符存为chr(0),所以我再次从image字段中读出图片是就显示不出来。我想是可能是数据类型在作怪,于是我想转换其数据类型试一试。请高手能够帮助一下解决,或提供好网页上传文件的保存方法,谢谢!
Delphi将string转换为OleVariant是分为两步的,
string->widestring->OleVaraint
在string和Widestring相互转换的的时候,大于128的值转换为'?'
所以先手工写个函数将string转换为Widestring
然后将widestring付给Olevariant
用widestring用作Com接口参数时,如果有元素值为0也会出问题,我用Delphi6+Update2,可以将含0的Widestring传递
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;
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编译后传递的就有些问题
但存进去的数据读出来的不是图像(用asp可以读出图像)?