Другие языки программирования и технологии

У меня вопрос к программистам DELPHI.

Доброго времени суток.

На событие OnDrawCell установите свой обработчик. Вот пример. Выводит разными цветами информацию для разных условий. Переделать для простой закраски ячейки труда не должно составить.

procedure TMainWindow.DataListDrawCell(Sender: TObject; Col, Row: Integer;
Rect: TRect; State: TGridDrawState);
var
CurCol, CurRow : Longint;
CellIndex : Integer;
begin
TStringGrid(Sender).MouseToCell(Rect.Left, Rect.Top, CurCol, CurRow);
if CurRow <> 0 then CellIndex:=GetCellIndex(CurCol, CurRow)
else CellIndex:=-1;
with TStringGrid(Sender)do begin
if (ActiveList = 2) and (CellIndex >= 0) and
(CellIndex < EndDataIndex-LastYears*12+1) then begin
Canvas.Font.Color:=clRed;
Canvas.TextOut(Rect.Left+2, Rect.Top+2, Cells[CurCol,CurRow]);
end;
if CanShowResult and ShowInColor.Checked and ((ActiveList = 3) or (ActiveList = 2)) and
(CellIndex >= StartPeriod) and (CellIndex <= EndPeriod) then begin
Canvas.Brush.Color:=clBlue;
Canvas.Font.Color:=clWhite;
Canvas.FillRect(Rect); {вотэто и закрашивает ячейку}
Canvas.TextOut(Rect.Left+2, Rect.Top+2, Cells[CurCol,CurRow]);
end;
end;
end;

Удачи!
Роман Логачев
Роман Логачев
59 612
Лучший ответ
Нужно установить свойство TStringGrid OwnerDraw == True;
И в сответствужщем событии отрисовать как вам нужно.
StringGrid

Для раскрашивания будем использовать событие "OnDrawCell". Следующий код показывает, как сделать в Grid красный бэкраунд. Бэкграунд второй колонки будет зелёным.

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
const //здесь определяем Ваш цвет. Так же можно использовать цвета по умолчанию.
clPaleGreen = TColor($CCFFCC);
clPaleRed = TColor($CCCCFF);
begin
//Если ячейка получает фокус, то нам надо закрасить её другими цветами
if (gdFocused in State) then
begin
StringGrid1.Canvas.Brush.Color := clBlack;
StringGrid1.Canvas.Font.Color := clWhite;
end
else //Если же ячейка теряет фокус, то закрашиваем её красным и зелёным
if ACol = 2 then //Вторая колонка будет зелёной, другие - ячейки красными
StringGrid1.Canvas.Brush.color := clPaleGreen
else
StringGrid1.canvas.brush.Color := clPaleRed;

//Теперь закрасим ячейки, но только, если ячейка не Title- Row/Column
//Естественно это завит от того, есть у Вас title-Row/Columns или нет.

if (ACol > 0) and (ARow > 0) then
begin
//Закрашиваем бэкграунд
StringGrid1.Canvas.FillRect(Rect);

//Закрашиваем текст (Text). Также здесь можно добавить выравнивание и т. д. .
StringGrid1.Canvas.TextOut(Rect.Left, Rect.Top, StringGrid1.Cells[ACol, ARow]);
end;
end;

Если Вы захотите чтобы цвет ячеек менялся в зависимости от значения в них, то можно заменить 3 линии (if Acol = 2 ...) на что-нибуть вроде этого

if StringGrid1.Cells[ACol, ARow] = 'highlight it' then
StringGrid1.Canvas.Brush.color := clPalered
else
StringGrid1.canvas.brush.Color := clWhite;
начинать с basic 6 надо. не будет подобных вопросов
AG
Alex Guminsky
166