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 8

 
Konstantin:

Por cierto, hay un problema:

La cadena resaltada no permite trabajar en el tester.

No he probado en el probador en absoluto todavía, ya que había un montón de restricciones allí antes. Así que temporalmente hasta ahora.

¿Has intentado ya probar la GUI en el tester? ¿Cuál es el resultado? ¿Funcionan los eventos? ¿Se muestran todos los objetos gráficos?

 
Anatoli Kazharski:

Todavía no he hecho ninguna prueba en el probador, ya que antes había muchas restricciones. Por eso está temporalmente así por ahora.

¿Has probado ya la GUI en el tester? ¿Cuál es el resultado? ¿Funcionan los eventos? ¿Se muestran todos los objetos gráficos?


Sí, todos los objetos se muestran, los eventos del ratón en los gráficos no funcionan en el tester, pero así toda la interfaz está viva, y en realidad era así antes

En general, probablemente dejaré el temporizador incorporado por ahora, para no editar la librería ))

 

No puedo averiguar cómo hacer que el formulario se creó un cierto tamaño en X y se unió a la frontera derecha de la tabla, es decir, cuando se cambia el tamaño de la tabla en X, la forma no cambiaría el tamaño se movería a la derecha / izquierda sin cambiar su tamaño.

Como una opción para anular el método ChartEventChartChange en la clase CWndEvents, este método se encuentra en la sección privada, tal vez tenga sentido para mover los métodos:

void ChartEventCustom(void);
void ChartEventClick(void);
void ChartEventMouseMove(void);
void ChartEventObjectClick(void);
void ChartEventEndEdit(void);
void ChartEventChartChange(void);

Mover a la sección protegida, pero de nuevo, los métodos de la sección privada también se utilizan allí? En general, si alguien se ha encontrado con un problema de este tipo, por favor, sugiera una solución

 
Konstantin:

No puedo averiguar cómo hacer que el formulario se creó un cierto tamaño en X y se unió a la frontera derecha de la tabla, es decir, cuando se cambia el tamaño de la tabla en X, la forma no cambiaría el tamaño se movería a la derecha / izquierda sin cambiar su tamaño.

Como una opción para anular el método ChartEventChartChange en la clase CWndEvents, este método se encuentra en la sección privada, tal vez tenga sentido para mover los métodos:

Mover a la sección protegida, pero de nuevo, los métodos de la sección privada también se utilizan allí? En general, si alguien se ha encontrado con un problema de este tipo, por favor, sugiera una solución

Aproximadamente así:

//+------------------------------------------------------------------+
//|| Crea un formulario para los controles ||
//+------------------------------------------------------------------+
bool CProgram::CreateWindow(const string caption_text)
  {
//--- Añade el puntero de la ventana al array de ventanas
   CWndContainer::AddWindow(m_window);
//--- Dimensiones
   int x_size =200;
   int y_size =200;
//--- Coordenadas
   int x =m_chart.WidthInPixels()-(x_size+1);
   int y =1;
//--- Propiedades
...
//--- Creación del formulario
   if(!m_window.CreateWindow(m_chart_id,m_subwin,caption_text,x,y))
      return(false);
//---
   return(true);
  }

//---

En el manejador de eventos de la clase de usuario MQL-application al procesar el evento CHARTEVENT_CHART_CHANGE:

//+------------------------------------------------------------------+
//| Manejador de eventos|
//+------------------------------------------------------------------+
void CProgram::OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
   if(id==CHARTEVENT_CHART_CHANGE)
     {
      m_window.X(m_chart.WidthInPixels()-(m_window.XSize()+1));
     }
  }

//---

Resultado:

//---

También puede añadir una comprobación si el tamaño (anchura) de la ventana del gráfico ha cambiado, ya que el evento CHARTEVENT_CHART_CHANGE se genera en diferentes casos. Por ejemplo, cuando se desplaza el gráfico.

 
Anatoli Kazharski:

Es algo así:

//---

En el manejador de eventos de una clase de aplicación MQL personalizada cuando se procesa un evento CHARTEVENT_CHART_CHANGE:

//---

Resultado:

//---

También puede añadir una comprobación si el tamaño (anchura) de la ventana del gráfico ha cambiado, ya que el evento CHARTEVENT_CHART_CHANGE se genera en diferentes casos. Por ejemplo, al desplazar el gráfico.


oops, funcionó ))
 

¿Cómo obtener en la tabla el índice de la fila sobre la que se ha pulsado el botón izquierdo del ratón, si al crear la tabla se ha establecido SelectableRow(false)? Analizando el parámetro sparam en OnEvent no parece elegante. Por supuesto es posible usar SelectableRow(true) y usar SelectedItem(), pero la tarea es sin seleccionar filas en la tabla.

 
Konstantin:

¿Cómo obtener en la tabla el índice de la fila sobre la que se ha pulsado el botón izquierdo del ratón, si al crear la tabla se ha establecido SelectableRow(false)? Parsear el parámetro sparam en OnEvent no parece elegante. Por supuesto, podemos usar SelectableRow(true) y usar SelectedItem(), pero la tarea es sin seleccionar filas en la tabla.

Hasta ahora sólo como este, pero voy a añadir esta característica.
 
¿Cómo diferenciar entre el evento de seleccionar una fila en una tabla y seleccionar un elemento en un cuadro combinado? Por el código veo que utilizan el mismo evento ON_CLICK_LIST_ITEM.
 
Konstantin:
¿Cómo diferenciar entre el evento de seleccionar una fila en una tabla y seleccionar un elemento en un cuadro combinado? Del código se desprende que utilizan el mismo evento ON_CLICK_LIST_ITEM.
¿Por qué? ¿Qué es exactamente lo que impide hacerlo?
 

Muestro una tabla en un formulario, selecciono una fila en ella, selecciono un valor en un cuadro combinado y los datos de la fila de la tabla y el valor del cuadro combinado deberían escribirse en una entidad separada. Ahora los eventos no están delimitados y es necesario hacer muletillas que realicen la tarea:


¿quizás puedas sugerir algún otro mecanismo?

Básicamente, la tabla es un array de pares de tickers, el combo-box contiene tipos de señales, una entidad separada son los objetos del array de señales. Los objetos en sí no son un solo campo, sino tipos de datos personalizados complejos, un par de tickers de la tabla y un tipo de señal se registran en ellos, y luego se realiza otro procesamiento.