• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 319
  • Last Modified:

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 ?
0
moonrise
Asked:
moonrise
1 Solution
 
intheCommented:
Hello MoonRise,
perhaps you need to use the freemem procedure look it up under delphi help it has an example  
  ¤¤¤¤¤¤¤InThe¤¤¤¤¤¤¤
0
 
viktornetCommented:
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
0
 
dwwangCommented:
What variables? The form's private/public/protected, or others?
0
Get your problem seen by more experts

Be seen. Boost your question’s priority for more expert views and faster solutions

 
rwilson032697Commented:
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.
0
 
Gerhard100198Commented:
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
0
 
MadshiCommented:
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.
0
 
moonriseAuthor Commented:
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.
0
 
viktornetCommented:
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
0
 
MadshiCommented:
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.
0
 
viktornetCommented:
yup, Madshi is completely right :)
0
 
endroCommented:
Here are some suggestions:
1. When creating the form, just re-initialize those variables in the top of codes.
2. Try to put this code on OnClose event of the form:
  Action := caFree;

Hope this helps you.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Get expert help—faster!

Need expert help—fast? Use the Help Bell for personalized assistance getting answers to your important questions.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now