Почему панель сжимается при переключении графиков?

 

Я пытался следующий код:

#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.001"
#property description "Control Panels and Dialogs. Demonstration class CButton"
#include <Controls\Dialog.mqh>
#include <Controls\Button.mqh>
//+------------------------------------------------------------------+
//| defines                                                          |
//+------------------------------------------------------------------+
//--- indents and gaps
#define INDENT_LEFT                         (11)      // indent from left (with allowance for border width)
#define INDENT_TOP                          (11)      // indent from top (with allowance for border width)
#define CONTROLS_GAP_X                      (5)       // gap by X coordinate
//--- for buttons
#define BUTTON_WIDTH                        (100)     // size by X coordinate
#define BUTTON_HEIGHT                       (20)      // size by Y coordinate
//---
CAppDialog           AppWindow;
CButton              m_button1;                       // the button object
CButton              m_button2;                       // the button object
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create application dialog
   if(!AppWindow.Create(0,"AppWindow with Two Buttons",0,40,40,380,344))
      return(INIT_FAILED);
//--- create dependent controls
   if(!CreateButton1())
      return(false);
   if(!CreateButton2())
      return(false);
//--- run application
   AppWindow.Run();
//--- succeed
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   Comment("");
//--- destroy dialog
   AppWindow.Destroy(reason);
  }
//+------------------------------------------------------------------+
//| Expert chart event function                                      |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,         // event ID  
                  const long& lparam,   // event parameter of the long type
                  const double& dparam, // event parameter of the double type
                  const string& sparam) // event parameter of the string type
  {
   AppWindow.ChartEvent(id,lparam,dparam,sparam);
  }
//+------------------------------------------------------------------+
//| Create the "Button1" button                                      |
//+------------------------------------------------------------------+
bool CreateButton1(void)
  {
//--- coordinates
   int x1=INDENT_LEFT;        // x1            = 11  pixels
   int y1=INDENT_TOP;         // y1            = 11  pixels
   int x2=x1+BUTTON_WIDTH;    // x2 = 11 + 100 = 111 pixels
   int y2=y1+BUTTON_HEIGHT;   // y2 = 11 + 20  = 32  pixels
//--- create
   if(!m_button1.Create(0,"Button1",0,x1,y1,x2,y2))
      return(false);
   if(!m_button1.Text("Button1"))
      return(false);
   if(!AppWindow.Add(m_button1))
      return(false);
//--- succeed
   return(true);
  }
//+------------------------------------------------------------------+
//| Create the "Button2"                                             |
//+------------------------------------------------------------------+
bool CreateButton2(void)
  {
//--- coordinates
   int x1=INDENT_LEFT+2*(BUTTON_WIDTH+CONTROLS_GAP_X);   // x1 = 11  + 2 * (100 + 5) = 221 pixels
   int y1=INDENT_TOP;                                    // y1                       = 11  pixels
   int x2=x1+BUTTON_WIDTH;                               // x2 = 221 + 100           = 321 pixels
   int y2=y1+BUTTON_HEIGHT;                              // y2 = 11  + 20            = 31  pixels
//--- create
   if(!m_button2.Create(0,"Button2",0,x1,y1,x2,y2))
      return(false);
   if(!m_button2.Text("Button2"))
      return(false);
   if(!AppWindow.Add(m_button2))
      return(false);
//--- succeed
   return(true);
  }
//+------------------------------------------------------------------+

Вот выходное изображение:


Когда я переключаюсь на валюту GBPAUD, а затем снова на EURUSD, я получаю это изображение:

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

 

Не воспроизводится:


 

Интересно. Похоже на баг.

Этот код на 4-ке работает как нужно. Панель самостоятельно не сворачивается.

А вот на 5-ке - да. Билд 2380 от 2 апреля (64-бит). Сейчас кину ссылку с этой ветки в ветку сопровождения последнего билда.


 
jaffer wilson:

Я пытался следующий код:

Вот выходное изображение:


Когда я переключаюсь на валюту GBPAUD, а затем снова на EURUSD, я получаю это изображение:

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

Давайте подождем, может скоро поправят

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Новая версия платформы MetaTrader 5 build 2360: Расширение интеграции с SQLite

Vasiliy Pushkaryov, 2020.04.14 17:12

С панельками СБ что-то непонятное. При переходе на другой график и возврате обратно, панель самопроизвольно сворачивается.



 
Vasiliy Pushkaryov:

Интересно. Похоже на баг.

Этот код на 4-ке работает как нужно. Панель самостоятельно не сворачивается.

А вот на 5-ке - да. Билд 2380 от 2 апреля (64-бит). Сейчас кину ссылку с этой ветки в ветку сопровождения последнего билда.


У меня билд 2361 от 08 марта. Видимо, в новом билде что-то поломали.

 
Ihor Herasko:

