2009-04-13 6 views
3

У меня есть текстовое поле CEdit, которое является частью панели свойств и допускает только числовые значения (положительные целые числа). Ящик отлично работает, когда люди вводят нечисловые значения, но когда они удаляют значение в окне, появляется сообщение: «Пожалуйста, введите положительное целое число».Событие числовой проверки CEdit C++ MFC

В ситуации:
1. У меня есть номер (скажем, 20) в коробке.
2. Я удаляю номер.
3. Я получаю диалоговое окно с ошибкой.
Может ли кто-нибудь сказать мне, как я могу перехватить это событие и поместить в него значение по умолчанию?

Вот что моя собственность панель выглядит следующим образом:


const int DEFAULT_VALUE = 20; 

class MyPropertyPane:public CPropertyPane 
{ 
    //.... 
private: 
    CEdit m_NumericBox; 
    int m_value; 

    //.... 
public: 
    afx_msg void OnEnChangeNumericBox(); 

    //.... 
} 
void MyPropertyPane::MyPropertyPane() 
{ 
    // Set a default value 
    m_value = DEFAULT_VALUE; 
} 

//.... 
void MyPropertyPane::DoDataExchange(CDataExchange* pDX) 
{ 
    DDX_Control(pDX, IDC_NUMERIC_BOX, m_NumericBox); 

    // this sets the displayed value to 20 
    DDX_Text(pDX, IDC_NUMERIC_BOX, m_value); 
} 

//.... 
void MyPropertyPane::OnEnChangeNumericBox() 
{ 
    // Somebody deleted the value in the box and I got an event 
    // saying that the value is changed. 

    // I try to get the value from the box by updating my data 
    UpdateData(TRUE); 

    // m_value is still 20 although the value is 
    // deleted inside the text box. 
} 

ответ

7

сообщение вы получаете приходит от процедуры проверки данных, а не обмен данных рутин. Существует, вероятно, вызов, как это в DoDataExchange():

void MyPropertyPane::DoDataExchange(CDataExchange* pDX) 
{ 
    DDX_Control(pDX, IDC_NUMERIC_BOX, m_NumericBox); 
    DDX_Text(pDX, IDC_NUMERIC_BOX, m_value); 
    DDV_MinMaxInt(pDX, m_value, 1, 20); // if the value in m_value is outside the range 1-20, MFC will pop up an error dialog 
} 

Вы можете решить эту проблему путем удаления встроенного проверки данных MFC и добавить свои собственные:

void MyPropertyPane::DoDataExchange(CDataExchange* pDX) 
{ 
    DDX_Control(pDX, IDC_NUMERIC_BOX, m_NumericBox); 
    DDX_Text(pDX, IDC_NUMERIC_BOX, m_value); 

    if(m_value < 1 || m_value > 20) 
    { 
     m_value = DefaultValue; 
    } 
} 
+0

Но m_value еще 20, даже после того, как он был удален ... поэтому проверка если m_value <1 вернет ложь и m_value не будет установлен в ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ. Во время события OnChange появляется всплывающая ошибка «Пожалуйста, введите положительное целое число». – Kiril

+0

На самом деле исправление .. в DoDataExchange он даже не прошел мимо DDX_Text (pDX, IDC_NUMERIC_BOX, m_value), поэтому он даже не попал бы в код проверки. – Kiril

0

намек Джона Dibling привел меня к этому раствору:


void MyPropertyPane::OnEnChangeNumericBox() 
{ 
    UpdateData(TRUE); 
    CString value; 
    m_NumericBox.GetWindowText(value); 
    if(value.IsEmpty()) 
    { 
     m_value = DEFAULT_VALUE; 
     UpdateData(FALSE); 
    } 
} 

ТОЛЬКО проверки, что я действительно должен был сделать, это проверить, что поле содержит значение, так как фактическая цифровая проверка уже обрабатывается поле. Пользователь не может вводить нечисловое значение, но они могут удалить существующий, так что это была ситуация, с которой было трудно справиться в функции обмена данными, и мне пришлось «взломать» событие OnChange.

+0

Это работает во многих случаях, но часто лучше всего выполнять обмен и проверку данных в функции DoDataExchange(), поскольку OnEnChangeNumericBox() может быть не единственным местом, где изменено значение m_value. Например, если у вас есть переключатель, который изменяет значение m_value на заданные значения. –

+0

Хорошая точка, в общем, функция DoDataExchange(), вероятно, является лучшим местом для проверки. Мой пример - это немного исключение. – Kiril

0

Это один работал для меня

void CtimersDlg::OnEnChangeInterval() 
{ 
    CString value; //or use char * 
    CWnd *pWnd = GetDlgItem(IDC_INTERVAL);//IDC_EDITBOX 

    if(pWnd) 
    { 
     pWnd->GetWindowTextW(value); 
    } 

    int i = _wtoi(value); //if char * use _atol() 
    if((!value.IsEmpty())&& (i)) //To check i = 0 or 00 entered or not 
     UpdateData(TRUE); 
} 
+0

Как пользователь может ввести 0? – sergiol

Смежные вопросы