Discusión sobre el artículo "Interfaces gráficas X: Selección del texto en el campo de edición multilínea (build 13)" - página 5

 
Pavel Kolchin:
@Pavel Kolchin, para evitar que las flechas de los tratos cuelguen sobre el panel utiliza el método CWndEvents::ResetWindow().
 
Anatoli Kazharski:

sí, pero hay un problema, cuando se utiliza durante mucho tiempo aparece un error sin razón, la supresión de la subventana EA provoca la EA para ser eliminado

img

 
Pavel Kolchin:

sí, pero hay un problema, cuando se utiliza durante mucho tiempo aparece un error sin ninguna razón, la eliminación de la subventana EA conduce a la eliminación de la EA

En el archivo Defines.mqh, establece el parámetro EXPERT_IN_SUBWINDOW a false:

//+------------------------------------------------------------------+
//|Define.mqh |
//| Copyright 2015, MetaQuotes Software Corp.
//|http://www.mql5.com
//+------------------------------------------------------------------+
//--- Experto en modo ventana
#define  EXPERT_IN_SUBWINDOW false

//---

Para los Asesores Expertos cuya interfaz gráfica se encuentra en la ventana principal del gráfico, el valor de este parámetro debe ser false.

 
Anatoli Kazharski:

En el archivo Defines.mqh, establece el parámetro EXPERT_IN_SUBWINDOW en false:


está claro, hay una función que funciona funciona funciona funciona (varios días) y luego tarda y falla.


//+------------------------------------------------------------------+
//| Comprobación y actualización del número de la ventana del Asesor Experto |
//+------------------------------------------------------------------+
void CWndEvents::CheckExpertSubwindowNumber(void)
  {
//--- Salir si no es un experto
   if(PROGRAM_TYPE!=PROGRAM_EXPERT)
      return;
//--- Obtener el número de sub-ventanas en el gráfico
   int subwindows_total=(int)::ChartGetInteger(m_chart_id,CHART_WINDOWS_TOTAL);
//--- Salir si el número de subventanas y el número de indicadores no han cambiado
   if(subwindows_total==m_subwindows_total)
      return;
//--- Guardar el número actual de subventanas
   m_subwindows_total=subwindows_total;
//--- Para comprobar si hay una subventana experta
   bool is_subwindow=false;
//--- Encuentra la subventana del experto.
   for(int sw=0; sw<subwindows_total; sw++)
     {
      //--- Detener el bucle si hay una subventana experta
      if(is_subwindow)
         break;
      //--- Cuántos indicadores hay en esta ventana/subventana
      int indicators_total=::ChartIndicatorsTotal(m_chart_id,sw);
      //--- Repasemos todos los indicadores de la ventana 
      for(int i=0; i<indicators_total; i++)
        {
         //--- Obtener el nombre corto del indicador
         string indicator_name=::ChartIndicatorName(m_chart_id,sw,i);
         //--- Si no es una subventana Experto, pasa a la siguiente
         if(indicator_name!=m_subwindow_shortname)
            continue;
         //--- Tenga en cuenta que la subventana EA es
         is_subwindow=true;
         //--- Si el número de subventana ha cambiado, entonces 
         // necesitamos guardar el nuevo número en todos los elementos del formulario principal
         if(sw!=m_subwin)
           {
            //--- Guardar número de subventana
            m_subwin=sw;
            //--- Guardémoslo también en todos los elementos del formulario principal de la interfaz
            int elements_total=CWndContainer::ElementsTotal(0);
            for(int e=0; e<elements_total; e++)
               m_wnd[0].m_elements[e].SubwindowNumber(m_subwin);
           }
         //---
         break;
        }
     }
//--- Si la subventana del Asesor Experto no se encuentra, borre el Asesor Experto
   if(!is_subwindow)
     {
      ::Print(__FUNCTION__,"Eliminar una subventana de EA provoca la eliminación del EA".);
      //--- Eliminar el Asesor Experto del gráfico
      ::ExpertRemove();
     }
  }
 
Pavel Kolchin:


está claro, hay una función que funciona durante unos días y luego falla.

No estás usando la última versión de la librería o has hecho cambios en ella. Debería haber esta condición al principio de este método:

//--- Salir si (1) no es un EA o (2) la GUI del EA está en la ventana principal
   if(PROGRAM_TYPE!=PROGRAM_EXPERT || !EXPERT_IN_SUBWINDOW)
      return;

//---

Y la tienes:

//--- Salir si no es un experto
   if(PROGRAM_TYPE!=PROGRAM_EXPERT)
      return;
 
Anatoli Kazharski:

No está utilizando la última versión de la biblioteca o ha realizado modificaciones en ella. Al principio de este método debería haber esta condición:

si, creo que seria mejor)

versión 10.2, por lo que tiene todos los elementos de menú que necesito y soporte para mt4.

¿hay algún otro cambio crítico desde entonces que pueda afectar al trabajo?

 
Pavel Kolchin:

...

¿ha habido alguna otra edición crítica desde entonces que pueda afectar al rendimiento?

Es difícil decirlo de entrada. Constantemente se añaden y corrigen cosas.
 

Es deseable añadir al formulario un mecanismo para añadir objetos según el principio de "fábrica", como en Qt, o algo similar y preferiblemente con orientación relativa:

- derecha

- izquierda

- arriba

- abajo

 
Konstantin:

Es deseable añadir al formulario un mecanismo para añadir objetos según el principio de "fábrica", como en Qt, o algo similar y preferiblemente con orientación relativa:

- derecha

- izquierda

- arriba

- abajo

Por favor, describa en detalle. No sé cómo es en Qt.

Ahora los elementos se pueden posicionar respecto al formulario: derecha, izquierda, arriba, abajo. Sólo el formulario puede ser un elemento padre. En la próxima versión será posible establecer cualquier otro elemento como elemento padre. Esto facilitará aún más la gestión y el posicionamiento de los elementos.

 
Anatoli Kazharski:

Descríbelo con más detalle. No sé cómo es en Qt.

Ahora los elementos se pueden posicionar respecto al formulario: derecha, izquierda, arriba, abajo. Sólo el formulario puede ser un elemento padre. En la próxima versión será posible establecer cualquier otro elemento como elemento padre. Esto facilitará aún más la gestión y el posicionamiento de los elementos.


en Qt es una función de fábrica:

QWidgetAction *createWidget();

y así es como se hacen las pruebas de creación de widgets:

QWidget * widget() {
   static QWidget * inst = new QWidget;
   return inst;
}

y en general sobre QWidget aquí está toda la información.

Ahora los elementos se pueden posicionar respecto al formulario: derecha, izquierda, arriba, abajo.

No lo entiendo muy bien, ¿este posicionamiento del elemento es relativo a los bordes y se pueden colocar tanto detrás del formulario como dentro del formulario?

Por ejemplo, hay un formulario, posicionamos un elemento relativo al borde izquierdo del formulario más a la izquierda?