7

オンラインで検索したところ、問題を解決できない一貫性のない回答が得られました。ダイアログ ボックスを作成し、ウィザードをクリックしてクラスを作成しました。残念ながら、クラスとファイルの名前がひどく悪いので、ファイルの名前を変更しました。Visual Studio では、GUI を介して dlg リソースに何もできません。たとえば、ボタンやハンドラーを接続するなどです。メッセージ ボックスが表示されます。

「コード要素 'Cxxxx' は読み取り専用のため、追加/削除操作はできません」

コードを介して手動でハンドラーなどを追加するのは面倒であり、開発者の 1 人がその方法でそれを行うことができず、イベントを操作するために GUI が必要であるため、これは本当の問題です。

ncb ファイルを削除してプロジェクトを再構築しようとしましたが、うまくいきません。MS は 4 年ほど経った後もこの問題を修正していないようです (私がオンラインで見た検索に基づくと.

MFC アプリ ウィザード GUI を使用して、変数、イベント ハンドラー、またはその他の有用なものを追加できません。これは、cpp および h ファイルを編集することによってのみ可能です。

誰か提案はありますか?

4

7 に答える 7

6

VS2008 プロジェクトに既存のファイルを追加しましたが、問題もありました。.suo ファイルを削除してソリューションを再コンパイルすることで修正しました。

たぶん、この問題に遭遇した誰かを助けるでしょう。

于 2014-01-27T12:29:10.133 に答える
2

私は(偶然に)同じ問題を再現することができました。私は定義済みDECLARE_EVENTSINK_MAP()でいっぱいです

BEGIN_EVENTSINK_MAP(CDlgMessage, CDialog)
ON_EVENT(CDlgMessage, IDC_GM_VIEW1, 1, CDlgMessage::GMEventGmView1, VTS_I2 VTS_BSTR VTS_BSTR)
END_EVENTSINK_MAP()

BEGIN-ENDセクション全体を手動で削除しましたが、削除されていませんDECLARE。後でGUIでイベントハンドラーを追加しようとしたときに、言及された応答を受け取りました。パーツを削除するだけでDECLARED問題は解決しました。

これはすべての同様の問題にコピーできると思います。

スルジャン

于 2012-10-25T13:41:47.800 に答える
1

これは少し遅れるかもしれませんが、クラス自体の名前も変更しましたか?もしそうなら、あなたは名前を変更するのを忘れているかもしれません

DECLARE_DYNAMIC(RandomClass, CDialog/alternative)  

IMPLEMENT_DYNAMIC(RandomClass)

これらの呼び出しのドキュメントはあまり完全ではありませんが、イベントを追加できるクラスを作成しようとすると、そのクラスにイベントを追加しようとしたときに同様のエラーが発生しました。

http://msdn.microsoft.com/en-us/library/ywz9k63y%28v=vs.90%29.aspx

于 2012-01-25T16:30:34.380 に答える
1

これをどのように修正したか (.ncb/.suo/.user ファイルを削除して再構築しても解決しませんでした)...

VS 2008 プロジェクトでこのエラーが発生していたときに、次の特異性に気付きました。

  1. 他のダイアログではなく、1 つのダイアログ + クラスで発生しました。
  2. 壊れたダイアログの .cpp クラス ファイルでは、スコープ セレクターに「(Global Scope)」項目のみがあり、他の行はありませんでした (期待されるクラスが存在しませんでした)。
  3. .h クラス ファイルも確認しましたが、そこにあるスコープ セレクターは問題ありませんでした。

最初に #2 でこの問題を修正し (以下で説明)、VS を終了し、*.ncb、*.suo ファイルを削除し、VS を再起動し、プロジェクトを再構築すると、ウィザードが再び機能し始めました。

#2 のスコープ セレクターの問題を修正するために、まずクラスの .h ファイルに含まれていないヘッダーに絞り込みました。つまり、クラス宣言内でいくつかの型が使用されていましたが、これらの型を宣言した .h ファイルにはヘッダーがありませんでした。したがって、クラスの .h ファイルをクリーンな .cpp ファイルにインクルードすると、コンパイルされません。クラスの .h. クラスの .h の先頭に必要なすべてのヘッダーを追加した後 (クリーンな .cpp ファイルがコンパイルされるように)、.cpp ファイルのスコープ セレクターが正しく入力され、ウィザードが修正されました。

余談ですが、他の .h ファイルを .h ファイルのいずれにも含めないという考え方があり、Microsoft はかなり頻繁にこの方法に固執しているようです (幸いなことに、常にではありません)。私は通常、さまざまなインクルード ポリシーに従います。使用されるすべての宣言を含むヘッダーを常に .h ファイルにインクルードするため、モジュールを使用する必要がある場合は、その .h ファイルのみをインクルードする必要があります。これが起こらなかったまれな機会に、VSウィザードが詰まった(またはウィザードが依存しているIntelliSenseが詰まった)。これにより、このインクルージョン ポリシーへの私のコミットメントが強化されます。このポリシーの唯一の除外は、stdafx.h、windows、および MFC ファイルをモジュールの .h ファイルに配置しないことです。これは、ヘッダーがプリコンパイルされているため、別の方法で行われます。

于 2014-12-13T01:17:09.553 に答える
1

参考までに、Visual Studio 2010 SP1 で同じ問題が発生しました。

SDF ファイル (以前のバージョンの NCB に相当する Visual Studio 2010) を削除すると、問題が修正されました。

(最初に、プロジェクトのクリーンアップと再構築、.suo ファイルの削除などを含め、他の多くのことを試みましたが、役に立ちませんでした。ただし、最終的に SDF ファイルを削除するために、これらのアクションが必要であったかどうかはわかりません。)

于 2016-08-18T20:12:18.493 に答える
0

VS2005でも同じ問題がありました。*.ncb と *.suo を削除しようとしましたが、役に立ちませんでした。

最後に、問題のあるファイルを閉じる必要があります (ファイルが開かれているため、イベント ハンドラーをメニューに追加するなど、GUI リソースで何らかのアクションを実行するときに、VS はファイルに新しいコードを自動的に追加できません)。アイテム)。

于 2017-01-19T13:45:47.857 に答える
0

ソリューションの .ncb ファイルを削除して再構築すると、Visual Studio 2008 でも機能しました。コードを新しい PC に移行した後、この問題に直面し始めたことに言及する必要があります。

于 2016-09-25T01:39:35.707 に答える