home *** CD-ROM | disk | FTP | other *** search
- unit MsgStack;
- {------------------------------------------------------------------------------}
- { Memory Compression sample using The Xceed Zip Compression Library 4 }
- { For Delphi 3, 4 and 5 }
- { Copyright (c) 1999 Xceed Software Inc. }
- {------------------------------------------------------------------------------}
-
- interface
-
- uses
- Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
- StdCtrls, OleCtrls, XceedZipLib_TLB;
-
- type
- PCompressedMessage = ^TCompressedMessage;
- TCompressedMessage = record
- vaCompressed : OleVariant;
- pNext : PCompressedMessage;
- end;
-
- TfrmMessageStack = class(TForm)
- Label1: TLabel;
- Label2: TLabel;
- mmoAdd: TMemo;
- btAdd: TButton;
- Label3: TLabel;
- edtCount: TEdit;
- btRemove: TButton;
- Label4: TLabel;
- mmoRemoved: TMemo;
- xComp: TXceedCompression;
- procedure btAddClick(Sender: TObject);
- procedure btRemoveClick(Sender: TObject);
- private
- { Private declarations }
- pHeadMessage : PCompressedMessage;
- nCount : Integer;
- public
- { Public declarations }
- constructor Create( AOwner: TComponent ); override;
- destructor Destroy; override;
- end;
-
- var
- frmMessageStack: TfrmMessageStack;
-
- implementation
-
- {$R *.DFM}
-
- constructor TfrmMessageStack.Create( AOwner: TComponent );
- begin
- inherited Create( AOwner );
- pHeadMessage := nil;
- nCount := 0;
- end;
-
- destructor TfrmMessageStack.Destroy;
- var
- pCurrent : PCompressedMessage;
- begin
- while Assigned( pHeadMessage ) do
- begin
- pCurrent := pHeadMessage;
- pHeadMessage := pHeadMessage^.pNext;
-
- Dispose( pCurrent );
- end;
-
- nCount := 0;
- inherited Destroy;
- end;
-
- procedure TfrmMessageStack.btAddClick(Sender: TObject);
- var
- nOrigSize : LongInt;
- nCompSize : LongInt;
- pNew : PCompressedMessage;
- vaSource : OleVariant;
- xResult : xcdCompressionError;
- begin
- { If you assign a string to an OleVariant object, it will convert the
- string to a WIDE string. The best thing to use is a variant array. }
- nOrigSize := mmoAdd.GetTextLen + 1; { for the null char }
- vaSource := VarArrayCreate( [0,nOrigSize-1], varByte );
- mmoAdd.GetTextBuf( VarArrayLock( vaSource ), nOrigSize );
- VarArrayUnlock( vaSource );
-
- { Allocate a stack item }
- New( pNew );
-
- { To compress, we need to feed the compressor a variant array of bytes or
- a variant string (BSTR). It will always yield a variant array of bytes }
- xResult := xComp.Compress( vaSource, pNew^.vaCompressed, true );
-
- if xResult = xceSuccess then
- begin
- pNew^.pNext := pHeadMessage;
- pHeadMessage := pNew;
- Inc( nCount );
- edtCount.Text := IntToStr( nCount );
- btRemove.Enabled := true;
-
- nCompSize := VarArrayHighBound( pNew^.vaCompressed, 1 )
- - VarArrayLowBound( pNew^.vaCompressed, 1 ) + 1;
-
- ShowMessage( 'Compressed a ' + IntToStr( nOrigSize ) + ' byte(s) message ' +
- 'to a ' + IntToStr( nCompSize ) + ' bytes blob.' );
- end
- else
- begin
- Dispose( pNew );
- ShowMessage( xComp.GetErrorDescription( xResult ) );
- end;
- end;
-
- procedure TfrmMessageStack.btRemoveClick(Sender: TObject);
- var
- pCurrent : PCompressedMessage;
- vaDest : OleVariant;
- xResult : xcdCompressionError;
- begin
- if Assigned( pHeadMessage ) then
- begin
- pCurrent := pHeadMessage;
- pHeadMessage := pHeadMessage^.pNext;
-
- { To uncompress, we need to feed the compressor the original data as a
- variant array of bytes. It will always yield in vaDest a variant array
- of bytes }
- xResult := xComp.Uncompress( pCurrent^.vaCompressed, vaDest, true );
-
- { Dispose of item before analysing result }
- Dec( nCount );
- Dispose( pCurrent );
- edtCount.Text := IntToStr( nCount );
- btRemove.Enabled := ( nCount > 0 );
-
- if xResult = xceSuccess then
- begin
- mmoRemoved.SetTextBuf( VarArrayLock( vaDest ) );
- VarArrayUnlock( vaDest );
- end
- else
- begin
- mmoRemoved.Text := '';
- ShowMessage( xComp.GetErrorDescription( xResult ) );
- end;
- end;
- end;
-
- end.
-