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

Ограничение на изменение размера формы по размеру панели на ней

Delphi , Программа и Интерфейс , Размеры и Положение



Автор: Xavier Pacheco

{
Copyright © 1999 by Delphi 5 Developer's Guide - Xavier Pacheco and Steve Teixeira
}

unit BlueBackFrm;

interface

uses
  SysUtils, Windows, Messages, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Buttons, ExtCtrls;

type
  TBlueBackForm = class(TForm)
    pnlMain: TPanel;
    bbtnOK: TBitBtn;
    bbtnCancel: TBitBtn;
    procedure FormResize(Sender: TObject);
  private
    procedure CenterPanel;
    { Create a message handler for the WM_WINDOWPOSCHANGING message }
    procedure WMWindowPosChanging(var Msg: TWMWindowPosChanging);
      message WM_WINDOWPOSCHANGING;
  end;

var
  BlueBackForm: TBlueBackForm;

implementation
uses Math;
{$R *.DFM}

procedure TBlueBackForm.CenterPanel;
{ This procedure centers the main panel horizontally and
  vertically inside the form's client area
}
begin
  { Center horizontally }
  if pnlMain.Width < ClientWidth then
    pnlMain.Left := (ClientWidth - pnlMain.Width) div 2
  else
    pnlMain.Left := 0;

  { Center vertically }
  if pnlMain.Height < ClientHeight then
    pnlMain.Top := (ClientHeight - pnlMain.Height) div 2
  else
    pnlMain.Top := 0;
end;

procedure TBlueBackForm.WMWindowPosChanging(var Msg: TWMWindowPosChanging);
var
  CaptionHeight: integer;
begin
  { Calculate the caption height }
  CaptionHeight := GetSystemMetrics(SM_CYCAPTION);
  { This procedure does not take into account the width and
    height of the form's frame. You can use
    GetSystemMetrics() to obtain these values. }

  // Prevent window from shrinking smaller then MainPanel's width
  Msg.WindowPos^.cx := Max(Msg.WindowPos^.cx, pnlMain.Width + 20);

  // Prevent window from shrinking smaller then MainPanel's width
  Msg.WindowPos^.cy := Max(Msg.WindowPos^.cy, pnlMain.Height + 20 +
    CaptionHeight);

  inherited;
end;

procedure TBlueBackForm.FormResize(Sender: TObject);
begin
  CenterPanel; // Center MainPanel when the form is resized.
end;

end.

Перевод на русский язык:

Код-snippet на Delphi предназначен для предотвращения изменения размера формы smaller than ее основной панели. Класс TBlueBackForm наследуется от TForm и включает в себя два кнопки (bbtnOK и bbtnCancel) и одну панель (pnlMain). Когда форма изменяется размером, она вызывает процедуру CenterPanel, чтобы центрировать панель горизонтально и вертикально внутри клиентской области формы.

Основной целью этого кода является предотвратить изменение размера формы smaller than ее основной панели. Это можно достичь путем переопределения обработчика сообщения WMWindowPosChanging в классе TBlueBackForm. Событие WMWindowPosChanging происходит перед тем, как окно будет изменено размером, позволяя вам модифицировать новую позицию и размер окна.

В этом коде, когда форма готовится к изменению размера, она рассчитывает высоту заголовка с помощью функции GetSystemMetrics. Затем она устанавливает минимальную ширину и высоту формы на основе размера основной панели. Если пользователь пытается изменить размер формы smaller than ее основной панели, форма не будет изменена.

Вот несколько предложений для улучшения кода:

  1. Рассмотрите добавление более подробных комментариев к каждому разделу кода.
  2. Вам может потребоваться добавить обработку ошибок в случае любых расчетов или присваиваний, которые могут не выполниться.
  3. Вместо использования жестких значений, таких как 20 и CaptionHeight, вы можете определить константы для этих значений на верхушке вашего модуля.
  4. Было бы полезно включить краткое описание цели каждой процедуры, например, описать цель процедуры CenterPanel.

Вот обновленный код с комментариями и обработкой ошибок:

unit BlueBackFrm;

interface

uses
  SysUtils, Windows, Messages, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Buttons, ExtCtrls;

type
  TBlueBackForm = class(TForm)
    pnlMain: TPanel;
    bbtnOK: TBitBtn;
    bbtnCancel: TBitBtn;
    procedure FormResize(Sender: TObject);
  private
    procedure CenterPanel;
    procedure WMWindowPosChanging(var Msg: TWMWindowPosChanging); message WM_WINDOWPOSCHANGING;
  end;

var
  BlueBackForm: TBlueBackForm;

implementation

uses Math;

{$R *.DFM}

procedure TBlueBackForm.CenterPanel;
begin
  // Центрировать горизонтально
  if pnlMain.Width < ClientWidth then
    pnlMain.Left := (ClientWidth - pnlMain.Width) div 2
  else
    pnlMain.Left := 0;

  // Центрировать вертикально
  if pnlMain.Height < ClientHeight then
    pnlMain.Top := (ClientHeight - pnlMain.Height) div 2
  else
    pnlMain.Top := 0;
end;

procedure TBlueBackForm.WMWindowPosChanging(var Msg: TWMWindowPosChanging);
var
  CaptionHeight: integer;
begin
  // Рассчитать высоту заголовка
  CaptionHeight := GetSystemMetrics(SM_CYCAPTION);

  try
    // Предотвратить изменение размера формы smaller than ее основной панели
    Msg.WindowPos.cx := Max(Msg.WindowPos.cx, pnlMain.Width + Constants.FormBorderWidth);

    // Предотвратить изменение размера формы smaller than ее основной панели
    Msg.WindowPos.cy := Max(Msg.WindowPos.cy, pnlMain.Height + CaptionHeight + Constants.FormBorderHeight);
  except
    on E: Exception do
      ShowMessage('Ошибка изменения размера формы: ' + E.Message);
  end;

  inherited;
end;

procedure TBlueBackForm.FormResize(Sender: TObject);
begin
  CenterPanel; // Центрировать основную панель при изменении размера формы.
end;

const
  FormBorderWidth = 20;
  FormBorderHeight = 20;

end.

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

Ограничение на изменение размера формы по размеру панели на ней обеспечивается посредством обработки события WM_WINDOWPOSCHANGING и изменения параметра WindowPos.cx или cy, чтобы форм не уменьшалась до размера панели.


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

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




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


:: Главная :: Размеры и Положение ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 01:25:28/0.0035800933837891/0