Discusión sobre el artículo "Interfaces gráficas X: Gestión ampliada de las listas y tablas. Optimización de código (build 7)" - página 9

 

Bueno, Tol, gracias por la pista:

//--- Columnas
   for(uint c=l; c<m_visible_columns_total; c++)
     {
      //--- Obtener la posición actual del deslizador de la barra de desplazamiento vertical
      v=m_scrollv.CurrentPos()+t;
      //--- Filas
      for(uint r=t; r<m_visible_rows_total; r++)
        {
         //--- Datos de la tabla de desplazamiento
         if(v>=t && v<m_rows_total && h>=l && h<m_columns_total)
           {
            //--- Ajuste de la línea resaltada
            color back_color=(m_selected_item==v) ? m_selected_row_color : m_vcolumns[h].m_cell_color[v];
            color text_color=(m_selected_item==v) ? m_selected_row_text_color : m_vcolumns[h].m_text_color[v];
            //--- Ajuste (1) los valores, (2) el color de fondo, (3) el color del texto y (4) la alineación del texto en las celdas
            SetCellParameters(c,r,m_vcolumns[h].m_vrows[v],back_color,text_color,m_vcolumns[h].m_text_align[v]);
            v++;
           }
        }
      //---
      h++;
     }
Así que todo funciona como debería ;)
 

Foro sobre negociación, sistemas automatizados de negociación y prueba de estrategias de negociación

EasyAndFastGUI biblioteca

Viktor Glovluk, 2017.01.26 10:42 AM.

¡Estimados miembros del foro, por favor ayuda!

¡Sobre la base de esta biblioteca de Anatoli Kazharski , tratando de soldar un búho y quería organizar un registro en el archivo de los estados de las casillas de verificación y los valores de los campos de entrada! ¡Pero para no registrar cada vez TODOS los valores, no puedo entender cómo determinar el elemento que se hizo clic! ¡En la aplicación de usuario hay un controlador de eventos, y el parámetro lparam es sólo responsable del índice del elemento, pero la forma de encontrar el elemento por este índice que luego trabajar con él no puedo entender!

¡Gracias de antemano!


 

Viktor Glovluk, 2017.01.26 10:42

¡Estimados miembros del foro, por favor ayúdenme!

¡Sobre la base de esta biblioteca de Anatoli Kazharski , estoy tratando de soldar un búho y quería organizar un registro en el archivo de los estados de las casillas de verificación y los valores de los campos de entrada! ¡Pero para no registrar cada vez TODOS los valores, no puedo entender cómo determinar el elemento que se hizo clic! ¡En la aplicación de usuario hay un controlador de eventos, y el parámetro lparam es sólo responsable del índice del elemento, pero la forma de encontrar el elemento por este índice que luego trabajar con él no puedo entender!

¡Gracias de antemano!

Al hacer clic en las casillas de verificación puede ser rastreado por el evento con el identificador ON_CLICK_LABEL.

En lparam viene el valor del identificador del elemento.

Ejemplo:

//+------------------------------------------------------------------+
//| Manejador de eventos|
//+------------------------------------------------------------------+
void CProgram::OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
//--- Evento click en la etiqueta de texto
   if(id==CHARTEVENT_CUSTOM+ON_CLICK_LABEL)
     {
      //--- Si ha hecho clic en la primera casilla de verificación
      if(lparam==m_checkbox1.Id())
        {
         //---
        }
     }
  }
 

¿Es esta realmente la única manera?

//--- Si ha hecho clic en la primera casilla de verificación

if(lparam==m_checkbox1.Id())

¡Contestado ya después de dejar este post! ¡Gracias! Y tengo que pasar por todas las casillas de verificación y campos de entrada? Y como ejemplo si hay un "montón" de ellos? No array que almacena todos los índices de los elementos? ¡Entonces por este índice para obtener los valores necesarios (por ejemplo, hecho clic o no hecho clic en la casilla de verificación, el valor en el campo de entrada)!
 
Viktor Glovluk:

¿Es la única manera?

¿Cómo lo quieres? Acláralo.
 
Viktor Glovluk:

...

¿Cuál es un ejemplo si hay un "montón" de ellos? No hay una matriz que almacena todos los índices de los elementos? ¡Entonces por este índice para obtener los valores necesarios (por ejemplo, casilla de verificación clicada o no clicada, valor en el campo de entrada)!

