Discusión sobre el artículo "DoEasy. Elementos de control (Parte 31): Desplazamiento por el contenido del control "ScrollBar"" - página 2

 
leonerd CArray debería implementarse por separado en una clase heredada para ordenar objetos, ¿no?

No. Hay un método Sort() en CArrayObj:

//+------------------------------------------------------------------+
//| Búsqueda de posición de elemento en un array ordenado |
//+------------------------------------------------------------------+
int CArrayObj::Search(const CObject *element) const
  {
   int pos;
//--- comprobar
   if(m_data_total==0 || !CheckPointer(element) || m_sort_mode==-1)
      return(-1);
//--- búsqueda
   pos=QuickSearch(element);
   if(m_data[pos].Compare(element,m_sort_mode)==0)
      return(pos);
//--- no encontrado
   return(-1);
  }
//+------------------------------------------------------------------+

Compare() dentro del método, que es lo que hay que sobreescribir en las clases heredadas.

En la clase CBar, cuyos objetos se almacenan en la lista donde buscamos la barra deseada, el método Compare() ya está sobrescrito (al igual que en todas las clases de objetos de la biblioteca):

//+------------------------------------------------------------------+
//| Compara objetos CBar entre sí por la propiedad especificada |||
//+------------------------------------------------------------------+
int CBar::Compare(const CObject *node,const int mode=0) const
  {
   const CBar *bar_compared=node;
//--- comparación de las propiedades enteras de dos 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);
     }
//--- comparación de las propiedades reales de dos 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);
     }
//--- comparación de las propiedades de las cadenas de dos 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;
  }
//+------------------------------------------------------------------+

La estructura de búsqueda de objetos en la librería está organizada correctamente.

¿Por qué falla? ¿Quizás es simplemente porque no has empezado a estudiar la biblioteca desde el principio?

 
Artyom Trishkin #:


¿Qué es lo que no funciona? ¿Quizá es porque no empezaste con la biblioteca desde el principio?

Hola. No me quejo, claro que no he leído todos tus artículos. Dudo que hubiera alguno. Pero las cosas simples no funcionan y ni siquiera se describe cómo deberían funcionar.

Aquí tienes elementos gráficos estándar. Por cierto, ni siquiera hay ejemplos para muchos elementos básicos (Edit en este caso).

Por lo tanto, CreateEditField() no funciona. Se bloquea en el método CreateNewStdGraphObjectAndGetCtrlObj(). Aquí:

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)
  {
//--- En un bucle a través del número total de objetos en la lista
   for(int i=0;i<this.m_list_charts_control.Total();i++)
     {
      //--- Obtener un puntero al siguiente objeto
      CChartObjectsControl *obj=this.m_list_charts_control.At(i);
      //--- Si no se ha podido obtener el puntero - pasar al siguiente
      if(obj==NULL)
         continue;
      //--- Si el identificador de la tabla del objeto es igual al buscado - devuelve el puntero al objeto en la lista
      if(obj.ChartID()==chart_id)
         return obj;
     }
//--- No se ha encontrado el objeto - devolver NULL
   return NULL;
  }

Bueno, y m_list_charts_control está vacío... en consecuencia, no se añade nada y el método no devuelve nada.

En general, hay bastantes errores. Tengo la sensación de que nadie utiliza la biblioteca en la práctica. Tome una herramienta con el único tipo permitido de llenado IOC. No funcionará. No lo define correctamente. Tuve que editar un montón de métodos.... Usted acaba de ir a través de su método de negociación. Además, el método inicial en la inicialización corrige el relleno, pero el método de trading no lo recoge.

Método CTrading::OpenPosition()

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

Ok, hemos encontrado el tipo correcto de relleno, si no está explícitamente especificado en la orden.

Pero entonces pasamos la variable original al siguiente método. ¿Qué sentido tiene? O no entiendo algo...

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

Hola. No me quejo, claro que no he leído todos tus artículos. Dudo que hubiera alguno. Pero las cosas simples no funcionan y ni siquiera se describe cómo deberían funcionar.

Aquí tienes elementos gráficos estándar. Por cierto, ni siquiera tienes ejemplos para muchos elementos básicos (Edit en este caso).

Así, CreateEditField() no funciona. Se bloquea en el método CreateNewStdGraphObjectAndGetCtrlObj(). Aquí está:

Bueno, m_list_charts_control está vacío... en consecuencia, no se añade nada y el método no devuelve nada.

En general, hay bastantes errores. Tengo la sensación de que nadie utiliza la biblioteca en la práctica. Tome una herramienta con el único tipo permitido de llenado IOC. No funcionará. No lo define correctamente. Tuve que editar un montón de métodos.... Usted acaba de ir a través de su método de negociación. Y el método inicial en la inicialización corrige el relleno, pero el método de comercio no lo recoge.

Método CTrading::OpenPosition()

Ok, hemos encontrado el tipo correcto de relleno, si no se especifica explícitamente en la orden.

Pero entonces pasamos la variable original al siguiente método. ¿Qué sentido tiene? O no entiendo algo...

¿Esta discusión tiene alguna relación con este artículo? No.
¿De qué artículo son las preguntas?
Vamos a tratar con ellos en su discusión.
PD No recuerdo haber hecho una clase de campo de entrada para la librería CreateEditField() ¿de dónde la has sacado?
 
Artyom Trishkin #:
¿Tiene esta discusión algo que ver con este artículo en particular? No.
¿Sobre qué artículo versan las preguntas?
Tratémoslas en esta discusión.
PD No recuerdo haber hecho una clase de campo de entrada para la librería CreateEditField() ¿de dónde la has sacado?

CreateEditField() en Engine.mqh

 
leonerd #:

CreateEditField() en Engine.mqh

No puedo mirarlo desde el móvil)
Te respondo luego cuando vea el código.
 
leonerd #:
Pues bien, CreateEditField() no funciona. Se bloquea en el método CreateNewStdGraphObjectAndGetCtrlObj().

¿Por qué te metes en métodos privados? Son necesarios sólo para que la librería funcione.

El usuario necesita métodos públicos. El usuario final no necesita el trabajo de los métodos internos.

Si quieres entender el trabajo de todo esto, entonces los artículos que describen toda esta cocina están escritos para este propósito. No está muy claro qué y cómo quieres hacer. No lo dices, no das ejemplos, simplemente señalas una línea sacada de un gran número de ellas y dices que no funciona....

leonerd #:
En general, hay bastantes articulaciones. Tengo la sensación de que nadie usa la librería en la práctica.

Si no lees la descripción e intentas modificar y usar los métodos internos por ti mismo, entonces no es el autor el que tiene bastantes fallos, sino el que la modifica.

Y sí, la librería aún está en desarrollo.

Le echaré un vistazo al tipo de relleno, gracias.

Pero es mejor que lo discutamos en la discusión de los artículos correspondientes, así se ve la descripción de una vez, en vez de hablar de una cosa en la discusión de otra.

 
А зачем Вы в приватные методы лезете? Они нужны только для работы библиотеки.
No tengo ningún deseo de entrar ahí. Si todo funcionara, ni siquiera lo abriría.
 
leonerd #:
No tengo ningún deseo de entrar ahí. Si todo funcionara, ni siquiera lo abriría.

¿Qué es lo que no funciona? El código, por favor. Sólo decir que no funciona no es productivo.

 
Artyom Trishkin #:

¿Qué es lo que no te funciona? El código, por favor. Decir simplemente que no funciona no es productivo.

Estoy de acuerdo en que no es productivo. Por eso he dado el máximo de detalles en este comentario 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 #:
He proporcionado el máximo de detalles en este comentario.

Máximo detalle es código que se puede compilar, ejecutar, ver lo que no funciona y encontrar e informar de la causa.

Sin pruebas, los artículos no se publican. Todo funciona en las pruebas. Por eso pregunto por tercera vez: qué estás haciendo y qué no funciona ahí. El código, por favor.