Sample code for 30+ languages & platforms
Delphi ActiveX

Transition from Compression.BeginCompressBytes to FirstChunk/LastChunk

Provides instructions for replacing deprecated BeginCompressBytes method calls with using FirstChunk and LastChunk properties.

Chilkat Delphi ActiveX Downloads

Delphi ActiveX
uses
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Chilkat_TLB;

...

procedure TForm1.Button1Click(Sender: TObject);
var
success: Integer;
facSrc: TCkFileAccess;
facDest: TCkFileAccess;
blockSize: Integer;
numBlocks: Integer;
compress: TChilkatCompression;
fileBytes: Array of Byte;
compressedBytes: Array of Byte;
i: Integer;

begin
success := 0;

facSrc := TCkFileAccess.Create(Self);
facDest := TCkFileAccess.Create(Self);

// Open a large binary file for reading.
success := facSrc.OpenForRead('qa_data/bmp/big.bmp');
if (success = 0) then
  begin
    Memo1.Lines.Add(facSrc.LastErrorText);
    Exit;
  end;

// If we compress in 64K chunks, find out how many blocks there will be.
blockSize := 65536;
numBlocks := facSrc.GetNumBlocks(blockSize);

// Open an output file for the compressed data.
success := facDest.OpenForWrite('c:/temp/qa_output/compressedBmp.dat');
if (success = 0) then
  begin
    Memo1.Lines.Add(facDest.LastErrorText);
    Exit;
  end;

compress := TChilkatCompression.Create(Self);
compress.Algorithm := 'deflate';

// ----------------------------------------------------------------------------------
// This is the deprecated way of compressing in chunks using Begin/More/End methods..
// ----------------------------------------------------------------------------------
i := 0;
while i < numBlocks do
  begin
    fileBytes := facSrc.ReadBlock(i,blockSize);
    if (i = 0) then
      begin
        compressedBytes := compress.BeginCompressBytes(fileBytes);
      end
    else
      begin
        compressedBytes := compress.MoreCompressBytes(fileBytes);
      end;

    facDest.FileWrite(compressedBytes);

    i := i + 1;
  end;

// At the very end, flush any remaining compressed bytes, if any.
compressedBytes := compress.EndCompressBytes();
facDest.FileWrite(compressedBytes);

facSrc.FileClose();
facDest.FileClose();

Memo1.Lines.Add('Finished compressing file.');

// ----------------------------------------------------------------------------------
// This is new way of compressing in chunks using FirstChunk and LastChunk properties
// ----------------------------------------------------------------------------------

success := facSrc.OpenForRead('qa_data/bmp/big.bmp');
if (success = 0) then
  begin
    Memo1.Lines.Add(facSrc.LastErrorText);
    Exit;
  end;

success := facDest.OpenForWrite('c:/temp/qa_output/compressedBmp2.dat');
if (success = 0) then
  begin
    Memo1.Lines.Add(facDest.LastErrorText);
    Exit;
  end;

// Assuming numBlocks > 1
compress.FirstChunk := 1;
compress.LastChunk := 0;

i := 0;
while i < numBlocks do
  begin
    fileBytes := facSrc.ReadBlock(i,blockSize);
    compressedBytes := compress.CompressBytes(fileBytes);

    facDest.FileWrite(compressedBytes);

    i := i + 1;

    compress.FirstChunk := 0;
    if (i = (numBlocks - 1)) then
      begin
        compress.LastChunk := 1;
      end;
  end;

facSrc.FileClose();
facDest.FileClose();

Memo1.Lines.Add('Finished compressing file 2.');
end;