Discusión sobre el artículo "Interfaces gráficas III: Botones simples y multifuncionales (Capítulo 1)"
Basándome en mi experiencia personal, puedo decir que hacer que las ventanas sean "elásticas" (es decir, dinámicas) no es tarea fácil en absoluto. Si hablamos de una forma simple de ventana, desprovista de cualquier objeto, es definitivamente más fácil hacerla extensible, pero aquí se necesita todo un concepto de interacción entre el usuario y la ventana. Una ventana estándar de Windows tiene al menos 8 tiradores, cuyo agarre permite cambiar cómodamente el tamaño de la ventana en cualquier dirección.
Por mi experiencia sé cómo implementarlo, y ya se ha implementado algo similar en uno de los controles previstos para su publicación. Un ejemplo estará en uno de los próximos artículos de esta serie.
Tomemos por ejemplo la ventana"Alerta". No es fácil implementar este comportamiento de ventana.
¿Qué crees que es tan difícil? Esta ventana sólo tiene una tabla con tres columnas y un botón "Cerrar". Cuando redimensionas la ventana horizontalmente, la anchura de las columnas cambia proporcionalmente a la anchura actual de la ventana. En mi opinión, es mejor que el ancho de las columnas sea fijo. Y cuando se cambie el ancho de la ventana, que aparezca una barra de desplazamiento horizontal. En cualquier caso, todo esto está dentro de la clase de un elemento de interfaz particular y nada te impide hacer tal elemento y simplemente conectarlo al motor de la biblioteca.
En el artículo 18 de la serie, se publicarán tres clases de tablas con barras de desplazamiento horizontal y vertical. En la implementación actual no son "gomosas", pero si realmente lo necesitas, haré tal característica en la segunda versión de la librería más adelante.
Ahora volvamos a una ventana normal que contiene un gran número de diferentes tipos de objetos. Te das cuenta de que los objetos están en varios tipos de relaciones entre sí. Esto significa que cuando cambias el tamaño de la ventana, sus ubicaciones (o tamaños) cambian de forma diferente. Algunas imágenes, por ejemplo, se desplazan detrás del lápiz, mientras que otras permanecen en su sitio. Algunos campos de entrada cambian su longitud, otros por el contrario mantienen el mismo tamaño. Por lo tanto, decir que esta tarea es una de las más fáciles de resolver, me parece un poco precipitado).
Se resuelve añadiendo métodos a las clases, con la ayuda de los cuales puedes posicionar elementos y cambiar sus tamaños en relación con el tamaño de la ventana. De momento, todo esto son tareas menores que se podrán resolver después de que se publique la primera versión de la biblioteca.
Daré mi opinión:
1. La interfaz estandariza las formas de las ventanas y los objetos, así como su comportamiento ante distintos eventos (reacciones a las acciones del usuario).
Existe un método estándar de vincular un objeto gráfico con su parámetro y con una función, una clasificación clara de ventanas, objetos y eventos. Esta estandarización
está completamente ausente entre los paneles.
2- La interfaz tiene un conjunto inconmensurablemente amplio de posibilidades de interacción del usuario con la aplicación. Permite al usuario cambiar fácilmente su apariencia,
adoptando el tamaño o el color que se le pida. Por así decirlo, se "adapta" a las necesidades del usuario.
3. Gracias a sus ventajas gráficas, la interfaz permite mostrar en ventanas una cantidad de información mucho mayor que la que muestran los paneles.
El primer paso en el camino hacia la creación de una interfaz lo has dado, sin duda. En tu biblioteca estandarizas los parámetros de ventanas y controles, dejando a otros la posibilidad de anular propiedades concretas dentro de unos límites razonables. El siguiente paso es ampliar las posibilidades de interacción del usuario con la interfaz. Y aquí hay un montón de problemas (como el cambio de tamaño de las ventanas), sin resolver los cuales su biblioteca corre el riesgo de seguir siendo sólo una forma de estandarización de los paneles para la nueva generación de desarrolladores. Bueno, y el último paso en el camino a la interfaz - la creación de métodos de interacción de las ventanas con la información procesada por la aplicación, pero en un volumen mucho mayor de lo que se puede hacer por los paneles.
Estaré encantado de escuchar las objeciones. :)
Реter Konow:
1. Como ves, la dificultad no está en copiar una ventana en particular y su comportamiento, sino en crear un sistema que gestione las ventanas de tal manera que puedas implementar cualquier tipo de enlaces entre objetos y manejadores de ventana.
2. Esto te dará grandes oportunidades, pero una vez más, la programación orientada a objetos no te permitirá implementarlo eficazmente.
3. Tendrás que escribir demasiado código.
4. Apuesto a que al comparar mis resultados con los tuyos, la ventaja no estará de tu lado).
1. No entiendo, ¿de qué implementación estamos hablando? Ya tienes y tendrás más oportunidades, a medida que se publiquen el resto de artículos de la serie, de hacer una comparación en toda regla con tus desarrollos. ¿Y con qué debería compararlo? ))
2. La programación orientada a objetos te da la oportunidad de gestionar todo esto con eficacia. O expresa con más detalle por qué piensas así. Preferiblemente, sobre algunos ejemplos concretos con código breve que muestre tal o cual problema.
3. No me asusta la complejidad de tal o cual tarea y no importa cuánto código tenga que escribir para ello.
4. No entiendo de qué ventaja estás hablando. No tengo planes de obtener ninguna ventaja sobre ti. ))
Retag Konow:
Sin embargo, quiero plantear una cuestión sobre la diferencia que existe entre los paneles ofrecidos por muchos desarrolladores en el mercado y la interfaz. ¿Por qué a pesar de su apariencia similar a la interfaz clásica (aunque no todos), no se perciben como una interfaz en toda regla? ¿En qué se diferencian de ella? ¿Por qué la similitud externa de ventanas y controles con los de la interfaz habitual no es suficiente? ¿En qué momento se puede "reconocer" un panel como una interfaz?Daré mi opinión:
...
Sin duda has dado el primer paso en el camino hacia la creación de una interfaz. En tu biblioteca estandarizas los parámetros de ventanas y controles, dejando al mismo tiempo la posibilidad de que otros anulen propiedades específicas dentro de unos límites razonables. El siguiente paso es ampliar las posibilidades de interacción del usuario con la interfaz. Y aquí hay un montón de tareas (como cambiar el tamaño de las ventanas), sin las cuales tu biblioteca corre el riesgo de quedarse sólo en una forma de estandarización de paneles para la nueva generación de desarrolladores.
En cuanto al primer y segundo paso, espera a que se publiquen todos los artículos de la serie. Por el momento, sólo se han publicado 10 artículos. Habrá >25 en total.
Retag Konow:
Bueno, el último paso en el camino hacia la interfaz es crear métodos para que las ventanas interactúen con la información procesada por la aplicación, pero en un volumen mucho mayor del que pueden realizar los paneles.
Si te he entendido bien, ya tengo ejemplos de este tipo. Esto podría incluir clases de tablas para almacenar, recuperar y mostrar grandes cantidades de datos.
Supongamos que ha creado una ventana en la que ha colocado una tabla. Sucedió que la tabla era demasiado grande (digamos que es una tabla de indicadores estadísticos del historial comercial). Has puesto una barra de desplazamiento vertical en la ventana (o aparece automáticamente). Pero esto no es suficiente. Usted quiere que el usuario pueda cambiar el tamaño de la ventana para ver sólo la parte de la tabla que necesita. Si utiliza el desplazamiento, seguirá viendo más de lo necesario. Conclusión: hay que cambiar el tamaño de la ventana. Ajuste su campo de visión al tamaño del área importante.
Sobre la ventaja, es solo en broma. :D
Permíteme intentar formular la tarea de crear asignaciones de objetos y ventanas de forma más clara.
Supongamos que ha creado una ventana en la que ha colocado una tabla. Sucedió que la tabla era demasiado grande (digamos que es una tabla de indicadores estadísticos del historial comercial). Has puesto una barra de desplazamiento vertical en la ventana (o aparece automáticamente). Pero esto no es suficiente. Usted quiere que el usuario pueda cambiar el tamaño de la ventana para ver sólo la parte de la tabla que necesita. Si utiliza el desplazamiento, seguirá viendo más de lo necesario. Conclusión: hay que cambiar el tamaño de la ventana. Ajuste su campo de visión al tamaño del área importante.
Ahora imaginemos que, además de la tabla, la ventana contiene varios objetos estáticos importantes (como el icono de ayuda, o el icono de configuración, o los botones de zoom de la ventana...). Al redimensionar la ventana, (si mueves el tirador derecho de la ventana para hacerla más pequeña) estos objetos tendrán que quedar fuera de la ventana, a no ser, claro está, que se muevan en la dirección correcta. Sin embargo, si mueve el asa izquierda de la ventana, estos objetos permanecerán inmóviles. Se puede decir que ciertos objetos están ligados al asa derecha de la ventana, y sólo se moverán con ella.
Sin embargo, algunos objetos pueden estar vinculados a varios objetos a la vez y a todos ellos de forma diferente. Por ejemplo, está cansado de calcular y prescribir coordenadas para cada objeto por separado. Sólo quiere fijarlo a otro objeto que ya está fijado, arriba, abajo, a la izquierda o a la derecha. Usted crea un enlace de un objeto a otro, y si el primer objeto se mueve, el segundo se moverá después de él.
Todo lo anterior son tareas bastante sencillas. No veo ningún problema con esto. Es decir, sería posible añadir estas funciones en cualquier fase del desarrollo del proyecto.
Retag Konow:
Desafortunadamente no tiene sentido mostrar trozos de código, ya que los comentarios a los mismos excederían varias veces el tamaño de este código. Usted simplemente no está familiarizado con mi método de programación y mi código no le explicará nada, sino que le llevará a un callejón sin salida. Sólo puedo decir que todo lo que escribo está implementado y funciona perfectamente bien. Pronto publicaré más capturas de pantalla y vídeos.
¿Así que no habrá ejemplos que expliquen por qué la POO limita tus capacidades de programación? Puedes simplemente dibujar un esquema de que es imposible implementar tal proyecto usando POO, pero es posible usando tus métodos. Eso será suficiente.
¿Y qué deberíamos hacer con tus capturas de pantalla y vídeos? Las capacidades de MQL le permiten implementar interfaces gráficas de cualquier complejidad. Para ejemplos de lo que puede ser una interfaz gráfica, es mejor centrarse en las interfaces gráficas de los sistemas operativos. Es decir, algo que esté hecho con suficiente calidad (los errores y fallos también se dan en Windows) y que pueda ser probado por uno mismo, no sólo visto en vídeo.
Si tu plan era vender tu librería, entonces al menos publica tus DEMO-ejemplos gratuitos en el mercado para que podamos probarlos y sacar conclusiones. Y también escribe un artículo donde podamos entender cómo usar tu librería para crear GUIs en nuestras aplicaciones MQL. Sólo capturas de pantalla y vídeos están lejos de ser suficientes para la evaluación. ;)
Mis capturas de pantalla y vídeos son sólo una prueba de mis palabras sobre la solución del problema mencionado. Yo iba a proporcionar a usted.
La verdad es por el momento que mis artículos (no los tuyos) se publican con una descripción detallada de la biblioteca, que de hecho se proporciona a toda la MQL-comunidad de forma gratuita. A diferencia de usted, esta es la prueba en la práctica.
Pero usted sólo quiere mostrar algunas fotos y videos, por lo que ha iniciado una conversación sobre nada, mientras que inventar algún otro argumento. Cuando publiques el código, entonces continuaremos. Mientras tanto, seguiré trabajando en los otros artículos de esta serie para que más adelante puedas hacer una comparación más completa.
Hay al menos 15 artículos más por delante. Así que es pronto para empezar a comparar.
Nota: Veo el pequeño tamaño del programa como una ventaja.
No tiene gracia. Probablemente tenga tantas funciones como código. Si se pudieran eliminar todos los comentarios o incluso ofuscarlos, sería aún más pequeño.
La verdad es que por el momento mis artículos (no los tuyos) se publican con una descripción detallada de la biblioteca, que de hecho se proporciona a toda la comunidad MQL de forma gratuita. A diferencia de usted, esta es la evidencia en la práctica.
No quería escribir nada... pero
- Anatoly, de alguna manera no es muy modesto allí sobre "verdad" y "prueba".
- Recuerde el diálogo: "... qué difícil es leer tus artículos..." la respuesta del autor: "¿y sabes lo difícil que es escribirlos?". Anatoly, gracias por tu labor, pero tengo una pregunta: ¿para quién publicas "gratuitamente" artículos? No es interesante para los avanzados, y para los principiantes es incomprensible. Hay mucho código en el que no se quiere seleccionar y sistematizar en absoluto lo que se ha escrito.
- Anatoly, tu lector hace preguntas sobre tu artículo y, al parecer, no estás satisfecho con él. Y además, su opinión no te interesa en absoluto e incluso te irrita. Entonces, ¿por qué escribes artículos?
- Los autores necesitan la crítica para cambiar a mejor.
Con todo el respeto que te mereces, sé más cercano a tus lectores y no te emociones a media vuelta en el acto.
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso
Artículo publicado Interfaces gráficas III: Botones simples y multifuncionales (Capítulo 1):
Vamos a comenzar el análisis del control como el botón. Vamos a mostrar los ejemplos de varias clases para la creación de un botón simple, un botón con funcionalidad ampliada (“botón con imagen” y “botón de división”), así como los botones interconectados (grupos de botones y “botones de opción”). Aparte de eso, vamos a introducir algunas adiciones en las clases ya existentes de los controles con el fin de ampliar sus posibilidades.
Autor: Anatoli Kazharski