親ダイアログクラスの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です。
色々調べてみて、
CChildDlg.cpp内
void CChildDlg::OnBnClickedOk()
{
~略~
CParentDlg parent;
if(parent.m_up2down==FALSE)
{
~略~
}
にしてみたところコンパイルは通るようになったのですが、
ブレークポイントで値を見てみたところ正常な値(BOOLなので0or1)が入らず、
「エラーです:シンボルm_up2downが見つかりません」となっていました。
どのように解決したらよいのでしょうか?
他人のヘソを勝手に見てはいけないのと同様、
他クラスのメンバを直接参照するようなコードにしてはまずいです。
特にDLGの両者がモーダルの場合は抜け道もあまりありません。
親のm_up2downのコピー、又はポインタを子供のコンストラクタで
親からもらっておくのがよいでしょう。
任意に提供されたヘソの写真を見るのは無罪(たぶん)。
仲澤@失業者さん返信有難うございます。
>>親のm_up2downのコピー、又はポインタを子供のコンストラクタで
>親からもらっておくのがよいでしょう。
という解決策のサンプルを提示していただけると有難いです。
>if(CParent::m_up2down==FALSE)に変更したところ、
>:error C2597: 静的でないメンバ 'CParent::m_up2down' への参照が正しくありませ
>ん。
>CParentDlg parent;
>if(parent.m_up2down==FALSE)
の意味がわからない時点でサンプル示してもらうよりC++の勉強した方がいい気がします
が。ダイアログとか以前の問題です。
特に2つ目のほうはその場で適当に作ったインスタンスのパラメータを参照して
望む(親の)データが入っている訳が無いでしょ
「親ダイアログクラスのpublicにある関数を子ダイアログで使用したい」
と書かれてますが、実際にやりたいのは親ダイアログクラスのメンバー変数を
みたいと言うことみたいですね。
メンバー関数とメンバー変数は別物ですから区別して考えた方がいいです。
この辺の用語は間違えると伝えたい事が伝わらない事があります。
あと、クラスとインスタンスの関係をきっちり勉強した方が良いかな。
今の質問内容からするとC++の文法の勉強を並行でされていませんか?
C++の文法をコンソールアプリできちんと行なってからMFCを使った
アプリの作成方法について勉強された方がスムーズに理解できると思います。
MFCはC++文法に関する基礎知識がないと使いこなせません。
文法とMFCの使い方をいっぺんに勉強するのは無理があります。
勉強方法を再検討してみる事も必要かもしれません。
皆様有難うございます。
おっしゃる通りで勉強不足です。
もっと勉強します。
ちなみに最後に教えていただきたいのですが、
親ダイアログにあるピクチャーコントロールの表示サイズを
子ダイアログにあるボタンなどを使用してサイズ変更することって可能ですか?
もし可能でしたらアドバイスを頂けたら有難いです。
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) {
// ここで変えることはできるよね?
}
};
モーダルダイアログから、
親ダイアログのコントロールを弄るのは
危険じゃないかな