[Delphi] Работа с DBGrid

Автор: BlackSilver
20.09.2009 21:43

В статье будут описаны простые приёмы работы с DBGrid, которых достаточно для большинства случаев работы с базами данных в Delphi.

Как с ним работать вообще

Для тех, кто может работать с DBGrid, эта часть бесполезна. Теперь остальные.

Для начала нам нужен компонент DataSource (вкладка Data Access). DataSource только предоставляет данные в удобном для других компонент виде, вытягивать их из базы данных (или ещё откуда) должен другой компонент. Он указывается в поле DataSet нашего DataSource.

Создаем DBGrid. У него в поле DataSource вешаем угадайте что и добавляем столбцы. Для каждого столбца нам важны поля FieldName (имя поля) и Title/Caption (текст заголовка). И всё... Теперь пользователь может менять данные в таблице и изменения будут автоматически сохраняться в БД.

Combobox в DBGrid

Судя по многочисленным предлагаемым вариантам в интернете, мало кто знает, что DBGrid и без всяких надстроек поддерживает механизм combobox'ов. Только от спрятан. Тут два способа добавить combobox в DBGrid.

Combobox с фиксированым списком вариантов

В столбце находим поле PickList и вбиваем туда варианты. И всё. Обратите внимание, что в БД сохраняется текст выбраной стоки, поэтому и поле должно быть текстовым. В примере это поле "Состояние".

Combobox с подгрузкой списка вариантов из БД

Чтобы добавить такой combobox в DBGrid нужно... не трогать его. Вместо этого мы ищем в дереве объектов объект Fields, принадлежащий нашему источнику данных. Тыкаем в него правой кнопкой и выбираем сначала "Add all fields", а затем "New field".

Окно добавления нового поля

В окошке заполняем:
Name - имя нового поля.
Type - тип поля. Скорее всего "String".
Field type - выбираем Lookup.
Key fields - внешний ключ в нашей таблице.
DataSet - дополнительная таблица.
Lookup keys - ключевое поле дополнительной таблицы.
Result field - поле, которое будет отображаться в combobox.

Маска ввода данных

Также данные можно фильтровать при помощи маски, которая задается в поле EditMask объекта, соответствующего нужному полю. Там есть несколько готовых масок для даты, времени и всего такого. В примере это используется для поля "Дата смерти".

Окно выбора маски для ввода данных

Изменение данных

Добавление записи

Запись можно добавить вот такой строкой:

DBGrid1.DataSource.DataSet.Insert;
 

DBGrid1.DataSource.DataSet - это ссылка на источник данных (у меня - на объект Bodies). В таком длинном виде стоит записывать на случай, если вдруг захочется изменить источник данных. Если захочется как-то обработать данные сразу после создания, то обработку стоит вешать на обработчик события OnNewRecord нашего источника данных, а не сразу после Insert. В противном случае пользователь может добавить запись, выбрав последнюю строку и нажав кнопку вниз - тогда ваш код не выполнится.

Удаление записи

Тут всё просто. Единственное, на что стоит обратить внимание - есть ли вообще что удалять.

if not DBGrid1.DataSource.DataSet.Eof then
  DBGrid1.DataSource.DataSet.Delete;
 

Сохранение записи

Последнее, на что я советую вам обратить внимание - закрытие формы. Пользователь может добавить запись, все вписать и, довольный собой, закрыть форму. Поскольку на другую запись курсор он не переключал, DBGrid не знает, что можно уже сохранять изменения в БД, и запись не добавиться. Мелочь, но очень неприятно и намекает на криворукость программиста. Чтобы сохранить нашу криворукость в тайне, нужно на обработчик закрытия формы добавить такие строки:

if DBGrid1.EditorMode or DBGrid1.DataSource.DataSet.Modified then
  DBGrid1.DataSource.DataSet.Post;
 

Теперь программа будет при закрытии сохранять изменения, если это нужно.

Заключение

Вот тут лежит программа-пример. Хочу обратить ваше внимание, что я в ней написал всего 8 строк кода. Вот бы всё в нашей работе было так просто...

Обновлено 07.05.2011 23:50

 

Комментарии  

 
#1 Гость 22.10.2009 07:32
КАК сделать поиск поля в базе данных ParadoX через Delphi?????
Цитировать
 
 
#2 Гость 25.10.2009 23:09
Вы хотите узнать, в какой оно таблице? Уточните, пожалуйста.
Цитировать
 
 
#3 Гость 13.05.2010 13:36
Как сделать так, чтобы при поиске в форме DBGrid присутствовали только опр. столбцы. Напр. у меня в таблице 2 столбца (Код, название). Как сделать, чтобы выводилось только название (код мне не нужен). И как урегулировать ширину столбца, а то все они шириной, как сама форма DBGrid. Прошу подробный ответ.
Заранее благодарен.
Цитировать
 
 
#4 Гость 16.05.2010 09:31
В дереве объектов dbgrid выглядит как контейнер с полями (столбцами). Чтобы скрыть один столбец можно установить ему Visible = 0 или просто удалить объект. Ширина столбца редактируется изменением поля Width.
Цитировать
 
 
#5 Гость 03.09.2010 14:04
DBGrid1.Columns[0].Width:=strtoint('100');

Это урегулировка длинны поля
Цитировать
 
 
#6 Гость 06.09.2010 22:19
А зачем всё так... Усложять. Чем вводить число в виде строки и программно преобразовывать его в число, лучше сразу ввести его в виде числа. В смысле, так:
DBGrid1.Columns[0].Width := 100;
Цитировать
 
 
#7 Гость 24.10.2010 14:15
а если при сохранении изменений из DBGrid1 в базу данных с помощью

DBGrid1.datasource.dataset.Post;

выдает ошибку cliendataset not insert or edit mode

и ничего не сохраняеться в базе данных. как правильно сделать??
Цитировать
 
 
#8 Гость 24.11.2010 09:58
Сергец Напиши пред сохранением DBGrid1.datasource.dataset.Edit;
Цитировать
 
 
#9 Гость 24.11.2010 15:34
Цитирую Петр:
Сергец Напиши пред сохранением DBGrid1.datasource.dataset.Edit;


спасибо попробую
Цитировать
 
 
#10 Гость 30.11.2010 22:24
Есть 3 ADOQuery, у первого 6 полей: первое просто поле; 2-е первичный ключ-visible=false; 3 и 4 вторичнае ключи и два lookup настроенные на два других ADOQuery. Первое из lookup настроено на одно из полей 2-го ADOQuery, второе на одно из полей третьего ADOQuery. Отображение и редактирование данных 1-го ADOQuery производим в TDBGrid. Отображение данных, редактирование записей(включая и выбор значений в lookup полях), удаление все работает без ошибок. А вот при добавлении новой записи добавляется новая запись с пустыми полями далее вводим значение в первое(то которое просто поле), пока все нормально. Но при выходе из первого поля генерируется последовательно 2-ве ошибки(EOleExpe ction неизвестного типа), как раз по кол-ву lookup полей. Причем ошибки генерируются только при "прогоне" проги в Delphi(среда настроена на перехват ошибок). При запуске откомпилир-го exe-ка, редактирование полей вновь добавленной записи ошибок не вызывает. Пробовал установить зн.по умолч. для lookup, не работает.
Цитировать
 

Добавить комментарий


Защитный код
Обновить

Последние комментарии