Discussão do artigo "Interfaces Gráficas IV: O Modo Multi-Janela e o Sistema de Prioridades (Capítulo 2)"

 

Novo artigo Interfaces Gráficas IV: O Modo Multi-Janela e o Sistema de Prioridades (Capítulo 2) foi publicado:

Neste capítulo, nós vamos estender a implementação da biblioteca para possibilitar a criação de interfaces de multi-janela para as aplicações MQL. Nós também vamos desenvolver um sistema de prioridades para clique esquerdo do mouse sobre os objetos gráficos. Isso se faz necessário para evitar problemas quando os elementos não respondem as ações do usuário.

O resultado desejado é mostrado na imagem abaixo. Por favor, note os pontos suspensos no nomes dos botões «Icon Button 1...» e «Icon Button 6...». Esta é uma forma habitual de deixar o usuário saber que ao pressionar este elemento, irá abrir uma janela de diálogo.

Fig. 1. Teste do modo multi-janela.

Fig. 1. Teste do modo multi-janela.

Autor: Anatoli Kazharski

 

Anatoly, notei um bug - decidi dar uma olhada nos exemplos e imediatamente vi que, se a janela for pressionada até a borda direita e as dicas de ferramentas estiverem ativadas, essas dicas de ferramentas vão além da borda direita da tela. Você poderia corrigir a coordenada x quando a dica de ferramenta sair da tela?

E outra sugestão: nos menus, nos itens de menu com submenus suspensos (não sei como chamá-los corretamente), naqueles em que há uma seta para a direita indicando que outro item será aberto, acho que é melhor fazer a abertura ao passar o cursor sobre esse item de menu (como no Windows). Ou então, fazer disso um parâmetro: ou um novo item é aberto ao passar o mouse ou ao clicar (como é agora).

 
Artyom Trishkin:

Anatoly, notei um bug - decidi dar uma olhada nos exemplos e imediatamente vi que, se a janela for pressionada até a borda direita e as dicas de ferramentas estiverem ativadas, essas dicas de ferramentas vão além da borda direita da tela. Você poderia corrigir a coordenada x quando a dica de ferramenta sair da tela?

E outra sugestão: nos menus, nos itens de menu com submenus suspensos (não sei como chamá-los corretamente), naqueles em que há uma seta para a direita indicando que outro item será aberto, acho que é melhor fazer a abertura ao passar o cursor sobre esse item de menu (como no Windows). Ou fazer disso um parâmetro: ou um novo item é aberto ao passar o mouse ou ao clicar (como é agora).

Nós faremos isso. Faremos correções e aprimoramentos depois que a primeira versão da biblioteca for totalmente publicada. Precisamos corrigir o resultado atual.

Em seguida, faremos uma lista do que precisa ser feito, definiremos as prioridades e poderemos tentar publicar um artigo separado.

 

Obrigado pela excelente série de artigos. Gostei de ler os códigos MQL4. Program.mqh apresenta os dois erros a seguir:

//error#1: array fora do intervalo em 'Program.mqh' (753,32)

/Corrigido alterando as linhas 742-746
   string text[2]=
     {
      "\"Icon button\" (1) control",
      "Opens the dialog box (2)."
     };

//error#2: matriz fora do intervalo em 'Program.mqh' (1012,32)

/Corrigido com a alteração das linhas 1000-1005
   string text[3]=
     {
      "\"Icon button\" (5) control",
      "This is the second line of the tooltip.",
      "This is the third line of the tooltip."
     };
 
Kaleem Haider:

Obrigado pela excelente série de artigos. Gostei de ler os códigos MQL4. Program.mqh apresenta os dois erros a seguir:

Obrigado.

Em minha versão, não há esses erros.

742-746:

//+------------------------------------------------------------------+
//| Dica de ferramenta 1|
//+------------------------------------------------------------------+
bool CProgram::CreateTooltip1(void)
  {
#define  TOOLTIP1_LINES_TOTAL 2
//--- 
   m_tooltip1.WindowPointer(m_window1);
   m_tooltip1.ElementPointer(m_icon_button1);
//--- 
   string text[]=
     {
      "Line 1",
      "Line 2"
     };
//--- 
   m_tooltip1.Header("Icon Button 1");
   m_tooltip1.XSize(250);
   m_tooltip1.YSize(70);
//--- 
   for(int i=0; i<TOOLTIP1_LINES_TOTAL; i++)
      m_tooltip1.AddString(text[i]);
//--- 
   if(!m_tooltip1.CreateTooltip(m_chart_id,m_subwin))
      return(false);
//--- 
   CWndContainer::AddToElementsArray(0,m_tooltip1);
   return(true);
  }

//---

1000-1005:

//+------------------------------------------------------------------+
//| Dica de ferramenta 5|
//+------------------------------------------------------------------+
bool CProgram::CreateTooltip5(void)
  {
#define  TOOLTIP5_LINES_TOTAL 3
//--- 
   m_tooltip5.WindowPointer(m_window1);
   m_tooltip5.ElementPointer(m_icon_button5);
//--- 
   string text[]=
     {
      "Line 1",
      "Line 2",
      "Line 3"
     };
//--- 
   m_tooltip5.Header("Icon Button 5");
   m_tooltip5.XSize(250);
   m_tooltip5.YSize(80);
//--- 
   for(int i=0; i<TOOLTIP5_LINES_TOTAL; i++)
      m_tooltip5.AddString(text[i]);
//--- 
   if(!m_tooltip5.CreateTooltip(m_chart_id,m_subwin))
      return(false);
//--- 
   CWndContainer::AddToElementsArray(0,m_tooltip5);
   return(true);
  }
 
Anatoli Kazharski:

Obrigado.

Em minha versão, não há esses erros.

742-746:

//---

1000-1005:

Os erros estão na seção de download do artigo. Talvez ela não tenha sido atualizada.
 

Parece que Kaleem usa uma versão de plataforma ligeiramente desatualizada.

Mas, por uma questão de clareza e para tornar menos propenso a erros, o código-fonte deve ser alterado para definir as matrizes com tamanhos explícitos como text[TOOLTIP1_LINES_TOTAL] e text[TOOLTIP5_LINES_TOTAL]. Caso contrário, você poderá receber erros fora dos limites no futuro se as matrizes mudarem, mas as definições não mudarem por omissão.

 
Kaleem Haider:
Os erros estão na seção de download de artigos. Talvez ela não tenha sido atualizada.

Verificado.

Sim, a versão em inglês tem esses erros. Parece que os editores que estavam trabalhando na tradução para o inglês excluíram acidentalmente os elementos delimitadores (,) das matrizes.

 
Stanislav Korotky:

Parece que Kaleem usa uma versão de plataforma ligeiramente desatualizada.

Mas, por uma questão de clareza e para tornar menos propenso a erros, o código-fonte deve ser alterado para definir as matrizes com tamanhos explícitos como text[TOOLTIP1_LINES_TOTAL] e text[TOOLTIP5_LINES_TOTAL]. Caso contrário, você poderá receber um erro fora dos limites no futuro se as matrizes mudarem, mas as definições não mudarem por omissão.

Estou usando a versão 4 do MetaTrader 4: 4.00 Build 950. Essa não é a versão mais recente?
 
Kaleem Haider:
Estou usando a versão 4 do MetaTrader 4: 4.00 Build 950. Essa não é a versão mais recente?
960 parece ser a versão mais recente.
 

Anatoly, é possível abrir duas janelas a partir do painel principal de modo que todas as três janelas permaneçam ativas?

Ou seja: temos um painel principal, ele tem botões para abrir dois painéis adicionais, cada um desses painéis adicionais tem seu próprio conjunto de botões e outras coisas.

Pressione o botão1 no painel principal - o painel1 é aberto. Os botões no painel principal permanecem ativos e no painel1 eles também estão ativos.

Pressione o botão2 no painel principal quando o painel1 já estiver aberto - o painel2 é aberto. Todos os botões do painel principal, do painel1 e do painel2 permanecem ativos.

Isso permitirá ter uma interface com painéis ativos móveis, cada um dos quais executando suas próprias funções.

Agora é possível ter apenas um painel ativo por vez.