モードレスについて

[戻る]
Gt 2006/05/10(水) 13:23:33
こんにちは、Gtです。

モードレスから別のクラスのデータを取得したいのですが、
うまくいかないです、困っています。

CViewクラスから、モードレスダイアログを開きます、
モードレスダイアログにListBoxを一個貼り付けています、
開くとListBoxにCRttクラスのデータ(配列)を表示します。
ということです。
C**View.cpp
void C**View::OnLButtonDblClk(UINT nFlags, CPoint point)
{
    if(m_Line_Edit_ID==1){
        if (m_pEditModeless == NULL)
        {
            m_pEditModeless = new CEdit_Arr_Dlg(this);
            if (m_pEditModeless->Create() == TRUE){
                m_pEditModeless->SetList1();   //別のクラス
の配列を取得
            }
        }
        else
            m_pEditModeless->SetActiveWindow();
    }
}

CEdit_Arr_Dlg.cpp //モードレスダイアログ
BOOL CEdit_Arr_Dlg::SetList1()
{

    ((CStructCls_Poly*)m_pParent)->GetSelectLine_PolyStruct(&TT);
  //CWnd* m_pParent;
  //m_pParent = pParent;
  //CStructCls_Polyは配列関数を取得したいくらすです。
}
ここまで、動作が正常です。

void CStructCls_Poly::GetSelectLine_PolyStruct(int* TT){

   *TT=mn_Select_LineID; //ここでエラーです。
    if(mp_PolySct[mn_Select_LineID].Type ==POLYGON_TYPE){ //エラー
      ***
    }
}

mn_Select_LineID=-842150451変な数値です。

***Debug.exe の 0x0047bc69 でハンドルされていない例外が発生しました : 
0xC0000005: 場所 0xcdcdcdb0 を読み込み中にアクセス違反が発生しました。 。

どうしたらいいでしょうか。
よろしくお願いします。

環境:Visual C++ .NET MFC使用

REE 2006/05/10(水) 13:46:12
・m_pParentはなぜCWnd型ですか?(CStructCls_PolyはCWndの派生クラス?)
・pParentに値を設定しているのはどこですか?
・CStructCls_Polyのインスタンスは、どのクラスが保持していますか?

Gt 2006/05/11(木) 13:15:28
返事ありがとう.

修正します。

>    ((CStructCls_Poly*)m_pParent)->GetSelectLine_PolyStruct(&TT);

((C***Doc*)m_pParent)->GetSelectLine_StructClassPart(&TT);
直接CStructCls_Polyにアクセスじゃなくて、
まず、C***Docクラスへ
void C***Doc::GetSelectLine_StructClassPart(int* TT)
{
  TT=2;     //ここまで、正常です。
 if( pPolyStructPart )      //ここでエラーです。
    pPolyStructPart->GetSelectLine_PolyStruct(TT);
}
次にCStructCls_Polyへアクセスします.
という流れです。

>・m_pParentはなぜCWnd型ですか?(CStructCls_PolyはCWndの派生クラス?)
CStructCls_Polyは特に,指定していませんですが、CWndの派生クラスだと思います。

>・pParentに値を設定しているのはどこですか?
CEdit_Arr_Dlg::CEdit_Arr_Dlg(CWnd* pParent /*=NULL*/)
    : CDialog(CEdit_Arr_Dlg::IDD, pParent)
    , m_nID(0)
    , m_pParent(NULL)
{
    ASSERT(pParent != NULL);
    m_pParent    = pParent;                    
    m_nID    = CEdit_Arr_Dlg::IDD;
}

>・CStructCls_Polyのインスタンスは、どのクラスが保持していますか?
C***Docクラスにあります.
pPolyStructPart  = new  CStructCls_Poly(…); 

説明が不十分ありますが、すみませんでした。
ちなみに、モーダルダイアログの場合は正常に動きます。
以上、よろしくお願いします。

kure 2006/05/11(木) 13:46:16
> ((C***Doc*)m_pParent)->GetSelectLine_StructClassPart(&TT);

これ間違ってるでしょ。

> CEdit_Arr_Dlg::CEdit_Arr_Dlg(CWnd* pParent /*=NULL*/)
>    : CDialog(CEdit_Arr_Dlg::IDD, pParent)
>    , m_nID(0)
>    , m_pParent(NULL)
> {
>     ASSERT(pParent != NULL);
>     m_pParent    = pParent;                    
>     m_nID    = CEdit_Arr_Dlg::IDD;
> }

このコードが正しければ
m_pEditModeless = new CEdit_Arr_Dlg(this);
なんだからm_pParentはC**View*型じゃなきゃおかしい。

>>・CStructCls_Polyのインスタンスは、どのクラスが保持していますか?
> C***Docクラスにあります.

であればC***Docクラスへアクセスすればよいだけ。
CEdit_Arr_DlgにSetDocument(C***Doc* doc)とかを作るか、
コンストラクタの引数にC***Docを渡しておいて、
それを経由してCStructCls_Polyにアクセスしましょう。

REE 2006/05/11(木) 13:52:01
>>・m_pParentはなぜCWnd型ですか?(CStructCls_PolyはCWndの派生クラス?)
>CStructCls_Polyは特に,指定していませんですが、CWndの派生クラスだと思います。
基底クラスを指定していなければ、派生クラスにはなりません。


>((C***Doc*)m_pParent)->GetSelectLine_StructClassPart(&TT);

(他の回答などから)m_pParentは、C**Viewへのポインタです。
それを無理やりC***Doc* にキャストしてもまともに動作しません。

C++スタイルのキャスト(static_castなど)を使うようにすれば、
このような危険性が減りますよ。

Gt 2006/05/11(木) 16:50:44
[[解決]]
ご解答ありがとう。

>コンストラクタの引数にC***Docを渡しておいて、
>それを経由してCStructCls_Polyにアクセスしましょう。
やり方がわかりません。
一応
C***View-―>C***Doc-―>CStructCls_Polyへアクセスできました。

>(他の回答などから)m_pParentは、C**Viewへのポインタです。
>それを無理やりC***Doc* にキャストしてもまともに動作しません。
わかりました、(自分の知識が足りないと思っています)


どうもありがとうございました。

古いスレッドには追加発言できません。