Панель. При смене шаблона закрывается график mql4

 

Всем привет, много посмотрел веток на похожую тематику, пробовал предложенные методы и их модификацию. Не помогло. Как можно это исправить:

Создана панель по стандартной библиотеке в виде советника. Когда пытаюсь загрузить новый шаблон на график с с этим советником - график закрывается. Пофиксил двоение при смене тф и символа, но это не выходит. Где-то видел решение с добавлением каких-то таймеров, не помогло. Код следующий:

#include <Controls\Dialog.mqh>
#include <Controls\CheckBox.mqh>

//+------------------------------------------------------------------+
//| Class CControlsDialog                                            |
//| Usage: main dialog of the Controls application                   |
//+------------------------------------------------------------------+
class CControlsDialog : public CAppDialog
  {
private:
   CCheckBox         m_check_box1;                    
   CCheckBox         m_check_box2;                    
   CCheckBox         m_check_box3; 
   CCheckBox         m_check_box4;  
   CCheckBox         m_check_box5;    
   CCheckBox         m_check_box6;
   CCheckBox         m_check_box7;                    
                                 
public:
                     CControlsDialog(void);
                    ~CControlsDialog(void);

   //--- create
   bool isCreate;
   virtual bool      Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2);
   //--- chart event handler
   virtual bool      OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam);
protected:
   //--- create dependent controls
   bool              CreateCheckBox1(void);
   bool              CreateCheckBox2(void);
   bool              CreateCheckBox3(void);
   bool              CreateCheckBox4(void);
   bool              CreateCheckBox5(void);
   bool              CreateCheckBox6(void);
   bool              CreateCheckBox7(void);

   //--- handlers of the dependent controls events
   void              OnChangeCheckBox1(void);
   void              OnChangeCheckBox2(void);
   void              OnChangeCheckBox3(void);
   void              OnChangeCheckBox4(void);
   void              OnChangeCheckBox5(void);
   void              OnChangeCheckBox6(void);
   void              OnChangeCheckBox7(void);

  };
//+------------------------------------------------------------------+
//| Event Handling                                                   |
//+------------------------------------------------------------------+
EVENT_MAP_BEGIN(CControlsDialog)
ON_EVENT(ON_CHANGE,m_check_box1,OnChangeCheckBox1)
ON_EVENT(ON_CHANGE,m_check_box2,OnChangeCheckBox2)
ON_EVENT(ON_CHANGE,m_check_box3,OnChangeCheckBox3)
ON_EVENT(ON_CHANGE,m_check_box4,OnChangeCheckBox4)
ON_EVENT(ON_CHANGE,m_check_box5,OnChangeCheckBox5)
ON_EVENT(ON_CHANGE,m_check_box6,OnChangeCheckBox6)
ON_EVENT(ON_CHANGE,m_check_box7,OnChangeCheckBox7)
EVENT_MAP_END(CAppDialog)
//+------------------------------------------------------------------+
//| Constructor                                                      |
//+------------------------------------------------------------------+
CControlsDialog::CControlsDialog(void)
  {
   isCreate = false;
  }
//+------------------------------------------------------------------+
//| Destructor                                                       |
//+------------------------------------------------------------------+
CControlsDialog::~CControlsDialog(void)
  {
   isCreate = false;
  }
//+------------------------------------------------------------------+
//| Create                                                           |
//+------------------------------------------------------------------+
bool CControlsDialog::Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2)
  {
   isCreate = true;
   if(!CAppDialog::Create(chart,name,subwin,x1,y1,x2,y2))
      return(false);

   return(true);
  }     

//+------------------------------------------------------------------+
//| Global Variables                                                 |
//+------------------------------------------------------------------+
CControlsDialog ExtDialog;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create application dialog
 if (!ExtDialog.isCreate)
   {
   if(!ExtDialog.Create(0,"Настройки",0,40,40,205,220))
      return(INIT_FAILED);
//--- run application
   if(!ExtDialog.Run()) return(INIT_FAILED);
   }
 
          
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
 if ((reason != REASON_PARAMETERS) && (reason !=REASON_CHARTCHANGE) && (reason !=REASON_ACCOUNT) && (reason != REASON_TEMPLATE))
    {
      ExtDialog.Destroy(reason);
    }
   
  }
 
Nikita Chernyshov:

Когда пытаюсь загрузить новый шаблон на график с с этим советником - график закрывается. Пофиксил двоение при смене тф и символа, но это не выходит. Где-то видел решение с добавлением каких-то таймеров, не помогло. Код следующий:

Проверил Ваш код у себя - шаблон с советником загружается нормально, график не закрывается. Дублирование объектов видимо "профиксили" не до конца т.к. при сохранении шаблона сохраняются и графические объекты, созданные советником. Соответственно при загрузке шаблона появляются дубли объектов панели.

 

Я, конечно, дико извиняюсь за свое невежество и выложенный ниже код, но мне это помогло. Не могу вникнуть и разобраться никак.

В ручную дважды удаляю все объекты панели. 

#include <Controls\Dialog.mqh>
#include <Controls\CheckBox.mqh>

extern int font_size = 8;         // Размер шрифта
extern color cl      = clrWhite;  // Цвет надписей
extern int dov       = 10;        // Доверительный интервал в пипсах
//+------------------------------------------------------------------+
//| defines                                                          |
//+------------------------------------------------------------------+
//--- indents and gaps
#define INDENT_LEFT                         (3)      // indent from left (with allowance for border width)
#define INDENT_TOP                          (-155)      // indent from top (with allowance for border width)
#define INDENT_RIGHT                        (11)      // indent from right (with allowance for border width)
#define INDENT_BOTTOM                       (1)      // indent from bottom (with allowance for border width)
#define CONTROLS_GAP_X                      (5)       // gap by X coordinate
#define CONTROLS_GAP_Y                      (5)       // gap by Y coordinate
//--- for buttons
#define BUTTON_WIDTH                        (100)     // size by X coordinate
#define BUTTON_HEIGHT                       (20)      // size by Y coordinate
//--- for the indication area
#define EDIT_HEIGHT                         (20)      // size by Y coordinate
//--- for group controls
#define GROUP_WIDTH                         (150)     // size by X coordinate
#define LIST_HEIGHT                         (179)     // size by Y coordinate
#define RADIO_HEIGHT                        (56)      // size by Y coordinate
#define CHECK_HEIGHT                        (93)      // size by Y coordinate
 
 
bool flag_1 = true;
bool flag_2 = true;
bool flag_3 = true;
bool flag_4 = true;
bool flag_5 = true;
bool flag_6 = true;
bool flag_7 = true;

bool flag_1_1 = true;
bool flag_2_1 = true;
bool flag_3_1 = true;
bool flag_4_1 = true;
bool flag_5_1 = true;
bool flag_6_1 = true;
bool flag_7_1 = true;

int p = 1;
static datetime NewTime=0;

int size_1,open, body_size, high_size, low_size;
double percent, percent_2;
string name_1;

//+------------------------------------------------------------------+
//| Class CControlsDialog                                            |
//| Usage: main dialog of the Controls application                   |
//+------------------------------------------------------------------+
class CControlsDialog : public CAppDialog
  {
private:
   CCheckBox         m_check_box1;                    
   CCheckBox         m_check_box2;                    
   CCheckBox         m_check_box3; 
   CCheckBox         m_check_box4;  
   CCheckBox         m_check_box5;    
   CCheckBox         m_check_box6;
   CCheckBox         m_check_box7;                    
                                 
public:
                     CControlsDialog(void);
                    ~CControlsDialog(void);

   //--- create
   bool isCreate;
   virtual bool      Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2);
   //--- chart event handler
   virtual bool      OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam);
protected:
   //--- create dependent controls
   bool              CreateCheckBox1(void);
   bool              CreateCheckBox2(void);
   bool              CreateCheckBox3(void);
   bool              CreateCheckBox4(void);
   bool              CreateCheckBox5(void);
   bool              CreateCheckBox6(void);
   bool              CreateCheckBox7(void);

   //--- handlers of the dependent controls events
   void              OnChangeCheckBox1(void);
   void              OnChangeCheckBox2(void);
   void              OnChangeCheckBox3(void);
   void              OnChangeCheckBox4(void);
   void              OnChangeCheckBox5(void);
   void              OnChangeCheckBox6(void);
   void              OnChangeCheckBox7(void);

  };
