Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 2 de 2
Ir a la página Anterior  1, 2
 
Programilla Y Dudas
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje Re: Programilla Y Dudas 
 
Gracias por tus comentarios, Sergio.

Sí tengo Ubuntu, concretamente Ubuntu 8.04 con gambas 2.0 en el PC de sobremesa y Ubuntu 9.10 con (ahora) gambas 2.20 en el portátil. En ambos se produce el mismo fallo.

Al instalar el paquete gambas2 desde el repositorio oficial se instalaron todos los que contienen "gambas2" a excepción de gambas2-gb-db-sqlite2 y gambas2-script. No creo que estos tengan nada que ver con el problema.

Saludos,
Rodolfo.
 



 
rodoval - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Programilla Y Dudas 
 
Citar:

el comportamiento de gambas con mi programa es el mismo: bien con gb.qt, error con gb.gtk o gb.gui: "El programa se detuvo inesperadamente enviando la señal #11". ¿Alguien tiene idea de lo que significa esto? El problema parece estar relacionado con la gestión del teclado.

Significa que tu programa generó un error irrecuperable generalmente provocado por un error en la utilización del lenguaje. Para descubrir qué es lo que está generando el error basta con identificar la rutina y realizar una sesión de depuración.

He probado cambiar el componente gb.qt por gb.gtk en tu proyecto y se produjo el error al pulsar el botón "Empezar"; en consecuencia es allí donde se debe colocar un punto de interrupción. Luego comenzar la ejecución del programa, pulsar el botón "Empezar" y continuar la ejecución paso a paso (F8).

En mi prueba, el código que generó el error es:

    ME.Menus[0].Children[0].Text = "Parar"
    ME.Menus[0].Children[1].Enabled = FALSE
    ME.Menus[0].Children[2].Enabled = FALSE
 


El problema aquí parece derivar de la manera en la que referencias a los menús. Simplemente deberías usar el nombre del menú en cuestión:


    'ME.Menus[0].Children[0].Text = "Parar"
    menuEmpezar.Text = "Parar"
    'ME.Menus[0].Children[1].Enabled = FALSE
    menuOpciones.Enabled = FALSE
    'ME.Menus[0].Children[2].Enabled = FALSE
    menuProgreso.Enabled = FALSE
 


Si te aparecen otros errores puedes seguir el procedimiento anterior para localizar las sentencias que generan error y entonces modificarlas. Si tienes inconvenientes simplemente abre nuevos temas en el foro.

Si me permites una sugerencia, sería bueno que re-codificaras el programa con el objetivo de separar la interfaz gráfica de los cálculos u otras operaciones que no tienen que ver con la IGU. Una vez logrado esto, mantener el programa te será muy fácil (introducir nuevas características, corregir errores, modificar algún comportamiento) y principalmente te ayudará a que no se generen nuevos errores al introducir modificaciones.

Saludos cordiales.
 




===================
Cómo programar con Gambas

Speed Books: informática libre.
 
fabianfv - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Programilla Y Dudas 
 
Gracias por tus explicaciones y sugerencias, favianfv.

La verdad es que la forma de referenciar los menúes la descubrí por tanteo y ahora veo que me compliqué innecesariamente. En cualquier caso, es curioso que funcione con gb.qt y no con gb.gtk.

Una vez hechos los cambios, cuando apretamos una tecla (después de pulsar "Empezar") se produce el error que mencionaba en mi primer mensaje. Concretamente el texto del error es "No keyboard event data", y el depurador señala la línea donde se hace referencia a Key.Code dentro del procedimiento Form_KeyPress. Esto con gambas 2.0.0., porque con gambas 2.20, el procedimiento no llega a ejecutarse aunque tecleemos, como si el evento no se "disparara". Todo esto, por supuesto, usando gb.gtk, con gb.qb todo va bien.

Saludos,
Rodolfo.
 



 
rodoval - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Programilla Y Dudas 
 
Citar:

En cualquier caso, es curioso que funcione con gb.qt y no con gb.gtk.

En realidad no es tan curioso, simplemente es que cuando se utilizan recursos de un lenguaje de forma poco ortodoxa queda en evidencia la robustez de ciertas rutinas y las inconsistencias de otras.

En última instancia lo importante es escribir el código de la forma esperada o recomendada, en primer lugar para maximizar las posibilidades de que los programas funcionen correctamente, y en segundo lugar para que cuando aparezca un problema se tenga la mayor certeza posible sobre si se trata de un error de la herramienta (y en ese caso informarlo para que sea corregido).

