[fpc-pascal]Dynamic Arrays (Pointers)

memsom at interalpha.co.uk memsom at interalpha.co.uk
Fri Jan 24 14:53:01 CET 2003


> Would someone be so kind as to show me an example of using dynamic
> arrays of an object, creating new objects on the fly in code and
> disposing of them when they're no longer needed. Use of this would be in
> a irc services program I'm porting to linux from delphi (windows), ie:
> new nick joins server, create new object respresenting that nick...

To be honest, I would advise using a TList. This will do all the donley work 
for you, and even has a nice method 'pack' that will remove dead pointers for 
you. It doesn't sound like you need uber speed or anything, so even though the 
TList does add a slight performance hit over a dynamic array, the pro's 
outweigh the cons. All you would do is something like this, (TMYCLASSTYPE would 
be replaced with yout TObject descendent):

TWrapList = class
private
  FList: TList;
protected
  procedure SetListValue(Value: TMYCLASSTYPE); virtual;
  function  GetListValue(const Index: integer): TMYCLASSTYPE; virtual;
public
  property ListValues[index: integer]: TMYCLASSTYPE 
           read GetListValue write SetListValue;

  constructor Create; virtual;
  destructor Destroy; override;

  function Count: integer;
  procedure Add(Item: TMYCLASSTYPE);
  procedure Delete(Index: Integer);
end;


constructor TWrapList.Create;
begin
  FList := TList.Create;
end;
 
destructor TWrapList.Destroy;
begin
  // NB: remember remove any items left in list....
  
  FList.free;
  inherited;
end;
 
procedure TWrapList.SetListValue(Value: TMYCLASSTYPE);
begin
  // NB. range checking will be usefull
  FList[index] := Value;
end;
 
function  TWrapList.GetListValue(const Index: integer): TMYCLASSTYPE; 
begin
  Result := TMYCLASSTYPE( FList[index] );
end;

function TWrapList.Count: integer;
begin
  Result := FList.Count;
end;

procedure TWrapList.Add(Item: TMYCLASSTYPE);
begin
  FList.Add(Item); //if you make this a finction you can
                   //return the index here
end;

procedure TWrapList.Delete(Index: Integer);
begin
  FList.Delete(Index);
end;

This is a pattern I use all the time. It works well.

Matt
 


---------------------------------------------
This message was sent using Mistral WebMail.
http://www.mistral.co.uk/





More information about the fpc-pascal mailing list