Mira el contenido de la clase CWndContainer. Todos están almacenados allí en la estructura WindowElements. Se puede acceder a ellos desde la clase de usuario.

   //--- Estructura de matrices de elementos
   struct WindowElements
     {
      //--- Matriz total de todos los objetos
      CChartObject     *m_objects[];
      //--- Matriz total de todos los elementos
      CElementBase     *m_elements[];

      //--- Arreglos personales de elementos:
      // Matriz de menús contextuales
      CContextMenu     *m_context_menus[];
      //--- Matriz de menús principales
      CMenuBar         *m_menu_bars[];
      //--- Información sobre herramientas
      CTooltip         *m_tooltips[];
      //--- Matriz de listas desplegables de diferentes tipos
      CElementBase     *m_drop_lists[];
      //--- Matriz de barras de desplazamiento
      CElementBase     *m_scrolls[];
      //--- Matriz de tablas de etiquetas de texto
      CElementBase     *m_labels_tables[];
      //--- Matriz de tablas de campos de entrada
      CElementBase     *m_tables[];
      //--- Matriz de tablas dibujadas
      CElementBase     *m_canvas_tables[];
      //--- Matriz de pestañas
      CTabs            *m_tabs[];
      //--- Array de pestañas con imágenes
      CIconTabs        *m_icon_tabs[];
      //--- Matriz de calendarios
      CCalendar        *m_calendars[];
      //--- Matriz de calendarios desplegables
      CDropCalendar    *m_drop_calendars[];
      //--- Listas de árboles
      CTreeView        *m_treeview_lists[];
      //--- Navegadores de archivos
      CFileNavigator   *m_file_navigators[];
      //--- Gráficos estándar (objetos gráficos)
      CStandardChart   *m_sub_charts[];
      //--- Deslizadores de imágenes
      CPicturesSlider  *m_pictures_slider[];
      //--- Tiempo
      CTimeEdit        *m_time_edits[];
      //--- Campos multilínea
      CTextBox         *m_text_boxes[];
     };
   //--- Matriz de matrices de elementos para cada ventana
   WindowElements    m_wnd[];
 

Cuanto más lejos, mejor. :)

¡De nuevo me he encontrado con implementaciones de manejadores de eventos que no entiendo! Cuando se crea una aplicación personalizada, se supone que para conectar la interfaz gráfica de usuario a través de una clase:

//--- Conexión de la clase de panel comercial
#include "Menu.mqh"
CProgram program;

pero entonces, ¿cómo atrapar las pulsaciones de botones, cómo obtener los estados de las casillas de verificación y los valores de los campos de entrada, si están en la zona privada de la clase CProgram? ¿Debo mover lo que necesito a público o no entiendo algo?

 
Viktor Glovluk:

...

pero luego cómo atrapar las pulsaciones de botones, cómo obtener los estados de las casillas de verificación y los valores de los campos de entrada, ...

En el manejador CProgram.

//+------------------------------------------------------------------+
//| Manejador de eventos|
//+------------------------------------------------------------------+
void CProgram::OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
//--- Evento click en la etiqueta de texto
   if(id==CHARTEVENT_CUSTOM+ON_CLICK_LABEL)
     {

     }

  } 

//---

Todos los artículos tienen archivos de ejemplo de aplicaciones MQL que muestran como manejar los eventos de los controles.

 
Anatoli Kazharski:

En el manejador CProgram.

//+------------------------------------------------------------------+
//| Manejador de eventos|
//+------------------------------------------------------------------+
void CProgram::OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
//--- Evento click en la etiqueta de texto
   if(id==CHARTEVENT_CUSTOM+ON_CLICK_LABEL)
     {

     }

  } 

//---

Todos los artículos tienen archivos de ejemplo de aplicaciones MQL que muestran como manejar eventos de control.

En el manejador CProgram está claro, pero este manejador es para la interfaz, ¿verdad? ¡Usted no debe meter soluciones comerciales en él! ¡Entiendo muy poco acerca de OOP, sobre todo todo mi conocimiento proviene de sus artículos, así que puedo ser estúpido! :)

Así, por ejemplo, ¿cómo implementar en el Asesor Experto la apertura de una orden, el lotness de los cuales se establece en el campo de entrada? ¡Necesito obtener el valor de este campo en el propio EA!

 
Viktor Glovluk:

En el manejador CProgram está claro, pero este manejador es para la interfaz, ¿verdad? ¡No deberías estar metiendo soluciones comerciales en él!

¿Por qué no? Sí, usted puede. Es una clase de su MQL-aplicación (indicador o Asesor Experto). Todo es lo mismo.

Usted puede obtener el valor del campo de entrada de esta manera:

m_spin_edit1.GetValue()