ダイアログでの範囲外の数字の制限 – プログラミング – Home

ダイアログでの範囲外の数字の制限
 
通知
すべてクリア

[解決済] ダイアログでの範囲外の数字の制限

固定ページ 1 / 2

雪
 雪
(@雪)
ゲスト
結合: 18年前
投稿: 28
Topic starter  

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
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

>そのときの最大値
とは?

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


返信引用
雪
 雪
(@雪)
ゲスト
結合: 18年前
投稿: 28
Topic starter  

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


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

初期値の値をどこかに覚えていないと無理でしょうね。
100 ってEditにあっても上書きされてしまうから。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

それで? 何が問題なのですか?
適当なメンバ変数、たとえば m_limit を定義し、

if ( m_bbb < m_limit ) { だめー }

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


返信引用
雪
 雪
(@雪)
ゲスト
結合: 18年前
投稿: 28
Topic starter  

Blueさん、覚えさせ方が不明でした。適当にm_cccを追加してm_bbb = m_cccとしても
m_cccに初期値が入りませんでした。

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


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

>適当にm_cccを追加してm_bbb = m_cccとしても
>m_cccに初期値が入りませんでした。

代入は逆ですよね?

int i, j;

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

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

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


返信引用
雪
 雪
(@雪)
ゲスト
結合: 18年前
投稿: 28
Topic starter  

確かに代入方法は逆でした。

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


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

> if ( m_bbb < m_limit )はわかるのですが、m_limitに初期値を代入する方法がわかり
ません。

…なんで?

m_limit = 100;

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


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

>のように書きましたが。
これでは単にコントロールIDとメンバ変数を紐付けているだけですが?

m_bbb = 100;

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

m_bbb = m_ccc = 100;


返信引用
雪
 雪
(@雪)
ゲスト
結合: 18年前
投稿: 28
Topic starter  

επιστημηさん、
>m_limit = 100;

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

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

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


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

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

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

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

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


返信引用
雪
 雪
(@雪)
ゲスト
結合: 18年前
投稿: 28
Topic starter  

今回は単純に新しく変数追加してそれとの比較をするものでした。
質問下手だったり話下手なのは自覚しています。

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

解決とします。


返信引用
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

> ※の所にブレークポイント置いてm_limitに矢印をもっていっても中身が無いように見

> ていたのですが、実際実行してみるとちゃんと期待通りの動きをしていたので解決しま
> した。

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

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


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

まだ読んでくれている事を祈って

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

例えば、今回の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++言語の勉強を
した方が良いような気もします。


返信引用
固定ページ 1 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました