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)
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.
¿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....
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? :
Ave.
pr.
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".
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.
Para iniciar sesión y usar el sitio web MQL5.com es necesario permitir el uso de Сookies.
Por favor, active este ajuste en su navegador, de lo contrario, no podrá iniciar sesión.
Ha iniciado sesión. La autenticación de dos factores se ha desactivado. Vuelva a configurarla y escanee un nuevo código QR, o continúe con la autenticación de dos factores desactivada.
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.