Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Isaque Martins

addChild e removeChild

Recommended Posts

Olá

 

já me deparei com esse problema mais de uma vez e ainda nada

 

acho que o mais difícil pra quem tá começando é a forma de pensar as soluções... mas vamos ao problema

 

tenho um addChild dentro de uma função q está na timeline e o removeChild dentro de outra função subsequente

 

function adiciona(evt:Event):void {
	externo.addChild(interno);
}

function remove(evt:Event):void {
	externo.removeChild(interno);
}

quando executa a funçao remove gera o seguinte erro:

 

ArgumentError: Error #2025: O DisplayObject fornecido deve ser filho do responsável pela chamada.

at flash.display::DisplayObjectContainer/removeChild()

at index_fla::MainTimeline/remove()

 

ou seja, só não dá erro se os dois estiverem dentro da mesma função:

 

tem alguma forma diferente de pensar isto?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acrescente mais detalhes do que você está tentando fazer.

 

Inclusive o código.

 

É carregar aquivos externos em um container?

 

Está usando botões com evento de click?

 

Conforme o caso pode usar apenas o addChild, mas precisa criar uma variável do tipo Loader e especificar dentro da função. Exemplo:

 

carregar.load(new URLRequest("home.swf"));

Abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

ok Elektra!

 

tive essa dúvida em duas ocasioes uma trabalhando com swf's externos, e outra trabalhando com shapes e sprites criados dinamicamente

 

por exemplo

 

eu tenho uma classe para cada página que desenha na tela seu conteúdo, então ao clicar no botão correspondente cria um novo objeto desta classee adiciona-o ao palco, note que o addChild está dentro desta função q adiciona,

 

quando clicado em outro botão chamaria outra função q contém o removeChild, sempre dá o erro dizendo que o objeto deve ser filho do chamador,

 

não sei se o erro se dá porque os dois não estão na msm função ou porque o mesmo objeto que o adicionou(no caso o mesmo botão), é o que tem q fazer sua remoção...

 

 

De qualquer forma minha dúvida mais quanto a forma de pensar um sistema, do que propriamente o código neste caso...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Beleza! Agora outros colegas que dominam o AS3 terão melhores condições de tentar auxiliar.

 

Adicionar informações sobre o que precisamos com clareza, evita retrabalho de ambas as partes.

 

Vou acompanhar o seu tópico para aprender.

 

Abraços o boa sorte.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia,

 

Não é um erro de não instanciar o objeto, já que daria erro logo de cara e não ao executar a função:

 

1120: Access of undefined property interno

 

Então criei os dois objetos e executei a função:

 

var externo:Sprite = new Sprite();
var interno:Sprite = new Sprite();

function adiciona(evt:Event):void {
        externo.addChild(interno);
}

function remove(evt:Event):void {
        externo.removeChild(interno);
}

remove(new Event(Event.CHANGE))

E consegui chegar ao mesmo resultado:

 

ArgumentError: Error #2025: O DisplayObject fornecido deve ser filho do responsável pela chamada.

at flash.display::DisplayObjectContainer/removeChild()

at Untitled_fla::MainTimeline/remove()

at Untitled_fla::MainTimeline/frame1()

 

A própria mensagem já diz: O DisplayObject fornecido deve ser filho do responsável pela chamada.

 

Acontece que quando executei a função interno não era filho de externo, é por isso que quando você coloca os dois juntos funciona... primeiro ele adiciona, depois remove.

 

Tudo que você tem de fazer é verificar se ele é filho ou não do objeto antes de remove-lo.

 

function remove(evt:Event):void {
	if(interno.parent == externo) {
		externo.removeChild(interno);
		trace("Removido");
	}
}

 

Na verdade, você até pode fazer com que ele seja removido de qualquer lugar que ele esteja:

 

function remove(evt:Event):void {
	if(interno.parent != null) {
		interno.parent.removeChild(interno);
	}
}

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Foxn

 

Cheguei a conclusão que o erro só se manifesta quando o objeto a ser removido não está no palco. Então como você disse tem que se fazer uma verificação...

 

Se estivéssemos trabalhando com Movieclip resolveria assim:

 


function adiciona(evt:MouseEvent):void {

	addChild(mc);
	mc.enabled = true;
	
}

function remove(evt:Event):void {
	if(mc.enabled == true) {
		removeChild(mc);
		mc.enabled = false;
		
	} else {
		
	}
}

desse modo não dá o erro

 

 

porém, nesse caso estamos trabalhando com Sprite

 

como faço essa verificação já que a classe Sprite não suporta a propriedade enabled

 

tentei como você postou:

 

function remove(evt:Event):void {
	if(sprite != null) {
		removeChild(sprite);
		
	} else {
		
	}
}

e continuou dando o mesmo erro como se nem existisse a condicional

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.