Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/14: Рейтинг темы: голосов - 14, средняя оценка - 4.64
4 / 4 / 1
Регистрация: 10.12.2010
Сообщений: 81
1

Отслеживание видимых записей в области DBGrid

28.06.2014, 23:02. Показов 2811. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет!
Можно ли узнать количество, и обратиться к записям которые находятся в видимой части DBGrida. Т.е. таблица из базы данных загружена полностью(например 100 записей), а из-за размера окна в гриде видно только 10 записей, курсор может быть хоть в центре таблицы. Можно ли как то узнать что видно 10 записей, и обратиться к этим записям для внесения изменений?
delphi 11(2007) навсяк.
Есть стандартные методы?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.06.2014, 23:02
Ответы с готовыми решениями:

Как можно подсчитать число видимых столбцов в DBGrid?
Добрый день! Ребята подскажите как можно подсчитать число видимых столбцов в DBGrid, почему...

Перенос записей из одного DBGrid в другой DBGrid
Здравствуйте. Есть проблема! Ни как ни получается перенос записей Вот текст кода: procedure...

Поиск записей по дате в DBGrid и окрашивание записей
Всем привет! очень нуждаюсь в вашей помощи.пишу программу для диплома,и столкнулся со следующей...

Отслеживание изменение записей
Такая задача: Сотрудник делает изменения в ячейках в форме, которые привязаны к соответствующим...

12
Модератор
3490 / 2613 / 741
Регистрация: 19.09.2012
Сообщений: 7,974
29.06.2014, 00:07 2
Лучший ответ Сообщение было отмечено Stat как решение

Решение

Цитата Сообщение от Stat Посмотреть сообщение
Можно ли узнать количество, и обратиться
Интересный вопрос...
Думаю можно:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
procedure TForm1.Button9Click(Sender: TObject);
var
  GridRow,
  GridRowCount,
  GridTopRow,
  DataSetRecord: Integer;
begin
  // Определяем номер выбранной строки в Гриде
  GridRow := TStringGrid(DBGrid1).Row;
  // Определяем кол-во строк (видимых) в Гриде (-1 - титульная строка)
  GridRowCount := TStringGrid(DBGrid1).RowCount - 1;
  // Текущая запись в ДатаСете
  DataSetRecord := DBGrid1.DataSource.DataSet.RecNo;
  // Нехитрые мат. вычисления номера верхней записи в Гриде
  GridTopRow := DataSetRecord - GridRow + 1;
  // Вывод результата
  ShowMessage(Format('В Гриде отображаются Записи с %d по %d',
                     [GridTopRow, GridTopRow + GridRowCount - 1]));
end;
Добавлено через 1 минуту
Нумерация записей ведется с 1.
1
1074 / 987 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
29.06.2014, 00:07 3
Цитата Сообщение от Stat Посмотреть сообщение
курсор может быть хоть в центре таблицы.
С чего бы это?
В ТDBGrid положение курсора в датасете синхронизировано с отображением активной строки в гриде.
И как ни крути (хоть в гриде перемещай курсор, хоть в датасете его методами), но активная строка будет на виду в DBGrid в любом случае.
Поэтому и проблемы нет и, разумеется, нет ничего похожего на стандартные методы определения видимости строк (записей).
0
Модератор
3490 / 2613 / 741
Регистрация: 19.09.2012
Сообщений: 7,974
29.06.2014, 00:10 4
Скандербег, имеется в виду, что курсор может быть на любой видимой строке Грида.
0
1074 / 987 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
29.06.2014, 00:28 5
Из вопроса не совсем ясно так ли. Осталось впечатление, что ТС видит ситуацию, когда активная строка не видна.
Но если речь о курсоре на любой видимой строке, то все равно не понятно зачем знать какие записи сейчас видны в гриде. Возможности то для "внесения изменений" во все видимые записи одновременно все равно нет.

А приемчик хорош. Подсунуть компилятору совсем другой класс вместо грида - это классно.
Не додумался бы
0
Модератор
3490 / 2613 / 741
Регистрация: 19.09.2012
Сообщений: 7,974
29.06.2014, 00:58 6
Цитата Сообщение от Скандербег Посмотреть сообщение
все равно не понятно зачем знать какие записи сейчас видны в гриде.
Возможно, ТС откроет нам секрет, зачем все это надо.
0
пофигист широкого профиля
4733 / 3167 / 859
Регистрация: 15.07.2013
Сообщений: 18,252
29.06.2014, 02:56 7
Цитата Сообщение от Скандербег Посмотреть сообщение
А приемчик хорош. Подсунуть компилятору совсем другой класс вместо грида - это классно.
Не додумался бы
Ну если не брать в расчёт работу с датасетом, то имхо TDBGrid скорее всего более близкий родственник TCustomGrid'у, чем TStringGrid. Это я понял когда в стародавние времена разбирался с проблемой колеса мышки в TDBGrid. Так что возможно FIL просто был не совсем прав, когда привёл тип к TStringGrid'у вместо TCustomGrid.
0
4 / 4 / 1
Регистрация: 10.12.2010
Сообщений: 81
29.06.2014, 08:00  [ТС] 8
Цитата Сообщение от FIL Посмотреть сообщение
Возможно, ТС откроет нам секрет, зачем все это надо.
Да секрета здесь нет)
Пишу в программе отображение уведомлений(в виде планировщика задач - немного эротики) для пользователя, и было бы хорошо, например когда пролистывая DBGrid записи(уведомления) которые попали в "зону видимости" я бы пометил как прочтенные...

