Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.80/46: Рейтинг темы: голосов - 46, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 23.07.2009
Сообщений: 10

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

26.07.2009, 22:11. Показов 8744. Ответов 34
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Функция-обработчик закрашивания ячейки в черный цвет левой кнопкой мыши:

C++
1
2
3
4
5
6
7
8
9
void __fastcall gridDrawCell(TObject *Sender, int ACol,
      int ARow, TRect &Rect, TGridDrawState State)
{
        TStringGrid *p=(TStringGrid *)Sender;
 
        p->Canvas->Brush->Color = clBlack;
        if (p->Cells[ACol][ARow] != ' ')
                p->Canvas->FillRect(Rect);
}
Как создать обработчик, который бы закрашивал в красный цвет при двойном щелчке мыши или правом нажатии?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.07.2009, 22:11
Ответы с готовыми решениями:

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

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

Закрашивание ячеек в StringGrid
В событии BottonOnClick -вычисление ячеек двумерной матрицы, но мне нужно еще и закрасить ячейки в зависимости от результата. У меня вышло...

34
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
27.07.2009, 09:39
Смотри, у тебя ячейка закрашивается в черный цвет если в ней есть что-нибудь.
Разве сложно переделать исходник так, что если там будет "1"-закрвшиваем в красный, "2"-зеленый, "3"-...
А в событии двойнойклик поместить в соответсвующую ячейку, например, "2", а при правой кнопке мыши - "4" итд...
1
0 / 0 / 0
Регистрация: 23.07.2009
Сообщений: 10
27.07.2009, 23:10  [ТС]
т.е. так? ставим в гриде 1,-1
C++
1
2
3
4
5
6
7
8
9
10
void __fastcall gridClick(TObject *Sender)
{
        TStringGrid *p=(TStringGrid *)Sender;
        if (p->Cells[p->Col][p->Row] == '1')
                p->Cells[p->Col][p->Row] = ' ';
         else if (p->Cells[p->Col][p->Row] == '0')
                p->Cells[p->Col][p->Row] = '-1';
        else
                p->Cells[p->Col][p->Row] = '1';
}
левой кнопкой:
C++
1
2
3
4
5
6
7
8
9
void __fastcall gridDrawCell_Black(TObject *Sender, int ACol,
      int ARow, TRect &Rect, TGridDrawState State)
{
        TStringGrid *p=(TStringGrid *)Sender;
 
        p->Canvas->Brush->Color = clBlack;
        if (p->Cells[ACol][ARow] != ' ')
                p->Canvas->FillRect(Rect);
}
но будет ли реагировать именно на правую кнопку? вот это интересует
C++
1
2
3
4
5
6
7
8
9
void __fastcall gridDrawCell_Red(TObject *Sender, int ACol,
      int ARow, TRect &Rect, TGridDrawState State)
{
        TStringGrid *p=(TStringGrid *)Sender;
 
        p->Canvas->Brush->Color = clRed;
        if (p->Cells[ACol][ARow] != '-1')
                p->Canvas->FillRect(Rect);
}
0
1090 / 588 / 121
Регистрация: 11.11.2008
Сообщений: 1,544
28.07.2009, 09:10
не вижу как gridDrawCell связан с левой кнопкой, по идее это просто свой обработчик закраски ячейки.
тогда, думаю, Otaka имел в виду:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void __fastcall gridDrawCell(TObject *Sender, int ACol,
      int ARow, TRect &Rect, TGridDrawState State)
{
        TStringGrid *p=(TStringGrid *)Sender;
 
        switch(p->Cells[ACol][ARow])
        {
        case '1':p->Canvas->Brush->Color = clRed;
        case '2':p->Canvas->Brush->Color = clGreen;
        case '3':p->Canvas->Brush->Color = clYellow;
        case '4':p->Canvas->Brush->Color = clBlack;
        default:break;
        }
       if (p->Cells[ACol][ARow] != ' ')p->Canvas->FillRect(Rect);
       p->Cells[ACol][ARow]='';
}
+ в событиях кликов и даблкликов надо прописать запись в ячейку соответствующих чисел.
2
0 / 0 / 0
Регистрация: 23.07.2009
Сообщений: 10
28.07.2009, 14:46  [ТС]
спасибо за ответы, еще вопрос , почему ошибка, в файлах .h, .cpp функция void __fastcall gridDblClick(TObject *Sender) объявлена , где еще надо прописать

[Linker Error] Unresolved external '__fastcall TFrm_Main::gridDblClick(System::TObject *)' referenced from C:\DOCUMENT\MAIN.OBJ
0
1090 / 588 / 121
Регистрация: 11.11.2008
Сообщений: 1,544
28.07.2009, 14:52
ручками объявлял? в какой секции?
описывал ее?
0
0 / 0 / 0
Регистрация: 23.07.2009
Сообщений: 10
28.07.2009, 15:01  [ТС]
да, объявлял в main.h, functions.h , описывал в functions.cpp, подключил functions.h к main.cpp
0
Любитель давать советы
 Аватар для Alexiski
342 / 135 / 14
Регистрация: 12.01.2009
Сообщений: 511
28.07.2009, 15:26
А functions.cpp в проект включен?

View->Project manager->Add..
1
0 / 0 / 0
Регистрация: 23.07.2009
Сообщений: 10
28.07.2009, 20:53  [ТС]
включен, нашел ошибку, надо было объявить в main.cpp
C++
1
2
3
4
void __fastcall TFrm_Main::gridDblClick(TObject *Sender)
{
        ::gridDblClick(Sender);
}
Добавлено через 5 часов 19 минут 34 секунды
Не могу понять, почему не работает gridDblClick

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void __fastcall gridDblClick(TObject *Sender)
{
        TStringGrid *p=(TStringGrid *)Sender;
        if (p->Cells[p->Col][p->Row] == '1')
                p->Cells[p->Col][p->Row] = ' ';
        else
                p->Cells[p->Col][p->Row] = '1';
}
 
void __fastcall gridDrawCell(TObject *Sender, int ACol,
      int ARow, TRect &Rect, TGridDrawState State)
{
        TStringGrid *p=(TStringGrid *)Sender;
 
        p->Canvas->Brush->Color = clRed;
        if (p->Cells[ACol][ARow] != ' ')
                p->Canvas->FillRect(Rect);
}
если поменять на gridClick то работает, но мне надо и двойной клик тоже
0
254 / 21 / 5
Регистрация: 30.10.2008
Сообщений: 68
17.11.2009, 15:24
C++
1
2
void __fastcall gridDrawCell(TObject *Sender, int ACol,
      int ARow, TRect &Rect, TGridDrawState State);
Подскажите, что передавать в Rect и State? Не могу понять как эта функция работает.
0
1090 / 588 / 121
Регистрация: 11.11.2008
Сообщений: 1,544
18.11.2009, 05:35
я вызывал закраску конкретной ячейки (coll, row) так:
Code
1
gridDrawCell(this,coll,row,grid->CellRect(coll,row),TGridDrawState() << gdFixed);
0
 Аватар для golandec
5 / 5 / 0
Регистрация: 03.06.2010
Сообщений: 77
04.06.2010, 17:14
AntonChik, а Вы не могли бы подробнее объяснить свой способ закраски определенной ячейки?
0
0 / 0 / 0
Регистрация: 07.04.2010
Сообщений: 3
08.06.2010, 11:37
Добрый день!

Кодом:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void __fastcall TFMain::FindDialog1Find(TObject *Sender)
{
        TStringList *FindLst = new TStringList;
        FindLst->Duplicates = dupIgnore;
 
        AnsiString lookat = AnsiLowerCase(FindDialog1->FindText);
 
        for (int i = 1; i < StringGrid1->RowCount; i++)
        {
              for (int j = 0; j < StringGrid1->ColCount; j++)
              {
               if (AnsiLowerCase(StringGrid1->Cells[j][i]).Pos(lookat))
               {
                FindLst->Add(StringGrid1->Rows[i]->CommaText);
               }
              }
        }
}
создаю список строк, содержащих в своих ячейках параметр, заданный в диалоге поиска.
Очень хотелось бы еще и подкрасить соответствующие ячейки, или даже строку, ячейки которой содержат заданный параметр поиска. Как?

Спасибо.
0
1090 / 588 / 121
Регистрация: 11.11.2008
Сообщений: 1,544
08.06.2010, 12:04
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
bool draw_it;
void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol, int ARow,
      TRect &Rect, TGridDrawState State)
{
if(!draw_it)return;
AnsiString s;
SG1->Canvas->Brush->Color=clRed; //закрасим красным например 
SG1->Canvas->FillRect(Rect);
s=SG1->Cells[ACol][ARow];
SG1->Canvas->Font->Color=clBlack; //текст черный
SG1->Canvas->TextOut(Rect.Left+2,Rect.Top+2,s);
return;
}
 
void TForm1::paint_cell(int coll,int roww)
{
draw_it=true;
StringGrid1DrawCell(this,coll,roww,SG1->CellRect(coll,roww),TGridDrawState() << gdFixed);
draw_it=false;
return;
}
теперь чтоб закрасить любую ячейку с координатами (coll,roww) красным цветом вызываем
C++
1
paint_cell(int coll,int roww);
3
 Аватар для V.V.P.Net
