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 7

 
Konstantin:

los métodos X(const int x) e Y(const int y) no afectan en absoluto a la posición de la tabla en el formulario, siempre se encuentra en la esquina superior izquierda

Las coordenadas relativas se establecen al crear elementos en una clase personalizada:

//--- Crear un control
   if(!m_canvas_table.CreateTable(m_chart_id,m_subwin,x_gap,y_gap))
      return(false);

//---

¿Cuál es la tarea?

 
Anatoli Kazharski:

Las coordenadas relativas se establecen cuando los elementos se crean en una clase personalizada:

//---

¿Cual es la tarea?

colocar dos tablas horizontalmente, x_gap,y_gap cambia la ubicación del desplazamiento horizontal y listo ((.

PD. entonces, parece que se ha desplazado, pero por alguna razón se desplazan dos tablas ))

y en el método:

CWndContainer::AddToElementsArray(0, m_table_pair.GetTbl());

si hay dos tablas, ¿el primer parámetro es siempre 0 o es un número de serie de objetos idénticos?

Por alguna razón la primera tabla se desplaza persistentemente debajo de la segunda tabla.

 
Konstantin:

...

PS. por lo que, parece que se han desplazado, pero por alguna razón dos tablas se han desplazado ))

y en el método

CWndContainer::AddToElementsArray(0, m_table_pair.GetTbl());

si hay dos tablas, ¿el primer parámetro es siempre 0 o es un número de serie de objetos idénticos?

El primer parámetro es el número del formulario al que se adjunta el objeto. Tal vez añada una misma tabla a la lista común de elementos.
 
Anatoli Kazharski:
El primer parámetro es el número del formulario al que se adjunta el elemento. Quizás esté añadiendo la misma tabla a la lista común de elementos.


¿qué quiere decir en la lista común? ¿dónde está separado?

aquí está el método de creación en la clase form:

¡/*!
 \brief Crear objeto
 \param const string a_name - nombre del programa
 \param const uint a_pause - pausa para la actualización de la línea de estado
 \return true si tiene éxito, en caso contrario false
*/
bool CMainForm::Create(const string a_name,const uint a_pause) {
   m_counter500.SetParameters(16, a_pause);
   m_counter16.SetParameters(16, 16);

   if(!CreateForm(m_form, a_name))
      return false;

   if(!CreateStatusBar(m_status_bar, m_form, 1, STATUS_SIZE_HEIGHT))
      return false;

   if(!m_table_sign.Create(m_form, m_chart_id, m_subwin, 1, 20))
      return false;

   if(!m_table_pair.Create(m_form, m_chart_id, m_subwin, 450, 20))
      return false;
   //--- añade el objeto tabla al array común de grupos de objetos
   CWndContainer::AddToElementsArray(0, m_table_sign.GetTbl());
   CWndContainer::AddToElementsArray(0, m_table_pair.GetTbl());

   m_chart.Redraw();
//---
   return true;
}

El método GetTbl devuelve un puntero a CCanvasTable m_table

 
Konstantin:

...

¿Es este el resultado que quieres?

//---

He adjuntado un ejemplo en el archivo:

Archivos adjuntos:
 
Konstantin:

aquí está el método create en la clase form:

El método GetTbl devuelve un puntero a CCanvasTable m_table

//--- Crear un control
   if(!m_canvas_table2.CreateTable(m_chart_id,m_subwin,x_gap,y_gap))
      return(false);
//--- Añade el objeto al array común de grupos de objetos
   CWndContainer::AddToElementsArray(0,m_canvas_table2);
 
Anatoli Kazharski:

¿Quieres un resultado como este?

//---

Adjunto un ejemplo en el archivo:


Lo hice así

¡/*!
 \brief Crear objeto
 \param const string a_name - nombre del programa
 \param const uint a_pause - pausa para la actualización de la línea de estado
 \return true si tiene éxito, en caso contrario false
*/
bool CMainForm::Create(const string a_name,const uint a_pause) {
   m_counter500.SetParameters(16, a_pause);
   m_counter16.SetParameters(16, 16);

   if(!CreateForm(m_form, a_name))
      return false;

   if(!CreateStatusBar(m_status_bar, m_form, 1, STATUS_SIZE_HEIGHT))
      return false;

   if(!m_table_sign.Create(m_form, m_chart_id, m_subwin, 1, 20))
      return false;

   //--- añade el objeto tabla al array común de grupos de objetos
   CWndContainer::AddToElementsArray(0, m_table_sign.GetTbl());

   if(!m_table_pair.Create(m_form, m_chart_id, m_subwin, 450, 20))
      return false;
   //--- añade el objeto tabla al array común de grupos de objetos
   CWndContainer::AddToElementsArray(0, m_table_pair.GetTbl());

   m_chart.Redraw();
//---
   return true;
}

