モーダルダイアログ – プログラミング – Home

通知
すべてクリア

[解決済] モーダルダイアログ

固定ページ 1 / 3

ヨッピー
 ヨッピー
(@ヨッピー)
ゲスト
結合: 17年前
投稿: 24
Topic starter  

タイトルにもありますが、モーダルダイアログを使用したプログラムを作成してます。
やりたいことは初歩的で申し訳ないのですが、
子ダイアログのエディットボックス内の値を親ダイアログで使用できるようにしたいん
です。
具体的には子ダイアログに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++です。

よろしくお願いします。


引用未解決
トピックタグ
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

子ダイアログに入力値を返すpublicメソッドを用意し、
親がそれを呼ぶ。


返信引用
ヨッピー
 ヨッピー
(@ヨッピー)
ゲスト
結合: 17年前
投稿: 24
Topic starter  

επιστημηさん

早いレス有難うございます。
初心者な為、具体的に教えていただけると有り難いです。


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

class CChildDlg : CDialog {
...
public:
CString GetUSerInput() {
入力値を返す
}
};


返信引用
ヨッピー
 ヨッピー
(@ヨッピー)
ゲスト
結合: 17年前
投稿: 24
Topic starter  

επιστημηさん

ありがとうございます。
図々しい質問で申し訳ないのですが、
入力値を返すのとこにはなにかコーディングが必要ですか?
また、親が呼ぶのはどうしたらよいですか?


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

> 入力値を返すのとこにはなにかコーディングが必要ですか?

当然です。

CString CChildDlg::GetUserInput() {
}

これじゃコンパイルエラー。

> また、親が呼ぶのはどうしたらよいですか?

CChildDlg dlg(this);
if ( dlg.DoModal() == IDOK ) {
CString userInput = dlg.GetUserInput();
...
}


返信引用
ヨッピー
 ヨッピー
(@ヨッピー)
ゲスト
結合: 17年前
投稿: 24
Topic starter  

επιστημηさん

ありがとうございます。
たびたびで申し訳ないのですが、

> 入力値を返すのとこにはなにかコーディングが必要ですか?
>当然です。
>CString CChildDlg::GetUserInput() {
>}

なにをコーディングしたらよろしいいですか?


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

親は子の数値が欲しいですよね。

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++言語を勉強されることをお勧めいたします。


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

余計な事だけど、元のソース中の
> a=a++;
は、どういう結果になるんでしたっけ? 未定義/未規定?


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

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 がそもそも間違っていると思われる


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

なるほど、そうですか。解説、ありがとうございます。

元々は a++; か、a = a + 1;と書きたかったんだろうけど、なんだかなぁ。
最初のコードには
> if(i=2){
なんてのもあるし。


返信引用
ヨッピー
 ヨッピー
(@ヨッピー)
ゲスト
結合: 17年前
投稿: 24
Topic starter  

皆様コメント有難うございます。

>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は定義する必要があるんでしょうか?
できたら最初に書いたソースで教えていただけると助かります。

質問ばかりで申し訳ないのですが、ご教授下さい。
本当に申し訳ないです。よろしくお願いいたします。


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

> b,c,d,eは定義されてないとエラーになるのですが、

定義されてないんでしょうねぇ。

現象を正確に伝えるために、書いたコードとエラー・メッセージを
そのまま貼り付けてください。


返信引用
ヨッピー
 ヨッピー
(@ヨッピー)
ゲスト
結合: 17年前
投稿: 24
Topic starter  

書いたコードは
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で定義しているので出ないと思うのですが・・・

宜しくお願いします


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

int eはスコープを抜けてますよ。


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

返信する

投稿者名

投稿者メールアドレス

タイトル *

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