0 / 0 / 0
Регистрация: 23.07.2009
Сообщений: 10

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

26.07.2009, 22:11. Показов 9120. Ответов 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
 Аватар для V.V.P.Net
11 / 11 / 1
Регистрация: 14.04.2010
Сообщений: 73
06.08.2012, 10:43
Студворк — интернет-сервис помощи студентам
Я и так делал
C++
1
2
3
4
5
6
7
private:    // User declarations
public:     // User declarations
    __fastcall TForm1(TComponent* Owner);
    void paint_cell(int coll,int roww);
    void __fastcall DoIt(); // Вот тут я его объявил
 
};
C++
1
2
3
4
5
6
7
void TForm1::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
[BCC32 Error] Unit1.cpp(418): E2357 Reference initialized with 'TRect', needs lvalue of type 'TRect'
  Full parser context
    Unit1.cpp(416): parsing: void TForm1::paint_cell(int,int)
[BCC32 Error] Unit1.cpp(418): E2342 Type mismatch in parameter 'Rect' (wanted 'TRect &', got 'TRect')
  Full parser context
    Unit1.cpp(416): parsing: void TForm1::paint_cell(int,int)
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33480 / 21578 / 8250
Регистрация: 22.10.2011
Сообщений: 37,041
Записей в блоге: 12
06.08.2012, 11:04
Компилятор же тебе сказал, в чем дело:

C++
1
2
3
4
5
6
7
8
void TForm1::paint_cell(int coll,int roww)
{
    draw_it=true;
    TRect r = Form1->StringGrid2->CellRect(coll,roww); // <--- !!!
    Form1->StringGrid2DrawCell(this,coll,roww,r,TGridDrawState()<<gdFixed);
    draw_it=false;
    return;
}
ошибки не будет. Правда?
1
 Аватар для V.V.P.Net
11 / 11 / 1
Регистрация: 14.04.2010
Сообщений: 73
09.08.2012, 07:41
Цитата Сообщение от UI Посмотреть сообщение
Компилятор же тебе сказал, в чем дело:

C++
1
2
3
4
5
6
7
8
void TForm1::paint_cell(int coll,int roww)
{
    draw_it=true;
    TRect r = Form1->StringGrid2->CellRect(coll,roww); // <--- !!!
    Form1->StringGrid2DrawCell(this,coll,roww,r,TGridDrawState()<<gdFixed);
    draw_it=false;
    return;
}
ошибки не будет. Правда?
Ну если бы я понял что он имел виду то бы скорей всего догадался. Ошибок нет, тока почему то таблица сразу закрашивается вся, минуя вызова функции
0
1090 / 588 / 121
Регистрация: 11.11.2008
Сообщений: 1,544
09.08.2012, 08:19
флаг draw_it где-нибудь в начале программы надо сбросить
0
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
09.08.2012, 09:46
Попробовал способ с paint_cell, но цвет ячейки не фиксируется.

Добавлено через 1 час 26 минут
Как я понял, состояние gdFixed соответствует ячейкам фиксированных столбцов(FixedCols) и строк(FixedRows).
И как я понял, StringGrid не умеет запоминать то, что было нарисовано в какой-либо ячейке.
Остается только старый способ с событием OnDrawCell с ручным закрашиваем (и с использованием собственного двухмерного массива).
0
1090 / 588 / 121
Регистрация: 11.11.2008
Сообщений: 1,544
09.08.2012, 09:55
так оно и есть.
способ с paint_cell для временного подсвечивания
0
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
09.08.2012, 09:57
Цитата Сообщение от AntonChik Посмотреть сообщение
способ с paint_cell для временного подсвечивания
а смысл? после двойного ALT+TAB все исчезнет.
0
1090 / 588 / 121
Регистрация: 11.11.2008
Сообщений: 1,544
09.08.2012, 10:02
я использовал чтоб по нажатию кнопки подсветить красным ячейки с некорректными данными,
можно по надобности подсвечивать результаты поиска...
мне не нужна была фиксация
я кстати только сейчас это понял
0
 Аватар для V.V.P.Net
11 / 11 / 1
Регистрация: 14.04.2010
Сообщений: 73
09.08.2012, 12:43
Не знаю в чём дело.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
............
#undef UNICODE
TForm1 *Form1;
T_Parser parser;
//---------------------------------------------------------------------------
//Глобальные переменные
int post = 4, post1 = 5;            //Количесто знаков после и до запятой
int i;                              //Количество элементов
double a, b;
double mashtab;
double razmax, smeshenie;
double gammaf;
double math;
double variance;
double sko;
double mediana;
double moda;
double R2;
double NDPmax, NDPmin, TMPmax, TMPmin;
float pro;
bool draw_it=false;
extern int icout;
..........
C++
1
2
3
4
5
6
7
8
void TForm1::paint_cell(int coll,int roww)
{
draw_it=true;
TRect r = Form1->StringGrid2->CellRect(coll,roww); // <--- !!!
Form1->StringGrid2DrawCell(this,coll,roww,r,TGridDrawState()<<gdFixed);
draw_it=false;
return;
}
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::Chart2Zoom(TObject *Sender)
{
 double *ModFy = new double [i-1];
 double *ModFx = new double [i-1];
 double *ModFy1 = new double [i-1];
 double *ModFx1 = new double [i-1];
 //
 int j, k=1;
 
    for (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]))
        {
         paint_cell(2,j);
         ModFy1[k] = ModFy[j];
         ModFx1[k] = ModFx[j];
         k++;
        }
    }
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void __fastcall TForm1::StringGrid2DrawCell(TObject *Sender, int ACol, int ARow,
      TRect &Rect, TGridDrawState State)
{
 
AnsiString s;
s=StringGrid2->Cells[ACol][ARow];
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;
}
При запуске
Миниатюры
Закрашивание ячейки StringGrid  
0
8 / 8 / 2
Регистрация: 30.01.2015
Сообщений: 157
16.06.2016, 11:21
подскажите когда я кликаю мышкой на закрашенной ячейки, ячейка становится не закрашенной, можно ли это как то избежать?
0
8 / 8 / 2
Регистрация: 30.01.2015
Сообщений: 157
21.07.2016, 07:36
Можете подсказать способ с фиксацией цвета?
0
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
21.07.2016, 08:26
Цитата Сообщение от Mudrec Посмотреть сообщение
Можете подсказать способ с фиксацией цвета?
Что вы имеете ввиду ? Чтобы цвет закраски оставался ?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33480 / 21578 / 8250
Регистрация: 22.10.2011
Сообщений: 37,041
Записей в блоге: 12
21.07.2016, 08:39
Цитата Сообщение от Mudrec Посмотреть сообщение
когда я кликаю мышкой на закрашенной ячейки, ячейка становится не закрашенной
Это смотря что происходит по клику. Если в опциях грида goAlwaysShowEditor включена, то при клике на ячейку она переходит в режим редактирования, и для того, чтобы она осталась того же красного цвета, нужно наследоваться от InlineEditor-а, и переопределять его поведение.

Вот пример:
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
// перед классом формы, в файле Unit1.h 
namespace SG_RedGrid
{
    class TMyInplaceEdit : public TInplaceEdit
    {
    public:
        __fastcall virtual TMyInplaceEdit(TComponent* AOwner)
            : TInplaceEdit(AOwner)
        {
            Color = clRed;
        }
    };
 
    class TStringGrid : public Grids::TStringGrid
    {
    protected:
        virtual TInplaceEdit* __fastcall CreateEditor(void)
        {
            return new TMyInplaceEdit(this);
        }
 
        virtual void __fastcall DrawCell(int ACol, int ARow,
            const System::Types::TRect &ARect, TGridDrawState AState)
        {
            String s = Cells[ACol][ARow];
            Canvas->Brush->Color = clRed;
            Canvas->FillRect(ARect);
            Canvas->Font->Color = clBlack;
            Canvas->TextOut(ARect.Left + 2, ARect.Top + 2, s);
        }
    };
}
#define TStringGrid SG_RedGrid::TStringGrid
 
class TForm1 : public TForm // это класс формы, тут уже не нужно ничего менять
0
8 / 8 / 2
Регистрация: 30.01.2015
Сообщений: 157
24.07.2016, 23:28
Вот такую ошибку выдает
Миниатюры
Закрашивание ячейки StringGrid  
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33480 / 21578 / 8250
Регистрация: 22.10.2011
Сообщений: 37,041
Записей в блоге: 12
24.07.2016, 23:47
Ну значит посмотри, какой тип у параметра ARect в обработчике OnDrawCell на твоей версии Билдера, и поставь этот тип вместо System::Types::TRect. У меня ошибок не выдает, код работающий. XE2, если что...
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.07.2016, 23:47

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
35
Ответ Создать тему
Опции темы

Новые блоги и статьи
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru