Discusión sobre el artículo "Cómo crear un panel gráfico de cualquier nivel de complejidad" - página 8

 
Alexander:

¡Hola!

Tengo una pregunta de este tipo - Me gustaría crear varias pestañas en el panel de negociación, es decir, pulsando un botón aparece un conjunto de elementos, pulsando otro botón aparece otro conjunto de elementos. Para ocultar elementos de una pestaña apliqué la propiedad Hide() para este elemento en el manejador de eventos onClick del botón de la pestaña y el elemento ya no es visible en el panel, pero no pierde sus propiedades y si se hace clic en el lugar donde estaba este elemento, entonces onEvent() del panel aceptará este evento. Pregunta - cómo hacer que el elemento oculto también no reaccionó a ninguna acción del usuario. Traté de habilitar la propiedad Element.Disable() de nuevo en el método onClick de la ficha botón, pero no pasa nada, el elemento como reaccionó al clic del botón por lo que todavía reacciona aunque invisible. ¿Cómo desactivarlo programáticamente haciendo click en una pestaña y luego activarlo programáticamente haciendo click en otra pestaña?

Intenta parchear la librería del control: falta una línea al principio del método OnMouseEvent en el archivo Wnd.mqh:

if(!IS_ENABLED || !IS_VISIBLE) return false;

Los detalles se describen en el artículo(Aplicación de OLAP en Trading (Parte 2) - el artículo es sobre OLAP, pero hay una sección sobre GUI donde se toca el problema anterior):

en el estado minimizado, el botón "redimensionar" está oculto e inactivo. El problema está en el método CWnd::OnMouseEvent. Carece de tal comprobación:

  // if(!IS_ENABLED || !IS_VISIBLE) return false; - esta línea no está presente

Como resultado, incluso los "controles" desactivados e invisibles interceptan los eventos. Obviamente, el problema podría resolverse estableciendo el orden Z adecuado de los controles. Sin embargo, incluso aquí encontramos un fallo - la librería no tiene en cuenta el orden Z de los elementos. En particular, si miras en el método CWndContainer::OnMouseEvent, verás un simple bucle en orden inverso a través de todos los elementos subordinados, sin intentar determinar su prioridad por orden Z.

Por tanto, o bien se requiere otro "parche" de la librería o bien algún "truco" en una clase derivada.

En principio, hay mucho que arreglar en la biblioteca de control estándar. Por eso se escribió una implementación alternativa, ya parcheada, de ControlsPlus - puedes obtenerla en su totalidad en el artículo MQL as a means of marking up the graphical interface of MQL programs. Parte 2 (si te interesa, hay partes 1 y 3).

Язык MQL как средство разметки графического интерфейса MQL-программ. Часть 2
Язык MQL как средство разметки графического интерфейса MQL-программ. Часть 2
  • www.mql5.com
В первой части публикации мы рассмотрели базовые принципы описания раскладки графического интерфейса MQL-программ на языке MQL. Для их реализации потребовалось создать несколько классов, отвечающих непосредственно за инициализацию интерфейсных элементов, их объединение в общую иерархию и настройку свойств. Сейчас мы готовимся перейти к более...
 
Stanislav Korotky:

Intente parchear la biblioteca de control: al archivo Wnd.mqh le falta una línea al principio del método OnMouseEvent:

Los detalles se describen en el artículo(Aplicación de OLAP en Trading (Parte 2) - el artículo es sobre OLAP, pero hay una sección sobre GUI, donde se toca el problema anterior):

Básicamente, hay un montón de cosas en la biblioteca de control estándar que tendría que ser ajustado. Por eso se escribió una implementación alternativa, ya parcheada, de ControlsPlus - puedes obtenerla en su totalidad en el artículo MQL as a means of marking up the GUI of MQL programs. Parte 2 (si te interesa, hay partes 1 y 3).

Gracias, lo probaremos.

 

¿Cómo escribir/transmitir texto a CLabel desde OnTick?

class CControlsDialog : public CAppDialog
{
private:
CLabel m_label;// objeto CLabel

.....

void OnTick()
{

m_label.Text(DoubleToString(Ask,4));

....

Obtengo un error

'm_label' - identificador no declarado ...

¿qué ocurre?

Документация по MQL5: Стандартная библиотека / Панели и диалоги / CLabel
Документация по MQL5: Стандартная библиотека / Панели и диалоги / CLabel
  • www.mql5.com
//|                                                ControlsLabel.mq5 | //|                        Copyright 2017, MetaQuotes Software Corp. | //|                                             https://www.mql5.com | //| defines                                                          |  INDENT_LEFT                         (11)      ...
 
Renat Akhtyamov:

¿Cómo escribir/transmitir texto a CLabel desde OnTick?

Obtengo el error

'm_label' - identificador no declarado ...

¿qué ocurre?

¿Has hecho la vinculación al gráfico, coordenadas, etc. como en la función CreateLabel() que se muestra aquí en la ayuda?

 
Vasiliy Pushkaryov:

Y la vinculación al gráfico, coordenadas, etc. como en CreateLabel() se muestra aquí en la ayuda, ¿lo has hecho?

Si escribes texto en el objeto ahí mismo, todo va bien.

Pero si intento escribirlo en OnTick, falla.

No tienes que recrear el objeto en cada tick, ¿verdad?
 
Renat Akhtyamov:

Si escribes texto en el objeto ahí mismo, todo va bien.

Pero si intento escribirlo en OnTick, falla.

No tienes que recrear el objeto en cada tick, ¿verdad?
¿Qué pasa si m_label se mueve a la sección pública ?
 
Vasiliy Pushkaryov:
¿Y si m_label se mueve a la sección pública ?

Lo he intentado, mismo error.

Es que lo estoy haciendo en 4pc.

Creo que ese es el problema.

Además este no funciona, aunque compila.

m_scroll_v1. Disable(); (Estoy intentando cambiar los botones de radio, es interesante cambiar la interfaz). Destroy() funciona, pero Disable no quiere hacerlo

 
Renat Akhtyamov:

probado

Es que lo estoy haciendo en una 4RK.

Creo que ese es el problema.

Además este no funciona, aunque compila.

m_scroll_v1. Disable(); (Estoy intentando cambiar los botones de radio, es interesante cambiar la interfaz). Destroy() funciona, pero Disable no quiere hacerlo

Todo funciona en el 4. Y el objeto que has definido. Se deberia hacer una llamada desde el. Como Panel.m_label.Text( "Max.Margin").
 
Vasiliy Pushkaryov:
Todo funciona en 4. Y el objeto que has definido. Se debe hacer una llamada desde el mismo. Como Panel.m_label.Text( "Max.Margin").

Funciona asi.

Gracias.

He añadido primero el parent, luego lo he pasado a public y funciona.

y esto es m_scroll_v1. Disable(); todavía no funciona

 
Renat Akhtyamov:

funciona así

Gracias.

Añadido el padre primero, luego se trasladó a público y funciona

y este m_scroll_v1. Disable(); todavía no funciona

No me lo he encontrado todavía. No se Stanislav responde a una de las preguntas en el post 27 de este hilo, Disable of the standard library también se toca ahí, échale un vistazo.