コントロール変数が使えない


初心者  2008-07-10 11:34:36  No: 68682  IP: 192.*.*.*

こんにちわ。またまたわからないことが出てきましたので教えてください。

環境はWindowsXP、VisualC++2005、MFC、ダイアログベースです。

エディットボックスのコントロール変数をm_editとします。

OnInitDialog関数で初期値を書き込み、画面に表示させます。
(main画面からの直接入力も可)

で、ボタンが押されたら入力値を読み込み、別のエディットに表示をさせています。
単純なことで今まではこれができていたのですが、なぜかひとつだけできません。
ボタン押し関数に入った時点で、m_editのhWndが0x00000000となっていて、
そこでエラーが起きてしまいます。

コンパイルは通りますし、他のところではうまくいっているので良いと思うのですが、何か考えられる原因はありますか?

よろしくお願いします。

編集 削除
そだ  2008-07-10 13:02:54  No: 68683  IP: 192.*.*.*

ボタン押す前はm_edit.hWndにきちんと値が入っているのでしょうか。
例えばOnInitdialogとか。
ソースコードがあるともっと意見が出しやすいです。

編集 削除
初心者  2008-07-10 15:17:32  No: 68684  IP: 192.*.*.*

現在は入力された文字を表示しようとしてます。

OnInitDialogではちゃんと値が入っているので、
現在はグローバルなhWnd変数を作って、OnInitDialogでm_editのアドレスを格納しておき、それを使って入力値を読み込むという何とも怪しいことをやっています。

やりたいことは現在の文字列を取得して、それに新しい文字列を連結して再表示しています。

void CHoge::set_edit(CStirng ss_new)
{
  CString ss;

  m_edit.GetWindowText(ss);
  ss += ss_new;
  m_edit.SetWindowText(ss);
}

これをやろうとするとm_editのところでエラーが起こります。

編集 削除
maru  2008-07-10 16:51:06  No: 68685  IP: 192.*.*.*

単にm_editを作成しているときのコントロールIDが間違っているだけでは?

編集 削除
rin  2008-07-10 17:46:44  No: 68686  IP: 192.*.*.*

ボタン押下のメッセージを受け取るところから
CHoge::set_editを呼び出すところまでのソースも出せますでしょうか?

#ちと気になるのがCHogeクラス
#MFC・ダイアログベースをウィザードで作ると、
#名称+Dlgと名称+Appの2つになるはず
#するとCHogeクラスは独自追加だろうが、
#そこにm_editをどうやって引き渡してるんだろうか?

編集 削除
初心者  2008-07-11 13:16:36  No: 68687  IP: 192.*.*.*

■maruさん
IDはあってます。OnInitDialog関数内では使用できていますし。。。


■rinさん

メインダイアログからここでいうHogeダイアログを開いているんですが、
メインのOnInitDialogで

  m_hoge.Create(IDD_HOGE_DIALOG, GetDesktopWindow());
  m_hoge.SetpWnd(this);

でフォームを作成し、(メインのヘッダーでCHoge m_hoge;)
メインで開くときに

  m_hoge.ShowWindow(SW_NORMAL);

で開いています。

そしてHOGEダイアログ上のボタンを押すと、
文字列を追加するようになっています。(前回記述部分)
他のところは同じようにやってうまくいってるんですが、、、

的を得ていない回答でしたらすいません。

編集 削除
初心者  2008-07-11 13:19:27  No: 68688  IP: 192.*.*.*

連チャンでごめんなさい。

SetpWndはこんな感じで作ってあります。

void CHoge::SetpWnd(CDialog *pWnd)
{
  m_pWnd = pWnd;
}

よろしくお願いします。

編集 削除
maru  2008-07-12 15:34:55  No: 68689  IP: 192.*.*.*

rinさん
> #そこにm_editをどうやって引き渡してるんだろうか?

> 現在はグローバルなhWnd変数を作って、OnInitDialogでm_editのアドレスを格納しておき、それを使って入力値を読み込むという何とも怪しいことをやっています
と書いてあります。
# 普通はこんなことはやらないので、こういう疑問がわいたのでしょうが,,,


> IDはあってます。OnInitDialog関数内では使用できていますし。。。
じゃあ、m_editがCHogeのメンバー変数にも宣言されているのでは?

初心者さんの説明は、主語が省略されているので、状況が非常に分かりにくい。
メインのダイアログにどういうコントロールがあり、メインから起動されるダイ
アログボックスにどういうコントロールがあって、各々のコントロールを操作し
た時に、どのダイアログのどのコントロールをどのように操作するか、というこ
とを自分で整理してみてください。
整理が付けば、各々のコントロールにどういうコントロール変数を割り付けるか
を考えてプログラムすれば、目的の動作が実現するはずです。ただ、コントロー
ル変数の割り当て(宣言)は各々のスコープを意識して行なわないと、同じ物を
指していなければならないので、別々の変数になってしまったり、逆に、別々の
変数が同じ物を指してしまったりするので、注意が必要です。
この辺はC++が分かっていないと難しいかもしれない。

編集 削除
rin  2008-07-12 18:39:15  No: 68690  IP: 192.*.*.*

ダイアログは2つあったのですね
そうなるといくつか疑問が
・確認した「OnInitDialog」とはどっちのか?
・エディットボックスはどっちにあるのか?
・m_editは、どっちのダイアログのメンバ変数なのか(それとも別か)?
・「現在はグローバルなhWnd変数を作って」これはなんのためでしょう?


>> 現在はグローバルなhWnd変数を作って、OnInitDialogでm_editのアドレス
>を格納しておき、それを使って入力値を読み込むという何とも怪しいことを
>やっています
>と書いてあります。

グローバルなのは、hWndであって、m_editではないですよね

>void CHoge::set_edit(CStirng ss_new)
>{
>  CString ss;
>  m_edit.GetWindowText(ss);
>  ss += ss_new;
>  m_edit.SetWindowText(ss);
>}
この書き方では、m_editは、CHogeのメンバ変数だと思うのですが・・

================
ダイアログ上のエディットボックスのウィンドウハンドルを
グローバル変数に入れて保管しておき
CHogeのメンバ変数m_editに、ハンドルをつっこんで操作しようとしてる
================
とかやってるのではないかなぁ・・・と

編集 削除
rin  2008-07-12 18:41:45  No: 68691  IP: 192.*.*.*

コピペ

なのに、m_editのhWndがNULLになってるわけだから、
何をしてCHogeに引き渡したつもりになってるのかな?と疑問になって
#そこにm_editをどうやって引き渡してるんだろうか?

編集 削除
そだ  2008-07-14 03:21:26  No: 68692  IP: 192.*.*.*

似たようなことをやってらっしゃるページがあるからもう投げていいだろうか。
特にEditBoxの派生クラスを使いたいとかそいうのがなければそんなややこしい話じゃ
ないはずだ。

http://www.g-ishihara.com/mfc_ed_01.htm

編集 削除