А про курсор... на любой видимой строке.
Цитата Сообщение от FIL Посмотреть сообщение
Интересный вопрос...
Думаю можно:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
procedure TForm1.Button9Click(Sender: TObject);
var
* GridRow,
* GridRowCount,
* GridTopRow,
* DataSetRecord: Integer;
begin
* // Определяем номер выбранной строки в Гриде
* GridRow := TStringGrid(DBGrid1).Row;
* // Определяем кол-во строк (видимых) в Гриде (-1 - титульная строка)
* GridRowCount := TStringGrid(DBGrid1).RowCount - 1;
* // Текущая запись в ДатаСете
* DataSetRecord := DBGrid1.DataSource.DataSet.RecNo;
* // Нехитрые мат. вычисления номера верхней записи в Гриде
* GridTopRow := DataSetRecord - GridRow + 1;
* // Вывод результата
* ShowMessage(Format('В Гриде отображаются Записи с %d по %d',
* * * * * * * * * * *[GridTopRow, GridTopRow + GridRowCount - 1]));
end;
Так, над опробовать! Спасибо!) Ток для меня нонсенс один класс живет в другом, и они не прямые "родственники"...
0
Модератор
3490 / 2613 / 741
Регистрация: 19.09.2012
Сообщений: 7,974
29.06.2014, 09:13 9
Цитата Сообщение от northener Посмотреть сообщение
был не совсем прав, когда привёл тип к TStringGrid'у вместо TCustomGrid.
Да, общим предком, где есть нужные св-ва, является TCustomGrid, но проблема в том, что они там "закрыты".
Так что, либо делать сабклассинг, либо использовать "непрямого родственника".
Думаю, что такое решение вполне корректно, т.к. используемые св-ва есть у общего предка, только в другой области видимости (хотя до конца не уверен ).
0
1074 / 987 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
29.06.2014, 12:32 10
П
Цитата Сообщение от Stat Посмотреть сообщение
над опробовать!
Все уже опробовано - работает.
К тому же, хотя и не прямые, а родственники, поэтому опасаться нечего - помогает, что нужный набор свойств и их типы одинаковые.
Это обстоятельство позволяет несколько упростить код, используя скрытое свойство TopRow (ну, это так, на всякий случай).
0
пофигист широкого профиля
4733 / 3167 / 859
Регистрация: 15.07.2013
Сообщений: 18,252
30.06.2014, 02:46 11
Цитата Сообщение от FIL Посмотреть сообщение
Да, общим предком, где есть нужные св-ва, является TCustomGrid, но проблема в том, что они там "закрыты".
Так что, либо делать сабклассинг, либо использовать "непрямого родственника".
Т.е. ты ещё не знаешь как "вполне себе легально" получить доступ к protected свойствам компонента?
Delphi
1
2
3
4
5
type
  TMyHackGrid = class(TCustomGrid);
...
  // Определяем номер выбранной строки в Гриде
  GridRow := TMyHackGrid(DBGrid1).Row;
и получаем доступ к protected свойству предка. Именно к свойству предка, а не к свойству иного родственника, которое может быть переопределено.
0
Модератор
3490 / 2613 / 741
Регистрация: 19.09.2012
Сообщений: 7,974
30.06.2014, 09:31 12
Цитата Сообщение от northener Посмотреть сообщение
Т.е. ты ещё не знаешь
Цитата Сообщение от northener Посмотреть сообщение
Так что, либо делать сабклассинг
Это я и имел ввиду. (Хотя, наверное, этот термин не совсем подходит к данному случаю)
Но зачем писать лишнюю строчку кода, если можно обойтись без нее

Добавлено через 16 минут
Кстати, TMyHackGrid тоже не является предком TDBGrid.
Так что получается, что TMyHackGrid(DBGrid1).Row - тоже самое, что и TStringGrid(DBGrid1).Row.
0
пофигист широкого профиля
4733 / 3167 / 859
Регистрация: 15.07.2013
Сообщений: 18,252
30.06.2014, 10:52 13
Цитата Сообщение от FIL Посмотреть сообщение
Так что получается, что TMyHackGrid(DBGrid1).Row - тоже самое, что и TStringGrid(DBGrid1).Row.
Да здесь так. Но вариант с TMyHackGrid просто универсальный способ получить доступ к protected свойствам предка.
0
30.06.2014, 10:52
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.06.2014, 10:52
Помогаю со студенческими работами здесь

Отслеживание повторяющихся записей/номеров
Добрый день уважаемые знатоки! Ребят! Нужна помощь или совет, как сделать правильно. Сразу к...

Отслеживание создания новых записей во множественной форме
Прошу направить, как будет лучше отследить создание новых записей во множественной форме (для...

Удаление записей в DBGrid
Необходимо удалить из двух разных таблиц информацию об одном читателе, Но сначала нужно удалить...

Добавление записей в DBGrid
Сможете кто помочь с приложением? Единственное что необходимо это автоматизировать добавление...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru