Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/21: Рейтинг темы: голосов - 21, средняя оценка - 4.52
 Аватар для Сергей 190
365 / 348 / 74
Регистрация: 18.03.2015
Сообщений: 1,293

Не могу изменить цвет ячейки StringGrid (Builder 6)

08.12.2015, 21:26. Показов 4733. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Перечитал множество тем по изменению цвета ячеек. Проблему не решил.
Необходимо, в зависимости от условия (Cvet=0 или Cvet=1), изменять цвет ячеек или цвет шрифта.

У меня цвет меняется только в последней ячейке.

Т.е. если X должен быть красным, а Y и Z, то так и происходит.
Если X и Y должны быть красные, то X белый, а Y красный…

В чем проблема?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
int Nomer_str=1;
 int Cvet=0; //Cvet=0 Красный  Cvet=1 НЕТ цвета
void Analiz_stroki();
 
//---------------------------------------------------------------------------
void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,
      int ARow, TRect &Rect, TGridDrawState State){
 
 if (Cvet==0){
 StringGrid1->Canvas->Brush->Color=clRed;
if (ACol==2 && ARow==Nomer_str) {
 StringGrid1->Canvas->FillRect(Rect);
 StringGrid1->Canvas->TextOut(Rect.Left, Rect.Top,
  StringGrid1->Cells[ACol][Nomer_str]);
}
}
}
//---------------------------------------------------------------------------
void Analiz_stroki(){
.
.
.
if (pole1[jjj]=='X') {
Nomer_str=jjj;
       if (pl1/100==pl3){
       Cvet=1;
      Form1-> StringGrid1->Cells[2][jjj] = "Новые координаты X";
     }
 
    else  {
    Cvet=0;
    Form1-> StringGrid1->Cells[2][jjj] = "координаты X не в допуске";
    }
  }
 
if (pole1[jjj]=='Y') {
Nomer_str=jjj;
       if (pl1/100==pl3) {
      Cvet=1;
      Form1-> StringGrid1->Cells[2][jjj] = "Новые координаты Y";
      }
     else  {
     Cvet=0;
     Form1-> StringGrid1->Cells[2][jjj] = "координаты Y не в допуске";
    }
  }
 
 if (pole1[jjj]=='Z'){
   pole3[jjj]=1;
       if (pl1/100==pl3) {
       Cvet=1;
       Form1-> StringGrid1->Cells[2][jjj] = "Новые координаты Z";
       }
       else  {
       Cvet=0;   
       Form1-> StringGrid1->Cells[2][jjj] = "координаты Z не в допуске";
       }
     }
 
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.12.2015, 21:26
Ответы с готовыми решениями:

Цвет ячейки StringGrid
Есть СтрингГрид (матрица, заполнен целыми числами). По нажатию на кнопку в нем ищутся, допустим, нечетные числа. Как покрасить ячейку с...

Цвет ячейки StringGrid
Нужно сделать так чтобы в stringride выделялось красным цветом фон ячейки с максимальным элементом Вот код.Все работает ОТЛИЧНО. Помогите...

StringGrid И цвет ячейки
Уважаемые форумчане подскажите как изменить цвет ячейки в StringGirid (допустим я отредактировал значение в ячейке и после этого...

14
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
08.12.2015, 22:20
... чисто интуитивно, - может State (параметры) нужно потрогать? а то при очередной прорисовке и несовпадении с номером строки ячейки просто стандартно перепишутся?...
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33378 / 21502 / 8236
Регистрация: 22.10.2011
Сообщений: 36,899
Записей в блоге: 11
08.12.2015, 22:44
Сергей 190, я бы использовал StringGrid1->Objects, чтобы для каждой ячейки хранить признак цвета, а не где-то глобально один-единственный Cvet. А уже при перерисовке ячейки проверять:
C++
1
2
3
4
5
6
7
8
9
10
void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,
      int ARow, TRect &Rect, TGridDrawState State)
{
        if((int)StringGrid1->Objects[ACol][ARow] == 0)
        {
                StringGrid1->Canvas->Brush->Color=clRed;
        }
        StringGrid1->Canvas->FillRect(Rect);
        StringGrid1->Canvas->TextOut(Rect.Left, Rect.Top, StringGrid1->Cells[ACol][ARow]);
}
0
 Аватар для Сергей 190
365 / 348 / 74
Регистрация: 18.03.2015
Сообщений: 1,293
09.12.2015, 11:15  [ТС]
параметры State это где?

Добавлено через 3 минуты
volvo, попытался StringGrid1->Objects - При запуске вся таблица красная и вся таблица заполняется ОДНОЙ строчкой.
0
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
09.12.2015, 12:05
у меня есть готовый пример раскраски ячеек, но предоставить код смогу только вечером, сейчас нет исходников
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33378 / 21502 / 8236
Регистрация: 22.10.2011
Сообщений: 36,899
Записей в блоге: 11
09.12.2015, 13:54
Цитата Сообщение от Сергей 190 Посмотреть сообщение
попытался StringGrid1->Objects
Показывай, как пытался. То, что я написал - проделывалось неоднократно, и всегда работало.
0
 Аватар для Сергей 190
365 / 348 / 74
Регистрация: 18.03.2015
Сообщений: 1,293
09.12.2015, 15:59  [ТС]
volvo, скопировал Ваш код вместо своего. Изменил ARow на Nomer_str.
Я не понимаю, что вообще делает функция
void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,int ARow, TRect &Rect, TGridDrawState State)
Если не затруднит, комментарии к каждой строке, пожалуйста.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33378 / 21502 / 8236
Регистрация: 22.10.2011
Сообщений: 36,899
Записей в блоге: 11
09.12.2015, 18:08
Цитата Сообщение от Сергей 190 Посмотреть сообщение
Изменил ARow на Nomer_str.
Я этого не сделал - почему ты сделал? Пойми, что OnDrawCell вызывается для КАЖДОЙ клетки, и для КАЖДОЙ нужно проверять ее состояние (цвет/нет цвета) в свойстве Objects), и в соответствии с этим рисовать прямоугольник нужного цвета, а не так, как ты привык - если что-то изменялось для какой-то клетки, то только она и будет перерисована. Не будет.
0
 Аватар для lifeforce
266 / 211 / 89
Регистрация: 27.09.2010
Сообщений: 1,234
09.12.2015, 20:10
я пользую такой метод
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
void __fastcall TForm_List_Rajon::StringGrid_ZajawkiDrawCell(TObject *Sender,
      int ACol, int ARow, TRect &Rect, TGridDrawState State)
{
          //Для удобства
TCanvas *a = this->StringGrid_Zajawki->Canvas;
//Далее необходимо установить стандартные цвета, те что у тебя будут, если условие не выполняется
//цвет как у тебя стоял если бы значение ячейки было бы равно пустому месту.
 //this->StringGrid1->Canvas->Brush->Color = clWindow; //
a->Brush->Color = clCream;
//теперь, у нас ячейки бывают трех видов
//1. Фиксированная - это когда стоит свойство fixed gdFixed
//2. Выделенная - когда выделяешь gdSelected
//3. и "Сфокусированная" - это на которой у тебя стоит курсор gdFocused
//за это состояние отвечает переменная State
//------------------------------------------------------------------------------
//теперь ставим цвет для фиксированной ячейки
if (State.Contains(gdFixed)) a->Brush->Color = clBtnFace;   // clMoneyGreen;
//------------------------------------------------------------------------------
//Так как у нас простое условие, т.е. либо есть текст, или нет текста, тогда будет так
//У меня .ToInt() стоит, ты можешь твой тип поставить например ToDouble.
try
{                     
// закрасить первую ячейку адреса лимоно-зеленым цветом 0>30 min
   if ((!State.Contains(gdFixed))&&//чтоб не закрашивалась фиксированая колонка
 
   (StrToInt(this->StringGrid_List->Cells[25][ARow])>=0)       //здесь любые 
   &&(StrToInt(this->StringGrid_List->Cells[25][ARow])<=30) // условия
   &&(ACol == 3)// здесь номер колонки которую хочешь закрасить
      )
   a->Brush->Color = clLime;// цвет закраски
 
 //  
}
catch(...)
{
 //try Нужен для того что бы если вдруг в твоей ячейки текст окажется, тогда он ее красить не будет
}
//------------------------------------------------------------------------------
//Все, мы установили условия расскраски, теперь закрашиваем
a->FillRect(Rect);
//------------------------------------------------------------------------------
//тут дополнил еще что бы выделение работало
//будет ячейку рамкой обводить
//TColor cwet = clGradientActiveCaption;
if (State.Contains(gdSelected))
{
    a->Pen->Color = clBlue;
    a->Brush->Color = cwet;        // Lime   Yellow   Teal
    a->Rectangle(Rect);
}
//------------------------------------------------------------------------------
//Далее, так как DefaultDrawing = False; необходимо еще и текст напечатать.
//можно стандартным TextRect
//a->TextRect(Rect,Rect.left,Rect.top,this->StringGrid1->Cells[ACol][ARow]);
//но мне нравится больше DrawText - описание есть в справке, в нем расположенние
//текста можно устанавливать и многое другое.
//TRect - делает смещение.
 
TRect r = Rect;
r.left +=2;
r.top  +=2;
DrawText(a->Handle,this->StringGrid_Zajawki->Cells[ACol][ARow].c_str(),-1,(TRect*)&r,DT_LEFT);
//
}
Миниатюры
Не могу изменить цвет ячейки StringGrid (Builder 6)  
1
 Аватар для Сергей 190
365 / 348 / 74
Регистрация: 18.03.2015
Сообщений: 1,293
11.12.2015, 11:38  [ТС]
lifeforce, Написал вот так.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,
      int ARow, TRect &Rect, TGridDrawState State){
 
TCanvas *a = this->StringGrid1->Canvas;
a->Brush->Color = clCream;
//------------------------------------------------------------------------------
try
{                     
   if ((!State.Contains(gdFixed))&&        //чтоб не закрашивалась фиксированая колонка
   (StrToInt(this->StringGrid1->Cells[2][ARow])==0) // условие  для закраски
   &&(ARow == Nomer_str)   // номер строки для закраски
      )
   a->Brush->Color = clLime;// цвет закраски
}
 
catch(...)
{
//try Нужен для того если в ячейке окажется текст, тогда он ее красить не будет
}
//------------------------------------------------------------------------------
a->FillRect(Rect);  // закрашиваем
//------------------------------------------------------------------------------
a->TextRect(Rect,Rect.left,Rect.top,this->StringGrid1->Cells[ACol][ARow]);
 
}
Все равно красится только последняя строка, которая должна закрашиваться.

TextRect или DrawText – результат одинаковый.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33378 / 21502 / 8236
Регистрация: 22.10.2011
Сообщений: 36,899
Записей в блоге: 11
11.12.2015, 11:57
Ну ты издеваешься, или что?
Цитата Сообщение от Сергей 190 Посмотреть сообщение
&&(ARow == Nomer_str)
убивает весь смысл обработчика. У тебя и отработает закраска только там, где текущий ряд = Nomer_str. Говорю же: этот код вызывается для ВСЕХ ячеек. Все, что не удовлетворяет условию в данный конкретный момент времени (не раньше и сейчас, а ТОЛЬКО сейчас) - не красится. Вот и имеешь то, что имеешь. либо храни номера строк в массиве и при окраске проверяй, есть ли в массиве номер текущей строки, либо, как я говорил, если ячейку Cells[a][b] нужно покрасить - то Objects[a][b] выставляй в 1, если не нужно красить - выставляй в 0, и проверяй это значение в OnDrawCell
1
 Аватар для lifeforce
266 / 211 / 89
Регистрация: 27.09.2010
Сообщений: 1,234
11.12.2015, 20:42
Сергей 190,
ну вот зачем было кастрировать предложенный код??
Цитата Сообщение от Сергей 190 Посмотреть сообщение
&&(ARow == Nomer_str) // номер строки для закраски
это выражение всегда будет закрашивать сгенерированый номер строки - а тебе надо закрасить только определенную колонку в определенной строке!
это было правильно подмечено от volvo "Ну ты издеваешься, или что?"

