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

Как в TDBGrid узнать над каким полем висит мышь

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

Как в TDBGrid узнать над каким полем висит мышь

Автор: Бурундук

Лежат как то системщик с подругою в постели, вот только что у них всё закончилось ... Она его ласково так спрашивает:
- Милый, Save of changes, Yes or Not?


var
  ScrPt, GrdPt: TPoint;
  Cell: TGridCoord;
begin
  ScrPt := Mouse.CursorPos;
  GrdPt := DBGrid.ScreenToClient(ScrPt);
  Cell := DBGrid.MouseCoord(GrdPt.X, GrdPt.Y);
  // Col := Cell.X;
  // Row := Cell.Y;
end;


 ...
 FieldText: string;
 DLink: TDataLink;
 OldActiveRec: Integer;
 ... 
 Cell := DBGrid.MouseCoord(GrdPt.X, GrdPt.Y);
 FieldText := '';   
 DLink := THackDBGrid(DBGrid).DataLink;
 if Assigned(DLink) then
 begin
   if (Cell.X < = 0)or(Cell.Y < = 0) then Exit;
   OldActiveRec := DLink.ActiveRecord;
   try
     DLink.ActiveRecord := Cell.Y-1{TitleOffset};
     FieldText := DBGrid.Columns[Cell.X-1{IndicatorOffset}].Field.Text;
   finally
     DLink.ActiveRecord := OldActiveRec;
   end;
 end;

Классическая задача Delphi!

Чтобы определить, над каким полем мышь находится в TDBGrid, можно использовать метод MouseCoord, предоставляемый контролем grid.

В вашем коде происходит следующее:

  1. Получается текущая позиция курсора с помощью Mouse.CursorPos.
  2. Конвертируется эта позиция в координаты экрана с помощью ScreenToClient.
  3. Затем эти координаты используются в качестве входных данных для метода MouseCoord, который возвращает структуру TGridCoord, содержащую индексы столбца и строки ячейки под мышей.

В вашем коде также проверяется, является ли ячейка валидной (т. е., не находится за пределами границ) перед попыткой доступа к ее свойствам. Это хорошая практика!

Теперь давайте поговорим о альтернативном подходе: вместо использования MouseCoord можно использовать метод GetCellOrigin, предоставляемый TDBGrid.

Метод GetCellOrigin возвращает структуру TRect, содержащую координаты ячейки, которая содержит курсор мыши. Вы можете извлечь индексы столбца и строки из этого прямоугольника с помощью его свойств Left и Top.

Вот пример:

var
  CellRect: TRect;
  CellX, CellY: Integer;

// ...
CellRect := DBGrid.GetCellOrigin();
if CellRect.Left > 0 then
begin
  CellX := (CellRect.Left - DBGrid.Left) div DBGrid.Columns[0].Width;
  CellY := (CellRect.Top - DBGrid.Top) div DBGrid.RowHeights[0];
end;

Этот подход может быть более эффективным, так как он avoids the overhead of calling MouseCoord и выполняет расчеты внутренне.

Однако помните, что оба подхода имеют свои ограничения. Например, GetCellOrigin работает только в том случае, если мышь находится над валидной ячейкой, а MouseCoord может возвращать недопустимые координаты, если мышь не находится над ячейкой (например, когда курсор находится над заголовками grid).

Таким образом, выбор подхода зависит от вашего конкретного требования и поведения, которое вы хотите достичь.

В статье описывается, как в TDBGrid можно узнать над каким полем висит мышь и получить текст поля.


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

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




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


:: Главная :: TDBGrid ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 16:53:08/0.0033519268035889/0