モードレスについて – プログラミング – Home

通知
すべてクリア

[解決済] モードレスについて


Gt
 Gt
(@Gt)
ゲスト
結合: 19年前
投稿: 3
Topic starter  

こんにちは、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
 REE
(@REE)
ゲスト
結合: 23年前
投稿: 240
 

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


返信引用
Gt
 Gt
(@Gt)
ゲスト
結合: 19年前
投稿: 3
Topic starter  

返事ありがとう.

修正します。

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

((C***Doc*)m_pParent)->GetSelectLine_StructClassPart(&TT);
直接CStructCls_Polyにアクセスじゃなくて、
まず、CDocクラスへ
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
 kure
(@kure)
ゲスト
結合: 19年前
投稿: 48
 

> ((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にアクセスしましょう。


返信引用
REE
 REE
(@REE)
ゲスト
結合: 23年前
投稿: 240
 

>>・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
 Gt
(@Gt)
ゲスト
結合: 19年前
投稿: 3
Topic starter  

ご解答ありがとう。

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

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました