[Back to DELPHI SWAG index] [Back to Main SWAG index] [Original]

    {
    Here's the source code for a resizable panel.  Give the panel an align
    property of alClient, throw some controls on it, and watch them resize
    at run time when you resize the form.  There is some code that prohibits
    resizing during design time, but this can be taken out.  This may not be
    perfect, because I threw it together in a few minutes, but it's worked
    for me so far.
    }

    unit Elastic;

    interface

    uses
      SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
      Forms, Dialogs, ExtCtrls;

    type
      TElasticPanel = class( TPanel )
      private
         FHorz, FVert: boolean;
         nOldWidth, nOldHeight: integer;
         bResized: boolean;
      protected
         procedure WMSize( var message: TWMSize ); message WM_SIZE;
      public
         nCount: integer;
         constructor Create( AOwner: TComponent ); override;
      published
         property ElasticHorizontal: boolean read FHorz write FHorz default
    TRUE;
         property ElasticVertical: boolean read FVert write FVert default
    TRUE;
      end;

    procedure Register;

    implementation

    constructor TElasticPanel.Create( AOwner: TComponent );
    begin
      inherited Create( AOwner );
      FHorz := TRUE;
      FVert := TRUE;
      nOldWidth := Width;
      nOldHeight := Height;
      bResized := FALSE;
    end;

    procedure TElasticPanel.WMSize( var message: TWMSize );
    var
      bResize: boolean;
      xRatio: real;
      i: integer;
      ctl: TWinControl;
    begin
      Inc( nCount );
      if Align = alNone then
         bResize := TRUE
      else
         bResize := bResized;
      if not ( csDesigning in ComponentState ) and bResize then
         begin
            if FHorz then
               begin
                  xRatio := Width / nOldWidth;
                  for i := 0 to ControlCount - 1 do
                     begin
                        ctl := TWinControl( Controls[i] );
                        ctl.Left := Round( ctl.Left * xRatio );
                        ctl.Width := Round( ctl.Width * xRatio );
                     end;
               end;
            if FVert then
               begin
                  xRatio := Height / nOldHeight;
                  for i := 0 to ControlCount - 1 do
                     begin
                        ctl := TWinControl( Controls[i] );
                        ctl.Top := Round( ctl.Top * xRatio );
                        ctl.Height := Round( ctl.Height * xRatio );
                     end;
               end;
         end
      else
         begin
            nOldWidth := Width;
            nOldHeight := Height;
         end;
      bResized := TRUE;
      nOldWidth := Width;
      nOldHeight := Height;
    end;

    procedure Register;
    begin
      RegisterComponents('Additional', [TElasticPanel]);
    end;

    end.

[Back to DELPHI SWAG index] [Back to Main SWAG index] [Original]