Discussão do artigo "Interfaces Gráficas X: Gestão avançada de listas e tabelas. Otimização do código (build 7)" - página 7

 
Anatoli Kazharski:
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.

 
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)

 
Artyom Trishkin:

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.

 
Anatoli Kazharski:

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.....

O que é isso? :

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

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? :

  1. Ave.
  2. pr.
  3. 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".
 
Anatoli Kazharski:

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.