Link to home
Start Free TrialLog in
Avatar of moonrise
moonrise

asked on

Freeing form - variables not freed ?

In my program, forms are created and destroyed. I was surprise to see that when freeing a form then recreating it variables and constants retain the value they had when the form was freed. I don't want this. I can I really free the memory ?
Avatar of inthe
inthe

Hello MoonRise,
perhaps you need to use the freemem procedure look it up under delphi help it has an example  
  ¤¤¤¤¤¤¤InThe¤¤¤¤¤¤¤
Hello Guys...

The memory is not free immediately as you free the form... Sometimes it frees as you close down the up... I'm not sure about that though, but I'm sure it doesn't free it immediatelly...

What do you think is going to happen if you do this??

Form1.Free;
Form1 := nil;

Try this one... Cheers,
Viktor
What variables? The form's private/public/protected, or others?
Remember, as a general rule, always use Form.Release instead of Form.Free to destroy a form (if you are doing it directly and not via Action := caFree in the FormClose event).

Release kills a form gracefully, allowing all pending messages to be processed before the form is destroyed. Free just nukes it - if there are pending messages you are introuble.

Perhaps you could post a code sample of where you destroy and recreate the form, and an indication of what variables retain their values...

Cheers,

Raymond.
I quote from the D4 help files (TObject.Free):

"If you want to free the form, call the Release method, which destroys the form and releases the memory allocated for it after all its event handlers and those of the components it contains are through executing."


and from TCustomForm.Release:

procedure Release;

Description

Use Release to destroy the form and free its associated memory.

"Release is much like the Free method except that Release does not destroy the form until all event handlers of the form and event handlers of components on the form have finished executing. Any event handlers of the form should use Release instead of Free. Failing to do so could lead to an access violation."

If have also read on verious occasions that freeing the form does not "clear" the memory used by the form.

We ran into a problem with the following code a wile back:

Form1.Free;
If Form1 = Nil then Form1.Create(Self);
Form1.Caption := 'Test';

We would get an access violation on the last line. After reading up on this I found that a lot of people had exactly the same type of problem. The answer seemed to be to manually  set the pointer  to Nil. We changed the code in our test procedure above to read:

Form1.Free;
Form1 := Nil;
If Form1 = Nil then Form1.Create(Self);
Form1.Caption := 'Test';

The code now worked fine.

BTW We tried Form1.Assigned as a test instead of Form = Nil and received exactly the same error.

Gerhard
Gerhard, there is a serious mistake in your sources!!!

"Form1.Create(Self);" is absolute wrong!!! Since you call a method of the form you freed just one line ago. This method "Create" is no longer valid!
(1) You HAVE to use the class method ("TForm1.Create").
(2) You HAVE to handle the result of the Create method ("form1:=TForm1.Create(Application)").

If your code does not end in an Access Violation, it's just luck!

Regards, Madshi.
Avatar of moonrise

ASKER

Maybe my question was not clear enough. Anyway I solved my problem by replacing the constants with global variables which I reset in the OnDestroy event of the form.

I experimented with Release instead of Free. Not only does it not reset the variables/constants but it also crashes my program.

Thank you all.
Probably you've solved it but what you could have done wrong is this...

var
  Btn : TButton;
begin
  Btn := TButton.Create(self);
  //some properties... you don't free this object...
  Btn := TButton.Create(self);
  /Other properties...
Now the old button is still there and can't be disposed because the Btn variable pointed at the address of the first one created/....and now it points at the second one so your first button is somewhere in memory and won't be freed until you don't reboot your PC...
end;

I know you are working with Forms and not Buttons but it is the same thing for all controls... Hope this helps a bit!

Cheers,
Viktor
moonrise,

please give us a little example project that crashes (or that does not free the variables), and I'm sure we all will find the bug together...

Regards, Madshi.
yup, Madshi is completely right :)
ASKER CERTIFIED SOLUTION
Avatar of endro
endro

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial