Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача данных из диалога в главное окно, через глобал. переменную не передается 
V
    Опции темы
Деран
Дата 27.8.2008, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 17.7.2008

Репутация: нет
Всего: 1



Здравствуйте!
Как правильно передавать данные из диалога в главное окно.
Пробовал через глобальную переменную, не получается.

//Процедура диалога
Код

HWND hEditNCount;
LRESULT CALLBACK DialogProcEdit(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    static char buf[15];
    switch(uMsg)
    {
    case WM_CREATE:
        ...
        hEditNCount = CreateWindow("edit", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, 5, 50, 380, 20, hwnd, (HMENU)IDE_EDIT, NULL, NULL);
        CreateWindow("button", "OK", WS_VISIBLE | WS_CHILD, 10, 80, 80, 25, hwnd, (HMENU)IDB_OK_EDIT, NULL, NULL);
        ...
        break;
    case WM_COMMAND:
        switch(LOWORD(wParam))
        {
        ...
        case IDB_OK_EDIT:
            GetWindowText(hEditNCount, buf, 10);
            N_Count = atoi(buf);
            DestroyWindow(hwnd);
            break;
        }
        break;
    case WM_CLOSE:
        DestroyWindow(hwnd);
        break;
    default:
        return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
    return 0;


//глобальная переменная
Код

int N_Count;


полученные данные с N_Count не поменялись, хотя изменялись в диалоге.

В чем моя ошибка?
PM   Вверх
BorisVorontsov
Дата 27.8.2008, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Thinker
**


Профиль
Группа: Комодератор
Сообщений: 714
Регистрация: 3.11.2005
Где: Молдавия, г. Киши нёв

Репутация: 4
Всего: 10



Во-первых, приучись занулять строки перед вызовом функций типа GetWindowText. Избавит от многих ошибок.

Цитата(Деран @  27.8.2008,  14:24 Найти цитируемый пост)
полученные данные с N_Count не поменялись, хотя изменялись в диалоге.


То есть ты стал бряком после
Код

N_Count = atoi(buf);


И посмотрел значение N_Count?

И еще -- где ты проверяешь значение переменной в процедуре родительского окна?


--------------------
[code=cpp]
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;
[/code]
PM MAIL ICQ GTalk   Вверх
Деран
Дата 27.8.2008, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 17.7.2008

Репутация: нет
Всего: 1



Цитата

И еще -- где ты проверяешь значение переменной в процедуре родительского окна? 

N_Count передаю классу через метод, если вместо N_Count, поставлю константу, то значение меняется (т.е. дело не в методе класса)
Код

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    i...
    static Quadratic quad;
    switch(uMsg)
    {
    case WM_CREATE:
        ...
        RegisterDialogClassEdit(hwnd, hInst);
        ...
        break;
    ...
    case WM_COMMAND:
        switch(LOWORD(wParam))
        {
        ...
        case IDM_FILE_COUNT:
            CreateDialogBoxEdit(hwnd, hInst);
            quad.SetQeCount(N_Count);
            break;
        ...
        }
        break;
    default:
        return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
    return 0;
}


Цитата

То есть ты стал бряком после

Не очень понятно, что вы имели ввиду?
PM   Вверх
Andrey44
Дата 27.8.2008, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 8
Всего: 26



Цитата(Деран @  27.8.2008,  14:45 Найти цитируемый пост)
Не очень понятно, что вы имели ввиду? 

Деран,  это значит поставьте брекпоинт на  строке ниже где используете atoi(), и посмотрите значение вашей  N_Count



--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
Деран
  Дата 27.8.2008, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 17.7.2008

Репутация: нет
Всего: 1



GDB показал N_Count = 11, да значение передалось в N_Count.
Код

(gdb) break 225
Breakpoint 3 at 0x40207d: file window.cpp, line 225.
(gdb) run
...

Breakpoint 3, DialogProcEdit (hwnd=0x400194, uMsg=273, wParam=204,
    lParam=15598146) at window.cpp:228
228                     break;
(gdb) p N_Count
$2 = 11


Странно, а значение остается прежним, которое инициализировал в
Код

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    hInst = hInstance;
    N_Count = 15;
        ....

PM   Вверх
Деран
  Дата 27.8.2008, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 17.7.2008

Репутация: нет
Всего: 1



Попробую задать вопрос по другому.
Каким способом передавать данные из диалога в главное окно?
PM   Вверх
Деран
Дата 27.8.2008, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 17.7.2008

Репутация: нет
Всего: 1



Все, понял в чем ошибка!
Делал так:
Код

...
case IDM_FILE_COUNT:
            CreateDialogBoxEdit(hwnd, hInst);
            quad.SetQeCount(N_Count);
            break;
...

Код

void CreateDialogBoxEdit(HWND hwnd, HINSTANCE ghInstance)
{
    CreateWindowEx(WS_EX_DLGMODALFRAME | WS_EX_TOPMOST, "DialogClassEdit", "Диалог", WS_VISIBLE | WS_SYSMENU | WS_CAPTION, 
CW_USEDEFAULT, CW_USEDEFAULT, 400, 150, NULL, NULL, ghInstance, NULL);
}

А функция CreateDialogBoxEdit() не работает как MessageBox() и получается она создала диалог и продолжила работу дальше, т.е. выполнила следующую строчку и в N_Count не попадет нового значения!


Это сообщение отредактировал(а) Деран - 27.8.2008, 19:24
PM   Вверх
Деран
  Дата 28.8.2008, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 17.7.2008

Репутация: нет
Всего: 1



Но все равно не понятно как передавать данные. Не будет же пользователь нажимать два раза кнопку, например, пользователь вызвал диалог, ввел то что нужно и нажал ок, диалог закрылся и еще ему нужно нажать кнопку на главном окне чтобы считать данные с N_Count.
Как нужно проследить, что диалог закрылся, при этом на диалоге была нажата кнопка ок, или какие-то перехвату нужно делать? Может есть другое решение?
PM   Вверх
586
Дата 28.8.2008, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Цитата(Деран @  28.8.2008,  10:43 Найти цитируемый пост)
Но все равно не понятно как передавать данные. Не будет же пользователь нажимать два раза кнопку, например, пользователь вызвал диалог, ввел то что нужно и нажал ок, диалог закрылся и еще ему нужно нажать кнопку на главном окне чтобы считать данные с N_Count.

Когда пользователь нажмёт OK, тогда и изменяй переменную.
И вообще, у тебя здесь диалогов нет, у тебя здесь просто создаются окна через CreateWindowEx.
Диалоги создаются с помощью CreateDialogParam, DialogBoxParam, и бывают модальные и немодальные. Пример модального диалога - MessageBox - функция возвращает значение, когда окно закрывается.
PM   Вверх
Деран
Дата 28.8.2008, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 17.7.2008

Репутация: нет
Всего: 1



586, А разве CreateDialogParam и DialogBoxParam не используют фун. CreateWindowEx через которую и создается окно/диалог?
PM   Вверх
586
Дата 29.8.2008, 02:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Цитата(Деран @  28.8.2008,  18:16 Найти цитируемый пост)
А разве CreateDialogParam и DialogBoxParam не используют фун. CreateWindowEx через которую и создается окно/диалог? 

Диалоговое окно можно реализовать через обычные WinAPI функции, но это уже будет не диалоговое окно, а велосипед. Обычно, в WinAPI под диалоговыми окнами подразумеваются те окна, что созданы с помощью CreateDialogParam / DialogBoxParam.
PM   Вверх
Деран
Дата 29.8.2008, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 17.7.2008

Репутация: нет
Всего: 1



Спасибо всем за помощь.
Решил задачу, так: данные не передаются из диалога, а изменяются в самом диалоге (по предложенным советам выше) и изменил код создания диалога.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.1616 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.