Ошибка при дебаге (Возникла критическая ошибка, отладка остановлена)

 

Решил поэкспериментировать со стандартным UI компонентом CAppDialog. Немного переопределил его, чтобы можно было реализовать следующий функционал:

UI Test

Казалось бы, всё работает. Исходник в прикрепленном файле "UI_Test_3_B.mq5" .

Но мне нужно, чтобы кнопка показа/скрытия диалога отжималась обратно, если я нажму на крестик в правом верхнем углу диалога. Окно не останавливает программу (как по умолчанию), так как я переопределил обработчик OnClickButtonClose диалога.

Поскольку, по умолчанию нельзя так просто узнать программно, показан диалог или скрыт, то пришлось искать соответствующий флаг среди StateFlags диалога, написав соответствующий метод:

public:
  bool getVisible() {
    return (StateFlags() & WND_STATE_FLAG_VISIBLE) != 0;
  }

Но тут я узнал о еще одной особенности CAppDialog. После его скрытия WND_STATE_FLAG_VISIBLE появляется в диалоге не сразу. По крайней мере, в обработчике OnChartEvent его отсутствие не определяется с помощью написанного мной метода getVisible().

//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam) 
{
//---
  if(id == CHARTEVENT_OBJECT_CLICK) {
    if(sparam == btnSH.Name()) {
      if(btnSH.State()) {
        main.Show();
      }
      else {
        main.Hide();
      }
      ChartRedraw(0);
    }
  }
  main.ChartEvent(id,lparam,dparam,sparam);
  if(id == CHARTEVENT_OBJECT_CLICK) {
    if(!main.getVisible()) {
      btnSH.State(false);
    }
  }
  Comment(main.getVisible());
}

Как видно из данного фрагмента, если диалог скрыт (!main.getVisible()), то кнопка отжимается (btnSH.State(false)). Это должно происходить после срабатывания метода Hide(), в переопределенном обработчике диалога OnClickButtonClose().

  void OnClickButtonClose(void) {
    Hide();
  }

Но, к сожалению, флаги меняются с опозданием.

Что ж, я решил добавить обычный флаг visible в диалог и переопределить его методы Show() и Hide(), чтобы они записывали видимость в данную переменную. Исходник: UI_Test_3_E.mq5.

public:
  bool Show() {
    if(visible)
      return false;
      
    if(!CAppDialog::Visible(true))
      return false;
      
    visible = true;
    
    return true; 
  }
  
  bool Hide() {
    if(!visible)
      return false;
      
    if(!CAppDialog::Visible(false))
      return false;
      
    visible = false;
    
    return true;
  }

Но теперь отладчик неожиданно заругался:

Debug error!

Почему нельзя переопределить данные методы и отладчик отказывается работать по непонятной причине?

Информация о терминале, ОС и железе для Разработчиков:

2020.04.23 10:23:11.694 Terminal        MetaTrader 5 x64 build 2380 started for MetaQuotes Software Corp.
2020.04.23 10:23:11.708 Terminal        Windows 10 build 14393, Intel Core i5-5200U  @ 2.20GHz, 2 / 3 Gb memory, 51 / 380 Gb disk, IE 11, UAC, GMT+2
Файлы:
UI_Test_3_B.ex5  166 kb
UI_Test_3_E.ex5  168 kb