VC++ 6.0 MFC ダイアログでの「Warning: initial dialog data is out of range.」の警告について

このQ&Aのポイント
  • VC++ 6.0 MFC ダイアログでボタンをクリックすると別のダイアログが開くが、F5キーでデバックすると「Warning: initial dialog data is out of range.」というメッセージが表示される。
  • 警告メッセージが出る場所はselectingdlg->DoModal();であり、OnInitDialog()の中身を削除しても同様の警告が出る。
  • 最初は警告がなかったが、最近になって出るようになり、どの追記が原因かは分からない。
回答を見る
  • ベストアンサー

Warning: initial dialog data is out of range. と言う警告について

VC++ 6.0 MFC ダイアログベースです。 メインダイアログで、あるボタンをクリックすると、別のダイアログが開くと言う物を作っているのですが、 「F5キー」でデバックし、メインダイアログから別のダイアログを開くと、 Warning: initial dialog data is out of range. と言うメッセージがデバックのメッセージウィンドウにでていました。 これはどういった警告なのでしょうか?よろしくお願い致します。 また、どこを見る必要があるのでしょうか? (1)警告メッセージが出るのは selectingdlg->DoModal(); で出ていました。 (2)OnInitDialog()の中身を全部削除しても、(下記状態)同様の警告が出ました。 (3)最初のころはこのような警告はなく、最近になって見つけたのですが、何を追記した時かが自分でももお解らなくなってしまいました・・・。 よろしくお願い致します。 void CMainDlg::Onbutton1() {   selectingdlg->DoModal(); } BOOL CChildDlg::OnInitDialog() {   CDialog::OnInitDialog();   // TODO: この位置に初期化の補足処理を追加してください   return TRUE; // コントロールにフォーカスを設定しないとき、戻り値は TRUE となります          // 例外: OCX プロパティ ページの戻り値は FALSE となります }

質問者が選んだベストアンサー

  • ベストアンサー
  • clsdi99
  • ベストアンサー率63% (31/49)
回答No.1

まだお困りですか? この警告はDDX (ダイアログ データ エクスチェンジ) 、DDV (ダイアログ データ バリデーション)で表示されます。 例えば クラスウィザードでエディットボックスなどにint型の変数を割り当てると最小値と最大値を指定できますよね? その値の範囲(range)に現在の値が入っていないという警告です。 ダイアログのコンストラクタなどで設定している初期値とDoDataExchange内で指定している範囲を確認してみてください。

hagimoto
質問者

お礼

解りやすい回答ありがとうございます。 ご指摘の通りの現象でした。    警告がやっと消せました。 clsdi99さんありがとうございました。

関連するQ&A

  • ダイアログクラスへの値の受け渡し

    VC++6.0 ダイアログベースです。 下記のように、親ダイアログクラスから、ボタンコントロールで2つの子ダイアログクラスを呼び出して いるのですが、自作で作った処理用のクラスを子ダイアログ2から呼び出す場合に 上手く値を渡すことが出来ません。 子ダイアログ2に設定値を送り、その送られてきた設定値を使って自作クラスに値を送ろうと考えてみたのですが、 Dialog2->DoModal(); でエラーとなります。 どの用にしたら、子ダイアログ2から自作関数を呼び出した時も、ダイアログ1で設定された値を使うことができるでしょうか? よろしくお願いします。 /**親ダイアログクラス***********************************************************:*/   //■ボタン1が押されたら子ダイアログ1を開く  CDialog1 *Dialog1;    Dialog1 = new CDialog1();    Dialog1->DoModal();//子ダイアログクラス1呼び出し     //■ボタン2が押されたら子ダイアログ2を開く    CDialog2 *Dialog2;    if (Dialog1->flag == 1){      Dialog2 = new CDialog2(Dialog1->m_hoge1,Dialog1->m_hoge2,Dialog1->m_hoge3);  else{       Dialog2 = new CDialog2(0,0,0);//設定値が読み込まれていなかったら初期値を送る  }      Dialog2->DoModal();//子ダイアログクラス2呼び出し   //■ボタン3が押されたら自作クラスを呼び出します。    //自作クラスを呼び出します。  CJisaku *jisaku;    jisaku = new CJisaku();    //自作クラスの関数呼び出し    jisaku->ppfm(Dialog1->m_hoge1,Dialog1->m_hoge2,Dialog1->m_hoge3,);     /**子ダイアログクラス1**********************************************************/   //自作クラスで扱う設定値を決めます   public:    int m_hoge1;//呼び出されたらint型の変数m_hoge1に値を入れる。   int m_hoge2;//呼び出されたらint型の変数m_hoge2に値を入れる。   int m_hoge3;//呼び出されたらint型の変数m_hoge3に値を入れる。   Cstring m_hogestring;//呼び出されたらCstring型の変数m_hogestringに値を入れる。 BOOL m_flag;   //初期値 flag = false;   //一度でも呼び出されたら flag = true; /**子ダイアログクラス2********************************************************/   //自作クラスを呼び出します。   //コンストラクタ Dialog2::Dialog2(int a,int b, int c){    m_a = a;    m_b = b;    m_c = c; }   jisaku = new CJisaku();   jisaku->ppfm(m_a,m_b,m_c);//自作クラスの関数呼び出し /**自作クラス*******************************************************************/   void ppfm(int a,int b, int c)   {   //ここで子ダイアログクラス1で設定した値を使いたい。   }

  • リッチエディットのUPDATEメッセージ受け取り方

    ダイアログにリッチエディットボックスを貼り付けています。 文字が入力されるたびにUPDATEメッセージを受け取りたいのですが。 下記注釈の意味がわからず困っています。OnInitDialog()に何かを書くということは判るのですが。ヘルプでも見つけることが出来ませんでした。 どうかこの私でも判るよう教えてください。よろしくお願いいたします。m(_ _)m void CCtypeDlg::OnUpdateRichedit() { // TODO: これが RICHEDIT コントロールの場合、コントロールは、lParam マスク // 内での論理和の ENM_UPDATE フラグ付きで EM_SETEVENTMASK // メッセージをコントロールへ送るために CDialog::OnInitDialog() 関数をオーバー // ライドしない限りこの通知を送りません。 // TODO: この位置にコントロール通知ハンドラ・・・

  • ダイアログを終了させてもハンドルが1つ増加したまま。。。

    VC++のMFCを使ってダイアログベースのEXEを造っています。 ハンドルのリークが発生し、困っています。 <動作内容> メインのダイアログで、ボタン押下により別のダイアログを表示します。 DoModal()でモーダルダイアログを作成します。 別のプロセスからブロードキャストされるメッセージを処理したいため、 ボタン押下のルーチンで DoModal() せずに、スレッドを作成し、 そのスレッドで DoModal() を実行しています。 スレッド作成は AfxBeginThread() を使用しています。 <サンプルソース> ●メインダイアログ // ボタン押下のルーチン void CTestModalDlg::OnButton1() { AfxBeginThread( TestDlgThread, (LPVOID)this, THREAD_PRIORITY_NORMAL ); } // スレッド static UINT TestDlgThread(LPVOID pThis) { CTestDlg1 Dlg; Dlg.DoModal(); } ●DoModal() で表示されるダイアログ 何も手を加えてない、デフォルトのまま。 <結果> DoModal() で表示されたダイアログを CDialog::OnCancel() で終了させ、 メインのスレッドが終了しても、ハンドルカウントが1つ増加しています。 Sleep() を入れて値をみてみると、 ・スレッド作成:2増加 ・DoModal() でダイアログ表示:1増加 ・OnCancel() で終了:増減なし ・スレッド終了:2減少 =>結果、1増加となっていました。 以下のパターンでは問題ありませんでした。 ・スレッドを作成+終了(ダイアログ表示しない) ・スレッドを作成せずに、ボタン押下ルーチンから DoModal() でダイアログ表示+終了 ということで、AfxBeginThread()、DoModal() 自体は問題ないのですが、 スレッドを作成して DoModal() するとリークが発生します。 識者の方、原因、対策など、ご教授願います。

  • SendMessage();の使い方

    よろしくお願いします。 <環境> WIN98 VC++6.0 MFC SDIにてウィンドウをクリックすると、モードレスダイアログ1とモーダルダイア ログ2が開くようにしました。 void CMy222View::OnLButtonDown(UINT nFlags, CPoint point) { CDlg1 *dlg; dlg = new CDlg1; dlg->Create(IDD_DIALOG1); dlg->ShowWindow(SW_SHOW); CDlg2 dlg2; dlg2.DoModal(); CView::OnLButtonDown(nFlags, point); } ダイアログ2のボタン押し下げにてダイアログ1のボタン1を押し下げたいのですが 、どのようにすれば実現できるのでしょうか? void CDlg2::OnButton2() { SendMessage(); //■ここの書き方が分かりません CDialog::OnOK(); } 宜しくお願いいたします。

  • OnTimerの使い方

    <環境> WIN98 VC++6.0 MFC  こんな感じで3秒経過するとメッセージボックスを表示していますが、 メッセージボックスのOKボタンを何度も押さないとメッセージボックスが 閉じない時が有ります。 (どうやらメッセージボックスが何個も作られている) どうしてなのでしょうか? BOOL CAbcDlg::OnInitDialog() { // TODO: 特別な初期化を行う時はこの場所に追加してください。 SetTimer(1, 1000, NULL); m_cnttime = 0; 略 void CAbcDlg::OnTimer(UINT nIDEvent) { m_cnttime++; if ( m_cnttime >= 3 ) { AfxMessageBox(""); KillTimer(nIDEvent); } CDialog::OnTimer(nIDEvent); }

  • ツリービューで、起動時にチェックを入れたい

    またまた教えてください。 mfcのツリービューにて、チェックボックスを設け、 起動時にチェックを入れたいのですが、チェックが入りません。 BOOL CtreeTestDlg::OnInitDialog() { CDialogEx::OnInitDialog(); … // TODO: 初期化をここに追加します。 HTREEITEM h1 = m_tree.InsertItem(_T("TEST"), TVI_ROOT); m_tree.SetCheck(h1); return TRUE; // フォーカスをコントロールに設定した場合を除き、TRUE を返します。 } ボタンクリック時では問題がありません。 UpdateData等も入れたりしたのですが、ダメでした。 vs2010,2013両方でダメです。 なにかよい方法がないでしょうか? よろしくお願い致します。

  • ビジュアルベーシックでは、 AddHandlerステートメントがありましたが・・・・・

    ビジュアルベーシックを学んでから、 今度は、Visual C++を勉強していますが・・・ 困っています、 たとえば、ダイアログの上に OK と、Cancel のボタンがあるとします、 ダイアログを表示させて、 OK ボタンを押したら A の処理 Cancel ボタンを押したら B の処理 そして、どちらかの処理が終わったら 続く C の処理を続けてゆく この様にするためには、どうしたらよいのでしょうか? ビジュアルベーシックでは、 AddHandlerステートメントを 使うことができたのですが・・・・ BOOL CXXXDoc::OnNewDocument() { Cfailsettei cf; // 作成したダイアログボックスのクラスです nRet=cf.DoModal();  //モーダルでダイアログを表示     // cf.buttonOK オーケーボタンを押した処理     // cf.buttonCancel キャンセルボタンを押した処理          //処理を続けてゆく if (!CDocument::OnNewDocument()) return FALSE; // TODO: この位置に再初期化処理を追加してください。 // (SDI ドキュメントはこのドキュメントを再利用します。) return TRUE; } どうすれば、良いのでしょうか? よろしくお願いします。

  • VC++6.0 異常終了の調査方法

    環境:VC++6.0 MFC使用 ダイアログベースアプリケーション 使用PC:同一ソースをWin2000またはWinXPでリビルドして使用 です。 メインダイアログにメニューを実装し、あるメニュー項目を 選ぶと別のダイアログをDoModalで表示し、別のダイアログで「OK」を 押すとメインダイアログに処理が戻るようなソフトを作成しています。 別のダイアログは数種類あり、EDITボックスやコンボボックスなどを 配置しています。 ダイアログ切り替えの運用試験として、 あるダイアログを表示→閉じるを繰り返す試験を行っていると、 数時間でこのソフトが異常終了してしまいます。 (タイマ処理内で、現在日時分秒を出力しています) 「あるダイアログを表示」は、ソフトのタイマ処理で5秒おきにDoModalしています。 「閉じる」は、「OK」ボタンを押す別アプリを作成しています。 別アプリでは、「IsWindowVisible()の戻り値がTRUE」かつ 「FindWindowExを使用してlpszWindow(ウインドウ名)が「OK」」 のコントロールを探し出し、見つかればSendMessageなどで 「OK」ボタンを押す処理を代行させています。 何が原因で異常終了してしまうかを調べたいのですが、 具体的な良い方法はありませんでしょうか。 わかっている現象として、 1.タスクマネージャのプロセスタブで このソフトのメモリ使用量を見ていると、 時間とともに少しずつ増加しています。 よろしくお願いいたします。

  • ダイアログのOKボタンを押してウィンドウを生成する方法は?

    ダイアログのOKボタンを押すとウィンドウが生成する方法を教えてください。 MFCでプログラミングしてメインウィンドウをダイアロボックスにしています //アプリケーション class CMyApp : public CWinApp { public: virtual BOOL InitInstance(); }; //メインダイアログ class CMyDlg : public CDialog { public: CMyDlg(CWnd *pParentWnd=NULL); protected: virtual void OnOK(); virtual void OnCancel(); }; #include <afxwin.h> #include <afxdlgs.h> #include <string.h> #include "dlg.h" #include "resource.h" CMyApp myApp; BOOL CMyApp::InitInstance(){ m_pMainWnd = new CMyDlg; m_pMainWnd ->ShowWindow(m_nCmdShow); m_pMainWnd ->UpdateWindow(); return TRUE; } CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/) { Create("MYDLG"); } としています。 ダイアログはできるのですが、ここからウィンドウを生成する方法を教えてください

  • 新ダイアログの初期化

    DoModalなどで新ダイアログを呼び出しているのですが その新ダイアログの初期設定ができません。例えばリストビューなどで m_list.InsertColumn(0,"名前",LVCFMT_CENTER,100); などをしたいのですが 新ダイアログのクラス:NewClass #include ・ ・ ・ #endif CNewClass::CNewClass(CWnd* pParent) : CDaialog(CNewClass::IDD,pParent) { } void CNewClass::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(・・) ・ ・ END_MESSAGE_MAP() がかかれているんですがどこに書けばいいんでしょうか? 一番上の関数だと思ってそこに書いたらDebug AssertionFailed! とでます。そのInsertColumnを入れなければエラーはでません。 ということは入れる場所に問題があるのかとおもいました。 解決方法を教えて下さい。

専門家に質問してみよう