[fpc-pascal]Is an object instanciated?

Full_Name memsom at post.interalpha.co.uk
Fri Jan 4 11:19:56 CET 2002


Quoting Johann Glaser <Johann.Glaser at gmx.at>:

The solution (you're half way there) is as follows..

 Type 
   TTest = class(TObject)
     { ... }
     constructor Create;
   end;

  var
    Test : TTest = nil;

  {...}
  
  procedure TestTest;
  begin
    if assigned(Test) then begin { or 'if Test <> nil then ...' }
      writeln('Test is instanciated')
      Test.Free;
    end
    else begin
      writeln('Test is nil');  
      Test := TTest.Create;
    end;

    if assigned(Test) then { or 'if Test <> nil then ...' }
      writeln('Test is instanciated')
    else
      writeln('Test is nil');
    
  end;

When you 'free' (*not* 'Destroy') your class, set it to 'Nil' (this is *not* 
done for you.)

  begin
     //free class
     Test.Free;
     Test := Nil;
  end;

If you do this, next time you test 'assigned' you will get the truth. Assigned 
simply tests whether the variable is equal to Nil (more or less).

Another tip, classes do *not* destroy themselves. Another piece of code 
must 'free' them..

e.g.

  procedure TTest1.FreeUpResources;
  begin
    //Test2 free class
    Test2.Free;
    Test2 := Nil;
  end;

You therefore *know* when something has been free'd because you called 
the 'free' method yourself. FPC does *not* have garbage collection, so every 
class you Create, you must call the 'Free' method for, or a memory leak will be 
caused.

One final tip. Do *not* use 'global' variables. Make all of your variable part 
of your main class.. (it is better to use solely Object Oriented code rather 
than a bad mix of procedural and OO...)

e.g.
  
  type
    TSubclass = class(TObject)
      {...}
    end;

    TMainClass = class(TObject)
    protected
      Subclass: TSubclass;
    public
      constructor Create; virtual;
      destructor  Destroy; override;
    end;

  {...}
  
  constructor TMainClass.Create;
  begin
    Subclass := TSubclass.Create;
  end;

  destructor TMainClass.Destroy;
  begin
    Subclass.Free;     
    
    //always call this last...
    inherited Destroy;
  end;

Hope that helps,

Matt

> Hi!
> 
> In my program I have a class:
> 
> Type CTest = class
>                { ... }
>                Constructor Create;
>              End;
> 
> This class will be held in a variable:
> 
> Var Test : CTest;
> 
> The class is generated:
> 
>   Test := CTest.Create;
> 
> But I don't know, _when_ it is generated, because this will be done
> when
> the user selects a menu entry. When the user now again selects the menu
> entry, I have to check, wether the variable "Test" already contains a
> created class or not.
> 
> At the moment I have solved that problem by setting Test to Nil
>   Test := Nil;
> at the beginning of my program and then testing
>   if Text = Nil then
>     Test := CTest.Create;
> 
> Is there another, more beautiful way to check if a class is already
> created?
> 
> What can I do if the class "Destroy()"s itself (e.g. if that class
> would
> be an "About" window with an "OK" button which closes the window) but
> doesn't tell the main program that it is destroyed?

--

"Computer games don't affect kids; I mean if Pac-Man affected us as kids, 
we'd all be running around in darkened rooms, munching magic pills and 
listening to repetitive electronic music." 
Kristian Wilson, 
Nintendo, Inc, 1989

-----BEGIN GEEK CODE BLOCK-----
Version: 3.12
GCS d? s+++:+ a- C++ UL+ P L++ E---- W- N+ o+ K- w 
O- M V PS PE-- Y PGP- t- 5-- X- R- tv+ b+ DI++ D+ 
G e++ h--- r+++ y+++ 
------END GEEK CODE BLOCK------




More information about the fpc-pascal mailing list