Discusión sobre el artículo "Cómo crear un panel gráfico de cualquier nivel de complejidad" - página 8
Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
¡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:
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á presenteComo 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).
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?
¿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?
Y la vinculación al gráfico, coordenadas, etc. como en CreateLabel() se muestra aquí en la ayuda, ¿lo has hecho?
sí
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?sí
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?¿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
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 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
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