Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
12 / 11 / 2
Регистрация: 03.04.2016
Сообщений: 502

Связать переменную с програмно созданным контролом

21.02.2020, 00:15. Показов 890. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Вот такая задачка возникла.
Необходимо связать переменную с CEdit для обмена данными введенными пользователем.
Если все создавать через Визард то отлично работает.
Однако я создаю контрол програмно.
C++
1
m_edit.Create(WS_BORDER | WS_TABSTOP | WS_CHILD | WS_VISIBLE, rect, this, 9595);
Визард добавляет в DoDataExchange такой код.
C++
1
2
3
4
5
6
void CA_TEST_DIALOGDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
    //DDX_Text(pDX, 9595, m_test);
    DDX_Text(pDX, IDC_EDIT1, m_test);
}
Переменная DWORD m_test;
В закомментированной строчке я пытаюсь сделать то же для програмно созданного контрола.
Однако получаю исключение. Как правильно связать переменную с контролом?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.02.2020, 00:15
Ответы с готовыми решениями:

Как програмно создать переменную?
как програмно создать переменную. тойст чтобы в нужном месте программа сама могла создавать переменную такую какую буден нужно ...

Как работать с динамически созданным контролом
Возник такой вопрос. Создал кодом checkbox, вот класс который этим занимается: using System; using System.Collections.Generic; ...

Как правильно пользоваться созданным контролом в виде отдельной dll?
Всем здравствуйте. До сих пор я каждый раз вставлял в тело проекта созданный мной контрол вместе со всеми его модулями (классами) и уж...

18
 Аватар для GoodWeather
886 / 588 / 179
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
21.02.2020, 17:22
Чего именно вы хотите добиться? Почему DWORD? Сколько у вас переменных и сколько у вас динамических CEdit?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
21.02.2020, 17:32
Цитата Сообщение от zombivadim Посмотреть сообщение
В закомментированной строчке я пытаюсь сделать то же для програмно созданного контрола.
Однако получаю исключение. Как правильно связать переменную с контролом?
Покажии весь код. Скорее всего, DoDataExchange вызывается раньще, чем ты создаёшь этот контрол.
0
12 / 11 / 2
Регистрация: 03.04.2016
Сообщений: 502
21.02.2020, 18:23  [ТС]
oleg-m1973, Контрол создаю в OnInitDialog().
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
CA_TEST_DIALOGDlg::CA_TEST_DIALOGDlg(CWnd* pParent /*=NULL*/)
    : CDialogEx(IDD_A_TEST_DIALOG_DIALOG, pParent)
    , m_test(0)
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
 
void CA_TEST_DIALOGDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
    //DDX_Text(pDX, 9595, m_test);
    DDX_Text(pDX, IDC_EDIT1, m_test);
}
 
BEGIN_MESSAGE_MAP(CA_TEST_DIALOGDlg, CDialogEx)
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
END_MESSAGE_MAP()
 
 
// обработчики сообщений CA_TEST_DIALOGDlg
 