11 / 11 / 1
Регистрация: 14.04.2010
Сообщений: 73
05.08.2012, 08:29
Не могу разобраться постоянно ошибка
C++
1
[BCC32 Error] Unit1.cpp(761): E2316 'TForm1::paint_cell(int,int)' is not a member of 'TForm1'
Подскажите как исправить?
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
05.08.2012, 09:02
Попробуйте прописать в publiс заголовочного файла или перед
C++
1
2
3
TForm1::paint_cell(int,int) {
...
}
такое:
C++
1
paint_cell(int,int);
, или как там у вас функция называется
0
 Аватар для V.V.P.Net
11 / 11 / 1
Регистрация: 14.04.2010
Сообщений: 73
05.08.2012, 10:33
Во первых так и не понял, что вы имели ввиду,
до и поле пробовал publiс, не получается paint_cell(TObject *Sender, int coll,int roww);, void paint_cell(TObject *Sender, int coll,int roww);, void paint_cell( int coll,int roww);
Функция как в примере
paint_cell(int,int);
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
05.08.2012, 11:38
кто ж знает, как у вас правильно звучит это:
C++
1
TForm1::paint_cell(int,int)
, а от этого и надо делать прототип функции.
0
 Аватар для V.V.P.Net
11 / 11 / 1
Регистрация: 14.04.2010
Сообщений: 73
06.08.2012, 07:01
C++
1
2
3
4
5
6
7
void paint_cell(int coll,int roww)
{
draw_it=true;
Form1->StringGrid2DrawCell(this,coll,roww,Form1->StringGrid2->CellRect(coll,roww),TGridDrawState() << gdFixed);
draw_it=false;
return;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
void __fastcall TForm1::StringGrid2DrawCell(TObject *Sender, int ACol, int ARow,
      TRect &Rect, TGridDrawState State)
{
if(!draw_it)return;
AnsiString s;
StringGrid2->Canvas->Brush->Color=clRed; //закрасим красным например
StringGrid2->Canvas->FillRect(Rect);
s=StringGrid2->Cells[ACol][ARow];
StringGrid2->Canvas->Font->Color=clBlack; //текст черный
StringGrid2->Canvas->TextOut(Rect.Left+2,Rect.Top+2,s);
return;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
or (j = 1; j < i; j++) {
       ModFy[j] = StrToFloat(StringGrid2->Cells[0][j]);
       ModFx[j] = StrToFloat(StringGrid2->Cells[1][j]);
       if ((Chart2->BottomAxis->Minimum < ModFx[j]) && (Chart2->BottomAxis->Maximum > ModFx[j]) &&
       (Chart2->LeftAxis->Minimum < ModFy[j]) && (Chart2->LeftAxis->Maximum > ModFy[j]))
        {
        [B] paint_cell(1,j);[/B]
         ModFy1[k] = ModFy[j];
         ModFx1[k] = ModFx[j];
         k++;
        }
    }
C++
1
2
3
4
5
6
7
8
9
[BCC32 Error] Unit1.cpp(407): E2297 'this' can only be used within a member function
  Full parser context
    Unit1.cpp(405): parsing: void paint_cell(int,int)
[BCC32 Error] Unit1.cpp(407): E2357 Reference initialized with 'TRect', needs lvalue of type 'TRect'
  Full parser context
    Unit1.cpp(405): parsing: void paint_cell(int,int)
[BCC32 Error] Unit1.cpp(407): E2342 Type mismatch in parameter 'Rect' (wanted 'TRect &', got 'TRect')
  Full parser context
    Unit1.cpp(405): parsing: void paint_cell(int,int)
и так тоже

Добавлено через 2 часа 12 минут
Цитата Сообщение от LK Посмотреть сообщение
кто ж знает, как у вас правильно звучит это:
C++
1
TForm1::paint_cell(int,int)
, а от этого и надо делать прототип функции.
Что за прототип?

Добавлено через 16 часов 51 минуту
C++
1
[BCC32 Error] Unit1.cpp(416): E2316 '_fastcall TForm1::paint_cell(int,int)' is not a member of 'TForm1'
0
1090 / 588 / 121
Регистрация: 11.11.2008
Сообщений: 1,544
06.08.2012, 08:08
объяви функцию в классе формы, то бишь .h-файле пропиши
C++
1
2
public:
void paint_cell(int coll,int roww);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.08.2012, 08:08
Помогаю со студенческими работами здесь

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

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

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

Редактирование ячейки StringGrid
Значит нужно при нажатии button по ячейке стринггрида сделать возможность ее редактирование, тоесть менять данные. Я так понимаю, что это...

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
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 . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru