ÄãµÄλÖãºÈí¼þ> Éè¼ÆÔÚÏß> ÍøÒ³ÌÕ°É> ¼¼Êõƽ̨> HTMLѧϰ>
ÔÚDephiÖÐʹÓÃTStream¶ÁдÊý¾ÝµÄ¼¼ÇÉ
2000-06-26 00:00:00¡¤ £­¡¤Öйú¼ÆËã»úÊÀ½ç³ö°æ·þÎñ¹«Ë¾

p>----ÔÚDephiÖÐÌṩÁËÒ»¸ö³éÏóµÄÊý¾ÝÀàÐÍTStreamÀ´Ö§³Ö¶ÔÁ÷ʽÊý¾ÝµÄ²Ù×÷¡£ÕâЩÊý¾Ýͨ³£À´×ÔÎļþ¡¢Êý¾Ý¿â¡¢ÄÚ´æ¶ÔÏó¡¢OLE¶ÔÏóµÈ£¬TStreamÌṩÁËͳһ¡¢¼ò½àµÄ·½·¨À´½øÐÐÊý¾ÝµÄ¶Áд¡£ÔÚͨ³£Çé¿öÏ£¬ÎÒÃDz¢²»ÐèÒªÖ±½ÓʹÓÃTStreamÀ࣬¶ÔÁ÷ʽÊý¾ÝµÄ¶Áд·â×°ÔÚVCL¿Ø¼þµÄ·½·¨ÖС£µ«ÊÇÈç¹ûÕâЩ·½·¨ÎÞ·¨Âú×ãÎÒÃǵÄÒªÇ󣬾ÍÐèÒª×Ô¼ºÊÖ¶¯¿ØÖÆÊý¾ÝµÄ¶Áд¡£
Ò»¡¢ TStreamµÄ³£Óõķ½·¨ºÍÊôÐÔ£º
---- 1. function Read(var Buffer; Count: Longint): Longint; virtual; abstract
---- 2. function Write(const Buffer; Count: Longint): Longint; virtual; abstract;
---- 3. function Seek(Offset: Longint; Origin: Word): Longint; virtual; abstract;
---- 4. property Position: Longint;
---- 5. property Size: Longint

---- Read£¬Write£¬Seek¶¼ÊÇ´¿Ð麯Êý£¬ÌṩÁËÊý¾Ý¶ÁдºÍ¶¨Î»µÄ³éÏóµÄ·½·¨¡£Read·½·¨½«Êý¾Ý´ÓStreamÖжÁµ½Buffer»º³åÇøÖУ¬WriteÔòʵÏÖÏà·´µÄ²Ù×÷£¬·µ»ØÖµ±íʾʵ¼Ê¶ÁдÊý¾ÝµÄ´óС¡£SeekÌṩÁËÔÚStreamÖÐÒÆ¶¯Êý¾ÝÖ¸ÕëµÄ·½·¨¡£²ÎÊýOrigin¿ÉÒÔÈ¡soFromBeginning£¬soFromCurrent£¬soFromEnd Èý¸öÖµ£¬OffsetÊÇÆ«ÒÆÁ¿£¬·µ»ØÖµÊǵ±Ç°StreamÊý¾ÝÖ¸ÕëµÄλÖá£

---- Position±íʾÁËÊý¾ÝÖ¸ÕëÔÚStreamÖеÄλÖá£Õâ¸öÊôÐÔÊǿɶÁдµÄ£¬Ëüʵ¼ÊÉϾÍÊÇͨ¹ýµ÷ÓÃSeek·½·¨ÊµÏֵģ¬ËùÒÔʵ¼ÊʹÓÃʱʹÓÃÕâ¸öÊôÐÔ¸üΪ·½±ãһЩ¡£SizeÊôÐÔ±íʾµ±Ç°StreamµÄ´óС£¬¶ÔÓÚ²»Í¬µÄStream£¬ÓÐЩʱºòÊÇÖ»¶ÁµÄ¡£

¶þ¡¢ StreamÊý¾ÝµÄ¶Áд¡£
---- 1. SaveToStream(Stream: TStream ); //½«ÀàÖеÄÊý¾Ýдµ½StreamµÄµ±Ç°Î»ÖÃÖÐ
---- 2. LoadFromStream(Stream: TStream); //´Óµ±Ç°Î»ÖöÁÈëStreamÀïµÄÊý¾Ý
---- ʵ¼ÊʹÓÃʱÎÒÃÇ»ù±¾ÉÏֻҪʹÓÃÉÏÃæÁ½¸öº¯Êý¾Í¿ÉÒÔÁË¡£

