VC6.0 C++ WindowsXpの環境です
変数を入れるDialogを設定しています。
そこでEdit欄の変数 short Xにおいて、負値を入れよう"-"とすると
即座に整数をいれてくださいとえらーが出る。
但し、予め整数を入れて その前に"-"を挿入すると
負値として入力できる(受け入れる)
始めから 負値が入れるようにするにはどうしたらよいでしょうか
DDXを使っていると解釈すると
OnChangeXXXX()でUpDatedata()が呼ばれてませんか?
はい そのとおりで
void CParameterDlg::OnChangeEdit1() // for write the changed variable
{
// TODO: これが RICHEDIT コントロールの場合、コントロールは、 lParam マスク
// 内での論理和の ENM_CHANGE フラグ付きで CRichEditCrtl().SetEventMask()
// メッセージをコントロールへ送るために CDialog::OnInitDialog() 関数をオーバー
// ライドしない限りこの通知を送りません。
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
UpdateData(TRUE);
//以下 本Dialog内で計算結果を直に表示する
m_KomaSize = m_ImageSizWidth/m_KomaX_N;
m_M_Max = 1850/m_KomaX_N; // max50x37 as m_koM[]
UpdateView();// ここでParameterSet()の役割
UpdateData(FALSE); // set the final action
}
の如くです。
いかがでしょうか?そのDDXということは ひとつ文字をいれると反応することでしょうか?たしかに 他の変数の場合 444の途中の4で描画設定が反応して 最後の444の数値に入力値になります
すると 機械は−文字と負値とはわかりませんね。なにか 解決はあるでしょうか?
はい そのとおりで
void CParameterDlg::OnChangeEdit1() // for write the changed variable
{
// TODO: これが RICHEDIT コントロールの場合、コントロールは、 lParam マスク
// 内での論理和の ENM_CHANGE フラグ付きで CRichEditCrtl().SetEventMask()
// メッセージをコントロールへ送るために CDialog::OnInitDialog() 関数をオーバー
// ライドしない限りこの通知を送りません。
// 小生にはこの意味不明
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
UpdateData(TRUE);
//以下 本Dialog内で計算結果を直に表示する
m_KomaSize = m_ImageSizWidth/m_KomaX_N;
m_M_Max = 1850/m_KomaX_N; // max50x37 as m_koM[]
UpdateView();// ここでParameterSet()の役割
UpdateData(FALSE); // set the final action
}
の如くです。
いかがでしょうか?そのDDXということは ひとつ文字をいれると反応することでしょうか?たしかに 他の変数の場合 444の途中の4でも
描画設定が反応して 最後の444で期待の入力値になります
すると 機械は−文字と負値とはわかりませんね。なにか 解決はあるでしょうか?
>そのDDXということは ひとつ文字をいれると反応することでしょうか
いやちがいます、DDXとは別な話です
簡単に言うと、コントロールアイテムと結びついた変数(これがDDX)
のことを言ってます。イベント(反応のこと)とは基本的に無関係です。
たしかに符号付き整数ということでメンバー変数を作成したのですから
マイナス符号も受け付けるのが正当かなと思いますが、UpdateData()
をここで(OnChangeXXXX())で動かすとこの様なことが起こりますという
仕様だと思います。(負記号が無ければ実際動きますし・・・・
(間違っているかもしれませんが)
で、ですね、OnKillfocusXXXX()でUpdateData()して計算するということが一番近い手段だと思うのです
これでしたらマイナス値も入れることができます。
でも絶対、OnChangeXXXX()でデータを取って計算したいというのでしたら、
DDX変数を文字列(CString)で宣言し、自分で文字列チェック&整数変換して
計算する。
もしくは
GetDlgItem(ITEM)でじかに文字列を取りこみ、文字列チェック(整数正当性)
後に整数値に変換するという形にするのが良いのかなと思います。
例をちょこっとかいておきますね
xxxx::OnChangeXXXX(){
CEdit *ed = (CEdit *)GetDlgItem(ID_ITEM_XXXX);
CString EdData;
ed->GetWindowText(EdData);
int dat = atoi(EdData);
}
で入力されている今の文字列を見ることができますよ、いろいろありますが、、、、
無論上記ソースはおおざっぱな上検証してないです。
(これじゃ足りないのですけど、まあ違う話になってしまいますから、基本中の基本ということで)
ではでは。
ありがとうございました
ひとまず その変数のみ
OnKillfocusXXXX()でUpdateData()してみます
その結果(不成功)は別の質問で 致したいとおもいます