14歳の自分に衝撃の事実を告げてください

VC++6.0でコントロールを作りプロパティからIDを変更するとresource.hに初期の宣言が残ります。
コントロールが多いと#defineが列挙され
見にくいのですが無視しても構わないのでしょうか?

また100個近くあるチェックボックスの初期状態を保持しておく方法で何かいい方法はありませんか?
iniファイルかレジストリか、どう格納するのが良いか知りたいです。

A 回答 (2件)

無視するよりも削除していく方が安全です。

特にこの部分は#defineで書かれていますので、いろいろとやっていると何かの拍子に番号が重なってしまうことがあります。そうなると後で大変な思いをする羽目になってしまいます。ぐちゃぐちゃにならないうちにこまめに整理した方がいいです。
しかしながら、resource.hを直接編集するのは大変ですから(どれを使用しているかこのヘッダーだけではわからないので)

「表示(V)」→「シンボルブラウザ(Y)...」

で削除するといいと思います。使用済みのものは削除できないようになっている上、イベントの削除のようにコメントアウトではなく本当に消してくれるのできれいになります。
また、resource.hを直接編集した場合は
「・・・再ロードしますか?」
というメッセージが表示されますので必ず再ロードしてください。

チェックボックスの初期状態ですが、この保存にはiniファイルを使用した方がいいと思います。iniファイルはEXEと同じ場所に保存しておくのがやりやすいです。この際にiniファイルはフルパス指定となりますが、MFCを使用する場合、EXEのフォルダの取得は
InitInstance()の中でm_pszHelpFilePathの値からファイル名をとれば簡単に取得できます。
iniファイルにする一番の利点は、丸ごとコピーすれば簡単に環境(チェックボックスの初期状態)を移行できる点にあります。また、アンインストーラを備えていなくてもファイルの削除だけでアンインストールにもなります。

この回答への補足

resource.hの件大変やってみました、今までずっと気になっていたので本当に目から鱗です、ありがとうございます。 僕にとっては20pt以上の回答でした。

iniファイルの利点は確かにコピーと削除の容易さにあるんですね、ありがとうございます。

補足日時:2005/03/16 11:00
    • good
    • 0

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");
}
とか。

この回答への補足

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ファイルには現在使われてないものも残っています。

補足日時:2005/03/16 10:46
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報