Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.99/96: Рейтинг темы: голосов - 96, средняя оценка - 4.99
 Аватар для Neo_AVE
89 / 36 / 5
Регистрация: 04.05.2011
Сообщений: 239

Закрашивание ячеек в StringGrid

06.05.2011, 17:23. Показов 18833. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В событии BottonOnClick -вычисление ячеек двумерной матрицы, но мне нужно еще и закрасить ячейки в зависимости от результата. У меня вышло два события, но не работают так как нужно. Подскажите, что делать.
Код:
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
int i,j,a11,b11;
double a1,b1,sum1,sum2,sum3,sum,dh;
double matr;
void __fastcall TFrmVpl::Btn21Click(TObject *Sender)
{
     FrmVpl->PgCont1->Pages[2]->Show();
     StGr2->FixedCols=0;
     StGr2->FixedRows=0;
     StGr2->ColCount=a11;       //задаем размер по ширине
     StGr2->RowCount=b11;       //задаем размер по длине
     for(i=0;i<FrmVpl->StGr1->ColCount-1;i++){    //столбец
       for(j=0;j<FrmVpl->StGr1->RowCount-1;j++){    //строка
         sum1=StrToFloat(StGr1->Cells[i][j])+
                StrToFloat(StGr1->Cells[i][j+1]);
         sum2=StrToFloat(StGr1->Cells[i+1][j])+
                StrToFloat(StGr1->Cells[i+1][j+1]);
         sum3=(sum1+sum2)/4;    //средняя отметка каждой ячейки
         matr+=StrToFloat(StGr1->Cells[i][j]);  //сложение каждой ячейки
         sum=matr/((a11+1)*(b11+1));    //общая средняя отметка
         dh=sum-sum3;   //средняя отметка ячейки
         //if(dh>0){
 
         //}
         FrmVpl->StGr2->Cells[i][j]=dh;
 
       }}
}
//---------------------------------------------------------------------------
 
 
 
void __fastcall TFrmVpl::StGr2DrawCell(TObject *Sender, int ACol, int ARow,
      TRect &Rect, TGridDrawState State)
{
     if(Btn21->OnClick){
        FrmVpl->StGr2->Cells[i][j]=dh;
        if(dh>0){
             FrmVpl->StGr2->Canvas->Brush->Color=clRed;
             FrmVpl->StGr2->Canvas->Font->Color=clBlack;
        }
        else if(dh>0) {
             FrmVpl->StGr2->Canvas->Brush->Color=clGreen;
             FrmVpl->StGr2->Canvas->Font->Color=clBlack;
        }
        else {
             FrmVpl->StGr2->Canvas->Brush->Color=clRed;
             FrmVpl->StGr2->Canvas->Font->Color=clYellow;
        }
     }
}
Да еще вопрос, неправильно программа считает сумму всех ячеек.

Добавлено через 5 часов 2 минуты
Ответьте, пожалуйста!!! Мне срочно надо!
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.05.2011, 17:23
Ответы с готовыми решениями:

StringGrid - закрашивание
Подсчитать количество локальных максимумов в массиве целых чисел. Локальный максимум — такой элемент массива, который больше своих соседей....

Неверно работает закрашивание ячеек
int max2 = NewGird-&gt;RowCount; for (int ii = 1; ii &lt; 3; ii++) { for (int jj = 1; jj &lt; max2; jj++) { if (NewGird-&gt;Cells== &quot;&quot;) ...

Закрашивание строки в Stringgrid
Задача такова: считать с базы данные, проверить все данные столбца &quot;Легенда&quot;, если true, то зарисовать всю строку желтым, если нет, то...

13
 Аватар для Neo_AVE
89 / 36 / 5
Регистрация: 04.05.2011
Сообщений: 239
10.05.2011, 17:10  [ТС]
Пожалуйста, дайте хоть идею или что-то вроде этого. Пишу диплом
1
 Аватар для Neo_AVE
89 / 36 / 5
Регистрация: 04.05.2011
Сообщений: 239
12.05.2011, 22:51  [ТС]
Посмотрите, пожалуйста, у меня значения правильно выводятся, но почему-то закрашиваются зеленым цветом, не выполняется условие.
Код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
StGr2->DefaultDrawing=false;
        AnsiString S=StGr2->Cells[i][j];
        if(S>0){
             StGr2->Brush->Color=clRed;
             FrmVpl->StGr2->Canvas->Font->Color=clRed;
             StGr2->Canvas->FillRect(Rect);
             StGr2->Canvas->TextOut(Rect.Left,Rect.Top,StGr2->Cells[ACol][ARow]);
        }
        else if(S<0) {
             StGr2->Brush->Color=clGreen;
             FrmVpl->StGr2->Canvas->Font->Color=clGreen;
             StGr2->Canvas->FillRect(Rect);
             StGr2->Canvas->TextOut(Rect.Left,Rect.Top,StGr2->Cells[ACol][ARow]);
        }
        else {
             StGr2->Brush->Color=clBlue;
             FrmVpl->StGr2->Canvas->Font->Color=clBlue;
             StGr2->Canvas->FillRect(Rect);
             StGr2->Canvas->TextOut(Rect.Left,Rect.Top,StGr2->Cells[ACol][ARow]);
        }
1
 Аватар для Neo_AVE
89 / 36 / 5
Регистрация: 04.05.2011
Сообщений: 239
14.05.2011, 08:00  [ТС]
Что ж мне не поможете? Я страдаю
0
 Аватар для pomkalk
365 / 247 / 24
Регистрация: 03.04.2011
Сообщений: 558
Записей в блоге: 1
14.05.2011, 09:43
))Скажи мне что у тебя должна закрашивать таблица?
1
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
14.05.2011, 11:25
Цитата Сообщение от pomkalk Посмотреть сообщение
))Скажи мне что у тебя должна закрашивать таблица?
если в ячейке S>0 - красим ячейку красным , если в ячейке S<0 - красим ячейку зеленым, я так понял .... почти как у тебя.
1
 Аватар для pomkalk
365 / 247 / 24
Регистрация: 03.04.2011
Сообщений: 558
Записей в блоге: 1
14.05.2011, 12:05
Лучший ответ Сообщение было отмечено как решение

Решение

Ща заметим.
Кидай на форму StringGrid и ставь свойство
DefaultDrawing = False; - тут мы берем на себя рисование ячеек
DoubleBuffered = True; - а здесь делаем двойной буфер, что сначала все отрисовывалось в нем, потом только на форме.
далее больше ни чего не меняй, пусть там так же останутся фиксированные ячейки(что просто как пример, потом переделаешь как тебе нужно будет)
и в обработчике OnDrawCell скинь этот код
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
void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect,
          TGridDrawState State)
{
//Для удобства
TCanvas *a = this->StringGrid1->Canvas;
//Далле необходимо установить стандартные цвета, те что у тебя будут, если условие не выполняется
//цвет как у тебя стоял если бы значение ячейки было бы равно нулю.
a->Brush->Color = clBlue;
//теперь, у нас ячейки бывают трех видов
//1. Фиксированная - это когда стоит свойство fixed gdFixed
//2. Выделенная - когда выделяешь gdSelected
//3. и "Сфокусированная" - это на которой у тебя стоит курсор gdFocused
//за это состояние отвечает переменная State
 
//теперь ставим цвет для фиксированной ячейки
if (State.Contains(gdFixed)) a->Brush->Color = clMoneyGreen;
 
//Так как у нас простое условие, т.е. либо больше нуля, либо меньше тогда будет так
//У меня .ToInt() стоит, ты можешь твой тип поставить например ToDouble.
try
{
    if ((!State.Contains(gdFixed))&&(this->StringGrid1->Cells[ACol][ARow].ToInt()>0)) a->Brush->Color = clRed;
    if ((!State.Contains(gdFixed))&&(this->StringGrid1->Cells[ACol][ARow].ToInt()<0)) a->Brush->Color = clGreen;
}catch(...)
{
    //try Нужен для того что бы если вдруг в твоей яцейки текст окажется, тогда он ее красить не будет
}
 
 
//Все, мы установили устовия расскраски, теперь закрациваем
a->FillRect(Rect);
 
//тут дополнил еще что бы выделение работало
//будет ячейку рамной обводить
if (State.Contains(gdSelected))
{
    a->Pen->Color = clLime;
    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->StringGrid1->Cells[ACol][ARow].t_str(),-1,(TRect*)&r,DT_CENTER);
 
 
}
соответственно я предварительно заполнил таблице в конструкторе
C++
1
2
3
4
5
6
7
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
for (int i=0;i<this->StringGrid1->ColCount;i++)
    for (int j=0;j<this->StringGrid1->RowCount;j++)
        this->StringGrid1->Cells[i][j] = (UnicodeString)Random(100)-50;
}
и мне кажется твоя ошибка была в том что ты не переводил тип к числовому.
8
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
14.05.2011, 12:10
осталось дождаться Neo_AVE ...
0
 Аватар для pomkalk
365 / 247 / 24
Регистрация: 03.04.2011
Сообщений: 558
Записей в блоге: 1
14.05.2011, 12:12
Это я как пример делал, у меня не нужные ячейки при выделение выделял полу прозрачным цветом, теперь сам разукрашиваю все полностью.
2
 Аватар для Neo_AVE
89 / 36 / 5
Регистрация: 04.05.2011
Сообщений: 239
14.05.2011, 19:41  [ТС]
pomkalk, у меня должен текст закрашиваться, а не ячейки сами. А текст закрашивается, но зеленым цветом везде. Посмотрела, проверила Ваш код, ошибка на строчке
Цитата Сообщение от pomkalk Посмотреть сообщение
DrawText(a->Handle,this->StringGrid1->Cells[ACol][ARow].t_str(),-1,(TRect*)&r,DT_CENTER)
't_str' is not a member of 'AnsiString'
1
 Аватар для pomkalk
365 / 247 / 24
Регистрация: 03.04.2011
Сообщений: 558
Записей в блоге: 1
14.05.2011, 19:56
Тоже самое, только a->Canvas->Font->Color = clRed; и так далее, вместо цветов ячеек.
А ошибка там потому что у меня Builder 2010 стоит, и тут у меня не AnsiString а UnicodeString - То есть тебе в свойствах нужно посмотреть что бы он возвращал тип char * в том месте где ошибка.

Добавлено через 2 минуты
Цитата Сообщение от pomkalk Посмотреть сообщение
//Далее, так как DefaultDrawing = False; необходимо еще и текст напечатать.
//можно стандартным TextRect
//a->TextRect(Rect,Rect.left,Rect.top,this->StringGrid1->Cells[ACol][ARow]);
//но мне нравится больше DrawText - описание есть в справке, в нем расположенние текста можно устанавливать и многое другое.
и тут же есть альтернатива вывода текста, комментарий просто убери, а DrawText закомментируй

Добавлено через 2 минуты
Вопросы будут, спрашивай!
2
 Аватар для Neo_AVE
89 / 36 / 5
Регистрация: 04.05.2011
Сообщений: 239
14.05.2011, 20:14  [ТС]
Спасибочки, респект Вам!!! Низкий поклон!!! Закрашиваются сами ячейки и выводится текст белым цветом
1
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
14.05.2011, 20:32
тут у меня не AnsiString а UnicodeString - То есть тебе в свойствах нужно посмотреть что бы он возвращал тип char * в том месте где ошибка.
c_str()
1
 Аватар для Neo_AVE
89 / 36 / 5
Регистрация: 04.05.2011
Сообщений: 239
14.05.2011, 20:41  [ТС]
LK, спасибо на заметку
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.05.2011, 20:41
Помогаю со студенческими работами здесь

Закрашивание ячейки StringGrid
Подскажите, пожалуйста, как закрасить ячейку при таком условии: Если a&gt;b, то ячейка закрашивается, иначе в лейбл записывается ошибка ...

Закрашивание ячейки StringGrid
Функция-обработчик закрашивания ячейки в черный цвет левой кнопкой мыши: void __fastcall gridDrawCell(TObject *Sender, int ACol, ...

Dbgrid закрашивание ячеек в различные цвета, в зависимости от содержимого
Имеются две таблицы dbgrid. В работе по ремонту оргтехники. Одна таблица сотрудники, другая ремонт. Не понимаю как можно реализовать такую...

Возможность вручную писать данные в ячейки StringGrid и заполнение ячеек StringGrid данными из файла после нажатия кнопки
Здравствуйте! Помогите, пожалуйста. Мне необходимо сделать следующее: реализовать возможность вручную писать данные в ячейки StringGrid...

Копирование ячеек в StringGrid
написал такой вот цикл, обрабатывает только первую строчку и все. :( for (i = 1; i &lt; 4 ; i++) for (j = 1; i &lt; 4; i++) ...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru