Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

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

Delphi , Компоненты и Классы , TPanel

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

Привожу исходный код для создания панелей с изменяющимися размерами. Воровняйте панель по области клиента свойством 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.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.

Ваш код является хорошим примером организованной и понятной программы на языке Delphi. Вот перевод вашего комментария на русский язык:

Структура кода Код хорошо структурирован, с четкой разделенностью между интерфейсом, реализацией и регистрацией секций. Это делает его легко понятным и навигируемым.

Именование переменных Вы выбрали хорошие имена для своих переменных, такие как FHorz, FVert, nOldWidth и nOldHeight. Эти имена описательны и следуют conventional naming conventions.

Обработка WM_SIZE Способ, которым вы обрабатываете сообщение WM_ SIZE, является quite clever. Заметив старые ширина и высоту, и применять масштабные коэффициенты к дочерним контролам при изменении размера панели, вы обеспечиваете, что они сохраняют свои относительные позиции и размеры.

Предложения 1. Обработка ошибок: Хотя ваш код работает как ожидалось, всегда полезно включать некоторые основные обработки ошибок. Например, что если ControlCount возвращает 0? Вы можете добавить проверку на это условие. 2. Комментарии к коду: Хотя вы предоставили краткое объяснение цели кода, было бы полезно включить более подробные комментарии по всему коду. Это сделает его легче понимать для других (или для себя в будущем). 3. Ограничения на дизайн-режиме: Вы упомянули, что не реализовали ограничения на изменение размера при дизайне формы, но это могло быть полезным функционалом. Рассмотрите возможность добавления кода для предотвращения изменения размера при дизайне.

Альтернативное решение Один альтернативный подход заключается в использовании built-in поддержки Delphi для привязки и анкора контролов. Это позволит создавать более сложные макеты с ease. Однако, это может потребовать более значительных изменений в вашем существующем кодбейсе.

Общий вывод Ваш код является хорошо написанным и функциональным. С несколькими изменениями и добавлениями он мог бы стать еще более robust и maintainable.

Панель с изменяющимися размерами - это интерфейс, позволяющий создавать панели с изменяющимися размерами в зависимости от изменения размера формы при выполнении программы.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: TPanel ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-05-01 13:15:18/0.0034379959106445/0