Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.86/86: Рейтинг темы: голосов - 86, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 07.02.2012
Сообщений: 40
1

Как определить количество строк в DBGrid

24.09.2013, 10:33. Показов 16620. Ответов 32
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Только взялся за этот компонент и туплю. (Загрузил данные из базы в DBGrid)
1. Подскажите как определить кол-во строк в DBGrid.
1. Как обращать в ячейкам, если в StringGrid1. понятно все - Cells, но как в DBGrid не могу понять.!

Если есть ссылочка на инфу как работать с данным компонентом, буду очень признателен.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.09.2013, 10:33
Ответы с готовыми решениями:

Определить количество строк DbGrid-а
На форме есть два компонента DBGrid. В зависимости от выбранной строки в DBGrid1, в DBGrid2...

Количество строк в DBgrid
Здравствуйте! у меня вопрос, как посчитать кол-во строк в DBgrid'e. НА форме находится DBgrid ,...

Количество строк в DBGrid
Помогите пожалуйста с кодом. Имеется форма на которой располагаются DBGrid к которой применяется...

Количество строк в DBGrid
Помогите пожалуйста посчитать количество строк в DBGrid. Можно ли это число вывести на Panel,...

32
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
24.09.2013, 11:13 2
Цитата Сообщение от Z-7000 Посмотреть сообщение
как определить кол-во строк в DBGrid.
Зачем? DBGrid не хранит данные, он их только отображает. Считать строки (вернее, количество записей) надо в том наборе данных, с которым грид связан.

Цитата Сообщение от Z-7000 Посмотреть сообщение
Как обращать в ячейкам
Еще раз: работать надо с набором данных, содержимое которого отображает DBGrid... Изменятся данные там - изменятся и в гриде.
0
969 / 644 / 97
Регистрация: 01.11.2012
Сообщений: 1,447
24.09.2013, 11:19 3
Z-7000, DBGrid данные не хранит, а только отображает то, что находится в таблице. Вы работаете с данными находящимися в таблице (даже если у вас нет DBGrid'a).
Delphi
1
2
3
4
5
6
7
8
9
10
11
var n:integer;
s:string;
...
n:=DBGrid1.DataSource.DataSet.RecordCount; // количество записей с таблице
s:=DBGrid1.DataSource.DataSet.Fields[0].AsString; // присвоить переменной s значение 0 столбца текущей строки как текст
n:=DBGrid1.DataSource.DataSet.Fields[1].AsInteger; // присвоить переменной n значение 1 столбца текущей строки как целое число
...
// Изменение значения 2 столбца текущей строки
DBGrid1.DataSource.DataSet.Edit;
DBGrid1.DataSource.DataSet.Fields[2].AsString:='бла-бла-бла';
DBGrid1.DataSource.DataSet.Post;

Не по теме:

опоздал

2
669 / 559 / 242
Регистрация: 26.11.2012
Сообщений: 2,191
24.09.2013, 11:33 4
Цитата Сообщение от Waddonator Посмотреть сообщение
n:=DBGrid1.DataSource.DataSet.RecordCount; // количество записей с таблице
выдает кол-во записей в видимой части DBGrid1, а не все.
Delphi
1
2
DBGrid1.DataSource.DataSet.Last;
n:=DBGrid1.DataSource.DataSet.RecordCount; //так выдаст все.
0
35 / 35 / 4
Регистрация: 28.05.2013
Сообщений: 180
24.09.2013, 11:36 5
Z-7000, Очень многое подчеркнёте прочитав книгу Фаронов В.В. - Программирование баз данных в Delphi 7. Там всё детально описывается, как к чему обращаться и как работать с наборами данных с помощью визуальных компонентов.
0
0 / 0 / 0
Регистрация: 07.02.2012
Сообщений: 40
24.09.2013, 11:43  [ТС] 6
Спасибо большое всем) начало положено.! Теперь все сказанное переварить, а то привык к StringGrid.!

Добавлено через 4 минуты
Цитата Сообщение от UI Посмотреть сообщение
Зачем? DBGrid не хранит данные, он их только отображает. Считать строки (вернее, количество записей) надо в том наборе данных, с которым грид связан.

Еще раз: работать надо с набором данных, содержимое которого отображает DBGrid... Изменятся данные там - изменятся и в гриде.
Это конечно правильно.! База у меня простая на Access. И как мне это делать с источником данных?. Так как уже мне ответили Знатоки, пойдет?
0
969 / 644 / 97
Регистрация: 01.11.2012
Сообщений: 1,447
24.09.2013, 11:46 7
Цитата Сообщение от ZfoxAK Посмотреть сообщение
выдает кол-во записей в видимой части DBGrid1, а не все.
Для курсоров Static и Keyset мы можем обратиться к свойству RecordCount и получить точное количество записей в наборе, т.к. статический курсор и курсор типа Keyset читают все данные набора в момент открытия.
0
669 / 559 / 242
Регистрация: 26.11.2012
Сообщений: 2,191
24.09.2013, 12:24 8
Цитата Сообщение от Waddonator Посмотреть сообщение
Для курсоров Static и Keyset мы можем обратиться к свойству RecordCount и получить точное количество записей в наборе, т.к. статический курсор и курсор типа Keyset читают все данные набора в момент открытия.
Да - Access ведь))). Я поспешил..
0
6 / 6 / 6
Регистрация: 30.04.2012
Сообщений: 216
15.04.2014, 10:05 9
Ребята, в своем проекте при работе с DBGrid столкнулся с неприятным багом, который мне надо позарез исправить и похоже без вашей помощи у меня не получится! Чтобы не выкладывать весь проект целиком, я составил небольшой пример, в нем вся суть.
Имеем: Главное и дочернее MDI окно. Нажмите кнопку «Окно 1», чтобы вызвать дочернее. На нем две DBGrid, курсор расположен в первой DBGrid. Баг состоит в следующем: Если поставить курсор на Edit1 (или щёлкнуть по кнопке «Найти»), а потом тыкнуть на первую DBGrid, она будет словно заблокирована, т.е. курсор обратно уже не поставишь , чтобы ее "разблокировать" надо щелкнуть по Edit2 или второй DBGrid, а уже потом по первой, что в моем реальном проекте крайне неудобно.
Аналогично со второй DBGrid. Если на нее поставить курсор, а потом щелкнуть по Edit2, то обратно вернуть курсор на вторую DBGrid уже будет невозможно , надо будет сперва тыкать по Edit1 или по первой DBGrid, а уже по второй.
С чем связан этот баг и как его можно исправить???
Миниатюры
Как определить количество строк в DBGrid  
Вложения
Тип файла: zip MDI & DBGrid.zip (464.9 Кб, 24 просмотров)
0
Эксперт Pascal/Delphi
4912 / 2781 / 853
Регистрация: 04.10.2012
Сообщений: 10,121
15.04.2014, 12:10 10
Цитата Сообщение от Shman Посмотреть сообщение
Аналогично со второй DBGrid
со 2-м проблем нет. Это не баг. Просто на момент клика по dbgrid1 у Вас активен контрол на другой форме.
В чем смысл такой реализации поиска?
0
6 / 6 / 6
Регистрация: 30.04.2012
Сообщений: 216
15.04.2014, 12:51 11
droider,
В чем смысл такой реализации поиска?
В реальной программе таких дочерних MDI окон три штуки с разными данными. Смысл перенести поля для поиска из дочерних в главное окно, чтобы не плодить одинаковые поля для поиска в каждом списке и уместить все поля для поиска. Еще смысл в том чтобы, когда списки еще не открыты сразу забить в поиск, что ищем, а потом автоматически запустить список с результатом. В реальной программе есть три радиобуттона, нажав на них указываем в каком списке искать.
Если список, в котором мы ищем уже открыт, но перекрыт другими окнами, то при нажатии кнопки «Найти» выдвигаем окно со списком вперед и показываем результат.
Весь этот алгоритм в реальной программе уже работает, но глюк с DBGrid портит всю малину

Добавлено через 4 минуты
Просто на момент клика по dbgrid1 у Вас активен контрол на другой форме
А это можно как-то исправить?

Добавлено через 7 минут
И почему когда тыкаешь на другую DBGrid или Edit2 все нормально?
0
6 / 6 / 6
Регистрация: 30.04.2012
Сообщений: 216
19.04.2014, 08:40 12
Перекомпилировал пример в Delphi XE (2010), баг пропал. В коде ничего не менял, просто перекомпилировал в другом Делфи. Кто-нибудь может объяснить причину этого явления. Може быть это мне поможет исправить баг в Delphi 2006.
PS: Ради интереса перекомпилировал пример и в Delphi 2009, там баг все еще присутствует.
Вложения
Тип файла: zip MDI & DBGrid (2).zip (719.0 Кб, 7 просмотров)
0
Эксперт Pascal/Delphi
4912 / 2781 / 853
Регистрация: 04.10.2012
Сообщений: 10,121
19.04.2014, 12:00 13
Shman, вряд ли дело в версии. Я на Xe3 компилировал
0
6 / 6 / 6
Регистрация: 30.04.2012
Сообщений: 216
19.04.2014, 21:42 14
droider, тогда как можно исправить такой нюанс? где он кроется?
0
6 / 6 / 6
Регистрация: 30.04.2012
Сообщений: 216
27.04.2014, 12:39 15
Ребята, с последнего обращения в эту тему я в свой основной проект добавил много разных возможностей, в том числе заблокировал ввод ненужных символов в поля для поиска, затем я отрыл проект и откомпилировал в Delphi XE, чтобы избавиться от глюка с курсором, о котором писал выше. Глюк с курсором пропал, но появился новый серьезный баг: в поле ввода невозможно ввести русские буквы, хотя их ввод я не запрещал. Код:

Delphi
1
2
3
4
5
6
7
8
9
10
procedure TMainForm.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
 {Запрещаем вввод всех символов, кроме букв, и еще некоторых кнопок на клав-ре}
 if not (Key in ['A'..'z', 'А'..'я', #8, #13, #127])   // #8 разрешает кнопку BackSpace, #13 - Enter, #127 - Del
 then
  begin
   Key:=#0;   // Блокируем вывод запрещенных символов
   MessageBeep ($FFFFFFFF); // Звук при неверном вводе.
  end;
end;
Выкладываю свой предыдущий пример, куда добавил эту процедуру.

В исходниках вы можете обнаружить закоментируемую строку “if not CharInSet (Key, ['A'..'z', 'А'..'я', #8, #13, #127])”. Она нужна чтобы в Delphi XE не выводилось предупреждение “WideChar reduced to byte char in set expressions. Consider using 'CharInSet' function in 'SysUtils' unit”. Если ее раскоментировать, а закоментировать “if not (Key in ['A'..'z', 'А'..'я', #8, #13, #127])”, то такое предупреждение выводится не будет, но русские буквы ввести по прежнему не выйдет.

Очень прошу понять причину такого поведение и прошу объяснить как следует изменить процедуру, чтобы РАЗРЕШИТЬ ввод русских букв после компиляции в Delphi XE! Ппосле компиляции в Delphi 2006 все работает, а после XE нет. Я сегодня свой exe’шник хотел отдать на тестирование, но такой баг мешает это сделать.
Вложения
Тип файла: zip MDI & DBGrid (2).zip (719.7 Кб, 9 просмотров)
0
Эксперт Pascal/Delphi
4912 / 2781 / 853
Регистрация: 04.10.2012
Сообщений: 10,121
27.04.2014, 13:54 16
Цитата Сообщение от Shman Посмотреть сообщение
невозможно ввести русские буквы, хотя их ввод я не запрещал
по коду как раз наоборот.
Напишите так
Delphi
1
2
//запрещает  ввод латинских букв и цифр (если нужно)
if  (Key in['a'..'z','A'..'Z', '0'..'9']) then Key :=#0;
0
6 / 6 / 6
Регистрация: 30.04.2012
Сообщений: 216
27.04.2014, 14:07 17
droider,
Вы не правы. Тогда НЕ блокируются все символы, кроме ['a'..'z','A'..'Z', '0'..'9'] !
0
Эксперт Pascal/Delphi
4912 / 2781 / 853
Регистрация: 04.10.2012
Сообщений: 10,121
27.04.2014, 14:43 18
Shman, так напишите
Delphi
1
2
 if not ((key  in ['a'..'z','A'..'Z',#8, #13, #127]) or (ord(Key) >= 1040) and (ord(Key) <= 1103)) 
then Key :=#0;
Просто в юникодных версиях Delphi это делается иначе. Будет Вам счастье.
1
6 / 6 / 6
Регистрация: 30.04.2012
Сообщений: 216
27.04.2014, 15:09 19
droider, Благодарю вас! Кстати, вам не трудно пояснить что означают цифры 1040 и 1103? Почему Ord(Key) я так понимаю возвращает порядковый номер (индекс) выражения перечислимого (кроме Int64) или символьного типа, переданного в параметре Key. А зачем его надо сравнивать цифрами 1040 и 1103 ?
0
Эксперт Pascal/Delphi
4912 / 2781 / 853
Регистрация: 04.10.2012
Сообщений: 10,121
27.04.2014, 15:29 20
Цитата Сообщение от Shman Посмотреть сообщение
что означают цифры 1040 и 1103?
символы юникода в диапазоне 1040-1103 для кириллицы[а-я, А-Я], т.е. обозначают русские буквы.
Цитата Сообщение от Shman Посмотреть сообщение
Почему Ord(Key)
Функция Ord() - возвращает код нажатой клавиши (Key). Если возвращаемое значение кода клавиши входит в указанный диапазон, то он - символ кириллицы.

П.С. В Delph7 Ваш код отработал бы нормально, но это уже устаревший вариант.
0
27.04.2014, 15:29
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.04.2014, 15:29
Помогаю со студенческими работами здесь

Посчитать количество строк в dbgrid
Как посчитать количество строк в dbgrid Задача в следующем имеется колонка возраст в которой...

Количество строк в DbGrid после фильтраций
как можно вывести количество строк после фильтраций? не через запрос

Как определить количество строк в таблице?
Здравствуйте. Кто модет подсказать как определить количество строк в таблице без SQL запросов. Если...

Как определить количество строк? (Excel)
После установки AutoFilter надо определить количество видимых не пустых строк на листе. (Способ,...


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

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