質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Q&A

解決済

3回答

8563閲覧

VisualC++.net(2002)でDDXを使ってメンバ変数(DDX変数)を追加したが、削除の仕方がわからない。

tada_tadaa

総合スコア111

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

0グッド

0クリップ

投稿2016/04/21 13:45

お世話になっております。
VisualC++.netの入門書を読んでいるのですが、その中に
DDXを使ってメンバ変数を追加する方法が載ってました。
それで、追加したのはいいのですが削除の仕方がよくわか
りません。

↓メンバ変数を設定(メンバ変数の追加ウィザード)した後、もう一度メンバ変数設定の画面を開いたときのキャプチャ画像

メンバ変数追加ウィザード

↓メンバ変数が追加されたと思われるソースコード

C++

1// DDX_testDlg.cpp : 実装ファイル 2// 3 4#include "stdafx.h" 5#include "DDX_test.h" 6#include "DDX_testDlg.h" 7 8#ifdef _DEBUG 9#define new DEBUG_NEW 10#endif 11 12 13// CDDX_testDlg ダイアログ 14 15 16 17CDDX_testDlg::CDDX_testDlg(CWnd* pParent /*=NULL*/) 18 : CDialog(CDDX_testDlg::IDD, pParent) 19 , m_Edit1(_T("")) 20 , m_Edit2(_T("")) 21{ 22 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 23} 24 25void CDDX_testDlg::DoDataExchange(CDataExchange* pDX) 26{ 27 CDialog::DoDataExchange(pDX); 28 DDX_Text(pDX, IDC_EDIT1, m_Edit1); 29 DDX_Text(pDX, IDC_EDIT2, m_Edit2); 30} 31 32BEGIN_MESSAGE_MAP(CDDX_testDlg, CDialog) 33 ON_WM_PAINT() 34 ON_WM_QUERYDRAGICON() 35 //}}AFX_MSG_MAP 36 ON_BN_CLICKED(IDOK, OnBnClickedOk) 37 ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1) 38 ON_EN_CHANGE(IDC_EDIT1, OnEnChangeEdit1) 39END_MESSAGE_MAP() 40 41 42// CDDX_testDlg メッセージ ハンドラ 43 44BOOL CDDX_testDlg::OnInitDialog() 45{ 46 CDialog::OnInitDialog(); 47 48 // このダイアログのアイコンを設定します。アプリケーションのメイン ウィンドウがダイアログでない場合、 49 // Framework は、この設定を自動的に行います。 50 SetIcon(m_hIcon, TRUE); // 大きいアイコンの設定 51 SetIcon(m_hIcon, FALSE); // 小さいアイコンの設定 52 53 // TODO: 初期化をここに追加します。 54 55 return TRUE; // フォーカスをコントロールに設定した場合を除き、TRUE を返します。 56} 57 58// ダイアログに最小化ボタンを追加する場合、アイコンを描画するための 59// 下のコードが必要です。ドキュメント/ビュー モデルを使う MFC アプリケーションの場合、 60// これは、Framework によって自動的に設定されます。 61 62void CDDX_testDlg::OnPaint() 63{ 64 if (IsIconic()) 65 { 66 CPaintDC dc(this); // 描画のデバイス コンテキスト 67 68 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); 69 70 // クライアントの四角形領域内の中央 71 int cxIcon = GetSystemMetrics(SM_CXICON); 72 int cyIcon = GetSystemMetrics(SM_CYICON); 73 CRect rect; 74 GetClientRect(&rect); 75 int x = (rect.Width() - cxIcon + 1) / 2; 76 int y = (rect.Height() - cyIcon + 1) / 2; 77 78 // アイコンの描画 79 dc.DrawIcon(x, y, m_hIcon); 80 } 81 else 82 { 83 CDialog::OnPaint(); 84 } 85} 86 87//ユーザーが最小化したウィンドウをドラッグしているときに表示するカーソルを取得するために、 88// システムがこの関数を呼び出します。 89HCURSOR CDDX_testDlg::OnQueryDragIcon() 90{ 91 return static_cast<HCURSOR>(m_hIcon); 92} 93 94void CDDX_testDlg::OnBnClickedOk() 95{ 96 // TODO : ここにコントロール通知ハンドラ コードを追加します。 97 OnOK(); 98} 99 100void CDDX_testDlg::OnBnClickedButton1() 101{ 102 // TODO : ここにコントロール通知ハンドラ コードを追加します。 103 104 // エディットコントロールから文字列を取得 105 UpdateData(TRUE); 106 107 // エディットコントロールの文字列をコピー 108 m_Edit2 = m_Edit1; 109 110 // エディットコントロールへ文字列を表示 111 UpdateData(FALSE); 112 113} 114 115void CDDX_testDlg::OnEnChangeEdit1() 116{ 117 // TODO : これが RICHEDIT コントロールの場合、まず、CDialog::OnInitDialog() 関数をオーバーライドして、 118 // OR 状態の ENM_CORRECTTEXT フラグをマスクに入れて、 119 // CRichEditCtrl().SetEventMask() を呼び出さない限り、 120 // コントロールは、この通知を送信しません。 121 122 // TODO : ここにコントロール通知ハンドラ コードを追加してください。 123} 124

m_Edit1とm_Edit2の二つのメンバ変数をメンバ変数追加ウィザードを
使って追加しましたが、削除の仕方がわかりません。これは手作業で
ソースコードから削除していくしかないのでしょうか?
何か効率的な削除の仕方がありましたら教えていただければと思いま
す。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

追加は、ウィザードでできますが、削除は手動です。
基本的に、ウィザードで追加されるのは、基本3カ所かと思いますので、まずはそこを削除すれば、
あとは、自前で書いたコード部分などは、ビルド時に、シンタックスエラーでひっかかりますから、都度修正すればよいかと。

m_Edit1を中心に話をすすめさせていただくとして、
ウィザードで追加されるコードは、

CDDX_testDlg::CDDX_testDlgの、コンストラクタでの初期化コード

, m_Edit1(_T(""))

CDDX_testDlg::DoDataExchangeの、データExchange部分

DDX_Text(pDX, IDC_EDIT1, m_Edit1);

質問コードには記載ありませんが、ヘッダでの変数定義部分

CString m_Edit1;

ここまでがウィザードで追加された処理で、
以下は、さらなるウィザードでの追加または、自前記載コードのはずです。

まずウィザードで追加している部分ですが、BEGIN_MESSAGE_MAPの定義と、

ON_EN_CHANGE(IDC_EDIT1, OnEnChangeEdit1)

対応する関数