y todo funcionó, resulta que inmediatamente después de crear un objeto debe ser colocado en un contenedor y sólo entonces crear otro objeto ))


 
Anatoli Kazharski:

No, tengo tablas en otras clases, uso programación modular )) por lo que es más conveniente gestionar la funcionalidad - clase de formulario principal, clase de tabla 1, clase de tabla 2, etc. al final todos los elementos se ensamblan en la clase de formulario principal como objetos listos separados.
 
Konstantin:

No, tengo tablas en otras clases, uso programación modular )) por lo que es más conveniente gestionar la funcionalidad - clase de formulario principal, clase de tabla 1, clase de tabla 2, etc. al final todos los elementos se recogen en la clase de formulario principal como objetos separados listos.
De acuerdo. Muchos usuarios de esta librería lo hacen, pero yo no lo consigo. )
 
Anatoli Kazharski:
Estoy de acuerdo. Muchos usuarios de esta biblioteca lo hacen, pero yo no lo consigo. )


Por cierto, hay un problema:

CWndEvents::CWndEvents(void) : m_chart_id(0),
                               m_subwin(0),
                               m_active_window_index(0),
                               m_indicator_shortname(""),
                               m_program_name(PROGRAM_NAME),
                               m_subwindow_handle(INVALID_HANDLE),
                               m_subwindow_shortname(""),
                               m_subwindows_total(1)

  {
//--- Iniciar el temporizador
   if(!::MQLInfoInteger(MQL_TESTER))
      ::EventSetMillisecondTimer(TIMER_STEP_MSC);
//--- Obtener el ID del gráfico actual
   m_chart.Attach();
//--- Activar el seguimiento de eventos del ratón
   m_chart.EventMouseMove(true);
//--- Desactivar la invocación de la línea de comandos para las teclas Espacio y Enter
   m_chart.SetInteger(CHART_QUICK_NAVIGATION,false);
//--- Determinar el número de subventana
   DetermineSubwindow();
  }

La línea seleccionada no permite trabajar en el tester. Es mejor hacer una elección como esta:

enum ENUM_GRAPHICS {
   GRAPHICS_NO    = 0,  // no necesita gráficos
   GRAPHICS_REAL  = 1,  // gráficos para operar de verdad
   GRAPHICS_TEST  = 2   // gráficos para pruebas
};

/*!
 Obtiene una indicación del programa en ejecución
*/
ENUM_GRAPHICS CCheck::GetGraphics(void) { return m_graphics; }
//-----------------------------------------------------------------------------+
/*!
 Signo de visualización de gráficos
 \return signo de operación del programa de la enumeración ENUM_GRAPHICS
*/
ENUM_GRAPHICS CCheck::CheckGraphicsDisplay(void) {
   if(MQLInfoInteger(MQL_OPTIMIZATION) || (MQLInfoInteger(MQL_TESTER) && !MQLInfoInteger(MQL_VISUAL_MODE)))
      m_graphics = GRAPHICS_NO;
   else if(!MQLInfoInteger(MQL_OPTIMIZATION) && !MQLInfoInteger(MQL_TESTER) && !MQLInfoInteger(MQL_VISUAL_MODE))
      m_graphics = GRAPHICS_REAL;
   else if(MQLInfoInteger(MQL_VISUAL_MODE))
      m_graphics = GRAPHICS_TEST;
//---
   return m_graphics;
}

y en el programa hacer una selección como esta:

   //--- configuración para OnTimer()
   uint _pause = 0;
   if(in_param.graphics == GRAPHICS_REAL)
      _pause = 500;                       // 500 ms
   else if(in_param.graphics == GRAPHICS_TEST)
      _pause = 60000;                     // 1 minuto

   if(!main_form.Create(name_mts, _pause)) {
      ::Print(__FUNCTION__,"> ¡Fallo al crear una interfaz gráfica de usuario!");
      return INIT_FAILED;
   }

o simplemente utilizar banderas para hacer una selección