アプリ版:「スタンプのみでお礼する」機能のリリースについて

WindowsXP
VC++ 6.0

ダイアログのエディットボックスへの入力値チェックにDDVを
使用していますが、チェックに引っかかった時のメッセージを
変更することは出来ないのでしょうか?

例えば、0~99までの数値を入力する場合、
DDV_MinMaxLong(pDX, m_m_lHoge, 0, 99);
としており、100を入力すると
「0から99までの整数を入力してください。」
と表示されます。このメッセージを変更したいのです。

以上、よろしくお願い致します。

A 回答 (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);
といったプロトタイプ宣言をしたほうがいいでしょう

この回答への補足

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()
を直に記述した形になると思います。

補足日時:2008/09/29 16:18
    • good
    • 0

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)だと思います
    • good
    • 0
この回答へのお礼

ありがとうございます!!!

前回の「//}}AFX_DATA_MAP より後ろで」ってのもミソだったのですね。
後ろに持っていかないと ClassWizard が開きませんでした。

「pDX->m_bSaveAndValidate」についても了解しました。

お礼日時:2008/10/01 17:35

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています