|
Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.
Mensajes - rfog
126
« en: Domingo 18 de Octubre de 2009, 19:05 »
Para que te funcione en otro ordenador, tienes que compilar en Release en lugar de Debug, y creo que para aplicaciones de Visual C++ 6 no necesitas instalar el runtime de C/C++ porque todos los ordenadores lo traen. No obstante esa descarga ya no existe en los sitios de Microsoft porque VC 6 es antediluviano, así que una opción es que vayas localizando en tu equipo de desarrollo las DLL que te faltan (el programa te las irá diciendo) y las pongas en el nuevo ordenador.
Visual C++ 2008 y Visual C++ 6 son completamente iguales, excepto que el 2008 tiene como diez mil cosas más y las que son comunes están en diferente sitio.
127
« en: Domingo 18 de Octubre de 2009, 10:26 »
Primero decirte que no existe un Visual C++ 2006, así que mira a ver qué estás usando. Por otro lado, estás usando Win32 directamente o MFC?
De todos modos el acercamiento es capturar el mensaje WM_PAINT (o el método equivalente de MFC) del control/ventana en la que vayas a pintar y ahí, mediante la obtención del tamaño de la ventana a pintar, escalar tu función e ir dibujando punto a punto con la función adecuada (en general LineTo).
Para que empiece a pintar debes mandar un Invalidate() al control en cuestión y tener en cuenta cuándo tienes la función disponible o no para ser pintada, y si no la tienes disponible dejas que el el propio control se repinte a sí mismo llamando al método de pintado padre en caso de MFC o devolviendo FALSE (creo) en tu mensaje de pintado.
128
« en: Domingo 20 de Septiembre de 2009, 19:27 »
El que te vaya o no dependerá del driver de vídeo o incluso del SP que tengas instalado, te lo garantizo.
Actualizar al Borland C++ 5.5 sigue siendo más de lo mismo: un compilador más que obsoleto, que sólo acepta código antiguo (hay por lo menos dos revisiones de C++ que el Borland no acepta) y que encima no acepta ni siquiera bien el código que acepta.
Es a eso a lo que me refiero: aprender gráficos con BGI es como aprender electrónica de válvulas. Aprender el C++ de un compilador tan antiguo es como aprender mecánica de vapor para mover coches. Y que tenga cierto renombre o no no importa: es viejo y obsoleto. Anda, pregúntale que te explique las plantillas en función, los predicados y si la STL es una buena biblioteca de contenedores y algoritmos o no.
Me apuesto un gallinfante a que ni siquiera estás aprendiendo buen C++.
Respecto a lo que nos ocupa, el BGI es tan viejo que ni siquiera está soportado por el ya de por sí viejo BC++ 5.5. Lo más moderno que te pueda servir sería el Borland C++ 5.02, que todavía es más viejo que el 5.5 (que es C++Builder 1). Es decir, no puedes pasar eso porque el compilador no lo soporta.
129
« en: Domingo 20 de Septiembre de 2009, 10:36 »
Lo primero de todo: dile a ese profe que se espabile, que es una aberración (tal como lo lees: aberración) enseñaros eso, y que dudo que vaya a servirte de algo.
Lo segundo es que intentar montar los BGI de Borland en un ordenador moderno es, de nuevo, otra aberración. El error que te da es que las BGI están intentando hacer cosas que ya no se pueden hacer dada la evolución de las tarjetas gráficas y del propio Windows.
130
« en: Miércoles 9 de Septiembre de 2009, 09:02 »
Con el tema de recorrer los archivos en linux no tengo ni idea ya que in la biblioteca de C ni la de C++ traen nada como estándar. Para las cadenas sí, puedes usar igualmente strtok o el equivalente d C++ para ir partiendo la cadena original.
132
« en: Jueves 20 de Agosto de 2009, 13:53 »
Je je, ya ves. Aunque no suelo pasarme mucho, si veo algo sin responder que no sea muy viejo y lo sé, pues respondo.
133
« en: Sábado 15 de Agosto de 2009, 15:50 »
134
« en: Martes 4 de Agosto de 2009, 11:56 »
Hasta donde yo sé, OpenFileDialog() pertenece al .NET Framework, no a Win32 ni a MFC... Si te estás refiriendo a la función de .NET, la clase tiene un método llamado Title que contiene el título de la ventana... Sin embargo, si quieres hacer aplicaciones internacionales en .NET es mucho más fácil: http://msdn.microsoft.com/es-es/library/t18274tk(VS.80).aspx
135
« en: Martes 4 de Agosto de 2009, 11:53 »
Puedes abrirla o moverla en cualquier momento con SW_SHOWMAXIMIZED:
m_pMainWindow->ShowWindow(SW_SHOWMAXIMIZED);
Y cuando la creas con CreateWindow también le puedes pasar ese parámetro.
Y si quieres que no se pueda cambiar de tamano, una forma es sobreescribir el evento OnSysCommand:
void CMainFrame::OnSysCommand(UINT nID, LPARAM lParam) { UINT cmd = nID & 0xFFF0; if(cmd == SC_RESTORE || cmd == SC_MOVE) return;
CFrameWnd::OnSysCommand(nID, lParam); }
136
« en: Martes 14 de Abril de 2009, 10:28 »
Por lo que veo la variable CBitmap es local al método en el que lo cargas, por lo que cuando salga de ámbito será destruida y el bitmap (que se asocia con el handle del CBitmap, no se copia), apuntará a cualquier lado. El bitmap ha de ser una variable miembro del diálogo. Ésta permanece pintada hasta que el botón se invalida y cuando tira a pintarse a sí mismo, el bitmap ya no está.
Otra cosa, cuando asignes el bitmap al botón, debes hacerlo mediante la llamada GetSafeHandle() del propio bitmap.
Por otro lado, podrías usas CBitmapButton, y especificar tres bitmpas diferentes, uno para el botón normal, otro para cuando esté presionado y uno más para cuando esté deshabilitado.
138
« en: Jueves 11 de Diciembre de 2008, 19:58 »
Eternal, nunca la tuve porque nunca usé CreateThread por lo dicho. Siempre lo he hecho con _beginthreadex.
¿Con TID te refieres a TLS? Thread Local Storage. Si te refieres a eso, sí, el problema viene de ahí, y es más gordo en la versión DLL que en la estática, ya que el almacenamiento local no se inicializa bien y funciones con variables estáticas (como por ejemplo strtok) fallan estrepitosamente y hasta podrían tumbar la aplicación.
Si TID es otra cosa, ni idea de lo que es.
139
« en: Jueves 11 de Diciembre de 2008, 19:33 »
Hola a todos. Debido a un bug histórico en el runtime de C de Microsoft, no se debe usar CreateThread para lanzar un hilo, sino _beginthreadex, que toma los mismo parámetros. El asunto está en que si se usa la primera función, el runtime de C no se inicializa correctamente y ciertas llamadas a la biblioteca de C pueden producir efectos laterales no deseados, mientras que con la segunda la inicialización es correcta. Si no se usara ninguna función del runtime no habría problema en hacerlo con CreateThread, pero como el propio startup de cualquier programa escrito en C++ lo usa, es necesario hacerlo así. Aquí: http://msdn.microsoft.com/en-us/library/ms682453.aspx, casi al final de todo, se menciona algo sobre esto.
140
« en: Jueves 11 de Diciembre de 2008, 19:27 »
Si no usas ninguna ruta en el nombre de los ficheros, se guardarán donde el ejecutable. Hola. No necesariamente, se guarda en el directorio actual. El que en general sean el mismo no quiere decir que siempre vayan a hacerlo. Una forma de cambiarlo es poner otra ruta en el "Start In" (lo siento mis Windows están en inglés) del acceso directo.
141
« en: Lunes 20 de Octubre de 2008, 22:52 »
esto no se trata de una competencia!, de todos modos los dos programas utilizan la misma cantidad de memoria (12*cantidad maxima de letras del mes mas largo). al fin y al cabo es un foro, no un coliseo!
 A ver, ya sé que no es una competencia ni mucho menos, pero simplemente he puesto una alternativa. De todos modos, mi programa usa menos memoria que el tuyo, de hecho mi programa (o tu programa con mi array estático, para entendernos) sólo usará un puntero (4 bytes) para el Array, que estará almacenado en el segmento RODATA del ejecutable. Al cargar en memoria mi programa, el sistema operativo cargará el array (las 12 cadenas) y asignará el puntero a dichas cadenas. Tu programa también contiene las 12 cadenas en el segmento de RODATA, pero al entrar en main asignará en la pila 12xla palabra más larga y luego copiará esas cadenas que están en RODATA al hueco dejado en la pila, con lo que las cadenas estarán duplicadas, gastando la parte de RODATA (que si el programa tiene un tiempo de ejecución largo o consumiera mucha memoria podría descartarse a paginación junto a los demás valores RODATA que estén en la misma página) y de la pila. Haz un build release y compruébalo. Más
