Добрый день.
Для отрисовки окантовки ячеек грида вы можете использовать событие TColumnEh.OnAdvDrawDataCell
Обработчик события необходимо присвоить каждой колонке грида.
В событии понадобиться обращения к protected методам грида.
Код:
type
TDBGridEhCrack = class(TCustomDBGridEh);
а также возможность обращения к следующей записи грида для корректной отрисовки нижней линии для окантовки следующей ячейки.
Код:
if (AreaCell.Y < Grid.InstantReadRecordCount - 1) then
begin
try
Grid.InstantReadRecordEnter(AreaCell.Y + 1);
NextRowIsSpecial := MemTableEh1.FieldByName('SpecialBorderState').AsInteger = 1;
finally
Grid.InstantReadRecordLeave;
end;
end;
Полный код обработчика события приведен ниже:
Код:
type
TDBGridEhCrack = class(TCustomDBGridEh);
procedure TForm1.DBGridEh1Columns0AdvDrawDataCell(Sender: TCustomDBGridEh; Cell,
AreaCell: TGridCoord; Column: TColumnEh; const ARect: TRect;
var Params: TColCellParamsEh; var Processed: Boolean);
var
Grid: TDBGridEhCrack;
NextRowIsSpecial: Boolean;
begin
Grid := TDBGridEhCrack(Sender);
NextRowIsSpecial := False;
if (MemTableEh1.FieldByName('SpecialBorderState').AsInteger = 1) then
begin
Params.Background := $006DD3EB;
Params.Font.Style := [fsBold];
end;
Grid.DefaultDrawColumnDataCell(Cell, AreaCell, Column, ARect, Params);
if (AreaCell.Y < Grid.InstantReadRecordCount - 1) then
begin
try
Grid.InstantReadRecordEnter(AreaCell.Y + 1);
NextRowIsSpecial := MemTableEh1.FieldByName('SpecialBorderState').AsInteger = 1;
finally
Grid.InstantReadRecordLeave;
end;
end;
if (MemTableEh1.FieldByName('SpecialBorderState').AsInteger = 1) then
begin
Grid.Canvas.Pen.Color := clRed;
Grid.DrawPolyline(Grid.Canvas, [Point(ARect.Left, ARect.Bottom), Point(ARect.Right, ARect.Bottom)]);
Grid.DrawPolyline(Grid.Canvas, [Point(ARect.Right, ARect.Top), Point(ARect.Right, ARect.Bottom+1)]);
if (AreaCell.X = 0) then
Grid.DrawPolyline(Grid.Canvas, [Point(ARect.Left, ARect.Top), Point(ARect.Left, ARect.Bottom+1)]);
end else if NextRowIsSpecial then
begin
Grid.Canvas.Pen.Color := clRed;
Grid.DrawPolyline(Grid.Canvas, [Point(ARect.Left, ARect.Bottom), Point(ARect.Right+1, ARect.Bottom)]);
end;
Processed := True;
end;
Демо проект прилагается.
В Демо проекте в Unit2 приведен пример реализации окантовки через наследование грида.