Stern
asked on
Resizing MDIChild
I need to perform some actions when my MDIChild is resized (move controls and so on). But, if I write it in its OnResize event, it is called three times until the window stops resizing. It doesn't happen with normal windows. Help!
Thanks.
Thanks.
ASKER
I can't get the code in the moment, 'cause it's on another computer, but it's just a call for a procedure I use to position something on the form. Usually it works OK, but when resizing... I tried to trace, and it always comes three times into this event. I don't know, why.
3 makes sense : one at the begining, then one for the width and one for the height.
instead of using width and height properies use the SetBounds methods.
JDB
instead of using width and height properies use the SetBounds methods.
JDB
ASKER
Sorry, it's not clear for me. When, for example, a window is rerstored, or user resizes it with the mouse, how can I control it?
ASKER
Sorry, it's not clear for me. When, for example, a window is rerstored, or user resizes it with the mouse, how can I control it?
Stern,
Instead of OnResize try :
.
procedure WMSizing(var Msg:TMessage); message WM_SIZING;
.
procedure TForm2.WMSizing(var Msg:TMessage);
begin
{Call for your procedure}
end;
I have tested this and there was just one call to this event.
Instead of OnResize try :
.
procedure WMSizing(var Msg:TMessage); message WM_SIZING;
.
procedure TForm2.WMSizing(var Msg:TMessage);
begin
{Call for your procedure}
end;
I have tested this and there was just one call to this event.
Instead of using something like
Left:=MyLeft;
Top:=MyTop;
Width:=MyWidth;
Height:=MyHeight;
use
SetBounds(MyLeft, MyTop, MyWidth, MyHeight);
The final effect is excatly the same but all the modification are made in one time.
Left:=MyLeft;
Top:=MyTop;
Width:=MyWidth;
Height:=MyHeight;
use
SetBounds(MyLeft, MyTop, MyWidth, MyHeight);
The final effect is excatly the same but all the modification are made in one time.
ASKER
333,
I tried to use WMSizing, but it's called ONLY when user resizes the window dragging one of its bounds, and it isn't called when maximizing/restoring. WM_SIZE suits then, but - the strange thing - it's OK when window's size becomes larger. When width or height becomes smaller, it's always three calls. I thought, WM_SIZE happens after the window is resized, but now I don't know.
I tried to use WMSizing, but it's called ONLY when user resizes the window dragging one of its bounds, and it isn't called when maximizing/restoring. WM_SIZE suits then, but - the strange thing - it's OK when window's size becomes larger. When width or height becomes smaller, it's always three calls. I thought, WM_SIZE happens after the window is resized, but now I don't know.
Stern,
try to use both WMSize and WMSizing procedures:
.
procedure WMSizing(var Msg:TMessage); message WM_SIZING;
procedure WMSize(var Msg:TWMSize); message WM_SIZE;
.
procedure WMSize(var Msg:TWMSize);
begin
if Msg.SizeType>0 then
{Call for your procedure}
end;
procedure TForm2.WMSizing(var Msg:TMessage);
begin
{Call for your procedure}
end;
If SizeType=0, it means that the window is resized by dragging its bounds.
If SizeType>0, the window is minimized, maximized or restored.
AP
try to use both WMSize and WMSizing procedures:
.
procedure WMSizing(var Msg:TMessage); message WM_SIZING;
procedure WMSize(var Msg:TWMSize); message WM_SIZE;
.
procedure WMSize(var Msg:TWMSize);
begin
if Msg.SizeType>0 then
{Call for your procedure}
end;
procedure TForm2.WMSizing(var Msg:TMessage);
begin
{Call for your procedure}
end;
If SizeType=0, it means that the window is resized by dragging its bounds.
If SizeType>0, the window is minimized, maximized or restored.
AP
ASKER
I feel, I'm becoming really stupid with this problem. What should I write in WMSizing? When I write it just as you told, the window doesn't resize when dragging it's bounds.
OK,
this is my program's Unit2 (MDIChild Form). If you maximize window, then Label1 displays 'Maximized', and when you drag bounds of window, then it displays 'Resizing'.
-------------------------- ----
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm2 = class(TForm)
Label1: TLabel;
private
{ Private declarations }
public
procedure WMSize(var Msg:TWMSize); message WM_SIZE;
procedure WMSizing(var Msg:TMessage); message WM_SIZING;
{ Public declarations }
end;
var
Form2: TForm2;
implementation
{$R *.DFM}
procedure TForm2.WMSize(var Msg:TWMSize);
begin
if Msg.SizeType>0 then
Label1.Caption:='Maximized '; {Or in your case the code that changes position of your elements}
end;
procedure TForm2.WMSizing(var Msg:TMessage);
begin
Label1.Caption:='Resized'; {Or in your case the code that changes position of your elements}
end;
end.
-------------------------- ----
Just change the lines 'Label1.Caption:=...' to what you need.
P.S. If you don't understand, maybe can you post code so I can explain more.
AP
this is my program's Unit2 (MDIChild Form). If you maximize window, then Label1 displays 'Maximized', and when you drag bounds of window, then it displays 'Resizing'.
--------------------------
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm2 = class(TForm)
Label1: TLabel;
private
{ Private declarations }
public
procedure WMSize(var Msg:TWMSize); message WM_SIZE;
procedure WMSizing(var Msg:TMessage); message WM_SIZING;
{ Public declarations }
end;
var
Form2: TForm2;
implementation
{$R *.DFM}
procedure TForm2.WMSize(var Msg:TWMSize);
begin
if Msg.SizeType>0 then
Label1.Caption:='Maximized
end;
procedure TForm2.WMSizing(var Msg:TMessage);
begin
Label1.Caption:='Resized';
end;
end.
--------------------------
Just change the lines 'Label1.Caption:=...' to what you need.
P.S. If you don't understand, maybe can you post code so I can explain more.
AP
ASKER
Strange! I did all the same, and it didn't work. And now I did it once more in my app, and it didn't work. But then I made a new project, which only contained this MDIChild and these two procedures, and it works! So, the problem is somewhere in my app. I'll look for it now.
Thank you very much, and make your comment an answer, so that I can give you these points.
Stern
Thank you very much, and make your comment an answer, so that I can give you these points.
Stern
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Could you send us the code for the OnResize event?
/// John