2011-02-15 6 views
7

He buscado en línea y obtenido respuestas inconsistentes que no me solucionan el problema. Creé un cuadro de diálogo y luego hice clic en el asistente para crear una clase para mí. Desafortunadamente llamó mal la clase y el archivo así que cambié el nombre del archivo. Ahora estudio visual no me deja hacer nada a través de la interfaz gráfica de usuario al recurso DLG - como conectar un botón, incluso manipulador, etc. consigo el cuadro de mensaje:Mensaje de error en MFC/RC en VS2008 - "Agregar/Quitar operación es imposible, porque el elemento de código 'Cxxxx' es de solo lectura"

"añadir/quitar operación es imposible, porque el elemento de código 'Cxxxx' es sólo lectura"

Este es un problema real, porque la adición de controladores y cosas de forma manual a través del código es tedioso y uno de los desarrolladores simplemente no es capaz de hacerlo de esa manera - que necesita la GUI para manipular los eventos.

He intentado eliminar el archivo ncb y reconstruir el proyecto, pero no tuve suerte. MS aparentemente no ha solucionado este problema después de 4 años más o menos (basado en las búsquedas que he visto en línea.

No puedo agregar variables, manejadores de eventos o cualquier otra cosa útil mediante la GUI del asistente de aplicaciones MFC. Solo puedo hacerlo editando los archivos cpp y h.

¿alguien tiene alguna sugerencia?

+0

No estoy seguro de cómo podemos solucionar esto sin poder reproducirlo. Estoy seguro de que los desarrolladores de VS se sienten de la misma manera por los muchos errores similares que has visto publicados en línea. El [informe de error único] (http://connect.microsoft.com/VisualStudio/feedback/details/343852/add-remove-operation-is-impossible-because-the-code-element-cxxxx-is-read-only) Veo publicado que incluyó un proyecto repro que se ha marcado como fijo en VS 2010. Tal vez es hora de actualizar.Aunque nunca he encontrado este error en ninguna versión, y con frecuencia cambio de opinión sobre el nombre de una clase después de usar los asistentes. –

+0

@Cody - la actualización sería agradable - desafortunadamente estamos usando algunas bibliotecas que aún no están soportadas para 2010 ... – Tim

+0

¿Qué tipo de bibliotecas no son compatibles con VS 2010? No he visto tal cosa; ¿Realmente estaban explotando errores en el compilador de VS 2008? E incluso si es así, puede configurar VS 2010 para usar el compilador VS 2008, siempre que tenga ambas versiones instaladas. –

Respuesta

1

sé que esto podría estar llegando un poco tarde, pero ¿ha cambiado el nombre de la clase en sí también? Si es así, es posible que haya olvidado renombrar el

DECLARE_DYNAMIC(RandomClass, CDialog/alternative) 

y

IMPLEMENT_DYNAMIC(RandomClass) 

La documentación de estas llamadas no es muy completo, pero cuando traté de crear una clase a la que podría añadir un evento que tiene un error similar al intentar agregar un evento a esa clase:

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

2

He logrado (accidentalmente) reproducir el mismo problema. He definido DECLARE_EVENTSINK_MAP() y lleno

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

y de lo que he eliminado manualmente toda COMIENZO-FIN sección, pero me queda DECLARE sin borrar. Cuando más tarde intenté agregar el controlador de eventos por GUI, he recibido la respuesta mencionada. La eliminación simple de la pieza DECLARED ha resuelto el problema.

Creo que esto se puede copiar a todos los problemas similares.

Srdjan

4

I añadido archivos existentes en un proyecto VS2008 y tenía el problema también. Lo arreglé borrando el archivo .suo y recompilando la solución.

Quizás ayude a alguien que se encuentre con este problema.

+1

Esto funcionó para mí también. ¡Gracias! ¡Esto me estaba volviendo loco! Lo que hice fue editar directamente el archivo de recursos .rc y poner un nuevo diálogo copiando la plantilla de diálogo de otro archivo de recursos. Después de que hice eso, parecía toparme con este problema. Traté de eliminar la plantilla de recurso copiada y no hizo la diferencia. Así que salí de Visual Studio 2005, eliminé el archivo .suo para la solución y luego reinicié Visual Studio 2005 y ahora puedo usar el asistente para agregar controladores de eventos. –

+0

Nota: en mi caso, me ayudó a eliminar el '.ncb' también, como se menciona en la pregunta del OP. –

1

Cómo lo solucioné (borrar archivos .ncb/.suo/.user y las reconstrucciones no ayudaron) ...

me di cuenta de la siguiente peculiaridad cuando este error estaba sucediendo en mi proyecto VS 2008:

  1. ocurrió en una clase de diálogo +, no en los otros.
  2. En el archivo de clase .cpp para el diálogo roto, el selector de alcance tenía solo el elemento "(Alcance global)", no hay otras líneas (clase esperada no estaba presente)
  3. También revisé el archivo de clase .h, y selector de alcance estaba bien.

Solucioné este problema primero en el # 2 (se explica a continuación), luego salí de VS, eliminé * .ncb, * .suo archivos, reinicié VS, reconstruí el proyecto y los asistentes comenzaron a funcionar nuevamente.

Para solucionar el problema del selector de alcance en # 2, primero lo reduje a los encabezados no incluidos en el archivo .h de la clase, es decir, tenía algunos tipos utilizados dentro de la declaración de clase, pero ningún encabezado en el archivo .h declaró estos tipos. Entonces, si tuviera que incluir el archivo .h de la clase en un archivo limpio .cpp, no se compilará. El resto del proyecto compilaba OK, porque todos los archivos necesarios se agregaron a todos los archivos .cpp correspondientes antes de la clase .h. Después de que agregué todos los encabezados necesarios a la parte superior de .h de la clase (para que el archivo limpio .cpp compile), el selector de alcance en el archivo .cpp se completó correctamente y, a su vez, arregló el asistente.

En una nota al margen: existe una corriente de pensamiento para no incluir ningún otro archivo .h en ninguno de los archivos .h, y Microsoft parece atenerse a este método con bastante frecuencia (afortunadamente no siempre). Normalmente, sigo una política de inclusión diferente: para incluir siempre encabezados con todas las declaraciones usadas en el archivo .h, cuando necesito usar un módulo, tengo que incluir solo su archivo .h. En la rara ocasión en que tuve cuando esto no sucedió, el asistente VS se bloqueó (o IntelliSense bloqueó en que se basa el asistente). Hace que mi compromiso con esta política de inclusión sea más fuerte. La única exclusión a esta política es no colocar ningún archivo stdafx.h, Windows y MFC en el archivo .h del módulo; se realiza de forma diferente debido a los encabezados precompilados.

1

Solo un FYI que encontré el mismo problema en Visual Studio 2010 SP1.

Al eliminar el archivo SDF (el equivalente de Visual Studio 2010 del NCB de versiones anteriores) se solucionó el problema.

(Había intentado muchas otras cosas primero, incluida la limpieza del proyecto y la reconstrucción, la eliminación del archivo .suo, etc., en vano. Sin embargo, si esas acciones eran necesarias ADEMÁS de finalmente eliminar el archivo SDF, lo hago no sé.)

0

Eliminar la solución del archivo .ncb y reconstruir funcionó también para mí en Visual Studio 2008. Debo mencionar que comencé a enfrentar este problema después de migrar mi código a una nueva PC.

0

Tuve el mismo problema con VS2005. Traté de eliminar * .ncb y * .suo, pero fue en vano.

Al final, solo necesito cerrar el archivo que se está reclamando (porque se está abriendo, VS no puede agregar automáticamente un nuevo código al archivo cuando realizamos algunas acciones en los recursos de la GUI, como agregar un Evento Manejador de un elemento de menú).

Cuestiones relacionadas