Можно ли сделать универсальный код для клонирования объектов, а именно необходимо получить все параметры объекта, удалит объект, произвести некоторую обработку на графике, воссоздать объект в первоначальном виде?
Или для каждого объекта надо свой обработчик делать?
в принципе можно написать пару методов - сериализация и "обратно" для произвольного объекта чарта.
сохранение:
п.1 запросить тип объедка
п.2.1 если тип известен - считать свойства GetInteger GetDouble GetString от заранее известных идентификаторов свойств
п.2.2 если тип неизвестен (например свежий билд терминала и !! новый объект чарта ) - просто в цикле смотреть на какие коды возвращает разумное. Запомнить и вернуться к 2.1
п3. записать в память/файл/базу
но встаёт краеугольный камень программирования - А НАФИГА ?
Можно ли сделать универсальный код для клонирования объектов, а именно необходимо получить все параметры объекта, удалит объект, произвести некоторую обработку на графике, воссоздать объект в первоначальном виде?
Или для каждого объекта надо свой обработчик делать?
На четвёрке так делал, давно:
// Копирование графического объектаint fObjectCopy(string OldName,string NewName,string Text="Прежний",int Action=0){
int Error;
if( OldName==NewName ) Action=2;
if( ObjectFind(OldName)==0 ){ // Копирование OldName в NewNameint Type =ObjectType(OldName);
datetime Time1 =ObjectGet(OldName,OBJPROP_TIME1);
double Price1 =ObjectGet(OldName,OBJPROP_PRICE1);
datetime Time2 =ObjectGet(OldName,OBJPROP_TIME2);
double Price2 =ObjectGet(OldName,OBJPROP_PRICE2);
datetime Time3 =ObjectGet(OldName,OBJPROP_TIME3);
double Price3 =ObjectGet(OldName,OBJPROP_PRICE3);
bool Фон =ObjectGet(OldName,OBJPROP_BACK);
color Цвет =ObjectGet(OldName,OBJPROP_COLOR);
bool Луч =ObjectGet(OldName,OBJPROP_RAY);
int Стиль =ObjectGet(OldName,OBJPROP_STYLE);
int Видимость=ObjectGet(OldName,OBJPROP_TIMEFRAMES);
int Размер =ObjectGet(OldName,OBJPROP_WIDTH);
int Угол =ObjectGet(OldName,OBJPROP_ANGLE);
int Знак =ObjectGet(OldName,OBJPROP_ARROWCODE);
if( Text=="Прежний" ) Text=ObjectDescription(OldName);
if( Action==1 ){ // Спрятать оригиналif( !ObjectSet(OldName,OBJPROP_TIMEFRAMES,EMPTY) ){
Error=GetLastError();
if( !РежимОтладки ) PlaySound("alert.wav");
Print("***** "+OldName+" - ошибка при задании невидимости "+Error);
} }
if( Action==2 ) Error=fObjectDelete(OldName);// Удалить оригинал
Error=fObjectDelete(NewName); // Удалить копиюif( ObjectCreate(NewName,Type,0,Time1,Price1,Time2,Price2,Time3,Price3) ){
if( !ObjectSetText(NewName,Text)
|| !ObjectSet(NewName,OBJPROP_BACK,Фон)
|| !ObjectSet(NewName,OBJPROP_COLOR,Цвет)
|| !ObjectSet(NewName,OBJPROP_RAY,Луч)
|| !ObjectSet(NewName,OBJPROP_STYLE,Стиль)
|| !ObjectSet(NewName,OBJPROP_TIMEFRAMES,Видимость)
|| !ObjectSet(NewName,OBJPROP_WIDTH,Размер)
|| !ObjectSet(NewName,OBJPROP_ANGLE,Угол)
|| !ObjectSet(NewName,OBJPROP_ARROWCODE,Знак) ){
Error=GetLastError();
if( !РежимОтладки ) PlaySound("alert.wav");
Print("***** "+NewName+" - ошибка модификации параметров "+Error);
} }
else {
Error=GetLastError();
if( !РежимОтладки ) PlaySound("alert.wav");
Print("***** "+OldName+" - Копия "+NewName+" не создана, ошибка "+Error);
} }
else {
Error=MyError;
if( РежимОтладки ) Print("*** "+OldName+" - объект для копирования не найден");
}
return(Error);
}
//--------------------------------------------------------------------
Для чего тогда вот эта часть фразы?
Можно ли сделать универсальный код для клонирования объектов, а именно необходимо получить все параметры объекта, удалит объект, произвести некоторую обработку на графике, воссоздать объект в первоначальном виде?
Или для каждого объекта надо свой обработчик делать?
в принципе можно написать пару методов - сериализация и "обратно" для произвольного объекта чарта.
сохранение:
п.1 запросить тип объедка
п.2.1 если тип известен - считать свойства GetInteger GetDouble GetString от заранее известных идентификаторов свойств
п.2.2 если тип неизвестен (например свежий билд терминала и !! новый объект чарта ) - просто в цикле смотреть на какие коды возвращает разумное. Запомнить и вернуться к 2.1
п3. записать в память/файл/базу
но встаёт краеугольный камень программирования - А НАФИГА ?
Для чего тогда вот эта часть фразы?
Может, взаимодействие с программой через ГУИ.
Теперь-то уже понятно, что графические объекты.
Если графические объекты, то возможно создать универсальную функцию.
Можно даже на типы объектов не заморачиваться.
Сделать три массива с идентификаторам для функций ObjectGetInteger, ...String, Double.
Еще три массив для значений. Три цикла.
Можно ли сделать универсальный код для клонирования объектов, а именно необходимо получить все параметры объекта, удалит объект, произвести некоторую обработку на графике, воссоздать объект в первоначальном виде?
Или для каждого объекта надо свой обработчик делать?
На четвёрке так делал, давно:
Универсального способа нет.
Дмитрий, это не Вы, а я ООП не применяю. Зачем отвергаете базовые принципы ООП? Лепите клонов, сколько хотите, главное - переименовывайте вовремя.
Теперь-то уже понятно, что графические объекты.
Если графические объекты, то возможно создать универсальную функцию.
Можно даже на типы объектов не заморачиваться.
Integer, я осознанно отказался от программирования на MQL5, потому, как старый и не программист.
Рассказываю: Плевать, графические они, или нет.
Любые объекты ООП позволяет копировать и в этом его смысл и ценность. Собственно, больше он ни для чего не нужен.
Дмитрий, это не Вы, а я ООП не применяю. Зачем отвергаете базовые принципы ООП? Лепите клонов, сколько хотите, главное - переименовывайте вовремя.
Главное, закусывайте вовремя.
Здесь нет способа пройтись в цикле по всем методам и свойствам объекта, не зная их имена.
Integer, я осознанно отказался от программирования на MQL5, потому, как старый и не программист.
но встаёт краеугольный камень программирования - А НАФИГА ?
был бы универсальным метод - взял и использовал, а так да - пришлось по перебирать свойства (пока таких) объектов - тренд и текст.