В этой статье, я хотел бы рассказать как можно закрасить определенные ячейки в 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 скачать Вы можете совершенно бесплатно. Выбирайте только правильные операционные системы на Ваш компьютер.

Метки: ,




К записи “Закрашиваем ячейки в TStringGrid” оставлено комментариев: 7.

  1. […] сказать, что данная статья является продолжением статьи про закрашивание ячеек в TStringGrid. Конечно мы в данной статье будем говорить не совсем о […]

  2. Надежда:

    если нужно изменить цвет шрифта, размер шрифта, стиль шрифта и т.п. в определенных ячейках, то эта процедура как я понимаю уже не подойдет

    • Andrey53:

      насколько я знаю, данное событие срабатывает только для закрашивания ячеек

      • Надежда:

        удалось вымучить только такой способ:
        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;

  3. antisportik228:

    Сделал по инструкции, но у меня ячейки окрашиваются только при нажатие на них мышкой, можно ли сделать чтоб они сразу окрашивались?

    • Andrey:

      данный пример показывает закрашивание ячеек при том, что в TStringGrid будут какие-то данные

  4. […] скажу Вам, я даже про это рассказывал, в данном блоге – Как закрасить нужные ячейки в TStringGrid. Я решил этот вариант модернизировать и применить для […]

Оставить комментарий

Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

*