Mega Code Archive

 
Categories / Delphi / System
 

Memorystream i sıkıstırıp acmak

Uses ZLib; { Compress a stream } procedure CompressStream(inpStream, outStream: TStream); var InpBuf,OutBuf: Pointer; InpBytes,OutBytes: integer; begin InpBuf := nil; OutBuf := nil; try GetMem(InpBuf,inpStream.size); inpStream.Position := 0; InpBytes := inpStream.Read(InpBuf^,inpStream.size); CompressBuf(InpBuf,InpBytes,OutBuf,OutBytes); outStream.Write(OutBuf^,OutBytes); finally if InpBuf <> nil then FreeMem(InpBuf); if OutBuf <> nil then FreeMem(OutBuf); end; end; { Decompress a stream } procedure DecompressStream(inpStream, outStream: TStream); var InpBuf,OutBuf: Pointer; OutBytes,sz: integer; begin InpBuf := nil; OutBuf := nil; sz := inpStream.size-inpStream.Position; if sz > 0 then try GetMem(InpBuf,sz); inpStream.Read(InpBuf^,sz); DecompressBuf(InpBuf,sz,0,OutBuf,OutBytes); outStream.Write(OutBuf^,OutBytes); finally if InpBuf <> nil then FreeMem(InpBuf); if OutBuf <> nil then FreeMem(OutBuf); end; outStream.Position := 0; end; { Example: Compress the contents of RichEdit1 and calculate the compression rate. Then save the stream to a file (ms2.dat) Beispiel: Komprimiert den Inhalt von RichEdit1 und berechnet die Kompressionsrate. Dann wird der Stream in eine Datei (ms2.dat) gespeichert. } procedure TForm1.Button1Click(Sender: TObject); var ms1, ms2 : TMemoryStream; begin ms1 := TMemoryStream.Create; try ms2 := TMemoryStream.Create; try RichEdit1.Lines.SaveToStream(ms1); CompressStream(ms1,ms2); ShowMessage(Format('Stream Compression Rate: %d %%', [round(100 / ms1.Size * ms2.Size)])); ms2.SaveToFile('C:\ms2.dat'); finally ms1.Free; end; finally ms2.Free; end; end; { Loads the stream from a file (ms2.dat) and decompresses it. Then loads the Stream to RichEdit1. Lädt den komprimierten Stream von einer Datei (ms2.dat) und dekomprimiert ihn. Dann wird der Stream wieder in RichEdit1 geladen. } procedure TForm1.Button2Click(Sender: TObject); var ms1, ms2 : TMemoryStream; begin ms1 := TMemoryStream.Create; try ms2 := TMemoryStream.Create; try ms1.LoadFromFile('C:\ms2.dat'); DecompressStream(ms1,ms2); RichEdit1.Lines.LoadFromStream(ms2); finally ms1.Free; end; finally ms2.Free; end; end;