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 7

 
Anatoli Kazharski:
No hay datos suficientes para reproducirlo. Dame un ejemplo completo para que pueda reproducirlo yo mismo.

En un mensaje privado entonces - usted necesita clases adicionales allí.

Sí, sucede después de reconstruir la tabla.

 
Anatoli Kazharski:
No hay datos suficientes para reproducirlo. Por favor, adjunta un ejemplo completo para que pueda repetirlo yo mismo.

Tol, sobre la pregunta anterior y sobre el mensaje privado con un ejemplo de código sin panderetas: Toma tu ejemplo de Experts\Article10\TestLibrary06.

En Program.mqh en el temporizador sólo tienes que escribir unas líneas, compilar y mirar.

//+------------------------------------------------------------------+
//| Temporizador|
//+------------------------------------------------------------------+
void CProgram::OnTimerEvent(void)
  {
   CWndEvents::OnTimerEvent();
//--- Pausa entre actualizaciones de elementos
   if(m_counter1.CheckTimeCounter())
     {
      //--- Actualización del segundo elemento de la barra de estado
      m_status_bar.ValueToItem(1,::TimeToString(::TimeLocal(),TIME_DATE|TIME_SECONDS));
      //--- Redibujar el gráfico
      m_chart.Redraw();
     }
//--- Pausa entre actualizaciones de elementos
   if(m_counter2.CheckTimeCounter())
     {
      //--- Introduzca el valor del precio del símbolo actual en el Precio de la primera fila
      MqlTick tick;

      if(SymbolInfoTick(Symbol(),tick))
        {
         int dg=(int)SymbolInfoInteger(Symbol(),SYMBOL_DIGITS);
         m_table.SetValue(1,1,DoubleToString(tick.bid,dg),dg);
         m_table.UpdateTable();
        }

      //--- Añade una fila a la tabla si el número total es menor que el especificado
      if(m_table.RowsTotal()<m_spin_edit1.GetValue())
         m_table.AddRow();
      //--- Añade una columna a la tabla si el número total de columnas es menor que el número especificado.
      if(m_table.ColumnsTotal()<m_spin_edit2.GetValue())
         m_table.AddColumn();
      //--- Añade un elemento a la lista si el número total es menor que el número especificado.
      if(m_listview.ItemsTotal()<m_spin_edit5.GetValue())
        {
         m_listview.AddItem("SYMBOL "+string(m_listview.ItemsTotal()));
         //--- Mover el deslizador de la barra de desplazamiento al final de la lista
         m_listview.Scrolling();
        }
      //--- Añadir un elemento a la lista de las casillas de verificación si el número total es menor que el especificado.
      if(m_checkbox_list.ItemsTotal()<m_spin_edit5.GetValue())
        {
         m_checkbox_list.AddItem("Checkbox "+string(m_checkbox_list.ItemsTotal()));
         //--- Mover el deslizador de la barra de desplazamiento al final de la lista
         m_checkbox_list.Scrolling();
        }
      //--- Redibujar el gráfico
      m_chart.Redraw();
     }
  }
//+------------------------------------------------------------------+

Sin una fila con la actualización de la tabla, no hay precio en la primera columna de la primera fila. Si lo hay, el precio se introduce y se cambia, pero la tabla se redibuja constantemente, y ya no es posible trabajar con ella.

¿Qué debo hacer si necesito actualizar en tiempo real muchas filas de la tabla? (muchos símbolos, y para cada uno necesita mostrar el precio actual)

 
Artyom Trishkin:

Tol, con respecto a la pregunta anterior y el mensaje personal con un ejemplo de código sin panderetas: Tome su ejemplo de Experts\Article10\TestLibrary06.

En Program.mqh en el temporizador sólo tiene que escribir unas pocas líneas, compilar y ver.

...

Sin una fila con la actualización de la tabla, no hay precio en la primera columna de la primera fila. Si lo hay, el precio se introduce y se cambia, pero la tabla se redibuja constantemente, y ya no es posible trabajar con ella.

¿Qué debo hacer si necesito actualizar en tiempo real muchas filas de la tabla? (muchos símbolos, y para cada uno necesita mostrar el precio actual).

Tal vez (a primera vista), será necesario modificar ligeramente el método CTable::SetValue(), para que sea posible cambiar el valor de la celda especificada actualizando sólo esta celda (si está en el área visible), y no toda la tabla.

Le echaré un vistazo cuando termine de trabajar en el artículo actual.

P.D. Arreglaré también el parpadeo de la fila resaltada.

 
Anatoli Kazharski:

Quizás (a primera vista), necesite modificar un poco el método CTable::SetValue() para permitir cambiar el valor de una celda especificada y que sólo se actualice esa celda (si está en el área visible), no toda la tabla.

Le echaré un vistazo cuando termine de trabajar en el artículo actual.

P.D. Arreglaré también el parpadeo de la fila resaltada.

¿Hay alguna solución "rápida" que se pueda hacer "ahora mismo"?
 
Artyom Trishkin:
No hay una solución "rápida", ¿cuál es "ahora mismo"?

Para evitar que la fila seleccionada de la tabla parpadee, añade estas líneas al método CTable::UpdateTable() en el último bucle:

//--- 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++;
     }

//---

Y con el resto necesitas más detalles.

Artyom Trishkin:

Si actualizas la tabla cada vez que se recibe un nuevo tick, se hace imposible trabajar con la tabla - parpadea, la fila seleccionada parpadea , etc,etc,etc....

¿Qué es esto? :

  1. pr.
  2. pr.
  3. pr...
 
Anatoli Kazharski:

Para evitar que la fila resaltada parpadee, añada estas líneas al método CTable::UpdateTable() en el último bucle:

//--- 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++;
     }

//---

Y con el resto necesitas más detalles.

¿Qué es esto? :

  1. Ave.
  2. pr.
  3. pr--
Gracias por corregir el código, y sobre "pr, pr, pr, pr". - a lo mejor tenía prisa y lo escribí así ;) Veré cómo y qué será con las correcciones, luego informaré. Pero una cosa que ya puedo decir es que se actualiza toda la tabla, no sólo una fila, creo. Esto hace que a veces se note el parpadeo al actualizar toda la tabla, es uno de los "pr".
 
Anatoli Kazharski:

Para evitar que la fila resaltada parpadee, añada estas líneas al método CTable::UpdateTable() en el último bucle:

//--- 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++;
     }

No, no ha cambiado nada en el comportamiento - sigue parpadeando. Si el cursor del ratón está encima de la tabla, parpadea, si el cursor del ratón está fuera de la ventana, no hay selección de fila visible en absoluto.
 
Artyom Trishkin:
No, no ha cambiado nada en el comportamiento - sigue parpadeando. Si el cursor del ratón está por encima de la tabla, parpadea, si el cursor del ratón está fuera de la ventana, no hay selección de fila visible en absoluto.
Este no es el caso con mis cambios. La fila resaltada ya no parpadea en el ejemplo que sugeriste para probar.
 
Anatoli Kazharski:
No veo esto con los cambios que he hecho. La línea resaltada ya no parpadea en el ejemplo que sugeriste para probar.
Tol, echaré un vistazo a ese ejemplo - lo he revisado en mi programa, pero ahora tengo que salir corriendo. Cuando vuelva, te escribo.
 
Artyom Trishkin:
Tol, echaré un vistazo a ese ejemplo - lo he ojeado en mi programa, pero ahora tengo que salir corriendo. Cuando vuelva, te escribo.
De acuerdo. Continuemos después con el ejemplo con el que empezamos aquí. Complétalo hasta el nivel en el que empieza a aparecer el problema.