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

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

26.07.2009, 22:11. Показов 8859. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru