他クラスのメンバ関数を呼び出すには?

解決


zzz  2006-01-19 03:29:34  No: 60359

CPropertySheetに配置した取消ボタンを押すとCPropertyPage内にあるリストボックスの内容を初期化するプログラムを作っています。

取消ボタンを押したタイミングでCPropertySheetダイアログを持っているクラスのOnBnClickedButton1が動き、そこからアクティブなCPropertyPageクラスに作成した関数を呼び出したいのですが、
コンパイルはエラーなく通り関数自体は呼び出せても、実際に動かすと、CPropertyPageに配置してあるクリアするリストボックスのコントロールと関連付かないようで、プログラムが中断されてしまいます。

どのようにすればいいか、ご教授宜しくお願いします。


REE  2006-01-19 04:12:50  No: 60360

方向性は合っていると思います。

あなたは具体的にどのように実装したのですか?

また、「プログラムが中断されてしまいます」の中断される場所も示してください。


zzz  2006-01-19 18:54:46  No: 60361

CPropertySheetを持つCDialogクラス(ここが根本的に違うのでしょうか?)から

void CSfxEstSpecView::OnBnClickedButton2()
{
    // TODO : ここにコントロール通知ハンドラ コードを追加します。
    CPropertyPage1 m_pPage1;
    m_pPage1.ListBoxClear();
}

CPropertyPageの下記の関数を呼び出します。

void CMoveList::ListBoxClear(void)
{
    int i, idx=0;
    CString str;

    //リストボックスから全ての項目を削除
○  m_List1.ResetContent();
○  m_List2.ResetContent();

    //初期登録
    for (i=1; i<30; i++) {
        str = m_SysData[0].DispField[i][3];
        if (str == "")   continue;
        if (m_SysData[0].DispField[i][0] == "0") {
○          m_List1.AddString (str);
○        m_List1.SetItemData (idx, idx);
        }
        else {
○        m_List2.AddString (str);
○        m_List2.SetItemData (idx, idx);
        }
        idx++;
    }
}

m_List1, m_List2はそれぞれCPropertyPage内に配置した2つのリストボックスのコントロールです。
中断されるのは行頭にコントロールを使った全ての箇所(行頭に○)で、
下記が中断メッセージです。

Debug Assertion Failed!

For information on how your program can cause an assertion
failure, see the Visual C++ documentation asserts.


REE  2006-01-19 19:47:53  No: 60362

よくあるパターンですね。

>    CPropertyPage1 m_pPage1;

新しいインスタンスを作っています。
これは表示されているのとは違うものです。

それに対して、操作しようとしても、表示されているページには影響がありません。

#  int i,j=0; i=1; でjが1にならないのと同じ理由

実際には、このm_pPage1はまだウィンドウになっていないため、
「Debug Assertion Failed」で落ちます。

対策としては、実際に表示しているインスタンスを取得し、
それに対して、ListBoxClearを実行してください。


REE  2006-01-19 20:04:01  No: 60363

>対策としては、実際に表示しているインスタンスを取得し、

CPropertySheet::GetActivePageが使えそうですね。
その場合、他のページを選択していても大丈夫なように、
キャストは慎重に行ってください。


zzz  2006-01-19 20:11:17  No: 60364

>実際に表示しているインスタンス
これはSDIなどではGetActiveView()になるのですよね?

void CSfxEstSpecView::OnBnClickedButton2()
{
    // TODO : ここにコントロール通知ハンドラ コードを追加します。
    CPropertyPage1 * m_pPage1 = (CPropertyPage1*)GetActiveView();
    m_pPage1->ListBoxClear();
}

この場合は

CPropertySheet*  m_pSheet;

void CSfxEstSpecView::OnBnClickedButton2()
{
    // TODO : ここにコントロール通知ハンドラ コードを追加します。
    CPropertyPage1 * m_pPage1 = (CPropertyPage1*)m_pSheet->GetActivePage();
    m_pPage1->ListBoxClear();
}

といったようになるのでしょうか?
これではエラーが出ます。


REE  2006-01-19 22:18:53  No: 60365

>これではエラーが出ます。

エラーが出る時には、そのエラーの内容を具体的に書いてください。
※これは、今回に限らず質問する時の鉄則です。

m_pSheetには、正しい値が設定されていますか?

また、m_はメンバ変数だということを示すため接頭語なので、
メンバー変数でないものにm_をつけるのをやめましょう。


Toshi  2006-01-19 22:21:15  No: 60366

取り合えず質問するときは環境を書く習慣をつけましょう。
VCのバージョンや使用OS(ターゲットOS)など。
それと、エラーが出た場合はどう言うエラーが出るのかも書くのが普通です。
恐らく、キャストの仕方が間違ってるよってエラーだとは思いますが。


zzz  2006-01-19 23:05:13  No: 60367

すみませんでした。自己解決しました。
ご指摘のこと、以後気をつけます。

ヘッダーの方で
CPropertyPage1*  m_page1
を定義することによって解決しました。
ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加