Как получить номер средней строки в текущем представлении DBGrid

Может ли кто-нибудь помочь мне получить номер средней строки текущего представления DBGrid?

Я смог получить следующее, но не смог получить номер строки. Я тоже не знаю, для чего это.

DBGRid1.CenterCurRowInView

Обновление: кстати, сетка находится в состоянии прокрутки.

Добавление скриншота:

введите здесь описание изображения


person RickyBelmont    schedule 06.06.2021    source источник
comment
Объясните, пожалуйста, зачем вам средний номер строки?   -  person fpiette    schedule 06.06.2021
comment
Рики, у вас уже есть ответ, который вы отметили как правильный, но я все же прошу вас уточнить это: вы имеете в виду номер средней строки сетки - 11 в вашем примере, поскольку ваша сетка может отображать 21 строку данных? Или вы имеете в виду номер записи набора данных, отображаемый в средней строке, который в примере равен 11, поскольку он не прокручивается? Но может быть, например. 21, если отображаемые строки набора данных 11 - 31. Я спрашиваю, поскольку вы подчеркнули, что сетка находится в прокручиваемом состоянии, что будет иметь значение только в последнем случае.   -  person Tom Brunberg    schedule 07.06.2021
comment
@TomBrunberg Да, Том. 11 только пример. Это действительно зависит от того, какое видимое состояние прокрутки. Это может быть другой номер. Я имею в виду отображение сетки, а не набор данных.   -  person RickyBelmont    schedule 08.06.2021
comment
@fpiette Мне нужен номер средней строки, потому что есть процедура, которую я сделал, когда она идет после средней строки. Это мое уникальное требование, но теперь оно работает.   -  person RickyBelmont    schedule 08.06.2021


Ответы (2)


Мой ответ здесь показывает, как определить текущий номер строки и количество строк в DBGrid:

type
  TMyDBGrid = Class(TDBGrid);

function TForm1.GetGridRow: Integer;
begin
  Result := TmyDBGrid(DBGrid1).Row;
end;

function TForm1.GridRowCount : Integer;
begin
  Result := TmyDBGrid(DBGrid1).RowCount;
end;

Это позволяет избежать необходимости в помощнике класса и будет работать в версиях Delphi, которые предшествуют их поддержке.

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

person MartynA    schedule 06.06.2021
comment
Ваше решение является классом интерпозера! И у вас есть две вспомогательные функции (не вспомогательные функции класса). - person fpiette; 06.06.2021
comment
Я понимаю что ты имеешь ввиду. - person MartynA; 06.06.2021
comment
@MartynA Спасибо за этот ответ! Хотя есть небольшие проблемы, которые я должен исправить сам, но в основном это работает. - person RickyBelmont; 07.06.2021

Количество строк сетки определяется по формуле:

RowCount := DBGrid1.ClientHeight div (RowHeight + 1);

Средняя строка, очевидно, составляет половину этого значения (также зависит от того, считаете ли вы строку заголовка или нет).

RowHeight не публикуется в DBGrid. Чтобы получить его, вы можете использовать класс интерпозера:

type
    TInterDBGrid = class(TDBGrid);

И используйте это так:

RowHeight := TInterDBGrid(DBGrid1).RowHeights[0];

Класс интерпозера должен быть определен перед формой.

person fpiette    schedule 06.06.2021
comment
Это только так в сетке без прокрутки (когда ваша верхняя строка в виджете является верхней строкой в ​​наборе данных). P.S. хелперы класса тоже могут делать это вместо класса интерпостера - person Arioch 'The; 06.06.2021
comment
@fpiette Забыл упомянуть, что сетка прокручивается. Я просто хочу получить середину высоты просмотра. - person RickyBelmont; 06.06.2021
comment
@RickyBelmont Вы неясны в своем комментарии. Мое решение дает середину высоты просмотра (середина того, что вы видите на экране). Разве это не то, что вам нужно? - person fpiette; 06.06.2021
comment
@fpiette Извини. Да! ты прав!. Я ищу середину экрана DBGrid. - person RickyBelmont; 06.06.2021
comment
@fpiette Я не уверен, правильно ли я понял. DBGrid1.ClientHeight дает мне 473 (я полагал, что это не номера строк), а RowHeight дает мне 69 (это мои общие строки, включая прокручиваемые). Теперь, с этими числами, я получаю 473/69 = 6,86. Если я посчитаю количество просмотров строк во время выполнения, у меня будет 21 строка. Итак, середина должна быть 11-го ряда. - person RickyBelmont; 06.06.2021
comment
ClientHeight [любого элемента управления] дает высоту используемой области элемента управления в пикселях. Это почти очень близко к высоте, которую вы видите в инспекторе объектов. Это например исключить границы. Строка высотой 69 пикселей выглядит очень большой! Я провел тест на своей системе, и RowHeight составляет 17 пикселей. Не могли бы вы отредактировать свой вопрос и добавить дамп экрана сетки, как вы ее видите? - person fpiette; 06.06.2021
comment
@fpiette Просто уточнение. Когда вы говорите The interposer class must be defined before the form., вы имеете в виду frmMain.OnActivate или любое другое событие формы? - person RickyBelmont; 07.06.2021
comment
@fpiette Я добавил скриншот, который вы просили. - person RickyBelmont; 07.06.2021
comment
Вы отметили ответ MartynA как принятый (он такой же, как у меня, без вычислений, но с двумя функциями для упаковки кода, который я дал), и вы даже не проголосовали за мой ответ. Так что тут я больше не буду отвечать. - person fpiette; 07.06.2021
comment
@fpiette Извините за это. Я забыл. Да, у вас такой же ответ в основном с MartynA. Но у вас другой подход. - person RickyBelmont; 07.06.2021
comment
Вы используете мой ответ? Объявление type TInterDBGrid = class(TDBGrid); должно быть в любом месте выше type TForm1 = class(.... - person fpiette; 07.06.2021
comment
@fpiette Я использую ответ MartynA прямо сейчас. Честно говоря, я работал над вашим ответом, когда столкнулся с некоторыми проблемами и задал уточняющий вопрос по вашему ответу. Я думал, что вы были заняты тогда, поэтому я попробовал ответ Мартина. Если вы можете уточнить мой вопрос к вам выше, возможно, я попробую. - person RickyBelmont; 08.06.2021