В Delphi 12.2 отсутствуют события мыши для TGrid и TStringGrid: почему отсутствуют события onMouseDown, onMouseMove и другие, несмотря на информацию в документации?
Проблема с событиями мыши в TGrid и TStringGrid в Delphi 12.2 FireMonkey
Введение
Многие разработчики, перешедшие на Delphi 12.2, столкнулись с неожиданной проблемой: стандартные события мыши (onMouseDown, onMouseMove и другие) отсутствуют в инспекторе объектов для компонентов TGrid и TStringGrid в FireMonkey (FMX). Это вызывает недоумение, особенно учитывая, что документация утверждает обратное. В этой статье мы разберёмся в причинах этой ситуации и предложим рабочие решения.
Суть проблемы
Как отметили пользователи на форумах, в FireMonkey-версиях TGrid и TStringGrid события мыши действительно не отображаются в инспекторе объектов, хотя в VCL-версиях они присутствуют и работают корректно. Это создаёт проблемы при разработке приложений, где требуется обработка взаимодействия пользователя с сеткой.
Почему так происходит?
Как выяснилось, события мыши в FMX TGrid и TStringGrid объявлены как public, но не как published. Это означает, что:
События доступны в коде, но не отображаются в инспекторе объектов
Их можно использовать программно, но нельзя назначить через IDE
Это, вероятно, было сделано намеренно, но документация не была соответствующим образом обновлена
Решение 1: Использование событий через код
Хотя события не видны в инспекторе объектов, их можно назначить программно:
Для более удобной работы можно создать потомка 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