Как корректно удалять объекты с чартов MQL4? - страница 2

 
Nikolay Khrushchev:

"ID чарта" то зачем? это лишнее.

Для надёжности )

 
Farkhat Guzairov:

Это как пример, думаю у каждого свой подход к уникальности имен объекта. У меня свой.

думаю вы не поняли. ID чарта одинаковый на одном чарте, это просто бесполезно.

 
Sergey Kolemanov:

Для надёжности )

Вопрос, на днях хотел но так и не дошли руки. Как корректно получить id  "sub_window=EMPTY" текущего чарта?

 
Nikolay Khrushchev:

думаю вы не поняли. ID чарта одинаковый на одном чарте, это просто бесполезно.

Это мне известно, думаю другим тоже.

Только по имени или еще есть варианты?
 
Farkhat Guzairov:

Вопрос, на днях хотел но так и не дошли руки. Как корректно получить id  "sub_window=EMPTY" текущего чарта?

id графика ChartID(). 
номер подокна графика ChartWindowFind()

 
Nikolay Khrushchev:

id графика ChartID(). 
номер подокна графика ChartWindowFind(). 

ок.

 
Farkhat Guzairov:

Всем доброго!

Столкнулся с проблемой, решение которой до конца не удалось добиться.

Есть такой код:

Этот код из справки, чуть расширим его:

казалось бы какие проблемы могут возникнуть, так и есть ранее году так в 2015 этот код работал без особых проблема, сейчас же, происходит частичное удаление объектов по выборке.

Понятно что выбранный цикл for не годиться, так как изначально был не верен по своей логике, удивительно что этот пример все еще есть в официальной справке. Почему неверен, да потому, что как только вы удалите хотя бы один объект то общее количество на чарте измениться, а следовательно индекс ссылки будет неверен, что и происходит на текущий момент, скорее всего разработчики поняли ошибку, но вот как нам теперь корректно удалять объекты?

Есть решения?

Там же обратный перебор.

 
Artyom Trishkin:

Там же обратный перебор.

Ха-ха, Артем вы правы, я жутко невнимательный!!!! 

Но этот вариант мне понравился больше, ObjectsDeleteAll.

 
// Удаление созданных графических объектов
void ClearScreen(){
   int Dimension=2*TypesTotal;
   string Name, Pref[];
   Comment("                                                       "+
           "                                                       "+
           "                                                       ");
   ArrayResize(Pref,Dimension);
   Pref[ 0]=NameTangent[0];
   Pref[ 1]=NameTangent[1];
   Pref[ 2]=NameTrend[0];
   Pref[ 3]=NameTrend[1];
   Pref[ 4]=NameBaseLevel[0];
   Pref[ 5]=NameBaseLevel[1];
   Pref[ 6]=NameTrace[0];
   Pref[ 7]=NameTrace[1];
   Pref[ 8]=NameLevel12[0];
   Pref[ 9]=NameLevel12[1];
   Pref[10]=NameLevel22[0];
   Pref[11]=NameLevel22[1];
   Pref[12]=NameBorder[0];
   Pref[13]=NameBorder[1];
   Pref[14]=NameLevel2[0];
   Pref[15]=NameLevel2[1];
   Pref[16]=NameMainLevel12[0];
   Pref[17]=NameMainLevel12[1];
   Pref[18]=NameMainLevel22[0];
   Pref[19]=NameMainLevel22[1];
   Pref[20]=NameSpiralBorder[0];
   Pref[21]=NameSpiralBorder[1];
   Pref[22]=NameMainLevel2[0];
   Pref[23]=NameMainLevel2[1];
   Pref[24]=NameAttention[0];
   Pref[25]=NameAttention[1];
   Pref[26]=NameLevel1[0];
   Pref[27]=NameLevel1[1];
   Pref[28]=NameMainLevel1[0];
   Pref[29]=NameMainLevel1[1];
   Pref[30]=NameSpiral[0];
   Pref[31]=NameSpiral[1];
   Pref[32]=NameSpan[0];
   Pref[33]=NameSpan[1];
   Pref[34]=NameMainLevel0[0];
   Pref[35]=NameMainLevel0[1];
   Pref[36]=NameMainLevel5[0];
   Pref[37]=NameMainLevel5[1];
   Pref[38]=NameMainLevel6[0];
   Pref[39]=NameMainLevel6[1];
   Pref[40]=Name123[0];
   Pref[41]=Name123[1];
   int i, k=ObjectsTotal()-1;
   while( k>=0 ){
      Name=ObjectName(k);
      i=Dimension-1;
      while( i>=0 ){
         if( StringSubstr(Name,0,StringLen(Pref[i]))==Pref[i] ){
            if( !ObjectDelete(Name) ) {
               if( !РежимОтладки ) PlaySound("alert.wav");
               Print("***** "+Name+": ошибка удаления "+GetLastError()+" при очистке экрана");
         }  }
         i--;
      }
      k--;
   }
   return;
}
// Удаление графического объекта
int fObjectDelete(string Name){
   int Error;
   if( ObjectFind(Name)==0 ){
      if( !ObjectDelete(Name) ){
         Error=GetLastError();
         if( !РежимОтладки ) PlaySound("alert.wav");
         Print("***** "+Name+" - ошибка при попытке удаления "+Error);
   }  }
   else{
      Error=MyError;
   }
   return(Error);
}
 
Ваша изначальная ошибка в том, что изменился не МТ, а изменились Вы. Раньше на графике были объекты, созданные одним Вашим советником и эти объекты не удалялись до Вашей чистки, поэтому нормально работал алгоритм удаления всех подряд. 
Причина обращения: