На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
user posted image FAQ Раздела user posted image Обновления для FAQ Раздела user posted image Поиск по Разделу user posted image MSDN Library Online
Модераторы: ElcnU
Страницы: (4) [1] 2 3 ... Последняя » все  ( Перейти к последнему сообщению )  
> правильное программирование окна свойств , отмена изменений без проверки значений
    Здрасте, тут такое дело я запуталси :D

    вообщем есть некое окно свойств для установки значений, там как полагается кнопки ОК, Отмена, Применить. все работатет но есть одна заминка. есть одна проверка на ввод диапозона чисел в CEdit, она реализована в обработчике OnEnKillfocus и все б норм ток если жать Отмену и при этом введеное число не попадает в правильный диапозон, то естествено окно не закрывается, а выходит мессаж об ошибке ввода пока не заполнить правильным значением. вот теперь не знаю как быть и что делать.

    если надо могу прилепить проект, а пока вот часть кода хотя она не очем не скажет :D

    ExpandedWrap disabled
      void CPage4::OnEnKillfocusFontsize()
      {
          TRACE("CPage4::OnEnKillfocusFontsize\n");
          int minVal = 8;
          int maxVal = 24;
          int value = GetDlgItemInt(IDC_FONTSIZE);    
          TRACE("mFontSize = %d\n", mFontSize);
          TRACE("value = %d\n", value);
       
          //if (mCancel) return;
       
          if (value < minVal || value > maxVal)
          {  
              AfxMessageBox(_T("Enter value between 8 and 24"), MB_ICONEXCLAMATION);              
              mPropSheet->SetActivePage(3);
          }
          else
              SetModified(TRUE);
      }
      Цитата Cfon @
      вообщем есть некое окно свойств для установки значений, там как полагается кнопки ОК, Отмена, Применить. все работатет но есть одна заминка. есть одна проверка на ввод диапозона чисел в CEdit, она реализована в обработчике OnEnKillfocus и все б норм ток если жать Отмену и при этом введеное число не попадает в правильный диапозон, то естествено окно не закрывается, а выходит мессаж об ошибке ввода пока не заполнить правильным значением. вот теперь не знаю как быть и что делать.


      А зачем ты так делаешь в killfocus. Это сообщение посылается всегда, когда ты выходишь из контрола, независимо куда. Там надо выводить не MesageBox, а какое-нибудь неблокирующее сообщение, например в Static.
      А MessageBoxы надо делать при нажатии на кнопку OK.
        Цитата Олег М @
        А зачем ты так делаешь в killfocus. Это сообщение посылается всегда, когда ты выходишь из контрола, независимо куда. Там надо выводить не MesageBox, а какое-нибудь неблокирующее сообщение, например в Static.
        А MessageBoxы надо делать при нажатии на кнопку OK.

        нет не помогло также не закрывает окно при отмене :no-sad:
        ExpandedWrap disabled
          void CPage4::OnEnKillfocusFontsize()
          {
              TRACE("CPage4::OnEnKillfocusFontsize\n");
              const int minVal = 8;
              const int maxVal = 24;
              //int value = GetDlgItemInt(IDC_FONTSIZE);  
              //TRACE("mFontSize = %d\n", mFontSize);
              TRACE("value = %d\n", value);
           
              //if (mCancel) return;
           
              if (value < minVal || value > maxVal)
              {  
                  //AfxMessageBox(_T("Enter value between 8 and 24"), MB_ICONEXCLAMATION);
                  SetDlgItemText(IDC_ERRORMESSAGE, _T("Enter value between 8 and 24"));
                  mPropSheet->SetActivePage(this);
              }
              else
                  SetModified(TRUE);
          }
        Сообщение отредактировано: Cfon -
          Цитата Cfon @
          вообщем есть некое окно свойств для установки значений, там как полагается кнопки ОК, Отмена, Применить.
          .. если жать Отмену и при этом введеное число не попадает в правильный диапозон, то естествено окно не закрывается,...

          Так если ты выбрал "отмена", значит должны быть возвращено старое значение, которое было.
          Значит, перед показом диалога где-то должна быть спасена старая версия предыдущих
          "вполне павильных" значений. Отмена означает их возврат в том числе в окна редактирования.
          Такая логика работы позволяет использовать "Отмена" даже после многочисленных "Применить".
          По-применял -> не понравилось -> Отменил, вернулся к старым значениям.
          ---
          Или делай в обработчике автомат состояний. Если последней операцией была "отмена" - значит проверка
          на диапазон правильных значенй не производится.
          Сообщение отредактировано: ЫукпШ -
            Когда знаешь диапазон верных значение, то можно не давать ввести неверное, т.е. обрабатывать WM_CHAR
              Цитата ЫукпШ @
              Так если ты выбрал "отмена", значит должны быть возвращено старое значение, которое было.
              Значит, перед показом диалога где-то должна быть спасена старая версия предыдущих
              "вполне павильных" значений. Отмена означает их возврат в том числе в окна редактирования.
              Такая логика работы позволяет использовать "Отмена" даже после многочисленных "Применить".
              По-применял -> не понравилось -> Отменил, вернулся к старым значениям.
              ---
              Или делай в обработчике автомат состояний. Если последней операцией была "отмена" - значит проверка
              на диапазон правильных значенй не производится.

              с логикой проблем нет, проблема в том что окно свойств не закрыть в моей случае даже если нажать отмену :no-sad:

              Цитата ter_nk_ @
              Когда знаешь диапазон верных значение, то можно не давать ввести неверное, т.е. обрабатывать WM_CHAR

              сам то пробовал обработку WM_CHAR на проверку ввода диапозона значений, например от 8 до 24? :D

              Прикреплённый файлПрикреплённый файлEx12a.zip (83,69 Кбайт, скачиваний: 98)

              это не правильной программирование не качайте его, в самом низу есть другой полное демо как надо :D
              Сообщение отредактировано: Cfon -
                Цитата Cfon @
                с логикой проблем нет, проблема в том что окно свойств не закрыть в моей случае даже если нажать отмену :no-sad:

                К закрытию окна указанная логика работы отношения не имеет.. почти.
                Если окно не закрывается, то восстановление первоначальных данных
                по событию "Отмена" (в том числе и в окошках ввода) как раз весьма актуально !
                ---
                Что касается сообщения - MessageBox это не удобно.
                Если обработчиком обнаружена ошибка в числах, можно изменить неверный параметр
                на его граничное значение. Подробное описание назначения параметра, граничных значений
                и произошедшей ошибки можно представить в тул-типе.
                Сообщение отредактировано: ЫукпШ -
                  Цитата ЫукпШ @
                  К закрытию окна указанная логика работы отношения не имеет.. почти.
                  Если окно не закрывается, то восстановление первоначальных данных
                  по событию "Отмена" (в том числе и в окошках ввода) как раз весьма актуально !
                  ---
                  Что касается сообщения - MessageBox это не удобно.
                  Если обработчиком обнаружена ошибка в числах, можно изменить неверный параметр
                  на его граничное значение. Подробное описание назначения параметра, граничных значений
                  и произошедшей ошибки можно представить в тул-типе.

                  ясно спс, будем думать :D
                  кстати наш диалог будет более продуктивнее если ты запустишь мой примерчик и поймёшь о чем я толкую :D ж
                    Цитата Cfon @
                    сам то пробовал обработку WM_CHAR на проверку ввода диапозона значений, например от 8 до 24? :D


                    А в чем проблема? Когда символ уже есть то второй либо игнорируется, если число уже не будет соответствовать или ставится.
                      Цитата Cfon @
                      кстати наш диалог будет более продуктивнее если ты запустишь мой примерчик и поймёшь о чем я толкую :D ж

                      я и не против - но исполнимого файла в архиве нет,
                      а собирать из исходников не буду.
                        Цитата ter_nk_ @
                        А в чем проблема? Когда символ уже есть то второй либо игнорируется, если число уже не будет соответствовать или ставится.

                        нет проблем нет, только этот подход не правилен, т.к. каждый символ будет проверяться на соответствие диапазону ввода, а не все введённое число целиком, не? :whistle:

                        Цитата ЫукпШ @
                        я и не против - но исполнимого файла в архиве нет,
                        а собирать из исходников не буду.

                        ок позже запостю ехе файл :)
                        Сообщение отредактировано: Cfon -
                          много гуглил ничего толком не нашел, в основном лажу :D

                          решил по другому точнее по старому через DDX/DDV( валидация DDV мне подходит).
                          нужно было решить как быть чтобы изменения, которые сохранялись при переходе с вкладки на вкладку(речь идет о диалоге в несколькими вкладками), при отмене не сохранялись, решение простое хранить старое значение, а потом восстанавливать, если оно было отменено :D

                          поскольку в CPropertySheet нет обработчиков на OK, Cancel, Apply, то обработал OnCommand:
                          ExpandedWrap disabled
                            BOOL CPropSheet::OnCommand(WPARAM wParam, LPARAM lParam)
                            {
                                TRACE(_T("CPropSheet::OnCommand\n"));
                                UINT nID = LOWORD(wParam);
                                    
                                if (nID == IDCANCEL)
                                {
                                    TRACE(_T("IDCANCEL\n"));
                                    TRACE("mEditValue = %d\n", mPage2.EditValue());
                                    TRACE("mEditOldValue = %d\n", mPage2.EditOldValue());
                                    mPage2.EditValue(mPage2.EditOldValue());
                                }
                                
                                return CPropertySheet::OnCommand(wParam, lParam);
                            }



                          Вопрос решен, но если у вас есть что сказать вельком! :D
                          Сообщение отредактировано: Cfon -
                            возникла одна трабла мой вариант обрабатывал нажатие кнопки Отмена, но не нажатие кнопки Закрыть, та что в правом верхнем углу :D
                            короче запуталси я уж слишком много чего завязано тут надо снава разбирать :wacko:
                            Вопрос не решен однако :D
                              Цитата Cfon @
                              возникла одна трабла мой вариант обрабатывал нажатие кнопки Отмена, но не нажатие кнопки Закрыть, та что в правом верхнем углу :D
                              короче запуталси я ...

                              Всё же от тебя зависит.
                              Какую именно логику работы ты желаешь - такую и реализуй.
                              Что именно необходимо сделать по событию "закрыть окно" ?
                              В простейшем случае это эквивалент кнопки "Отмена".
                              Значит, напижем процедуру "OnCancel" и вызовем её из обоих
                              обработчиков.
                              При этом очевидно, что OnCancel это OnApply, но с изначальными
                              (спасёнными перед показом диалога) параметрами...
                              (Но не всегда, а только тогда, когда новые параметры не равны спасённым или
                              использовалась кнопка "Применить" с параметрами, не равными спасённым)
                              Если кнопка "Закрыть" вызывает у тебя сложности понимания, вообще
                              создай диалог без неё.
                              Сообщение отредактировано: ЫукпШ -
                                Цитата ЫукпШ @
                                Всё же от тебя зависит.
                                Какую именно логику работы ты желаешь - такую и реализуй.
                                Что именно необходимо сделать по событию "закрыть окно" ?
                                В простейшем случае это эквивалент кнопки "Отмена".
                                Значит, напижем процедуру "OnCancel" и вызовем её из обоих
                                обработчиков.
                                При этом очевидно, что OnCancel это OnApply, но с изначальными
                                (спасёнными перед показом диалога) параметрами...
                                (Но не всегда, а только тогда, когда новые параметры не равны спасённым или
                                использовалась кнопка "Применить" с параметрами, не равными спасённым)
                                Если кнопка "Закрыть" вызывает у тебя сложности понимания, вообще
                                создай диалог без неё.

                                все что ты говоришь правильно, но это всего лишь на бумаге а на практике мы имеем дело с MFC.
                                по тому что ты пишешь я сделал вывод, что ты никогда не писал на MFC верно? :)
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0485 ]   [ 17 queries used ]   [ Generated: 27.04.24, 11:32 GMT ]