こんにちは、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* にキャストしてもまともに動作しません。
わかりました、(自分の知識が足りないと思っています)
どうもありがとうございました。
