FormResize Event

I've FormResize and FormDestroy Events on my Main Form.
Strangly, when closing the form the FormResize Event
is triggered after my FormDestroy Event.
What could be the cause of this behaviour?
Sometimes, not allways, the application ends with an
access violation on exiting the FormResize.

  Thanks, David.
LVL 1
King_DavidAsked:
Who is Participating?

[Product update] Infrastructure Analysis Tool is now available with Business Accounts.Learn More

x
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

bugrogerCommented:
Can you post your code for FormResize and FormDestroy?

May be you call something in your Destroy-Event that will
be change the size of your form?
King_DavidAuthor Commented:
Even if I comment all the code in the FormDestroy it
still happens.
bugrogerCommented:
And if you comment all the code in FormResize?
Exploring SharePoint 2016

Explore SharePoint 2016, the web-based, collaborative platform that integrates with Microsoft Office to provide intranets, secure document management, and collaboration so you can develop your online and offline capabilities.

nnbbb09Commented:

It's difficult to see what the problem is without a listing of your unit.

However there is a quick way to prevent your FormResize firing after the form has started to destroy itself. Just make this the first line of your FormResize event handler.

If csDestroying in ComponentState then
  exit;

However this just avoids the problem rather than actually fixing it.

Jo
MadshiCommented:
Another quick fix (without knowing the reason why FormResize is triggered) would be to set the OnResize handler in your OnDestroy handler to nil:

procedure TForm1.FormDestroy(...);
begin
  OnResize := nil;
  [...]
end;

If you want to know who triggers the FormResize event, you should go through all your code step by step in the debugger, starting at FormDestroy. Maybe one component on your form does something weird when being destroyed. Who knows?
Maybe it also helps you to set a breakpoint to FormResize, and if you get there after FormDestroy, look at the callstack, it maybe also shows you who is responsible for triggering the FormResize event...

Regards, Madshi.
King_DavidAuthor Commented:
If I add OnResize := Nil; as the first line of my
FormDetroy Event, the FormResize is not triggered but
my application end with runtime error 216.

These solutions are work-arounds, I would like to solve
this bug.
bugrogerCommented:
It's also an access violation !

if you post your code if would be much easier.
nnbbb09Commented:

Out of interest, did you try my solution?
MadshiCommented:
>> These solutions are work-arounds, I would like to solve
this bug.

Then you're a real programmer. In that case reread the last two paragraphs of my previous comment:

"If you want to know who triggers the FormResize event, you should go through all your code step by step
in the debugger, starting at FormDestroy. Maybe one component on your form does something weird when
being destroyed. Who knows?
Maybe it also helps you to set a breakpoint to FormResize, and if you get there after FormDestroy, look
at the callstack, it maybe also shows you who is responsible for triggering the FormResize event..."

I can add a third possibility to find the real bug: Where does the access violation occur (runtime error 216 = access violation), when you do that "OnResize := nil"? This might exactly be the guilty code location. Use "Find runtime error" to find the source line. (This function works only if the process is running, so press F7 once to get into the debugger, then click "Find runtime error", then give in the address with a leading "$").
EpsylonCommented:
If you destroy the form with FormX.Free, change it to FormX.Release.
ivobauerCommented:
Hi all!

This is just my opinion. Maybe, when form is being freed,  you access the components which no longer exists in OnResize event handler. Try to encapsulate your code in TForm.OnResize event handler like:

procedure TForm1.FormResize(...);
begin]
  if not (csDestroying in ComponentState) then
  begin
    // put here your original code
  end;
end;

Best regards, Ivo.
rondiCommented:
begin
  if Application.Terminated then exit;
  ...
  ...
  ...
alx512Commented:
The FormResize Event is triggered after FormDestroy Event
becouse the WM_SIZE message processed. I think it called by DefaultWindowHandler;

In Controls.pas you can see this code:

procedure TWinControl.WMSize(var Message: TWMSize);
begin
  UpdateBounds;
  inherited;
  Realign;
  if not (csLoading in ComponentState) then Resize;
end;

I think what this code must check also csDestroyng status, before call of Resize proc.

The problem that you encountered is not in FormResize event, check your other code.

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
King_DavidAuthor Commented:
alx512, you have a point.

Here is what I found so far:
Look at procedure TCustomForm.WMDestroy
pay attention to the line "if (FMenu <> nil)..."
If I set in my FormDestroy
   MainMenu.Free;
   MainMenu := Nil;
then the event is not triggered and I'm happy.

King_DavidAuthor Commented:
I'm giving the points to alx but I thank all you for your
help.

the solution:
My form has many components with their Align set.
When the form is detroyed, the MainMenu gets destoyed
and a lot of activities are going on to resize
the form.
And the solution is: in FormCloseQuery I destroy
the MainMenu and set it to nil, this triggers the
FormResize event and when the FormDestroy is triggered
FormResize remains calm.

  Regards, David.
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Delphi

From novice to tech pro — start learning today.