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
Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
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.