Discussão do artigo "Como criar um painel de informações para exibir dados em indicadores e Expert Advisors" - página 4

 
Denis Kirichenko #:
Move(int x, int y)

Há um erro em algum lugar. Você precisa imprimir (ou procurar no depurador, mas isso geralmente não funciona) os valores de coordenadas e tamanho.

Aqui está a lógica nos comentários:

   //--- Se a altura do painel não for maior que o tamanho da altura da janela
   if(!this.m_higher_wnd)
     {
      if(y+h>this.m_chart_h-2)
         y=this.m_chart_h-h-2;
      if(y<1)
         y=1;
     }
   //--- Se o painel de altura não estiver dentro do tamanho da janela de altura
   else
     {
      //--- Mantenha o painel abaixo da borda superior da janela com um espaço de 1 pixel
      if(y>1)
         y=1;
      //--- Evite que o painel caia abaixo da borda inferior da janela com um espaço de 1 pixel
      if(y<this.m_chart_h-h-2)
         y=this.m_chart_h-h-2;
     }
 
Denis Kirichenko #:
Ao tentar mover o painel depois de alterar o tamanho do gráfico, ele corrige constantemente as coordenadas e não permite que você mova a janela do painel livremente...

Provavelmente, o valor da variável this.m_higher_wnd não é relevante no método Move(). Esses valores são definidos no manipulador de eventos:

//+------------------------------------------------------------------+
//| Manipulador de eventos|
//+------------------------------------------------------------------+
void CDashboard::OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
//--- Se um objeto gráfico for criado
   if(id==CHARTEVENT_OBJECT_CREATE)
     {
      this.BringToTop();
      ::ObjectSetInteger(this.m_chart_id,sparam,OBJPROP_SELECTED,true);
     }
//--- Se a programação for alterada
   if(id==CHARTEVENT_CHART_CHANGE)
     {
      //--- Obtenha o número da subjanela do gráfico, se não for a janela principal (o número pode mudar ao excluir a janela de qualquer indicador)
      if(this.m_wnd!=0)
         this.m_wnd=this.GetSubWindow();
      //--- Obter as novas dimensões do gráfico
      int w=(int)::ChartGetInteger(this.m_chart_id,CHART_WIDTH_IN_PIXELS,this.m_wnd);
      int h=(int)::ChartGetInteger(this.m_chart_id,CHART_HEIGHT_IN_PIXELS,this.m_wnd);
      //--- Determinar se o tamanho do painel está fora da janela do gráfico
      this.m_higher_wnd=this.HigherWnd();
      this.m_wider_wnd=this.WiderWnd();
      //--- Se a altura do gráfico tiver mudado - ajuste a posição vertical do painel
      if(this.m_chart_h!=h)
        {
         this.m_chart_h=h;
         int y=this.m_y;
         if(this.m_y+this.m_h>h-1)
            y=h-this.m_h-1;
         if(y<1)
            y=1;
         this.Move(this.m_x,y);
        }
      //--- Se a largura do gráfico tiver mudado - ajuste a posição horizontal do painel
      if(this.m_chart_w!=w)
        {
         this.m_chart_w=w;
         int x=this.m_x;
         if(this.m_x+this.m_w>w-1)
            x=w-this.m_w-1;
         if(x<1)
            x=1;
         this.Move(x,this.m_y);
        }
     }

É bem possível que, em algum lugar aqui, os sinalizadores de tamanho excessivo não estejam definidos corretamente quando a janela do gráfico é expandida.

Se você escrever essas linhas

this.m_higher_wnd=this.HigherWnd();
this.m_wider_wnd=this.WiderWnd();

logo no início do método Move() - para forçar a definição dos valores corretos a cada movimento do mouse, o erro desaparecerá? Se isso acontecer, significa que o problema está nos valores dessas variáveis, e você precisa examinar o manipulador de eventos para ver por que elas não obtêm seus valores quando a janela é expandida. Bem, se tudo estiver normal lá, então você precisa imprimir o método Move() para encontrar o erro.

 

O erro desapareceu. Fiz essas alterações no método CDashboard::OnChartEvent():


//--- Se a programação for alterada
   if(id == CHARTEVENT_CHART_CHANGE)
     {
      //--- Obtenha o número da subjanela do gráfico, se não for a janela principal (o número pode mudar ao excluir a janela de qualquer indicador)
      if(m_wnd != 0)
         m_wnd = GetSubWindow();
      //
      long value;
      // redefinir o valor do erro
      ::ResetLastError();
      // obter o valor da propriedade
      if(!::ChartGetInteger(m_chart_id, CHART_BRING_TO_TOP, m_wnd, value))
        {
         //--- enviar a mensagem de erro para o registro "Experts".
         Print(__FUNCTION__ + ", Error Code = ", ::GetLastError());
         return;
        }
      // se não estiver exibindo o gráfico em cima de todos os outros - exit
      if(value == 0)
         return;
      //--- Obter as novas dimensões do gráfico
      int w = (int)::ChartGetInteger(m_chart_id, CHART_WIDTH_IN_PIXELS, m_wnd);
      int h = (int)::ChartGetInteger(m_chart_id, CHART_HEIGHT_IN_PIXELS, m_wnd);
      //--- Determinar se o tamanho do painel está fora da janela do gráfico
      //m_higher_wnd = HigherWnd();
      //m_wider_wnd = WiderWnd();
      //--- Se a altura do gráfico tiver mudado - ajuste a posição vertical do painel
      if(m_chart_h != h)
        {
         m_chart_h = h;
         m_higher_wnd = HigherWnd(); // adicionado
         int y = m_y;
         if(m_y + m_h > h - 1)
            y = h - m_h - 1;
         if(y < 1)
            y = 1;
         Move(m_x, y);
        }
      //--- Se a largura do gráfico tiver mudado - ajuste a posição horizontal do painel
      if(m_chart_w != w)
        {
         m_chart_w = w; 
         m_wider_wnd = WiderWnd(); // adicionado
         int x = m_x;
         if(m_x + m_w > w - 1)
            x = w - m_w - 1;
         if(x < 1)
            x = 1;
         Move(x, m_y);
        }
     }


Para não carregar constantemente o método CDashboard:: Move(), adicionei a verificação de sinalizadores de tamanho excessivo nos blocos em que a largura e a altura da janela do gráfico são alteradas diretamente.


 
Denis Kirichenko #:

O erro desapareceu. No método CDashboard::OnChartEvent(), fiz essas alterações:

Para não carregar constantemente o método CDashboard:: Move(), adicionei a verificação de sinalizadores de tamanho excessivo nos blocos em que a largura e a altura da janela do gráfico são alteradas diretamente.

Obrigado. Vou inseri-lo.