Discusión sobre el artículo "Interfaces gráficas VIII: Control "Explorador de archivos" (Capítulo 3)" - página 2

 

Anatoly, esta es en mi opinión la mejor implementación de la biblioteca gui en mql que he visto aquí.

Ahora estoy buscando la manera de "perno" a mi EA. Todo es suficiente excepto dos cosas:

1) no hay ninguna tabla con controles dentro de las celdas individuales (casillas de verificación, botones, ...).

2) No puedo "ponerse al día" cómo hacer una ventana con contenido dinámico.

Para 1)-th en principio está claro que hay que hacer una nueva clase como extensión de CTable. Pero con 2) es un misterio. Supongamos que en diferentes momentos del trabajo del Asesor Experto se abre una ventana de diálogo, en la que dependiendo de las condiciones actuales puede haber un número diferente de casillas de verificación. Si el número de casillas de verificación aumenta la siguiente vez que se abre la ventana, está claro cómo se hace. Pero si el número de casillas de verificación disminuye - ¿cómo hacerlo? Si lo he entendido bien, es necesario "matar" algunos de los controles "suscritos" a esta ventana, pero en CWndContainer no hay métodos para destruir elementos, sólo métodos para añadirlos. ¿Puedes decirme cómo hacerlo, si es posible en esta versión de la librería?

 
akskarabey:

Anatoly, esta es en mi opinión la mejor implementación de la biblioteca gui en mql que he visto aquí.

Ahora estoy buscando la manera de "perno" a mi EA. Todo es suficiente excepto dos cosas:

1) no hay ninguna tabla con controles dentro de las celdas individuales (casillas de verificación, botones, ...).

2) No puedo "ponerse al día" cómo hacer una ventana con contenido dinámico.

Para 1)-th en principio está claro que hay que hacer una nueva clase como extensión de CTable. Pero con 2) es un misterio. Supongamos que en diferentes momentos del trabajo del Asesor Experto se abre una ventana de diálogo, en la que dependiendo de las condiciones actuales puede haber un número diferente de casillas de verificación. Si el número de casillas de verificación aumenta la siguiente vez que se abre la ventana, está claro cómo se hace. Pero si el número de casillas de verificación disminuye - ¿cómo hacerlo? Si lo he entendido bien, es necesario "matar" algunos de los controles "suscritos" a esta ventana, pero en CWndContainer no hay métodos para destruir elementos, sólo métodos para añadirlos. ¿Puedes decirme cómo hacerlo, si es posible en esta versión de la librería?

Gracias por tus interesantes sugerencias.

Sí, no hay tales soluciones ya hechas en esta versión ahora. Veo la necesidad de tales características, así que las he añadido al plan de implementación.

Sobre el segundo punto. Si necesita una lista dinámica de casillas de verificación, es más fácil crear una clase más de un elemento como CCheckboxList con métodos de adición y eliminación de elementos de la matriz (lista) después de que el elemento se crea. Por cierto, también planeamos añadir esta característica a todos los tipos de listas y tablas.

 
Anatoli Kazharski:

Sobre el segundo punto. Si necesitas una lista dinámica de casillas de verificación, una forma más sencilla es crear otra clase de un elemento de tipo CCheckboxList con métodos de adición y eliminación de elementos de la matriz (lista) después de la creación del elemento. Por cierto, también está previsto añadir esta característica a todos los tipos de listas y tablas.

¿Es posible hacer varias pestañas con diferentes conjuntos de casillas de verificación y mostrar la necesaria?
 
Andrey Khatimlianskii:
¿Podemos hacer varias pestañas con diferentes conjuntos de casillas de verificación y mostrar la deseada?

Si los conjuntos están predefinidos, entonces esta opción está bien.

Ya es posible crear pestañas: GUIs VII: Elementos "Pestañas" (Capítulo 2) >>>

 
Anatoli Kazharski:

Si los conjuntos están predefinidos desde el principio, esta opción está bien.

Ya es posible crear pestañas: GUIs VII: Elementos de pestaña (Capítulo 2) >>>.

Eso era una indirecta para el que preguntaba )

Bueno, y una pequeña pregunta - ¿es posible activar una pestaña mediante programación.

 
Andrey Khatimlianskii:

...

Bueno, y una pequeña pregunta - ¿es posible activar la ficha mediante programación.

En una clase personalizada al crear una interfaz antes de crear un elemento:

//+------------------------------------------------------------------+
//| Crea un área con pestañas|
//+------------------------------------------------------------------+
bool CProgram::CreateTabs(void)
  {
#define  TABS1_TOTAL 4
//--- Pasar el objeto panel
   m_tabs.WindowPointer(m_window1);
//--- Coordenadas
   int x=m_window1.X()+TABS1_GAP_X;
   int y=m_window1.Y()+TABS1_GAP_Y;
//--- Matrices con texto y anchura para las pestañas
   string tabs_text[]={"Tab 1","Tab 2","Tab 3","Tab 4"};
   int tabs_width[]={90,90,90,90};
//--- Establecer propiedades antes de la creación
   m_tabs.XSize(596);
   m_tabs.YSize(243);
   m_tabs.TabYSize(TabsHeight);
   m_tabs.PositionMode(TabsPosition);
   m_tabs.SelectedTab((m_tabs.SelectedTab()==WRONG_VALUE) ? 1 : m_tabs.SelectedTab());
//--- Añadir pestañas con las propiedades especificadas
   for(int i=0; i<TABS1_TOTAL; i++)
      m_tabs.AddTab(tabs_text[i],tabs_width[i]);
//--- Crear un control
   if(!m_tabs.CreateTabs(m_chart_id,m_subwin,x,y))
      return(false);
//--- Añade el objeto al array común de grupos de objetos
   CWndContainer::AddToElementsArray(0,m_tabs);
   return(true);
  }

//---

¿Es esto suficiente? ¿O es necesario ser capaz de cambiar de pestaña mediante programación después de que el elemento se crea en el proceso de trabajo?

 

Sería deseable añadir una función de este tipo...

algo como:

m_tabs.SelectTab(...)
 
Ruslan Khasanov:
Andrey Khatimlianskii:

Haré posible activar una pestaña especificando su índice después de haberla creado.

De hecho, hay casos en los que esto puede ser necesario. Se me ocurrieron un par de ideas en las que la activación de una pestaña podría ser automática. )

 

¿Cómo ajustar el tamaño del navegador al tamaño de la ventana en la que se muestra el navegador?

Por ejemplo: el tamaño de la ventana es 450. ¿Cómo puedo ajustar el navegador a la ventana para que haya sangrías de 2 píxeles a la derecha y a la izquierda?

 
Artyom Trishkin:

¿Cómo ajustar el tamaño del navegador al tamaño de la ventana en la que se muestra el navegador?

Por ejemplo: el tamaño de la ventana es 450. ¿Cómo puedo ajustar el navegador a la ventana para que la derecha y la izquierda tengan una sangría de 2 píxeles cada una?

Debe utilizar los métodos CFileNavigator::TreeViewAreaWidth() y CFileNavigator::ContentAreaWidth(), especificando la anchura para el área de la lista del árbol y el área de contenido. Si no establece la anchura del área de contenido, el borde derecho del navegador se alineará automáticamente con el borde derecho de la ventana.