Delphi中TMemoryStream的用法

本文详细介绍了在Delphi中使用TStream类进行数据读写的多种技巧,包括TMemoryStream和TFileStream的实例操作,如从文件加载图像、修改内存内容、与剪贴板交互及数据库操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.文件流 TStreamMemoery 读写内存 

var  
	BitmapMemoryStream:TMemoryStream;  
	Bitmap1:TBitmap;  
  
procedure TForm.Button1Click(Sender:TObject);  
begin  
	BitmapmemroyStream:=TmemoryStream.Create; file://建立MemoryStream  
	Bitmap1:=TBitmap.Create;  
	try  
		Bitmap1.LoadFromFile(’d:\Bitmap1.bmp’);  
	except  
		ShowMessage(’Error On LoadFile bitmap1.bmp’);  
	end;  
end;   
  
procedure TForm.Button2Click(Sneder:Tobject);  
begin  
	if Assigned(Bitmap1) then  
	Bitmap1.SaveToStream(BitmapmemoryStream);  
end;  
  
procedure TForm.Button3Click(Sender:TObject);  
begin  
	if BitmapMemoryStream<>nil then  
	begin  
		try  
			BitmapMemroyStream.SaveToFile(’Bitmap1.str’); file://内存流保存,大小与  file://Bitmap1.bmp一样  
		except  
			showmessage(’error on access memory!’);  
		end;  
	end;  
end;  
  
procedure TForm.Button4Click(Sender:TObject);  
var  
	Buffer:Array[0..53] of char;  
begin  
	if Assigned( BitmapMemroyStream) then  
	try  
		BitmapMemroyStream.Seek(0,soFromBeginning);  
		BitmapMemoryStream.Read(Buffer,54);  
	if Buffer[0]=’B’ and Buffer[1]=’M’ then file://改写内存内容  
	begin  
		BitmapMemoryStream.Seek(0,soFromBeginning);  
		BitmapmemoryStream.Write(’ICE’,3);   
		Button3Click(Sender);//将改写的内容写入文件  
	end;  
	except  
		ShowMessage(’error On Access memroyStream’);  
	end;  
end; 

2.如何将一个流的内容写入到剪贴板中,并处理

var  
	hbuf : THandle;  
	bufptr : Pointer;  
	mstream : TMemoryStream;  
begin  
	mstream := TMemoryStream.Create;  
	try  
		{-- 处理流的代码 --}  
		hbuf := GlobalAlloc(GMEM_MOVEABLE, mstream.size);  
	try  
		bufptr := GlobalLock(hbuf);  
		try  
			Move(mstream.Memory^, bufptr^, mstream.size);  
			Clipboard.SetAsHandle(CF_MYFORMAT, hbuf);  
		finally  
			GlobalUnlock(hbuf);  
		end;  
	except  
		GlobalFree(hbuf);  
		raise;  
	end;  
	finally  
		mstream.Free;  
	end;  
end;  
//请注意不要将分配的全局缓冲区释放,这个工作由剪贴板来完成,在读出数据中  
//你应该将它复制后处理。  
  
//将剪贴板内容读出来  
var  
	hbuf : THandle;  
	bufptr : Pointer;  
	mstream : TMemoryStream;  
begin  
	hbuf := Clipboard.GetAsHandle(CF_MYFORMAT);  
	if hbuf <> 0 then begin  
		bufptr := GlobalLock(hbuf);  
		if bufptr <> nil then begin  
			try  
				mstream := TMemoryStream.Create;  
				try  
					mstream.WriteBuffer(bufptr^, GlobalSize(hbuf));  
					mstream.Position := 0;  
					{-- 处理流的代码 --}  
				finally  
					mstream.Free;  
				end;  
			finally  
				GlobalUnlock(hbuf);  
			end;  
		end;  
	end;  
end; 

3.在Dephi中使用TStream读写数据的技巧

a.btnRead的Click事件,这里演示了TFileStream的用法。

var  
    MS: TFileStream;  
begin  
    if OpenDialog1.Execute then  
    begin  
        MS:=TFileStream.Create  
        (OpenDialog1.FileName, fmOpenRead);  
        Image1.Picture.Bitmap.LoadFromStream(MS);  
        MS.Free;  
    end;  
end;

b.btnInvert的Click事件,这里演示了TMemoryStream的用法。其中使用了Invert函数,这是一个简单的将图象反色的函数(仅对真彩图象有效),它返回一个指向处理过的图象数据块的指针。

 

var  
	MS: TMemoryStream;  
	pImage: pointer;  
begin  
	MS:=TMemoryStream.create;  
	Image1.Picture.Bitmap.SaveToStream(MS);  
	MS.Position:=0;  
	pImage:=Invert(MS.Memory, MS.size);   //file://Memory属性是指向实际内存块的指针  
	MS.Write(pImage^,MS.size);  
	MS.Position:=0;   //file://上一行代码使指针移到了Stream末尾,所以要复位  
	Image1.Picture.Bitmap.LoadFromStream(MS);  
	FreeMem(pImage);   
	MS.Free;  
end;  
  
//Invert函数如下:  
function TForm1.Invert(pImage: pointer; size: Integer): pointer;  
var  
	pData, pMem: PChar;  
	i: Integer;  
begin  
	pMem:=AllocMem(size);  
	CopyMemory(pMem,pImage,size);  
	pData:=pMem+54;  
	for i:=0 to size-54-1 do  
	begin  
		pData^:=Char(not integer(pData^));  
		pData:=pData+1;  
	end;  
	Result:=pMem;  
end;

c.btnSave的Click事件,这里演示了TMemoryStream的另一种用法,将Stream中的数据写到数据库

var  
    MS: TMemoryStream;  
begin  
    MS:=TMemoryStream.create;  
    Image1.Picture.Bitmap.SaveToStream(MS);  
    MS.Position:=0;  
    Table1.Append;   
    file://在数据库中添加一条记录  
    TBlobField(Table1.FieldbyName  
    (’image’)).LoadFromStream(MS);  
    Table1.Post;   
    file://将所作的更新写入数据库  
end;  

d.DBNavigator1的Click事件,这里演示了TBlobStream的用法,使用了和写入时不同的方法来读出数据库的图象数据。

var  
    MS: TStream;  
begin  
    with Table1 do  
    MS:=CreateBlobStream  
    (FieldbyName(’image’),bmRead);  
    Image1.Picture.Bitmap.  
    LoadFromStream(MS);  
    MS.Free;  
end;   

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值