• ベストアンサー

resource.hに残る不要な#define

VC++6.0でコントロールを作りプロパティからIDを変更するとresource.hに初期の宣言が残ります。 コントロールが多いと#defineが列挙され 見にくいのですが無視しても構わないのでしょうか? また100個近くあるチェックボックスの初期状態を保持しておく方法で何かいい方法はありませんか? iniファイルかレジストリか、どう格納するのが良いか知りたいです。

  • yruri
  • お礼率40% (21/52)

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

  • ベストアンサー
  • otn
  • ベストアンサー率66% (14/21)
回答No.2

無視するよりも削除していく方が安全です。特にこの部分は#defineで書かれていますので、いろいろとやっていると何かの拍子に番号が重なってしまうことがあります。そうなると後で大変な思いをする羽目になってしまいます。ぐちゃぐちゃにならないうちにこまめに整理した方がいいです。 しかしながら、resource.hを直接編集するのは大変ですから(どれを使用しているかこのヘッダーだけではわからないので) 「表示(V)」→「シンボルブラウザ(Y)...」 で削除するといいと思います。使用済みのものは削除できないようになっている上、イベントの削除のようにコメントアウトではなく本当に消してくれるのできれいになります。 また、resource.hを直接編集した場合は 「・・・再ロードしますか?」 というメッセージが表示されますので必ず再ロードしてください。 チェックボックスの初期状態ですが、この保存にはiniファイルを使用した方がいいと思います。iniファイルはEXEと同じ場所に保存しておくのがやりやすいです。この際にiniファイルはフルパス指定となりますが、MFCを使用する場合、EXEのフォルダの取得は InitInstance()の中でm_pszHelpFilePathの値からファイル名をとれば簡単に取得できます。 iniファイルにする一番の利点は、丸ごとコピーすれば簡単に環境(チェックボックスの初期状態)を移行できる点にあります。また、アンインストーラを備えていなくてもファイルの削除だけでアンインストールにもなります。

yruri
質問者

補足

resource.hの件大変やってみました、今までずっと気になっていたので本当に目から鱗です、ありがとうございます。 僕にとっては20pt以上の回答でした。 iniファイルの利点は確かにコピーと削除の容易さにあるんですね、ありがとうございます。

その他の回答 (1)

  • RAPTsong
  • ベストアンサー率42% (74/175)
回答No.1

resource.h は、VC++が勝手に作るものなので、基本的に無視して構いません。 どうしても変更したいという場合は弄っても構いませんが、整合性が 取れるようにしておきましょう。 σ(^^)の場合の整合性確認は、 #define IDC_HOGE 35000 とあったとして、IDC_HOGE が使用されていないかを確認するには、 「ファイルを検索」で「IDC_HOGE」を検索し、該当なしなら、コメントアウトします。 で、リビルドに成功すれば問題なしということで削除します。 まぁ、この手続きは面倒なので、無視してしまっても特に問題はありません。 100個のチェックボックスは3ステートですか? 2ステート(ON/OFFのみ)の場合であれば、ビット演算で 記憶することもできます。 保存先は、iniファイルでもレジストリでも、やることはどちらも大して変わりません。 iniファイルであれば、例えば、 [MyCheckBox] 0=0 1=1 2=1 3=0 ... 99=1 とかやる方法もあります。 保存時は、 char key[10], state[2] = {0}; for(int i = 0; i < 100; ++i){   sprintf(key, "%d", i); state[0] = ボタンの状態(ONなら"1", OFFなら"0");   WritePrivateProfileString("MyCheckBox", key, state, "MyApp.ini"); } 取得時は、 INT default = 0; // 初期値 UINT state; for(int i = 0; i < 100; ++i){   sprintf(key, "%d", i);   state = GetPrivateProfileInt("MyCheckBox", key, default, "MyApp.ini"); } とか。

yruri
質問者

補足

RAPTsong様 source付で丁寧なアドバイスありがとうございます。 resource.hをコメントアウトしていくのは安全で良さそうなので是非やってみたいと思います。 100個のチェックボックスの件は、2ステートでDBから取得したデータのON,OFFを表示しています。 具体的にはVC++6.0 SDKで開発しており、LISTVIEWの拡張のチェックボックスを使っています。 ネットワーク上のPCの情報(MCNNAME(パソコン名), IP(IP), APDX(補足))を格納したDBからMCNNAMEを取得します。 DBの情報は変更、増減するので現在は GetPrivateProfileIntを使用し MCNNAME=1 MCNNAME=0 MCNNAME=0 MCNNAME=0 MCNNAME=1 としてiniファイルには現在使われてないものも残っています。

関連するQ&A

  • resource.h

    win32、VC++2005で開発しております。 resource.h内の#defineで切ってあるIDの番号が重なっていたため 各コントロールの色を変更しようとすると同時に他のコントロールの色も変化してしまいました。 かなりのコントロール量だったのでExcelで開いて一気にインクリメントして再ロードするとコントロールの色が散らばってしまいました・・・ この方法はまずかったでしょうか? 色の変更は case WM_CTLCOLORSTATIC : i = GetWindowLong( (HWND)lParam, GWL_ID ); hdc = BeginPaint(hDlg, &ps); if ( i == IDC_ICHI_S ) { //位置出し SetTextColor( (HDC)wParam, RGB( 255, 255, 255 ) ); SetBkColor( (HDC)wParam, RGB( 0, 0, 255 ) ); return (LRESULT)CreateSolidBrush( RGB( 0, 0, 255 )); } if ( i == IDC_NIN_S ) { //任意(未知)の器械点セット SetTextColor( (HDC)wParam, RGB( 255, 255, 255 ) ); SetBkColor( (HDC)wParam, RGB( 0, 128, 0 ) ); return (LRESULT)CreateSolidBrush( RGB( 0, 128, 0 )); } EndPaint(hDlg, &ps); こんな感じでやってます。 resource.hのID名は変更してませんのでダイアログはちゃんと開きます。 resource.hの#defineの値は自動で割り振られたと思いますが、ダイアログ画面を複数書いて値が重複するのは変だと思いますがどうなんですか? また、見やすいように各画面ごとにIDを束ねようとしてるのですが普通なことでしょうか? プログラムコーディングの基準?常識?がよくわからないのでお願いします。 コントロールも膨大になってきて見ずらいです。 通常はどのように見やすくするのでしょうか? プログラム初心者なので分かり易い指摘でお願いします。

  • グループボックスのBN_CLICKEDイベント

    グループボックスコントロールのBN_CLICKEDイベントが発生しません。 NotifyプロパティはTrueとしています。 その他のプロパティもTrue、Falseどちらも試してみましたが 割り込みに入りません。 何か足りない部分があるのでしょうか? *VB6.0からVC++2010への移植作業中です。  VB6.0の Frame Control をVC++の Groupe Box Control としました。

  • javaによるenum型の扱い

    最近javaに親しんできたのですが、 Cとjavaにおける列挙型の扱いの違いに困っています。 javaにおけるenumはクラスであり、 各要素にメソッドを追加できることは分かったのですが…… 例えば、Cにおけるenumは確か、 typedef enum{EAST,SOUTH,WEST,NORTH} dirT; //定義 -------- (略) -------- dirT dir=EAST; //宣言・dirに要素EASTを格納 というようなことが出来たと思いますが、 javaはenumもクラスで、さらにnewでメモリ確保できないと聞きました。 つまり、このように列挙型の保持はできないということになるのでしょうか。 結局やりたいこととしては、このように「保持してある」列挙型に対して 条件分岐処理をしたいと考えています。 説明が上手くできず伝わりにくいかと思いますが、 どうか回答をお願いいたします。

    • ベストアンサー
    • Java
  • C++ 設定ファイル

    VC++ではなく、ただのC++での質問です。 エラーメッセージやウインドウのサイズを外部ファイルに定義したいと思っています。 .NETではXMLファイルを使用していたのですが、C++では何を使うのが妥当でしょうか。 iniファイルというものもあるらしいのですが、 http://msdn.microsoft.com/ja-jp/library/cc429779.aspx にて、「この関数は、16 ビット Windows ベースのアプリケーションとの互換性を保つ目的でのみ提供されています。Win32 ベースのアプリケーションでは、初期化情報をレジストリに格納してください。」 といった内容が記述されており、iniファイルはあまり好ましくないようです。(この関数自体使えなくなる?)

  • 大きな配列データを複数ある場合のデータ保持の方法

    indowsXP VC++.net2003で開発をしています。 100*100程度の2次元配列が20から50程度ある場合、データはどう保持しているのが良いのでしょうか? 同時に使うのは1個のみですので、すべて宣言するのはメモリの無駄だと思っています。 思いついた方法は 1.テキストファイルに保持しておく 2.データベースに保持しておく の2つですが、ユーザーに配列の中身が見られたり変更されたりするのも困るので1の方法は却下しました。 2の方法ですがデータベースを用意するのは無理なのであきらめました。 また、配列データはツールから作成しており、以下のように宣言しやすいように表示されます。 値をひとつひとつ代入して初期化するのも大変なので、できればこの表示をいかしたまま、 必要な配列を取り出して扱うということをしたいのですが、何か良い方法はないでしょうか? それともint型の100*100の2次元配列 50個程度なら宣言したほうがいいのでしょうか? int test[32][32] = { {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, 以下省略

  • グループボックスのキャプション変更方法

    こんにちは。 VC++のコントロールでグループボックスの キャプションをコマンドボタンを押下すれば変更させたいのですが、 変更させるためのコードがわかりません。 ちなみにグループボックスの宣言をCSTATICで行っています。 HPなどを見てもわからなかったのでどうかご存知の方宜しく お願いします。

  • C#のフォーム間のデータの受け渡しについて

    はじめまして。よろしくお願いします。 最近C#をはじめましたがいきなりつまづいてしまいました。 クラスを利用しフォーム間でデータの受け渡しをしたいのですがどうすればいいのでしょうか? 処理は以下のようになっております まず、フォームが2つあります。フォーム1とフォーム2とします。 最初に起動されるのがフォーム1で、フォーム1にはボタンが2つあります。ボタンA、ボタンBとします ボタンA、ボタンBどちらのボタンを押下しても、フォーム2が開きますがどちらを押されてたかをフォーム2のテキストボックス(テキスト2とします)に表示します。 クラスですがフォームが2つとデータ保持のためのクラスが1つ(データ保持クラスとします)があります。 データ保持クラスにはint形のBtnClickプロパティ(get,set)を作成しております。, フォーム1のボタンA押下時処理  データ保持クラスのBtnClickに1を格納し、フォーム2を開きます。 フォーム1のボタンB押下時処理  データ保持クラスのBtnClickに2を格納し、フォーム2を開きます。 フォーム2起動時処理  データ保持クラスのBtnClickから値を取得しフォーム2のテキスト2へ表示します。 で、肝心の質問ですが、データ保持クラスの宣言はどこにすればいいのでしょうか? また、インスタンスはどのタイミングで作成すればいいのでしょうか? フォーム1にpublicとして宣言しインスタンスを作成し、ボタン押下時にBtnClickプロパティーにデータを格納し・・・ というところまではできたのですが、フォーム2で値が取得できないどころか、コンパイルが通りません。 あと、こういうデータ保持クラス使い方って一般的ですか?? 長々と脈略もなく書きましたがご教授ください。どうぞよろしくお願いします。

  • 列挙子(enumlator)の内容を文字列化するにはどうすればよいので

    列挙子(enumlator)の内容を文字列化するにはどうすればよいのでしょう。 今、VC++2008でプログラムしている初心者です。 列挙子が多いのですが、これを文字列化してメッセージに出したいと思っています。 ボックス化することで可能なようですが、具体的に説明していただけるとうれしいです。 また、この手法はLinuxなど他のOSについても同様でしょうか? 幾つか方法があるのなら、共通の方法を教えてくださるとうれしいです。

  • 【C++/CLI.NET】コンボボックスの値の設定・取得

    VC++2005の.NET、言語はC++/CLIでアプリを作成しています。 コンボボックスについて、質問が二点あります。 (1) コンボボックスのItemsプロパティにて下記値をセットし、 【セットした値】 aaa bbb ccc アプリ実行時に、コンボボックスの初期表示として、 二番目の値「bbb」を表示させたいのですが、 方法が分かりません。 (2) あるタイミングで、コンボボックスの現在選択されている値が、 何番目の値かを取得する方法が分かりません。 例)bbbが選択されているなら、二番目。 あと、当方.NET学習中であり、コンボボックスのような基本コントロールの使い方を解説したサイトや、 Tipsなど、おすすめサイトも一緒に教えて頂けると非常に助かります。 よろしくお願い致します。

  • Strutsタグライブラリーの<html:checkbox>を使用しているときのバックカラーの変え方

    対象のチェックボックスをONにするとバックカラーを白から何か他の色へ変更し、また、逆にOFFにするとバックからを白にもどしたいのですが、方法がわかりません。 どなたか教えてください。 チェックボックスはStrutsのタグライブラリーを使用しています。onClickを宣言使用とすると起こられてしまいます。 <logic:iterate id="chargeSubjectInfo" name="KDSC_L200" property="chargeSubjectInfo" indexId="idx1" type="jp.co.kdl.kse.page.KSEInfoDyna"> <kbean:define id="checkboxInfo" name="KDSC_L200" property="checkboxInfo" index="<%=String.valueOf(idx1)%>" type="jp.co.kdl.kse.page.KSEInfoDyna"/> <td width="13%" class="pt12" height="42" BGCOLOR=""> <html:checkbox name="checkboxInfo" property="report" value="1" indexed="true" /> </td> </logic:iterate> 大文字で書いたBGCOLORの後にjavaScriptを記述したいのですが、わかりません。どなたか教えてください。

専門家に質問してみよう