Сообщение об ошибке в MFC / RC на VS2008 - «Операция добавления / удаления невозможна, поскольку элемент кода« Cxxxx »доступен только для чтения» - PullRequest
7 голосов
/ 15 февраля 2011

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

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

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

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

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

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

Ответы [ 7 ]

4 голосов
/ 27 января 2014

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

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

2 голосов
/ 25 октября 2012

Мне удалось (случайно) воспроизвести ту же проблему. Я определил 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 решило проблему.

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

Срджан

1 голос
/ 18 августа 2016

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

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

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

1 голос
/ 13 декабря 2014

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

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

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

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

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

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

1 голос
/ 25 января 2012

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

DECLARE_DYNAMIC(RandomClass, CDialog/alternative)  

и

IMPLEMENT_DYNAMIC(RandomClass)

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

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

0 голосов
/ 19 января 2017

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

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

0 голосов
/ 25 сентября 2016

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

...