Dialogで負値の値を入れるには?

解決


はんにゃ  URL  2011-03-03 19:08:57  No: 72401  IP: [192.*.*.*]

VC6.0 C++ WindowsXpの環境です
変数を入れるDialogを設定しています。
そこでEdit欄の変数 short  Xにおいて、負値を入れよう"-"とすると
即座に整数をいれてくださいとえらーが出る。
但し、予め整数を入れて  その前に"-"を挿入すると
負値として入力できる(受け入れる)
始めから  負値が入れるようにするにはどうしたらよいでしょうか

編集 削除
眞鋳  2011-03-03 23:36:53  No: 72402  IP: [192.*.*.*]

DDXを使っていると解釈すると
OnChangeXXXX()でUpDatedata()が呼ばれてませんか?

編集 削除
はんにゃ  URL  2011-03-04 07:43:11  No: 72403  IP: [192.*.*.*]

はい  そのとおりで
  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の数値に入力値になります
すると  機械は−文字と負値とはわかりませんね。なにか  解決はあるでしょうか?

編集 削除
はんにゃ  URL  2011-03-04 07:47:24  No: 72404  IP: [192.*.*.*]

はい  そのとおりで
  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で期待の入力値になります
すると  機械は−文字と負値とはわかりませんね。なにか  解決はあるでしょうか?

編集 削除
眞鋳  2011-03-04 21:06:28  No: 72405  IP: [192.*.*.*]

>その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);
}
で入力されている今の文字列を見ることができますよ、いろいろありますが、、、、
無論上記ソースはおおざっぱな上検証してないです。
(これじゃ足りないのですけど、まあ違う話になってしまいますから、基本中の基本ということで)

ではでは。

編集 削除
はんにゃ  URL  2011-03-05 16:45:21  No: 72406  IP: [192.*.*.*]

ありがとうございました
ひとまず  その変数のみ
OnKillfocusXXXX()でUpdateData()してみます
その結果(不成功)は別の質問で  致したいとおもいます

編集 削除