- ベストアンサー
DDVによるメッセージの変更
WindowsXP VC++ 6.0 ダイアログのエディットボックスへの入力値チェックにDDVを 使用していますが、チェックに引っかかった時のメッセージを 変更することは出来ないのでしょうか? 例えば、0~99までの数値を入力する場合、 DDV_MinMaxLong(pDX, m_m_lHoge, 0, 99); としており、100を入力すると 「0から99までの整数を入力してください。」 と表示されます。このメッセージを変更したいのです。 以上、よろしくお願い致します。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
自前で実装するしかないでしょうね 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); といったプロトタイプ宣言をしたほうがいいでしょう
その他の回答 (1)
- redfox63
- ベストアンサー率71% (1325/1856)
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)だと思います
お礼
ありがとうございます!!! 前回の「//}}AFX_DATA_MAP より後ろで」ってのもミソだったのですね。 後ろに持っていかないと ClassWizard が開きませんでした。 「pDX->m_bSaveAndValidate」についても了解しました。
補足
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() を直に記述した形になると思います。