2013年9月10日火曜日

コード要素XXXXが読み取り専用であるため、追加と削除操作は出来ません。

VC++のダイアログエディタでイベントハンドラを追加しようとすると、
「コード要素XXXXが読み取り専用であるため、追加と削除操作は出来ません。」

VisualStudioを全部閉じたりビルドクリーンしたり、
あれこれ、やっても全くダメ・・・

じゃあとググって見るとncbファイルを消したら直ったって記事がいっぱい。
良かったぁ〜
じゃあ、と消して見る。
ん、ダメじゃん。
俺のだと、なおらへんよぅ。

よしっ、と更にググってVisualStudioの作業ファイルを調べてsuoも消したり、
ビルドクリーンしてビルドし直したり・・・

だめっ!何やっても直らない。
じゃあ、と試しに手動でコードにイベントと追加してみた。
ちゃんとビルドも通って動作も正常。
まあ、これでプログラムとしては大丈夫。

だけど・・・ダイアログエディタからはイベントは見えないし追加もできない。
うーん、やっぱり不便。

よしって思い立ってクラスの.hと.cppを一度完全に消して、
ダイアログエディタからクラス追加をしてみた。
おっ、ちゃんとイベント追加できるじゃん。

という事は、
この新しいファイルをまんま古い奴に、こそっと入れ替えれば・・・
でコピーしてみると、嘘っ!またダメになってる。

うーーーーむ・・・
実はここでもう諦めかけた。
最悪手動追加できるんだし・・・

でも探究心から最後の挑戦。
上記手順でダイアログクラス名を変更してみた。
当然古いファイルの名前を変更してクラス名を一括変換してから、
コピーして見ました。

やった!!!直った!!!

でも、なんで???
なぜに古いクラス名のままだとダメで、
クラス名を変えてやるとうまくいくの?
ncbもsuoも消したんだから、VCは.hや.cppを見るしか無い筈。
どこに古いクラス名を憶えてたんだ???

ちなみにダイアログIDだけ変更してクラス名はそのままでもダメだった。
クラス名がキーのよう、一体どこに憶えてるんだ。
だけど、もう疲れたので、ここで打ち切り。

「結論」
ncb消してもダメな場合がある。
その場合は古いクラスファイルを削除してから、
ダイアログのIDを変更して新しいクラスファイルを作成させて、
中味を入れ替えればうまくいくみたい。
ちょっと手間はかかるけど一括変換するくらいだし、
もし困ってる人が居たらお試しあれ。

0 件のコメント: