Discussão do artigo "DoEasy. Controles (Parte 31): Rolando o conteúdo do controle "ScrollBar"" - página 2

 
leonerd CArray deve ser implementado separadamente em uma classe herdada para classificar objetos, não?

Não. Há um método Sort() em CArrayObj:

//+------------------------------------------------------------------+
//| Busca da posição do elemento em uma matriz ordenada
//+------------------------------------------------------------------+
int CArrayObj::Search(const CObject *element) const
  {
   int pos;
//--- verificação
   if(m_data_total==0 || !CheckPointer(element) || m_sort_mode==-1)
      return(-1);
//--- busca
   pos=QuickSearch(element);
   if(m_data[pos].Compare(element,m_sort_mode)==0)
      return(pos);
//--- não encontrado
   return(-1);
  }
//+------------------------------------------------------------------+

Compare() dentro do método, que é o que você precisa substituir em classes herdadas.

Na classe CBar, cujos objetos estão armazenados na lista em que estamos procurando a barra desejada, o método Compare() já foi substituído (assim como em todas as classes de objetos da biblioteca):

//+------------------------------------------------------------------+
//| Compara os objetos CBar entre si de acordo com a propriedade especificada
//+------------------------------------------------------------------+
int CBar::Compare(const CObject *node,const int mode=0) const
  {
   const CBar *bar_compared=node;
//--- comparação de propriedades inteiras de duas barras
   if(mode<BAR_PROP_INTEGER_TOTAL)
     {
      long value_compared=bar_compared.GetProperty((ENUM_BAR_PROP_INTEGER)mode);
      long value_current=this.GetProperty((ENUM_BAR_PROP_INTEGER)mode);
      return(value_current>value_compared ? 1 : value_current<value_compared ? -1 : 0);
     }
//--- comparação das propriedades reais de duas barras
   else if(mode<BAR_PROP_DOUBLE_TOTAL+BAR_PROP_INTEGER_TOTAL)
     {
      double value_compared=bar_compared.GetProperty((ENUM_BAR_PROP_DOUBLE)mode);
      double value_current=this.GetProperty((ENUM_BAR_PROP_DOUBLE)mode);
      return(value_current>value_compared ? 1 : value_current<value_compared ? -1 : 0);
     }
//--- comparação das propriedades de string de duas barras
   else if(mode<BAR_PROP_DOUBLE_TOTAL+BAR_PROP_INTEGER_TOTAL+BAR_PROP_STRING_TOTAL)
     {
      string value_compared=bar_compared.GetProperty((ENUM_BAR_PROP_STRING)mode);
      string value_current=this.GetProperty((ENUM_BAR_PROP_STRING)mode);
      return(value_current>value_compared ? 1 : value_current<value_compared ? -1 : 0);
     }
   return 0;
  }
//+------------------------------------------------------------------+

A estrutura de pesquisa de objetos na biblioteca está organizada corretamente.

Por que você falha? Talvez seja simplesmente porque você não começou a estudar a biblioteca desde o início?

 
Artyom Trishkin #:


O que não está funcionando? Talvez seja porque você não começou com a biblioteca desde o início?

Olá. Não estou reclamando, é claro que não li todos os seus artigos. Duvido que tenha lido algum. Mas coisas simples não funcionam e nem mesmo está descrito como elas deveriam funcionar.

Aqui você tem elementos gráficos padrão. A propósito, não há nem mesmo exemplos para muitos elementos básicos (Edit, nesse caso).

Portanto, CreateEditField() não funciona. Ele falha no método CreateNewStdGraphObjectAndGetCtrlObj(). Aqui:

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);
CChartObjectsControl *CGraphElementsCollection::GetChartObjectCtrlObj(const long chart_id)
  {
//--- Em um loop pelo número total de objetos na lista
   for(int i=0;i<this.m_list_charts_control.Total();i++)
     {
      //--- Obter um ponteiro para o próximo objeto
      CChartObjectsControl *obj=this.m_list_charts_control.At(i);
      //--- Se o ponteiro não puder ser obtido, vá para o próximo
      if(obj==NULL)
         continue;
      //--- Se o identificador do gráfico do objeto for igual ao pesquisado - retorne o ponteiro para o objeto na lista
      if(obj.ChartID()==chart_id)
         return obj;
     }
//--- Não encontrou o objeto - retorne NULL
   return NULL;
  }

Bem, o controle m_list_charts_control está vazio... portanto, nada é adicionado e o método não retorna nada.

Em geral, há erros suficientes. Tenho a impressão de que ninguém usa a biblioteca na prática. Pegue uma ferramenta com o único tipo permitido de preenchimento IOC. Bem, ela não funcionará. Ela não o define corretamente. Tive que editar muitos métodos.... Você só precisa usar seu método de negociação. Além disso, o método inicial na inicialização corrige o preenchimento, mas o método de negociação não o capta.

Método CTrading::OpenPosition()

this.m_request.type_filling=(type_filling>WRONG_VALUE ? type_filling : trade_obj.GetTypeFilling());

Ok, encontramos o tipo correto de preenchimento, se ele não estiver explicitamente especificado na ordem.

