- ベストアンサー
変数の代入について
ダイアログベースで、ダイアログ1からダイアログ2を開きダイアログ1のエディットボックスのデータをダイアログ2に表示する下記コードを教わりました。 変更後のようにしても問題ないと思いましたが、'dlg' は定義されていない識別子です。とエラーが出ます。 どうしてなのかお教えていただきたいのですが、 よろしくお願いします。 <変更前> CSubDlg dlg2; dlg2.m_strText = strText; dlg2.DoModal(); <変更後> void CSubDlg::OnPaint() { m_strText = dlg.strText; ちなみにdlgはウィザードが作ったコードで、 CMainDlg dlg; m_pMainWnd = &dlg; int nResponse = dlg.DoModal(); ダイアログ1のことだと思うのですが。。。。 ************************** メインダイアログとしてCMainDlgを例にしますが、かなり割愛します。 このダイアログには、Editが貼り付けられているとします。Editコントロールに割り当てたIDをIDC_EDIT_INPUTだと仮定します。 DDXとかのデータ変換を使う方法もありますが、ここでは単にデータを取得します。 // // OKボタンが押された時の処理 // void CMainDlg::OnOK() { // データの取得 CString strText; GetDlgItemText(IDC_EDIT_INPUT, strText); CSubDlg dlg2; dlg2.m_strText = strText; dlg2.DoModal(); } class CSubDlg : pbulic CDialog { public: CString m_strText; // 親から渡される文字列を格納する変数 ・ ・ ・ ・ ・ }; あとは、CSubDlgのOnPaintでテキストを描画します。 void CSubDlg::OnPaint() { // テキストをクライアント領域の中央に描画 CRect rect; GetClientRect(rect); CPaintDC dc(this); dc.TextOut(m_strText, rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); }
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
私が回答した質問なので、コメントしておきます。 以下のコードをよくチェックするとわかると思いますが、 ・CSubDlgクラスには、publicな変数であるm_strTextがある。 ・CMainDlgクラスのOnOK関数は、CSubDlgクラスのインスタンスを生成し、m_strText変数に文字列をセットしている。 ・CSubDlgクラスのインスタンスであるdlg2をモーダルダイアログとして実行している。 void CMainDlg::OnOK() { // データの取得 CString strText; GetDlgItemText(IDC_EDIT_INPUT, strText); CSubDlg dlg2; dlg2.m_strText = strText; dlg2.DoModal(); } CSubDlgのコードを以下のように変更されたようですね。 >このコードを >void CSubDlg::OnPaint() >{ >m_strText = dlg.strText; ここで問題なのは、CSubDlgクラスのインスタンスであるdlg2は、dlgの存在をしらないということです。 また、m_strTextは、CSubDlgクラスのメンバ変数ですが、dlg.strTextのstrTextはCMainDlg::OnOK関数の自動変数(Auto変数)です。 いろいろと確認をされているのだと思いますが、CSubDlgクラスは、m_strTextにセットされた文字列を処理するのであって、セットするのが誰かを意識しないプログラムにした方がいいと思います。
その他の回答 (2)
- gimmick
- ベストアンサー率49% (134/270)
おそらくdlgはアプリケーションクラスのInitInstance()で定義されているローカルオブジェクトだと思います。ローカルオブジェクトですから、外部から見えないのは当然です。dlgをグローバルオブジェクトにすれば > void CSubDlg::OnPaint() > { > m_strText = dlg.strText; のような方法も可能です。もっとも、こんな修正をするより、変更前の方法の方が良いと思います。
お礼
回答ありがとうございます。 >ローカルオブジェクトですから、外部から見えないのは当然です。 言われていることは分かりますが、心情的にdlgさんはdlg2さんをしっているのに、どうして逆は成立しないのって思ってしまいます。
- taka_tetsu
- ベストアンサー率65% (1020/1553)
><変更後> >void CSubDlg::OnPaint() >{ >m_strText = dlg.strText; m_strText = this->strText; もしくは、 m_strText = strText; ですね。 クラスとインスタンスの関係は理解していますか?
お礼
回答ありがとうございます。 >m_strText = this->strText; >もしくは、 >m_strText = strText; どちらも、'strText' が定義されていない識別子です。とエラーが出ました。
お礼
回答ありがとうございます。 後は自分でじっくり考えてみます。