Solved

FormResize Event

Posted on 2001-07-15
15
344 Views
Last Modified: 2010-04-06
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
Comment
Question by:King_David
  • 4
  • 3
  • 2
  • +5
15 Comments
 
LVL 2

Expert Comment

by:bugroger
Comment Utility
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
 
LVL 1

Author Comment

by:King_David
Comment Utility
Even if I comment all the code in the FormDestroy it
still happens.
0
 
LVL 2

Expert Comment

by:bugroger
Comment Utility
And if you comment all the code in FormResize?
0
 
LVL 3

Expert Comment

by:nnbbb09
Comment Utility

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
 
LVL 20

Expert Comment

by:Madshi
Comment Utility
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
 
LVL 1

Author Comment

by:King_David
Comment Utility
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
 
LVL 2

Expert Comment

by:bugroger
Comment Utility
It's also an access violation !

if you post your code if would be much easier.
0
Why You Should Analyze Threat Actor TTPs

After years of analyzing threat actor behavior, it’s become clear that at any given time there are specific tactics, techniques, and procedures (TTPs) that are particularly prevalent. By analyzing and understanding these TTPs, you can dramatically enhance your security program.

 
LVL 3

Expert Comment

by:nnbbb09
Comment Utility

Out of interest, did you try my solution?
0
 
LVL 20

Expert Comment

by:Madshi
Comment Utility
>> 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
 
LVL 13

Expert Comment

by:Epsylon
Comment Utility
If you destroy the form with FormX.Free, change it to FormX.Release.
0
 
LVL 2

Expert Comment

by:ivobauer
Comment Utility
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
 
LVL 3

Expert Comment

by:rondi
Comment Utility
begin
  if Application.Terminated then exit;
  ...
  ...
  ...
0
 
LVL 1

Accepted Solution

by:
alx512 earned 200 total points
Comment Utility
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
 
LVL 1

Author Comment

by:King_David
Comment Utility
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
 
LVL 1

Author Comment

by:King_David
Comment Utility
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

Top 6 Sources for Identifying Threat Actor TTPs

Understanding your enemy is essential. These six sources will help you identify the most popular threat actor tactics, techniques, and procedures (TTPs).

Join & Write a Comment

Suggested Solutions

Introduction The parallel port is a very commonly known port, it was widely used to connect a printer to the PC, if you look at the back of your computer, for those who don't have newer computers, there will be a port with 25 pins and a small print…
In my programming career I have only very rarely run into situations where operator overloading would be of any use in my work.  Normally those situations involved math with either overly large numbers (hundreds of thousands of digits or accuracy re…
This tutorial demonstrates a quick way of adding group price to multiple Magento products.
You have products, that come in variants and want to set different prices for them? Watch this micro tutorial that describes how to configure prices for Magento super attributes. Assigning simple products to configurable: We assigned simple products…

772 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

11 Experts available now in Live!

Get 1:1 Help Now