[fpc-pascal] TList: newbie question

Bart bartjunk64 at gmail.com
Wed Apr 1 13:12:43 CEST 2009


Hi,

I never used TList before, so I'm not sure if this is correct.

I constructed a TlcTextCache class that basically stores objects of
type TLcText in a TList.
A TlcText object is create with TLcText.Create(FileName).

My questions:
- I add my TlcText objects to the list by TList.Add(SomeTlcTextObject)
- I read from the list by SomeTlcTextObjetc :=
TlcText(TList.Items[Index]) (casting it at compiletime)
Is this the way I am supposed to do that and is it safe explicitly
casting the TList.Item[Index] to the TlcText type (I know I only add
this type of objects to the list).

Here's the relevant part of the code:

  TLcText = class
  [snip]

  TLcTextCache = class
  private
    FCacheList: TList;
  protected
    function IsCached(const FileName: String): Boolean;
    function CacheIndex(const FileName: String): Integer;
    function AddFile(const FileName: String): Boolean;
    function GetCacheCount: Integer;
    function GetLcText(const FileName: String): TLcText;
  public
    constructor Create; virtual;
    destructor Destroy; override;
    property Count: Integer read GetCacheCount;
  end;

{ TLcTextCache }

function TLcTextCache.IsCached(const FileName: String): Boolean;
begin
  Result := CacheIndex(FileName) >= 0;
end;

function TLcTextCache.CacheIndex(const FileName: String): Integer;
var
  i: Integer;
  LcText: TLcText;
begin
  Result := -1;
  for i := 0 to FCacheList.Count - 1 do
  begin
    LcText := TLcText(FCacheList.Items[i]);
    if LcText.FileName = FileName then
    begin
      Result := i;
      Break;
    end;
  end;
end;

function TLcTextCache.AddFile(const FileName: String): Boolean;
begin
  Result := FCacheList.Add(TLcText.Create(FileName)) >= 0;
end;

function TLcTextCache.GetCacheCount: Integer;
begin
  Result := FCacheList.Count;
end;

function TLcTextCache.GetLcText(const FileName: String): TLcText;
var Index: Integer;
begin
 Index := CacheIndex(FileName);
 if (Index >= 0) then
   Result := TlcText(FCacheList.Items[Index])
 else
   Result := nil;
end;

constructor TLcTextCache.Create;
begin
  inherited Create;
  FCacheList := TList.Create;
end;

destructor TLcTextCache.Destroy;
var
  i: Integer;
  LcText: TLcText;
begin
  for i := FCacheList.Count - 1 downto 0 do
  begin
    LcText := TLcText(FCacheList.Items[i]);
    LcText.Free;
    LcText := nil;
  end;
  FCacheList.Free;
  inherited Destroy;
end;


So far testing this construction gave no obvious errors (but as we all
know that is no garantee that the code is not flawed at some point)
and no memory leaks (using heaptrc).

Bart



More information about the fpc-pascal mailing list