Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.89/35: Рейтинг темы: голосов - 35, средняя оценка - 4.89
21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 663

Подсветка TStringGrid по набору условий

07.01.2015, 17:00. Показов 7263. Ответов 47
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер! Вопрос про StringGrid.
Есть StringGrid, есть информация, которая по тому или иному событию записывается в строку этого StringGrid.
События разные (скажем 4 вида) Вообщем то одно из этих событий реализовано. Но хотелось бы при этом событие окрашивать всю строку в нужный цвет(красный например). А лучше, чтобы плюс например еще рамка была. Но не критично.
Добился окрашивания только одной ячейки.
Обработчик DrawCell

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol, int ARow,
          TRect &Rect, TGridDrawState State)
{
     AnsiString Strr;
             Strr= StringGrid1->Cells[ACol][ARow];
         if(Form1->ALARM_Red)
    {
        if(
         ((strstr(Strr.c_str(), "ALARM" ))!=0)||
         ((strstr(Strr.c_str(), "ТРЕВ"))!=0)
        )
        {
                  Strr= StringGrid1->Cells[ACol][ARow];
                  StringGrid1->Canvas->Brush->Color = clCream   ;// clWhite;
                  StringGrid1->Canvas->Font->Color  = clRed;// clBlack;
 
              StringGrid1->Canvas->FillRect(Rect);
              StringGrid1->Canvas->TextRect(Rect, Rect.Left + 2, Rect.Top + 2, Strr);
        }
    }
}
Возможно ли решение этой проблемы? Спасибо!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.01.2015, 17:00
Ответы с готовыми решениями:

Открытие картинки по набору условий из StringGrid
Добрый день! Есть код:AnsiString Strr,Strr1; Strr= StringGrid1->Cells; Strr1= StringGrid1->Cells; if( ((strstr(Strr.c_str(),...

Удаление строк по набору условий
Доброго дня.... Как с помощью VBA удалить строки из таблицы XLS по условию: (столбец А = 10 и столбец B = 20 и столбец W = 30) ...

Существуют ли множества, удовлетворяющие набору условий? 2
1.2Существуют множества А В Х такие что выполняется набор условий ? P\N=N∩P=∅ P∩E≠∅

47
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,896
Записей в блоге: 11
07.01.2015, 17:33
Лучший ответ Сообщение было отмечено Samrisbe как решение

Решение

Я бы для этого воспользовался свойством Objects у StringGrid-а. То есть, окрашивать строку не по ALARM_Red, а проверять содержимое строки при ее записи в грид, и назначать в Objects с нужным индексом, например, необходимый цвет, и потом давать команду на перерисовку грида:
C++
1
2
3
4
5
void __fastcall TForm1::Button8Click(TObject *Sender)
{
    StringGrid1->Objects[0][2] = (TObject*)clRed; // 2-я строка будет с красным шрифтом
    StringGrid1->Invalidate(); // перерисовать грид
}
, а в обработчике DrawCell просто проверять Objects для соответствующей строки и закрашивать ее полностью:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect,
          TGridDrawState State)
{
    TStringGrid *grid = static_cast<TStringGrid*>(Sender);
    String s = grid->Cells[ACol][ARow];
 
    if(grid->Objects[0][ARow]) // проверяем для нулевой ячейки текущей строки
    {
        TColor color = reinterpret_cast<TColor>(grid->Objects[0][ARow]);
        grid->Canvas->Brush->Color = clCream; // clWhite;
        grid->Canvas->Font->Color  = color; // clBlack;
 
        grid->Canvas->FillRect(Rect);
        grid->Canvas->TextRect(Rect, Rect.Left + 2, Rect.Top + 2, s);
    }
}
2
21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 663
07.01.2015, 19:04  [ТС]
А если в этот грид падают разные события в реальном времени с неизвестной вероятностью? Вообще стоит две задачи - первая - раскрасить строки событий в разные цвета желательно с рамкой. Цвета в зависимости от событий. Это для лучшей читабельности. И вторая задача - иметь этот грид со всеми событиями и отдельно для каждого события свой грид. То есть , если три события - например аларм, трабл и сработка программируемых аутов - что бы было четыре грида. В одном все, второй - только алармы, третий - только траблы и четвертый ауты. Вторую задачу необязательно - сам наверное добью, не факт конечно). Но вот с раскрасками чегото не получается. Огромное спасибо за код - щас буду пробовать приделывать к своему.

Добавлено через 1 час 10 минут
По коду, тот, что последний - прикрутил к себе - все как по нотам) На вторую строку фон поставил красный. Ка бы еще рамку сделать на всю строку. Но вторая строка - это немного не то. Красное событие может появиться в любой строке и не один раз. Но, конечно , наводка очень хорошая. Спасибо!
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,896
Записей в блоге: 11
07.01.2015, 19:31
Sergey_03, я же написал: при попытке занесения нового значения в грид, анализировать это значение, и если оно совпадает с какими-то признаками (ALARM, или ТРЕВ содержится в строке, я не знаю, что там у тебя за условия), то смотреть, в какую строку занесено это значение, и для той строки выставлять Objects[0][номер_строки] в нужный цвет. Подобным образом можно хоть каждую строку в свой цвет красить, это давно испытанный и прекрасно работающий метод.

Кстати, зачем понадобилось проверять наличие текста в строке через strstr?
C++
1
    if(s.Pos(L"ALARM") + s.Pos(L"ТРЕВ"))
уже не достаточно?
1
21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 663
07.01.2015, 19:46  [ТС]
Да,да, конечно, понял, не догнал.Спасибо! А два свойства менять можно таким образом? Например цвет фона и цвет шрифта? Или цвет фона и рамка?

Добавлено через 9 минут
По поводу проверок - изначально это писалось вообще под другой интерфейс. Было табло, 16 на 2 символов и куча заморочек. Много лишнего все надо чистить.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,896
Записей в блоге: 11
07.01.2015, 20:07
Цитата Сообщение от Sergey_03 Посмотреть сообщение
А два свойства менять можно таким образом?
Легко. Например, в StringGrid1->Objects[0][строка] заносить цвет фона, а в StringGrid1->Objects[1][строка] - цвет шрифта.
1
21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 663
07.01.2015, 20:34  [ТС]
Да, все получаетя! Последний вопрос. На сегодня.

при попытке занесения нового значения в грид, анализировать это значение, и если оно совпадает с какими-то признаками (ALARM, или ТРЕВ содержится в строке, я не знаю, что там у тебя за условия), то смотреть, в какую строку занесено это значение, и для той строки выставлять Objects[0][номер_строки] в нужный цвет.

как это реализовать в моих условиях? голова не варит. гуглю - все не то..(
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
07.01.2015, 20:46
В обработчике OnSetEditText смотришь на Value и принимаешь решение. Координаты ячейки там тоже передаются, естественно.
1
21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 663
07.01.2015, 20:54  [ТС]
Если можно, пару строк кода(или шаблон)
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
07.01.2015, 21:06
Вот, пару строк.
C++
1
2
3
4
5
if( Value.Pos( "ALARM" ) )
{    
    StringGrid1->Objects[0][ARow] = (TObject*)clRed;     
}
StringGrid1->Invalidate();
2
21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 663
07.01.2015, 21:20  [ТС]
ругается на Value
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
07.01.2015, 22:36
В обработчике OnSetEditText ругается на Value? Не-воз-мож-но.
1
21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 663
07.01.2015, 23:02  [ТС]
буду разбираться. чего то не то написал видимо. воткнул это в StringGrid1Click.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,896
Записей в блоге: 11
08.01.2015, 00:40
Цитата Сообщение от BRcr Посмотреть сообщение
В обработчике OnSetEditText смотришь на Value
, и если значение в ячейку заносится не вручную, а программно - сидишь и тупишь, почему ничего не происходит

Это событие работает только тогда, когда пользователь вносит строку вручную...
1
21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 663
09.01.2015, 10:06  [ТС]
Доброе утро. Решил этот вопрос!
Кому интересно
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
void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol, int ARow,
          TRect &Rect, TGridDrawState State)
{
    TStringGrid *grid = static_cast<TStringGrid*>(Sender);
    String s = grid->Cells[ACol][ARow];
    if(grid->Objects[0][ARow])
        {
            TColor color0 = reinterpret_cast<TColor>(grid->Objects[0][ARow]);
            grid->Canvas->Brush->Color = color0; // clWhite;
            //grid->Canvas->Font->Color  = clBlack; // clBlack;
            grid->Canvas->FillRect(Rect);
            grid->Canvas->TextRect(Rect, Rect.Left + 2, Rect.Top + 2, s);
        }
    if(grid->Objects[1][ARow])
        {
            TColor color1 = reinterpret_cast<TColor>(grid->Objects[1][ARow]);
            //grid->Canvas->Brush->Color = clWhite; // clWhite;
            grid->Canvas->Font->Color  = color1; // clBlack;
            grid->Canvas->FillRect(Rect);
            grid->Canvas->TextRect(Rect, Rect.Left + 2, Rect.Top + 2, s);
        }
    AnsiString Strr;
    Strr= StringGrid1->Cells[ACol][ARow];
    if(((strstr(Strr.c_str(), "ALARM" ))!=0)||((strstr(Strr.c_str(), "ТРЕВ"))!=0))
        {
            StringGrid1->Objects[0][ARow] = (TObject*)clRed;
            StringGrid1->Objects[1][ARow] = (TObject*)clWhite;
            StringGrid1->Invalidate();
        }
    if(((strstr(Strr.c_str(),"BATTERY" ))!=0))
        {
            StringGrid1->Objects[0][ARow] = (TObject*)clBlue;
            StringGrid1->Objects[1][ARow] = (TObject*)clWhite;
            StringGrid1->Invalidate();
        }
 }
Спасибо!

Добавлено через 1 час 29 минут
Еще пара вопросов есть.
Как скопировать строку из одного грид в другой. Допустим, мне нужно, чтобы в StringGrid2 отображались строки только с алармом из StringGrid1
и еще, можно ли сделать, чтобы этот StringGrid2 появлялся при нажатии на кнопку.
Спасибо!
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,896
Записей в блоге: 11
09.01.2015, 14:22
Цитата Сообщение от Sergey_03 Посмотреть сообщение
Допустим, мне нужно, чтобы в StringGrid2 отображались строки только с алармом из StringGrid1
Проходить по всем Rows первого грида, проверять есть ли там нужное слово (или слова), и переносить соответствующие строки во второй грид:
C++
1
2
3
4
5
6
7
8
9
10
11
12
void __fastcall TForm1::Button12Click(TObject *Sender)
{
    int j = StringGrid2->FixedRows;
    for(int i = StringGrid1->FixedRows; i < StringGrid1->RowCount; i++)
    {
        if(StringGrid1->Rows[i]->Text.Pos("ALARM"))
        {
            StringGrid2->Rows[j++]->CommaText = StringGrid1->Rows[i]->CommaText;
        }
    }
    StringGrid2->RowCount = j;
}
Разумеется, надо позаботиться о том, чтобы количество столбцов в обоих гридах было одинаковым.
Цитата Сообщение от Sergey_03 Посмотреть сообщение
можно ли сделать, чтобы этот StringGrid2 появлялся при нажатии на кнопку
Ну, либо сделать его невидимым, и при нажатии показывать, либо создавать динамически:
C++
1
2
3
TStringGrid *grid2 = new TStringGrid(this);
grid2->Parent = this;
// и так далее, примеров на форуме предостаточно
1
21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 663
09.01.2015, 17:12  [ТС]
Спасибо, все получилось!.
Еще один вопрос.
Ставлю один грид на другой (по размерам и месту (координатам на экране)одинаковые). У них есть что то типа index как в CSS?
C++
1
2
3
4
5
6
7
8
9
10
11
12
void __fastcall TForm1::Button5Click(TObject *Sender)
{
StringGrid1->Visible=true;
StringGrid1->Left=Form26->ClientWidth/2-StringGrid1->Width/2;
StringGrid1->Top=Form26->ClientHeight/2-StringGrid1->Height/2;
}
void __fastcall TForm1::Button6Click(TObject *Sender)
{
StringGrid2->Visible=true;
StringGrid2->Left=Form1->ClientWidth/2-StringGrid2->Width/2;
StringGrid2->Top=Form1->ClientHeight/2-StringGrid2->Height/2;
}
То есть при нажатии на кнопку5 (в моем случае) грид1 вставал по верх грид2(был виден) и на оборот,
при нажатии на кнопку6 грид2 вставал по верх грид1(был виден).
Собственно этот вопрос касается и кнопок, меняющих свой вид. Например имитация мигания индикатора кнопки.
Спасибо!
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,896
Записей в блоге: 11
09.01.2015, 17:23
Для этого у VCL-контролов есть BringToFront и SendToBack
1
21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 663
09.01.2015, 21:58  [ТС]
Для этого у VCL-контролов есть BringToFront и SendToBack
Сделал так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
void __fastcall TForm1::Button1Click(TObject *Sender)
{
StringGrid1->Visible=true;
StringGrid1->BringToFront();
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button2Click(TObject *Sender)
{
StringGrid2->Visible=true;
StringGrid2->BringToFront();
}
Спасибо, работает, но боюсь, что это не совсем подходит - начинаются проблемы с отображением событий видимо из-за
BringToFront не делает элемент управления элементом верхнего уровня и не вызывает событие Paint.
Добавлено через 1 час 21 минуту
Нет. Похоже не из-за этого. Это из-за перерисовки грида и копирования в другой грид не срабатывает мигание картинки по таймеру.
0
21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 663
11.01.2015, 08:51  [ТС]
Спасибо за COM!
Возвращаясь к проблемам по поводу гридов....
Если можно, объясните - при позиции грида1 на заднем плане и грида2 на переднем (то есть грид1 не виден, он за гридом2 )из грида1 в грид2 не копируется строка ALARM. Если переключиться на грид1, а потом опять на грид2 или грид1 поместить в зону видимости (сдвинуть в угол например, чтоб он был виден на экране), то все нормально..я его и так и сяк - никак..

Добавлено через 13 часов 19 минут
И еще, есть для грида прозрачность? Спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.01.2015, 08:51
Помогаю со студенческими работами здесь

почему на виндоус икспи на нетбуке асер д255е экран тусклый(подсветка),а на виндоус 7 подсветка замечательная(очень яркая)
почему на виндоус икспи на нетбуке асер д255е экран тусклый(подсветка),а на виндоус 7 подсветка замечательная(очень яркая),что мне сделать...

Подсветка строк содержащих одинаковые значения полей или подсветка полей с одинаковым значением в таблице
Подскажите, возможна ли реализация в форме такой функции: При наведении курсора на поле высвечиваются по всей таблице поля имеющие такое же...

"Мало начальных условий" при решении системы из 7 ДУ, хотя граничных условий 8
Имеется такая система, http://regfoto.ru/images/172Mathcad_2_.jpg маткад пишет что граничных условий недостаточно, хотя их там с...

Отчет по набору прав
Кто знает можно ли как-то вывести в отчет в цикле наборы прав так как они заданы в конфигураторе, тоесть: 1-Набор прав 2----Объект ...

Сплайн по набору точек
Здравствуйте Дан набор точек (пара значение + время), требуется прибить как можно большее их кол-во заменив сплайном на выбор -...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru