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
Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
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.
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))
//--- Añade una fila a la tabla si el número total es menor que el especificado{
int dg=(int)SymbolInfoInteger(Symbol(),SYMBOL_DIGITS);
m_table.SetValue(1,1,DoubleToString(tick.bid,dg),dg);
m_table.UpdateTable();
}
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)
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.
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.
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:
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.
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? :
Para evitar que la fila resaltada parpadee, añada estas líneas al método CTable::UpdateTable() en el último bucle:
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? :
Para evitar que la fila resaltada parpadee, añada estas líneas al método CTable::UpdateTable() en el último bucle:
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á 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.
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 ojeado en mi programa, pero ahora tengo que salir corriendo. Cuando vuelva, te escribo.