Событие числовой проверки CEdit C ++ MFC - PullRequest
4 голосов
/ 13 апреля 2009

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

Вот ситуация:
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.
}

Ответы [ 3 ]

8 голосов
/ 13 апреля 2009

Получаемое вами сообщение приходит из процедур проверки данных, а не из процедур обмена данными. Возможно, в 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 голосов
/ 22 февраля 2010

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

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 голосов
/ 13 апреля 2009

Намек Джона Диблинга привел меня к этому решению:


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

ЕДИНСТВЕННАЯ проверка, которую я действительно должен был сделать, состоит в том, чтобы проверить, что блок содержит значение, поскольку фактическая числовая проверка уже обрабатывается блоком. Пользователь не может ввести нечисловое значение, но он может удалить существующее, так что это была ситуация, которую было трудно обработать в функции обмена данными, и мне пришлось «взломать» событие OnChange.

...