142
« en: Lunes 20 de Octubre de 2008, 22:27 »
Hola, no hace falta que construyas dinámicamente el array, lo puedes hacer de forma estática en ningun lado use allocacion dinamica de memoria, intenta leer bien mi codigo!

No he dicho asignación dinámica de memoria, he dicho "construir dinámicamente el array" frente a hacerlo de forma estática. Es decir, en mi caso, ya sea un array global o local, es el compilador el que genera el array (realmente estará en RODATA y lo que hará será poner un puntero a ese área). Mi programa funcionará más rápido que el tuyo, usará menos memoria y encima, si por error se intentara escribir en el array para la comparación, el compilador lo detectaría. Además, en el código de ejemplo que has puesto, si el usuario introduce "Enero" o "enERO" etc, el programa no encontrará el mes. Recuerda el teorema del universo y los usuarios.
143
« en: Lunes 20 de Octubre de 2008, 20:42 »
Hola, no hace falta que construyas dinámicamente el array, lo puedes hacer de forma estática char meses[12][]={"enero","febrero","marzo",...};
Luego, cuando te metan el mes por teclado, lo pasas a minúsculas y en un bucle recorres el array de los meses haciendo comparaciones de cadenas hasta que encuentres el mes adecuado. Luego el número es el del índice de la posición en el array más uno.
144
« en: Miércoles 15 de Octubre de 2008, 12:55 »
Me parece muy obvio lo que pido, al menos yo no quiero estar leyendo todo el codigo que no tenga nada que ver con el problema, quiero ver pura y exclusivamente lo que tenga que ver con el mismo. Y no quiero tener que crear un esqueleto para compilarlo. Eso resulta evidente por sí mismo, y es lo menos que debe hacer quien pregunta. Además, a veces, cuando uno intenta aislar el problema... descubre qué estaba haciendo mal. A veces, con constructos complejos, el error ni siquiera viene de la línea en donde el compilador lo detectó, y al aislar el problema nos damos cuenta de por dónde van los tiros.
145
« en: Miércoles 15 de Octubre de 2008, 10:42 »
¿No será que te falta la llave de cierre de "string Fecha::toString()const {"?
146
« en: Lunes 13 de Octubre de 2008, 13:41 »
Realmente no entiendo qué quieres hacer, pero el método normal para comunicar un hilo secundario con el principal es enviarle un mensaje personalizado (WM_USER+<valor>) y el bucle de mensajes principal lo coge y hace lo que tenga que hacer con él.
Otra forma es comunicarse mediante eventos. Mira CreateEvent().
147
« en: Lunes 13 de Octubre de 2008, 13:26 »
No se puede que yo sepa. En general, con Ctrl-Espacio terminas de completar la sentencia actual, y con Ctr-J abres la ventana de intellisense. De todos modos existen soluciones de terceros (de pago) que sí lo hacen (y encima funcionan bastante mejor que el del propio Visual C++), como por ejemplo, Visual Assist de Whole Tomato: www.wholetomato.com.
148
« en: Viernes 26 de Septiembre de 2008, 23:23 »
Hasta donde yo sé no es posible enviar mensajes de un proceso a otro en Windows. Eso se conoce como "saltar la barrera del proceso" y si se pudiera hacer de forma sencilla resultaría un enorme y engorroso fallo de seguridad (imagina un ActiveX instalado en el Internet Explorer que forzara al programador de tareas mediante envío de mensajes inter-proceso el crear una tarea para formatear el disco duro durante el siguiente arranque. A esto mismo se lo conoce como "escalada de privilegios a través del bucle de mensajes").
Eso no quiere decir que no se pueda hacer, sólo quiere decir que es bastante complejo de hacer. Jeffrey Ritcher en sus libros sobre programación de sistemas para Win32 lo explica; la última versión publicada se llama "Windows via C/C++", que tento pendiente de leer y que sólo está de momento en inglés y que por eso no sé si sigue contándolo o no. Todos los anteriores están descatalogados y hay alguna traducción al castellano también descatalogada.
El tema está en lo que se conoce como "Inyectar una DLL en otro proceso" y basícamente se trata de eso: crear una DLL que se inyecta en otro proceso y que al estar en ese otro proceso ya es capaz de enviar localmente los mensajes adecuados.
El tema es un poco *complicadillo*, pero seguro que en San Google encuentras por dónde empezar si buscas "DLL process injection" o similar.
Una vez que sepas cómo y qué hacer, si tienes dudas puntuales quizás podamos ayudarte...
149
« en: Jueves 18 de Septiembre de 2008, 10:29 »
igual tene en cuenta que conio.h es de borland, no es ANSII C, asique tu codigo va a ser poco portable. Lo que yo no puedo entender es cómo todavía hay gente que hace programas en consola con compiladores del año de la pera y usa la consola para otra cosa que no sea practicar con ejemplos sencillos o aprender. Teniendo el Visual C++ 2003 Compiler, el GCC tanto para DOS como para Linux, las versiones Express de Visual Studio, realmente no comprendo cómo hay tanto profesor desactualizado... ¿Sabíais que la mayoría de las versiones del Turbo C++ (las antiguas) no llaman a los destructores y si lo hacen, lo hacen mal? ¿Sabíais que con los compiladores antiguos de Borland el orden de la declaración de variables sí importa y a veces se arma la p*cha un lío y las declara mal? Y ya no digamos las enormes diferencias en las bibliotecas base dependiendo de una build debug o release... Y no me vale que digáis que en Linux todavía se usa la consola, el Borland no está en Linux.
150
« en: Jueves 18 de Septiembre de 2008, 00:19 »
La últma versión del Turbo C++ Explorer (gratuita) te la puedes bajar de aqu: http://turboexplorer.com/downloads. Y creo, sólo creo, que no funciona bajo Vista, ya que exige la instalación del .NET 1.1 y éste no se puede instalar en Vista.
|
|
|