void CDDX_testDlg::OnEnChangeEdit1() { // TODO : これが RICHEDIT コントロールの場合、まず、CDialog::OnInitDialog() 関数をオーバーライドして、 // OR 状態の ENM_CORRECTTEXT フラグをマスクに入れて、 // CRichEditCtrl().SetEventMask() を呼び出さない限り、 // コントロールは、この通知を送信しません。 // TODO : ここにコントロール通知ハンドラ コードを追加してください。 }

そして、そのヘッダ(ヘッダファイル内)

void OnEnChangeEdit1();

が、不要となります。

あと、実際には、これだけだと手動で追加されたコード部分CDDX_testDlg::OnBnClickedButton内、

m_Edit2 = m_Edit1;

でエラーがでるかと思いますので、ここ部分はあるべき姿に、修正してください。

あと、厳密には、リソースIDの、

IDC_EDIT1

も、本来いらなくなりますが、
ここはリソースファイルを手動で修正する必要がありなのですが、変に修正すると、その後のウィザードの動作に影響がでる可能性があるので、慣れないうちは、放置でよろしいかと。
ダイアログエディタでコントロールを削除した場合にIDC_EDIT1がきちんと消えてくれる場合が多いですが、残ってしまうこともありますので。

要は、使った変数
今回は、m_Edit1
そして、それに対応するリソースID
IDC_EDIT1
に関連するコード部分を丁寧に削除しけばよいこととなります。

変更前にバックアップを取っておき、失敗したら戻して再度作業をされれば、よいかと。

投稿2016/04/21 16:20

ItoTomonori

総合スコア1283

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tada_tadaa

2016/04/21 22:05

丁寧に回答を教えていただきありがとうございます。 ItoTomonori様が教えてくださった手順で削除しましたところ、無事に削除できたようです。 やはり手動で削除ということになるのですね。 ウィザードで追加されるのは、基本3カ所らしくて、あとは、自分で書いたコード部分などは、 ビルド時に、シンタックスエラーでひっかかる部分を自分で修正していけばよいということ が、今回のポイントみたいだなと思いました。 丁寧なご回答ありがとうございました。
guest

0

解決済みですが、
>VisualC++.net(2002)で
本当に、Visual Studio 2002 であれば、
Visual Studio 2013 / 2015 Community or Professional以上 の使用を検討してください。
1.VS 97 / 98 の次が VS2002 で、.Netframework 対応製品 1番目でもあって、
サポートが終了しているのは勿論、出来が悪いです。
MS製品の法則、Ver1.0様製品は買うな、3.0まで待て
⇒現行VSに近い形になったのは、VS2002 / VS2003 では無く、VS2005 / VS2008 から、
現行VSの形は、VS2010 / VS2012 / VS2013 / VS2015
元々、DOS時代から住み分けをしていた、C++とBASIC製品ですので、
VS97/98では、プロジェクトの相互連携すら、苦労する製品でした。
VS2002/2003で目指したが不十分で、VS2005/2008でやっと来たねの状態。
VS2013 以後は、製品としての立ち位置が微妙になって、、、、。
2.10数年前の製品ですので、其処で得た知識は、現行製品に対しては
古すぎる可能性があります。
.Netframework 1.0 / 1.1 はサポート終了、現行windows では使用できない状態です。
.Netframework 2.0 / 3.0 も 3.5 以降への改修が推奨されています。
1.0 系⇒2.0系の、世代間断絶が一番酷いですが、
2.0 / 3.0 系 ⇒ 3.5系も、嵌る部分があったりします。
3.C++ と C++/CLI,C++/CLR は別物なのは、質問者さんには御分りだと思いますが、
他の方向けに、
2002で学んでも、初心者泣かせの事柄が、現行バージョンでは多くなっています。
少なくとも、VS2010 以後のC++,C++/CLR で学んだ方が、役にたちます。
C++/CLR :VS20xx が選択肢
C++ :Eclipse などで、GNU C++ :無料系 や、
Intel C++:解っている方の業務用はこっちかも。
VS20xx用C++ は、Windows 依存コードになりがち。

 C++/CLR(C++/CLI) の道は険しくて、資料や、事例検索が困難です。
基本的な事柄でさえ、MSDN / TechNet と海外サイトを探す事になりがちです。
VS2013 以後 C++/CLR 用のWidows フォームアプリケーション テンプレートが
削除されました。
⇒Windows フォームアプリケーションの作成が出来なくなったわけではありません。
が、テンプレートが無くなる、と云う事はどういうことなのか考えてみてください。

投稿2016/04/22 00:04

編集2016/04/22 00:32
daive

総合スコア2028

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tada_tadaa

2016/04/22 00:43

回答ありがとうございます。 >本当に、Visual Studio 2002 であれば、 >Visual Studio 2013 / 2015 Community の使用を検討してください。 うーん、悩ましいところですね。たしかにVisual Studio 2013 / 2015 Communityとか新しい バージョンを使うのが好ましいんでしょうけど。 ○持ってるパソコンが古い。 ○経済的に余裕がなく、古い本は数百円で購入できる ○WindowsXPをこれからも使う予定だ ○とりあえずプログラミングの勉強ができれば良い程度に思ってる など、総合的に判断してせっかく持ってるVisual Studio 2002も使いたいし、まあ そのうち Visual Studio 2013 / 2015 Community も使ってみようかなといったところ ですかね。
daive

2016/04/22 00:59 編集

○持ってるパソコンが古い。 ⇒VS2005 でも、1GRAM位無いと、きついですものねぇ。 ○経済的に余裕がなく、古い本は数百円で購入できる ⇒情報系は、10年たったら、情報がゴミ化するので、図書館使用でしょうねぇ。 ○WindowsXPをこれからも使う予定だ ⇒ウィルス対策だけはしっかりして下さい。 (RAMが少ないと重くなりがちですが)  AVAST/AVGなど無料系でXPサポが継続されている物があります。 ○とりあえずプログラミングの勉強ができれば良い程度に思ってる ⇒現状では、学んで応用範囲が広いのは、WEB系の各言語や、C++  C++/CLR,C++/CLI:Windows に特化している。  C++       :どのOSでも、技術者が少ない、             組込み系は、比較的簡単な内容でも、             C/C++が出来ると重宝されます。  WEB系言語    :石を投げれば位、自称WEB系は多い様子 学生:DreamSpark (要国際学生証ID)で、Microsoftから各種特典 企業、設立5年未満:BizSpark(審査有?)でMicrosoft 特典あり。
guest

0

私の知識が無いだけかもしれませんが、
私は手で、ヘッダとソースから、削除しています。
手で消しても、その後、ウィザードから変数やイベントハンドラも追加できます。

投稿2016/04/21 13:58

ShinyaAnan

総合スコア241

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tada_tadaa

2016/04/21 14:11

回答ありがとうございます。 僕の場合、まだソースを見てプログラム文の意味がよくわからないレベルなんですけど、 やはりこの場合、設定したメンバ変数(この場合m_Edit1とm_Edit2)がある部分を適当に 全部消していくというやり方になるんでしょうか? ShinyaAnanさんはプログラム文を理解されているうえでどの部分を消去すればいいか 分かっていて削除されているのでしょうか。今後の参考のためにも、その点を聞かせて もらえれば助かります。 失礼します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問