こんにちは、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使用
・m_pParentはなぜCWnd型ですか?(CStructCls_PolyはCWndの派生クラス?)
・pParentに値を設定しているのはどこですか?
・CStructCls_Polyのインスタンスは、どのクラスが保持していますか?
返事ありがとう.
修正します。
> ((CStructCls_Poly*)m_pParent)->GetSelectLine_PolyStruct(&TT);
((C***Doc*)m_pParent)->GetSelectLine_StructClassPart(&TT);
直接CStructCls_Polyにアクセスじゃなくて、
まず、CDocクラスへ
void CDoc::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(…);
説明が不十分ありますが、すみませんでした。
ちなみに、モーダルダイアログの場合は正常に動きます。
以上、よろしくお願いします。
> ((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のインスタンスは、どのクラスが保持していますか?
> CDocクラスにあります.
であればCDocクラスへアクセスすればよいだけ。
CEdit_Arr_DlgにSetDocument(C***Doc* doc)とかを作るか、
コンストラクタの引数にC***Docを渡しておいて、
それを経由してCStructCls_Polyにアクセスしましょう。
>>・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など)を使うようにすれば、
このような危険性が減りますよ。
ご解答ありがとう。
>コンストラクタの引数にCDocを渡しておいて、
>それを経由してCStructCls_Polyにアクセスしましょう。
やり方がわかりません。
一応
CView-―>C***Doc-―>CStructCls_Polyへアクセスできました。
>(他の回答などから)m_pParentは、C**Viewへのポインタです。
>それを無理やりC***Doc* にキャストしてもまともに動作しません。
わかりました、(自分の知識が足りないと思っています)
どうもありがとうございました。