Мы с вами уже неоднократно применяли этот компонент для вывода на экран информации из наборов данных в виде таблицы. Однако этот компонент способен на большее. Профессиональные программы отличаются большим набором дополнительных возможностей для пользователя. В этой лекции мы и поговорим о дополнительных возможностях сетки
Как мы уже знаем, строки сетки
Столбцы содержат значения полей подключенного к сетке набора данных. Этими значениями можно манипулировать, показывая или скрывая поля НД, меняя их местами или добавляя новые столбцы. Нам уже приходилось это делать в редакторе полей набора данных, однако, это не всегда оправдано - один набор данных может использоваться в различных местах приложения, в различных формах и на различных сетках. Изменение свойств полей набора данных в этом случае коснется и всех сеток
Если не пользоваться редактором столбцов самой сетки,
Создайте новое приложение. Свойству Name формы, как всегда, присвойте значение fMain, свойству Caption - "Изучение свойств Main, а проекту в целом - MyDBGrid. В эту же папку скопируйте базу данных ok. из прошлой лекции. На форме нам понадобятся сетка , с вкладки ADO компоненты ADOConnection и ADOTable, с вкладки - компонент DataSource. Также для красоты и удобства можно добавить компонент DBNavigator.
Из прошлых лекций вы знаете, как подключить к базе данных компонент ADOConnection, а затем подключить к нему таблицу ADOTable. В свойстве TableName таблицы выберите таблицу LichData, и откройте ее. Компонент DataSource подключите к нашей таблице, а сетку LichData:
(рис 12.1 ) Форма проектаДопустим, в нашем проекте нам нужны не все поля таблицы, а только некоторые из них. Значит, придется поработать с редактором столбцов сетки
(рис 12.2 ) Редактор столбцов сетки DBGridРабота с этим редактором очень похожа на
Если столбцов в редакторе нет, то сетка отображает все поля НД. Добавим один столбец. Для этого нажмем первую кнопку. Сразу же все поля НД исчезли, а сетка отображает пустой столбец. Выделим его в редакторе столбцов, а в Инспекторе объектов в свойстве FieldName выберем поле "Фамилия". Сразу же столбец отобразит это поле. Заголовок столбца будет соответствовать названию поля. В нашей БД имена полей мы задавали русскими буквами, однако это бывает не всегда, особенно если вы работаете с таблицами Paradox или клиент-серверными БД. В этом случае названия полей будут выводиться латиницей, а это не удобно для пользователя. Изменить параметры заголовка столбца можно в раскрывающемся свойстве
Caption - свойство содержит текст, который отображается в заголовке столбца. Если поле НД имеет имя латинскими буквами, именно здесь можно отобразить его кириллицей.
Color - цвет заголовка, по умолчанию это свойство равно clBtnFace, что обеспечивает стандартный серый цвет. Если вы желаете украсить программу, можете выбрать другой цвет.
Font - шрифт заголовка. Если дважды щелкнуть по этому свойству, откроется диалоговое окно, в котором можно изменить шрифт, начертание, размер и цвет шрифта. То же самое можно сделать, если раскрыть это свойство и непосредственно изменять нужные свойства.
Надо заметить, что свойства Font,
Свойство Visible разрешает или запрещает отображение столбца, а свойство Width позволяет изменить его ширину. О других свойствах поговорим чуть позже.
Добавьте в сетку другие поля НД: "Имя", "Отчество", "Пол" и "Военнообязанный".
Обратите внимание, что перетаскивая мышью столбцы в редакторе столбцов, вы можете менять их порядок в сетке. Пользователь же имеет возможность менять их порядок, перетаскивая мышью заголовки столбцов.
У сетки DBGrid1.Columns.Items.Count-1. Заметим, что свойство
DBGrid1.Columns[0] = DBGrid1.Columns.Items[0]
Шрифт и цвет можно менять не только в Инспекторе объектов, но и программно. Добавим на форму две кнопки, на которых напишем "Шрифт" и "Цвет". А также два диалога: FontDialog и ColorDialog. Создадим процедуру нажатия на первую кнопку и впишем в нее следующее:
{Меняем шрифт}
procedure TfMain.Button1Click(Sender: TObject);
begin
//считаем в диалог шрифта установленный шрифт
FontDialog1.Font := DBGrid1.Columns.Items[DBGrid1.SelectedIndex].Font;
//установим выбранный шрифт:
if FontDialog1.Execute then
DBGrid1.Columns.Items[DBGrid1.SelectedIndex].Font :=
FontDialog1.Font;
end;
Здесь вначале мы свойству Font диалога FontDialog присвоили тот же шрифт, который был в текущем столбце сетки. Затем вызвали выбор диалога, и если пользователь выбрал другой шрифт (название, начертание, размер, цвет шрифта), то изменяем шрифт всего столбца на выбранный пользователем. Аналогичным образом меняем и цвет столбца. Создайте процедуру обработки второй кнопки, и впишите код:
{Меняем цвет}
procedure TfMain.Button2Click(Sender: TObject);
begin
//считаем в диалог цвета установленный цвет:
ColorDialog1.Color :=
DBGrid1.Columns.Items[DBGrid1.SelectedIndex].Color;
//установим выбранный цвет:
if ColorDialog1.Execute then
DBGrid1.Columns.Items[DBGrid1.SelectedIndex].Color :=
ColorDialog1.Color;
end;
Сохраните проект, скомпилируйте его и проверьте работу кнопок. И шрифт, и цвет текущего столбца будут меняться:
(рис 12.3 ) Изменение шрифта и цвета текущего столбцаСледует заметить, что таким образом можно менять параметры не только содержимого текущего столбца, но и его заголовка, если, например, вместо
DBGrid1.Columns.Items[DBGrid1.SelectedIndex].Color
использовать
DBGrid1.Columns.Items[DBGrid1.SelectedIndex].Title.Color
А если применить цикл, то можно изменить параметры всех столбцов:
for i:= 0 to DBGrid1.Columns.Count-1 do
DBGrid1.Columns.Items[i].Color :=
Если добавить в редактор столбцов сетки
Рассмотрим эти случаи.
Создайте новый столбец, но не назначайте ему поле из НД. Выделите этот столбец, и в его свойстве Title.Caption впишите "Фамилия И.О.", а в свойстве Width укажите ширину в 150 пикселей. Эти сборные данные не будут видны в момент проектирования таблицы, они выйдут только во время работы программы.
Столбцы "Фамилия", "Имя" и "Отчество" нам уже не нужны, скройте их, установив их свойство Visible в False. А новый столбец перетащите мышью наверх, его индекс будет равен 0.
Нам придется написать код, который нужно вписать в событие
{Прорисовка таблицы}
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 сформирована, добавляем этот текст в наш столбец с помощью метода
В результате программа будет иметь вид:
(рис 12.4 ) Заполнение пустого столбцаТеперь о том, как использовать пустой столбец для вывода информации по требованию пользователя. Допустим, в сетке
Создайте новый пустой столбец. Перетаскивать его не нужно, пусть будет последним. Свойство Width (ширина) установите в 20 пикселей. Название столбца ( Title.Caption ) вписывать не нужно, пусть будет пустым. В свойстве
(рис 12.5 ) Кнопка в пустом столбцеНужный код пишется в событии
ShowMessage(ADOTable1['Образование']);
Теперь, когда пользователь нажмет на эту кнопку, ему будет выведено сообщение с текстом об образовании текущего сотрудника.
Для организации списков выбора служит компонент ComboBox. Однако сетка
муж жен
именно так, каждое значение на своей строке. Сохраните проект, скомпилируйте его и попробуйте редактировать этот столбец. При попытке редактирования в ячейке покажется похожий на ComboBox список, в котором можно будет выбрать одно из указанных значений:
(рис 12.6 ) Список выбора в сеткеСледует иметь в виду, что наличие такого списка не препятствует пользователю ввести какое-то иное значение. Этот список нужен не для контроля, а только для облегчения пользователю ввода данных. Если же вы не желаете, чтобы пользователь имел возможность вводить другие данные, контроль следует организовать иным способом.
Еще нужно заметить, что в практике программирования список чаще формируется во время работы программы, а строки списка берутся, как правило, из другой связанной таблицы. Добавить в список новую строку очень просто:
DBGrid1.Columns.Items[4].PickList.Add('абв');
Очень часто в практике приходится выделять какие-то строки, изменяя их фон или цвет шрифта. Например, в бухгалтерии обычно выделяют строки, в которых значение меньше нуля. Допустим, ваша программа показывает клиентов, а какой-то столбец содержит их баланс на счету вашей компании. Если этот баланс меньше 0, значит, клиент имеет задолженность перед вашей фирмой. Бухгалтеру будет очень удобно, если
Способ прорисовки данных в сетке
Если мы написали алгоритм прорисовки, но свойство
Разберем этот метод подробней. Если найти его в справке Delphi, то увидим:
property OnDrawColumnCell: TDrawColumnCellEvent;
То есть, этот метод имеет тип TDrawColumnCellEvent. Описание типа такое:
type TDrawColumnCellEvent = procedure (Sender:TObject; const Rect:TRect; DataCol:Integer; Column:TColumn; State:TGridDrawState) of object;
Разберемся с параметрами.
Rect - координаты прорисовки.
DataCol - порядковый номер текущего столбца (начиная с 0).
Column - данные текущего столбца.
State - состояние ячейки. Может быть:
Допустим, в нашем примере требуется, чтобы строки с военнообязанными сотрудниками выделялись красным цветом:
(рис 12.7 ) Выделение строкЗаметим сразу, что наличие пустых столбцов создает дополнительные, но решаемые проблемы. Код события
{Прорисовка таблицы}
procedure TfMain.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
s: String;
begin
with DBGrid1.Canvas do begin
//поле "Военнообязанный" содержит истину?
if (ADOTable1['Военнообязанный'])= True and
not (gdSelected in State) then begin
//выводим все ячейки строки красным по белому:
Font.Color:= clRed;
FillRect(Rect);
end; //if
//если это пустой сборный столбец
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
//если это пустой столбец с кнопкой "..."
else if Column.Index = 6 then begin
DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
Exit;
end //if
//все остальные столбцы
else
TextOut(Rect.Left+2, Rect.Top+2, Column.Field.Text);
end; //with
end;
Разберемся с кодом. Вначале с помощью with мы указываем, что будем работать непосредственно со свойством DBGrid1.Canvas, которое отвечает за стиль прорисовки ячейки. Далее мы смотрим, содержится ли True в поле "Военнообязанный" текущей записи. Если да, то указываем, что цвет шрифта должен быть красным, а затем функцией FillRect(Rect) мы стираем
Далее мы определяем, прорисовывается ли в данный момент пустой сборный столбец с "Фамилия И.О.". Если это он, то мы формируем переменную s с нужными данными и выводим их, как в прошлый раз.
Если же это пустой столбец с кнопкой "…", то мы делаем
Все остальные столбцы мы выводим строкой
TextOut(Rect.Left+2, Rect.Top+2, Column.Field.Text);
Обратите внимание, что мы добавили по два пикселя к крайней левой и крайней верхней координате ячейки. Если этого не сделать, то новая прорисовка не будет целиком закрашивать старую:
(рис 12.8 ) Некорректная прорисовкаКоличество добавляемых пикселей зависит от формата данных и размера шрифта. Обычно это определяется путем проб. Например, ячейка может содержать цифры, которые обычно прижимаются к правому краю, и тут двумя пикселями не обойтись.
Сделать проверку на тип данных можно, например, так:
//если текст, сдвинем только на 2 пикселя if Column.Field.DataType = ftString then TextOut(Rect.Left, Rect.Top+2, Column.Field.Text) //если цифры, сдвинем их вправо на 28 пикселей else TextOut(Rect.Left+28, Rect.Top+2, Column.Field.Text);
Выделение строки красным текстом может оказаться недостаточным для заказчика. Что, если он потребует, чтобы эти строки выделялись красной строкой с белым шрифтом? Тогда вместо
Font.Color:= clRed; FillRect(Rect);
вам придется написать
//выводим все ячейки строки белым текстом по красному фону: Brush.Color:= clRed; Font.Color:= clWhite; FillRect(Rect);
Как видите, подсвойство
DBGrid1.Canvas.Brush.Color
отвечает за цвет заливки ячейки, а
DBGrid1.Canvas.Font.Color
за цвет выводимого в ней шрифта. Список доступных цветов вы можете открыть в любом свойстве Color любого компонента. Теперь вы сможете создать сетку со сложными элементами прорисовки.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.