Èý¡¢ Àý×Ó
---- TStreamµÄ¼Ì³ÐÊ÷ͼÈçͼ1Ëùʾ(ÂÔ)£¬Êµ¼ÊʹÓÃʱ±È½Ï³£ÓõÄÊ ileStream£¬TMemoryStream£¬TblobStream£¬¾ÍÒÔÕâÈýÖÖÁ÷¾ÙÒ»Àý˵Ã÷¾ßÌåÓ÷¨¡£

---- ´´½¨Ò»¸ö´°ÌåForm1£¬·ÅÖÃÈý¸ö°´Å¥btnRead£¬btnInvert£¬btnSaveºÍÒ»¸öÎļþ´ò¿ª¶Ô»°¿òOpenDialog1ÒÔ¼°Êý¾Ý¿Ø¼þDataSource1£¬Table1£¬test.

---- ʹÓÃDephiÌṩµÄDatabase Desktop´´½¨Ò»¸ö±ítest£¬±íÀïÓÐÒ»¸ö×Ö¶ÎÓòImage£¬Êý¾Ý¿âÎļþÃû´æÎªtest.db¡£ÔÚ´°ÌåÉÏ·ÅÖÃÒ»¸öTDatabase¿Ø¼þdbTest£¬Ò»¸öTTable¿Ø¼þTable1,Ò»¸öDataSource¿Ø¼þDataSource1,Ò»¸öTDBNavigator¿Ø¼þDBNavigator1¡£½«dbTestÓë¸Õ²ÅDesktop´´½¨µÄÊý¾Ý¿âÏàÁ¬£¬Table1µÄTableNameÊôÐÔÉèΪtest.db£¬DataSource1µÄDataSetÊôÐÔÉèΪTable1£¬DBNavigator1µÄDataSourceÊôÐÔÉèΪDataSource1£¬VisibleButtonsÊôÐÔǰËĸöÉèΪTRUE¡£´ËÍ⣬½«dbtestµÄConnectedÉèΪTRUE£¬Table1µÄActiveÊôÐÔÉèΪTRUE£¬Ê¹µÃÊý¾Ý¿âÒ»¿ªÊ¼¾Í´¦ÓÚ´ò¿ª×´Ì¬¡£

---- ʼþ´úÂë±àдÈçÏ£º
---- 1. 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;

--- 2. 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);
//MemoryÊôÐÔÊÇÖ¸Ïòʵ¼ÊÄÚ´æ¿éµÄÖ¸Õë
MS.Write(pImage^,MS.size);
MS.Position:=0;
//ÉÏÒ»ÐдúÂëʹָÕëÒÆµ½ÁË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;

--- 3. btnSaveµÄClickʼþ£¬ÕâÀïÑÝʾÁËTMemoryStreamµÄÁíÒ»ÖÖÓ÷¨£¬½«StreamÖеÄÊý¾Ýдµ½Êý¾Ý¿âÖÐÈ¥¡£
var
MS: TMemoryStream;
begin
MS:=TMemoryStream.create;
Image1.Picture.Bitmap.SaveToStream(MS);
MS.Position:=0;
Table1.Append;
//ÔÚÊý¾Ý¿âÖÐÌí¼ÓÒ»Ìõ¼Ç¼
TBlobField(Table1.FieldbyName(image)).LoadFromStream(MS);
Table1.Post;
//½«Ëù×÷µÄ¸üÐÂдÈëÊý¾Ý¿â
end;

-- ËÄ. DBNavigator1µÄClickʼþ£¬ÕâÀïÑÝʾÁËTBlobStreamµÄÓ÷¨£¬Ê¹ÓÃÁ˺ÍдÈëʱ²»Í¬µÄ·½·¨À´¶Á³öÊý¾Ý¿âµÄͼÏóÊý¾Ý¡£

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

--- ÏÖÔÚÄãÒѾ­Äܹ»ÔÚÎļþ£¬Êý¾Ý¿â£¬ÄÚ´æÖÐÈÎÒâ¶ÁдÊý¾ÝÁ÷ÁË¡£ÊÔÊÔ¿´°É£¡



¡¾·¢±íÆÀÂÛ¡¿¡¾¹Ø±Õ´°¿Ú¡¿


.¼àÊÓ¼ôÌù°åÄÚÈÝ
.ÇáÇáËÉËÉÔÚDELPHI3.0ÖÐʵÏÖÈý̬°´Å¥