Ошибки, баги, вопросы - страница 2347

 
Andrey Khatimlianskii:

А вот для разных библиотек у меня тоже не получилось это реализовать. Чтобы одной строкой подключать несколько библиотек с такими макро-подстановками, и чтобы при вызове OnTick вызывался OnTick всех библиотек.

Что-то сильно не догоняю даже примера, что хочется получить. Можете показать?


ЗЫ Что касается менеджера, то см. EventBase.mqh здесь. Тупо сделал всех наследниками и при появлении нового объекта его указатель попадал в общий список, который вызывался циклом for в каждом On-событии.

 
fxsaber:

Что-то сильно не догоняю даже примера, что хочется получить. Можете показать?

MyClass_1.mqh:

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


MyClass_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" );
}


Чтобы в результате выполнения получить все 3 принта: "Init 1", "Init 2" и "Init EA"

 

Всем, привет.

Вызываю из эксперта функцию  IndicatorParameters, но получаю ошибку 4014. Почему это может быть - подскажите? Build 1960.

 
Andrey Khatimlianskii:

Чтобы одной строкой подключать несколько библиотек с такими макро-подстановками, и чтобы при вызове OnTick вызывался OnTick всех библиотек.

Сделать макрос-обертку вокруг импорта которая формирует класс по имени либы (class##libname) и использует контекст для вызова внутри обертки (libname::oninit)

ну а класс подсовывается вышеупомянутому менеджеру.

только для каждой либы отдельная строка.

 
TheXpert:

Сделать макрос-обертку вокруг импорта которая формирует класс по имени либы (class##libname)

Это для меня сложновато, пошел гуглить.

 
Kuzmich:

Всем, привет.

Вызываю из эксперта функцию  IndicatorParameters, но получаю ошибку 4014. Почему это может быть - подскажите? Build 1960.

ну если у Вас 3 инклудника, тогда мой код который выше опубликовал должен работать, но нужно для каждого класса прописать макроподстановки, вот мой пример, вроде работает, но еще проверять буду:

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_
//+------------------------------------------------------------------+

и в коде эксперта просто подключаю одним #include <fileMyclass.mqh>

в Вашем примере все три файла нужно закрыть (в самом низу кода) моими макроподстановками (и подменить имена m_class2 , m_class3...)

Andrey Khatimlianskii:

Для однотипного класса решение уже подсказали: унаследуйте его от CObject, и макроподстановку добавьте в класс-менеджер, который будет хранить все добавленные экземпляры в CArrayObj, перебирать его и вызывать нужную OnXXX-функцию.

А вот для разных библиотек у меня тоже не получилось это реализовать. Чтобы одной строкой подключать несколько библиотек с такими макро-подстановками, и чтобы при вызове OnTick вызывался OnTick всех библиотек.

пример нужен, не умею и не работал "макроподстановкой в класс менеджере"

 
Andrey Khatimlianskii:

Чтобы в результате выполнения получить все 3 принта: "Init 1", "Init 2" и "Init EA"

Делать менеджер. Пример исходника выше показал. Макросы все же для другого.

 
Andrey Khatimlianskii:

Это для меня сложновато, пошел гуглить.

вобщем красиво не получится, но сократить запись вроде как можно примерно до такой:

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

Вот прямой вызов и пример реализации без менеджера.

#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();
}

если у класса ImportFrom сделать регистрацию у менеджера и нестатические функции, все можно вызывать автоматом для всех импортированных либок

 
TheXpert:

Вот прямой вызов и пример реализации без менеджера.

если у класса ImportFrom сделать регистрацию у менеджера и нестатические функции, все можно вызывать автоматом для всех импортированных либок

Мысль понял, спасибо.

Не 100% прозрачно, но лучше, чем есть на данный момент.

Причина обращения: