Discussão do artigo "Interfaces gráficas XI: Integração da Biblioteca Gráfica Padrão (build 16)" - página 7

 

Reproduzi o problema. Tenho que redimensionar o painel quando o controle deslizante está na parte superior do painel. Depois disso, o controle deslizante e todos os elementos do painel ficam suspensos.

[Excluído]  

Olá

Alguém encontrou a causa da falha na postagem acima?

Recebo o erro"matriz fora do intervalo em 'WndEvents.mqh' (287,72)"

 
Спартак Угланов:

Olá

Alguém encontrou a causa da falha na postagem acima?

Recebo o erro "matriz fora do intervalo em 'WndEvents.mqh' (287,72)"

Coloco uma verificação de fora do intervalo lá e é isso.

[Excluído]  
Konstantin:

basta colocar uma verificação de ultrapassagem e pronto.

É uma ideia interessante, mas como?


      int available_elements_total=CWndContainer::AvailableElementsTotal(m_active_window_index);
      int ass = ArraySize(m_wnd[m_active_window_index].m_available_elements);
      Print("ass = ",ass," available_elements_total = ",available_elements_total);
      for(int e=0; e<available_elements_total; e++)
        {
         CElement *el=m_wnd[m_active_window_index].m_available_elements[e];


Com 12 elementos, teoricamente não deveria haver nenhum fora do intervalo.

(Exemplo do TradePanelTest da série de artigos)

 
Спартак Угланов:

É uma ideia interessante, mas como?



Com 12 elementos, teoricamente não deve haver nenhum fora de alcance.

(Exemplo de TradePanelTest da série de artigos)

Bem, se houver um erro, isso significa que há um erro. Execute-o com um depurador, pois é a maneira mais segura de ver o que está acontecendo.

[Excluído]  
Konstantin:

Bem, se o erro estiver presente, significa que ele está lá. Execute-o com um depurador, pois essa é a maneira mais segura de ver o que está acontecendo.

Movi o projeto para uma pasta com um nome diferente e renomeei o arquivo do indicador, e ele funciona sem erros.

Eu nasci na segunda-feira :O)

 
Anatoli Kazharski:


 

Em compilações recentes, adicionamos uma mensagem ao compilador para os casos em que um método ancestral é sobrecarregado em um descendente:

deprecated behavior, hidden method calling will be disabled in a future MQL compiler version    

Exemplo

struct SFoo
  {
   static void func(int)
     {
      Print(__FUNCSIG__);
     }
  };
 
struct SBar : SFoo
  {
   static void func(double)
     {
      Print(__FUNCSIG__);
     }     
  };

void OnStart()
  {
   SBar::func(_Digits);       // !!! será chamado de SFoo::func(int) - é mais apropriado.
  }

Nesse caso, a função func(int) do ancestral SFoo é chamada na classe descendente SBar, porque o compilador não a encontrou no descendente. O descendente tem apenas a função func(double), e o compilador tenta encontrar uma função com um parâmetro adequado na árvore de herança.

Ou seja, o compilador MQL5 executa a sobrecarga em vez de substituir o método no descendente. No início do desenvolvimento da linguagem, esse relaxamento do compilador MQL5 não foi considerado crítico. Mas ele pode ser alterado no futuro, então agora há um aviso explícito para que os desenvolvedores de programas MQL5 levem em conta e corrijam seus códigos.

Estritamente falando, a substituição é um conceito um pouco mais amplo, você pode pesquisar a diferença entre sobrecarga e substituição na Internet
.

 
MetaQuotes Software Corp.:

Não estou entendendo nada, mas é muito interessante! O compilador xinga várias funções, aqui está uma delas, onde ele não gosta?

//+------------------------------------------------------------------+
//| A disponibilidade do elemento|
//+------------------------------------------------------------------+
void CElement::IsAvailable(const bool state)
  {
//--- Sair se já estiver definido
   if(state==CElementBase::IsAvailable())
      return;
//--- Conjunto
   CElementBase::IsAvailable(state);
//--- Outros elementos
   int elements_total=ElementsTotal();
   for(int i=0; i<elements_total; i++)
      m_elements[i].IsAvailable(state);
//--- Definir prioridades para cliques no botão esquerdo do mouse
   if(state)
      SetZorders();
   else
      ResetZorders();
  }
 
Pavel Kolchin:

Não estou entendendo nada, mas é muito interessante! O compilador xinga várias funções, aqui está uma delas, onde ele não gosta?

Porque há também

bool              IsAvailable(void)                         const { return(m_is_available);               }


Tentei alterá-la para

   virtual void      Set Available(const bool state)                  { m_is_available=state;                 }
   bool              IsAvailable(void)                         const { return(m_is_available);               }

está tudo bem )

E o mesmo terá de ser feito com as outras)