ダイアログでの範囲外の数字の制限

[戻る]
2007/01/10(水) 10:37:17
Windows XP、Visual Studio2005、MFCです。

void DlgXXXX::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);    
    DDX_Text(pDX, IDC_AAA, m_aaa);
    DDX_Text(pDX, IDC_BBB, m_bbb);
}
ダイアログ画面にエディットコントロール二つ(IDはそれぞれ、IDC_AAA, IDC_BBB)、OK
ボタンが一つあり、エディットコントロールの初期表示は1, 100になっています。

void DlgXXXX::OnOK()
{
    UpdateData();

    if (m_aaa < m_bbb && m_bbb < 101){

        CDialog::OnOK();
    }

    else  {
        AfxMessageBox("範囲外");
        GotoDlgCtrl(GetDlgItem(IDC_AAA));
        return;
    }

    CDialog::OnOK();
}
エディットコントロールの数字を変更してOKボタンを押すのですが、m_bbbが101以上は
受け付けないように一応設定したのですが、m_bbbは常に100というわけではないので
m_bbbにその時の最大値以上入力されたら「範囲外」のメッセージボックスが表示される
ようにしたいです。

Blue 2007/01/10(水) 10:59:45
>そのときの最大値
とは?

m_bbbのこと?
というか、100だったら100が最大値?200だったら200が最大値?
だったら、m_bbbが最大値を超えることってあるの?

2007/01/10(水) 11:05:01
初期表示された数字が最大値です。上記の例では100。
m_bbbに入っている初期表示の値を超える値、上記の例では101以上が入力された時にメ
ッセージボックスが表示されるようにしたいです。

Blue 2007/01/10(水) 11:10:17
初期値の値をどこかに覚えていないと無理でしょうね。
100 ってEditにあっても上書きされてしまうから。

επιστημη [HomePage] 2007/01/10(水) 11:12:46
それで? 何が問題なのですか?
適当なメンバ変数、たとえば m_limit を定義し、

if ( m_bbb < m_limit ) { だめー }

ってやるダケじゃなくて?

2007/01/10(水) 11:19:47
Blueさん、覚えさせ方が不明でした。適当にm_cccを追加してm_bbb = m_cccとしても
m_cccに初期値が入りませんでした。

επιστημηさん、if ( m_bbb < m_limit )はわかるのですが、m_limitに初期値を代入す
る方法がわかりません。

Blue 2007/01/10(水) 11:23:26
>適当にm_cccを追加してm_bbb = m_cccとしても
>m_cccに初期値が入りませんでした。
?
代入は逆ですよね?

int i, j;

i = 0;
j = i; // i = j; ではないですよね?


メンバ変数を1つ用意して、OnInitDialogで初期値を代入しておくとか。


そもそも、VS2005の場合どうやってEditに初期値を持たせているんだっけ?
(プロパティウィンドウ?)
VC6しか手元にないから検証も出来ない。

2007/01/10(水) 11:32:16
確かに代入方法は逆でした。

>そもそも、VS2005の場合どうやってEditに初期値を持たせているんだっけ?
自分の場合はダイアログのリソースから変数を追加して
void DlgXXXX::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);    
    DDX_Text(pDX, IDC_AAA, m_aaa);
    DDX_Text(pDX, IDC_BBB, m_bbb);
}
のように書きましたが。

επιστημη [HomePage] 2007/01/10(水) 11:35:50
> if ( m_bbb < m_limit )はわかるのですが、m_limitに初期値を代入する方法がわかり
ません。

…なんで?

m_limit = 100;

こんだけのことじゃないのですか?

Blue 2007/01/10(水) 11:38:39
>のように書きましたが。
これでは単にコントロールIDとメンバ変数を紐付けているだけですが?


m_bbb = 100;

みたいな記述はないのか?というのを聞きたいのですけど。
それがあればついでに m_ccc にも入れればいいだけだと。

m_bbb = m_ccc = 100;

2007/01/10(水) 11:57:27
επιστημηさん、
>m_limit = 100;

>こんだけのことじゃないのですか?

今回の場合は初期値の100という値が一定ではなく変化するので
m_limit = 100;
のようにその時の初期値を代入するのではなく、初期値が変化してもいいような書き方
を聞いていました。

Blueさん、
変数m_limitを新たに追加して
m_bbb = m_limit = 100;//※
のようにして解決しました。
※の所にブレークポイント置いてm_limitに矢印をもっていっても中身が無いように見え
ていたのですが、実際実行してみるとちゃんと期待通りの動きをしていたので解決しま
した。

επιστημη [HomePage] 2007/01/10(水) 12:04:35
>> m_limit = 100;
>> こんだけのことじゃないのですか?
>
> 今回の場合は初期値の100という値が一定ではなく変化するので
> m_limit = 100;
> のようにその時の初期値を代入するのではなく、初期値が変化しても
> いいような書き方を聞いていました。

はぁ? 初期値を外から与えるのであれば、

http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200701/07010014.txt
↑こいつで解決したんじゃないんですか?

# 質問ヘタすぎ。何がわからんのか伝わらん。

2007/01/10(水) 13:06:57
[[解決]]
今回は単純に新しく変数追加してそれとの比較をするものでした。
質問下手だったり話下手なのは自覚しています。

それでも自分なりに考えた結果の質問の仕方だったので‥。すいません。

解決とします。

たいちう 2007/01/10(水) 13:12:18
> ※の所にブレークポイント置いてm_limitに矢印をもっていっても中身が無いように見> ていたのですが、実際実行してみるとちゃんと期待通りの動きをしていたので解決しま
> した。

もしかしてデバッガの使い方の問題かも。
ブレークポイントで止まったときは、まだその行が実行されてないので、
m_limitが、ごみデータだったのでは?
この直後に『F10』を押して1行実行すると、代入が確認できると思う。
(2005を持ってないですが、多分ステップ実行は『F10』でしょう)

# そばで教えてくれる人がいれば、これも全然難しくないことなんですけどね。
# 苦労する分、きっと上達しますよ。

PATIO 2007/01/10(水) 13:48:44
まだ読んでくれている事を祈って

上限値が可変であるとしてもどこかで数値を設定する必要がある事は
自明の理だと思います。では、その数値は何処で設定するのか?
これが前提条件として指定されていない為、話がぼやけてしまっていると思います。
何処からともなく湧いてくる数値と言うのはありませんからね。

例えば、今回のDlgXXXXの外で値が決定されてDlgXXXXに与えられるので
あれば、DlgXXXXにその値を受け取る為の仕組みが必要でしょう?
タイミングは何処であろうと設定する必要は必ず出てきます。

なのでDlgXXXXの中でわからないのであれば、DlgXXXXにpulicなメンバー変数
m_limitを追加した上で、DlgXXXXのインスタンスを作成するところか、
もしくはDlgXXXXを表示する前のタイミングでやはり設定する必要があります。

DlgXXXXのインスタンスがdlgという変数名だったとすると
dlg.m_limit = 100;
と言ったようなコードはどこかに書かなくてはならないわけです。
ユーザーが入力した値が上限値になるならその値を保持している変数を使って
dlg.m_limit = m_upper;(m_upperは入力された値を保持している変数)
といったコードが必要です。

一旦設定されてしまえば、以降はm_limitを使って処理を進めて行けばよいわけで
m_bbb = m_limit;とかすれば、処理はいかようにもできますよね。

どうもクラスとかの概念が良くわかっていないのではないかと言う気がしますが、
C++言語の勉強をきちんとされた事はありますか?
いきなりウインドウを出すようなプログラムをMFCでやろうとするよりも
ウインドウを出さないコンソールプログラムでMFCを使わずに純粋にC++言語の勉強を
した方が良いような気もします。

PATIO 2007/01/10(水) 13:55:53
追伸。

m_limitがDlgXXXXの外で設定される事を条件にするのであれば、
DlgXXXXの中では設定されているものとしてコードを書けばよいだけの話です。
未設定で動かされてしまう事を恐れるのであれば、m_limitにデフォルト値を設定しておく
と言う方法も考えられますよね。
デフォルト値でOKなら設定せずに表示しても意図通りに動く事になりますし。
とにかく、設定すべき数値が湧いて出てくるわけでは無いので
出所が何処なのかと言うのは設計時に決めておかないと駄目です。
ころころ変わるようなものではないなら、定数定義をしておくと
後からの変更が楽になります。
この辺もC++言語の入門書に書いてある範囲だと思うので自信が無いのであれば、
VC++ではなくてC++言語の入門書を勉強される事をお勧めします。

2007/01/10(水) 16:55:51
やはり、ブレークポイント使ってm_limitの中身は確認できませんでした。『F10』使っ
てステップして、デバッグ中に別窓で表示するようにしている「自動変数」にもm_bbbし
か表示されていないようです。
この点に関しては実行時にはきちんとif文で判定されているので追及してみたいと思い
ます。
もっと苦労して困難な時もありますが、自分で解決できるようにしていきたいです。



>例えば、今回のDlgXXXXの外で値が決定されてDlgXXXXに与え>られるのであれば、
DlgXXXXにその値を受け取る為の仕組みが>必要でしょう?

確かに外部から値を受け取っていますので、その操作はありました。言われているとお
り、一旦設定すれば後は自在に使えますね。
クラスもまだまだ理解の途中で、このクラスは印刷するものとか、このクラスはダイア
ログの表示等、それぞれのクラスのつながりが理解不足している所です。

C++の学習から進めていきたいです。
良いサイト等あれば幸いです。

たいちう 2007/01/10(水) 17:43:36
> やはり、ブレークポイント使ってm_limitの中身は確認できませんでした。

以前の質問のSQLの時と似たような現象だったのでしょうか。
何かちょっとした勘違いをされているのだと思いますが。


> C++の学習から進めていきたいです。
> 良いサイト等あれば幸いです。

他にいくらでも見つかると思いますが、、、

ロベールのC++教室
http://www1.kcn.ne.jp/~robe/cpphtml/mainmenu.html

PATIO 2007/01/11(木) 14:35:35
サイトも良いですが、じっくり勉強するなら書籍を購入する事を
お勧めします。専門書になるので値段は雑誌に比べて高いですが、
良書を手元においておくと反復学習が手軽にできるので良いと思いますよ。
なによりネット環境が無くても勉強できますしね。

2007/01/12(金) 16:17:12
たいちうさん、学習させてもらいます。

PATIOさん、本は高いですけど、学習はよくできると思います。

古いスレッドには追加発言できません。