Опубликован: 07.05.2010 | Уровень: специалист | Доступ: свободно
Лекция 12:

Работа с сеткой DBGrid

< Лекция 11 || Лекция 12: 123 || Лекция 13 >

Пустые столбцы

Если добавить в редактор столбцов сетки DBGrid новый столбец, но в свойстве FieldName не выбирать поле БД, а оставить его пустым, мы получим пустой столбец. Для чего нужны пустые столбцы в сетке? Во-первых, в них можно выводить обработанные данные из других столбцов. К примеру, пользователю неудобно просматривать три столбца "Фамилия", "Имя" и "Отчество". Ему было бы удобней просмотреть один сборный столбец в формате "Фамилия И.О.". Во-вторых, пустое поле может выводить информацию по требованию.

Рассмотрим эти случаи.

Создайте новый столбец, но не назначайте ему поле из НД. Выделите этот столбец, и в его свойстве Title.Caption впишите "Фамилия И.О.", а в свойстве Width укажите ширину в 150 пикселей. Эти сборные данные не будут видны в момент проектирования таблицы, они выйдут только во время работы программы.

Столбцы "Фамилия", "Имя" и "Отчество" нам уже не нужны, скройте их, установив их свойство Visible в False. А новый столбец перетащите мышью наверх, его индекс будет равен 0.

Нам придется написать код, который нужно вписать в событие OnDrawColumnCell сетки. Это событие наступает при прорисовке каждой ячейки столбца. Также имеется событие OnDrawDataCell, которое выполняет схожие функции, но оно оставлено для поддержки старых версий, и использовать его не желательно. Итак, выделяем сетку, генерируем событие OnDrawColumnCell и вписываем код:

{Прорисовка таблицы}
procedure TfMain.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
  s: String;
begin
  //если это пустой столбец
  if Column.Index = 0 then begin
    if ADOTable1['Фамилия'] <> Null then
      s:= ADOTable1['Фамилия'] + ' ';
    if ADOTable1['Имя'] <> Null then
      s:= s + Copy(ADOTable1['Имя'], 1, 1) + '.';
    if ADOTable1['Отчество'] <> Null then
      s:= s + Copy(ADOTable1['Отчество'], 1, 1)+ '.';
    DBGrid1.Canvas.TextOut(Rect.Left, Rect.Top, s);
  end; //if
end;

Здесь мы вначале проверяем - наш ли это столбец (равен ли индекс нулю)? Если наш, то в переменную s начинаем собирать нужный текст. При этом имеем в виду, что пользователь мог и не заполнить некоторые поля. Чтобы у нас не произошло ошибки, вначале убеждаемся, что поле не равно Null (то есть, текст есть). Если текст есть, добавляем его в переменную s. Причем если это имя или отчество, с помощью функции Copy() получаем только первую букву и добавляем к ней точку. Когда s сформирована, добавляем этот текст в наш столбец с помощью метода TextOut() свойства Canvas сетки. В метод передаются три параметра: координаты левой позиции, верхней позиции и сам текст. Эти координаты мы берем из параметра события OnDrawColumnCell - Rect, который имеет такие свойства, как Left и Top, показывающие, соответственно, левую и верхнюю позиции текущей ячейки.

В результате программа будет иметь вид:

Заполнение пустого столбца

Рис. 12.4 . Заполнение пустого столбца

Теперь о том, как использовать пустой столбец для вывода информации по требованию пользователя. Допустим, в сетке DBGrid нам нужна кнопка, нажатие на которую привело бы к выводу сообщения об образовании сотрудника.

Создайте новый пустой столбец. Перетаскивать его не нужно, пусть будет последним. Свойство Width (ширина) установите в 20 пикселей. Название столбца ( Title.Caption ) вписывать не нужно, пусть будет пустым. В свойстве ButtonStyle выберите значение cbsEllipsis. Это приведет к тому, что при попытке редактировать этот столбец образуется кнопка с тремя точками:

Кнопка в пустом столбце

Рис. 12.5 . Кнопка в пустом столбце

Нужный код пишется в событии OnEditButtonClick() сетки DBGrid, которое происходит всякий раз, когда пользователь нажимает на кнопку "…". Сгенерируйте это событие и впишите только одну строку:

ShowMessage(ADOTable1['Образование']);

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

Список выбора в столбце

Для организации списков выбора служит компонент ComboBox. Однако сетка DBGrid позволяет устроить такой же список в одном из своих столбцов без использования каких-либо других компонентов. В нашем примере есть поле "Пол". Это текстовое поле из трех символов. Во время конструирования базы данных ok.mdb с помощью программы MS Access мы указывали, что это поле может хранить значения либо "муж", либо "жен". То же самое можно было сделать с помощью сетки. Откройте редактор столбцов сетки и выделите столбец "Пол". Обратите внимание на свойство PickList в Инспекторе объектов. Это свойство имеет тип TStrings, то есть представляет собой набор строк, так же как и свойство Items у компонента ComboBox. Щелкните дважды по PickList, чтобы открыть редактор, и впишите туда

муж
жен

именно так, каждое значение на своей строке. Сохраните проект, скомпилируйте его и попробуйте редактировать этот столбец. При попытке редактирования в ячейке покажется похожий на ComboBox список, в котором можно будет выбрать одно из указанных значений:

Список выбора в сетке

Рис. 12.6 . Список выбора в сетке

Следует иметь в виду, что наличие такого списка не препятствует пользователю ввести какое-то иное значение. Этот список нужен не для контроля, а только для облегчения пользователю ввода данных. Если же вы не желаете, чтобы пользователь имел возможность вводить другие данные, контроль следует организовать иным способом.

Еще нужно заметить, что в практике программирования список чаще формируется во время работы программы, а строки списка берутся, как правило, из другой связанной таблицы. Добавить в список новую строку очень просто:

DBGrid1.Columns.Items[4].PickList.Add('абв');
< Лекция 11 || Лекция 12: 123 || Лекция 13 >
Евгений Медведев
Евгений Медведев
Не могу вставить модуль данных
Анна Зеленина
Анна Зеленина
пытаюсь повторить упражнение в лекции 5
Сергей Пастухов
Сергей Пастухов
Россия, Москва
Сергей Власюк
Сергей Власюк
Украина