Anatoli Kazharski: Não há dados suficientes para reproduzir. Anexe um exemplo completo para que eu mesmo possa repeti-lo.
Tol, sobre a pergunta anterior e sobre a mensagem privada com um exemplo de código sem tamborins: Pegue seu exemplo de Experts\Article10\TestLibrary06.
Em Program.mqh, no timer, basta escrever algumas linhas, compilar e observar.
//+------------------------------------------------------------------+ //| Temporizador| //+------------------------------------------------------------------+ void CProgram::OnTimerEvent(void) { CWndEvents::OnTimerEvent(); //--- Pausa entre as atualizações de elementos if(m_counter1.CheckTimeCounter()) { //--- Atualizando o segundo item da barra de status m_status_bar.ValueToItem(1,::TimeToString(::TimeLocal(),TIME_DATE|TIME_SECONDS)); //--- Redesenhar o gráfico m_chart.Redraw(); } //--- Pausa entre as atualizações de elementos if(m_counter2.CheckTimeCounter()) { //--- Insira o valor do preço do símbolo atual no campo Price da primeira linha 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(); }
//--- Adicionar uma linha à tabela se o número total for menor que o especificado if(m_table.RowsTotal()<m_spin_edit1.GetValue()) m_table.AddRow(); //--- Adicionar uma coluna à tabela se o número total de colunas for menor que o número especificado. if(m_table.ColumnsTotal()<m_spin_edit2.GetValue()) m_table.AddColumn(); //--- Adicione um item à lista se o número total for menor que o número especificado. if(m_listview.ItemsTotal()<m_spin_edit5.GetValue()) { m_listview.AddItem("SYMBOL "+string(m_listview.ItemsTotal())); //--- Mova o controle deslizante da barra de rolagem para o final da lista m_listview.Scrolling(); } //--- Adicionar um item à lista das caixas de seleção se o número total for menor que o especificado if(m_checkbox_list.ItemsTotal()<m_spin_edit5.GetValue()) { m_checkbox_list.AddItem("Checkbox "+string(m_checkbox_list.ItemsTotal())); //--- Mova o controle deslizante da barra de rolagem para o final da lista m_checkbox_list.Scrolling(); } //--- Redesenhar o gráfico m_chart.Redraw(); } } //+------------------------------------------------------------------+
Sem uma linha com atualização de tabela, não há preço na primeira coluna da primeira linha. Se houver, o preço é inserido e alterado, mas a tabela é constantemente redesenhada, e não é mais possível trabalhar com ela.
O que devo fazer se precisar de atualização em tempo real de muitas linhas da tabela? (muitos símbolos, e para cada um deles você precisa exibir o preço atual)
Tol, com relação à pergunta anterior e à mensagem pessoal com um exemplo de código sem tamborins: Pegue seu exemplo de Experts\Article10\TestLibrary06.
Em Program.mqh no timer, basta escrever algumas linhas, compilar e observar.
...
Sem uma linha com atualização de tabela, não há preço na primeira coluna da primeira linha. Se houver, o preço é inserido e alterado, mas a tabela é constantemente redesenhada, e não é mais possível trabalhar com ela.
O que devo fazer se precisar de atualização em tempo real de muitas linhas da tabela? (muitos símbolos, e para cada um deles você precisa exibir o preço atual).
Talvez (à primeira vista) seja necessário modificar ligeiramente o método CTable::SetValue(), para que seja possível alterar o valor da célula especificada atualizando apenas essa célula (se ela estiver na área visível), e não toda a tabela.
Darei uma olhada quando terminar de trabalhar no artigo atual.
P.S. Também corrigirei a intermitência da linha destacada.
Talvez (à primeira vista), você precise modificar um pouco o método CTable::SetValue() para permitir que você altere o valor de uma célula específica com apenas essa célula atualizada (se estiver na área visível), e não a tabela inteira.
Vou dar uma olhada quando terminar de trabalhar no artigo atual.
P.S. Também corrigirei a intermitência da linha destacada.
Existe uma solução "rápida" que possa ser feita "agora mesmo"?
Artyom Trishkin: Não existe uma solução "rápida", qual é a solução "agora mesmo"?
Para evitar que a linha da tabela selecionada fique piscando, adicione estas linhas ao método CTable::UpdateTable() no último loop:
//--- Colunas for(uint c=l; c<m_visible_columns_total; c++) { //--- Obter a posição atual do controle deslizante da barra de rolagem vertical v=m_scrollv.CurrentPos()+t; //--- Linhas for(uint r=t; r<m_visible_rows_total; r++) { //--- Dados da tabela de deslocamento if(v>=t && v<m_rows_total && h>=l && h<m_columns_total) { //--- Ajuste para a linha destacada 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]; //--- Ajustar (1) valores, (2) cor de fundo, (3) cor do texto e (4) alinhamento do texto nas células SetCellParameters(c,r,m_vcolumns[h].m_vrows[v],back_color,text_color,m_vcolumns[h].m_text_align[v]); v++; } } //--- h++; }
//---
E para o resto, você precisa de mais detalhes.
Artyom Trishkin:
Se você atualizar a tabela toda vez que um novo tique for recebido, será impossível trabalhar com a tabela - ela pisca, a linha selecionada pisca , etc., etc., etc.....
Para evitar que a linha destacada fique piscando, adicione estas linhas ao método CTable::UpdateTable() no último loop:
//--- Colunas for(uint c=l; c<m_visible_columns_total; c++) { //--- Obter a posição atual do controle deslizante da barra de rolagem vertical v=m_scrollv.CurrentPos()+t; //--- Linhas for(uint r=t; r<m_visible_rows_total; r++) { //--- Dados da tabela de deslocamento if(v>=t && v<m_rows_total && h>=l && h<m_columns_total) { //--- Ajuste para a linha destacada 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]; //--- Ajustar (1) valores, (2) cor de fundo, (3) cor do texto e (4) alinhamento do texto nas células SetCellParameters(c,r,m_vcolumns[h].m_vrows[v],back_color,text_color,m_vcolumns[h].m_text_align[v]); v++; } } //--- h++; }
//---
E para o resto, você precisa de mais detalhes.
O que é isso? :
Ave.
pr.
pr--
Obrigado por corrigir o código e sobre "pr, pr, pr, pr, pr". - talvez eu estivesse com pressa para escrever dessa forma ;) Verei como e o que acontecerá com as correções e depois informarei. Mas uma coisa que já posso dizer é que a tabela inteira é atualizada, e não apenas uma linha, eu acho. Isso faz com que, às vezes, haja uma intermitência perceptível ao atualizar a tabela inteira - esse é um dos "pr".
Para evitar que a linha destacada fique piscando, adicione essas linhas ao método CTable::UpdateTable() no último loop:
//--- Colunas for(uint c=l; c<m_visible_columns_total; c++) { //--- Obter a posição atual do controle deslizante da barra de rolagem vertical v=m_scrollv.CurrentPos()+t; //--- Linhas for(uint r=t; r<m_visible_rows_total; r++) { //--- Dados da tabela de deslocamento if(v>=t && v<m_rows_total && h>=l && h<m_columns_total) { //--- Ajuste para a linha destacada 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]; //--- Ajustar (1) valores, (2) cor de fundo, (3) cor do texto e (4) alinhamento do texto nas células SetCellParameters(c,r,m_vcolumns[h].m_vrows[v],back_color,text_color,m_vcolumns[h].m_text_align[v]); v++; } } //--- h++; }
Não, nada mudou no comportamento - ela ainda pisca. Se o cursor do mouse estiver acima da tabela, ela pisca; se o cursor do mouse estiver fora da janela, não há seleção de linha visível.
Artyom Trishkin: Não, nada mudou no comportamento - ele ainda pisca. Se o cursor do mouse estiver acima da tabela, ele pisca; se o cursor do mouse estiver fora da janela, não há seleção de linha visível.
Esse não é o caso com minhas alterações. A linha destacada não pisca mais no exemplo que você sugeriu para testar.
Anatoli Kazharski: Não estou vendo isso com as alterações que fiz. A linha destacada não pisca mais no exemplo que você sugeriu para testar.
Tol, vou dar uma olhada nesse exemplo - já dei uma olhada nele no meu programa, mas agora tenho que sair correndo. Quando eu voltar, lhe escrevo de volta.
Artyom Trishkin: Tol, vou dar uma olhada nesse exemplo - dei uma olhada nele no meu programa, mas agora tenho que sair correndo. Quando eu voltar, eu lhe escrevo de volta.
Ótimo. Vamos continuar mais tarde com o exemplo que começamos aqui. Complete-o até o nível em que o problema começa a aparecer.
Não há dados suficientes para reproduzir. Dê-me um exemplo completo para que eu mesmo possa reproduzi-lo.
Em uma mensagem privada, então - você precisa de classes adicionais.
Sim, isso acontece após a reconstrução da tabela.
Não há dados suficientes para reproduzir. Anexe um exemplo completo para que eu mesmo possa repeti-lo.
Tol, sobre a pergunta anterior e sobre a mensagem privada com um exemplo de código sem tamborins: Pegue seu exemplo de Experts\Article10\TestLibrary06.
Em Program.mqh, no timer, basta escrever algumas linhas, compilar e observar.
//| Temporizador|
//+------------------------------------------------------------------+
void CProgram::OnTimerEvent(void)
{
CWndEvents::OnTimerEvent();
//--- Pausa entre as atualizações de elementos
if(m_counter1.CheckTimeCounter())
{
//--- Atualizando o segundo item da barra de status
m_status_bar.ValueToItem(1,::TimeToString(::TimeLocal(),TIME_DATE|TIME_SECONDS));
//--- Redesenhar o gráfico
m_chart.Redraw();
}
//--- Pausa entre as atualizações de elementos
if(m_counter2.CheckTimeCounter())
{
//--- Insira o valor do preço do símbolo atual no campo Price da primeira linha
MqlTick tick;
if(SymbolInfoTick(Symbol(),tick))
//--- Adicionar uma linha à tabela se o número total for menor que o 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();
//--- Adicionar uma coluna à tabela se o número total de colunas for menor que o número especificado.
if(m_table.ColumnsTotal()<m_spin_edit2.GetValue())
m_table.AddColumn();
//--- Adicione um item à lista se o número total for menor que o número especificado.
if(m_listview.ItemsTotal()<m_spin_edit5.GetValue())
{
m_listview.AddItem("SYMBOL "+string(m_listview.ItemsTotal()));
//--- Mova o controle deslizante da barra de rolagem para o final da lista
m_listview.Scrolling();
}
//--- Adicionar um item à lista das caixas de seleção se o número total for menor que o especificado
if(m_checkbox_list.ItemsTotal()<m_spin_edit5.GetValue())
{
m_checkbox_list.AddItem("Checkbox "+string(m_checkbox_list.ItemsTotal()));
//--- Mova o controle deslizante da barra de rolagem para o final da lista
m_checkbox_list.Scrolling();
}
//--- Redesenhar o gráfico
m_chart.Redraw();
}
}
//+------------------------------------------------------------------+
Sem uma linha com atualização de tabela, não há preço na primeira coluna da primeira linha. Se houver, o preço é inserido e alterado, mas a tabela é constantemente redesenhada, e não é mais possível trabalhar com ela.
O que devo fazer se precisar de atualização em tempo real de muitas linhas da tabela? (muitos símbolos, e para cada um deles você precisa exibir o preço atual)
Tol, com relação à pergunta anterior e à mensagem pessoal com um exemplo de código sem tamborins: Pegue seu exemplo de Experts\Article10\TestLibrary06.
Em Program.mqh no timer, basta escrever algumas linhas, compilar e observar.
Sem uma linha com atualização de tabela, não há preço na primeira coluna da primeira linha. Se houver, o preço é inserido e alterado, mas a tabela é constantemente redesenhada, e não é mais possível trabalhar com ela.
O que devo fazer se precisar de atualização em tempo real de muitas linhas da tabela? (muitos símbolos, e para cada um deles você precisa exibir o preço atual).
Talvez (à primeira vista) seja necessário modificar ligeiramente o método CTable::SetValue(), para que seja possível alterar o valor da célula especificada atualizando apenas essa célula (se ela estiver na área visível), e não toda a tabela.
Darei uma olhada quando terminar de trabalhar no artigo atual.
P.S. Também corrigirei a intermitência da linha destacada.
Talvez (à primeira vista), você precise modificar um pouco o método CTable::SetValue() para permitir que você altere o valor de uma célula específica com apenas essa célula atualizada (se estiver na área visível), e não a tabela inteira.
Vou dar uma olhada quando terminar de trabalhar no artigo atual.
P.S. Também corrigirei a intermitência da linha destacada.
Não existe uma solução "rápida", qual é a solução "agora mesmo"?
Para evitar que a linha da tabela selecionada fique piscando, adicione estas linhas ao método CTable::UpdateTable() no último loop:
for(uint c=l; c<m_visible_columns_total; c++)
{
//--- Obter a posição atual do controle deslizante da barra de rolagem vertical
v=m_scrollv.CurrentPos()+t;
//--- Linhas
for(uint r=t; r<m_visible_rows_total; r++)
{
//--- Dados da tabela de deslocamento
if(v>=t && v<m_rows_total && h>=l && h<m_columns_total)
{
//--- Ajuste para a linha destacada
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];
//--- Ajustar (1) valores, (2) cor de fundo, (3) cor do texto e (4) alinhamento do texto nas células
SetCellParameters(c,r,m_vcolumns[h].m_vrows[v],back_color,text_color,m_vcolumns[h].m_text_align[v]);
v++;
}
}
//---
h++;
}
//---
E para o resto, você precisa de mais detalhes.
Se você atualizar a tabela toda vez que um novo tique for recebido, será impossível trabalhar com a tabela - ela pisca, a linha selecionada pisca , etc., etc., etc.....
O que é isso? :
Para evitar que a linha destacada fique piscando, adicione estas linhas ao método CTable::UpdateTable() no último loop:
for(uint c=l; c<m_visible_columns_total; c++)
{
//--- Obter a posição atual do controle deslizante da barra de rolagem vertical
v=m_scrollv.CurrentPos()+t;
//--- Linhas
for(uint r=t; r<m_visible_rows_total; r++)
{
//--- Dados da tabela de deslocamento
if(v>=t && v<m_rows_total && h>=l && h<m_columns_total)
{
//--- Ajuste para a linha destacada
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];
//--- Ajustar (1) valores, (2) cor de fundo, (3) cor do texto e (4) alinhamento do texto nas células
SetCellParameters(c,r,m_vcolumns[h].m_vrows[v],back_color,text_color,m_vcolumns[h].m_text_align[v]);
v++;
}
}
//---
h++;
}
//---
E para o resto, você precisa de mais detalhes.
O que é isso? :
Para evitar que a linha destacada fique piscando, adicione essas linhas ao método CTable::UpdateTable() no último loop:
for(uint c=l; c<m_visible_columns_total; c++)
{
//--- Obter a posição atual do controle deslizante da barra de rolagem vertical
v=m_scrollv.CurrentPos()+t;
//--- Linhas
for(uint r=t; r<m_visible_rows_total; r++)
{
//--- Dados da tabela de deslocamento
if(v>=t && v<m_rows_total && h>=l && h<m_columns_total)
{
//--- Ajuste para a linha destacada
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];
//--- Ajustar (1) valores, (2) cor de fundo, (3) cor do texto e (4) alinhamento do texto nas células
SetCellParameters(c,r,m_vcolumns[h].m_vrows[v],back_color,text_color,m_vcolumns[h].m_text_align[v]);
v++;
}
}
//---
h++;
}
Não, nada mudou no comportamento - ele ainda pisca. Se o cursor do mouse estiver acima da tabela, ele pisca; se o cursor do mouse estiver fora da janela, não há seleção de linha visível.
Não estou vendo isso com as alterações que fiz. A linha destacada não pisca mais no exemplo que você sugeriu para testar.
Tol, vou dar uma olhada nesse exemplo - dei uma olhada nele no meu programa, mas agora tenho que sair correndo. Quando eu voltar, eu lhe escrevo de volta.