[Okta Webinar] Learn how to a build a cloud-first strategyRegister Now

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 354
  • Last Modified:

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.
0
King_David
Asked:
King_David
  • 4
  • 3
  • 2
  • +5
1 Solution
 
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?
0
 
King_DavidAuthor Commented:
Even if I comment all the code in the FormDestroy it
still happens.
0
 
bugrogerCommented:
And if you comment all the code in FormResize?
0
What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

 
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
0
 
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.
0
 
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.
0
 
bugrogerCommented:
It's also an access violation !

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

Out of interest, did you try my solution?
0
 
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 "$").
0
 
EpsylonCommented:
If you destroy the form with FormX.Free, change it to FormX.Release.
0
 
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.
0
 
rondiCommented:
begin
  if Application.Terminated then exit;
  ...
  ...
  ...
0
 
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.
0
 
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.

0
 
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.
0

Featured Post

Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

  • 4
  • 3
  • 2
  • +5
Tackle projects and never again get stuck behind a technical roadblock.
Join Now