>CParentDlg dlg(this);
ここがおかしい、
これではthis(CChildDlg)を親とした
CParentDlgクラスの新しいものをつくってしまいます
本来のCParentDlgからみたら孫にあたります
MSDNで、「GetParent()」 を調べてみてください
> 受け取り窓口を作ったつもりなのですが、これでは窓口になってないですか?
なってはいるようですが、
お母さんのサイフから小遣いを拝借するつもりが、
赤の他人のポケットに手をつっこんでますね。
> メンバ変数はわかります。
>
> 何を追加するべきなのでしょうか?
考えることを放棄しているような質問ですね。
ReadParam()でセットしてから、子ダイアログ表示の別のボタンを押すまでの間、
撮影条件の一部を保持しておくための、メンバ変数です。
> class CParentDlg : public CDialog {
> public:
> int GetSt() { return Record_Start_Time;}
> int GetIm() { return Record_Image_Time;}
> int GetIn() { return Record_Interval_Time;}
> int GetNo() { return Record_Number_of_Time;}
> }
...ちょっとマテ。親に窓口つけてどうする。
「子が親から小遣いをちょろまかす」んじゃなくて
「親が子に小遣いを渡す」よにすりゃえぇじゃん。
rinさん、επιστημη さん
甘えきったお願いで大変申し訳ないのですが、
どこを変えたら上手くいくか示していただけないでしょうか?
class 子 {
public:
void Setなにか(わたしたいもの arg);
};
んでもって 親が子に対し: 子.Setなにか(小遣い); すればいいんちゃうの?
> 甘えきったお願いで大変申し訳ないのですが、
思考を放棄するならお付き合いはこれまで。
--- ChildDlg.h ---
CChildDlg : public CDialog
{
private:
int m_data;
public:
void set(int data) {m_data=data;}
int get(void) const {return m_data;}
/* その他、省略 */
}
--- ParentDlg.cpp ---
CParentDlg::OnSomething
{
CChildDlg dlg(this);
dlg.set(何らの設定値);
if (dlg.DoModal() == MB_OK) /* ID_OKだったかな? */
{ CChildDlgで設定された値を受け取る変数 = dlg.get();
}
}
ダイアログボックスにデータを設定、取得する方法はこれが一般的で、いくらでも例が
あると思うんだけど、なんでこんなにスレッドが伸びているんでしょうね。
多分、クラスとインスタンスの違いを理解できていないからだと思います。
既に書かれていますけれど、クラスとインスタンスの認識が
ちゃんとできていない為に混乱されていると思います。
C++言語の知識無しでいきなりMFCを使ったウインドウを表示するプログラムは
無理が有りますよ。
MFCその物がC++のクラスライブラリなのでC++の知識がきちんとして無いと
使いこなせないです。
コンソールプログラムで純粋にC++言語の勉強をされたほうがよいのでは
ないかと思います。
この方法ですと、MFCに関する知識はひとまず必要なくなるので
C++言語の勉強に集中できますよ。
皆様
ご丁寧なご指導有難うございます。
勉強不足でご迷惑お掛けしました。
maruさんがご教授してくれたやり方でやってみました。
------------CChildDlg.h--------------
public:
int rst,rit,rint,rnot;
private:
int m_rst,m_rit,m_rint,m_rnot
public:
void set1(int data1){m_rst=data1;}
int get1(void) const {return m_rst;}
void set2(int data2){m_rit=data2;}
int get2(void) const {return m_rit;}
void set3(int data3){m_rint=data3;}
int get3(void) const {return m_rint;}
void set4(int data4){m_rnot=data4;}
int get4(void) const {return m_rnot;}
--------------------------------------
--------------CParentDlg.cpp------------
CParentDlg::OnSomething
{
CCustumDlg dlg(this);
dlg.set1(Record_Start_Time);
dlg.set2(Record_Image_Time);
dlg.set3(Record_Interval_Time);
dlg.set4(Record_Number_of_Time);
dlg.rst = dlg.get1();
dlg.rit = dlg.get2();
dlg.rint = dlg.get3();
dlg.rnot = dlg.get4();
}
-----------------------------------------
------------CChildDlg.cpp---------------
CChildDlg::OnSomething
{
sprintf(param,%d,rst);
m_start.SetWindowText(param);
sprintf(param,%d,rit);
m_image.SetWindowText(param);
sprintf(param,%d,rint);
m_interval.SetWindowText(param);
sprintf(param,%d,rnot);
m_count.SetWindowText(param);
}
----------------------------------------
結果をご報告しますとCParentDlgで
dlg.rst、dlg.rit、dlg.rint、dlg.rnotには所望の値を取得できているのですが、
実際に子ダイアログを開くと所望の値ではなく-858993460という値になってしまいま
す。
「実際に子ダイアログを開く」コードを示してください。
CParentDlg::OnSomething()
{
CCustumDlg dlg(this);
dlg.set1(Record_Start_Time);
dlg.set2(Record_Image_Time);
dlg.set3(Record_Interval_Time);
dlg.set4(Record_Number_of_Time);
dlg.DoModal(); // ここじゃないと意味がないってこと、理解してますか?
}
επιστημηさん
>>dlg.DoModal(); // ここじゃないと意味がないってこと、理解してますか?
ご指摘有難うございます。
これだとダイアログが表示されてしまいますよね?
ダイアログの表示は操作者のタイミングでボタンをおして表示させたいと考えてるんで
すが・・・
また、dlg.DoModal();を入れても値取得が出来ないのは変わらないです。
> ダイアログの表示は操作者のタイミングでボタンをおして
> 表示させたいと考えてるんですが・・・
ならばCParentDlg::OnSomething()
にDialogを置いたのがマチガイちゃいます?
考えてることとやってることが違うやん。
> また、dlg.DoModal();を入れても値取得が出来ないのは変わらないです。
そんなはずはねぇ。
どうやって確認しましたか?
>ならばCParentDlg::OnSomething()
>にDialogを置いたのがマチガイちゃいます?
>考えてることとやってることが違うやん。
確かにそうでした。すいません。
>どうやって確認しましたか?
ブレークポイントで一つずつ値を見ていきました。
そしたら
dlg.set1(Record_Start_Time);
dlg.set2(Record_Image_Time);
dlg.set3(Record_Interval_Time);
dlg.set4(Record_Number_of_Time);
の親ダイアログでは所望の値を取得していますが、
BOOL CChildDlg::OnInitDialog()
{
sprintf(param,%d,rst);
m_start.SetWindowText(param);
sprintf(param,%d,rit);
m_image.SetWindowText(param);
sprintf(param,%d,rint);
m_interval.SetWindowText(param);
sprintf(param,%d,rnot);
m_count.SetWindowText(param);
}
では-858993460という値になってしまいます。
> 確かにそうでした。すいません。
ならば検証結果がおかしいのは当然。
期待する動きのとおりに実装し、再確認してください。