Показать сообщение отдельно
Старый 01.02.2012, 14:48
Vitalya вне форума Посмотреть профиль Отправить личное сообщение для Vitalya Найти все сообщения от Vitalya
  № 23  
Ответить с цитированием
Vitalya

Регистрация: Jan 2012
Сообщений: 26
Вот если кому нужно будет.
Функция поиска Объекта в контейнере без использования РЕКУРСИИ, с минимумом запусков функций(т.к функция дорогая для Flash), и с фиксированным Вектором всего на 2 элемента.

Код AS3:
public static function searchByNameDO1( owner: DisplayObjectContainer, name: String ): DisplayObject 
		{
			trace("Вход");
			var first:MovieClip = new MovieClip();
			first.name = 'null';
			first.addChild(owner);
 
			if( owner == null ) return null;//Проверяем основной контейнер на пустоту
 
			var stackIdx:Vector.<uint> = new Vector.<uint>(2);
 
			var lastElVec:uint = 0;//указатель на последний элемент вектора 
 
			var currContainer:DisplayObject  = owner; 
 
			var curChildIndex:int = 0;//счетчик углубленности в контейнере 
 
			trace("curr=", currContainer.name );
			do
			{ 
				// Имитация захода внутрь
				if( currContainer is DisplayObjectContainer )
				{
 
					trace("currContainer is DisplayObjectContainer, curChildIndex="+curChildIndex);
					// идем внутрь
 
					if( curChildIndex < (currContainer as DisplayObjectContainer).numChildren ) 
					{
 
						lastElVec++;//перетаскиваем указатель Вправо
						stackIdx[lastElVec] = curChildIndex;//stackIdx.push( curChildIndex );
 
						currContainer = (currContainer as DisplayObjectContainer).getChildAt( curChildIndex );
 
						curChildIndex = 0;
						trace("идем внутрь", currContainer.name );
						continue;
					}
				}
				// проверка на доститжение результата
				trace( "проверка на доститжение результата" );
				if( currContainer.name == name ) return currContainer;
 
				// Идем наверх
 
				// выше некуда
				if( stackIdx.length == 0 )
					return null;
 
				// выше есть куда
				trace("выше есть куда до:",curChildIndex);
				//curChildIndex = stackIdx.pop()+1;
				curChildIndex = stackIdx[lastElVec]; 
				lastElVec--;
				curChildIndex++;
 
				trace("выше есть куда после:",curChildIndex);
				currContainer = currContainer.parent;//возвращаемся к родителю
 
				// Если мы поднялись до уровня вызова
			} while ( currContainer != first ); 
 
			return null;	
		}