Errores, fallos, preguntas - página 2347

 
Andrey Khatimlianskii:

Pero tampoco logré implementarlo para diferentes bibliotecas. Para conectar varias bibliotecas con tales macros en una línea y llamar a OnTick para todas las bibliotecas.

Realmente no entiendo ni siquiera un ejemplo, lo que quiero conseguir. ¿Puedes mostrarme?


ZZZ En cuanto al gestor, véase EventBase. EventBase.mqh aquí. Estúpidamente hice a todos herederos y cuando aparecía un nuevo objeto, su puntero iba a una lista común, que era llamada por un bucle for en cada On-event.

 
fxsaber:

Ni siquiera puedo conseguir un ejemplo de lo que quiero conseguir. ¿Puedes mostrarme?

MiClase_1.mqh:

class Myclass_1
  {
public:
   void              OnInit(){Print("Init 1");};
  };


MiClase_2.mqh:

class Myclass_2
  {
public:
   void              OnInit(){Print("Init 2");};
  };


Expert.mq5:

#include <MyClass_1.mqh>
#include <MyClass_2.mqh>

Myclass_1 m_class_1;
Myclass_2 m_class_2;

void OnInit( void )
{
  Print( "Init EA" );
}


Para obtener las 3 impresoras como resultado de la ejecución: "Init 1", "Init 2" e "Init EA"

 

Hola a todos.

Llamo a la funciónIndicatorParameters desde el experto, pero obtengo el error 4014. ¿Qué es lo que puede ser? Construir 1960.

 
Andrey Khatimlianskii:

Para conectar varias bibliotecas con tales macros en una línea, y llamar a OnTick para llamar a todas las bibliotecas OnTick.

Hacer un macro wrapper alrededor de la importación que forme una clase por nombre de la biblioteca (class##libname) y utilice el contexto para la llamada dentro del wrapper (libname::oninit)

y la clase se vuelca al gestor anterior.

pero para cada lib una línea separada.

 
TheXpert:

Hacer una macro envolvente alrededor de la importación que forme una clase por el nombre de la biblioteca (class##libname)

Esto es un poco complicado para mí, así que lo buscaré en Google.

 
Kuzmich:

Hola a todos.

Llamo a la funciónIndicatorParameters desde el experto, pero obtengo el error 4014. ¿Qué es lo que puede ser? Construir 1960.

Si usted tiene 3 inludniks, entonces mi código debe trabajar, pero para cada clase debe prescribir sustituciones macro, aquí está mi ejemplo, parece que funciona, pero voy a comprobar todavía:

class Myclass
  {
public:
                     Myclass(){};
                    ~Myclass(){};
   void              OnInit()  {Print(__FUNCSIG__," выполнен");};
   void              OnDeinit(int Reason){Print(__FUNCSIG__," выполнен");}
   void              OnTick()  {Print(__FUNCSIG__," выполнен");};
   void              OnTimer() {Print(__FUNCSIG__," выполнен");};
  } m_class;
//+------------------------------------------------------------------+
#define  MyClassOnInit m_class.OnInit();
void OnInit( void ){ MyClassOnInit; EventSetMillisecondTimer(300); ::MyClassOnInit_(); }
#define OnInit MyClassOnInit_
//+------------------------------------------------------------------+
#define  MyClassOnDeinit(Reason) m_class.OnDeinit(Reason);
void OnDeinit( const int Reason ){ MyClassOnDeinit(Reason); ::MyClassOnDeinit_(Reason); }
#define OnDeinit MyClassOnDeinit_
//+------------------------------------------------------------------+
#define  MyClassOnTimer m_class.OnTimer();
void OnTimer( void ){ MyClassOnTimer; ::MyClassOnTimer_(); }
#define OnTimer MyClassOnTimer_
//+------------------------------------------------------------------+
#define  MyClassOnTick m_class.OnTick();
void OnTick( void ){ MyClassOnTick; ::MyClassOnTick_(); }
#define OnTick MyClassOnTick_
//+------------------------------------------------------------------+

y en el código del Asesor Experto sólo incluyo un #include <fileMyclass.mqh>

en su ejemplo, los tres archivos deben cerrarse (al final del código) con mis sustituciones de macros (y sustituir los nombres m_class2 , m_class3...)

Andrey Khatimlianskii:

Ya se ha sugerido una solución para la clase de un solo tipo: heredarla de CObject, y añadir una macro de sustitución al gestor de la clase que almacenará todas las instancias añadidas en CArrayObj, la recorrerá y llamará a la función OnXXX requerida.

Tampoco he conseguido implementar esto para diferentes bibliotecas. Para conectar varias bibliotecas con tales macros en una línea, y llamar a OnTick de todas las bibliotecas.

se necesita un ejemplo, no sé cómo y no funcionó con "sustitución de macros en el gestor de clases"

 
Andrey Khatimlianskii:

Para obtener las 3 impresoras: "Init 1", "Init 2" e "Init EA" como resultado de la ejecución

Hazte cargo. El ejemplo del código fuente anterior ha mostrado. Sin embargo, las macros sirven para otras cosas.

 
Andrey Khatimlianskii:

Es un poco complicado para mí, así que lo busqué en Google.

No va a ser bonito, pero puedes reducirlo a algo como esto:

// for libsample
#import "libsample.ex5"
IMPORT_EA_INTERFACE // здесь список импортируемых функций. они по идее одинаковые, поэтому можно в отдельный дефайн
#import
 DECLARE_AND_REGISTER(libsample) // здесь генерация класса-обертки для libsample который обернет импортированные функции и зарегистрируется в менеджере
 

Aquí hay una llamada directa y un ejemplo de aplicación sin gestor.

#define  IMPORT_EA_INTERFACE \
void f1(); \
void f2(); \

#define  DECLARE_AND_REGISTER(x) \
class ImportFrom_##x \
{ \
public: \
   static void f1() { x::f1();} \
   static void f2() { x::f2();} \
}; \

#import "libsample.ex5"
IMPORT_EA_INTERFACE
#import
 DECLARE_AND_REGISTER(libsample)

#import "libsamplesecond.ex5"
IMPORT_EA_INTERFACE
#import
 DECLARE_AND_REGISTER(libsamplesecond)

void OnStart()
{
   ImportFrom_libsample::f1();
   ImportFrom_libsample::f2();

   ImportFrom_libsamplesecond::f1();
   ImportFrom_libsamplesecond::f2();
}

Si la clase ImportFrom tiene registro de gestores y funciones no estáticas, todo puede ser llamado automáticamente para todos los importados ya sea

 
TheXpert:

Aquí hay una llamada directa y un ejemplo de aplicación sin gestor.

Si la clase ImportFrom tiene registro de gestores y funciones no estáticas, todo puede ser llamado automáticamente para todos los importados ya sea

He captado la idea, gracias.

No es 100% transparente, pero es mejor de lo que es ahora.

Razón de la queja: