親ダイアログクラス – プログラミング – Home

通知
すべてクリア

親ダイアログクラス


海人
 海人
(@海人)
ゲスト
結合: 16年前
投稿: 14
Topic starter  

親ダイアログクラスのpublicにある関数を子ダイアログで使用したいのですが、
うまくいきません。
どうしたらよいのでしょうか?

CChildDlg.cpp内
void CChildDlg::OnBnClickedOk()
{
~略~
 if(m_up2down==FALSE)
{
~略~
}

up2downが親ダイアログクラスに宣言されている。
CParentDlg.h内
class CParentDlg : public CDialog
{
public:
BOOL up2down;
}

これではm_up2downが定義されていないというエラーが出たので、
if(CParent::m_up2down==FALSE)に変更したところ、
:error C2597: 静的でないメンバ 'CParent::m_up2down' への参照が正しくありませ
ん。

となってしまいました。

よろしくお願いいたします。

環境:Windows XP VC++ MFCです。


引用解決済
トピックタグ
海人
 海人
(@海人)
ゲスト
結合: 16年前
投稿: 14
Topic starter  

色々調べてみて、
CChildDlg.cpp内
void CChildDlg::OnBnClickedOk()
{
~略~
 CParentDlg parent;
 if(parent.m_up2down==FALSE)
{
~略~
}
にしてみたところコンパイルは通るようになったのですが、
ブレークポイントで値を見てみたところ正常な値(BOOLなので0or1)が入らず、
「エラーです:シンボルm_up2downが見つかりません」となっていました。

どのように解決したらよいのでしょうか?


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

他人のヘソを勝手に見てはいけないのと同様、
他クラスのメンバを直接参照するようなコードにしてはまずいです。
特にDLGの両者がモーダルの場合は抜け道もあまりありません。

親のm_up2downのコピー、又はポインタを子供のコンストラクタで
親からもらっておくのがよいでしょう。
任意に提供されたヘソの写真を見るのは無罪(たぶん)。


返信引用
海人
 海人
(@海人)
ゲスト
結合: 16年前
投稿: 14
Topic starter  

仲澤@失業者さん返信有難うございます。

>>親のm_up2downのコピー、又はポインタを子供のコンストラクタで
>親からもらっておくのがよいでしょう。

という解決策のサンプルを提示していただけると有難いです。


返信引用
とおりすがり
 とおりすがり
(@とおりすがり)
ゲスト
結合: 23年前
投稿: 180
 

>if(CParent::m_up2down==FALSE)に変更したところ、
>:error C2597: 静的でないメンバ 'CParent::m_up2down' への参照が正しくありませ
>ん。

>CParentDlg parent;
>if(parent.m_up2down==FALSE)

の意味がわからない時点でサンプル示してもらうよりC++の勉強した方がいい気がします
が。ダイアログとか以前の問題です。
特に2つ目のほうはその場で適当に作ったインスタンスのパラメータを参照して
望む(親の)データが入っている訳が無いでしょ


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

「親ダイアログクラスのpublicにある関数を子ダイアログで使用したい」
と書かれてますが、実際にやりたいのは親ダイアログクラスのメンバー変数を
みたいと言うことみたいですね。
メンバー関数とメンバー変数は別物ですから区別して考えた方がいいです。
この辺の用語は間違えると伝えたい事が伝わらない事があります。

あと、クラスとインスタンスの関係をきっちり勉強した方が良いかな。

今の質問内容からするとC++の文法の勉強を並行でされていませんか?
C++の文法をコンソールアプリできちんと行なってからMFCを使った
アプリの作成方法について勉強された方がスムーズに理解できると思います。
MFCはC++文法に関する基礎知識がないと使いこなせません。
文法とMFCの使い方をいっぺんに勉強するのは無理があります。
勉強方法を再検討してみる事も必要かもしれません。


返信引用
海人
 海人
(@海人)
ゲスト
結合: 16年前
投稿: 14
Topic starter  

皆様有難うございます。

おっしゃる通りで勉強不足です。
もっと勉強します。

ちなみに最後に教えていただきたいのですが、
親ダイアログにあるピクチャーコントロールの表示サイズを
子ダイアログにあるボタンなどを使用してサイズ変更することって可能ですか?

もし可能でしたらアドバイスを頂けたら有難いです。


返信引用
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

class CChildDlg {
CParentDlg *parent_;
public:
void SetParent(CParentDlg *parent) {
parent_ = parent;
}

void OnButton1Clicked {
parent_->ChangeSize(100, 200);
}
};

class CParentDlg {
public:
void OnButton1Clicked {
CChildDlg child;
child.SetParent(this);
child.DoModal();
}

void ChangeSize(int width, int height) {
// ここで変えることはできるよね?
}
};


返信引用
rin
 rin
(@rin)
ゲスト
結合: 18年前
投稿: 112
 

モーダルダイアログから、
親ダイアログのコントロールを弄るのは
危険じゃないかな


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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