Обсуждение статьи "Графические интерфейсы I: Функции для кнопок формы и удаление элементов интерфейса (Глава 4)"

 

Опубликована статья Графические интерфейсы I: Функции для кнопок формы и удаление элементов интерфейса (Глава 4):

Эта статья является продолжением первой части серии о графических интерфейсах. Более подробно, для чего предназначена эта библиотека, можно прочитать в самой первой статье: Графические интерфейсы I: Подготовка структуры библиотеки (Глава 1). Полный список ссылок на статьи первой части находится в конце каждой главы и там же есть возможность загрузить к себе на компьютер полную версию библиотеки на текущей стадии разработки. Файлы нужно разместить по тем же директориям, как они расположены в архиве.

В предыдущей статье в класс CWindow были внесены дополнения, которые позволяют перемещать форму на графике, а ее элементы теперь умеют реагировать на перемещение курсора мыши. В этой главе продолжим развивать класс CWindow, дополняя его методами, которые позволят управлять формой посредством нажатия на ее элементах. Сделаем так, чтобы программу можно было закрыть через кнопку на форме, а также реализуем возможность сворачивания и разворачивания формы при необходимости.

Удаление элементов интерфейса

Если вы дошли до этого момента и делали все в той же последовательности, как изложено в статье, то вы могли заметить, что при удалении эксперта с графика все объекты графического интерфейса удаляются. Но мы не рассматривали до сих пор методы для удаления графических объектов с графика. Почему объекты удаляются при удалении эксперта? Этот момент учтен в стандартной библиотеке классов. А именно, в деструкторе класса CChartObject, производные классы которого используются в нашей библиотеке. При удалении программы с графика вызываются деструкторы классов, включая и этот. И если объект был закреплен за этим графиком, то он удаляется (смотрите код ниже):

//+------------------------------------------------------------------+
//| Destructor                                                       |
//+------------------------------------------------------------------+
CChartObject::~CChartObject(void)
  {
   if(m_chart_id!=-1)
      ::ObjectDelete(m_chart_id,m_name);
  }

Но если изменить символ графика или его таймфрейм, когда эксперт находится на графике, то деструкторы не вызываются, и графические объекты в таком случае не удалятся. А так как графический интерфейс создается в функции инициализации OnInit() в главном файле программы, и при смене символа или таймфрейма эксперта сначала производится деинициализация и затем инициализация, то графический интерфейс будет создан поверх того, что уже есть. В итоге с первой такой манипуляции вы получите две копии объектов, а если будете продолжать изменять символ графика или таймфрейм, то получите множество копий объектов интерфейса.

Рис. 4. Тест формы при переключении символа и таймфрейма графика.

Рис. 4. Тест формы при переключении символа и таймфрейма графика

Автор: Anatoli Kazharski

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