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

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

01.06.2015, 21:22. Показов 1972. Ответов 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
33149 / 21441 / 8223
Регистрация: 22.10.2011
Сообщений: 36,773
Записей в блоге: 9
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
8483 / 6150 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
02.06.2015, 20:44
Поддержка VCL-стилей
0
 Аватар для Dinkin
768 / 554 / 134
Регистрация: 31.05.2013
Сообщений: 3,100
Записей в блоге: 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Как украсить новогоднюю елку с Q# и Qiskit
EggHead 24.06.2025
Что может быть необычнее, чем применить законы квантовой механики для украшения новогодней елки? Пока другие развешивают обычные гирлянды, я решил объединить свою страсть к квантовым вычислениям с. . .
Системы нулевого доверия на C#
UnmanagedCoder 24.06.2025
Традиционная архитектура безопасности работает по принципу средневекового замка: создаём высокие стены вокруг корпоративной сети, укрепляем ворота межсетевыми экранами и системами обнаружения. . .
Снова не мой путь. Циклическое среднее, я обеими руками за проверку условия, в ракурсе данной задачи - циклическое среднее в топку.
Hrethgir 24.06.2025
Привет. Такой вопрос - нужно выводить среднее математическое между двумя направлениями, интервал значений которых может лежать в диапазоне одного оборота по кругу. Проблема заключается в том, что. . .
Деплой Flask приложения
py-thonny 23.06.2025
За годы работы с Flask я натыкался на одни и те же грабли достаточно часто, чтобы наконец научится их обходить. И сегодня хочу поделится опытом, который сбережет вам немало нервных клеток. Начнем с. . .
WebAssembly и контейнеры в .NET Aspire для оркестрации распределенных архитектур
ArchitectMsa 23.06.2025
Я наблюдаю, как WebAssembly (или просто WASM) постепенно выходит за рамки своего первоначального предназначения — исполнения кода на стороне браузера. Теперь эта технология проникает в серверную. . .
Непрерывная интеграция для пакета Python
Mr. Docker 22.06.2025
Было 4 часа утра пятницы, когда я выпустил новую версию нашей внутренней библиотеки для обработки данных. Релиз 0. 5. 2 содержал небольшой фикс для обработки дат в ISO формате, что может пойти не так?. . .
Продвинутый ETL на C# из OLTP БД в хранилище
stackOverflow 22.06.2025
Работая в сфере корпоративной аналитики, я постоянно сталкиваюсь с одним и тем же - нужны чистые, структурированные и, главное, свежие данные. Без них современные аналитические системы, машинное. . .
Мастер-класс по микросервисам на Node.js
Reangularity 21.06.2025
Node. js стал одной из самых популярных платформ для микросервисной архитектуры не случайно. Его неблокирующая однопоточная модель и событийно-ориентированный подход делают его идеальным для. . .
Управление Arduino из WPF приложения
Wired 21.06.2025
Зачем вообще связывать Arduino с WPF-приложением? Казалось бы, у Arduino есть собственная среда разработки, своя экосистема, свои способы управления. Однако при создании серьезных проектов. . .
Звёздная пыль
kumehtar 20.06.2025
Я просто это себе представляю: как создавался этот мир. Как энергия слипалась в маленькие частички. Как они собирались в первые звёзды, как во вселенной впервые появился Свет. Как эти звёзды. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru