⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nmfilebuffer.pas

📁 DELPHI里面一些常用的控件
💻 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 + -