Удаление элементов с панели

 

Мне понадобилось, чтобы во время работы советника на панель динамически добавлялись и удалялись элементы. Подскажите как правильно реализовать.

Я думал, что для удаления поможет метод CWndContainer::Delete(). Но может что-то не так делаю.

Вот описание из документации СБ:


Я взял стандартный код из справки по созданию трех кнопок на панели отсюда. И решил после добавления третьей кнопки тут же ее удалить. Добавил две строчки выделенные желтым.

//+------------------------------------------------------------------+
//| Create the "Button3" fixed button                                |
//+------------------------------------------------------------------+
bool CControlsDialog::CreateButton3(void)
  {
//--- coordinates
   int x1=INDENT_LEFT+2*(BUTTON_WIDTH+CONTROLS_GAP_X);
   int y1=INDENT_TOP+(EDIT_HEIGHT+CONTROLS_GAP_Y);
   int x2=x1+BUTTON_WIDTH;
   int y2=y1+BUTTON_HEIGHT;
//--- create
   if(!m_button3.Create(m_chart_id,m_name+"Button3",m_subwin,x1,y1,x2,y2))
      return(false);
   if(!m_button3.Text("Locked"))
      return(false);
   if(!Add(m_button3))
      return(false);
   m_button3.Locking(true);
   
   if(!Delete(m_button3))
     Print(__FUNCTION__, " Не получилось удалить кнопку из панели");
     
//--- succeed
   return(true);
  }

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

Тогда как ее правильно отцепить от панели, чтобы потом удалить? Каким образом нужно использовать метод Delete() ?

Файлы:
testButton.mq5  20 kb
 

Хотя увидел, что можно использовать m_button3.Destroy().

Но все равно непонятно, каким образом использовать метод CWndContainer::Delete().

 
Vasiliy Pushkaryov:

Хотя увидел, что можно использовать m_button3.Destroy().

Но все равно непонятно, каким образом использовать метод CWndContainer::Delete().

По памяти - Delete удаляет кнопку из панели, не удаляя саму кнопку, а Destroy как раз её саму. В дебаге пройдись, посмотри, за 15 секунд найдёшь в чём дело.

 
Aleksey Mavrin:

По памяти - Delete удаляет кнопку из панели, не удаляя саму кнопку, а Destroy как раз её саму. В дебаге пройдись, посмотри, за 15 секунд найдёшь в чём дело.

Так вот и не пойму почему Delete() возвращает false все время. Пусть просто отцепит от панели. Add() - ведь нормально, true, но тут же попытка этому объекту сделать Delete() - false.
 
Vasiliy Pushkaryov:
Так вот и не пойму почему Delete() возвращает false все время. Пусть просто отцепит от панели. Add() - ведь нормально, true, но тут же попытка этому объекту сделать Delete() - false.

юзай ДЕБАГ, не благодари.)

 
Может, через создание и удаление самого объекта (new delete)? Тоже как-то пытался через .Delete, через .Destroy, но бросил.
 
Вот в этих статья демонстрировалось удаление элементов (часть 2 (самый простой пример в конце этой части), часть 3), но там применяется пропатченная библиотека контролов (ControlsPlus), так что не могу гарантировать, что сработает со стандартной. Если кратко, то нужно элементы создавать динамически (через new), а не как автоматические члены формы, тогда они нормально удаляются.
Язык MQL как средство разметки графического интерфейса MQL-программ. Часть 2
Язык MQL как средство разметки графического интерфейса MQL-программ. Часть 2
  • www.mql5.com
В первой части публикации мы рассмотрели базовые принципы описания раскладки графического интерфейса MQL-программ на языке MQL. Для их реализации потребовалось создать несколько классов, отвечающих непосредственно за инициализацию интерфейсных элементов, их объединение в общую иерархию и настройку свойств. Сейчас мы готовимся перейти к более...
 
Stanislav Korotky:
Вот в этих статья демонстрировалось удаление элементов (часть 2 (самый простой пример в конце этой части), часть 3), но там применяется пропатченная библиотека контролов (ControlsPlus), так что не могу гарантировать, что сработает со стандартной.
Спасибо, сейчас решил свою задачу другим образом. Но Ваши статьи обязательно прочитаю, интересные возможности описываете.
Причина обращения: