📄 nmfilebuffer.pas
字号:
unit NMFileBuffer;
interface
uses
Classes;
type
TNMFileBuffer = class( TObject )
private
FSource: TStream;
FSourceSize: LongInt;
FBuffer: PChar;
FBufPos: PChar;
FBufEnd: PChar;
FBufSize: LongInt;
protected
public
constructor Create( const aSource: TStream );
destructor Destroy; override;
function NextMemoryBuffer( const Ptr: PChar; const Counter: LongInt ): Boolean;
property BufPos: PChar read FBufPos;
property BufEnd: PChar read FBufEnd;
property BufSize: LongInt read FBufSize;
published
end;
implementation
uses
SysUtils;
const
MaxBufSize = $FFFD;
constructor TNMFileBuffer.Create( const aSource: TStream );
begin
inherited Create;
FBuffer := AllocMem( MaxBufSize + 2 );
FSource := aSource;
FSourceSize := FSource.Size;
FSource.Position := 0;
NextMemoryBuffer( FBufPos, 0 );
end;
destructor TNMFileBuffer.Destroy;
begin
FreeMem( FBuffer );
end;
function TNMFileBuffer.NextMemoryBuffer( const Ptr: PChar; const Counter: LongInt ): Boolean;
var
BytesRead: LongInt;
FillPos: PChar;
begin
if FSource.Position < FSourceSize then
begin
FBufPos := FBuffer + 1;
FillPos := FBufPos;
if Counter > 0 then
begin
System.Move( Ptr^, FillPos^, Counter );
inc( FillPos, Counter );
end;
BytesRead := FSource.Read( FillPos^, MaxBufSize - Counter );
FBufSize := MaxBufSize;
if BytesRead < MaxBufSize - Counter then
begin
( FillPos + BytesRead )^ := #0;
FBufEnd := FillPos + BytesRead;
FBufSize := BytesRead;
end;
Result := True;
end
else
begin
Result := False;
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -