Чем приятно объектно ориентированное программирование (ООП), так это тем, что в одном месте можно собрать все, что касается функционирования описываемого объекта. Для вертикальной линии для подавляющего большинства случаев нужно совсем немного - создать линию, определить ей цвет, стиль отрисовки и самое главное - время на ценовом графике, на котором она будет установлена. Для решения задачи создадим класс:
- Код: выделить все
class CTimeLine
{
private:
string m_name;
public:
CTimeLine(string Name) {m_name = Name; } // конструктор класса
~CTimeLine() { ObjectDelete(m_name);} // деструктор класса
void SetLine(datetime Zone, color LineColor)
{
if (ObjectFind(m_name)<0)
{
ObjectCreate(m_name,OBJ_VLINE,0,Zone,0);
}
ObjectSet(m_name,OBJPROP_TIME1,Zone);
ObjectSet(m_name,OBJPROP_STYLE,STYLE_DASHDOTDOT);
ObjectSet(m_name,OBJPROP_COLOR,LineColor);
}
};
Этот код вставляется в текст программы или присоединяется отдельным файлом директивой #include.
Класс получил название CTimeLine, оно будет использоваться в качестве типа для объявления экземпляров класса. Так как любой объект на графике должен иметь свое имя, в приватной части описания класса под имя выделено строковое поле m_name. В это поле единожды в момент создания экземпляра класса будет записано имя объекта, и затем все методы класса могут с ним работать. Для этого в параметры конструктора передается строка, которая и записывается в поле m_name:
- Код: выделить все
CTimeLine(string Name) {m_name = Name; } // конструктор класса
Еще при использовании ООП нет необходимости удалять объекты в функции деинициализации, так как эту процедуру можно выполнить при описании класса в его деструкторе. Сколько бы мы объектов ни создали, при завершении работы советника или индикатора автоматически вызовутся все деструкторы классов, в которых мы пропишем удаление объекта с графика:
- Код: выделить все
~CTimeLine() { ObjectDelete(m_name);} // деструктор класса
Как видите, поскольку имя объекта у нас есть, то нет необходимости в переборе всех объектов графика и поиске нужного.
Дальнейшие методы, включенные в класс, могут быть самые разнообразные, необходимые для функциональности программы. Например, можно объявить отдельные методы для создания, перемещения, управления цветом и стилем объекта. Мы же для упрощения управлением линии все функции запишем в один метод SetLine(...), в который передадим местоположение и цвет объекта, а все функции по созданию и установкой свойств впишем в его тело:
- Код: выделить все
void SetLine(datetime Zone, color LineColor)
{
if (ObjectFind(m_name)<0)
{
ObjectCreate(m_name,OBJ_VLINE,0,Zone,0); // создание объекта "вертикальная линия"
}
ObjectSet(m_name,OBJPROP_TIME1,Zone); // установка времени
ObjectSet(m_name,OBJPROP_STYLE,STYLE_DASHDOTDOT); // установка типа линии
ObjectSet(m_name,OBJPROP_COLOR,LineColor);// установка цвета линии
}