タイトルにもありますが、モーダルダイアログを使用したプログラムを作成してます。
やりたいことは初歩的で申し訳ないのですが、
子ダイアログのエディットボックス内の値を親ダイアログで使用できるようにしたいん
です。
具体的には子ダイアログに4つのエディットボックスとOKボタンとキャンセルボタン
があって、エディットボックス内にセットされた数値を読みっ取って親ダイアログで条
件式で使用したいと考えてます。
モーダルダイアログは作成できています。
//モーダルダイアログ作成(親ダイアログ)
void CParentDlg::OnCbnSelchangeXXX();
{
int i;
i = m_XXX.GetCursel();
if(i=2){
CChildDlg dlg(this);
dlg.DoModal();
}
//子ダイアログのエディットボックス内数値取得
void CChildDlg::OnBnClickedButton1()
{
CString B,C,D,E;
GetDlgItemText(IDC_EDIT1, B);
GetDlgItemText(IDC_EDIT2, C);
GetDlgItemText(IDC_EDIT3, D);
GetDlgItemText(IDC_EDIT4, E);
int b = atoi(B);
int c = atoi(C);
int d = atoi(D);
int e = atoi(E);
OnOK();
}
//親ダイアログの条件式に子ダイアログの値を使用
void CParentDlg::XXXXX()
{
int nSts;
CString msg;
BOOL check;
DWORD timeCount = 0;
int a=0;
DWORD timeCount2 =0;
if(i==2){
Sleep(b);
~省略~
while(a<e){
timeCount = GetTickCount();
timeCount2 = 0;
while(timeCount2<c){
timeCount2 = GetTickCount() - timeCount;
}
~省略~
Sleep(d);
~省略~
a=a++;
}
どうすれば親ダイアログでエディット内で取得したb,c,d,e使用できるようになるでしょ
うか?
環境はWindows XP,VS2005 VC++です。
よろしくお願いします。
子ダイアログに入力値を返すpublicメソッドを用意し、
親がそれを呼ぶ。
επιστημηさん
早いレス有難うございます。
初心者な為、具体的に教えていただけると有り難いです。
class CChildDlg : CDialog {
...
public:
CString GetUSerInput() {
入力値を返す
}
};
επιστημηさん
ありがとうございます。
図々しい質問で申し訳ないのですが、
入力値を返すのとこにはなにかコーディングが必要ですか?
また、親が呼ぶのはどうしたらよいですか?
> 入力値を返すのとこにはなにかコーディングが必要ですか?
当然です。
CString CChildDlg::GetUserInput() {
}
これじゃコンパイルエラー。
> また、親が呼ぶのはどうしたらよいですか?
CChildDlg dlg(this);
if ( dlg.DoModal() == IDOK ) {
CString userInput = dlg.GetUserInput();
...
}
επιστημηさん
ありがとうございます。
たびたびで申し訳ないのですが、
> 入力値を返すのとこにはなにかコーディングが必要ですか?
>当然です。
>CString CChildDlg::GetUserInput() {
>}
なにをコーディングしたらよろしいいですか?
親は子の数値が欲しいですよね。
class CChildDlg : CDialog {
int m_b;
int m_c;
int m_d;
int m_e;
public:
int GetB() { return m_b;}
int GetC() { return m_c;}
int GetD() { return m_d;}
int GetE() { return m_e;}
};
void CChildDlg::OnBnClickedButton1()
{
BOOL bTranslated = FALSE;
int work = GetDlgItemInt(IDC_EDIT1, &bTranslated);
if (bTranslated)
{ m_b = work;
} else
{ /* 変換できない文字が入力されているので適切なエラーメッセージ等 */
}
/* 以下略 */
OnOK(); /* 入力値が全て変換出来た時のみ呼び出すこと! */
}
> また、親が呼ぶのはどうしたらよいですか?
CChildDlg dlg(this);
if (dlg.DoModal() == IDOK)
{
int b =dlg.GetB();
/* 以下略 */
}
# 次から次へと質問するより、もう少しC++言語を勉強されることをお勧めいたします。
余計な事だけど、元のソース中の
> a=a++;
は、どういう結果になるんでしたっけ? 未定義/未規定?
C++ JIS X3014:2003 5.式 (4)
相続く2つの副作用完了点の間では、1つの式の評価によってスカラオブジェクトの
格納値が変わるのは、高々1回でなければならない。
C99 JIS X3010:2003 6.5.式
直前の副作用完了点から次の副作用完了点までの間に、式の評価によって
1つのオブジェクトに格納された値を変更する回数は、高々1回でなければならない
に反するので未定義っすね
以下感想というか重箱の隅というか
X3014 の訳文は ISO/IEC 14882 の原文中における a scalar object の a を
訳出していないので不正確(1つのスカラオブジェクトとする必要がある)
i=++a+b--; は副作用完了点の間に3つの副作用があるけど正しい式文
ISO/IEC 14882 5.(4) で挙げられているサンプルには unspecified とあって
X3014 もそれを忠実に訳しているので未規定とあるが、
これは 14882 がそもそも間違っていると思われる
なるほど、そうですか。解説、ありがとうございます。
元々は a++; か、a = a + 1;と書きたかったんだろうけど、なんだかなぁ。
最初のコードには
> if(i=2){
なんてのもあるし。
皆様コメント有難うございます。
>class CChildDlg : CDialog {
> int m_b;
> int m_c;
> int m_d;
> int m_e;
>public:
> int GetB() { return m_b;}
> int GetC() { return m_c;}
> int GetD() { return m_d;}
> int GetE() { return m_e;}
>};
はCChildDlg.hにコーディングですよね?
> CChildDlg dlg(this);
> if (dlg.DoModal() == IDOK)
> {
> int b =dlg.GetB();
> /* 以下略 */
> }
はCPararentDlg.cppにコーディングですよね?
それでやってみたのですが、
b,c,d,eは定義されてないとエラーになるのですが、
CParentDlg.cpp側でもb,c,d,eは定義する必要があるんでしょうか?
できたら最初に書いたソースで教えていただけると助かります。
質問ばかりで申し訳ないのですが、ご教授下さい。
本当に申し訳ないです。よろしくお願いいたします。
> b,c,d,eは定義されてないとエラーになるのですが、
定義されてないんでしょうねぇ。
現象を正確に伝えるために、書いたコードとエラー・メッセージを
そのまま貼り付けてください。
書いたコードは
CChildDlg.gに
class CChildDlg : public CDialog
{
DECLARE_DYNAMIC(CCustumDlg)
int m_b;
int m_c;
int m_d;
int m_e;
public:
int GetB() { return m_b;}
int GetC() { return m_c;}
int GetD() { return m_d;}
int GetE() { return m_e;}
public:
CChildDlg(CWnd* pParent = NULL); // 標準コンストラクタ
CString GetUserInput(){
}
virtual ~CCustumDlg();
~省略~
CParentDlg.cppに
void CParentDlg::XXXXX()
{
DWORD timeCount = 0;
int a=0;
DWORD timeCount2 =0;
int i;
i = m_combobox.GetCurSel();
BeginWaitCursor();
if(i==2){
CCustumDlg dlg(this);
if (dlg.DoModal() == IDOK) {
CString userInput = dlg.GetUserInput();
int b =dlg.GetB();
int c =dlg.GetC();
int d =dlg.GetD();
int e =dlg.GetE();
}
~処理~
while(a<e){
timeCount = GetTickCount();
timeCount2 = 0;
while(timeCount2<c+1){
timeCount2 = GetTickCount() - timeCount;
}
~処理~
Sleep(d);
~処理~
a=a++;
}
}
EndWaitCursor();
}
です。
エラーは
error C2065: 'e' : 定義されていない識別子です。
int eで定義しているので出ないと思うのですが・・・
宜しくお願いします
int eはスコープを抜けてますよ。