В этой статье, я хотел бы рассказать как можно закрасить определенные ячейки в 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.
Исходник статьи можно скачать тут
В настоящее время без операционной системы никуда, так как операционная система связывает аппаратное обеспечение компьютера с программным. На данный момент наиболее распространенная операционная система — Windows. Да, кстати, windows xp professional eng скачать Вы можете совершенно бесплатно. Выбирайте только правильные операционные системы на Ваш компьютер. |
Метки: StringGrid, TStringGrid
[…] сказать, что данная статья является продолжением статьи про закрашивание ячеек в TStringGrid. Конечно мы в данной статье будем говорить не совсем о […]
если нужно изменить цвет шрифта, размер шрифта, стиль шрифта и т.п. в определенных ячейках, то эта процедура как я понимаю уже не подойдет
насколько я знаю, данное событие срабатывает только для закрашивания ячеек
удалось вымучить только такой способ:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
Begin
StringGrid1.Canvas.Font.Color := clGreen;
StringGrid1.Canvas.Font.Style := [fsBold];
StringGrid1.Canvas.Font.Size := 12;
StringGrid1.Canvas.Font.Name := ‘Arial';
if StringGrid1.Cells[ACol+5, ARow]=’УСЛОВИЕ’ then
begin
StringGrid1.Canvas.Brush.Color:= clYellow;
StringGrid1.Canvas.FillRect(Rect);
StringGrid1.Canvas.TextOut(Rect.Left,Rect.Top,StringGrid1.cells[ACol, ARow]);
end;
End;
Сделал по инструкции, но у меня ячейки окрашиваются только при нажатие на них мышкой, можно ли сделать чтоб они сразу окрашивались?
данный пример показывает закрашивание ячеек при том, что в TStringGrid будут какие-то данные
[…] скажу Вам, я даже про это рассказывал, в данном блоге – Как закрасить нужные ячейки в TStringGrid. Я решил этот вариант модернизировать и применить для […]