rpo
asked on
Multiple nested panels resize problem
There is a strange problem with panels resizing when thre are many (10-40) nested panels (TPanel) with Align=alClient.
The problem - when form with the panels is resized, not all the panels adjust their size.
The number of panels needed to see the problem vary on different computers.
Is this Delphi or Windows problem? Does anybody know a solution?
Simple demonstration of the problem - compile and run a project with following form, set the value in edit box to 20 or 30, press Refresh and then resize the form (enlarge it).
The form code is :
-----------------------
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Spin, ExtCtrls;
type
TForm1 = class(TForm)
Panel1: TPanel;
btnRefresh: TButton;
se: TSpinEdit;
procedure btnRefreshClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.btnRefreshClick(Sen der: TObject);
var
i : integer;
NewPane,
Pane : TPanel;
begin
with Panel1 do for i:= 0 to ControlCount - 1 do
Controls[i].Free;
Pane:= Panel1;
for i:= 2 to se.Value do begin
NewPane:= TPanel.Create(Pane);
with NewPane do begin
Caption:= 'Nesting level = ' + IntToStr(i);
Align:= alClient;
BorderWidth:= 2;
BevelWidth:= 2;
Parent:= Pane;
end;
Pane:= NewPane;
end;
end;
end.
-----------------------
The .dfm is :
-----------------------
object Form1: TForm1
Left = 385
Top = 23
Width = 595
Height = 380
Caption = 'Form1'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object Panel1: TPanel
Left = 0
Top = 0
Width = 587
Height = 289
Align = alTop
BevelWidth = 3
BorderWidth = 2
Caption = 'Panel1'
TabOrder = 0
end
object btnRefresh: TButton
Left = 56
Top = 312
Width = 75
Height = 25
Caption = 'Refresh'
TabOrder = 1
OnClick = btnRefreshClick
end
object se: TSpinEdit
Left = 160
Top = 312
Width = 121
Height = 22
MaxValue = 222
MinValue = 2
TabOrder = 2
Value = 20
end
end
-----------------------
The problem - when form with the panels is resized, not all the panels adjust their size.
The number of panels needed to see the problem vary on different computers.
Is this Delphi or Windows problem? Does anybody know a solution?
Simple demonstration of the problem - compile and run a project with following form, set the value in edit box to 20 or 30, press Refresh and then resize the form (enlarge it).
The form code is :
-----------------------
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Spin, ExtCtrls;
type
TForm1 = class(TForm)
Panel1: TPanel;
btnRefresh: TButton;
se: TSpinEdit;
procedure btnRefreshClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.btnRefreshClick(Sen
var
i : integer;
NewPane,
Pane : TPanel;
begin
with Panel1 do for i:= 0 to ControlCount - 1 do
Controls[i].Free;
Pane:= Panel1;
for i:= 2 to se.Value do begin
NewPane:= TPanel.Create(Pane);
with NewPane do begin
Caption:= 'Nesting level = ' + IntToStr(i);
Align:= alClient;
BorderWidth:= 2;
BevelWidth:= 2;
Parent:= Pane;
end;
Pane:= NewPane;
end;
end;
end.
-----------------------
The .dfm is :
-----------------------
object Form1: TForm1
Left = 385
Top = 23
Width = 595
Height = 380
Caption = 'Form1'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object Panel1: TPanel
Left = 0
Top = 0
Width = 587
Height = 289
Align = alTop
BevelWidth = 3
BorderWidth = 2
Caption = 'Panel1'
TabOrder = 0
end
object btnRefresh: TButton
Left = 56
Top = 312
Width = 75
Height = 25
Caption = 'Refresh'
TabOrder = 1
OnClick = btnRefreshClick
end
object se: TSpinEdit
Left = 160
Top = 312
Width = 121
Height = 22
MaxValue = 222
MinValue = 2
TabOrder = 2
Value = 20
end
end
-----------------------
ASKER
Hmm, i tested it in D4 and D6 - there is a problem.
What Windows did you test on?
What Windows did you test on?
ASKER
Can you send me the exe compiled in D3, please?
E-mail : rpo@crosswinds.net
E-mail : rpo@crosswinds.net
Hi rpo,
The file is sent :)
T
The file is sent :)
T
ASKER
Thanks a lot, tongalite.
I check it in W2K - it works wrong with your exe too. Probably, it's OS problem, not Delphi.
Thank you, anyway.
Just to make clear what i'm talking about - here is the screenshot : http://t2.technion.ac.il/~sromanp/nestedpanels.jpg
I check it in W2K - it works wrong with your exe too. Probably, it's OS problem, not Delphi.
Thank you, anyway.
Just to make clear what i'm talking about - here is the screenshot : http://t2.technion.ac.il/~sromanp/nestedpanels.jpg
Hi again,
I looked at your screenshot and I see what you mean. No, It works fine for me (as it should do)???
Must be your OS.
I mailed you a screenshot.
T.
I looked at your screenshot and I see what you mean. No, It works fine for me (as it should do)???
Must be your OS.
I mailed you a screenshot.
T.
ASKER
Increased point.
ASKER
After some investigation I see that inner panels do not receive the WM_PAINT message and if I force them to receive the message (usng SendMessage from the WMPaint method of outer panels) they do run the Paint code, but nothing happens on the screen.
Does Win2K have any limitations on number of "active" device contexts (or whatever)?
Does Win2K have any limitations on number of "active" device contexts (or whatever)?
Perhaps the problem is in the order you set the properties. Try to set the Parent the first thing after creation (and Align last thing, just in case):
Pane:= Panel1;
for i := 2 to se.Value do
begin
NewPane:= TPanel.Create(Pane);
with NewPane do
begin
Parent:= Pane;
Caption:= 'Nesting level = ' + IntToStr(i);
BorderWidth:= 2;
BevelWidth:= 2;
Align:= alClient;
end;
Pane:= NewPane;
end;
Not tested.
Pane:= Panel1;
for i := 2 to se.Value do
begin
NewPane:= TPanel.Create(Pane);
with NewPane do
begin
Parent:= Pane;
Caption:= 'Nesting level = ' + IntToStr(i);
BorderWidth:= 2;
BevelWidth:= 2;
Align:= alClient;
end;
Pane:= NewPane;
end;
Not tested.
ASKER
Well, this is code only demonstrates the problem. In actual application the panel are not created the same way (they are not created dynamically at all), but the problem still exists.
Anyway, I tried you suggestion - it doesn't help :(.
Anyway, I tried you suggestion - it doesn't help :(.
listening . . . trying later
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Just a smile:
Why don't you like it?. It looks very nice your screenshot.
Why don't you like it?. It looks very nice your screenshot.
Just a smile:
Why don't you like it?. It looks very nice your screenshot.
Why don't you like it?. It looks very nice your screenshot.
ASKER
Thanks a lot Lee_Nover!
Your answer works fine and does the job, although a bit slow (but it's ok).
It took some time to make it fit in the real application (ActiveXes, panels, embedded forms, etc.) but it works.
You get all the points. 500 here and another 300 in https://www.experts-exchange.com/jsp/qManageQuestion.jsp?qid=20316349 . Just put some comment there so I can accept it as the answer.
Although we have a nice workaround, it's still interesting why the original Delphi code does not work.
Your answer works fine and does the job, although a bit slow (but it's ok).
It took some time to make it fit in the real application (ActiveXes, panels, embedded forms, etc.) but it works.
You get all the points. 500 here and another 300 in https://www.experts-exchange.com/jsp/qManageQuestion.jsp?qid=20316349 . Just put some comment there so I can accept it as the answer.
Although we have a nice workaround, it's still interesting why the original Delphi code does not work.
I just imported your demo into D3 Pro...
It works perfectly :)
All the panels are resized as they should be (nesting level 0 to 35)
No problem.
T.