//+------------------------------------------------------------------+
//| Event Handling                                                   |
//+------------------------------------------------------------------+
EVENT_MAP_BEGIN(CControlsDialog)
ON_EVENT(ON_CHANGE,m_check_box1,OnChangeCheckBox1)
ON_EVENT(ON_CHANGE,m_check_box2,OnChangeCheckBox2)
ON_EVENT(ON_CHANGE,m_check_box3,OnChangeCheckBox3)
ON_EVENT(ON_CHANGE,m_check_box4,OnChangeCheckBox4)
ON_EVENT(ON_CHANGE,m_check_box5,OnChangeCheckBox5)
ON_EVENT(ON_CHANGE,m_check_box6,OnChangeCheckBox6)
ON_EVENT(ON_CHANGE,m_check_box7,OnChangeCheckBox7)
EVENT_MAP_END(CAppDialog)
//+------------------------------------------------------------------+
//| Constructor                                                      |
//+------------------------------------------------------------------+
CControlsDialog::CControlsDialog(void)
  {
   isCreate = false;
  }
//+------------------------------------------------------------------+
//| Destructor                                                       |
//+------------------------------------------------------------------+
CControlsDialog::~CControlsDialog(void)
  {
   isCreate = false;
  }
//+------------------------------------------------------------------+
//| Create                                                           |
//+------------------------------------------------------------------+
bool CControlsDialog::Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2)
  {
   for(int i = 0; i <= 21; i ++)
      {
       
       if(StringFind(ObjectName(i),"Back",0) != -1) ObjectDelete(ObjectName(i));
       if(StringFind(ObjectName(i),"Border",0) != -1) ObjectDelete(ObjectName(i));
       if(StringFind(ObjectName(i),"CPR",0) != -1) ObjectDelete(ObjectName(i));
       if(StringFind(ObjectName(i),"Caption",0) != -1) ObjectDelete(ObjectName(i));
       if(StringFind(ObjectName(i),"Inside",0) != -1) ObjectDelete(ObjectName(i)); 
       if(StringFind(ObjectName(i),"MinMax",0) != -1) ObjectDelete(ObjectName(i)); 
       if(StringFind(ObjectName(i),"Outside",0) != -1) ObjectDelete(ObjectName(i)); 
       if(StringFind(ObjectName(i),"PPR",0) != -1) ObjectDelete(ObjectName(i)); 
       if(StringFind(ObjectName(i),"Pinbar",0) != -1) ObjectDelete(ObjectName(i)); 
       if(StringFind(ObjectName(i),"TBH",0) != -1) ObjectDelete(ObjectName(i)); 
       if(StringFind(ObjectName(i),"Rails",0) != -1) ObjectDelete(ObjectName(i)); 
       if(StringFind(ObjectName(i),"RailsLabel",0) != -1) ObjectDelete(ObjectName(i)); 
       if(StringFind(ObjectName(i),"CPRLabel",0) != -1) ObjectDelete(ObjectName(i)); 
       if(StringFind(ObjectName(i),"ClientBack",0) != -1) ObjectDelete(ObjectName(i)); 
       if(StringFind(ObjectName(i),"Close",0) != -1) ObjectDelete(ObjectName(i)); 
       if(StringFind(ObjectName(i),"PPRLabel",0) != -1) ObjectDelete(ObjectName(i)); 
       if(StringFind(ObjectName(i),"PinBarLabel",0) != -1) ObjectDelete(ObjectName(i)); 
       if(StringFind(ObjectName(i),"Bar Button",0) != -1) ObjectDelete(ObjectName(i)); 
       if(StringFind(ObjectName(i),"Bar Label",0) != -1) ObjectDelete(ObjectName(i)); 
       if(StringFind(ObjectName(i),"PinBarButton",0) != -1) ObjectDelete(ObjectName(i)); 
       if(StringFind(ObjectName(i),"TBH\TBLButton",0) != -1) ObjectDelete(ObjectName(i));
    } 


  for(int k = 0; k <= 21; k ++)
      {
       
       if(StringFind(ObjectName(k),"Back",0) != -1) ObjectDelete(ObjectName(k));
       if(StringFind(ObjectName(k),"Border",0) != -1) ObjectDelete(ObjectName(k));
       if(StringFind(ObjectName(k),"CPR",0) != -1) ObjectDelete(ObjectName(k));
       if(StringFind(ObjectName(k),"Caption",0) != -1) ObjectDelete(ObjectName(k));
       if(StringFind(ObjectName(k),"Inside",0) != -1) ObjectDelete(ObjectName(k)); 
       if(StringFind(ObjectName(k),"MinMax",0) != -1) ObjectDelete(ObjectName(k)); 
       if(StringFind(ObjectName(k),"Outside",0) != -1) ObjectDelete(ObjectName(k)); 
       if(StringFind(ObjectName(k),"PPR",0) != -1) ObjectDelete(ObjectName(k)); 
       if(StringFind(ObjectName(k),"Pinbar",0) != -1) ObjectDelete(ObjectName(k)); 
       if(StringFind(ObjectName(k),"TBH",0) != -1) ObjectDelete(ObjectName(k)); 
       if(StringFind(ObjectName(k),"Rails",0) != -1) ObjectDelete(ObjectName(k)); 
       if(StringFind(ObjectName(k),"RailsLabel",0) != -1) ObjectDelete(ObjectName(k)); 
       if(StringFind(ObjectName(k),"CPRLabel",0) != -1) ObjectDelete(ObjectName(k)); 
       if(StringFind(ObjectName(k),"ClientBack",0) != -1) ObjectDelete(ObjectName(k)); 
       if(StringFind(ObjectName(k),"Close",0) != -1) ObjectDelete(ObjectName(k)); 
       if(StringFind(ObjectName(k),"PPRLabel",0) != -1) ObjectDelete(ObjectName(k)); 
       if(StringFind(ObjectName(k),"PinBarLabel",0) != -1) ObjectDelete(ObjectName(k)); 
       if(StringFind(ObjectName(k),"Bar Button",0) != -1) ObjectDelete(ObjectName(k)); 
       if(StringFind(ObjectName(k),"Bar Label",0) != -1) ObjectDelete(ObjectName(k)); 
       if(StringFind(ObjectName(k),"PinBarButton",0) != -1) ObjectDelete(ObjectName(k)); 
       if(StringFind(ObjectName(k),"TBH\TBLButton",0) != -1) ObjectDelete(ObjectName(k)); 

      }
   isCreate = true;
   if(!CAppDialog::Create(chart,name,subwin,x1,y1,x2,y2))
      return(false);
 
   return(true);
  }

//+------------------------------------------------------------------+
//| Global Variables                                                 |
//+------------------------------------------------------------------+
CControlsDialog ExtDialog;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {


//--- create application dialog
 if (!ExtDialog.isCreate)
   {
   if(!ExtDialog.Create(0,"Настройки",0,40,40,205,220))
      return(INIT_FAILED);
//--- run application
   if(!ExtDialog.Run()) return(INIT_FAILED);
   }
 
          
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
if ((reason != REASON_PARAMETERS) && (reason !=REASON_CHARTCHANGE) && (reason !=REASON_ACCOUNT) && (reason != REASON_TEMPLATE))
    {
     ExtDialog.Destroy(reason);
    }
  
  if(reason == REASON_TEMPLATE)
   {
    ExtDialog.Destroy(reason);
   }
    
   
  }
 

А что тут разбираться, при смене шаблона панель не деинициализировалась, но новая создавалась. Удалить надо было это

void OnDeinit(const int reason)
  {
 if ((reason != REASON_PARAMETERS) && (reason !=REASON_CHARTCHANGE) && (reason !=REASON_ACCOUNT) && (reason != REASON_TEMPLATE))
    {
      ExtDialog.Destroy(reason);
    }
   
  }
 
Aleksey Mavrin:

А что тут разбираться, при смене шаблона панель не деинициализировалась, но новая создавалась. Удалить надо было это

Это было добавлено уже в процессе экперементов.

Удаление этой части коды не исправляет проблемы.

 
Nikita Chernyshov:

Это было добавлено уже в процессе экперементов.

Удаление этой части коды не исправляет проблемы.

а, кстати да, вспомнил, была похожая проблема при шаблонах. Тоже решилась предварительным удалением всех объектов в ОнИнит, но не уверен что это лучшее решение.

У вас как то зависит от того - был ли сов на графике до применения шаблона или не был, а лишь в шаблоне прописан?

 
Aleksey Mavrin:

а, кстати да, вспомнил, была похожая проблема при шаблонах. Тоже решилась предварительным удалением всех объектов в ОнИнит, но не уверен что это лучшее решение.

У вас как то зависит от того - был ли сов на графике до применения шаблона или не был, а лишь в шаблоне прописан?

Если шаблоне прописан - то просто двоит его.

Если поставлен на график, а сверху заливается шаблон с совой - то закрывает график.

Удаление объектов панели перед креейтом (не в онИнит) и строками

  if(reason == REASON_TEMPLATE)
   {
    ExtDialog.Destroy(reason);
   }

пофиксил это дело. Вроде, все работает норм. Костыльная тема, конечно, и явно не лучшее решение.

 
CControlsDialog *ExtDialog;
Причина обращения: