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

StringGrid и некорректное поведение CheckBox

01.06.2015, 21:22. Показов 2127. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер, задача - добавить CheckBox в ячейку StringGrid. Много тем на форуме было по этой теме, получился такой вот код, который и использую

Unit1.cpp

C++
1
2
3
4
5
 void __fastcall TForm1::ClickCheck(TObject *Sender) {
 if (((TCheckBox*)(Sender))->Checked)
 ((TCheckBox*)(Sender))->Checked = 0;
    else
        ((TCheckBox*)(Sender))->Checked = 1;}

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
    void __fastcall TForm1::Button1(TObject *Sender) {
         TCheckBox *Check1;
         for (int i = 1; i < k-1; i++) {   // k - количество строк в StringGrid1
         Check1 = new TCheckBox(this);
         TRect Rect;
         Check1->Visible = false;
         Check1->Width = 0;
         // Check1->Caption = "Ok";
         Check1->Parent = StringGrid1;
            Check1->Color = clLime;
            Check1->Checked = false;
            Check1->Enabled = true;
 
            Rect = StringGrid1->CellRect(0, i);
            Check1->Left = Rect.Left;
            Check1->Top = Rect.Top;
            Check1->Width = Rect.Right - Rect.Left;
            Check1->Height = Rect.Bottom - Rect.Top;
 
            Check1->OnEnter = ClickCheck;
 
            Check1->Visible = true;
            StringGrid1->Objects[0][i] = Check1;
          }
}
Unit1.h

C++
1
void __fastcall ClickCheck(TObject *Sender);
По итогу CheckBox'ы добавляются и реагируют на нажатие, это без претензий, но после вертикального скролла StringGrid'a отмечаются неотмеченные боксы (которые в результате скролла ушли наверх) и, при наведении на них, отметка снимается или ставится (поведение довольно таки хаотичное). В общем, происходит какая-то ерунда с ними, прошу помощи в решении этой проблемы.

Спасибо.

(Небольшой фикс сообщения, забыл функцию обработки клика вставить)
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.06.2015, 21:22
Ответы с готовыми решениями:

Некорректное поведение GetClientRect
Есть MDI приложение. Запущено на машине с 2мя мониторами. На втором - маленькое разрешение(1024x768). Когда открывается окошко, там...

Некорректное поведение клавиатуры
Поставил Mint 17.3, первые пару дней всё работало нормально, затем с клавиатурой произошла ерунда; 1.ScrollLock постоянно включен; ...

Некорректное поведение скрипта
Здравствуйте. Есть скрипт( его часть - логирование) $Log = 'Ошибка '.$ex-&gt;getMessage().' в строке № '.$ex-&gt;getLine().'...

4
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33195 / 21491 / 8233
Регистрация: 22.10.2011
Сообщений: 36,878
Записей в блоге: 12
02.06.2015, 12:51
Лучший ответ Сообщение было отмечено volvo как решение

Решение

Метод с получением изображения пустого и отмеченного CheckBox-а, и перерисовкой их в ячейках грида (вместо того, чтобы тягать TCheckBox с места на место) ведет себя адекватно. Как пример:
Код класса перехватчика для TStringGrid-а

header-файл
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#include <memory>
 
namespace Check_Grid
{
    #define OBM_CHECKBOXES      32759
 
    class TStringGrid : public Grids::TStringGrid
    {
        typedef Grids::TStringGrid Inherited;
 
    private:
        TBitmap *FCheck, *FNoCheck;
 
        void __fastcall ToggleCheckbox(int ACol, int ARow)
        {
            if (ACol == 1)
            {
                if (Objects[ACol][ARow])
                    Objects[ACol][ARow] = 0;
                else
                    Objects[ACol][ARow] = (TObject*)(1);
                InvalidateCell(ACol, ARow);
            }
        }
 
