[fpc-pascal] TList: newbie question
Paul Nicholls
paulfnicholls at gmail.com
Thu Apr 2 00:37:22 CEST 2009
----- Original Message -----
From: "Bart" <bartjunk64 at gmail.com>
To: "FPC-Pascal users discussions" <fpc-pascal at lists.freepascal.org>
Sent: Wednesday, April 01, 2009 10:12 PM
Subject: [fpc-pascal] TList: newbie question
> 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
As far as I can see it all looks A-OK :)
cheers,
Paul
More information about the fpc-pascal
mailing list