親から子へ値渡し – 固定ページ 2 – プログラミング – Home

通知
すべてクリア

[解決済] 親から子へ値渡し

固定ページ 2 / 3

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

>CParentDlg dlg(this);
ここがおかしい、
これではthis(CChildDlg)を親とした
CParentDlgクラスの新しいものをつくってしまいます
本来のCParentDlgからみたら孫にあたります

MSDNで、「GetParent()」 を調べてみてください


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

> 受け取り窓口を作ったつもりなのですが、これでは窓口になってないですか?

なってはいるようですが、
お母さんのサイフから小遣いを拝借するつもりが、
赤の他人のポケットに手をつっこんでますね。


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

> メンバ変数はわかります。
>
> 何を追加するべきなのでしょうか?

考えることを放棄しているような質問ですね。
ReadParam()でセットしてから、子ダイアログ表示の別のボタンを押すまでの間、
撮影条件の一部を保持しておくための、メンバ変数です。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

> 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;}
> }

...ちょっとマテ。親に窓口つけてどうする。
「子が親から小遣いをちょろまかす」んじゃなくて
「親が子に小遣いを渡す」よにすりゃえぇじゃん。


返信引用
シャー
 シャー
(@シャー)
ゲスト
結合: 16年前
投稿: 13
Topic starter  

rinさん、επιστημη さん

甘えきったお願いで大変申し訳ないのですが、
どこを変えたら上手くいくか示していただけないでしょうか?


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

class 子 {
public:
void Setなにか(わたしたいもの arg);
};

んでもって 親が子に対し: 子.Setなにか(小遣い); すればいいんちゃうの?

> 甘えきったお願いで大変申し訳ないのですが、

思考を放棄するならお付き合いはこれまで。


返信引用
maru
 maru
(@maru)
ゲスト
結合: 17年前
投稿: 358
 

--- 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();
}
}

ダイアログボックスにデータを設定、取得する方法はこれが一般的で、いくらでも例が
あると思うんだけど、なんでこんなにスレッドが伸びているんでしょうね。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

多分、クラスとインスタンスの違いを理解できていないからだと思います。


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

既に書かれていますけれど、クラスとインスタンスの認識が
ちゃんとできていない為に混乱されていると思います。

C++言語の知識無しでいきなりMFCを使ったウインドウを表示するプログラムは
無理が有りますよ。
MFCその物がC++のクラスライブラリなのでC++の知識がきちんとして無いと
使いこなせないです。
コンソールプログラムで純粋にC++言語の勉強をされたほうがよいのでは
ないかと思います。
この方法ですと、MFCに関する知識はひとまず必要なくなるので
C++言語の勉強に集中できますよ。


返信引用
シャー
 シャー
(@シャー)
ゲスト
結合: 16年前
投稿: 13
Topic starter  

皆様

ご丁寧なご指導有難うございます。
勉強不足でご迷惑お掛けしました。

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という値になってしまいま
す。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

「実際に子ダイアログを開く」コードを示してください。

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(); // ここじゃないと意味がないってこと、理解してますか?
}


返信引用
シャー
 シャー
(@シャー)
ゲスト
結合: 16年前
投稿: 13
Topic starter  

επιστημηさん

>>dlg.DoModal(); // ここじゃないと意味がないってこと、理解してますか?

ご指摘有難うございます。
これだとダイアログが表示されてしまいますよね?
ダイアログの表示は操作者のタイミングでボタンをおして表示させたいと考えてるんで
すが・・・
また、dlg.DoModal();を入れても値取得が出来ないのは変わらないです。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

> ダイアログの表示は操作者のタイミングでボタンをおして
> 表示させたいと考えてるんですが・・・

ならばCParentDlg::OnSomething()
にDialogを置いたのがマチガイちゃいます?

考えてることとやってることが違うやん。

> また、dlg.DoModal();を入れても値取得が出来ないのは変わらないです。

そんなはずはねぇ。
どうやって確認しましたか?


返信引用
シャー
 シャー
(@シャー)
ゲスト
結合: 16年前
投稿: 13
Topic starter  

>ならば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という値になってしまいます。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

> 確かにそうでした。すいません。

ならば検証結果がおかしいのは当然。
期待する動きのとおりに実装し、再確認してください。


返信引用
固定ページ 2 / 3

返信する

投稿者名

投稿者メールアドレス

タイトル *

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