1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
|
uses Math;
type
TTextReader = class
private
fStream : TFileStream;
fMem : AnsiString;
fCount : integer;
fMemBlk : integer;
function getStr: AnsiString;
protected
procedure AdjustMem;
public
property Str : AnsiString read getStr;
property StrCount : integer read fCount;
procedure FirstPage;
procedure PrevPage;
procedure NextPage;
procedure LastPage;
function PagesCount: integer;
constructor Create(const aFileName: TFileName; const aMemBlockCount: word = 10);
destructor Destroy; override;
end;
procedure TTextReader.AdjustMem;
var Old: integer;
begin
Old := fCount;
while not (fMem[fCount] in [#13,#10]) do
dec(fCount);
if fCount <> Old then
begin
Old := Old - fCount;
fMem[fCount+1] := #0;
fStream.Position := fStream.Position - Old;
end;
end;
constructor TTextReader.Create(const aFileName: TFileName; const aMemBlockCount: word = 10);
begin
inherited Create;
fStream := TFileStream.Create(aFileName, fmOpenRead);
fMemBlk := aMemBlockCount * 4096;
setLength(fMem, fMemBlk);
FirstPage;
end;
destructor TTextReader.Destroy;
begin
setLength(fMem, 0);
fStream.Free;
inherited;
end;
procedure TTextReader.FirstPage;
begin
fStream.Seek(0, soFromBeginning);
fCount := fStream.Read(fMem[1], fMemBlk);
AdjustMem;
end;
function TTextReader.getStr: AnsiString;
begin
result := copy(fMem, 1, fCount);
end;
procedure TTextReader.LastPage;
begin
fStream.Seek(-fMemBlk, soFromEnd);
fCount := fStream.Read(fMem[1], fMemBlk);
AdjustMem;
end;
procedure TTextReader.NextPage;
begin
fCount := fStream.Read(fMem[1], fMemBlk);
AdjustMem;
end;
function TTextReader.PagesCount: integer;
begin
if (fStream.Size and 1) = 0 then
result := ceil(fStream.Size / fMemBlk)
else
result := ceil((fStream.Size+1) / fMemBlk);
end;
procedure TTextReader.PrevPage;
begin
fStream.Seek(-fMemBlk, soFromCurrent);
fCount := fStream.Read(fMem[1], fMemBlk);
AdjustMem;
end; |
Partager