Discussão do artigo "Interfaces gráficas X: Atualizações para a Biblioteca Easy And Fast (Build 2)" - página 2

 
Alexey Oreshkin:

Talvez meu código tenha sido excluído e não sei dizer com certeza agora.

...

Interfaces gráficas I: Preparando a estrutura da biblioteca (Capítulo 1) >>>

Observe os dois pontos duplos na frente das funções na listagem de código acima. Na verdade, você pode deixá-los de fora e tudo funcionará corretamente. Mas, em programação, é considerado uma boa prática colocar dois pontos duplos antes das funções de sistema de uma linguagem. Isso deixa claro que a função é uma função de sistema.

Alexey Oreshkin:

O erro ocorre quando fecho uma janela criada pelo indicador com uma cruz. Alterei ligeiramente o arquivo MainWindow.mqh do exemplo localizado aqui: Indicators\Article 10\SeparateWindow.

Excluirei o erro com uma verificação adicional. A correção estará na próxima atualização. A repetição falhou. Que alterações foram feitas no arquivo MainWindow.mqh?

Alexey Oreshkin:

E também não entendo como excluir uma linha na tabela criada?

Por enquanto, não há como. Isso será feito nas próximas versões da biblioteca. Será possível adicionar e excluir linhas em tabelas e listas.

 

Devo ter excluído algo desnecessário. Anexei os arquivos.

p.s. Posso definir uma largura diferente para cada coluna da tabela?

Arquivos anexados:
 
Alexey Oreshkin:

Devo ter excluído algo desnecessário. Anexei os arquivos.

p.s. Posso definir uma largura diferente para cada coluna da tabela?

O motivo foi que você adicionou um objeto da mesma tabela à base do elemento duas vezes. Primeiro no método de criação de tabela CProgram::CreateTable(), onde isso deve ser feito, e depois no método CProgram::ModifyTable(). Exclua a linha destacada em vermelho na listagem de código abaixo.

//+------------------------------------------------------------------+
//|| Cria a tabela Symbol|
//+------------------------------------------------------------------+
bool CProgram::ModifyTable(int id)
  {
   int r=1;
   switch(id){
      case  0:         
         for(int c=0;c<COLUMNS2_TOTAL;c++)
         for(r=1;r<ROWS2_TOTAL;r++)
            m_table.SetValue(c,r,"rb1 "+(string)c+" "+(string)r);                                  
      break;
      
      case 1:
         for(int c=0;c<COLUMNS2_TOTAL;c++)
         for(r=1;r<ROWS2_TOTAL-5;r++)
            m_table.SetValue(c,r,"rb2 "+(string)c+" "+(string)r);  
      break;
      case 3:
         for(int c=0;c<COLUMNS2_TOTAL;c++)
         for(r=1;r<ROWS2_TOTAL-10;r++)
            m_table.SetValue(c,r,"rb3 "+(string)c+" "+(string)r);                                      
      break;
   }
      for(int c=0;c<COLUMNS2_TOTAL;c++)
      for(int rr=r;rr<ROWS2_TOTAL;rr++) m_table.SetValue(c,rr,"");

//--- Atualize a tabela para mostrar as alterações
   m_table.UpdateTable();
//--- Adicione o objeto à matriz comum de grupos de objetos
   CWndContainer::AddToElementsArray(0,m_table);
   return(true);
  }  

//---

Ao excluir o programa do gráfico ou recarregá-lo, por exemplo, ao alterar o período de tempo ou o símbolo, foi feita uma segunda tentativa de excluir um item que já havia sido excluído anteriormente. Ao excluir um objeto de tabela, as matrizes eram liberadas e isso causava um erro ao chamar o método de exclusão de um item novamente.

Alexey Oreshkin:

p.s. Posso definir uma largura diferente para cada coluna da tabela?

Não nesse tipo de tabela(CTable). Você pode definir a largura das colunas somente em tabelas do tipo CCanvasTable. Mas nesse tipo de tabela, no momento, há muitas outras restrições, que provavelmente não serão adequadas para você. As possibilidades das tabelas do tipo CCanvasTable serão ampliadas.

 
Anatoli Kazharski:

O motivo foi que você adicionou o mesmo objeto de tabela à base do elemento duas vezes. Primeiro no método CProgram::CreateTable(), onde isso deveria ser feito, e depois no método CProgram::ModifyTable(). Exclua a linha destacada em vermelho na listagem de código abaixo.

Ah, sim, é bobagem, não notei isso porque copiei meu método ModifyTable do CreateTable.
Vou tentar o CCanvasTable, talvez funcione.
Obrigado!

p.s: Se eu não puder excluir linhas na tabela, posso excluir a tabela inteira e criá-la novamente, a que eu preciso. Também não encontrei nenhum método de exclusão. Ainda não posso excluir a tabela?

p.s2: Como não posso criar colunas de largura diferente na tabela, é lógico colocar duas tabelas uma ao lado da outra, mas, pelo que entendi, não posso fazer isso porque a tabela se expande automaticamente para a borda direita. Há um método AutoXResizeMode, mas ele ainda não funciona... Quando é definido como false, não ocorre nenhuma alteração.

 
Alexey Oreshkin:

...

p.s: Se eu não puder excluir linhas em uma tabela, posso excluir a tabela inteira e criá-la novamente, a que eu preciso. Também não encontrei nenhum método de exclusão. Ainda não posso excluir a tabela?

Agora, todos os elementos da GUI são criados de uma só vez e você pode controlar a visibilidade deles usando os métodos Show() e Hide().

Alexey Oreshkin:

p.s2: Como não posso criar colunas de tabela com larguras diferentes, é lógico colocar duas tabelas uma ao lado da outra, mas, como percebi, não posso fazer isso porque a tabela se expande automaticamente para a borda direita. Há um método AutoXResizeMode, mas ele ainda não funciona... Quando é definido como false, não ocorre nenhuma alteração.

Use o método XSize() para definir a largura da tabela.

Exemplo:

m_table.XSize(300);
 

Obrigado pelas respostas.

Há mais algumas perguntas:

1) Se os dados não couberem em uma célula da tabela, há planos para criar uma dica de ferramenta ou um ticker nessa célula no futuro?

2) É possível desativar a rolagem horizontal em algumas tabelas?

p.s:

O erro ocorre quando criamos uma tabela com 5 colunas, mas tentamos exibir mais. A opção é boba, eu concordo, mas é necessária. Especialmente se as tabelas puderem se tornar dinâmicas no futuro.

p.s2: Os métodos Show e Hide funcionam perfeitamente bem e permitem não alterar a tabela em tempo real, mas mostrar a que é necessária. Em cada guia, criei tabelas necessárias que estão vinculadas a botões de opção e, quando são ativadas, a tabela necessária é mostrada e as que não são, ficam ocultas. Tudo funciona aqui. Mas, por algum motivo, não consigo ocultar tabelas irrelevantes imediatamente após sua criação. Por causa disso, acho que as barras de rolagem não funcionam corretamente, mas assim que você clica uma vez no botão de opção e tudo o que é desnecessário é ocultado, tudo começa a funcionar bem.

 
Alexey Oreshkin:

1) Se os dados não couberem em uma célula da tabela, há planos de criar uma dica de ferramenta ou um ticker nessa célula no futuro?

Adicionado à lista de atualizações futuras. Criarei um modo de dicas de ferramentas em tabelas.

Alexey Oreshkin:

2) É possível desativar a rolagem horizontal em algumas tabelas?

As barras de rolagem aparecem quando a parte visível da tabela é menor do que a parte total.

Alexey Oreshkin:

O erro ocorre quando criamos uma tabela com 5 colunas e tentamos exibir mais. Concordo que a opção é boba, mas precisamos de uma verificação. Especialmente se as tabelas puderem se tornar dinâmicas no futuro.

Fiz as correções. Estarão disponíveis na próxima atualização.

Alexey Oreshkin:

p.s2: Os métodos Show e Hide funcionam perfeitamente bem e permitem que você não altere a tabela na hora, mas mostre a que precisa. Em cada guia, criei as tabelas necessárias que estão vinculadas a botões de rádio e, quando ativadas, a tabela necessária é mostrada, e as que não são, ficam ocultas. Tudo funciona aqui. Mas, por algum motivo, não consigo ocultar tabelas irrelevantes imediatamente após sua criação. Por causa disso, acho que as barras de rolagem não funcionam corretamente, mas assim que você clica uma vez no botão de opção e tudo o que é desnecessário é ocultado, tudo começa a funcionar bem.

Oculte-as depois que os elementos da guia forem atualizados:

//--- Exibir itens da guia ativa
   m_tabs.ShowTabElements();
//--- Ocultar tabelas
...

Se isso não funcionar, envie-me seu código e eu darei uma olhada.

 
Parece que estou fazendo algo errado ou o problema é de outra forma, mas tenho alguns problemas com as barras de rolagem.
Na inicialização, elas quase não funcionam, mas se eu usar os botões de opção para atualizá-las, tudo começa a funcionar normalmente. Ao alternar para uma nova guia, o mesmo problema ocorre até que eu clique no botão de opção.
Enviei o arquivo para PM.
 
Alexey Oreshkin:
Parece que estou fazendo algo errado ou o problema é de outra forma, mas tenho alguns problemas com as barras de rolagem.
Na inicialização, elas quase não funcionam, mas se eu usar os botões de opção para atualizá-las, tudo começa a funcionar normalmente. Ao alternar para uma nova guia, o mesmo problema ocorre até que eu clique no botão de opção.
Enviei o arquivo para a PM.

Dei uma olhada em seus arquivos. O problema está claro. Há um conflito entre as barras de rolagem, que estão localizadas uma acima da outra em tabelas visíveis. O problema é que, quando você alterna as guias, todos os itens atribuídos à guia atualmente selecionada tornam-se visíveis. Como você tem todas as tabelas uma acima da outra, você simplesmente não as viu. Observe a captura de tela abaixo. Alterei as coordenadas de duas tabelas dessa guia para maior clareza:

//---

Precisamos de um evento que nos informe que houve uma mudança de guia. Então, em um manipulador de classe personalizado, ele pode ser recebido e as ações necessárias podem ser tomadas. No seu caso, você poderia obter o índice do botão de opção selecionado e mostrar a tabela associada a ele e ocultar as outras.

No momento, esse evento não é gerado ao alternar entre as guias. Ele estará disponível na próxima atualização da biblioteca.

 
E quando esperar pela atualização?