Панель с изменяющимися размерами

Панель с изменяющимися размерами Привожу исходный код для создания панелей с изменяющимися размерами. Воровняйте панель по области клиента свойством alClient, расположите на ней несколько элементов управления и посмотрите как меняются размеры во время изменения размера формы при выполнении программы. Можно расширить код и запретить изменения размеров во время проектирования, но это я оставляю для вас. Данная технология может и не идеальна, поскольку я накропал код за считанные минуты, но для выполнения моих задач этого достаточно.

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. := Round(ctl. * 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.
http://delphiworld.narod.ru/ DelphiWorld 6.0

Отправить комментарий

Проверка
Антиспам проверка
Image CAPTCHA
...