[fpc-pascal] Checking if a TStringList already exists
Michael Van Canneyt
michael at freepascal.org
Mon May 20 14:02:56 CEST 2019
On Mon, 20 May 2019, James Richters wrote:
> I’m wondering if there is a way to test if a tstringlinst has been created yet?
>
>
>
> I looked at the documentation in these two locations:
>
> https://lazarus-ccr.sourceforge.io/docs/rtl/classes/tstringlist.html
>
> and
>
> https://lazarus-ccr.sourceforge.io/docs/rtl/classes/tstrings.html
>
>
>
> but they do not show things like the .Create or .Free procedures, so I am
> thinking .Create and .Free are some kind of fundamental procedures that
> are used by generally everything in ‘classes’ maybe so if there was some
> function that would tell me if the TStringList existed, it would be in
> with .Create and .Free…. But I’m not sure where that would be documented.
.Create and .Free are indeed fundamental constructors and destructors for
classes. They are documented in the ancestors of TString(List).
A stringlist (or an object in general) exists if it is non-nil:
Procedure DoSomething(var A : tStringList);
begin
if A=Nil then
A:=TStringList.Create;
end;
> Also can someone explain that the purpose of .Destroy is and why I would use .Free Vs .Destroy ?
.Free Can be called on a Nil instance (if the list does not exist yet)
so:
A.Free;
will check if A is non-nil, and calls A.Destroy if this is the case.
If you call .Destroy in a nil instance, errors will occur.
Note that Free or Destroy will free the instance, but will NOT set the
instance pointer to Nil.
So in the Above example:
A:=TStringList.Create;
A.Free;
if A<>Nil then
Writeln('A not nil');
will print
A not nil.
If you want to nil the pointer (recommended practice) then you should use
FreeAndNil:
FreeAndNil(A);
Meaning that
A:=TStringList.Create;
FreeAndNil(A);
if A<>Nil then
Writeln('A not nil');
Will not print anything.
Michael.
More information about the fpc-pascal
mailing list