BOOL CA_TEST_DIALOGDlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();
    CRect rect(0, 0, 411, 245);//(1,1,411,117)
    rect.MoveToXY(1, 1);
    MapDialogRect(&rect);
    m_edit.Create(WS_BORDER | WS_TABSTOP | WS_CHILD | WS_VISIBLE, rect, this, 9595);
    return TRUE; 
}
вот в таком виде если раскоментировать строку то иключение...
GoodWeather, Мне нужно получить от пользователя числовые значения. Для дальнейшей работы.
Одна переменная и один контрол.
Можно конечно считать из эдита текст и преобразовать его в число, но хотелось бы как то более корректно это сделать.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
22.02.2020, 15:37
Цитата Сообщение от zombivadim Посмотреть сообщение
oleg-m1973, Контрол создаю в OnInitDialog().
Оно вызывается в CDialogEx::OnInitDialog();
Попробуй создать контрол до его вызова
C++
1
2
3
4
5
6
7
8
9
BOOL CA_TEST_DIALOGDlg::OnInitDialog()
{
    CRect rect(0, 0, 411, 245);//(1,1,411,117)
    rect.MoveToXY(1, 1);
    MapDialogRect(&rect);
    m_edit.Create(WS_BORDER | WS_TABSTOP | WS_CHILD | WS_VISIBLE, rect, this, 9595);
    CDialogEx::OnInitDialog();
    return TRUE; 
}
0
12 / 11 / 2
Регистрация: 03.04.2016
Сообщений: 502
02.03.2020, 22:37  [ТС]
oleg-m1973, Вы знаете в простейшем случае это работает.
Но у меня на главном окне есть таб контрол. Для него я создаю диалоговые окна с дочерними классами произведенными
от основного диалога. В каждом порожденном классе виззард генерирует свой метод DoDataExchange.
Я пытаюсь в дочернем окне програмно создать контрол и добавить переменную в его DoDataExchange.
И получаю исключение. Пытался создавать его непосредственно в OnInitDialog а после создания помещать строчку
CDialogEx::OnInitDialog();Но это не имеет никакого эффекта. Ошибка остается.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
02.03.2020, 22:41
Цитата Сообщение от zombivadim Посмотреть сообщение
Я пытаюсь в дочернем окне програмно создать контрол и добавить переменную в его DoDataExchange.
Здесь ты дочернее окно показал?
0
12 / 11 / 2
Регистрация: 03.04.2016
Сообщений: 502
02.03.2020, 22:45  [ТС]
oleg-m1973, Нет. Я писал простейший пример. Я не ожидал что с одним окном это работает. А с дочерними нет.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
02.03.2020, 22:50
Цитата Сообщение от zombivadim Посмотреть сообщение
oleg-m1973, Нет. Я писал простейший пример. Я не ожидал что с одним окном это работает. А с дочерними нет.
Ну так покажи усложнённый пример.
В CTabCtrl страницы вроде наследуются от CDialog, и у них есть такой же OnInitDialog
0
12 / 11 / 2
Регистрация: 03.04.2016
Сообщений: 502
02.03.2020, 22:58  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
и у них есть такой же OnInitDialog
У него нет своих страниц. Для него надо создавать дочерние окна и цеплять к нему.
В порожденных классах нет OnInitDialog.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
IMPLEMENT_DYNAMIC(CRES, CDialogEx)
 
CRES::CRES(CWnd* pParent /*=NULL*/)
    : CDialogEx(IDD_RESOURCE, pParent)
{
 
}
 
CRES::~CRES()
{
 
}
 
void CRES::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
}
 
 
BEGIN_MESSAGE_MAP(CRES, CDialogEx)
END_MESSAGE_MAP()
Это сгенерированный класс для дочернего окна.

Добавлено через 2 минуты
Далее в OnInitDialog базового окна, как в примере выше я пытаюсь создать контрол.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
02.03.2020, 23:02
Цитата Сообщение от zombivadim Посмотреть сообщение
Это сгенерированный класс для дочернего окна.
Ну а где ты делаешь вот это
Цитата Сообщение от zombivadim Посмотреть сообщение
Я пытаюсь в дочернем окне програмно создать контрол и добавить переменную в его DoDataExchange.
Ты пробовал сделать, как я показывал?

Добавлено через 2 минуты
DoDataExchange вызывается в CDialogEx::OnInitDialog();. Ты можешь тупо посмотреть это по исходникам, в поиске по всем файлам (я так и сделал). Просто создай свой контрол до этого вызова
0
12 / 11 / 2
Регистрация: 03.04.2016
Сообщений: 502
02.03.2020, 23:04  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Ты пробовал сделать, как я показывал?
Естественно. В дочернем классе в DoDataExchange я добавляю переменную.
Сам контрол пытаюсь создать в базовом OnInitDialog() и после создания поместить CDialogEx::OnInitDialog();
Но это не срабатывает. Но в случае если контрол на главном окне то ошибки нет.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
02.03.2020, 23:06
Цитата Сообщение от zombivadim Посмотреть сообщение
Естественно. В дочернем классе в DoDataExchange я добавляю переменную.
Сам контрол пытаюсь создать в базовом OnInitDialog() и после создания поместить CDialogEx::OnInitDialog();
Но это не срабатывает. Но в случае если контрол на главном окне то ошибки нет.
Так и контрол создавай в дочернем классе, по-аналогии
0
12 / 11 / 2
Регистрация: 03.04.2016
Сообщений: 502
02.03.2020, 23:06  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
IMPLEMENT_DYNAMIC(CRES, CDialogEx)
 
