Графические объекты

 

Некий скрипт рисует на графике кучу прямоугольников

в какой то момент, когда их нужно удалить выполняется следующий кусок

for(int b = 0; b < ObjectsTotal(); b++)  {
  if(ObjectType(ObjectName(b)) == OBJ_RECTANGLE)  {
     ObjectDelete(ObjectName(b));
  }
}
WindowRedraw();

Вроде по логике должно удалиться все за раз, но вопреки ожиданиям удаляется лишь часть объектов, причем если запустить еще раз, удаляется еще часть. В итоге для того чтобы очистить график полностью, надо прогнать раз 10.

в чем подвох, подскажите...

 
Greeen:

в чем подвох, подскажите...

for(int b = ObjectsTotal()-1; b >= 0; b--)
 
Talex:
Greeen:

в чем подвох, подскажите...

for(int b = ObjectsTotal()-1; b >= 0; b--)

Да, и если бы вместо

ObjectDelete(ObjectName(b));

использовалось

if (!ObjectDelete(ObjectName(b))) Print("Не удалось удалить объект "+ ObjectName(b)+". Код ошибки = "+GetLastError());
то ошибку удалось бы найти быстрее.
 
Rosh:
Talex:
Greeen:

в чем подвох, подскажите...

for(int b = ObjectsTotal()-1; b >= 0; b--)

Да, и если бы вместо



ObjectDelete(ObjectName(b));

использовалось


if (!ObjectDelete(ObjectName(b))) Print("Не удалось удалить объект "+ ObjectName(b)+". Код ошибки = "+GetLastError());
то ошибку удалось бы найти быстрее.

Глюк с удалением объектов действительно есть. И проблема в том, что отловить его не получается - ошибки никакой не выдается.

Скорее всего, это получается при достаточно большом первоначальном количестве объектов (порядка 100 и более).

Пока борюсь с этим тупо прогоняя процедуру удаления 10 раз подряд (причем цифра не с потолка взята - при меньшем количестве прогонов удаления - объекты остаются).

 

lotos4u писал (а):

Пока борюсь с этим тупо прогоняя процедуру удаления 10 раз подряд (причем цифра не с потолка взята - при меньшем количестве прогонов удаления - объекты остаются).

А может все-таки перевернуть цикл?

 
ShestkoFF:
Greeen:

Некий скрипт рисует на графике кучу прямоугольников

в какой то момент, когда их нужно удалить выполняется следующий кусок

for(int b = 0; b < ObjectsTotal(); b++)  {
  if(ObjectType(ObjectName(b)) == OBJ_RECTANGLE)  {
     ObjectDelete(ObjectName(b));
  }
}
WindowRedraw();

Вроде по логике должно удалиться все за раз, но вопреки ожиданиям удаляется лишь часть объектов, причем если запустить еще раз, удаляется еще часть. В итоге для того чтобы очистить график полностью, надо прогнать раз 10.

в чем подвох, подскажите...


Тут явная ошибка в коде:

Вы запускаете цикл от 0 до ObjectsTotal(), но в самом цикле этот ObjectsTotal() меняется, потому как за каждый проход цикла удаляется один объект. Поэтому следует написать так:

int objects_amount = ObjectsTotal();
for(int b = 0; b < objects_amount; b++)  {
  if(ObjectType(ObjectName(b)) == OBJ_RECTANGLE)  {
     ObjectDelete(ObjectName(b));
  }
}
WindowRedraw();

угу и тогда не надо переворачивать цикл...

- но по мне проще перевернуть - код короче и компактней


Greeen - переверните цикл и все!


lotos4u - не выдается ошибка ? а приведите кусочек кода в котором вы не видите ошибку - хотя полагаете что явно ее обрабатываете



возможно у вас там не совсем корректно что то




 
YuraZ:

угу и тогда не надо переворачивать цикл...

Нужно. Либо тогда совсем так:

int objects_amount = ObjectsTotal();
for ( int b = 0; b < objects_amount; b ++ )
{
  if(ObjectType(ObjectName(b)) == OBJ_RECTANGLE)
  {
     ObjectDelete(ObjectName(b));
     b --;
  }
}
WindowRedraw();
 
YuraZ:
Вы запускаете цикл от 0 до ObjectsTotal(), но в самом цикле этот ObjectsTotal() меняется, потому как за каждый проход цикла удаляется один объект. Поэтому следует написать так:

Greeen - переверните цикл и все!


lotos4u - не выдается ошибка ? а приведите кусочек кода в котором вы не видите ошибку - хотя полагаете что явно ее обрабатываете


возможно у вас там не совсем корректно что то

Больше спасибо все уже заработало. Я тоже проглядел, что в условии стояло ObjectsTotal() и цикл был прямой.

 
komposter писал (а):

Нужно. Либо тогда совсем так:

int objects_amount = ObjectsTotal();
for ( int b = 0; b < objects_amount; b ++ )
{
  if(ObjectType(ObjectName(b)) == OBJ_RECTANGLE)
  {
     ObjectDelete(ObjectName(b));
     b --;
  }
}
WindowRedraw();

А вот это замечательно.

Я никогда так не делал. Поставить b-- в цикле по b, где условием b++  и количество объектов уменьшается на каждой итерации - это красиво.

Я бы сказал, тонко.

Люблю всё красивое:)

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