Te sugiero nuevamente que re-codifiques tu programa. Recodificar con frecuencia (cuando hay partes del código que huelen mal) te hará un mejor programador.

Ya que es en el controlador de teclado donde se produce el error, podrías comenzar por re-codificarlo.

En primer lugar está demasiado largo, esto sólo ya te da una pauta de que hay cosas por mejorar en ese código.

En segundo lugar nunca uses valores literales para comparar con Key.Code: debes usar las constantes que provee la clase key, como Key.Backspace, Key.Control, Key.Left, etc. En cambio sí puedes comparar valores literales contra Key.Text, por ejemplo: Key.Text = "3" o Val(Key.Text) >= 0

En tercer lugar, hay demasiadas sentencias IF. Analiza si puedes reemplazar sentencias IF con estructuras CASE.

En cuarto lugar, debes considerar que es altamente probable que debas colocar partes del código en nuevos procedimientos o funciones que serán llamados desde Form_Keypress. Si eliges buenos nombres para esas nuevas rutinas lograrás, además, que el código sea fácilmente comprensible (por los nombres que usas veo que esto lo estás haciendo bien).

Conceptualmente puedes verlo de este modo: Form_KeyPress es el procedimiento que controla el evento KeyPress del formulario, es decir una rutina que permite controlar que teclas son válidas (controlador de teclado). Entonces, dentro de Form_KeyPress el código debe limitarse a hacer eso y no otras cosas, esto es lo que se llama Cohesión (una función o procedimiento debe realizar una única tarea). Siempre debes buscar que tus rutinas tengan alta cohesión. Si Form_KeyPress es el lugar correcto para desencadenar otras acciones, éstas deben ser realizadas por otras rutinas de modo que en Form_KeyPress sólo incluyas llamadas a esas otras rutinas.

Código: [Descargar] [Ocultar]
  1. PUBLIC SUB Form_KeyPress()
      
  2. ' Hay problemas con el evento KeyPress. Solo funciona con qt, y a veces falla.
      
  3.  DIM ComoVa AS Byte
      
  4.  DIM Digito AS Byte
      
  5.  IF EsperandoNumero THEN
      
  6.     IF NOT ModoAprendizaje THEN Digito = Key.Code - 48
      
  7.     IF NOT ModoAprendizaje AND Digito > 9 THEN RETURN
      
  8.     IF ModoAprendizaje THEN
      
  9.       Respuesta = Resultado
      
  10.     ELSE
      
  11.       Respuesta = Respuesta * 10 + Digito
      
  12.     ENDIF
      
  13.     IF Respuesta < 100 THEN
      
  14.       labResult.Font = Font["+12"]
      
  15.     ELSE
      
  16.       labResult.Font = Font["+8"]
      
  17.     ENDIF
      
  18.     labResult.Text = Respuesta
      
  19.     ComoVa = Comprueba()
      
  20.     IF ComoVa < 2 THEN
      
  21.       EsperandoNumero = FALSE
      
  22.       IF ComoVa = 1 THEN
      
  23.         labResult.Background = ColorAcierto
      
  24.         IF NOT ModoAprendizaje THEN
      
  25.           INC Aciertos
      
  26.           IF OrdenTabla = AlAzar THEN
      
  27.             Seguimiento[NumTabla, Factores[SiguienteFactor]] = Segui_Acertado
      
  28.           ENDIF
      
  29.         ENDIF
      
  30.       ELSE
      
  31.         labIgual.Text = "&#8800;"
      
  32.         labResult.Background = ColorFallo
      
  33.         Seguimiento[NumTabla, Factores[SiguienteFactor]] = Segui_Fallado
      
  34.       ENDIF
      
  35.       INC SiguienteFactor
      
  36.       IF ModoRecuperacion AND SiguienteFactor <= MaxFactor THEN
      
  37.         WHILE Seguimiento[NumTabla, Factores[SiguienteFactor]] <> Segui_Fallado AND SiguienteFactor < MaxFactor
      
  38.           INC SiguienteFactor
      
  39.         WEND
      
  40.         IF SiguienteFactor = MaxFactor AND Seguimiento[NumTabla, Factores[SiguienteFactor]] <> Segui_Fallado THEN
      
  41.           INC SiguienteFactor
      
  42.         ENDIF
      
  43.       END IF
      
  44.       WAIT Pausa
      
  45.       IF SiguienteFactor <= MaxFactor THEN
      
  46.         labIgual.Text = "="
      
  47.         labResult.Background = Color.TextBackground
      
  48.         Pregunta(NumTabla, Factores[SiguienteFactor])
      
  49.       ELSE
      
  50.         TerminaTabla()
      
  51.       ENDIF
      
  52.     ENDIF
      
  53.  ENDIF
      
  54. END
      
  55.  

 




