Владимир Коднянко дата публикации 17-05-2002 10:48 О нестандартном выводе в DBGrid и StringGrid
1. Во многих FAQ-ах и книгах по Delphi приходилось видеть процедуры нестандартной закраски отдельных ячеек DBGrid. Однако при их исполнении текст отформатирован по левому краю и располагается по высоте ячейки не так, как в ячейках стандартного вывода. Ниже привожу пример обработчика события OnDrawColumnCell для сетки gAg: TDBGrid, где эти проблемы сняты для случая форматирования по правому краю:
procedure TfAg.gAgDrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
var r: TRect;
begin
With gAg.Canvas do
begin
if not (gdFocused in State) and (Column.Field.AsString = '-1')
and (Column.FieldName = 'PointN') then
begin
Brush.Color:= clRed; // цвет подложки - красный
Font.Color:= clWhite; // цвет символов - белый
FillRect(Rect); // закраска всей ячейки
With Sender as TDBGrid do
begin
r:= KdnRect(Rect,0,2,-3,0); //уменьшенный и смещенный Rect
//нестандартный вывод
DrawText(Canvas.Handle, PChar(Column.Field.Text),
Length(Column.Field.Text),r,
DrawTextBiDiModeFlags(DT_RIGHT));
end;
end
else
// стандартный вывод
gAg.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
end; | |
На рис.1 приведен фрагмент сетки, сформированной этим обработчиком.
Рис. 1. Фрагмент DBGrid с нестандартной закраской отдельных ячеек и
форматированием их содержимого по правому краю и по высоте ячейки
Процедура выводит нестандартно только значения -1 в ячейки столбеца PointN сетки fAg. Суть состоит в использовании уменьшенного Rect-а, сформированного по базовому Rect с помощью функции KdnRect (текст приведен ниже) с последующей подгонкой уменьшенного Rect-а под формат стандартного вывода и рисованием содержимого ячейки по нужному формату выравнивания. Так, уменьшенный r смещен по отношению к Rect вниз на 2 (2), правая граница смещена влево на 3 (-3). Константа DT_RIGHT указывает на способ форматирования. Для того, чтобы вывести текст в центре ячейки следует константу DT_RIGHT заменить на DT_CENTER. При этом оператор формирования r лучше заменить на r:= KdnRect(Rect,0,2,0,0) с целью использования всей ширины ячейки.
function KdnRect(Rect: TRect; DLeft,DTop,DRight,DBottom: Integer): TRect;
begin
With Result do
begin
Left:= Rect.Left + DLeft;
Top:= Rect.Top + DTop;
Right:= Rect.Right + DRight;
Bottom:= Rect.Bottom + DBottom;
end;
end; | |
2. Аналогичная проблема может быть решена для StringGrid. Привожу пример обработчика события OnDrawCell. Он выводит нестандартно во все ячейки, а ячейку, координаты которой совпадают с внешними параметрами SgKritCol, SgKritRow, красит желтым цветом. Пример фрагмента сетки StringGrid показан на рис. 2.
procedure TfAg.SgKritDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var r: TRect;
begin
With Sender as TStringGrid do
begin
With Canvas do
begin
if (SgKritCol = ACol) and (SgKritRow = ARow) then
Brush.Color:= clYellow else Brush.Color := clWhite;
Font.Color:= clBlack;
FillRect(Rect);
end;
r:= KdnRect(Rect,0,4,-3,0);
DrawText(Canvas.Handle, PChar(SgKrit.Cells[ACol, ARow]),
Length(SgKrit.Cells[ACol, ARow]),r,
DrawTextBiDiModeFlags(DT_RIGHT));
end;
end; | |

Рис. 2. Фрагмент StringGrid с нестандартной закраской ячейки и форматированием
ее содержимого по правому краю и по высоте ячейки
Коднянко Владимир
Красноярск, 17.05.2002
[TStringGrid] [TDBGrid] [Перерисовка компонент] [Отображение списков, сеток]
Обсуждение материала [ 27-12-2002 14:54 ] 4 сообщения |