[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