2009-04-13 22 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は、それがm_value <1はfalseを返しますとm_valueに設定されることはありませんので、もしチェック...削除された後も、まだ20ですDEFAULT_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

これは多くの場合に機能しますが、OnEnChangeNumericBox()がm_valueが変更される唯一の場所ではない可能性があるため、DoDataExchange()関数内ですべてのデータ交換と検証を行うのが最善の方法です。たとえば、m_valueをプリセット値に変更するラジオボタンがある場合です。 –

+0

良い点ですが、一般的にはDoDataExchange()関数がバリデーションを行うのに最適な場所です...私の例は少し例外です。 – Kiril

0

この1つは私

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

関連する問題