• 締切済み

c++ 変数を1度使ったら削除する等

変数を1度使ったらなくなるようにしたいです。 今、MFCでダイアログを作成しているのですが AとBのダイアログがあります。 AのOnBnButtonClicked()内で CBDlg dlg; dlg.DoModal(); と作成し、ボタンが押されるとBのダイアログが呼び出されるようにしました。 Bにはエディットボックスがあり、 呼び出されたB内でエディットボックス内を変更します。 最初(1回目)に呼び出した場合にはエディットボックス内に0と表示させておきたいです。 Bを閉じて、もう一度ボタン押下でBを呼び出しても先ほど変更した内容が表示されている、というようにしたいです。 そのためにif文で if(Bが初めて呼び出されたとき){ エディットボックスに0を表示; } else if(2回目以降){     先ほど編集したデータ; } というようにしようと自分の中では考えています。 Bのダイアログが初めて呼び出されたときを0として int i = 0; if(i == 0)...... として それ以降1回呼び出されるごとにiを +1していきたいです。 そうするために int i = 0; を初期化で設定する必要があるのですが そう設定するとBのダイアログが呼び出されるたびに i = 0; されてしまい困っています。 わかりにくい説明かと思いますが、説明不足であれば補足要求をお願いいたします。 ご教授いただきたく思います。

みんなの回答

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.4

