ダイアログクラスへの値の受け渡し
- VC++6.0でダイアログベースのプログラムを作成しています。
- 親ダイアログクラスから子ダイアログクラスへの値の受け渡し方法について詳しく教えてください。
- また、自作クラスに値を渡す際にも、親ダイアログクラスで設定した値を使用したいです。
- ベストアンサー
ダイアログクラスへの値の受け渡し
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で設定した値を使いたい。 }
- hagimoto
- お礼率72% (21/29)
- C・C++・C#
- 回答数1
- ありがとう数3
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
かなりのエスパーを発揮すると CDialog2のnewは成功していますか? まずint TEST=Dialog1->m_hoge1として Daialog1がいきているか確認。 次にDialog2のDoModalの前に Dialog2の実態が在る(NULLじゃない)ことを 確認してくださいな。 その上でエラーメッセージを載せれば 解決しそう・・・
関連するQ&A
- 新ダイアログの初期化
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を入れなければエラーはでません。 ということは入れる場所に問題があるのかとおもいました。 解決方法を教えて下さい。
- ベストアンサー
- C・C++・C#
- ダイアログからビュークラスのメンバ変数へ代入するには?
プログラミング初心者です. Visual C++.netを使っています. Viewクラスから,Domodal()にてあるダイアログを呼び出しました. ダイアログ上のあるボタンを押したら,Viewクラスのメンバ変数へ1を代入するという処理をしたいと考えています. ラジオボタンやエディタコントロールであれば,DDXを利用すればよいと思うのですが,単なるボタンの場合はどうすれば,呼び出し元のViewクラスの値を操作(この場合,代入)出来るのでしょうか?
- ベストアンサー
- C・C++・C#
- visual C++ 2005 でのダイアログベースのプログラムから別のダイアログを呼ぶこと
現在visual c++を使ってボタンを押すと次の画面にジャンプすると言う作業 をやっています。 ダイアログの呼び出し http://mail2.nara-edu.ac.jp/~asait/visual_cpp/dialog1/dialog/dialog.htm 上記のサイトの通り行っていくとダイアログ クラス CdiaDlgの変数の追加で 「value」を選択できない状態で先に進めません。 何が悪いのでしょうか? それまでの新しいプロジェクト開始からエディットボックスの変数割り当てまでは何度も確認しました。 アドバイス宜しくお願いします。
- 締切済み
- その他(プログラミング・開発)
- ダイアログ最前面表示時の後ろの画面操作について
はじめまして。 お世話になります。 開発環境:WindowsXP VC++6.0 MFC使用 ダイアログベースで画面を作成(A.exe CDialogベース)し、その画面でボタンを押下し 子画面(A_Child)を表示させます。表示方法はDoModal()で。 そのA_ChildはCDialogベースです。 A_Childダイアログが表示されている間(最前面)は、デスクトップ上の操作を 何も出来ない様にしたいのですが、方法はありますでしょうか? (例:スタート→ログオフでダイアログが表示しますよね。 その時ってそのダイアログ以外は触れないですよね。) せめて、自分たちが作成したアプリだけでも操作不可能にしたいのです。 SetWindowPos()、ModifyStyle()、色々試しましたが上手くいきません。 DoModalで表示させるのがそもそもまちがいののでしょうか? 何か方法が有りましたらよろしくお願いします。 説明が下手ですみません。
- ベストアンサー
- C・C++・C#
- クラスインスタンスとクラス型変数の配列
C++からシフトしてきた若輩JAVAプログラマですが、微妙に理解しきれない部分があるため、お知恵をお借りしにきました。 最初にC++のサンプルを書かせていただきます。 ----- C++ ----- class Hoge { /* 実装省略 */ } int main( void ) { Hoge *hoge = new Hoge ; Hoge *hoge = new Hoge[10] ; } --------------- これをJAVAで実装した場合、以下のようになると思います。 ----- JAVA ----- class Hoge { /* 実装省略 */ } class Test { public static void main( String[] args ) { Hoge hoge = new Hoge() ; /* 1 */ Hoge[] hoge = new Hoge[10] ; /* 2 */ } } --------------- JAVAの場合、2ではクラスのインスタンスが確保されていないことを知りました。C++ではnewの役割が「何かをメモリ上に確保する(malloc)」という意味合いであったのに対し、JAVAの場合は考え方が違うものだということでしょうか。 そうすると、 int[] a = new int[10] ; と、 Hoge[] hoge = new Hoge[10] ; のnewは、意味が違うという認識にたどり着いてしまうのですが、そうなると『妙な』気持ちがしてしまいます。そんな面倒な言語仕様では無い気もしますし。 私の考え方が間違っている可能性が高いと思いますので、教唆していただけると助かります。 よろしくお願いします。
- ベストアンサー
- Java
- モードレスダイアログの作成方法
モードレスダイアログの作成方法として、以下のような記述を良く見かけます。 m_pDlg = new Choge2Dialog; m_pDlg->Create(IDD_DIALOG2, this); これを 変更1 m_pDlg = new Choge2Dialog(); 変更2 m_pDlg = new Choge2Dialog(this); このように変更しても問題無く作成されますが、これら3つの違いは何なのですか?
- ベストアンサー
- C・C++・C#
- 現在のクラスを生成したクラスに渡したい
親クラスで生成した子クラス(ダイアログ)から親クラス(ダイアログ)の関数などを使えるようにしたいと思っております。 ちなみに継承クラスで親クラスの関数を使うのではなく、親クラスそのもの(ダイアログ表示)を子クラスから変更できるようにしたいです。 (簡単になりますが…)プログラムの構成は以下のようになっており、thisポインタを渡すか所でエラーが起こってしまいます。 ------------------------------------------------ class AAA { BBB *b; void classBBB{ b = new BBB(this); // こういうことがしたいが、できない void fun( int a ); // ダイアログの表示が変更する(予定) }; class BBB { AAA *a; BBB(AAA *pDlg){ a==pDlg; } void fun(){ int b; a->fun(b); } // 親クラスの関数を呼び出したい }; ------------------------------------------------ ただし、class Aとclass Bを生成する上位階層のプログラム構築をすることはなしとします。 ------------------------------------------------ こんな感じ AAA *a = new AAA(); BBB *b = new BBB(a); ------------------------------------------------ どうしてもclass AAAからclass BBB呼び出したいと思ってます。 何か良い解決法があれば、教えていただきたいです。 宜しくお願い致します。
- 締切済み
- C・C++・C#
- OnDestroy() について
環境 WIN98 VC++6.0 MFC SDIにて アプリ起動と同時にダイアログを表示しています。 int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { 略 dlg = new CInput(this); dlg->Create(IDD_DIALOG1); dlg->ShowWindow(SW_SHOW); return 0; } <質問1> このような場合に、CInputクラスに以下のようにOnDestroy()を追加しましたが、 ダイアログを閉じた時もアプリ終了時にもメッセージが飛んできません。 どうしてなのですか? void CInput::OnDestroy() { CDialog::OnDestroy(); AfxMessageBox("789"); } <質問2> 更に、以下のように新規にダイアログバーを追加したところ、メッセージが飛ぶようになりました。 どうしてなのでしょうか? int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { 略 if (!m_wndMyDialogBar.Create(this, CG_IDD_MYDIALOGBAR, WS_VISIBLE , CG_ID_VIEW_MYDIALOGBAR)) { TRACE0("Failed to create dialog bar m_wndMyDialogBar\n"); return -1; // 作成に失敗 } dlg = new CInput(this); dlg->Create(IDD_DIALOG1); dlg->ShowWindow(SW_SHOW); return 0; }
- ベストアンサー
- C・C++・C#
- 値の渡し方
こんにちわ。 Javaの勉強をしています。 キーボードから入力して、読み込むクラスで読み込んだ値を処理クラスに渡して演算させたくプログラムを作っています。 下にあるのがそうなのですが、値の渡し方がよくわかりません。 よろしければ、アドバイスをください。 //値の入力クラス import java.io.*; public class Main{ public static void main(String args[])throws IOException{ BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); int a = Integer.parseInt(input.readLine()); int b = Integer.parseInt(input.readLine()); } } ---------------------------------------------------------------- //処理クラス public class Enzan{ public static int Wa(int x, int y){ int wa = x + y; return wa; } public static int Wa(int x, int y){ int sa = x - y; return sa; } }
- ベストアンサー
- Java
- 継承したクラスを、継承元のクラス型の引数に渡すとどうなるのでしょうか?
継承したクラスを、継承元のクラス型の引数に渡すとどうなるのでしょうか? 以下のようなケースで、 #include "stdio.h" using namespace std; // baseクラス class base { private: int m_nII; int m_nJJ; int m_nKK; public: base(int i,int j,int k){ m_nII=i; m_nJJ=j; m_nKK=k; } int GetSum(){ return (m_nII+m_nJJ+m_nKK); } }; // base 継承クラス class hoge : public base { public: hoge() : base(1,2,3){} }; void func(base* obj){ // baseクラスを引数に取る関数 printf("sum is %d\n", obj->GetSum()); } // main int main(){ hoge objHoge; func((base*)&objHoge); // <-キャストして渡す return 0; } として、一応、gccでコンパイルは通り、実行結果も期待通りだったのですが、 このやり方で問題は無いのでしょうか? (たとえば継承先のクラスが独自のメンバを持っていたりなどした場合、期待した結果にならないとか・・) よろしくお願いします。
- ベストアンサー
- C・C++・C#
お礼
diolabさんありがとうございました。 とても解り難い質問のしかたで申し訳ございませんでした。 結局ボタン2が押された時の処理を書き換えて、 DoModal()でダイアログを開く前に値を送って保存してみることにしました。 次からは、もう少しまとめてから質問するようにします。 //■ボタン2が押されたら子ダイアログ2を開く CDialog2 *Dialog2; Dialog2 = new CDialog2(); if (Dialog1->flag == 1){ //ダイアログを開く前にGetdata関数に設定値を保存しておく。 Dialog2->Getdata(Dialog1->m_hoge1,Dialog1->m_hoge2,Dialog1->m_hoge3);//値を送る } else{ Dialog2->Getdata(0,0,0);//初期値 } Dialog2->DoModal();//子ダイアログクラス2呼び出し