[Delphi] Работа с DBGrid
Author: Blacksilver   
20.09.2009 21:43

[Delphi] Работа с DBGrid

В статье будут описаны простые приёмы работы с 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 строк кода. Вот бы всё в нашей работе было так просто...

Обновлено 22.09.2009 17:50
 

Комментарии  

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

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


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

 
Copyright (c) 2009 Codesex. Незаконное копирование будет анально наказано