TRomChecksum = Class(TMemoryStream)
PUBLIC
Count : BYTE; { Count of 512 byte blocks }
CkSum : BYTE; { Calculated checksum }
CkByte : BYTE; { Byte to be added to make checksum zero }
Constructor Create;
PROCEDURE CalculateChecksums;
END;
PROCEDURE ChecksumFile(FileToCheck : STRING;
PadTo : INTEGER);
VAR RomFile : TRomChecksum;
BEGIN;
RomFile:=TRomChecksum.Create;
TRY
WITH RomFile DO
BEGIN;
LoadFromFile(FileName);
CalculateChecksums;
{ Update file *ONLY* if checksum not valid ! }
IF (CkSum <> 0) THEN
BEGIN;
Position:=(Count*512)-1; { Last byte }
Write(CkByte,1);
END;
WriteLn(Format('PadTo: %d, Count*512: %d, Romfile.Size:%d',[PadTo,(Count*512),RomFile.Size]));
IF (PadTo>=(Count*512)) THEN
RomFile.SetSize(PadTo);
SaveToFile(FileName);
WriteLn(Format('File : %s',[FileToCheck]));
WriteLn(Format('Blocks : %d',[Count]));
WriteLn(Format('Sum : $%2.2Xh',[CkSum]));
WriteLn(Format('CkByte : $%2.2Xh',[CkByte]));
WriteLn(Format('Final length : %d',[RomFile.Size]));
END;
FINALLY
RomFile.Free;
END;
END;
That's because TStream hasthreetwo overloaded virtual SetSize methods and TMemoryStream overrides the one with parameter Int64:I assume you have 64-bit platform. Declare PadTo as Int64 or call SetSize(Int64(PadTo));.
procedure SetSize({$ifdef CPU64}const NewSize: Int64{$else}NewSize: LongInt{$endif}); override;
EDIT: only two overloaded virtual SetSize methods, the third is named SetSize64