Сообщение об ошибке в MFC / RC на VS2008 - Операция добавления / удаления невозможна, потому что элемент кода 'Cxxxx' доступен только для чтения

Я поискал в Интернете и получил противоречивые ответы, которые не помогли мне решить проблему. Я создал диалоговое окно, а затем щелкнул мастера, чтобы создать для меня класс. К сожалению, он плохо назвал класс и файл, поэтому я переименовал файл. Теперь визуальная студия не позволяет мне делать что-либо через графический интерфейс к ресурсу dlg - например, подключать обработчик кнопок и т. Д. Я получаю окно сообщения:

«Операция добавления / удаления невозможна, потому что элемент кода 'Cxxxx' доступен только для чтения»

Это реальная проблема, потому что добавление обработчиков и других вещей вручную через код утомительно, и один из разработчиков просто не может сделать это таким образом - ему нужен графический интерфейс для управления событиями.

Я попытался удалить файл ncb и перестроить проект, но безуспешно. MS, по-видимому, не устранила эту проблему примерно через 4 года (судя по поискам, которые я видел в Интернете.

Я не могу добавлять переменные, обработчики событий или что-нибудь еще полезное через графический интерфейс мастера приложений MFC. Я могу сделать это, только отредактировав файлы cpp и h.

У кого-нибудь есть предложения?


person Tim    schedule 15.02.2011    source источник
comment
Не знаю, как решить эту проблему, не имея возможности воспроизвести ее. Я уверен, что разработчики VS так же относятся ко многим похожим ошибкам, которые вы видели в Интернете. один отчет об ошибке Я вижу сообщение, в котором включен репро-проект, который был помечен как исправленный в VS 2010. Возможно, пора обновить. Хотя я никогда не сталкивался с этой ошибкой ни в одной из версий, и я часто меняю свое мнение об имени класса после использования мастеров.   -  person Cody Gray    schedule 15.02.2011
comment
@Cody - обновление было бы неплохим - к сожалению, мы используем некоторые библиотеки, которые еще не поддерживаются в 2010 году ...   -  person Tim    schedule 15.02.2011
comment
Какие библиотеки не поддерживаются в VS 2010? Я такого не видел; они действительно использовали ошибки в компиляторе VS 2008? И даже если это так, вы можете настроить VS 2010 на использование компилятора VS 2008, если у вас установлены обе версии.   -  person Cody Gray    schedule 15.02.2011
comment
@Cody - библиотеки каналов финансовых данных. Если нам когда-нибудь позвонят в службу поддержки по поводу конкретной версии, они просто откажут в поддержке. Они не тестировали с ним свои библиотеки (пока), поэтому не будут его поддерживать.   -  person Tim    schedule 15.02.2011
comment
Вы пытались удалить файл ‹username› .user вместе с .ncb?   -  person JHowzer    schedule 16.08.2012
comment
Я столкнулся с этой проблемой и с Visual Studio 2005 после внесения изменений в файл ресурсов с помощью текстового редактора для копирования шаблона диалогового окна из одного файла ресурсов в другой. удаление файла .suo сработало для меня.   -  person Richard Chambers    schedule 21.09.2014


Ответы (7)


Я добавил существующие файлы в проект VS2008, и у меня тоже возникла проблема. Я исправил это, удалив файл .suo и перекомпилировав решение.

Может быть, это поможет кому-нибудь, кто сталкивается с этой проблемой.

person marscode    schedule 27.01.2014
comment
Это сработало и для меня. Спасибо! Это сводило меня с ума! Что я сделал, так это напрямую отредактировал файл ресурсов .rc и поместил в него новый диалог, скопировав шаблон диалога из другого файла ресурсов. После того, как я это сделал, я, похоже, столкнулся с этой проблемой. Я попытался удалить скопированный шаблон ресурса, но это не помогло. Итак, я вышел из Visual Studio 2005, удалил файл .suo для решения, а затем перезапустил Visual Studio 2005, и теперь я могу использовать мастер для добавления обработчиков событий. - person Richard Chambers; 21.09.2014
comment
Примечание: в моем случае это помогло мне удалить и .ncb, как упоминалось в вопросе OP. - person Christian Severin; 30.11.2015

Мне удалось (случайно) воспроизвести ту же проблему. Я определил 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 не удаленным. Когда я позже попытался добавить обработчик событий с помощью графического интерфейса, я получил упомянутый ответ. Простое удаление части DECLARED решило проблему.

Я считаю, что это можно скопировать на все подобные задачи.

Срджан

person Srdjan Jovanovic    schedule 25.10.2012

Я знаю, что это может произойти немного поздно, но вы тоже переименовали сам класс? Если да, возможно, вы забыли переименовать

DECLARE_DYNAMIC(RandomClass, CDialog/alternative)  

и

IMPLEMENT_DYNAMIC(RandomClass)

Документация для этих вызовов не очень подробна, но когда я попытался создать класс, в который я мог бы добавить событие, я получил аналогичную ошибку при попытке добавить событие в этот класс:

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

person Underdetermined    schedule 25.01.2012

Как я это исправил (удаление файлов .ncb / .suo / .user и пересборки не помогли) ...

Когда эта ошибка происходила в моем проекте VS 2008, я заметил следующую особенность:

  1. Это произошло в одном диалоговом + классе, а не в других.
  2. В файле класса .cpp для неработающего диалогового окна в селекторе области был только элемент «(Глобальная область)», никаких других строк (ожидаемого класса не было)
  3. Я также проверил файл класса .h, и селектор области был в порядке.

Сначала я исправил эту проблему в № 2 (объяснено ниже), затем вышел из VS, удалил файлы * .ncb, * .suo, перезапустил VS, перестроил проект, и мастера снова начали работать.

Чтобы исправить проблему с селектором области в # 2, я сначала сузил ее до заголовков, не включенных в файл класса .h, т.е. у меня были некоторые типы, используемые внутри объявления класса, но не заголовок в файле .h, который объявлял эти типы. Поэтому, если бы я включил файл .h класса в чистый файл .cpp, он не компилировался. Остальная часть проекта компилировалась нормально, потому что все необходимые файлы были добавлены во все соответствующие файлы .cpp до .h класса. После того, как я добавил все необходимые заголовки в начало класса .h (чтобы скомпилировался чистый файл .cpp), селектор области в файле .cpp заполнился правильно и, в свою очередь, исправил мастер.

Замечание: существует школа мысли не включать какие-либо другие файлы .h ни в один из файлов .h, и Microsoft, похоже, довольно часто придерживается этого пути (к счастью, не всегда). Обычно я следую другой политике включения - всегда включать заголовки со всеми используемыми объявлениями в файл .h, поэтому, когда мне нужно использовать модуль, я должен включать только его файл .h. В редких случаях, которые у меня были, когда этого не происходило, мастер VS давил (или IntelliSense подавлял, на что полагается мастер). Это усиливает мою приверженность этой политике включения. Единственное исключение из этой политики - не помещать файлы stdafx.h, windows и MFC в файл .h модуля - это делается иначе из-за предварительно скомпилированных заголовков.

person iva2k    schedule 13.12.2014

К вашему сведению, я столкнулся с той же проблемой в Visual Studio 2010 SP1.

Удаление файла SDF (эквивалент NCB предыдущих версий в Visual Studio 2010) устранило проблему.

(Сначала я пробовал много других вещей, включая очистку проекта и перестройку, удаление файла .suo и т. Д., Но безрезультатно. Я не знаю, потребовались ли эти действия в ДОПОЛНЕНИИ для окончательного удаления файла SDF.)

person TechnoFrolics    schedule 18.08.2016

Удаление файла решения .ncb и перестройка сработали и для меня в Visual Studio 2008. Я должен упомянуть, что столкнулся с этой проблемой после переноса кода на новый компьютер.

person Diego    schedule 25.09.2016

У меня была такая же проблема с VS2005. Я попытался удалить * .ncb и * .suo, но безуспешно.

В конце концов, мне просто нужно закрыть файл, на который поступает жалоба (поскольку он открывается, VS не может автоматически добавлять новый код в файл, когда мы выполняем некоторые действия с ресурсами графического интерфейса, такие как добавление обработчика событий в меню Пункт).

person TheTwilight SagaSurvey    schedule 19.01.2017