[fpc-pascal] TMemoryStream.SetSize question.

gabor gabor at poczta.onet.pl
Mon Jun 14 21:56:25 CEST 2021


W dniu 2021-06-14 o 21:27, Michael Van Canneyt via fpc-pascal pisze:
> 
> 
> On Mon, 14 Jun 2021, gabor via fpc-pascal wrote:
> 
>> Why does TMemoryStream only implement one version of SetSize method?
>>
>> https://svn.freepascal.org/cgi-bin/viewvc.cgi/trunk/rtl/objpas/classes/classesh.inc?revision=49038&view=markup#l1225 
>>
>>
>> The TStream class has two versions of SetSize method (virtual, 
>> overload) - one with a parameter of LongInt type and the other with 
>> the Int64 type. Since function is virtual, child classes can override 
>> it and can be called from code, but then a version of the SetSize 
>> function not implemented for a given platform in the TMemoryStream 
>> class can be called.
> 
> The base method checks which one is overridden. So it does not matter 
> which one you override in the child.
> The "other" one will always fall back to the method in TStream.
> 

Unfortunately, on the 64bit platform it does not fully work. See the 
project below.


program Project1;

{$mode objfpc}

uses
   Classes;

type
   TMyMemStream = class(TMemoryStream)
     procedure Foo;
     procedure Bar;
   end;

procedure TMyMemStream.Foo;
begin
   SetSize(10);
end;

procedure TMyMemStream.Bar;
begin
   SetSize(Int64(10));
end;

var
   MS: TMyMemStream;

begin
   MS := TMyMemStream.Create;
   MS.Foo;
   WriteLn(MS.Size);
   MS.Bar;
   WriteLn(MS.Size);
   MS.Free;
   ReadLn;
end.

Michał.


More information about the fpc-pascal mailing list