(MFC)コンボボックスの値を数値比較
VC++2005のMFCにてアプリケーションを作成しています。
コンボボックス(Ctrl変数:m_xcStMonth)に入力された値の、
正常値入力チェックとして、「1」から「12」までの数値ならtrue、
それ以外の数値及び文字列ならfalseを返す機能を実装したいのですが、
下記プログラムだと、「2」を入力しても、比較関数(1)(2)の戻り値として、
(1)RetMonth1には正常値「1」を返すのですが、
(2)RetMonth2にも誤り値「1」を返してしまいます。
原因として、「2」と「12」を比較した際に、
それぞれ一文字目の「2」と「1」を比較してしまうので、
誤り値を返してしまうようです。
下記が問題のソースコードです。
案1が比較関数にstrcpy_s()を使用した場合、
案2が比較関数CString::Compare()を使用した場合です。
両方において、RetMonth2に誤った戻り値を返しています。
もし何か良い改善策、より効率の良い実装方法などご存知の方おられましたら、
お手数ですが、ご教授お願い致します。
【案1】
CString StMinMonth;
CString StMaxMonth;
StMinMonth.Format( "%d", 1 );
StMaxMonth.Format( "%d", 12 );
CString StMonth;
m_xcStMonth.GetWindowText( StMonth ); // コンボボックスの値を取得
char CmpMonth [ MAX_WORD_SIZE + 1 ] = "";
char CmpMinMonth[ MAX_WORD_SIZE + 1 ] = "";
char CmpMaxMonth[ MAX_WORD_SIZE + 1 ] = "";
strcpy_s( CmpMonth, MAX_WORD_SIZE + 1, StMonth );
strcpy_s( CmpMinMonth, MAX_WORD_SIZE + 1, StMinMonth );
strcpy_s( CmpMaxMonth, MAX_WORD_SIZE + 1, StMaxMonth );
int RetMonth1 = strcmp( CmpMonth, CmpMinMonth ); //(1)
int RetMonth2 = strcmp( CmpMonth, CmpMaxMonth ); //(2)
if( ( RetMonth1 < 0 ) || ( RetMonth2 > 0 ) )
{
return false;
}
return true;
【案2】
CString StMinMonth;
CString StMaxMonth;
StMinMonth.Format( "%d", 1 );
StMaxMonth.Format( "%d", 12 );
CString StMonth;
m_xcStMonth.GetWindowText( StMonth ); // コンボボックスの値を取得
int RetMonth1 = StMonth.Compare( StMinMonth ); //(1)
int RetMonth2 = StMonth.Compare( StMaxMonth ); //(2)
if( ( RetMonth1 < 0 ) || ( RetMonth2 > 0 ) )
{
return false;
}
return true;
お礼
ご教授ありがとうございました。 実は、なかなかできないと悩んでいたのは、 (上記の例文で説明しますと) 別の関数 m_Commbo.AddString( "F3" ) ; 上記関数のあるイベント m_Commbo.SetCurSel(0) ; UpdateData(FALSE); というロジックでして、AddString 「直後」に設定してみたら、成功いたしました。