モードレスダイアログを作成しようと思ったら....。

このQ&Aのポイント
  • Win2000pro, VC++6.0sp6, MFC, ダイアログベースにてモードレスのダイアログ表示を行おうと思った。
  • ダイアログクラスを作成し、基本となるクラスにメンバ変数を宣言したが、コンパイルエラーが発生。
  • ダイアログクラスの作り方が間違っている可能性がある。
回答を見る
  • ベストアンサー

モードレスダイアログを作成しようと思ったら....。

環境:Win2000pro, VC++6.0sp6, MFC, ダイアログ ベースにてモードレスのダイアログ表示を行おうと思い 表示したいダイアログクラスをCModelessDlgとし、 基本となるクラスをCTestDlgとして、CTestDlgの メンバ変数にCModelessDlg* pDlg;と宣言したのですが、 コンパイルを実行すると、下記のようなエラーが出ます。 (1)error C2143: 構文エラー : ';' が '*' の前に必要です。 (2)error C2501: 'CModelessDlg' : 識別名を宣言するのに、型が指定されていません。 (3)error C2501: 'pDlg' : 識別名を宣言するのに、型が指定されていません。 宣言が間違っている時等のお馴染みのエラーですが、何故 出るのかが分りません。ダイアログクラスの作り方等が いけないのでしょうか? どなたか、推測でも構わないのでよろしくお願い致しま す。

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

  • ベストアンサー
  • Soli
  • ベストアンサー率11% (7/61)
回答No.1

CTestDlgのヘッダファイルでクラスの宣言前に class CModelessDlg; という一文をつけ、 CTestDlgのcppファイルでCModelessDlgのヘッダファイルをインクルードしてあげれば コンパイルがとおると思われます。 以下のような感じですね。 ---- TestDlg.h ----------------------------------- class CModelessDlg; class CTestDlg { CModelessDlg* pDlg; }; ---- TestDlg.cpp --------------------------------- #include<ModelessDlg.h> 以下略

tamajun
質問者

お礼

ありがとうございました。なるほどです。 無事に出来ました。申し訳ないのですが、もう一つ 質問があります。CTestDlgと同じモードレスダイアログを 起動時に作成するってのは可能でしょうか? 何かメッセージが送られた時ではなく起動じにやりたい です。 イメージとしては、横に同じダイアログが並んで起動され る感じです。実行ファイル二つ作って片方からShellExecute()等で起動させてあげれば簡単なんでしょう が...。よろしくお願いいたします。

その他の回答 (1)

  • Soli
  • ベストアンサー率11% (7/61)
回答No.2

No1です。 ダイアログベースのプロジェクトで CTestDlgを2個同時に作りたいならば プロジェクトを立ち上げると生成される、 CWinAppの派生クラスのInitInstance()内を工夫してあげると 実現できるでしょうけど、いい方法ではないと思います。この辺は私にもわかりません。