CBDlgのオブジェクトローカル変数で持つのであれば コンストラクターなどで初期値を与えるようにします --- BDLG.H class CBDlg : public CDialog { public:   CBDlg(CWnd* pParent = NULL, int* pIntialN = NULL );   int getEditInt(); private:   // これをテキストボックスの変数に割り当てる   int m_nEdit1; }; --- BDlg.cpp CBDlg::CBDlg( CWnd* pParent /*=NULL*/, int* pInitalN /*= NULL */ ) : CDialog( CBDlg::IDD, pParent ) {   if ( pIntialN != NULL ) {     m_nEdit1 = *pIntialN;   } } int CBDlg::GetEditInt() {   return m_nEdit1; } --- 呼び出し元でBdlgのテキストボックスの数値を管理 CBdlg dlg( this, &m_nNumber ); dlg.DoModal(); m_nNumber = dlg.GetEditInt(); 別の方法としては CBDlgのポインタ変数を呼び出し元でメンバー変数として持つ CBDlgのメンバー変数のm_nEditをCBDlgのコンストラクタで初期化 といった方法でしょう --- BDLG.H class CBDlg : public CDialog { public:   CBDlg(CWnd* pParent = NULL ); private:   // これをテキストボックスの変数に割り当てる   int m_nEdit1; }; --- BDlg.cpp CBDlg::CBDlg( CWnd* pParent /*=NULL*/, int* pInitalN /*= NULL */ ) : CDialog( CBDlg::IDD, pParent ), m_nEdit1(0) { } --- 呼び出し元ヘッダー #include "BDLG.h" クラス定義内に CBdlg m_pDlg; と記述 ----呼び出し元CPP コンストラクタでm_pDlgを初期化 CMainFrame::CMainFrame(), m_pDlg( NULL ) { } CBDlgの呼び出しのとき void CMainFrame::OnTest() {   if ( m_pDlg == NULL ) {     m_pDlg = new CBdlg();   }   m_pDlg->DoModal(); } デストラクタまたはWM_DESTROYなどで if ( m_pDlg != NULL ) {   delete m_pDlg; } といった具合でしょう

noname#208124
noname#208124
回答No.3

staticもグローバル変数も= 0で初期化されるのは初回のみです

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.2

この場合、iをCBDlgクラスのstaticメンバ変数にするのがよいかと。 #変数名はもうちょっと長いのに変えたほうがいいでしょうが。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「変数を1度使ったらなくなるようにしたいです。」は正直なところ意味不明なんだけど, 単に「関数の呼び出しを超えて値を保存したい」というなら静的な変数にすればいい. 1つの関数の中で使うだけなら static, 複数の関数で使いたいならファイルレベルで定義する.

doborn
質問者

お礼

回答ありがとうございます。 説明不足で申し訳ございません。 >「変数を1度使ったらなくなるようにしたいです。」 つまりは関数内で i = 0; がされますが、 2回目以降はこのi = 0をしないようにしたいということです。

関連するQ&A

  • 変数について

    .net2003でMFCダイアログを作成中です。 今AダイアログとBダイアログがあります。 Bにはエディットボックスが1つあり、 Aにはボタンが1つあります。 Aにあるボタンを初めて押下した場合にはBのエディットボックス内に [1]を。 Bを閉じて再びAにあるボタンを(2回目)押下した場合にはBのエディットボックス内には[2]と表示させたいです。 これの繰り返しを行いたいのですが、どのようなプログラムにすればよいのでしょうか? Aヘッダで int aaa; // ボタンを押した回数を保存する変数 A.cpp AのOnBnButtonClicked関数内に aaa += 1; //もちろんOnInit内で初期化済み として B.cpp内で if(aaa == 1){ ....... } とやろうとしたのですが当然怒られてしまいます。 ご教授の程よろしくお願いいたします。

  • 連続してダイアログを表示したい?

    VC++6.0を使用しています。 以下のようなコードでダイアログを連続して表示しようと思っています。1番目のダイアログを表示してOKボタンを押下後(このときこのダイアログは消えて)、2番目のダイアログを表示したいと思っているのですが2番目が表示できません。(1番目のところをコメントにすれば2番目は表示できます。)どうして2番目のダイアログが表示できないのでしょうか? // 1番目のダイアログ   CTest1Dlg dlg;   m_pMainWnd = &dlg;   int nResponse1 =dlg.DoModal(); // 2番目のダイアログ   CTest2Dlg dlg;   m_pMainWnd = &dlg;   int nResponse2 =dlg.DoModal(); //   if (nResponse1 == IDOK) {   :以下省略 これだけの情報でアドバイスができますでしょうか? すみません。よろしくお願い致します。

  • 変数の代入について

    ダイアログベースで、ダイアログ1からダイアログ2を開きダイアログ1のエディットボックスのデータをダイアログ2に表示する下記コードを教わりました。 変更後のようにしても問題ないと思いましたが、'dlg' は定義されていない識別子です。とエラーが出ます。 どうしてなのかお教えていただきたいのですが、 よろしくお願いします。 <変更前> CSubDlg dlg2; dlg2.m_strText = strText; dlg2.DoModal(); <変更後> void CSubDlg::OnPaint() { m_strText = dlg.strText; ちなみにdlgはウィザードが作ったコードで、 CMainDlg dlg; m_pMainWnd = &dlg; int nResponse = dlg.DoModal(); ダイアログ1のことだと思うのですが。。。。 ************************** メインダイアログとしてCMainDlgを例にしますが、かなり割愛します。 このダイアログには、Editが貼り付けられているとします。Editコントロールに割り当てたIDをIDC_EDIT_INPUTだと仮定します。 DDXとかのデータ変換を使う方法もありますが、ここでは単にデータを取得します。 // // OKボタンが押された時の処理 // void CMainDlg::OnOK() { // データの取得 CString strText; GetDlgItemText(IDC_EDIT_INPUT, strText); CSubDlg dlg2; dlg2.m_strText = strText; dlg2.DoModal(); } class CSubDlg : pbulic CDialog { public: CString m_strText; // 親から渡される文字列を格納する変数 ・ ・ ・ ・ ・ }; あとは、CSubDlgのOnPaintでテキストを描画します。 void CSubDlg::OnPaint() { // テキストをクライアント領域の中央に描画 CRect rect; GetClientRect(rect); CPaintDC dc(this); dc.TextOut(m_strText, rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); }

  • ダイアログの表示、非表示の切り替えについて

    環境 WIN98 VC++6.0 MFC SDIにて 1.ポップアップメニューの”ダイアログ作成”をクリックすると、 void CMainFrame::OnKNew() { CInput dlg; int iID = dlg.DoModal(); } として、ダイアログを作成します。 2.次に、ダイアログのボタン押し下げにてダイアログを非表示にします。 void CInput::OnButton1() { ShowWindow(SW_HIDE); } このようなコードにおいて、非表示状態での”ダイアログ作成”クリックでは非表示から表示に切り替えることを実現するにはどのようにすれば良いのでしょうか? よろしくお願いいたします。

  • 複数のダイアログの作成について

    環境 WIN98 VC++6.0 MFC SDIにて 1.メニューの”ダイアログ作成”をクリックすると、 void CMainFrame::OnKNew() { CInput dlg; int iID = dlg.DoModal(); } として、ダイアログを作成します。 2.次に、ダイアログのボタン押し下げにてダイアログを非表示にします。 void CInput::OnButton1() { ShowWindow(SW_HIDE); } このようなコードにおいて、一旦非表示にした後で、また”ダイアログ作成”メニューにてダイアログを作成した場合、 1.これは新たに2個目のダイアログが作られたのでしょうか? 2.それとも、単に最初に作られたダイアログが非表示から表示状態になっただけでしょうか? 3.それとも、最初のダイアログの上に2個目のダイアログが上書きされてしまうのでしょうか? 以上よろしくお願いします。

  • MFC、ダイアログベースでのモードレス作成

    現在、MFCで検索プログラムを作成しています。 始めはDoModalで作成していたのですが、ダイアログを閉じずに、ダイアログを複数並べて見たいという意見が出た為、モードレスで作成し直そうとしたところ、ダイアログが現れてくれません。 インターネットで見つけたソースを試してみたのですが、上手くいきません。 どなたか教えて頂けますか? =ダイアログに移るボタンコードに= CDlg1 dlg; dlg.Create(IDD_DIALOG1, this); dlg.ShowWindow(SW_SHOW); (dlg.DestroyWindow();は他に記述) 1. 上記では、ShowWindowに0が返ってしまい、一瞬ダイアログが映って 消えてしまいます。Createは1が返ってるのでいいかと思いますが…。 2. あと、違うソースで試したところ、ダイアログは表示できるものの、 一回消してしまうと、もう一度ボタンを押しても再度は表示されません。 しかも、Destroy()を設定したOKボタンでは強制終了となってしまいます。 モードレスで作成すると、一回そのダイアログを消してしまうと再度表示ができないのでしょうか? モードレスってただ他の処理ができるというだけで、そのダイアログを何枚も表示させておくことはできないのでしょうか? 3. このダイアログにjpegファイルを表示させているのですが、ダイアログベース・htmlView以外で表示させれる方法がありましたら教えて下さい。 よろしくお願いします。

  • プログラム分割で

    VC++6.0でダイアログベースのアプリを作成しています。 少々大きくなったのでプログラムを分割しました。 この場合 分割した側からメイン側のダイアログに配置したエディットボックスに 文字表示したいのですが出来ませんでした。 現在は エディットボックスのメンバ変数 m_EdWindow として・・・ //コールバックルーチンの中で CAiCallDlg *dlg; dlg = (CAiCallDlg *)Param; dlg->m_EdWindow.SetWindowText("もじもじ"); //ボタンなどのイベントの中で m_EdWindow.SetWindowText("もじもじ"); で表示させていますが別ファイルとして作成した関数内からの表示はハンドルを取得して? SetWindowText が使えるのでしょうか。

  • ダイアログを終了させてもハンドルが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() するとリークが発生します。 識者の方、原因、対策など、ご教授願います。

  • SetDlgItemInt( ) c++

    今MFCでダイアログを作成いたしました。 IDC_EDIT1というエディットボックスが1つあります。 そのほかにもいろいろありますが、今回はこのエディットボックス内で SetDlgItemInt( )を使って処理したいのです。 //処理内容 double a; a = 10.5; SetDlgItemInt(IDC_EDIT1, (int)a); 以上のようになっています。 SetDlgItemIntの第2引数がUINTなので そのまま SetDlgItemInt(IDC_EDIT1, a); とすると当然怒られてしまう訳ですが、 SetDlgItemInt(IDC_EDIT1, (int)a); とすると逆にエディットボックス内には [10]としか表示されません。 正しく表示させるにはどうしたらよいのでしょうか。 ご教授の程よろしくお願いいたします。

  • DLLでダイアログ

    VC++6.0にてMFCを使うDLLを作成しています。 関連HPを参考になんとかDLLを作ることが出来ました。 そこで今度はDLL側でダイアログボックスを作成して表示させようとしたところうまくいきません。 エラーも無くスルーされてしまいます。 こういう使い方は出来ないのでしょうか。 ↓DLL関数のソースファイルです。 ---------------------------------------------- #include "StdAfx.h" #include "Defs.h" #include "Func.h" #include "resource.h" #include "testdlg.h" #include "dlg2.h" int WINAPI DllFunc( CString &p_rcStr, CWnd *p_pcWnd ) { TestDlg dlg; Cdlg2 dlg2; dlg.ps = p_rcStr; dlg2.DoModal();//なにも出ない AfxMessageBox(p_rcStr);//コレはOK dlg.DoModal();//何もでない return TRUE; } --------------------------------------------

専門家に質問してみよう