none
クラスのメンバ関数からフォームのlistBoxに文字列を追加する方法について RRS feed

  • 質問

  • どうも、こんにちわ。

    VC++の初心者です。

     

    クラスのメンバ関数を作りまして、

    その関数内からフォームのlistBoxに文字列を追加しようと

    したのですが、うまくいきません。

     

    環境は、

    WinXP sp2

    VS 2005

    VC++ ver8.0

     

    MFCアプリケーション/ダイアログベースを選択。

     

    //.hソースコード

    class myCla1 : public CmyClass1Dlg
      {
      public:
          void hyouji();
      };

     

    //.cpp

    void myCla1::hyouji()
     {
        m_list1.AddString(L"商品B");
      }

     

    単に継承にしただけなのですが、

    ビルドは通りました。

    実際にメンバ関数を呼び出して表示する段階で

    エラーメッセージボックスが表示され、listBoxに

    文字列を追加することができません。

     

    エラーメッセージボックスは、

    タイトルバーがDebug Library

    メッセージ内容は、

    Debug Assertion Failed!

     

    Program:

    File:

    Line: 727

     

    For information on how your program can cause an assertion

    failure, see the Visual C++ documentation on asserts.

     

    (Press Retry to debug the application)

     

    と表示されています。

     

     

    ご教授のほど、よろしくお願いします。

     

     

     

    2007年5月18日 7:24

すべての返信

  • どのタイミングで追加しようとしていますか?

    コントロール変数の場合、ダイアログが表示している状態でないと
    出来ません。

    このようなことは出来ない。

    CMyDlg dlg;

    dlg.m_list.AddString(_T("ほげ")); //NG!
    dlg.DoModal();



    それと、アサートのときに表示される文章はあまり重要ではありません。
    重要なのはそこに示されているソースコードとその行の位置です。

    デバッグモードであれば、再試行のボタンを押すことで、ASSERTの行に
    飛べるはずですので、その内容を載せるべきでしょう。

    おそらく、前述のとおり、OnInitDialogを通っていない場合
    該当行は ASSERT(::IsWindow(m_hWnd)); でしょう。
    2007年5月18日 7:37
  • ご回答、ありがとうございます。

     

    そうですね、確かに該当行は

     { ASSERT(::IsWindow(m_hWnd)); return (int):Tongue TiedendMessage(m_hWnd, LB_ADDSTRING, 0, (LPARAM)lpszItem); }

    です。

     

    メンバ関数は、フォームを表示した後に、フォームに設置したボタンをクリックした際に

    呼び出してみてはいるのですが。

    やはりメンバ関数内は変数などの処理だけにして、

    フォームの操作は、メンバ関数内ではしないのが

    よろしいですかね。

     

     

     

     

    2007年5月18日 14:42
  • そもそも、自作ダイアログを継承したダイアログを使うってことは普通はしないんじゃないかと思います。
    (そのような場面に短い経験上ですが出くわしたことがない。
    ダイアログリソースの共有ならないことはなさそうですけど。)

    どうやって、継承したダイアログを作成しましたか?
    そのダイアログクラスに
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV サポート
    という関数がありませんか?
    あって、その定義でCDialog:Big SmileoDataExchangeを呼んでいませんか?
    (継承元のダイアログクラスのDoDataExchangeを呼ばないといけない。
    コントロール変数を継承したクラスが追加していないのであれば、
    virtualですから、関数の宣言/定義ごと削除する)

    それか、コントロール変数を使わないで、GetDlgItemをつかってコントロールを
    操作するか。


    ちなみに、MFCではフォームではなくダイアログと呼ぶのが一般的でしょう。

    2007年5月18日 15:18