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

Почему кнопка закрытия перестает работать при изменении стиля отображения форм в TPageControl: решаем проблему с событиями мыши

Delphi , Компоненты и Классы , Вкладки и Страницы

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

Описание проблемы

При использовании примера из How to implement a close button for a TTabsheet of a TPageControl и добавлении кнопки закрытия и изображения из списка изображений в TPageControl, формы, добавленные как вкладки, начинают вести себя как вкладки в современных веб-браузерах. Однако, когда меняется метод создания вкладок с использованием TTabSheet на причаливание формы через свойство DragMode, события мыши перестают обрабатываться для причаленных форм, что делает кнопку закрытия неактивной.

Пример кода: создание формы через TTabSheet

procedure TMainfrm.SOTest(Sender: TObject);
var
  ATab: TTabSheet;
  AForm: TMyForm;
begin
  ATab := TTabSheet.Create(MainPageControl);
  ATab.PageControl := MainPageControl;
  MainPageControl.ActivePage := ATab;
  AForm := TMyForm.Create(ATab);
  AForm.Show;
  ATab.Caption := AForm.Caption;
end;

Пример кода: причаливание формы

procedure TMainfrm.SOTest(Sender: TObject);
var
  AForm: TMyForm;
begin
  AForm := TMyForm.Create(Application);
  AForm.Show;
  AForm.DragKind := dkDock;
  AForm.DragMode := dmAutomatic;
  AForm.ManualDock(MainPageControl, MainPageControl, alClient);
  AForm.Caption := 'StackOverFlow';
end;

Подтвержденное решение

Проблема заключается в настройке свойства DockSite компонента TPageControl. Когда это свойство активировано, при нажатии левой кнопки мыши создается объект перетаскивания, и мышь захватывается этим объектом. Это делается для автоматической перетаскиваемости формы. Таким образом, объект перетаскивания обрабатывает сообщения мыши до тех пор, пока захват не будет освобожден.

Альтернативное решение

Для решения проблемы можно переопределить обработчик сообщений WM_LBUTTONDOWN для TPageControl, чтобы проверить, кликнут ли по кнопке закрытия, и, если да, освободить захват. Ниже представлен пример кода, демонстрирующий этот подход:

type
  TPageControl = class(comctrls.TPageControl)
  private
    procedure WmLButtonDown(var Msg: TWMLButtonDown); message WM_LBUTTONDOWN;
  end;

procedure TPageControl.WmLButtonDown(var Msg: TWMLButtonDown);
var
  I: Integer;
begin
  inherited; // Наследуем обработку стандартного сообщения
  for I := 0 to Length(Mainfrm.FCloseButtonsRect) - 1 do
  begin
    if PtInRect(Mainfrm.FCloseButtonsRect[I], SmallPointToPoint(Msg.Pos)) then
    begin
      ReleaseCapture; // Освобождаем захват
      Break;
    end;
  end;
end;

Заключение

При работе с TPageControl и причаливании форм важно учитывать особенности обработки событий мыши. Предложенные решения позволят восстановить работоспособность кнопки закрытия и обеспечить корректную обработку событий мыши для причаленных форм.

Создано по материалам из источника по ссылке.

Проблема заключается в том, что при изменении стиля отображения форм в `TPageControl` на причаливаемые, события мыши перестают обрабатываться для этих форм, включая кнопку закрытия, из-за активированного свойства `DockSite`, которое захватывает мышь.


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

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




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


:: Главная :: Вкладки и Страницы ::


реклама


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

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