Как получить щелкнутый столбец в TDBGrid.DblClick(Sender: TObject)?

При использовании события OnDblClick TDBGrid, как я могу узнать, какой столбец был дважды щелкнут?

Это легко сделать с OnCellClick, поскольку он имеет параметр TColumn, но не OnDblClick.

3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
0
0
89
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Событие OnDblClick не предоставляет вам информацию Любые о клике, в частности, где был выполнен клик, не говоря уже о том, на какой ячейке сетки был сделан клик. Таким образом, вам придется определить эту информацию вручную.

Попробуй это:

  • Получите текущую позицию мыши в сетке, передав Mouse.CursorPos в TDBGrid.ScreenToClient()
  • Затем используйте TDBGrid.MouseCoord(), чтобы определить индексы строки/столбца ячейки, находящейся под мышью.
  • Затем проверьте, соответствует ли строка/столбец ячейки ячейке данных, и если да, то используйте свойство TDBGrid.SelectedIndex для индексации свойства TDBGrid.Columns.

Это в основном то же самое, что TDBGrid делает внутри при запуске события OnCellClick, только оно делает это в ответ на событие MouseUp, которое предоставляет координаты мыши в сетке, таким образом пропуская 1-й шаг выше.

Например:

type
  TDBGridAccess = class(TDBGrid)
  end;

procedure TMyForm1.DBGrid1DblClick(Sender: TObject);
var
  TitleOffset: Byte;
  Pt: TPoint;
  Cell: TGridCoord;
  Column: TColumn;
begin
  TitleOffset := Ord(dgTitles in DBGrid1.Options);
  Pt := DBGrid1.ScreenToClient(Mouse.CursorPos);
  Cell := DBGrid1.MouseCoord(Pt.X, Pt.Y);
  if (Cell.X >= TDBGridAccess(DBGrid1).IndicatorOffset) and (Cell.Y >= TitleOffset) then
  begin
    Column := DBGrid1.Columns[DBGrid1.SelectedIndex];
    // use Column as needed...
  end;
end;

ОБНОВИТЬ: судя по комментариям @UweRaabe, вы можете просто использовать TDBGrid.SelectedIndex отдельно:

procedure TMyForm1.DBGrid1DblClick(Sender: TObject);
var
  Index: Integer;
  Column: TColumn;
begin
  Index := DBGrid1.SelectedIndex;
  if (Index <> -1) then
  begin
    Column := DBGrid1.Columns[Index];
    // use Column as needed...
  end;
end;

Большое спасибо, но я получаю «[Ошибка dcc32]: E2362 Не удается получить доступ к защищенному символу TCustomDBGrid.IndicatorOffset». Я на Delphi 11.0, есть идеи, пожалуйста?

delphirules 22.04.2022 21:51

Вы можете использовать класс доступа для доступа к protected участникам. Я обновил свой пример, чтобы показать это.

Remy Lebeau 22.04.2022 21:59

Шикарный Реми, спасибо!

delphirules 22.04.2022 22:04

@UweRaabe TDBGrid не происходит от TCustomDrawGrid

Remy Lebeau 22.04.2022 22:55

@UweRaabe "Хорошо, тогда вы можете использовать MouseCoord" - вы не видите, что я использую его в моем примере выше?

Remy Lebeau 23.04.2022 00:34

Во время TDBGrid.OnDblClick набор данных позиционируется на выбранную запись, и столбец может быть получен с помощью свойства TDBGrid.SelectedIndex. Если вас интересует базовое поле набора данных, вы можете напрямую получить к нему доступ с помощью TDBGrid.SelectedField.

Уверены ли вы? Когда я смотрю на исходный код TDBGrid, кажется, что событие OnDblClick запускается (в TCustomDBGrid.MouseDown(), когда ssDouble находится в Shift) до обновления набора данных. Если активная запись не обновляется при первом нажатии мыши, до того, как второе нажатие мыши запустит событие? Думаю, это имело бы смысл.

Remy Lebeau 22.04.2022 22:59

@RemyLebeau Да, первый щелчок выбирает запись и столбец. Вы можете видеть это, когда вы устанавливаете точку останова в MouseDown со значением счетчика 2.

Uwe Raabe 23.04.2022 00:22

Другие вопросы по теме