У меня билд 2361 от 08 марта. Видимо, в новом билде что-то поломали.

Вряд ли. Отслеживаю изменения в СБ при помощи хранилища. До поломки хранилища не замечал изменений в той части СБ.

Скорее всего всё зависит от способа реализации своих панелей.
Где-то на форуме было, что если использовать панель как глобальный объект, то есть баги, а если использовать указатель на объект, создаваемый посредством new, то всё нормально.

Никто из обсуждающих этот "баг" не приложил кода для его воспроизведения (кроме jaffer wilson - у него объект объявлен глобально).

Равно как и в ветке по новому билду.
А значит в той ветке такое сообщение будет оставлено без внимания: нет кода, позволяющего воспроизвести указанную проблему - нет и рассмотрения проблемы.

 
Artyom Trishkin:

Вряд ли. Отслеживаю изменения в СБ при помощи хранилища. До поломки хранилища не замечал изменений в той части СБ.

Скорее всего всё зависит от способа реализации своих панелей.
Где-то на форуме было, что если использовать панель как глобальный объект, то есть баги, а если использовать указатель на объект, создаваемый посредством new, то всё нормально.

Никто из обсуждающих этот "баг" не приложил кода для его воспроизведения (кроме jaffer wilson - у него объект объявлен глобально).

Равно как и в ветке по новому билду.
А значит в той ветке такое сообщение будет оставлено без внимания: нет кода, позволяющего воспроизвести указанную проблему - нет и рассмотрения проблемы.

Так скорее всего топикстартер взял этот пример или из документации, или из примеров СБ.
Точно не знаю где этот пример лежит, но похоже что это пример от разработчика. Так как присутствует строка описания.

#property description "Control Panels and Dialogs. Demonstration class CButton"

И в статье у Владимира, в первом примере кода, тоже объект объявлен на глобальном уровне.

https://www.mql5.com/ru/articles/4503

Как создать графическую панель любой сложности и как это работает
Как создать графическую панель любой сложности и как это работает
  • www.mql5.com
До сих пор большинство программистов, которые пишут индикаторы и советники для платформы MetaTrader 5, почти не пользуются возможностями по созданию графических интерфейсов в своих приложениях.  Основная причина такого положения дел, на мой взгляд, заключается в том, что классы Панели и диалоги из Стандартной библиотеки содержат только сухое...
 
Artyom Trishkin:

Вряд ли. Отслеживаю изменения в СБ при помощи хранилища. До поломки хранилища не замечал изменений в той части СБ.

Скорее всего всё зависит от способа реализации своих панелей.
Где-то на форуме было, что если использовать панель как глобальный объект, то есть баги, а если использовать указатель на объект, создаваемый посредством new, то всё нормально.

Никто из обсуждающих этот "баг" не приложил кода для его воспроизведения (кроме jaffer wilson - у него объект объявлен глобально).

Равно как и в ветке по новому билду.
А значит в той ветке такое сообщение будет оставлено без внимания: нет кода, позволяющего воспроизвести указанную проблему - нет и рассмотрения проблемы.

Все сделано, Артем. В ветку последнего билда код приложен, просто вставка из кармана в постах этой ветки этого не отображает. Код без изменений взят у ТС.

Здесь в примере СБ в самом низу исходник, тоже на глобальном уровне объявление CControlsDialog ExtDialog. И также панель в МТ5 самосворачивается.

 
Vasiliy Pushkaryov:

Все сделано, Артем. В ветку последнего билда код приложен, просто вставка из кармана в постах этой ветки этого не отображает. Код без изменений взят у ТС.

Здесь в примере СБ в самом низу исходник, тоже на глобальном уровне объявление CControlsDialog ExtDialog. И также панель в МТ5 самосворачивается.

Всегда так было: при изменении символа или таймрфейма настоящая панель на базе CDialog сворачивалась.

 
Vasiliy Pushkaryov:

Все сделано, Артем. В ветку последнего билда код приложен, просто вставка из кармана в постах этой ветки этого не отображает. Код без изменений взят у ТС.

Здесь в примере СБ в самом низу исходник, тоже на глобальном уровне объявление CControlsDialog ExtDialog. И также панель в МТ5 самосворачивается.

А попробуйте создать объект посредством new и обращаться к панели по указателю.

Не берусь утверждать и доказывать, но память стучит изнутри колокольчиком - "где-то такое уже было и обсуждалось в контексте метода создания объекта и обращения к нему"...

 
Artyom Trishkin:

А попробуйте создать объект посредством new и обращаться к панели по указателю.

Не берусь утверждать и доказывать, но память стучит изнутри колокольчиком - "где-то такое уже было и обсуждалось в контексте метода создания объекта и обращения к нему"...

Скорее всего да, похоже на правду. Ведь в примере объект создан на стек, и при переключении графика происходит пересоздание объекта.