Цикл for dbgrid delphi

Цикл for dbgrid delphi thumbnail

Это логика расчета факториала. Давайте перенесем ее на язык программирова­ния Delphi. Цикл в Delphi оформляется следующим образом:

for счетчик := начальное_значение
to
конечное_значение
do
действие;

После слова for нужно присвоить какой-нибудь переменной начальное значе­ние. Эта переменная будет использоваться в качестве счетчика выполнения цикла.

Закажи видеокурс по Delphi прямо сейчас и получи 106 видеоуроков! Кликни сюда:

ЗАКАЗАТЬ

После каждого выполнения действия этот счетчик будет увеличиваться на единицу, пока переменная не превысит конечного значения. В качестве счетчика я привык использовать переменную с именем index или i, но некоторые специалисты счи­тают, что и счетчикам нужно давать более внятные имена. На мой взгляд, более внятного имени далеко не всегда можно придумать. В общем виде цикл выглядит так: 

for…to…do Действие1

Посмотри подробный видеоурок с примерами о том как работать с такими циклами:

Хочешь больше таких видеоуроков – тогда скачай прямо сейчас их бесплатно – СКАЧАТЬ БЕСПЛАТНО.

Рассмотрим пример. 

var

index:Integer; sum:Integer; EndCount:Integer; begin Sum: =0;

for index:=0 to 5 do Sum:=Sum+ index; end;

В этом примере объявляются две переменные index и sum типа “целое число”. Сначала переменной sum присваивается значение 0. После этого запускается цикл, в котором переменная index будет изменяться от 0 до 5. Теперь посмотрим поэтапно, что здесь происходит.

  1. На первом этапе переменная index равна 0. sum тоже равна нулю, значит, вы­полнится операция sum:=o+o. Результат sum = о;
  2. На втором этапе index увеличена на 1, значит, выполнится действие sum: =о+1. Результат sum = 1.
  3. Здесь index увеличена на 1 и уже равна 2, a sum = 1. Значит, выполнится дейст­вие Sum: =1+2. Результат Sum = 3.
  4. Здесь index увеличена на 1 и уже равна 3, a sum = 3. Значит, выполнится дейст­вие sum: =3+3. Результат sum = б.
  5. Здесь index увеличена на 1 и уже равна 4, a sum = 6. Значит, выполнится дейст­вие Sum: =4 + 6. Результат Sum = 10.
  6. Здесь index увеличена на 1 и уже равна 5, a sum = 10. Значит, выполнится дей­ствие Sum: =5+10. Результат sum = 15.

Заметьте, что мы не увеличиваем значение переменной index, используя для этого определенные команды. Значение увеличивается автоматически, потому что эта переменная объявлена счетчиком в цикле for.

Давайте перенесем рассмотренный выше программный код непосредственно в програм­му, чтобы мы могли убедиться в этом на реаль­ном примере. Создайте новое приложение. По­местите на форме два компонента TLabel, два компонента TEdit и одну кнопку. 

Компонент Edit1 переименован в EndEdit, a Edit2 переименован в ResuitEdit. Теперь по нажатии кнопки (обработчик события onclick для кнопки, которое генерируется, когда пользователь нажал на кнопке) пишем код, представленный в листинге:

procedure TFontil. CalculateButtonCl ick (Sender: TObj ect) ; var

index:Integer;

sum: Integer;

EndCount:Integer; begin

Sum: =0;

EndCount:=StrToInt(EndEdit.Text);

for index:=0 to EndCount do

Sum: = Sum+ index;

ResuitEdit.Text:=IntToStr(Sum) ; end;

В принципе, текст тот же самый. Единственная разница заключается в том, что цикл запускается, начиная от 0 до числа, введенного в компонент EndEdit. EndEdit содержит текст, а нам нужно превратить его в число, поэтому мы используем функцию strToint для преобразования строки в число. Эта функция работает так же, как и intTostr, которая наоборот преобразовывала число в строку.

Результат преобразования сохраняется в переменной EndCount:

EndCount := StrToint(EndEdit.Text);

После этого запускается цикл, в котором переменная index будет изменятся от 0 ДО значения EndCount (в котором находится ЧИСЛО, введенное В EndEdit).

for index:=0 to EndCount do

Запустите программу и введите в строку Конечное значение число 5. После этого нажмите на кнопку, и в строке результата должно появиться число 15.

Здесь необходимо еще отметить то, что после цикла for будет выполняться только одно действие. Например, если вы захотите выполнить два действия подряд, то вы должны заключить их в скобки begin и end, как это показано в следующем примере.

for index:=0 to EndCount do begin Sum: = Sum+ Index;

Sum: =Sum+1; end;

Здесь на каждом шаге цикла sum увеличивается еще на единицу. Если вы по­пробуете написать так:

for index:=0 to EndCount do Sum: =Sum+Index; Sum:=Sum+1;

то выполняться в цикле будет только строка sum:=sum+index. Вторая строка Sum: =sum+i выполнится только по окончании цикла.

СОВЕТ. Если вы что-то не поняли в предыдущем примере, вернитесь к главе, где описывались блок-схемы. Там был рассмотрен пример, который работает как цикл for.. .to.. .do. Попробуйте точно так же самостоятельно нарисовать блок-схему для данного примера и мысленно пройдите ее по шагам.

Помоги проекту! Расскажи друзьям об этом сайте:

Источник

Чтобы понять, как работает цикл for Delphi, рассмотрим одну задачу. Предположим, что необходимо разработать программу, вычисляющую значение функции y=5*x*x-7 в следующих точках: x=-1, x=-0.5, x=0, x=0.5, x=1 (таблицу выведем в поле метки Label1 формы приложения). Напишем процедуру, которая решит поставленную задачу (представим один из ее вариантов):

Цикл for Delphi

Как Вы можете заметить, в тексте данной процедуры группа инструкций

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

Цикл for Delphi

А теперь сравним два варианта процедуры:

  1. Для создания второго варианта потребовалось меньше усилий в процессе набора;
  2. Процедура в втором варианте более гибкая: для увеличения количества строк в отображаемой таблице, к примеру, до 15, остается лишь в строке провести замену числа 5 на число 15.

Применение цикла for Delphi эффективно тогда, когда некоторая последовательность действий выполняется несколько раз (если заранее известно количество повторений). Цикл for Delphi имеет общий вид:

откуда

  • счетчик (тип integer) означает переменную-счетчик количества повторений некоторых инструкций цикла;
  • нач_знач (тип integer) подразумевает выражение, которое является начальным значением счетчика циклов;
  • кон_знач (тип integer) обозначает выражение, являющееся конечным значением счетчика циклов.

Определить, сколько раз (обозначим это число за m) повторяются инструкции цикла, можно, воспользовавшись следующей формулой:

Примеры цикла for Delphi:

А теперь приведем примеры использования инструкции for Delphi:

Пример 1.

Пример 2.

Заметка. В случае, когда между служебными словами begin и end располагается только одна инструкция, то зарезервированные слова begin и end опускаются. Как устроен алгоритм инструкции for, покажет следующая иллюстрация:

Цикл for dbgrid delphi

Если внимательно приглядеться к приведенному алгоритму, то можно заметить, что если конечное значение счетчика не превышает его начального значения, то инструкции между служебными словами begin и endвыполняться не будут. Нельзя не отметить, что после того, как  завершилось очередное выполнение инструкции тела цикла, увеличение счетчика циклов происходит автоматически. Переменная счетчик может быть использована внутри тела цикла, но менять переменную-счетчик нельзя.

Читайте также:  Вокальный цикл глинки на слова кукольника

Пример 3. После того, как выполнены следующие инструкции

Цикл for Delphi

в переменной tab1 будут содержаться изображения таблицы, состоящей из квадратов чисел.

Пример 4. В качестве примера приведем программу, производящую вычисление суммы первых десяти элементов ряда 1+1/2+1/3+1/4+ … +1/n (свяжем значение i-того элемента данного ряда с его номером при помощи формулы 1/i).

Таким образом, в диалоговом коне программы необходимо присутствие как минимум двух компонент: поля меткиLabel1 и командной кнопки Button1. Чтобы вычислить сумму первых десяти членов ряда и вывести полученный результат, воспользуемся процедурой обработки событий Onclick (ее код представление ниже).

Цикл for Delphi

Как только вычислен очередной элемент ряда, при помощи данной процедуры осуществляется вывод в полеLabel1 номера элемента и его значения в поле метки формы, которое и предназначено собственно для вывода полученного результата.

Заметка. Если необходимо, чтобы значения счетчика не увеличивалось, а уменьшалось, то необходимо в инструкции for слово to заменить на слово downto.

Похожие записи:

  • Оператор goto Delphi
  • Типы данных Delphi
  • Особенности Delphi
  • Открытие файла для вывода Delphi
  • Константы Delphi

Источник

Компонент Delphi DBGrid – это визуальный компонент среды Delphi, предназначен для визуализации наборов данных. Этот компонент находиться на странице компонентов DataControls палитры компонентов. Класс TDBCustomGrid и класс TCustomGrid – это родительские классы компонента DBGrid. Компонент делиться на столбцы (поля ввода данных) и строки (записи).

Свойства DBGrid

СвойстваОписание
DataSourceВ этом свойстве указывают имя компонента DataSource для связи БД с компонентом DBGrid
ColumnsХранит в себе коллекцию состоящих из столбцов таблицы.  Позволяет для каждого столбца применить индивидуальные свойства, например цвет.
OptionsОпределяет параметры отображения таблицы:

  • dgEditing — Делает возможность править данные прямо в таблице. Этот значение игнорируется, при включенном флаге dgRowSelect;
  • dgAlwaysShowEditor — Таблица будет находиться в режиме редактирования. Если False то пользователь должен будет активировать сам редактирование щелчком мышы по полю или нажимать F2, Enter;
  • dgTitles — Делает видными заголовки столбцов;
  • dgIndicator — Добавляет еще одну колонку, в которой будут выводиться индикатор выбранной записи;
  • dgColumnResize — Дает возможность изменить размеры столбцов пользователю;
  • dgColLines — Столбцы будут разделены линиями;
  • dgRowLines — строки будут разделены линиями;
  • dgTabs — Дает возможность навигации по ячейкам при помощи  клавиш Tab и Shift+Tab;
  • dgRowSelect — Записи будут выделяться целиком;
  • dgAlwaysShowSelection — Выбираемая ячейка будет выделяться цветом, даже если фокус ввода находится не на таблице;
  • dgConfirmDelete – Позволяет выводить предупреждение, если  пользователь будет удалять запись в таблице;
  • dgCancelOnExit — Предотвращает запись пустых ячеек;
  • dgMultiSelect – Дает возможность выбора нескольких записей при удержании Ctr).
ReadOnlyЗадает параметр разрешающий или запрещающий пользователю редактировать  данные в таблице
TitleFontЗадает шрифт, выводимых заголовков столбцов таблицы
FixedColorЗадает цвет неподвижных ячеек таблицы

 
Работа со столбцами

Над значениями столбцов можно проводить различные операции: скрывать или показывать поля, менять положение, добавлять новые столбцы. Редактор столбцов предназначен для изменения набора полей. Вызывается редактор двойным щелчком мыши(рис 1). Он имеет четыре свойства (Add New, Delete Selected, Add All Fields, Restore Defaults). Соответственно: добавить новый столбец, удалить выделенный, добавить все столбцы из полей ввода данных, восстановление значения для выделенного столбца (по умолчанию). Свойства для каждого из выбранных столбцов появляются в Object Inspector. Со столбцами можно проводить такие операции:

  • редактирование;
  • удаление;
  • смена местами двух столбцов;
  • изменять заголовок столбцов (свойство Title).

Свойства Colums

Alignment Отвечает за выравнивание данных  в колонке
ColumnButtonStyleОтвечает за способ редактирования  данных:

  •  cbsAuto — кнопка появляется, если  связанное с ним поле является полем  синхронного просмотра;
  •  cbsEllipsis —кнопка редактирования ячейки появляется всегда;
  •  cbsNone — Кнопа при редактировании ячеек не появляется
ColorЦвет фона колонки
DropDownRowsОпределяет число строк списка ячейки
ExpandedЕсли True то каждое дочернее поле будет отображатся в новой колонке. Иначе дочерние поля будут показаны  через точку с запятой
FieldNameНазвание поля
FontШрифт в колонке
PickListСодержит выпадающий список доступный при редактировании
PopupMenuСвязывает с всплывающим меню
TitleТекст заголовка и параметры
VisibleВидимость колонки
WidthШирина колонки в пикселах

При необходимости создания дополнительного пустого столбца в редакторе столбцов таблицы DBGrid необходимо воспользоваться свойством FieldName (поле базы данных оставить пустым). В пустые столбцы можно перемещать уже обработанные данные из других столбцов.

Работа со строками

Как при работе со столбцами, так и при работе со строками можно изменять цвет ячеек – это очень удобно при работе с большим количеством данных, ведь всегда можно выделить отдельные столбцы или строки различными цветами для обозначения той или иной категории. Свойство DefaultDrawing – значение, которое влияет на способ прорисовки данных в компоненте DBGrid (по умолчанию свойство равно True, в этом случае данные прорисовываются автоматически). Если значение DefaultDrawing равно False, прорисовку нужно делать самостоятельно при помощи OnDrawColumnCell. Другой вариант, пользователь прописал алгоритм прорисовки, но значение свойства остается равно True, тогда DBGrid заполнится сначала автоматически, а лишь потом будет выполнен алгоритм пользователя (то есть прорисовка выполняется дважды, это сказывается на быстродействии программы, но теперь пользователю не придется заполнять все пустые ячейки вручную).

Если до компонента DBGrid вам приходилось работать с компонентом Delphi StringGrid, то вам уже будет намного легче, ведь принцип работы этих двух компонент очень похож, только к дополнению свойств StringGrid, DBGrid имеет свои собственные свойства. Ячейки – это основные структурные единицы таблицы. Свойство State – состояние таблицы (gdSelected – выделена, gdSelected – имеет фокус ввода, gdFixed – ячейка-заглавие столбца).

Что надо знать о DBGrid:

  • это таблица для отображения данных из БД (база данных);
  • используется при работе с БД;
  • это потомок класса TDBCustomGrid и класса TCustomGrid;
  • находиться на странице DataControl.

Источник

Компонент TDBGrid

TDBGrid – таблица, в которой строки представляют собой записи, а столбцы — поля набора данных. Свойство DataSource содержит ссылку на выбранный набор данных.

Столбцы DBGrid

Столбцы – поля подключенного набора данных. Этими значениями можно манипулировать, показывая или скрывая поля НД, меняя их местами или добавляя новые столбцы. Требуемый набор полей можно составить при помощи специального Редактора столбцов (рис. 1), который открывается при двойном щелчке на компоненте, перенесенном на форму.
В верхней части окна вы видите четыре кнопки, слева – направо:

  1. Add New (Добавить новый столбец).
  2. Delete Selected (Удалить выделенный столбец).
  3. Add All Fields (Добавить все столбцы из набора данных).
  4. Restore Defaults (Восстановить значения по умолчанию для выделенного столбца).
Читайте также:  Цикл стихи о прекрасной даме блока презентация

Цикл for dbgrid delphi
Рис. 1. Редактор колонок компонента TDBGrid
Для выбранного в списке столбца доступные для редактирования свойства появляются в Инспекторе объектов. Столбцы в списке можно редактировать, удалять, менять местами.
Изменить параметры заголовка столбца можно в раскрывающемся свойстве Title, которое имеет ряд собственных свойств:
Alignment – свойство устанавливает выравнивание заголовка и может быть taCenter (по центру), taLeftJustify (по левому краю) и taRightJustify (по правому краю).
Caption – свойство содержит текст, который отображается в заголовке столбца.
Color – цвет заголовка.
Font – шрифт заголовка.
Свойства Font, Alignment и Color внутри свойства Title меняют шрифт, выравнивание и цвет фона только заголовка столбца, а не его содержимого. Но у столбца имеются эти же свойства, они меняют шрифт, выравнивание и цвет фона выводимых в столбце данных.
Свойство Visible разрешает или запрещает отображение столбца, а свойство Width позволяет изменить его ширину.

Задание 1. Работа с редактором полей компонента DBGrid

1. Установите на форму компонент ADOTable, свяжите его с таблицей Pers базы Сотрудники (свойства ConnectionString – связать с базой Сотрудники, TableName=Pers, Active=True).
2. Установите DataSource, свяжите его с ADOTable1. .
3. На форму добавьте и компонент DBGrid, который свяжите с DataSource1..
4. Нам нужны не все поля таблицы, а только некоторые из них. Дважды щелкните по компоненту DBGrid1 и в открывшемся редакторе столбцов нажмите кнопку Add New. Появится один пустой столбец. Для того, чтобы он показал данные нужного поля, выделите его и в инспекторе объектов в свойстве FieldName выберите полеFam. .
5. Найдите свойство Title, раскройте его нажатием на кнопку «+». Настройте подсвойство Alignment=taCenter, Caption=”Фамилия”, Font установите полужирным. Найдите свойство Width, установите его равным 150. .
6.Аналогично добавьте и настройте свойства полей Nam, Par, Sex, Dep.
Цикл for dbgrid delphi.
Рисунок 2. Форма к заданию 1.

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

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

Задание 2. К примеру, пользователю неудобно просматривать три столбца “Фамилия”, “Имя” и “Отчество” из таблицы Pers базы данных Сотрудники. Ему было бы удобней просмотреть один сборный столбец в формате “Фамилия И.О.”.
.
1. Это и все последующие задания выполнять в программе из задания 1..
2. Создайте новый столбец, но не назначайте ему поле из НД. Выделите этот столбец, и в его свойстве Title.Caption впишите “Фамилия И.О.”, а в свойстве Width укажите ширину в 200 пикселей. .
3. Столбцы “Фамилия”, “Имя” и “Отчество” нам уже не нужны, скройте их, установив их свойство Visible в False. А новый столбец перетащите мышью наверх, его индекс будет равен 0..
4. Для компонента DBGrid1 создайте обработчик события OnDrawColumnCell. Это событие наступает при прорисовке каждой ячейки столбца. В него внесите код:.

var  s: String;
begin
if Column.Index = 0 then   //если это пустой столбец
begin
if ADOTable1[‘Fam’]<>Null then  s:=ADOTable1[‘Fam’] + ‘ ‘;
if ADOTable1[‘Nam’]<>Null then  s:=s + Copy(ADOTable1[‘Nam’], 1, 1)+ ‘.’;
if ADOTable1[‘Par’] <>Null  then  s:=s + Copy(ADOTable1[‘Par’], 1, 1)  + ‘.’;
DBGrid1.Canvas.TextOut(Rect.Left, Rect.Top, s);
end;
end;

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

Задание 3. Использовать пустой столбец для вывода информации по требованию пользователя. В DBGrid нам нужна кнопка, нажатие на которую привело бы к выводу сообщения об отделе, в котором работает сотрудник.
1. Откройте редактор столбцов и удалите столбец Dep.
2. Создайте новый пустой столбец. Перетаскивать его не нужно, пусть будет последним. Свойство Width (ширина) установите в 20 пикселей. Название столбца (Title.Caption) пусть будет пустым. В свойстве ButtonStyle выберите значение cbsEllipsis. Это приведет к тому, что при попытке редактировать этот столбец образуется кнопка с тремя точками:

Рисунок 4.  Кнопка в пустом столбце
3. Создайте обработчик события OnEditButtonClick() компонента DBGrid. Это событие происходит всякий раз, когда пользователь нажимает на кнопку “…”.

ShowMessage(‘Отдел: ‘+ADOTable1[‘Dep’]);

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

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

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

Задание 4. Создать для поля «Sex» список выбора значений (муж, жен).
1. Откройте редактор столбцов сетки и выделите столбец “Sex”. Обратите внимание на свойство PickList в Инспекторе объектов. Это свойство имеет тип TStrings, то есть представляет собой набор строк. Щелкните дважды по PickList, чтобы открыть редактор, и впишите туда
муж
жен
именно так, каждое значение на своей строке.
2. Запустите программу и попробуйте редактировать этот столбец. При попытке редактирования в ячейке покажется похожий на ComboBox список, в котором можно будет выбрать одно из указанных значений:

Рисунок 5.  Список выбора в сетке

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

В практике программирования список чаще формируется во время работы программы, а строки списка берутся, как правило, из другой связанной таблицы. Добавить в список новую строку очень просто: DBGrid1.Columns.Items[4].PickList.Add(‘абв’);

Список свойства PickList автоматически заполняется для поля синхронного просмотра (lookup-поле).

Выделение отдельных строк

Очень часто в практике приходится выделять какие-то строки, изменяя их фон или цвет шрифта. Например, в бухгалтерии обычно выделяют строки, в которых значение меньше нуля. Допустим, ваша программа показывает клиентов, а какой-то столбец содержит их баланс на счету вашей компании. Если этот баланс меньше 0, значит, клиент имеет задолженность перед вашей фирмой. Бухгалтеру будет очень удобно, если дебиторы (должники) будут выделяться в общем списке красным цветом.

Читайте также:  Циклы в мед универе

Способ прорисовки данных в DBGrid зависит от значения его свойства DefaultDrawing. По умолчанию свойство равно True, то есть данные прорисовываются автоматически. Если свойство содержит False, то прорисовку придется кодировать самостоятельно в свойстве OnDrawColumnCell.
Если мы написали алгоритм прорисовки, но свойство DefaultDrawing содержит True, то вначале сетка заполнится данными автоматически, а затем будет выполнен наш алгоритм. Другими словами, прорисовка некоторых частей сетки будет выполнена дважды. Это не очень хорошо для быстродействия программы, однако нам придется поступать именно так: ведь мы не все строки и столбцы собираемся выводить другим способом, а только некоторые. Остальные будут заполнены данными по умолчанию.

Разберем этот метод подробней. Если найти его в справке 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 – состояние ячейки. Может быть:

  • gdSelected – ячейка выделена
  • gdFocused – фокус ввода в ячейке
  • gdFixed – ячейка – заголовок столбца.

    Задание 5. Изменение цвета шрифта записей сотрудников, относящихся к отделу Бухгалтерия, на красный.

    Рисунок 6.  Выделение строк
    Заметим сразу, что наличие пустых столбцов создает дополнительные, но решаемые проблемы. Код события OnDrawColumnCell придется переделать, он будет таким:

    var s: String;
    begin  with DBGrid1.Canvas do begin    //поле “Dep” содержит Бухгалтерия?
       if (ADOTable1[‘Dep’]= ‘Бухгалтерия’) and not (gdSelected in State)
        then begin   //выводим все ячейки строки красным по белому:
           Font.Color:= clRed;
        FillRect(Rect);
      end; //if
    //если это пустой сборный столбец
     if Column.Index = 0 then begin
       if ADOTable1[‘fam’] <> Null then s:= ADOTable1[‘fam’] + ‘ ‘;
      if ADOTable1[‘nam’] <> Null then s:= s + Copy(ADOTable1[‘nam’], 1, 1) + ‘.’;
         if ADOTable1[‘par’] <> Null then s:= s + Copy(ADOTable1[‘par’], 1, 1)+ ‘.’;
        DBGrid1.Canvas.TextOut(Rect.Left, Rect.Top, s);
      end
      else
      if Column.Index = 5 then   //если это пустой столбец с кнопкой “…”
    begin
    DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
         Exit;
     end
       else TextOut(Rect.Left+2, Rect.Top+2, Column.Field.Text); //все остальные столбцы
    end;
    end;

    Разберемся с кодом. Вначале с помощью with мы указываем, что будем работать непосредственно со свойством DBGrid1.Canvas, которое отвечает за стиль прорисовки ячейки. Далее мы смотрим поле «Dep» текущей записи равно ли Бухгалтерия. Если да, то указываем, что цвет шрифта должен быть красным, а затем функцией FillRect(Rect) мы стираем стандартный вывод.
    Далее мы определяем, прорисовывается ли в данный момент пустой сборный столбец с “Фамилия И.О.”. Если это он, то мы формируем переменную s с нужными данными и выводим их, как в прошлый раз.
    Если же это пустой столбец с кнопкой “…”, то мы делаем стандартный вывод и выходим из процедуры. Если мы этого не сделаем, то получим ошибку программы.
    Все остальные столбцы мы выводим строкой

    TextOut(Rect.Left+2, Rect.Top+2, Column.Field.Text);

    Обратите внимание, что мы добавили по два пикселя к крайней левой и крайней верхней координате ячейки. Если этого не сделать, то новая прорисовка не будет целиком закрашивать старую (рис.7):

    Рисунок 7.  Некорректная прорисовка
    Количество добавляемых 2пикселей зависит от формата данных и размера шрифта. Обычно это определяется путем проб. Например, ячейка может содержать цифры, которые обычно прижимаются к правому краю, и тут двумя пикселями не обойтись.
    Сделать проверку на тип данных можно, например, так:

    //если текст, сдвинем только на 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 за цвет выводимого в ней шрифта.

    Компонент TDBCtrlGrid

    Компонент TDBCtrlGrid (стр.DataControls) внешне напоминает компонент TDBGrid, но никак не связан с классом TCustomDBGrid, а наследуется напрямую от класса TWinControl.
    Этот компонент позволяет отображать данные в строках в произвольной форме. Компонент представляет собой набор панелей, каждая из которых служит платформой для размещения данных отдельной записи набора данных. На панели могут размещаться любые компоненты отображения данных, предназначенные для работы с отдельным полем. С каждым таким компонентом можно связать нужное поле набора данных. При открытии набора данных в компоненте TDBCtrlGrid на каждой новой панели создается набор компонентов отображения данных, аналогичный тому, который был создан на одной панели во время разработки.
    На панель можно переносить только те компоненты отображения данных, которые показывают значение одного поля для единственной записи набора данных. Нельзя использовать компоненты TDBGrid, TDBCtrlGrid, TDBRichEdit, TDBListBox, TDBRadioGroup, TDBLookupListBox.
    Компонент может отображать панели в одну или несколько колонок. Для задания числа колонок панелей используется свойство ColCount. Число видимых строк панелей определяется свойством RowCount. Вертикальное или горизонтальное размещение колонок панелей зависит от значения свойства Orientation.
    Размеры одной панели определяются свойствами panelHeight и Panelwidth. Они взаимосвязаны с размерами самого компонента. При изменении значений свойств PanelHeight и Panelwidth размеры компонента изменяются таким образом, чтобы в нем помещалось указанное в свойствах colcount и RowCount число панелей и наоборот.
    Не рекомендуется размещать на панели компоненты TDBMemo и TDBimage, т. к. это может привести к значительному снижению производительности.

    Задание 6. Работа с компонентом DBCtrlGrid.
    Установите на форму компонент DBCtrlGrid.

    Укажите в его свойстве DataSource ссылку на компонент DataSource1.
    Установите на DBCtrlGrid следующие компоненты (рис.8):

    DBText1 (DataField=fam), DBText2 (DataField=Nam), DBText3 (DataField=Par),
    DBEdit1 (DataField=Dep),
    DBComboBox1 (DataField=Sex, в свойстве Items задайте две строки «муж» и «жен»),
    для слов «Отдел» и «Пол» установите компоненты Label1 и Label2.
    Запустите программу и посмотрите как выглядит компонент DBCtrlGrid (рис.9).
    Цикл for dbgrid delphi
    Рисунок 8. Форма в процессе разработки
    Цикл for dbgrid delphi
    Рисунок 9. DBCtrlGrid после запуска программы

    Составитель: Салий Н.А.

Источник