| Ver tema anterior :: Ver siguiente tema |
| Autor | Mensaje |
|---|
Anonymous

Registrado: 10 Nov 2000 Mensajes: 99
| Publicado: 28/01/2005 3:00 pm | | | Título: ayuda vicual c++ |
| Buenas,
Tengo creado un programa sencillo en visual c++, con MFC. Cuando lo ejecuto me dan algunos errores que no se como corregir. Si alguien que tenga conocimientos con este lenguaje me desea ayudar que me responda. Si conseguimos arreglarlos le podria dar alguna ayuda economica por sus consejos. Gracias. |
|
| Volver arriba | |
 |
quique
Registrado: 30 Mar 2004 Mensajes: 720 Ubicación: Por ahí
| Publicado: 31/01/2005 4:18 am | | | Título: |
| te puedo ayudar hasta sin gratificación económica, siempre que se traten de preguntas concretas y no de "necesito programa que haga todo esto!"

Salu2 |
|
| Volver arriba | |
 |
Anonymous

Registrado: 10 Nov 2000 Mensajes: 99
| Publicado: 01/02/2005 2:54 pm | | | Título: |
| Gracias por responder, te explico un poco mis problemas.
Tengo un proyecto MFC con tres clases vista (una CListView y dos CScrollView), pues cuando cambio los tamaños de las vista CScrollView a veces se bloquea el programa o empieza a parpadear esta vista. No se donde puede estar mi error, aunque supongo que sera al dar los tamaños a las vistas.
Si quieres te escribo el codigo o si prefieres por email.
Hasta otra |
|
| Volver arriba | |
 |
|
quique
Registrado: 30 Mar 2004 Mensajes: 720 Ubicación: Por ahí
| Publicado: 04/02/2005 5:13 am | | | Título: |
| El código que quieras poner, es mejor que lo pongas en el forum, utilizando la opción de "Code" para que quede más legible. Así, más gente podrá opinar sobre el tema.
Lo que puede que pase, es que al redibujar la ventana, las otras también reciban un mensaje "paint", y estas a su vez hagan que la ventana inicial reciba un "paint" que me vuelve a generar otro "paint"....
O algo por el estilo. Ya te digo, tiene pinta de eso.
Para comprobarlo, puedes utilizar la herramienta "Spy++" que viene con el MS VC++ (búscala a ver si la encuentras!). Si no la tienes, dilo.
Si la tienes: 1) Ejecuta la aplicación que te da problemas 2) Abre el Spy++ 3) Dale a "Spy - buscar ventana" (o "Spy - find window) 4) Te saldrá un dialogo con un punto de mira: selecciona "mensajes" (messages) pon el punto de mira en la ventana de la aplicación 5) Te saldrá una ventana que te muestra los mensajes que recibe la aplicación seleccionada 6) Los mensajes que se "capturan" se pueden definir en "Mensajes - Opciones" y luego en la pestaña de "mensajes" 7) Realiza en tu aplicación la operación que produce el que las vistas parpadeen
Analiza lo que el Spy te da
Cuando tengas claro lo que pasa o si tienes algún problema en realizar lo anterior, aquí estamos
Salu2 |
|
| Volver arriba | |
 |
Anonymous

Registrado: 10 Nov 2000 Mensajes: 99
| Publicado: 07/02/2005 3:27 pm | | | Título: |
| He ejecutado spy++ (no tenia ni idea de que era) y realizado los pasos que me comentas. En la ventana de mensajes de spy++ van apareciendo los mensajes llegados al programa y cuando da el fallo (parpadeo), no paran de llegar infinidad de mensajes, por lo que sera lo que tu dices con las sucesivas llamadas "paint".
El spy++ que tengo instalado esta en ingles, si sabes alguna version en español o un manual o ayuda en español indicamela para poder aprender a utilizarlo mejor.
Me he dado cuenta de que mi gran problema es que no se como depurar una aplicacion. Y ademas con mi ingles muy basico no comprendo bien la ayuda de visual studio sobre como depurar. Te vuelvo a pedir ayuda para algun manual para depurar en español.
Gracias por todo (aunque aun no he arreglado nada), voy a mirar bien que mensaje puede producir el error y ya te comento. |
|
| Volver arriba | |
 |
quique
Registrado: 30 Mar 2004 Mensajes: 720 Ubicación: Por ahí
| Publicado: 08/02/2005 2:02 am | | | Título: |
| Información en español puedes encontrarla directamente en el MSDN de Microsoft: http://www.microsoft.com/spanish/msdn/default.asp
Creo que el Spy++ solo está disponible en inglés, sorry 
De depurar, no te preocupes, que se va aprendiendo con el tiempo. Manuales? Ni idea: pon un mensaje en el foro, que a lo mejor alguien sabe de alguno 
Y yo creo que SI has arreglado mucho, es más, muchísimo. El principal problema del SW es ENCONTRAR el fallo, y tú ya lo tienes.
Salu2 |
|
| Volver arriba | |
 |
|
Anonymous

Registrado: 10 Nov 2000 Mensajes: 99
| Publicado: 10/02/2005 2:39 pm | | | Título: |
| Los resultados que da spy++ cuando parpadea la aplicacion despues de redimensionar los bordes son los siguientes:
S WM_WINDOWPOSCHANGING lpwp.... R WM_WINDOWPOSCHANGING S WM_NCCALCSIZE ... R WM_NCCALCSIZE ... S WM_WINDOWPOSCHANGED lpwp.... S WM_SIZE ... nWidth=377 nHeight=102 R WM_SIZE R WM_WINDOWPOSCHANGED S WM_WINDOWPOSCHANGING lpwp.... R WM_WINDOWPOSCHANGING S WM_NCCALCSIZE ... R WM_NCCALCSIZE ... S WM_WINDOWPOSCHANGED lpwp.... S WM_SIZE ... nWidth=377 nHeight=86 R WM_SIZE R WM_WINDOWPOSCHANGED P WM_PAINT ... S WM_NCPAINT ... R WM_NCPAINT S WM_ERASEBKGND ... R WM_ERASEBKGND ...
Siempre este mismo bucle. No se como solucionar el error ni donde puede estar este error. ¿Puede que tenga algo que ver con esas variables del mensaje wm_size? |
|
| Volver arriba | |
 |
quique
Registrado: 30 Mar 2004 Mensajes: 720 Ubicación: Por ahí
| Publicado: 14/02/2005 7:09 am | | | Título: |
| Para decirte algo más concreto, tendría que ver el código completo de tu aplicación, pero creo que el problema lo tienes en la función de repintado. Para comprobarlo, un par de instrucciones sobre el "Spy++" Al principio, ves que hay R, S o P. Eso viene de Received, Sent o Posted (recibido, enviado o "posted"). Además, en el Spy también te aparece el handle de la ventana que genera o recibe el mensaje
Así, puedes ver que si tu aplicación envía a ti mismo mensajes o no
Salu2 |
|
| Volver arriba | |
 |
Anonymous

Registrado: 10 Nov 2000 Mensajes: 99
| Publicado: 21/02/2005 3:18 pm | | | Título: |
| La ventana que envia y recibe todos los mensajes siempre es la misma, la que selecciono con spy++. Al volver a mirar los resultados que da spy++ veo que en el mensaje WM_SIZE la variable nHeight varia siempre su valor en 16. Esto es lo unico que detecto.
La verdad, no se como arreglarlo. Si tu quieres te puedo enviar el codigo o me dices alguna funcion y te la pongo aqui.
Venga. Gracias. |
|
| Volver arriba | |
 |
|
quique
Registrado: 30 Mar 2004 Mensajes: 720 Ubicación: Por ahí
| Publicado: 23/02/2005 8:38 am | | | Título: |
| por partes: Es normal que solo veas los mensajes desde o a la ventana que seleccionas. Lo que puedes mirar es a qué ventana envias mensajes y cuales, aunque esto solo es en plan de ayuda
Lo que sigo creyendo es que tienes un problema en el repintado de tu ventana, y creo que es que al repintar, mandas algún mensaje a otra ventana. Revisa la función de OnPaint u otra por el estilo que tu hayas modificado a mano. Si eso, escribe el nombre las funciones de "pintado" que hayas modificado, o mejor, pon el código y le echo un vistazo.
CREO (no estoy seguro) que el valor de "16" es un valor por defecto, que es el tamaño minimo que las ventanas pueden variar
A ver si vamos tirando pa'lante |
|
| Volver arriba | |
 |
Anonymous

Registrado: 10 Nov 2000 Mensajes: 99
| Publicado: 24/02/2005 12:21 pm | | | Título: |
| Te pongo las funciones que modifico:
void CTextoView::OnInitialUpdate() { CScrollView::OnInitialUpdate(); CSize sizeTotal; sizeTotal.cx = sizeTotal.cy = 10; SetScrollSizes(MM_TEXT, sizeTotal); }
void CTextoView::OnDraw(CDC* pDC) { CSistemaTiempoRealDoc* pDoc; pDoc = static_cast<CSistemaTiempoRealDoc*>(GetDocument()); if (pDoc->analizar_algoritmo) { CSize docSize( 200, ( (pDoc->task->numeroTareas()*60) + 20 ) ); CRect rect; GetClientRect(&rect); CSize pageSize(rect.right,rect.bottom); CSize lineSize(50,20); SetScrollSizes(MM_TEXT,docSize,pageSize,lineSize);
bool realizar_algoritmo = TRUE; int num_tareas = pDoc->task->numeroTareas(); if ( num_tareas <= 0) { realizar_algoritmo = FALSE; } else { for (int w=0; w<num_tareas; w++) { CTarea *tarea = pDoc->task->GetTarea(w); if (tarea->numeroSubtareas() <= 0) { realizar_algoritmo = FALSE; } } }
if (realizar_algoritmo) { int x = 20; // coodenada X de la posicion del texto int y = 20; // coodenada Y de la posicion del texto
// se va a realizar el algoritmo // aqui hay un bucle .... CString miTexto ="La tarea" + ti->GetNombre(); if (R <= ti->GetD()) { miTexto +="se puede ejecutar correctamente."; } else { miTexto +="no se puede ejecutarcorrectamente."; } pDC->TextOut(x,y,miTexto); y += 20; miTexto ="Su tiempo de respuesta es"; CString textr; textr.Format("%.2f",R); miTexto += textr; if (R <= ti->GetD()) { miTexto +="<="; } else { miTexto +=">"; } CString textd; textd.Format("%.2f",ti->GetD()); miTexto += textd; miTexto +="su DeadLine."; pDC->TextOut(x,y,miTexto); y += 40; // este bucle se ejecutara por cada tarea } // fin if (realizar_algoritmo) else { // calcula tamaño total CSize sizeTotal; sizeTotal.cx = 500; sizeTotal.cy = 80; SetScrollSizes(MM_TEXT, sizeTotal); pDC->TextOut(20,20,"No se puede realizar el algoritmo."); pDC->TextOut(20,40,"Existe alguna tarea que se encuentra sin subtareas o no existen tareas."); } // fin else de if (realizar_algoritmo) } // fin if (pDoc->analizar_algoritmo) }
Mi idea es escribir un texto por cada tarea (una clase mia) que haya. La variable analizar_algoritmo se modifica mediante una opcion del menu y cuando se actualiza a TRUE se llama a UpdateAllViews(). Veo que parpadea y bloquea el programa cuando aparecen las barras de scroll, si hay suficiente espacio a veces va bien. Aunque creo recodar que tambien se han bloqueado sin scroll. |
|
| Volver arriba | |
 |
quique
Registrado: 30 Mar 2004 Mensajes: 720 Ubicación: Por ahí
| Publicado: 25/02/2005 6:19 am | | | Título: |
| | Haz una prueba sencilla: comenta todos los "SetScrollSizes" que tienes en el codigo y mira a ver que pasa.... |
|
| Volver arriba | |
 |
|
Anonymous

Registrado: 10 Nov 2000 Mensajes: 99
| Publicado: 28/02/2005 12:04 pm | | | Título: |
| Si comento el de OnInitialUpdate() me aparece el siguiente error al ejecutar:
file:viewscrl.cpp line:134
Si comento solo los dos que hay en OnDraw(), cuando cambio el tamaño de la ventana se bloquea el programa. En lugar de parpadear se bloquea. |
|
| Volver arriba | |
 |
quique
Registrado: 30 Mar 2004 Mensajes: 720 Ubicación: Por ahí
| Publicado: 03/03/2005 2:00 am | | | Título: |
| he mirado un poco más en detalle el código que pusiste y no le veo ningún problema así, a "vuela pluma". Pero hay algo que me ha llamado la atención. Dices que llamas a la función UpdateAllViews(). Puedes poner el código donde llamas a esa función?
Es lo único que se me ocurre, sorry
Salu2 |
|
| Volver arriba | |
 |
Anonymous

Registrado: 10 Nov 2000 Mensajes: 99
| Publicado: 03/03/2005 2:29 pm | | | Título: |
| He buscado todos los UpdateAllViews que hay en el codigo. Ya comente al principio que el proyecto tiene tres clases vista, por eso utilizo UpdateAllViews.
La funcion OnAlgoritmoAnalizar() se ejecuta cuando se selecciona una opcion del menu.
void CMainFrame::OnAlgoritmoAnalizar() { // se utlizara una variable para indicar cuando se actualiza // la vista del CTextoView CSistemaTiempoRealApp* pApp = static_cast<CSistemaTiempoRealApp*>(AfxGetApp()); CSistemaTiempoRealDoc* pDoc; pDoc = static_cast<CSistemaTiempoRealDoc*>(pApp->GetDoc(RUNTIME_CLASS(CSistemaTiempoRealDoc))); ASSERT_VALID(pDoc);
pDoc->analizar_algoritmo = TRUE; pDoc->UpdateAllViews(NULL); }
Hay otras funciones que ponen a FALSE la variable pDoc->analizar_algoritmo y despues llaman a pDoc->UpdateAllViews. Tambien se ejecutan estas funciones al selecciona una opcion del menu.
Gracias por el tiempo que te estas tomando, te lo agradesco. Si quieres y ves alguna forma mas facil como mandarte algo por correo o hablar por el messenger o chat dimelo, si tienes tiempo claro. |
|
| Volver arriba | |
 |
|
|