فهرست منبع

Fix mystery errors on reading file with TFastBufStream.

Margers 3 هفته پیش
والد
کامیت
c6fb445e55
1فایلهای تغییر یافته به همراه9 افزوده شده و 5 حذف شده
  1. 9 5
      packages/ide/wutils.pas

+ 9 - 5
packages/ide/wutils.pas

@@ -104,8 +104,8 @@ type
     procedure   Seek(Pos: Longint); virtual;
     procedure   Seek(Pos: Longint); virtual;
     procedure Readline(var S:ShortString;var linecomplete,hasCR : boolean);
     procedure Readline(var S:ShortString;var linecomplete,hasCR : boolean);
     procedure Readline(var S:AnsiString;var linecomplete,hasCR : boolean);
     procedure Readline(var S:AnsiString;var linecomplete,hasCR : boolean);
-  private
-    BasePos: longint;
+  //private
+    {BasePos: longint;  Removed from object, calculate its value on the fly }
   end;
   end;
 
 
   PTextCollection = ^TTextCollection;
   PTextCollection = ^TTextCollection;
@@ -938,17 +938,21 @@ end;
 constructor TFastBufStream.Init (FileName: FNameStr; Mode, Size: Word);
 constructor TFastBufStream.Init (FileName: FNameStr; Mode, Size: Word);
 begin
 begin
   Inherited Init(FileName,Mode,Size);
   Inherited Init(FileName,Mode,Size);
-  BasePos:=0;
+  //BasePos:=0;
 end;
 end;
 
 
 procedure TFastBufStream.Seek(Pos: Longint);
 procedure TFastBufStream.Seek(Pos: Longint);
-var RelOfs: longint;
+var RelOfs,BasePos: longint;
 begin
 begin
+  { Wrong BasePos caused mystery errors while reading resource file (fp.dsk).
+    Real base position can change in TBufStream without our knowledge. Making
+    BasePos local and calculating its value on demand is the solution. M. }
+  BasePos:=Position-BufPtr;
   RelOfs:=Pos-BasePos;
   RelOfs:=Pos-BasePos;
   if (RelOfs<0) or (RelOfs>=BufEnd) or (BufEnd=0) then
   if (RelOfs<0) or (RelOfs>=BufEnd) or (BufEnd=0) then
     begin
     begin
       inherited Seek(Pos);
       inherited Seek(Pos);
-      BasePos:=Pos-BufPtr;
+      {BasePos:=Pos-BufPtr;  BasePos is local, no need to save. M. }
     end
     end
   else
   else
     begin
     begin