Какая строка набора данных появляется в самой верхней строке DBGrid, когда RowCount > VisibleRowCount без выбранной первой строки сетки?

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

Вот моя проблема. Из обработчика событий перетаскивания, прикрепленного к DBGrid, я могу определить, с какой видимой строкой DBGrid связано событие перетаскивания, используя MyGrid.MouseCoord(X,Y).Y. Если базовый набор данных содержит меньше или такое же количество записей, что и количество строк, отображаемых в DBGrid, это значение также является номером строки связанной записи в базовом наборе данных.

Если базовый набор данных содержит больше записей, чем количество видимых строк в DBGrid, MyGrid.MouseCoord(X, Y).Y и TDataSet(MyGrid.DataSource.DataSet).RecNo одинаковы только в том случае, если появляется первая строка набора данных на первом ряду сетки.

Есть ли какой-нибудь способ идентифицировать номер записи в базовом наборе данных (или смещении) самой верхней отображаемой записи в DBGrid без выбора этой строки DBGrid? Я знаю, что если я на самом деле выберу самую верхнюю строку DBGrid, я могу использовать TDataSet(MyGrid.DataSource.DataSet).RecNo, чтобы получить номер текущей записи базового набора данных. Однако из событий DBGrid.OnDragOver или DBGrid.OnDragDrop у меня есть только ссылка на DBGrid и координаты мыши (из которых я могу определить, какая строка сетки была целью перетаскивания).

Например, если я могу определить, что DBGrid отображает третью запись в базовом наборе данных в самой верхней строке таблицы, моя проблема решена. Аналогично, если я могу прочитать базовое поле TField определенной строки (скажем, самой верхней строки) без выбора этой строки, у меня есть то, что мне нужно. Однако я не вижу способа сделать это.

Любые предложения будут с благодарностью.

Изменить: ранее я публиковал блог о перетаскивании в DBGrid. С помощью этой новой информации я могу решить ранее известную проблему. Я буду обновлять этот блог где-то на этой неделе и добавлю ссылку на этот блог здесь, как только я это сделаю.

Есть дополнительная проблема. Когда количество видимых строк меньше, чем количество базовых записей, мы должны также учитывать вычисление падения, когда оно происходит после последней видимой строки. При отбрасывании после последней видимой строки MouseCoord(x,y).Y возвращает -1.

Вот модификация кода Уве, которая выполняет эту задачу:

function TDBGridHelper.RecNoFromVisibleRow(Value: Integer): Integer;
begin
  if Value = -1 then
  begin
    Result := DataSource.DataSet.RecNo - Row + TopRow + VisibleRowCount
  end
  else
  begin
    Result := DataSource.DataSet.RecNo - Row + TopRow + Value;
    if dgTitles in Options then
      Dec(Result);
  end;
end;

Редактировать: как я упоминал в исходном вопросе, мне был интересен этот ответ, чтобы исправить поведение в моем коде, которое реализует перетаскивание в DBGRid. Этим ответом я обновил свое поведение перетаскивания и написал об этом обновлении в своем блоге. Вы можете найти это обсуждение, включая ссылки на оригинальное сообщение в блоге, по следующему URL-адресу: Перетаскивание в DBGrid, повторное посещение

1 ответ

Решение

Пока существует только смещение между DataSet.RecNo и видимым номером строки в сетке, вы можете получить необходимую информацию от защищенных членов Row и TopRow, к которым может обращаться помощник класса. Что-то вроде этого:

function TDbGridHelper.RecNoFromVisibleRow(Value: Integer): Integer;
begin
  Result := DataSource.DataSet.RecNo - Row + TopRow + Value;
  if dgTitles in Options then
    Dec(Result);
end;
Другие вопросы по тегам