===================
Cómo programar con Gambas

Speed Books: informática libre.
 
fabianfv - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Programilla Y Dudas 
 
Citar:
En realidad no es tan curioso, simplemente es que cuando se utilizan recursos de un lenguaje de forma poco ortodoxa queda en evidencia la robustez de ciertas rutinas y las inconsistencias de otras.


Me queda por delante aprender a reconocer cuándo un código es poco ortodoxo. Posiblemente he pecado de impaciencia poniéndome a programar sin tener los conocimientos mínimos del lenguaje. El código problemático para gb.ktk (que tú identificaste) lo obtuve valiéndome de la función de autocompletado del editor integrado.

Citar:
Te sugiero nuevamente que re-codifiques tu programa. Recodificar con frecuencia (cuando hay partes del código que huelen mal) te hará un mejor programador.


Entiendo entonces que das por hecho que mis problemas con gtk son debidos a una mala programación y que es preciso hacer limpieza antes de intentar arreglarlos. Si es así, tendré que aceptarlo deportivamente. Aún me siento poco seguro con gambas. Empecé a leer el libro de Daniel Campos y José Luis Redrejo, que encontré en este mismo sitio, pero lo dejé cuando llevaba pocos capítulos para intentar hacer algo concreto. La verdad es que me sorprendió (gratamente) que ya era capaz de hacer algo que funcionaba bastante bien. Ahora he retomado el libro. La documentación sirve como consulta, pero no para aprender.

Citar:
...nunca uses valores literales para comparar con Key.Code: debes usar las constantes que provee la clase key, como Key.Backspace, Key.Control, Key.Left, etc.


Key.Code - 48 (te refieres a eso, ¿no?) es una forma de convertir el dígito tecleado es su valor. 48 es el valor ASCII del 0. Estuve mirando lo que dices, pero no me aparecía en el menú emergente algo como Key.0; aunque ahora que lo pienso, podía haber puesto Asc("0").

Tomo nota también de las otras cosas que comentas, especialmente lo de mejorar la modularización y estructura del programa. Es algo que suele preocuparme bastante, pero a menudo me cuesta hacer.

Un saludo,
Rodolfo.
 



 
rodoval - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Programilla Y Dudas 
 
Rodolfo:

Citar:

Me queda por delante aprender a reconocer cuándo un código es poco ortodoxo.

Yo diría que cuando intentas hacer algo y observas que comienza a complicarse, tienes que plantearte tres posibilidades (en orden de importancia), la primera es que estés frente a un problema que te exige aprender algunas características nuevas del lenguaje, la segunda es que el problema está desnudando alguna falencia del lenguaje, la tercera es que el lenguaje directamente no tenga un buen soporte para lo que intentas hacer.

La conclusión es que cuando algo se nos complica, es mejor estudiar un poco más para ver qué facilidades nos ofrece el lenguaje para resolver ese problema. De lo contrario es probable que escribamos código poco ortodoxo.

Citar:

Posiblemente he pecado de impaciencia poniéndome a programar sin tener los conocimientos mínimos del lenguaje.

No, no creo que sea un pecado. Además, me parece bien que hayas puesto a prueba tus conocimientos, aunque siempre es mejor intentar formalizar el aprendizaje.

Citar:

El código problemático para gb.ktk (que tú identificaste) lo obtuve valiéndome de la función de autocompletado del editor integrado.

Sí, lo sé. Es uno de los problemas que presenta gambas en su aprendizaje, hay algunas inconsistencias, pero no son graves.

Si intentaras acceder por ese método (ObjetoContenedor.Children[N].Children[N]) verás que hay un límite (no recuerdo si son 2 o 3 niveles de profundidad) luego del cuál el intérprete arroja un error; sin embargo, si lo escribes en la pestaña de inspección de variables ese mismo código funciona.

Citar:

Entiendo entonces que das por hecho que mis problemas con gtk son debidos a una mala programación y que es preciso hacer limpieza antes de intentar arreglarlos.

No Rodolfo, en absoluto. En gambas, la implentación de los controles basados en GTK+ está retrasada respecto a la implementación de controles QT. Como cualquier otro software no es perfecto, así que también adolece de algunos otros errores e inconsistencias (la ventaja es que te puedes implicar en la corrección y Benoit Minisini los corrige con bastante rapidez). No obstante, si tu programa está correctamente modularizado y estructurado y conoces un poco más el lenguaje, resulta fácil tratar con este tipo de problemas y darse cuenta si se trata de un problema de gambas o del código que uno escribe.

Citar:

La verdad es que me sorprendió (gratamente) que ya era capaz de hacer algo que funcionaba bastante bien.

Así es. Ambos sabemos, además, lo importante que es la motivación para lograr buenos aprendizajes. De modo que me parece bien que te hayas lanzado a escribir un programa: lo hiciste y funciona bien. Ahora es importante que profundices tus conocimientos, para que puedas continuar  escribiendo aplicaciones educativas cada vez más robustas y complejas en su programación.

Citar:

Ahora he retomado el libro. La documentación sirve como consulta, pero no para aprender.

Estoy de acuerdo. Sin embargo, un autodidacta debe saber apañárselas y los recursos para hacerlo están: este foro, la ayuda, el libro de gambas, los ejemplos incluidos en gambas.

Citar:

Key.Code - 48 (te refieres a eso, ¿no?) es una forma de convertir el dígito tecleado es su valor. 48 es el valor ASCII del 0. Estuve mirando lo que dices, pero no me aparecía en el menú emergente algo como Key.0; aunque ahora que lo pienso, podía haber puesto Asc("0").

El valor que devuelve Key.Code para una tecla determinada puede ser diferente según el componente gráfico que use el programa (gb.gtk o gb.qt). La forma de asegurar que tus programas seguirán funcionando a pesar de esos cambios, es usar las constantes con nombre de la clase Key y la propiedad Key.Text: si quieres comparar si el usuario escribió un cero la forma de hacerlo es:

IF Key.Text = "0" THEN
...
' o también
IF Val(Key.Text) = 0 THEN
...
 


Citar:

Tomo nota también de las otras cosas que comentas, especialmente lo de mejorar la modularización y estructura del programa. Es algo que suele preocuparme bastante, pero a menudo me cuesta hacer.

Intenta aplicar lo que te sugería en mi mensaje anterior y si encuentras algún problema o tienes dudas no vaciles en preguntar.

Saludos cordiales.
 




===================
Cómo programar con Gambas

Speed Books: informática libre.
 
última edición por fabianfv el Lunes, 05 Abril 2010, 13:45; editado 2 veces 
fabianfv - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Programilla Y Dudas 
 
Citar:
El valor que devuelve Key.Code para una tecla determinada puede ser diferente según el componente gráfico que use el programa (gb.gtk o gb.qt). La forma de asegurar que tus programas seguirán funcionando a pesar de esos cambios, es usar las constantes con nombre de la clase Key y la propiedad Key.Text: si quieres comparar si el usuario escribió un cero...


En realidad lo que yo quiero es guardar el valor del dígito pulsado en la variable de tipo byte Digito. Antes tenía puesto Digito = Key.Code - 48. Lo he cambiado a Digito = Asc(Key.Text) - Asc("0"). Si la tecla pulsada no es un número, Digito será mayor que 9 y no se tendrá en cuenta.

Además de los problemas con Form_KeyPress (que siguen igual), he comprobado que el programa tiene otros comportamientos extraños cuando se usa gtk, como problemas cosméticos (las dimensiones de los controles no son iguales) y un montón de mensajes por consola al abrir cierta ventana.

En fin, gracias por todo. Cuando haga progresos ya os lo contaré.

Rodolfo.
 



 
rodoval - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 
Ocultar¡Este tema fue útil?

 

Elegir valoración:                       

Media de valoración Valoración mínima Valoración máxima Número de valoraciones
0.00 0 0 0
 
OcultarTemas parecidos
Tema Autor Foro Respuestas último mensaje
No hay nuevos mensajes Dudas Con Textbox(solucionado) Dani26 Controles/Librerías/Componentes 4 Domingo, 13 Junio 2010, 21:54 Ver último mensaje
Dani26
No hay nuevos mensajes Dudas Sobre El Diseño.. CanihoJR General 6 Viernes, 26 Noviembre 2010, 17:14 Ver último mensaje
estrella_de_galicia
No hay nuevos mensajes Dudas Al Hacer Un Programa AGarcia General 25 Miercoles, 13 Julio 2011, 01:40 Ver último mensaje
razaAztk
No hay nuevos mensajes Dudas Con << Y >>, ~ jsbsan Javascript 6 Miercoles, 27 Abril 2016, 09:51 Ver último mensaje
Shell
 

Publicar nuevo tema  Responder al tema  Página 2 de 2
Ir a la página Anterior  1, 2

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 
Lista de permisos
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
No puede descargar archivos
No puede publicar eventos en el calendario