関連するQ&A

  • モードレスダイアログの作成について

    http://www.athomejp.com/goldfish/mfc/dialog/modeless.html これを参考にモードレスダイアログを勉強しています。 ************************* クラスウィザード(Ctrl+W)で、新規ダイアログを追加します。 クラス名をCTestDlgとします。 CModelessDlgクラスにCTestDlgのデータメンバを追加します。 (ヘッダーも追加してください) ************************* この時点でコンパイルすると、 'CTestDlg' : 識別名を宣言するのに、型が指定されていません。 と言われます。 どうすれば対処できますでしょうか? よろしくお願いいたします。

  • C++.NETでのOracle埋め込み

    C++ 6.0ではOracle埋め込みはEXEC SQL BEGIN DECLARE SECTION;と 定義していたのですがC++.NETでは ORA_SUB.cpp(15) : error C2146: 構文エラー : ';' が、識別子 'SQL' の前に必要です。 ORA_SUB.cpp(15) : error C2501: 'EXEC' : 識別名を宣言するのに、型が指定されていません。 ORA_SUB.cpp(15) : error C2146: 構文エラー : ';' が、識別子 'BEGIN' の前に必要です。 ORA_SUB.cpp(15) : error C2501: 'SQL' : 識別名を宣言するのに、型が指定されていません。 ORA_SUB.cpp(15) : error C2146: 構文エラー : ';' が、識別子 'DECLARE' の前に必要です。 ORA_SUB.cpp(15) : error C2501: 'BEGIN' : 識別名を宣言するのに、型が指定されていません。 ORA_SUB.cpp(15) : error C2146: 構文エラー : ';' が、識別子 'SECTION' の前に必要です。 とエラーになります。 C++.NETでは使い方が違っているのでしょうか? よろしくお願い致します。

  • 引数付きコンストラクタでコンパイルエラー

    MFCダイアログベースアプリを作成しています。 開発環境はVC++2005です。 CtestDlgクラスのOnBnClickedOk()関数内での処理、 CtestDlg2 dlg( &hoge ); にてCtestDlg2ダイアログ起動し、CString型変数hogeを、 CtestDlg2クラスのコンストラクタに引数として渡したいのですが、 コンパイルエラーが出てしまい、何が原因か分かりません。 解決法をご存知の方おられましたら、お手数ですがご教授お願い致します。 【エラー内容】 error C2664: 'CtestDlg2 ::CtestDlg2(const CtestDlg2 &)' : 1 番目の引数を 'CString *__w64 ' から 'const CtestDlg2 &' に 変換できません。(新しい機能 ; ヘルプを参照) 理由: 'CString *__w64 ' から 'const CtestDlg2' へは 変換できません。 コンストラクタはソース型を持てません、またはコンストラクタの オーバーロードの解決があいまいです。 【CtestDlgクラス内宣言】 void CtestDlg::OnBnClickedOk(){ CString hoge = "aaa"; CtestDlg2 dlg( &hoge ); dlg.DoModal(); } 【CtestDlg2クラスコンストラクタ】 //CtestDlg2::CtestDlg2(CWnd* pParent /*=NULL*/) CtestDlg2::CtestDlg2(CString* st, CWnd* pParent /*=NULL*/) : CDialog(CtestDlg2::IDD, pParent), m_st(st) { } 【CtestDlg2クラスヘッダ内宣言】 public: CtestDlg2::CtestDlg2(CString* st, CWnd* pParent /*=NULL*/); CString* m_st;

  • MFC ダイアログベース

    メインのダイアログ関数に他のクラスからアクセスできないのですがどうしてでしょうか?(定義されていない識別子とでます)逆はできます。 例 testDlgというプロジェクトをつくるとCtestDlgというクラスがまずできます。新しいダイアログを追加してクラスをCsubtestDlgとして、 CsubtestDlg subDlg; subDlg。●●はできますが CtestDlg Dlg; Dlg。●●ができません。CtestDlgは定義されていないとでます。 どうすれば解決できるでしょうか?

  • ウィンドウ位置情報の取得

    <環境> WIN98 VC++6.0 MFC  宜しくお願いいたします。 数個のダイアログが付箋として張られているアプリにて、アプリ終了時にダイアログの位置情報を以下のコードにて取得することが出来ます。 数個の付箋がダイアログでは無く、ウィンドウの場合は、下記コードをどのように変更すれば良いのでしょうか? 自分で分かる範囲でダイアログに関するところをウィンドウに変えたところ、m_rectはメンバではない というエラーが出ました。 ************************************** void Cxxx::OnDestroy() //Cxxxは付箋ダイアログの親ダイアログ { CDialog::OnDestroy(); // TODO: この位置にメッセージ ハンドラ用のコードを追加してください int iCnt; CTestDlg *pDlg; for ( iCnt = 0; iCnt < m_pAryDlg.GetSize( ); iCnt ++ ){ pDlg = (CTestDlg*)m_pAryDlg[ iCnt ];//iCnt番目のダイアログを指すポインタ // 今はTRACEで出力 TRACE ( "X1(%d) Y1(%d) X2(%d) Y2(%d)\n", pDlg->m_rect.left, pDlg->m_rect.top, pDlg->m_rect.right, pDlg- >m_rect.bottom ); pDlg->DestroyWindow( ); delete pDlg; } }

  • 分割コンパイルの方法

    自作のクラスのメンバ変数にSTLのlistを使おうと考えています。 1ファイルでのコンパイルは通るのですが、以下のように分割コンパイルしようとすると、list<int> value; の行で以下のエラーが出ます。 listクラスではなく、別の自作のクラスをメンバ変数にして、そのクラスのヘッダーファイルをインクルードした場合は問題なくコンパイルできるので、何が問題なのか全く見当がつきません。どなたかご存知の方がおられれば解決法を教えていただけないでしょうか?よろしくお願いいたします。 error C2143: 構文エラー : ';' が '<' の前に必要です。 error C2501: 'list' : 識別名を宣言するのに、型が指定されていません。 error C2059: 構文エラー : '<' error C2238: ';' の前に不正なトークンがあります。 /* test.h */ #ifndef TEST_H_INCLUDED #define TEST_H_INCLUDED #include <list> class Test{ public: list<int> value; Test() {} }; #endif

  • Visual C++ 2005 MFCアプリのクラス作成について

    Windows XP SP3 Visual C++ 2005 pro MFCアプリケーション シングルドキュメント 以上の環境でアプリケーションを作りたいと思っています。 C++は、C言語をベースという意味ではそれなりにはわかっているつもりです(自信はないですが...)。 本当はSDKを学んだ方がよろしいんでしょうが、時間の都合上MFCでやることにしました。 ちなみに、VC++を使ったプログラミングは初めてのものです。 そこで質問なのですが、 通常のC++においてクラスを作るときは、cppファイルとhファイルで分けてつくってmainのcppでインクルードしますよね。 VC++ MFCも 「C++クラスの追加」 でウィザードを利用してあるクラスAを作成てみまして、わかる方にはわかるでしょうけど、もちろん以下のように出力されました。 A.h------------------ #pragma once class A { public: A(void); public: ~A(void); }; A.cpp---------------------- #include "A.h" #include "StdAfx.h" A::A(void) { } A::~A(void) { } そしてとりあえず、その状態で何も手を加えずにとりあえずコンパイルにかけてみたところいきなり以下のようなエラーが出ました。 error C2653: 'A' :識別子がクラス名でも名前空間名でもありません。 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません warning C4508: 'A' : 関数に戻り値の型が指定されていません。戻り値を void 型と見なします。 error C2653: 'A' : 識別子がクラス名でも名前空間名でもありません fatal error C1903: 直前のエラーを修復できません。コンパイルを中止します 何も手を加えていない状態でこのようなエラーが出るということは、どこかでこのhやcppをインクルードする必要があるのだろうとは思います(でもそういう類のことはウィザードで作成した際に、VC++が自動でコーディングしてくれたりしないのでしょうかね...)。 むしろ、MFCでこのような単純なC++クラスを作ること自体があまり好まれないことなのでしょうか。 もちろんこのクラスを作っていってから、ある処理をさせていこうと思っているので、自分としては以前から行っていたC++のようにコーディングしていきたいと思うのですが、もし好ましくないようならどのファイルにMFC的ではない、ただのC++的なクラスを定義したりすればよろしいのでしょうか。 もしくは、好ましくなくても何らかの対処方法があれば教えていただきたく思います。 Webで調べても MFCクラスの作成などのことしか書いてないので、ちょっとわからなくて困っています。よろしくお願いします。

  • CMainFrameからCPppView::OnFilePrintPreview();を呼びたい。

    環境はWIN98 VC++6.0 MFCです。 以下のようなコードで左クリックにて印刷プレビューが開きます。 void CPppView::OnLButtonDown(UINT nFlags, CPoint point) { CPppView::OnFilePrintPreview(); CView::OnLButtonDown(nFlags, point); } これをCMainFrameから呼びたくて、以下のようにしました。 #include "pppView.h" void CMainFrame::OnMenuitem32771() { CPppView::OnFilePrintPreview(); } すると以下のようなエラーが出てしまいます。 どうすればCMainFrame内で使えるようになりますか? よろしくご指導ください。 MainFrm.cpp c:\windows\デスクトップ\ppp\pppview.h(21) : error C2143: 構文エラー : ';' が '*' の前に必要です。 c:\windows\デスクトップ\ppp\pppview.h(21) : error C2501: 'CPppDoc' : 識別名を宣言するのに、型が指定されていません。 c:\windows\デスクトップ\ppp\pppview.h(21) : error C2501: 'GetDocument' : 識別名を宣言するのに、型が指定されていません。 C:\WINDOWS\デスクトップ\ppp\MainFrm.cpp(113) : error C2248: 'OnFilePrintPreview' : protected メンバ (クラス 'CView' で宣言されている)にアクセスできません。 c:\program files\microsoft visual studio\vc98\mfc\include\afxwin.h(3660) : 'OnFilePrintPreview' の宣言を確認してください。 C:\WINDOWS\デスクトップ\ppp\MainFrm.cpp(113) : error C2352: 'CView::OnFilePrintPreview' : 静的でないメンバ関数の中で呼び出しが正しくありません。 c:\program files\microsoft visual studio\vc98\mfc\include\afxwin.h(3660) : 'OnFilePrintPreview' の宣言を確認してください。 cl.exe の実行エラー

  • OKボタンをクリックした時に、エディットボックスを操作したい

    こんにちは。 表題の通り、MFCのダイアログベースでワークスペースを作ったときに、はじめから作成されるコードに加えて long fun1(); void CTestDlg::OnOK() {   long ret;   ret = func1(); } long fun1() {   m_ed1.SetWindowText("あいうえお"); } のようにすると、「定義されていない識別子です。」と「左側がクラス、構造体、共用体ではありません」とのメッセージが出るのですが、これはどこをどう直せばいいんですか? ただし、m_ed1はコントロール変数として宣言しています。

  • VisualC++でクラスのヘッダーファイルの書き方がわかりません

    今、Visual C++(CLR)を使って、MultiClassという名前のクラスを作っています。 クラスの作り方は大体わかったのですが、 疑問が出ました。以下のように記述するとエラーが発生してしまいます //クラスのヘッダーファイル #pragma once ref class MultiClass { public: void MultiClass(void); }; //クラスのCPPファイル #include "StdAfx.h" #include "MultiClass.h" void MultiClass::MultiClass(void) { } //エラー名 エラー 1 error C2380: 前の型 'MultiClass' (コンストラクタが戻り値の型を返すか、またはクラス名を再定義しています。) エラー 2 error C2533: 'MultiClass::{ctor}' : コンストラクタの宣言に戻り値の型が含まれています。 ヘッダーで先頭voidを消して、CPPの先頭voidを消したら正常に 動作するのですが、普通、 戻り値 メソッド名 (引数) なのに、なぜエラーが発生するのですか? さらに2行目以降はなぜ、 void を先頭につけないと エラー 2 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません というエラーが発生するのでしょうか? ネットで調べてもまったくわかりません わかる方お願いします

専門家に質問してみよう