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

В Delphi 12.2 отсутствуют события мыши для TGrid и TStringGrid: почему отсутствуют события onMouseDown, onMouseMove и другие, несмотря на информацию в документации?

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

Проблема с событиями мыши в TGrid и TStringGrid в Delphi 12.2 FireMonkey

Введение

Многие разработчики, перешедшие на Delphi 12.2, столкнулись с неожиданной проблемой: стандартные события мыши (onMouseDown, onMouseMove и другие) отсутствуют в инспекторе объектов для компонентов TGrid и TStringGrid в FireMonkey (FMX). Это вызывает недоумение, особенно учитывая, что документация утверждает обратное. В этой статье мы разберёмся в причинах этой ситуации и предложим рабочие решения.

Суть проблемы

Как отметили пользователи на форумах, в FireMonkey-версиях TGrid и TStringGrid события мыши действительно не отображаются в инспекторе объектов, хотя в VCL-версиях они присутствуют и работают корректно. Это создаёт проблемы при разработке приложений, где требуется обработка взаимодействия пользователя с сеткой.

Почему так происходит?

Как выяснилось, события мыши в FMX TGrid и TStringGrid объявлены как public, но не как published. Это означает, что:

  1. События доступны в коде, но не отображаются в инспекторе объектов
  2. Их можно использовать программно, но нельзя назначить через IDE
  3. Это, вероятно, было сделано намеренно, но документация не была соответствующим образом обновлена

Решение 1: Использование событий через код

Хотя события не видны в инспекторе объектов, их можно назначить программно:

procedure TForm1.FormCreate(Sender: TObject);
begin
  StringGrid1.OnMouseDown := StringGridMouseDown;
  StringGrid1.OnMouseMove := StringGridMouseMove;
  StringGrid1.OnMouseUp := StringGridMouseUp;
end;

procedure TForm1.StringGridMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Single);
begin
  // Обработка нажатия кнопки мыши
  ShowMessageFmt('MouseDown at X: %f, Y: %f', [X, Y]);
end;

procedure TForm1.StringGridMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Single);
begin
  // Обработка перемещения мыши
  Caption := Format('Mouse position: %f, %f', [X, Y]);
end;

procedure TForm1.StringGridMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Single);
begin
  // Обработка отпускания кнопки мыши
  ShowMessageFmt('MouseUp at X: %f, Y: %f', [X, Y]);
end;

Решение 2: Создание наследника компонента

Для более удобной работы можно создать потомка TStringGrid с опубликованными событиями:

type
  TMyStringGrid = class(TStringGrid)
  published
    property OnMouseDown;
    property OnMouseMove;
    property OnMouseUp;
    property OnClick;
    property OnDblClick;
  end;

После этого зарегистрируйте компонент в палитре:

procedure Register;
begin
  RegisterComponents('MyComponents', [TMyStringGrid]);
end;

Теперь в инспекторе объектов будут доступны все события мыши.

Решение 3: Использование GestureManager

В FireMonkey можно использовать GestureManager для обработки жестов, что иногда является более предпочтительным способом:

procedure TForm1.FormCreate(Sender: TObject);
begin
  StringGrid1.Touch.InteractiveGestures := [TInteractiveGesture.Pan, TInteractiveGesture.Zoom];
  StringGrid1.Touch.GestureManager := GestureManager1;
end;

procedure TForm1.GestureManager1Gesture(Sender: TObject;
  const EventInfo: TGestureEventInfo; var Handled: Boolean);
begin
  case EventInfo.GestureID of
    igiPan:
      begin
        // Обработка перемещения
      end;
    igiZoom:
      begin
        // Обработка масштабирования
      end;
  end;
end;

Альтернативное решение: обработка сообщений

Для сложных сценариев можно перехватывать сообщения Windows:

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    procedure FormCreate(Sender: TObject);
  private
    procedure WMMouseMove(var Message: TWMMouseMove); message WM_MOUSEMOVE;
    procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN;
  end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  StringGrid1.HitTest := True; // Важно для получения событий
end;

procedure TForm1.WMMouseMove(var Message: TWMMouseMove);
var
  Pt: TPointF;
begin
  Pt := StringGrid1.ScreenToLocal(PointF(Message.XPos, Message.YPos));
  if StringGrid1.BoundsRect.Contains(Pt) then
  begin
    // Мышь над StringGrid
    Caption := Format('Mouse over grid: %f, %f', [Pt.X, Pt.Y]);
  end;
  inherited;
end;

procedure TForm1.WMLButtonDown(var Message: TWMLButtonDown);
var
  Pt: TPointF;
begin
  Pt := StringGrid1.ScreenToLocal(PointF(Message.XPos, Message.YPos));
  if StringGrid1.BoundsRect.Contains(Pt) then
  begin
    // Клик по StringGrid
    ShowMessageFmt('Clicked at: %f, %f', [Pt.X, Pt.Y]);
  end;
  inherited;
end;

Заключение

Хотя отсутствие событий мыши в инспекторе объектов для FMX TGrid и TStringGrid в Delphi 12.2 может вызывать недоумение, существует несколько рабочих способов обойти эту проблему. Наиболее универсальным решением является создание потомка компонента с опубликованными событиями, что обеспечивает удобство работы через IDE без потери функциональности.

Разработчикам следует учитывать эту особенность при миграции проектов с VCL на FireMonkey и выбирать подходящий метод обработки событий в зависимости от требований конкретного приложения.

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

В Delphi 12.2 FireMonkey события мыши отсутствуют в инспекторе объектов для компонентов TGrid и TStringGrid, но существуют обходные пути, включая использование событий через код, создание наследника компонента, использование GestureManager или обработку


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

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




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


:: Главная :: TStringGrid и TDrawGrid ::


реклама


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

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