Mas depois passamos a variável original para o próximo método. Qual é o objetivo? Ou eu não entendi alguma coisa...

res=trade_obj.OpenPosition(type,this.m_request.volume,this.m_request.sl,this.m_request.tp,magic,comment,deviation,type_filling);
 
leonerd #:

Olá. Não estou reclamando, é claro que não li todos os seus artigos. Duvido que tenha havido algum. Mas coisas simples não funcionam e nem mesmo está descrito como deveriam funcionar.

Aqui você tem elementos gráficos padrão. A propósito, você não tem nem mesmo exemplos de muitos elementos básicos (Editar, nesse caso).

Portanto, CreateEditField() não funciona. Ele falha no método CreateNewStdGraphObjectAndGetCtrlObj(). Aqui está ele:

Bem, o controle m_list_charts_control está vazio... portanto, nada é adicionado e o método não retorna nada.

Em geral, há erros suficientes. Tenho a impressão de que ninguém usa a biblioteca na prática. Pegue uma ferramenta com o único tipo permitido de preenchimento IOC. Bem, ela não funcionará. Ela não o define corretamente. Tive que editar muitos métodos.... Você só precisa passar por seu método de negociação. E o método inicial na inicialização corrige o preenchimento, mas o método de negociação não o pega.

Método CTrading::OpenPosition()

Ok, encontramos o tipo correto de preenchimento, se ele não estiver explicitamente especificado na ordem.

Mas depois passamos a variável original para o próximo método. Qual é o objetivo? Ou eu não estou entendendo alguma coisa...

Essa discussão tem alguma relação com este artigo? Não.
Em qual artigo estão as perguntas?
Vamos lidar com elas em sua discussão.
PS: Não me lembro de ter criado uma classe de campo de entrada para a biblioteca CreateEditField(), de onde você a tirou?
 
Artyom Trishkin #:
Essa discussão tem algo a ver com esse artigo específico? Não.
Sobre qual artigo são as perguntas?
Vamos lidar com elas nesta discussão.
PS: Não me lembro de ter criado uma classe de campo de entrada para a biblioteca CreateEditField(), de onde você a tirou?

CreateEditField() em Engine.mqh

 
leonerd #:

CreateEditField() em Engine.mqh

Não consigo ver pelo celular)
Responderei mais tarde quando vir o código.
 
leonerd #:
Bem, o CreateEditField() não funciona. Ele falha no método CreateNewStdGraphObjectAndGetCtrlObj().

Por que você está se intrometendo em métodos privados? Eles são necessários apenas para que a biblioteca funcione.

O usuário precisa de métodos públicos. O usuário final não precisa do trabalho dos métodos internos.

Se você quiser entender o funcionamento de tudo isso, então os artigos que descrevem toda essa cozinha são escritos para esse fim. Não está muito claro o que e como você quer fazer. Você não diz, não dá exemplos, apenas aponta para uma linha tirada de um grande número delas e diz que não funciona....

leonerd #:
Em geral, há articulações suficientes. Tenho a impressão de que ninguém usa a biblioteca na prática.

Se você não ler a descrição e tentar modificar e usar métodos internos por conta própria, não é o autor que tem bugs suficientes, mas aquele que a modifica.

E, sim, a biblioteca ainda está em desenvolvimento.

Vou dar uma olhada no tipo de preenchimento, obrigado.

Mas é melhor discutir isso na discussão dos artigos correspondentes, para que você possa ver a descrição de uma só vez, em vez de falar sobre uma coisa na discussão de outra.

 
А зачем Вы в приватные методы лезете? Они нужны только для работы библиотеки.
Não tenho vontade de entrar lá. Se tudo estivesse funcionando, eu nem abriria.
 
leonerd #:
Não tenho vontade de entrar lá. Se tudo estivesse funcionando, eu nem abriria.

O que não está funcionando? O código, por favor. Apenas dizer que não está funcionando não é produtivo.

 
Artyom Trishkin #:

O que não está funcionando para você? O código, por favor. Apenas dizer que não está funcionando não é produtivo.

Concordo que isso não é produtivo. É por isso que forneci o máximo de detalhes neste comentário https://www.mql5.com/ru/forum/438481/page2#comment_53551638.

Обсуждение статьи "DoEasy. Элементы управления (Часть 31): Прокрутка содержимого элемента управления "ScrollBar""
Обсуждение статьи "DoEasy. Элементы управления (Часть 31): Прокрутка содержимого элемента управления "ScrollBar""
  • 2023.06.19
  • Artyom Trishkin
  • www.mql5.com
Опубликована статья DoEasy. Элементы управления (Часть 31): Прокрутка содержимого элемента управления "ScrollBar" : Автор: Artyom Trishkin...
 
leonerd #:
Forneci o máximo de detalhes neste comentário.

O máximo de detalhes é um código que você pode compilar, executar, ver o que não funciona e encontrar e relatar a causa.

Sem testes, os artigos não são publicados. Tudo funciona nos testes. É por isso que estou perguntando pela terceira vez: o que você está fazendo e o que não funciona. O código, por favor.