Discussão do artigo "Interfaces gráficas X: Seleção de texto na caixa de texto multilinha (build 13)" - página 5

 
Anatoli Kazharski:

Sim, mas há um problema: quando usado por um longo período, um erro aparece sem motivo; a exclusão da subjanela do EA faz com que o EA seja excluído.

img

 
Pavel Kolchin:

Sim, mas há um problema: quando usado por um longo período, aparece um erro sem motivo, a exclusão da subjanela do EA leva à exclusão do EA

No arquivo Defines.mqh, defina o parâmetro EXPERT_IN_SUBWINDOW como false:

//+------------------------------------------------------------------+
//|Define.mqh |
//| Copyright 2015, MetaQuotes Software Corp.
//|http://www.mql5.com
//+------------------------------------------------------------------+
//--- Especialista em modo janela
#define  EXPERT_IN_SUBWINDOW false

//---

Para Expert Advisors cuja interface gráfica está localizada na janela principal do gráfico, o valor desse parâmetro deve ser false.

 
Anatoli Kazharski:

No arquivo Defines.mqh, defina o parâmetro EXPERT_IN_SUBWINDOW como false:


está claro que há uma função que funciona, funciona, funciona, funciona, funciona (vários dias) e, em seguida, pega e falha.


//+------------------------------------------------------------------+
//| Verificação e atualização do número da janela do Expert Advisor
//+------------------------------------------------------------------+
void CWndEvents::CheckExpertSubwindowNumber(void)
  {
//--- Sair se não for um especialista
   if(PROGRAM_TYPE!=PROGRAM_EXPERT)
      return;
//--- Obter o número de subjanelas no gráfico
   int subwindows_total=(int)::ChartGetInteger(m_chart_id,CHART_WINDOWS_TOTAL);
//--- Sair se o número de subjanelas e o número de indicadores não tiverem mudado
   if(subwindows_total==m_subwindows_total)
      return;
//--- Salvar o número atual de subjanelas
   m_subwindows_total=subwindows_total;
//--- Para verificar se há uma subjanela de especialista
   bool is_subwindow=false;
//--- Encontre a subjanela do especialista.
   for(int sw=0; sw<subwindows_total; sw++)
     {
      //--- Pare o loop se houver uma subjanela de especialista
      if(is_subwindow)
         break;
      //--- Quantos indicadores estão nessa janela/subjanela
      int indicators_total=::ChartIndicatorsTotal(m_chart_id,sw);
      //--- Vamos examinar todos os indicadores na janela 
      for(int i=0; i<indicators_total; i++)
        {
         //--- Obter o nome abreviado do indicador
         string indicator_name=::ChartIndicatorName(m_chart_id,sw,i);
         //--- Se essa não for uma subjanela Expert, vá para a próxima
         if(indicator_name!=m_subwindow_shortname)
            continue;
         //--- Observe que a subjanela EA é
         is_subwindow=true;
         //--- Se o número da subjanela tiver sido alterado, então 
         // precisamos salvar o novo número em todos os elementos do formulário principal
         if(sw!=m_subwin)
           {
            //--- Salvar o número da subjanela
            m_subwin=sw;
            //--- Vamos salvá-lo também em todos os elementos do formulário principal da interface
            int elements_total=CWndContainer::ElementsTotal(0);
            for(int e=0; e<elements_total; e++)
               m_wnd[0].m_elements[e].SubwindowNumber(m_subwin);
           }
         //---
         break;
        }
     }
//--- Se a subjanela do Expert Advisor não for encontrada, exclua o Expert Advisor
   if(!is_subwindow)
     {
      ::Print(__FUNCTION__,"> A exclusão de uma subjanela do EA faz com que o EA seja excluído!");
      //--- Removendo o Expert Advisor do gráfico
      ::ExpertRemove();
     }
  }
 
Pavel Kolchin:


está claro que há uma função que funciona por alguns dias e depois falha.

Você não está usando a versão mais recente da biblioteca ou fez alterações nela. Deveria haver essa condição no início desse método:

//--- Sair se (1) não for um EA ou (2) a GUI do EA estiver na janela principal
   if(PROGRAM_TYPE!=PROGRAM_EXPERT || !EXPERT_IN_SUBWINDOW)
      return;

//---

E você tem:

//--- Sair se não for um especialista
   if(PROGRAM_TYPE!=PROGRAM_EXPERT)
      return;
 
Anatoli Kazharski:

Você não está usando a versão mais recente da biblioteca ou fez edições nela. No início desse método, deve haver essa condição:

sim, acho que isso seria melhor)

versão 10.2, portanto, tem todos os itens de menu de que preciso e suporte ao mt4.

Há alguma outra alteração crítica desde então que possa afetar o trabalho?

 
Pavel Kolchin:

...

houve alguma outra edição crítica desde então que possa afetar o desempenho?

É difícil dizer logo de cara. Algo está sendo constantemente adicionado e corrigido.
 

É desejável adicionar ao formulário um mecanismo para adicionar objetos com base no princípio de "fábrica", como no Qt, ou algo semelhante e, de preferência, com orientação relativa entre si:

- direita

- esquerda

- superior

- inferior

 
Konstantin:

É desejável adicionar ao formulário um mecanismo para adicionar objetos com base no princípio de "fábrica", como no Qt, ou algo semelhante e, de preferência, com orientação relativa entre si:

- direita

- esquerda

- superior

- inferior

Por favor, descreva-o em detalhes. Não sei como é no Qt.

Agora os elementos podem ser posicionados em relação ao formulário: direita, esquerda, superior, inferior. Somente o formulário pode ser um elemento pai. Na próxima versão, será possível definir qualquer outro elemento como elemento pai. Isso facilitará ainda mais o gerenciamento e o posicionamento dos elementos.

 
Anatoli Kazharski:

Descreva-o com mais detalhes. Não sei como é no Qt.

Agora os elementos podem ser posicionados em relação ao formulário: direita, esquerda, superior, inferior. Somente o formulário pode ser um elemento pai. Na próxima versão, será possível definir qualquer outro elemento como elemento pai. Isso facilitará ainda mais o gerenciamento e o posicionamento dos elementos.


No Qt, há uma função de fábrica:

QWidgetAction *createWidget();

e é assim que os testes para a criação de widgets são feitos:

QWidget * widget() {
   static QWidget * inst = new QWidget;
   return inst;
}

e, em geral, sobre o QWidget , aqui estão todas as informações.

Agora os elementos podem ser posicionados em relação ao formulário: direita, esquerda, superior, inferior.

Não entendi muito bem: esse posicionamento do elemento é relativo às bordas e eles podem ser colocados tanto atrás do formulário quanto dentro dele?

Por exemplo, se houver um formulário, posicionamos um elemento em relação à borda esquerda do formulário, mais à esquerda?

 
Konstantin:


na função de fábrica do Qt:

e é assim que as verificações são realizadas para criar widgets:

Não estou entendendo nada. O que é uma função de fábrica?