Discussão do artigo "DoEasy. Controles (Parte 31): Rolando o conteúdo do controle "ScrollBar""

 

Novo artigo DoEasy. Controles (Parte 31): Rolando o conteúdo do controle "ScrollBar" foi publicado:

Neste artigo, criaremos a funcionalidade para rolar o conteúdo do contêiner usando os botões da barra de rolagem horizontal.

Compilamos o Expert Advisor e o iniciamos no gráfico:


Como podemos observar, a rolagem controlada pelos botões de seta funciona de maneira bastante adequada. Quando tentamos mover o controle deslizante com o mouse, ele "resiste", o que é natural, uma vez que ainda não implementamos o processamento do deslocamento do controle deslizante, mas já temos o recálculo de suas dimensões e coordenadas. Dessa forma, ao tentar mover o controle deslizante com o mouse, o método de ajuste de suas coordenadas o retorna à posição que corresponde ao posicionamento do conteúdo do contêiner na área visível. Nos próximos artigos, tudo será finalizado para seu correto funcionamento.

Autor: Artyom Trishkin

 

Para esses trabalhos, um monumento será erguido provavelmente em mql5, descendentes))) O que vale um arquivo defines.mqh, em 4 mil linhas. Se você observar a diferença entre 70 partes e 131 partes, é incrível a quantidade de trabalho que existe )))

Encontrei um pequeno erro, no arquivo trading.mqh, SetPrices, tem a visibilidade private, não protected, os descendentes não podem usar a função. No arquivo TradingControl.mqh, CreatePReqClose(), há erros de uso.


 private:
  template <typename PR,typename SL,typename TP,typename PL> 
   bool                 SetPrices(const ENUM_ORDER_TYPE action,const PR price,const SL sl,const TP tp,const PL limit,const string source_method,CSymbol *symbol_obj);
 
BillionerClub #:

Para esses trabalhos, um monumento será erguido provavelmente em mql5, descendentes))) O que vale um arquivo defines.mqh, em 4 mil linhas. Se você observar a diferença entre 70 partes e 131 partes, é incrível a quantidade de trabalho que existe )))

Encontrei um pequeno erro, no arquivo trading.mqh, SetPrices, tem a visibilidade private, não protected, os descendentes não podem usar a função. No arquivo TradingControl.mqh, CreatePReqClose(), há erros de uso.


Sim. Esse erro foi um descuido meu e do compilador antigo que não o detectou. Nas versões mais recentes do compilador, o erro foi detectado e eu o corrigi. Nas versões recentes da biblioteca, os métodos estão na seção protegida, não na seção privada

 

COrder vs. CChart

Por que criar um formulário na classe COrder?

 
BillionerClub #:

Por que criar um formulário na classe COrder?

Ele pode ser criado em qualquer classe da biblioteca. Ele permite que você crie seu próprio visual para qualquer objeto
 

Não seria melhor criar uma estrutura e transformar as cadeias de caracteres em uma matriz CharArray?

   ulong             m_ticket;                                    // Ticket da ordem/negociação selecionada (MQL5)
   long              m_long_prop[ORDER_PROP_INTEGER_TOTAL];       // Propriedades de números inteiros
   double            m_double_prop[ORDER_PROP_DOUBLE_TOTAL];      // Propriedades substanciais
   string            m_string_prop[ORDER_PROP_STRING_TOTAL];      // Propriedades da cadeia de caracteres
 
//--- Cria um novo objeto de gráfico, retorna um ponteiro para o objeto de controle de gráfico
   CChartObjectsControl *CreateNewStdGraphObjectAndGetCtrlObj(const long chart_id,
                                                              const string name,
                                                              int subwindow,
                                                              const ENUM_OBJECT type_object,
                                                              const datetime time1,
                                                              const double price1,
                                                              const datetime time2=0,
                                                              const double price2=0,
                                                              const datetime time3=0,
                                                              const double price3=0,
                                                              const datetime time4=0,
                                                              const double price4=0,
                                                              const datetime time5=0,
                                                              const double price5=0)
                       {
                        //--- Se o objeto com ID e nome do gráfico já existir na coleção, informe-o e retorne NULL
                        if(this.IsPresentGraphObjInList(chart_id,name))
                          {
                           ::Print(DFUN,CMessage::Text(MSG_GRAPH_ELM_COLLECTION_ERR_GR_OBJ_ALREADY_EXISTS)," ChartID ",(string)chart_id,", ",name);
                           return NULL;
                          }
                        //--- Se um novo objeto gráfico padrão não puder ser criado - informe-o e retorne NULL
                        if(!CreateNewStdGraphObject(chart_id,name,type_object,subwindow,time1,price1,time2,price2,time3,price3,time4,price4,time5,price5))
                          {
                           ::Print(DFUN,CMessage::Text(MSG_GRAPH_STD_OBJ_ERR_FAILED_CREATE_STD_GRAPH_OBJ),StdGraphObjectTypeDescription(type_object));
                           CMessage::ToLog(::GetLastError(),true);
                           return NULL;
                          }
                        //--- Se o objeto de controle de programação não puder ser obtido - informe-o
                        CChartObjectsControl *ctrl=this.GetChartObjectCtrlObj(chart_id);
                        if(ctrl==NULL)
                           ::Print(DFUN,CMessage::Text(MSG_GRAPH_ELM_COLLECTION_ERR_FAILED_GET_CTRL_OBJ),(string)chart_id);
                        //--- Retorna um ponteiro para o objeto de controle de programação ou NULL em caso de erro ao recebê-lo
                        return ctrl;
                       }

Tentei criar um objeto simples (rótulo de texto), mas não consegui.

Depois de CreateNewStdGraphObject(), como o objeto criado deve entrar em m_list_charts_control para obter um objeto diferente de zero na próxima chamada?

CChartObjectsControl *ctrl=this.GetChartObjectCtrlObj(chart_id);
 
Ou o que está em m_list_charts_control? Tenho 0 itens lá.
 
//--- Cria um objeto gráfico "Text Label"
   bool              CreateTextLabel(const long chart_id,const string name,const int subwindow,const bool extended,
                                     const int x,const int y,
                                     const string text,const int size,const ENUM_BASE_CORNER corner,
                                     const ENUM_ANCHOR_POINT anchor_point,const double angle)
                       {
                        string nm=this.m_name_program+"_"+name;
                        ENUM_OBJECT type_object=OBJ_LABEL;
                        CChartObjectsControl *ctrl=this.CreateNewStdGraphObjectAndGetCtrlObj(chart_id,nm,subwindow,type_object,0,0);
                        if(ctrl==NULL)
                           return false; 

Retorna false antes de atingir a configuração da propriedade.

 
Consegui isso adicionando RefreshByChartID(chart_id) depois de criar...
 
//+------------------------------------------------------------------+
//| Retorna o objeto barra por tempo na série temporal.
//+------------------------------------------------------------------+
CBar *CSeriesDE::GetBar(const datetime time)
  {
   CBar *obj=new CBar(); 
   if(obj==NULL)
      return NULL;
   obj.SetSymbolPeriod(this.m_symbol,this.m_timeframe,time);
   this.m_list_series.Sort(SORT_BY_BAR_TIME);
   int index=this.m_list_series.Search(obj);
   delete obj;
   return this.m_list_series.At(index);
  }

Aqui, a série temporal não está sendo classificada para mim.... O método Sort() em CArray deve ser implementado separadamente em uma classe herdada para classificar objetos, não?