• ベストアンサー

DDVによるメッセージの変更

WindowsXP VC++ 6.0 ダイアログのエディットボックスへの入力値チェックにDDVを 使用していますが、チェックに引っかかった時のメッセージを 変更することは出来ないのでしょうか? 例えば、0~99までの数値を入力する場合、 DDV_MinMaxLong(pDX, m_m_lHoge, 0, 99); としており、100を入力すると 「0から99までの整数を入力してください。」 と表示されます。このメッセージを変更したいのです。 以上、よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

自前で実装するしかないでしょうね DDV_MinMaxLongはMFCのソースのDlgData.cppに実装されています このコードを元に自前の DDV_MinMaxLong2などを定義して メッセージマップの DDV_MinMaxLong(pDX, m_m_lHoge, 0, 99); をコメントアウトして //}}AFX_DATA_MAP より後ろで DDV_MinMaxLong2(pDX, m_m_lHoge, 0, 99); と記述します DDV_MinMaxLongは minValとmaxValとValueの関係をチェックして 条件を満たさない場合に _AfxFailMinMaxWithFormat を呼んでいます _AfxFailMinMaxWithFormatは 引数の minVal,maxValをlpszFormatで文字列化して nIDPromptで登録されているリソースにより エラーメッセージを表示しています 最後に pDXのFailメンバーを呼んで ダイアログの終了またはフォーカスの移動をキャンセルするといった動きになります 単純に"Error"と表示するメッセージボックスを出すだけなら void AFXAPI DDV_MinMaxInt2(CDataExchange* pDX, int value, int minVal, int maxVal) {   if( value < minVal || value > maxVal ) {     // このAfxMessageBoxの引数を適当な物に置き換えてください     AfxMessageBox( "Error" );     pDX->Fail();   } } といった具合でしょう ダイアログクラスのヘッダーファイルのクラス定義の外で void AFXAPI DDV_MinMaxInt2(CDataExchange* pDX, int value, int minVal, int maxVal); といったプロトタイプ宣言をしたほうがいいでしょう

happy10429
質問者

補足

MFCの中を追っていって見ていたのですが、単純に値をチェックして Fail()をコールしているだけみたいなので、 void CHoge::DoDataExchange(CDataExchange* pDX) { DDX_Text(pDX,IDC_EDIT_HOGE,m_lHoge); if ((pDX->m_bSaveAndValidate!=0)&&((m_lHoge<0)||(99<m_lHoge))) { AfxMessageBox( _T("入力値エラーです。") ); pDX->Fail(); } //DDV_MinMaxLong(pDX,m_lHoge,1,99); } といった実装は正しいのでしょうか? m_bSaveAndValidateは値の読み取りの方向として入れてあります。 チェック箇所はそう多くないので、redfox63様のDDV_MinMaxInt2() を直に記述した形になると思います。

その他の回答 (1)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

if ((pDX->m_bSaveAndValidate!=0)&&((m_lHoge<0)||(99<m_lHoge))) は少し手直しが要るようです (pDX->m_bSaveAndValidate!=0)はDialog->変数の方向だけのチェックに限定となります 本来なら双方向でチェックは利かないといけないかと … Dialogの初期化時とデータ変更時と UpdateData(FALSE); でメンバー変数への設定をコントロールへ渡す場合も考えられますよ 1 to 99の範囲なら (m_lHoge<1)||(99<m_lHoge)だと思います

happy10429
質問者

お礼

ありがとうございます!!! 前回の「//}}AFX_DATA_MAP より後ろで」ってのもミソだったのですね。 後ろに持っていかないと ClassWizard が開きませんでした。 「pDX->m_bSaveAndValidate」についても了解しました。