Delphi 3 и создание приложений баз данных

       

Управление отображением данных в 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 = record

CASE 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, а также в определении длины и высоты выводимого в ячейку текста и в их последующем сопоставлении.



Содержание раздела