Баг с удалением объектов с графика

 

Не помню, обсуждалось или нет

индюк через ObjectCreate расставляет графические метки.

проблема в их удалении при деиннициализации.

int deinit() {

   for(int i=0;i<ObjectsTotal();i++) {
          if("NNC" == StringSubstr( ObjectName(i), 0, 3))
                                                  ObjectDelete(name);
        }
   return(0);
}

ObjectsDeleteAll работает железно, но мне надо удалить

только объекты моего индикатора (в нач. имени - "NNC.." )

В чем проблема, опять руки ?

 
Мне кажется уже раз сто говорили, что при удалении чего-либо считать надо с конца.
 
Valio писал(а) >>

Не помню, обсуждалось или нет

индюк через ObjectCreate расставляет графические метки.

проблема в их удалении при деиннициализации.

ObjectsDeleteAll работает железно, но мне надо удалить

только объекты моего индикатора (в нач. имени - "NNC.." )

В чем проблема, опять руки ?

if("NNC" == StringSubstr( name, 1, 3))

мож так!?

в принте посмотри чему ровна субстрока!

 
Roger писал(а) >>
что при удалении чего-либо считать надо с конца.

Туплю.. мог бы и догадаться )) .. индексы перенумеровываются. Всё Ок!

для танкистов: меняем одну строчку и все работает:

..
   for(int i=ObjectsTotal()-1;  i>=0;  i--) {
..
 
int Del_Obj()                                      // Функция удаляет все свои объекты
   {
   string Mas_Name_Del[1000]                       // Массив имён объектов к удалению
   int Kol_Obj_Del = 0;                            // Пока нет объектов к удалению
   int Kol_Objects = ObjectsTotal();               // Общее количество объектов

   for (int k=0; k<Kol_Objects; k++)               // По количеству объектов
      {
      string His_Name = ObjectName(k);             // Извлекаем имя объекта
      string Nachalo = StringSubstr(His_Name,0,6); // Извлекаем первые несколько символов из строки
      if (Nachalo == "My_EA_")                     // Найден объект, начинающийся с искомой подстроки
         {
         Kol_Obj_Del++;                            // Количество имён объектов к удалению
         Mas_Name_Del[Kol_Obj_Del]=His_Name;       // Накапливаем массивчик  
         }
      }                                            // Продолжаем искать "наши" объекты

   for (int i=1; i<=Kol_Obj_Del; i++)              // Удаляем все объекты с именами, имеющимися в массиве
      ObjectDelete(Mas_Name_Del[i]);               // Удаляем 
   WindowRedraw();                                 // Для моментального отображения

   return;                                         // Спасибо за доверие! Покеда:) 
   }
 

Только что сам задавался такой проблемой.

void Del_comment(){//удаление собственных объектов (_comment - идентификационная часть имени объекта)
   int    obj_total=ObjectsTotal();
   string name;
   for(int i=obj_total+1;i>-1;i--){
     name=ObjectName(i);   
     if(StringFind( name,_comment,0)>-1) ObjectDelete(name);
   }
   return;
}   
 

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

 
SK. писал(а) >>

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

Не знаю, по мне Ваш вариант, это действительно танцы с бубном. Зачем делать два прохода, если все возможно сделать за один?

 
SK. >>:

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

Не мне с Вами спорить, но и простой вариант работает, ни одного сбоя не замечено.

 
Roger писал(а) >>

Не знаю, по мне Ваш вариант, это действительно танцы с бубном. Зачем делать два прохода, если все возможно сделать за один?

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

Например, в моём коде написано:

   ObjectName(k);             // Извлекаем имя объекта

Порассуждаем немного по-простому, по рабоче-крестьянски.

Пусть в 00:00 у нас было 10 объектов. Программа работает себе, никто ничего не удаляет. Пусть, мы просто опрашиваем объекты.

Пусть имена объектов идут подряд: Name_1, Name_2, Name_3, и т.д.. Name_10. Здесь индекс k совпадает с циферкой в названии.

10 объектов, 10 имён подряд.

.

В некоторый момент объект Name_5, удаляется. Осталось 9 объектов.

Спрашивается:Как имена объектов (циферки в имени) будут совпадать с индексом k? Ответ не очевиден. Очевидно только, что объект удалён из середины списка, т.е. понятно, что рано или поздно объекты будут перенумерованы подряд. Но когда это произойдёт?

Вариант 1. Например, можно предположить, что терминал не изменит индексы объектов в течение вего сеанса функции start(), аж до тех пор, пока не встретится return. Код granit77 написан исходя из этого предположения. Может быть, что это так и есть, но уверенности в этом нет. Легко пропустить ошибку, исследуя этот вариант, если все без исклчения объекты нужно удалять. Результат будет положительным.

Вариант 2. Можно предположить, что объекты перенумеруются в результате исполнения RefreshRates(). А почему нет? Вполне допустимо.

Вариант 3. Можно предположить, что объекты перенумеруются в результате исполнения WindowRedraw(). Тоже может быть.

Вариант 4. Возможны и другие варианты, например, при обращении к некоторому свойству объекта, при увеличении количества объектов, при изменении свойства объекта и т.д.

Наконец, нет никакой уверенности, что принятая в текущем билде концепция будет сохранена в следующем билде.

--

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

На первом этапе объекты опрашиваются (чем скорее, тем лучше) и имена назначенных к удалению запоминаются.

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

 
granit77 писал(а) >>

Не мне с Вами спорить, но и простой вариант работает, ни одного сбоя не замечено.

Работает. Именно жирное. А главное в нем - подчеркивание. Диалог-то не о коде, а о концепции на примере кода.

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

удаление должно быть отделено от анализа

и [анализ должен быть проведен]

чем скорее, тем лучше

Я выделил бы жирным еще следующее:

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

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