В этой статье, я хотел бы рассказать как можно закрасить определенные ячейки в TStringGrid - определенным цветом, в определенной строке и в определенном столбце. Это довольно часто используется: многие используется данный прием для подчеркивания итоговых данных, для выделения важных данных, для разделения данных на определенные группы. Для данной статьи нам понадобится сам компонент TStringGrid и кнопка TButton. Сама кнопка нам понадобится для того, чтобы заполнить данными сам TStringGrid, а заполнять мы будем это все случайным образом, так как нам это не критично, какие данные выводить в TStringGrid, поэтому активируем функцию random и на событие Form1 - OnCreate напишем следующий код, а точнее сделаем так, что генерация наших случайных чисел была непредсказумой:
procedure TForm1.FormCreate(Sender: TObject);
begin
randomize;
end;
Так функцию рандом мы активировали (сделали генерацию чисел не предсказуемой), далее нам придется написать сам код заполнения ячеек TStringGrid. Для начала необходимо задать количество столбцов и количество строк, сколько у нас их будет вообще. Я сделал количество столбцов равным 7, а количество строк равным 20, кто хочет другое количество я не против, можете задавать свое. Далее нам необходимо 2 переменные типа integer объявить, которые понадобятся нам для цикла по строкам и для цикла по столбцам, в результате чего мы заполним каждую ячейку случайным числом. Случайное число я установил в диапазоне до 100, этот параметр также не критичен, так что можете установить любой свой, но в пределах разумного и конечно же допустимого.
На событие OnClick кнопки я написал следующий код.
procedure TForm1.Button1Click(Sender: TObject);
var
i,j:integer;
begin
StringGrid1.ColCount:=7;
StringGrid1.RowCount:=20;
for i:=0 to StringGrid1.RowCount-1 do
begin
for j:=0 to StringGrid1.ColCount-1 do
begin
StringGrid1.Cells[j,i]:=IntToStr(random(100));
end;
end;
end;
Этим кодом мы заполняем весь наш TStringGrid числами, для проверки скомпилируем нашу программу и проверим все ли так получается. Что мы делаем далее, а дальше мы исчем событие у TStringGrid, которое называется OnDrawCell, с помощью которого мы и будем закрашивать наши ячейки. Принцип закраски состоит в следующем: мы задаем цвет закрашивания ячейки, затем заливаем ячейку нужным цветом, после чего на уже перекрашенную цветом ячейку мы выводим нужный нам текст, а точнее тот, который был там и раньше. Вот код, который эти все 3 действия выполняет.
begin
StringGrid1.Canvas.Brush.Color:=clRed;
StringGrid1.Canvas.FillRect(Rect);
StringGrid1.Canvas.TextOut(Rect.Left,Rect.Top,StringGrid1.Cells[Acol,Arow]);
end;
Но если, Вы сделаете так и запустите программу, скомпилируете ее, при условии, что Вы будете производить заливку ячеек по определенному условию (а не все сразу ячейки), например, если числа в ячейках больше 20, то закрашиваем, в таком случае Вам компилятор выдаст следующее сообщение о том, что данных в ячейках нету. Для этого мы добавляем новое условие — делаем проверку на то, чтобы наша ячейка не была пустой. Вот мой весь кода на событии OnDrawCell, который закрашивает ячейки TStringGrid в 3 цвета: в зеленый — если значение ячейки меньше или равно 10, в красный — если значение ячейки больше или равно 50, в желтый — если значение ячейки больше 10 и меньше 50.
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
if StringGrid1.Cells[ACol,ARow]<>'' then
begin
if StrToInt(StringGrid1.Cells[ACol,ARow])>=50 then
begin
StringGrid1.Canvas.Brush.Color:=clRed;
StringGrid1.Canvas.FillRect(Rect);
StringGrid1.Canvas.TextOut(Rect.Left,Rect.Top,StringGrid1.Cells[Acol,Arow]);
end;
end;
if StringGrid1.Cells[ACol,ARow]<>'' then
begin
if StrToInt(StringGrid1.Cells[ACol,ARow])<=10 then
begin
StringGrid1.Canvas.Brush.Color:=clGreen;
StringGrid1.Canvas.FillRect(Rect);
StringGrid1.Canvas.TextOut(Rect.Left,Rect.Top,StringGrid1.Cells[Acol,Arow]);
end;
end;
if StringGrid1.Cells[ACol,ARow]<>'' then
begin
if (StrToInt(StringGrid1.Cells[ACol,ARow])>10)
and (StrToInt(StringGrid1.Cells[ACol,ARow])<50) then
begin
StringGrid1.Canvas.Brush.Color:=clYellow;
StringGrid1.Canvas.FillRect(Rect);
StringGrid1.Canvas.TextOut(Rect.Left,Rect.Top,StringGrid1.Cells[Acol,Arow]);
end;
end;
end;
Для того, чтобы закрасить определенный столбец или определенную строку, например, если выводить какие-то итоги или промежуточные данные, то они обычно выводятся в последних строках и последних столбцах. Так вот, давайте закрасим последнюю строку синим цветом, тем самым будем считать, что это подведение каких-то итоговых данных, которые нам лучше всего выделить, вот следующий код
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
if Arow=StringGrid1.RowCount-1 then
begin
if StringGrid1.Cells[ACol,ARow]<>'' then
begin
StringGrid1.Canvas.Brush.Color:=clBlue;
StringGrid1.Canvas.FillRect(Rect);
StringGrid1.Canvas.TextOut(Rect.Left,Rect.Top,StringGrid1.Cells[Acol,Arow]);
end;
end;
end;
Как Вы заметили, я добавил проверку строки на то — является ли она последний или нет, если да, то закрашиваем , если нет, то ничего не делаем. Точно так же можно поступить и со столбцами, только для этого необходимо использовать сравнение переменной ACol.
Как видите все очень просто в данном случае, ничего сложно нету, теперь Вы можете украшать свои проекты, закрашиванием ячеек в TStrinGrid и выделять эти данные подобным образом. Дальше я бы хотел рассмотреть, как можно распечатать данные из TStringGrid и как можно построить график по данным TStringGrid и на графике также выделить промежутки цветом, подобным в самой таблице TStringGrid.
Исходник статьи можно скачать тут