CRES::CRES(CWnd* pParent /*=NULL*/)
    : CDialogEx(IDD_RESOURCE, pParent)
, m2(0)
{
 
}
 
CRES::~CRES()
{
 
}
 
void CRES::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
DDX_Text(pDX, 2222, m2);
}
 
 
BEGIN_MESSAGE_MAP(CRES, CDialogEx)
END_MESSAGE_MAP()
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
02.03.2020, 23:06
У каждого диалогового окна должны быть свои контролы
0
12 / 11 / 2
Регистрация: 03.04.2016
Сообщений: 502
02.03.2020, 23:09  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Так и контрол создавай в дочернем классе, по-аналогии
Это не имеет значения где его создавать я пробовал и там и там. Ошибка остается. В главном окне только вызывается CDialogEx::OnInitDialog();я думал что так сработает наверняка, но увы.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
02.03.2020, 23:11
Цитата Сообщение от zombivadim Посмотреть сообщение
Это не имеет значения где его создавать я пробовал и там и там. Ошибка остается. В главном окне только вызывается CDialogEx::OnInitDialog();я думал что так сработает наверняка, но увы.
Что-то я не вижу, где ты ещё его пытался создать
0
12 / 11 / 2
Регистрация: 03.04.2016
Сообщений: 502
02.03.2020, 23:27  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
DoDataExchange вызывается в CDialogEx::OnInitDialog();. Ты можешь тупо посмотреть это по исходникам, в поиске по всем файлам (я так и сделал). Просто создай свой контрол до этого вызова
В таком случае может сначала в любом случае вызывается CDialogEx::OnInitDialog();А только потом уже инициализируется вся дочерние окна.

Добавлено через 37 секунд
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Что-то я не вижу, где ты ещё его пытался создать
Счас напишу подробный пример.

Добавлено через 7 минут
В дочернем классе
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
CRES::CRES(CWnd* pParent /*=NULL*/)
    : CDialogEx(IDD_RESOURCE, pParent)
, m2(0)
{
 
}
 
CRES::~CRES()
{
 
}
 
void CRES::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
DDX_Text(pDX, 2222, m2);
}
 
 
BEGIN_MESSAGE_MAP(CRES, CDialogEx)
END_MESSAGE_MAP()
 
void CRES::init_res_list()
{
MapDialogRect(&rect5);
m_edit3.Create(WS_BORDER | WS_TABSTOP | WS_CHILD | WS_VISIBLE | ES_NUMBER, rect5, this, 2222);
}
В базовом классе.
C++
1
2
3
4
5
6
BOOL CA_TEST_DIALOGDlg::OnInitDialog()
{
    init_res_list();
    CDialogEx::OnInitDialog();
    return TRUE; 
}
0
12 / 11 / 2
Регистрация: 03.04.2016
Сообщений: 502
03.03.2020, 10:36  [ТС]
oleg-m1973, Вообщем я поэкспериментировал.
Вот так исключение пропадает.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void CRES::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
    init_res_list();
    DDX_Text(pDX, 2222, m2);
}
 
 
void CRES::init_res_list()
{
MapDialogRect(&rect5);
m_edit3.Create(WS_BORDER | WS_TABSTOP | WS_CHILD | WS_VISIBLE | ES_NUMBER, rect5, this, 2222);
}
Что явно указывает на то, что ошибка возникает из за того, что контрол создается позже вызова DoDataExchange
Вот только как его правильно создать раньше ума не приложу.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.03.2020, 10:36
Помогаю со студенческими работами здесь

Обращение к програмно(не в дизайнере) созданным элементам
Label TZtime = new Label();//Создаю новый элемент управления TZtime.Name = "Time"+i.ToString();//Задаю ему имя ...

Не удается связать DataTable с контролом reportviewer
Здравствуйте, уважаемые форумчане! У меня возникла проблема, при попытке связать таблицу с контролом ReportViewer. У меня имеется две...

Как програмно связать таблицы Access?
Подскажите или дайте наводку как програмно связать две таблицы Access? Давно ищу! Спасибо заранее...

Связать переменную
Проект MFC. Есть меню, по нажатии кнопки открыть открывается диалоговое окно. В диалоге есть EDIT к которому привязана переменная. Я...

Как связать переменную?
Какими способами можно связать переменную "a" за пределами if? private void button1_Click(object sender,...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru