Управление отображением данных в TDBGrid
Ниже рассмотрены средства для выделения (цветом, шрифтом и т.д.) какого-либо столбца в TDBGrid.
На характеристики представления значений в ячейках TDBGrid также могут оказывать влияние такие свойства компонентов TField, как DisplayFormat и EditFormat, которые позволяют задавать формат поля соответственно при его показе и при редактировании, причем эти свойства актуальны для всех компонентов, визуализирующих значение поля (полей), а не только для столбцов TDBGrid.
Перечисленные средства носят безусловный характер, то есть позволяют изменять характеристики показа всех значений в конкретном столбце. Однако может потребоваться выделять тем или иным образом не целый столбец, а определенные ячейки столбца, отвечающие какому-либо условию. Например, для бухгалтерских и складских программ часто принято выделять красным цветом отрицательные остатки или остатки, находящиеся ниже установленного лимита.
То, как осуществляется прорисовка данных в TDBGrid - стандартным способом или по особому сценарию - определяется свойством property DefaultDrawing: Boolean;
В случае, если имеет место управление прорисовкой со стороны самого приложения, алгоритм прорисовки должен содержаться в обработчиках событий OnDrawColumnCell или OnDrawDataCell. Заметим, что обработчик события OnDrawDataCell введен для совместимости с ранними версиями Delphi.
При автоматической прорисовке (DefaultDrawing = True) метод Paint использует цвет и шрифт свойства Canvas для прорисовки ячейки. Событие
property OnDrawColumnCell: TDrawColumnCellEvent;
TDrawColumnCellEvent = procedure (Sender: TObject; const Rect:
TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState) of object;
где параметры имеют следующий смысл:
Rect - определяет область ячейки, в которой, собственно, происходит прорисовка,
Тип
TRect = recordCASE Integer of
0: (Left, Top, Right, Bottom: Integer);
1: (TopLeft, BottomRight: TPoint);
END;
END;
определяет прямоугольник, в котором прорисовывается ячейка TDBGrid, координаты прямоугольника указываются или как 4 целых числа, содержащие границы прямоугольника в пиксельном исчислении, или как 2 значения типа TPoint, определяющих левый верхний и правый нижний углы прямоугольника:
TPoint = record
X: Longint;
Y: Longint;
end;
DataCol -
определяет порядковый номер текущего столбца, начиная с 0-го;• Column. TColumn - определяет текущий столбец.
• State TGridDrawState - определяет состояние ячейки.
Тип TGridDrawState = set of (gdSelected, gdFocused, gdFixed) ;
определяет множество возможных состояний ячейки TDBGrid.
Если ячейка находится в состоянии gdFocused (т.е. является текущей), в обработчике события OnDrawColumnCell происходит прорисовка инверсной полосы.
Для вывода ячеек стандартным образом используется метод
procedure DefaultDrawColumnCell(const Rect: TRect; DataCol: Integer; Column:
TColumn; State: TGridDrawState);
Используя информацию, содержащуюся в передаваемых в обработчик OnDrawColumnCell параметрах, можно изменять отображение как целых строк, так и отдельных ячеек.
Пример.
Пусть необходимо выводить белым шрифтом на красном фоне те строки НД, у которых поле'Doljnost' содержит значение 'профессор'(рис. 10.20).procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
WITH DBGrid!.Canvas do begin
// поле "Должность" содержит значение "профессор"?
IF (Table1Doljnost.AsString = 'профессор') AND not (gdFocused in State) THEN
// - да. Выводить все ячейки строки бельм шрифтом на красном фоне
begin
Brush.Color := cIRed;
Font.Color := clWhite;
FillRect(Rect) ;
TextOut(Rect.Left, Rect.Top,Column.Field.Text) ;
end
ELSE
// - нет, текущее значение "Должности" - не "профессор". Выводим все ячейки строки стандартным образом
DBGrid1.DsfaultDrahColumnCellfRect, DataOol, Column, State);
END; {with}
end;
В отличие от предыдущего примера, в следующем выделяются не строки, а ячейки:
procedure TForm!.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
WITH DBGrid!.Canvas do begin
// текущий столбец - "Должность"?
IF (Column.Field.FieldName = 'Doljnost') AND not(gdFocused in State) THEN
// Текущая ячейка содержит значение "профессор"?
IF Column.Field.Text = 'профессор' THEN
// - да. Тогда вывести ячейку белым шрифтом на красном фоне
begin
Brush.Color := cIRed;
Font.Color := clWhite;
FillRect(Rect) ;
TextOut(Rect.Left, Rect.Top, Column.Field.Text);
Exit;
end;
// сюда попадаем, только если текущий столбец - не "Должность" или "Должность", но значение ячейки столбца - не "профессор"
DBGrid!.DefaultDrawColumnCell(Rect, DataCol, Column, State);
END; {with}
end;
ЗАМЕЧАНИЕ.
В показанном выше примере значение поля "Должность" имеет строковый тип. Строковые значения в ячейках TDBGrid принято выводить выровненными влево. Поэтому в процедуреTextOut(Rect.Left, Rect.Top,Column.Field.Text) ;
используется горизонтальная координата Rect.Left.
В случае, когда показываемое в ячейке значение должно быть выровнено вправо (как часто имеет место для цифровых значений), необходимо заменить координату Rect.Left на правую координату ячейки, уменьшенную на ширину выводимого в ячейке текста. Ширина текста возвращается методом TextWidth компонента TDBGrid. Canvas:
function (const Text: string): Integer;
В этом случае содержимое ячейки выводится следующим образом:
TextOutfRect.Right - 3 - TextWidth(Column.Field.Text), Rect.Top,Column.Field.Text) ;
Заметим, что дополнительный сдвиг на 3 пиксела нужен, чтобы оставить справа от текста небольшой пробел.
Заметим также, что сдвиг на 3 пиксела хорош для шрифта MS Sans Serif размером 12 пунктов, который использовался в данном примере; для других шрифтов и размеров эта величина нуждается в изменении. В общем случае, содержание алгоритма, реализующего выравнивание текста, состоит в определении длины и высоты ячейки TDBGrid, а также в определении длины и высоты выводимого в ячейку текста и в их последующем сопоставлении.