    protected:
        virtual void __fastcall DrawCell(int ACol, int ARow,
            const System::Types::TRect &ARect, TGridDrawState AState)
        {
            Inherited::DrawCell(ACol, ARow, ARect, AState);
            if (!AState.Contains(gdFixed) && ACol == 1)
            {
                Canvas->Brush->Color = 0xE0E0E0;
                Canvas->FillRect(ARect);
                if (Objects[ACol][ARow])
                    Canvas->Draw((ARect.right + ARect.left - FCheck->Width) / 2,
                    (ARect.bottom + ARect.top - FCheck->Height) / 2, FCheck);
                else
                    Canvas->Draw((ARect.right + ARect.left - FNoCheck->Width) / 2,
                    (ARect.bottom + ARect.top - FNoCheck->Height) / 2,
                    FNoCheck);
            }
        }
 
        DYNAMIC void __fastcall Click(void)
        {
            Inherited::Click();
 
            TPoint pt;
            ::GetCursorPos(&pt);
            pt = ScreenToClient(pt);
            int ACol, ARow;
            MouseToCell(pt.x, pt.y, ACol, ARow);
            if (ACol == 1 && ARow >= FixedRows)
            {
                ToggleCheckbox(ACol, ARow);
            }
        }
 
        virtual bool __fastcall SelectCell(int ACol, int ARow)
        {
            if (ACol == 1)
                Options = Options >> goEditing;
            else
                Options = Options << goEditing;
            return true;
        }
 
        DYNAMIC void __fastcall KeyPress(System::WideChar &Key)
        {
            Inherited::KeyPress(Key);
            if (Key == 32)
                if (Col == 1)
                {
                    ToggleCheckbox(Col, Row);
                    Key = 0;
                }
        }
 
    public:
        inline __fastcall virtual TStringGrid
            (System::Classes::TComponent* AOwner) : Grids::TStringGrid(AOwner)
        {
 
            FCheck = new TBitmap;
            FNoCheck = new TBitmap;
            std::auto_ptr<TBitmap>bmp(new TBitmap);
            bmp->Handle = LoadBitmap(0, MAKEINTRESOURCE(OBM_CHECKBOXES));
 
            FNoCheck->SetSize(bmp->Width / 4, bmp->Height / 3);
            FNoCheck->Canvas->CopyRect(FNoCheck->Canvas->ClipRect, bmp->Canvas,
                FNoCheck->Canvas->ClipRect);
 
            FCheck->SetSize(bmp->Width / 4, bmp->Height / 3);
            FCheck->Canvas->CopyRect(FCheck->Canvas->ClipRect, bmp->Canvas,
                Rect(FCheck->Width, 0, 2 * FCheck->Width,
                FCheck->Height));
        }
 
        inline __fastcall virtual ~TStringGrid(void)
        {
            delete FNoCheck;
            delete FCheck;
        }
    };
};
#define TStringGrid Check_Grid::TStringGrid
 
// дальше класс формы, без изменений, у грида в первом столбце будут CheckBox-ы
class TForm3 : public TForm
Код потребует доработки при использовании VCL Themes, но сама идея должна быть понятна...
1
0 / 0 / 0
Регистрация: 12.07.2012
Сообщений: 8
02.06.2015, 19:34  [ТС]
Благодарю, попробую.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
02.06.2015, 20:44
Поддержка VCL-стилей
0
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,142
Записей в блоге: 3
14.04.2016, 13:09
volvo, а как при Вашем подходе опредять, check галки (чет не пойму)?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.04.2016, 13:09
Помогаю со студенческими работами здесь

Некорректное поведение системы
Доброго вечера. С некоторых пор наблюдается некорректная работа системы. Проявляется она в постоянных изменениях настроек. Например,...

Некорректное поведение выпадающего меню
Камрады помогите с выпадающим меню - выпадает, но некорректно... &lt;ul class=&quot;menu&quot;&gt; &lt;li&gt;&lt;a...

Некорректное поведение Java апплета
Всем привет! Я готов, что кто-то будет меня пинать, но в поисках решения своей проблемы я пока не продвинулся ни на шаг, поэтому пишу...

Некорректное поведение submit двух форм
Всем привет, есть html страничка с двумя формами. &lt;form method=&quot;post&quot;&gt; &lt;input...

Некорректное поведение программы, работа со строками
Доброго времени суток! Пишу программу, которая работает с базой данных студентов. Для структуры &quot;Student&quot; реализовал метод...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs . . .
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
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru