Клонирование объектов - страница 2

 
Ihor Herasko #:

Для чего тогда вот эта часть фразы?

Я ответил на вопрос касательно объектов, о которых подумал Integer.
 
Nikolay Kuznetsov:

Можно ли сделать универсальный код для клонирования объектов, а именно необходимо получить все параметры объекта, удалит объект, произвести некоторую обработку на графике, воссоздать объект в первоначальном виде?


Или для каждого объекта надо свой обработчик делать?

в принципе можно написать пару методов - сериализация и "обратно" для произвольного объекта чарта.

сохранение:

п.1 запросить тип объедка

п.2.1 если тип известен - считать свойства GetInteger GetDouble GetString от заранее известных идентификаторов свойств

п.2.2 если тип неизвестен (например свежий билд терминала и !! новый объект чарта ) - просто в цикле смотреть на какие коды возвращает разумное. Запомнить и вернуться к 2.1

п3. записать в память/файл/базу

но встаёт краеугольный камень программирования - А НАФИГА ?  

 
Ihor Herasko #:

Для чего тогда вот эта часть фразы?

Может, взаимодействие с программой через ГУИ.

Теперь-то уже понятно, что графические объекты.

Если графические объекты, то возможно создать универсальную функцию.

Можно даже на типы объектов не заморачиваться.

Сделать три массива с идентификаторам для функций ObjectGetInteger, ...String, Double.

Еще три массив для значений. Три цикла.

 
Nikolay Kuznetsov:

Можно ли сделать универсальный код для клонирования объектов, а именно необходимо получить все параметры объекта, удалит объект, произвести некоторую обработку на графике, воссоздать объект в первоначальном виде?


Или для каждого объекта надо свой обработчик делать?

На четвёрке так делал, давно: 

// Копирование графического объекта
int fObjectCopy(string OldName,string NewName,string Text="Прежний",int Action=0){
   int Error;
   if( OldName==NewName ) Action=2;
   if( ObjectFind(OldName)==0 ){                   // Копирование OldName в NewName
      int      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);
}
//--------------------------------------------------------------------
 
Dmitry Fedoseev #:
Универсального способа нет.

Дмитрий, это не Вы, а я ООП не применяю. Зачем отвергаете базовые принципы ООП? Лепите клонов, сколько хотите, главное - переименовывайте вовремя. 

 
Модераторы, вроде - никто ничего не нарушил. Не? Почто столько народу порубили? 
 
Dmitry Fedoseev #:


Теперь-то уже понятно, что графические объекты.

Если графические объекты, то возможно создать универсальную функцию.

Можно даже на типы объектов не заморачиваться.


Integer, я осознанно отказался от программирования на MQL5, потому, как старый и не программист. 

Рассказываю: Плевать, графические они, или нет. 

Любые объекты ООП позволяет копировать и в этом его смысл и ценность. Собственно, больше он ни для чего не нужен. 

 
Алексей Тарабанов #:

Дмитрий, это не Вы, а я ООП не применяю. Зачем отвергаете базовые принципы ООП? Лепите клонов, сколько хотите, главное - переименовывайте вовремя. 

Главное, закусывайте вовремя.

Здесь нет способа пройтись в цикле по всем методам и свойствам объекта, не зная их имена.

 
Алексей Тарабанов #:

Integer, я осознанно отказался от программирования на MQL5, потому, как старый и не программист. 

Это что! Я осознанно отказался от миллиарда, потому как всё равно не светит.
 
Maxim Kuznetsov #:

но встаёт краеугольный камень программирования - А НАФИГА ?  

был бы универсальным метод - взял и использовал, а так да - пришлось по перебирать свойства (пока таких) объектов - тренд и текст.

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