вот рабочий код и постарайся его не кастрировать

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "frxClass"
#pragma link "frxDesgn"
#pragma link "frxPreview"
#pragma link "RpDefine"
#pragma link "RpRave"
#pragma link "RpRender"
#pragma link "RpRenderCanvas"
#pragma link "RpRenderPreview"
#pragma link "RpRenderPrinter"
#pragma link "frxCtrls"
#pragma link "frxCross"
#pragma link "frxExportDOCX"
#pragma resource "*.dfm"
TForm1 *Form1;
//TfrxMasterData * Band1;
//TfrxMasterData * Band2;
  int   Nomer_str = 2;
 TColor cwet = clGradientActiveCaption;// цвет курсора в списке
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
 StringGrid1->Cells[5][2]="Закрасить";// выбираем примерно какую строку и колонку хочешь закрасить.
}
//---------------------------------------------------------------------------
 
 
void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol, int ARow,
      TRect &Rect, TGridDrawState State)
{
 
TCanvas *a = this->StringGrid1->Canvas;
a->Brush->Color = clCream;
 
if (State.Contains(gdFixed)) a->Brush->Color = clBtnFace;   // clMoneyGreen;
//------------------------------------------------------------------------------
 
try
{                     
   if ((!State.Contains(gdFixed))&&//чтоб не закрашивалась фиксированая колонка
 //здесь проверяет на меку для закраски в колонке 5 и закрашиваем колонку 3
   (this->StringGrid1->Cells[5][ARow]=="Закрасить")       
   //&&(this->StringGrid1->Cells[25][ARow]=="") // условия
   &&(ACol == 3)// здесь номер колонки которую хочешь закрасить
      )
   a->Brush->Color = clLime;// цвет закраски
 
 //  
}
catch(...)
{
 //try Нужен для того что бы если вдруг в твоей ячейки текст окажется, тогда он ее красить не будет
}
//------------------------------------------------------------------------------
a->FillRect(Rect);
if (State.Contains(gdSelected))
{
    a->Pen->Color = clBlue;
    a->Brush->Color = cwet;        // Lime   Yellow   Teal
    a->Rectangle(Rect);
}
 
TRect r = Rect;
r.left +=2;
r.top  +=2;
DrawText(a->Handle,this->StringGrid1->Cells[ACol][ARow].c_str(),-1,(TRect*)&r,DT_LEFT);
//  
}
//---------------------------------------------------------------------------
Миниатюры
Не могу изменить цвет ячейки StringGrid (Builder 6)  
1
 Аватар для lifeforce
266 / 211 / 89
Регистрация: 27.09.2010
Сообщений: 1,234
11.12.2015, 23:43
C++
1
2
3
4
5
6
7
8
9
10
11
12
#pragma link "frxClass" 
#pragma link "frxDesgn" 
#pragma link "frxPreview" 
#pragma link "RpDefine" 
#pragma link "RpRave" 
#pragma link "RpRender" 
#pragma link "RpRenderCanvas" 
#pragma link "RpRenderPreview" 
#pragma link "RpRenderPrinter" 
#pragma link "frxCtrls" 
#pragma link "frxCross" 
#pragma link "frxExportDOCX"[/quote]
эти строки надо стереть - они из другого проекта.
0
 Аватар для lifeforce
266 / 211 / 89
Регистрация: 27.09.2010
Сообщений: 1,234
11.12.2015, 23:51
ну а если целую строку то за комментируй
C++
1
//&&(ACol == 3)// здесь номер колонки которую хочешь закрасить
Миниатюры
Не могу изменить цвет ячейки StringGrid (Builder 6)  
0
 Аватар для Сергей 190
365 / 348 / 74
Регистрация: 18.03.2015
Сообщений: 1,293
13.12.2015, 11:19  [ТС]
Заработало!
Всем спасибо!!
Допишу программу - с меня фрезерные работы)))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.12.2015, 11:19
Помогаю со студенческими работами здесь

Цвет ячейки StringGrid
здравствуйте. помогите закрасить 1 ячейку в StringGrid так чтобы информация в из ячейки осталась видна заранее спасибо

Цвет краёв ячейки в StringGrid
Можно ли в StringGrid изменить цвет краёв(границ) какой либо ячейки, не закрашивая саму ячейку? Ну или хотя бы изменить толщину границ...

StringGrid: цвет бордюра ячейки
Добрый день, уважаемые. Подскажите пожалуйста можно ли изменять цвет бордюра заданных ячеек stringgrid? Если можно, то как? ...

Окрасить некоторые ячейки StringGrid-а в другой цвет
Как в stringgrid-е окрасить НЕКОТОРЫЕ (не все) ячейки в какой-нибудь цвет(например серый)?

Как поменять цвет ячейки StringGrid и обратно?
у меня такая проблема,мне надо сделать так,чтобы при нажатии в начале на 1 ячейку stringgrid она выделялась каким-нибудь цветом ,а при...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru