NMFileBuffer.pas
上传用户:szzdds
上传日期:2013-09-18
资源大小:293k
文件大小:2k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. unit NMFileBuffer;
  2. interface
  3. uses
  4.   Classes;
  5. type
  6.   TNMFileBuffer = class( TObject )
  7.   private
  8.     FSource: TStream;
  9.     FSourceSize: LongInt;
  10.     FBuffer: PChar;
  11.     FBufPos: PChar;
  12.     FBufEnd: PChar;
  13.     FBufSize: LongInt;
  14.   protected
  15.   public
  16.     constructor Create( const aSource: TStream );
  17.     destructor Destroy; override;
  18.     function NextMemoryBuffer( const Ptr: PChar; const Counter: LongInt ): Boolean;
  19.     property BufPos: PChar read FBufPos;
  20.     property BufEnd: PChar read FBufEnd;
  21.     property BufSize: LongInt read FBufSize;
  22.   published
  23.   end;
  24. implementation
  25. uses
  26.   SysUtils;
  27. const
  28.   MaxBufSize = $FFFD;
  29. constructor TNMFileBuffer.Create( const aSource: TStream );
  30. begin
  31.   inherited Create;
  32.   FBuffer := AllocMem( MaxBufSize + 2 );
  33.   FSource := aSource;
  34.   FSourceSize := FSource.Size;
  35.   FSource.Position := 0;
  36.   NextMemoryBuffer( FBufPos, 0 );
  37. end;
  38. destructor TNMFileBuffer.Destroy;
  39. begin
  40.   FreeMem( FBuffer );
  41. end;
  42. function TNMFileBuffer.NextMemoryBuffer( const Ptr: PChar; const Counter: LongInt ): Boolean;
  43. var
  44.   BytesRead: LongInt;
  45.   FillPos: PChar;
  46. begin
  47.   if FSource.Position < FSourceSize then
  48.     begin
  49.       FBufPos := FBuffer + 1;
  50.       FillPos := FBufPos;
  51.       if Counter > 0 then
  52.         begin
  53.           System.Move( Ptr^, FillPos^, Counter );
  54.           inc( FillPos, Counter );
  55.         end;
  56.       BytesRead := FSource.Read( FillPos^, MaxBufSize - Counter );
  57.       FBufSize := MaxBufSize;
  58.       if BytesRead < MaxBufSize - Counter then
  59.         begin
  60.           ( FillPos + BytesRead )^ := #0;
  61.           FBufEnd := FillPos + BytesRead;
  62.           FBufSize := BytesRead;
  63.         end;
  64.       Result := True;
  65.     end
  66.   else
  67.     begin
  68.       Result := False;
  69.     end;
  70. end;
  71. end.