используй DrawGrid. Тем более, что за отрисовку теблицы там отвечает только OnDrawCell. Там только одна "проблема"(на самом деле - просто особенность): таблица изначально имеет "виртуальный" стиль - никакого свойства Cells нет, за хранение информации отвечаешь сам. Процедура отрисовки будет выглядеть:
Код | procedure TForm1.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); var txt: string; backColor, textColor: TColor; isSelected: Boolean; senderGrid: TDrawGrid; begin senderGrid:= Sender as TDrawGrid; isSelected:= false; {генерируем текст ячейки} if (ACol= 0) AND (ARow = 0) then txt:= '' else begin if ACol = 0 then // заголовок строки txt:= 'Строка ' + inttostr(ARow) else begin if ARow = 0 then // заголовок столбца txt:= 'Столбец ' + inttostr(ACol) else // "обычная" ячейка txt:= inttostr(ARow * senderGrid.ColCount + ACol); end; end; {/генерируем текст ячейки} if gdFocused in State then // ячейка непосредственно выбрана isSelected:= True; if (SenderGrid.Selection.Left<= ACol) AND (SenderGrid.Selection.Right>= ACol) AND (SenderGrid.Selection.Top = 0) then // среди выбранных ячеек есть заголовок столбца, к которому относится текущая ячейка isSelected:= True; if isSelected then // ячейка выделена begin textColor:= clWhite; if gdFixed in State then backColor:= $0999999 else backColor:= $0FFAAAA; end else // ячейка не выделена begin textColor:= clBlack; if gdFixed in State then backColor:= $0DDDDDD else backColor:= $0FFFFFF; end; senderGrid.Canvas.Brush.Color:= backColor; senderGrid.Canvas.Font.Color:= textColor; senderGrid.Canvas.FillRect(Rect); senderGrid.Canvas.TextRect(Rect,Rect.Left,Rect.Top,txt); end;
|
чтоб можно было выбирать заголовки столбцов, надо бы установить FixedCols/FixedRows == 0, а также добавить процедуру-обработчик onClick, чтоб при выборе заголовков инициировать перерисовку
Код | procedure TForm1.DrawGrid1Click(Sender: TObject); begin DrawGrid1.Invalidate(); end;
|
|