Как объединить несколько ячеек?
// Способ первый
// Отключение отрисовки не сработает, т.к. в DBGridEh.pas
// FonDrawFooterCell вызывается уже после прорисовки ячейки
// методом по умолчанию, но можно отрисовать ячейку 1 после
// отрисовки ячейки 2. Представленный подход имеем проблему
// с выделением строк и отрисованных ячейках
procedure TForm1.DBGridEh1DrawFooterCell(Sender: TObject;
DataCol, Row: Integer; Column: TColumnEh; Rect: TRect; State: TGridDrawState);
begin
if Row = 1 then // нумерация с 0
begin
DBGridEh1.Canvas.Brush.Color := clSilver;
if Column.Index = 1 then
begin
Rect.Left := Rect.Left - DBGridEh1.Columns[0].Width;
DBGridEh1.Canvas.FillRect(Rect);
DBGridEh1.Canvas.TextOut(Rect.Left, Rect.Top + 2, DBGridEh1.GetFooterValue(Row,
DBGridEh1.Columns[0]));
end
else
DBGridEh1.DefaultDrawFooterCell(Rect, DataCol, Row, Column, State);
end
else
begin
Column.Footer.ValueType := fvtSum;
inherited;
end;
end;
// Способ второй
procedure Tfrm_psk_LST.grd_MainDrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumnEh;
State: TGridDrawState);
function isCombineLine: Boolean;
begin
with (Sender as TDBGridEhAuto) do
Result := (Columns[1].DisplayText <> '') and
(Columns[2].DisplayText = '') and
(Columns[3].DisplayText = '');
end;
const
{$J+}
isSelect: Boolean = False;
{$J+}
var
r: TRect;
begin
if DataCol = 0 then
isSelect := False;
if DataCol in [1..3] then // нумерация с 0
begin
if (gdSelected in State) or isSelect then
begin
if ActiveControl = Sender then
DBGridEh1.Canvas.Brush.Color := RGB(215, 240, 255)
else
DBGridEh1.Canvas.Brush.Color := RGB(218, 218, 218);
if not isSelect then
isSelect := True;
end
else
DBGridEh1.Canvas.Brush.Color := (Sender as TDBGridEhAuto).EvenRowColor;
if isCombineLine then
begin
r := Rect;
case Column.Index of
// Здесь 2 - количество объединяемых ячеек минус 1
1: r.Right := r.Right + DBGridEh1.Columns[1].Width + DBGridEh1.Columns[2].Width + 2;
2: begin
r.Left := r.Left - DBGridEh1.Columns[1].Width - 1;
r.Right := r.Right + DBGridEh1.Columns[2].Width + 1;
end;
3: r.Left := r.Left - DBGridEh1.Columns[1].Width - DBGridEh1.Columns[2].Width - 2;
end;
DBGridEh1.Canvas.FillRect(r);
DBGridEh1.Canvas.Font.Style := [fsBold];
r.Left := r.Left + 2;
DrawTextEh(DBGridEh1.Canvas.Handle, DBGridEh1.Columns[1].DisplayText,
Length(DBGridEh1.Columns[1].DisplayText), r, DT_END_ELLIPSIS);
end;
end;
end;
|