[Webinar] Streamline your web hosting managementRegister Today

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

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(Sender: 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
-----------------------

0
rpo
Asked:
rpo
  • 7
  • 3
  • 2
  • +3
1 Solution
 
tongaliteCommented:
Hi
 
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.

0
 
rpoAuthor Commented:
Hmm, i tested it in D4 and D6 - there is a problem.

What Windows did you test on?
0
 
rpoAuthor Commented:
Can you send me the exe compiled in D3, please?
E-mail : rpo@crosswinds.net
0
Take Control of Web Hosting For Your Clients

As a web developer or IT admin, successfully managing multiple client accounts can be challenging. In this webinar we will look at the tools provided by Media Temple and Plesk to make managing your clients’ hosting easier.

 
tongaliteCommented:
Hi rpo,

The file is sent :)
T
0
 
rpoAuthor Commented:
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
0
 
tongaliteCommented:
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.
0
 
rpoAuthor Commented:
Increased point.
0
 
rpoAuthor Commented:
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)?
0
 
TOndrejCommented:
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.
0
 
rpoAuthor Commented:
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 :(.
0
 
kretzschmarCommented:
listening . . . trying later
0
 
Lee_NoverCommented:
I gave it a try and it works fine for me ...
ofcourse when this code applied :))

procedure ResizePanel(Panel: TPanel);
var msg: TMessage;
    I: Integer;
begin
     with Panel do
     begin
       FillChar(msg, SizeOf(msg), 0);
       msg.Msg:=WM_SIZE;
       WindowProc(msg);
       Parent.Invalidate;
     end;
     Application.ProcessMessages;

     // now resize the child panels
     for I:=0 to Panel.ControlCount-1 do
         if Panel.Controls[I] is TPanel then
            ResizePanel(TPanel(Panel.Controls[I]));
end;

procedure TForm1.FormResize(Sender: TObject);
begin
     ResizePanel(Panel1);
end;


might be a bit slow but it works (tried up to 80 panels, more wouldn't fit the screen :))
0
 
FelixinCommented:
Just a smile:

Why don't you like it?. It looks very nice your screenshot.
0
 
FelixinCommented:
Just a smile:

Why don't you like it?. It looks very nice your screenshot.
0
 
rpoAuthor Commented:
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  http://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.
0

Featured Post

Receive 1:1 tech help

Solve your biggest tech problems alongside global tech experts with 1:1 help.

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