Ir para conteúdo

POWERED BY:

Arquivado

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

Luan Rodrigues

Loop com VB e Flash

Recommended Posts

\\\\\\ INICIO BLABLABLA \\\\\\

 

Galera,

 

Estou desesperado, cidadãos de boa alma, hora de ajudar! kkk

 

Estou fazendo um CD de busca de empresas com Flash e VB6.

Falta um detalhe, porém TENHO que entregar isso pronto segunda pela manhã.

 

Se houver alguém interessado em resolver o problema eu descolo uma graninha e passo o link com o material.

 

\\\\\\ FIM BLABLABLA \\\\\\

 

 

Meu flash tem uma função que aguarda a mudança de uma variavel. Quando o VB muda essa variavel, uma função no flash é executada.

Porém, quando eu coloco a mudança de variavel em um LOOP, desejando que a função seja executada n vezes, isso não ocorre. O flash só executa 1 vez.

Vou exibir uma versão simples do meu programa, apenas com a parte que nos interessa:

 

FLASH

// this function in flash makes a VB call and waits until the variable is set to some value from VB
function CallVBFunction() {
	fscommand("Test", "Test"); // function call to VB
	keepWaitingForResponse(); // call the flash function
}

// this function doesn’t go ahead until the VBCalling is set from VB
function keepWaitingForResponse() {
	_global.intervalID = setInterval(
		function () { // this function is called ever 100 ms until the intervalID is cleared
			if (VBCalling != undefined) {
			VariableReturned(VBCalling);
		}
	}, 100);
}

// this function is called only after the variable is set from VB
function VariableReturned(value) {
	VBCalling = undefined;
	// anexa "attach" um Movie Clip article ao scrollHolder e dá-lhe um nome de instancia unico
	scrollHolder.attachMovie("article_MC", "article"+i, i+10);
	// define a varavel local tMovie para referir o novo article anexado "attached", assim não temos que escrever muito mais 
	var tMovie = scrollHolder['article'+i];
	
	// posiciona o novo Movie Clip anexado "attached"
	tMovie._x = 0;
	tMovie._y = tMovie._height * i;
	
	// define o conteudo da text field do novo Movie Clip anexado "attached"
	tMovie.articleLabel.text = "Este é o artigo nº" + i;
}

CallVBFunction();

VB

Private Sub Form_Load()
    Form1.Width = 13700
    Form1.Height = 11000
    
    flaTeste.Movie = App.Path & "\scrollBarMC_Complete.swf"
    flaTeste.Left = 0
    flaTeste.Top = 0
    flaTeste.Width = 13400
    flaTeste.Height = 10410
    
    i = 0
    Do Until i <> 10
        flaTeste.SetVariable "VBCalling", "x"
        flaTeste.SetVariable "i", i
        i = i + 1
    Loop
    
    flaTeste.Play
    
End Sub

É como se eu fizesse um loop no flash...

Se você para essa aplicação seria estúpido fazer com VB, porém eu coloco variáveis de consulta a banco de dados em cada instancia do article_MC.

 

Imasters, não sei o que fazer, imploro ajuda!

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu acho que é porque o interval do flash não consegue perceber a mudança da variável no seu loop no VB. Acho que só conseguiria se você só mudasse a variável no VB a cada 100 ms.

 

Eu não programo em VB, mas facilitaria se você pudesse chamar um método ao invés de fazer essa "cambiarra" com variáveis.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu acho que é porque o interval do flash não consegue perceber a mudança da variável no seu loop no VB. Acho que só conseguiria se você só mudasse a variável no VB a cada 100 ms.

 

Eu não programo em VB, mas facilitaria se você pudesse chamar um método ao invés de fazer essa "cambiarra" com variáveis.

 

Obrigado pela resposta Bruno e concordo plenamente que seria melhor chamar um método ou função diretamente do VB, mas isso não é possível...

Pra isso usei essa função na "gambiarra" para chamar a função do flash...

A função funciona quando mudo a variável, mas não consigo chamá-la de novo, mesmo zerando novamente essa variavel e chamando a função que aguarda a resposta do VB.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Porque em vez do setInterval você não usa a opção watch do flash AS 2?

 

Ahh num sabe usar o watch.... ok... mas pra isso que existe o poderoso help :P

 

Exemplo da propria adobe:

// Create a new object
var myObject:Object = new Object();

// Add a property that tracks speed
myObject.speed = 0;

// Write the callback function to be executed if the speed property changes
var speedWatcher:Function = function(prop, oldVal, newVal, speedLimit) {
 // Check whether speed is above the limit
 if (newVal > speedLimit) {
 trace ("You are speeding.");
 }
 else {
 trace ("You are not speeding.");
 }
 
 // Return the value of newVal.
 return newVal;
}
// Use watch() to register the event handler, passing as parameters:
// - the name of the property to watch: "speed"
// - a reference to the callback function speedWatcher
// - the speedLimit of 55 as the userData parameter
myObject.watch("speed", speedWatcher, 55);

// set the speed property to 54, then to 57
myObject.speed = 54; // output: You are not speeding
myObject.speed = 57; // output: You are speeding

// unwatch the object
myObject.unwatch("speed");


myObject.speed = 54; // there should be no output

 

Ou seja o que o watch faz... ele fica verificando a variavel... se ouver qualquer tipo de modificação nela... ele chama uma função...

E assim vai.

 

Eu uso isso para player de video e mp3 que usam javascript para trocar variaveis internas no flash.

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

// Create a new object
var i:Object = new Object();

// Add a property that tracks value
i.value = -1;

// Write the callback function to be executed if the value property changes
var valueWatcher:Function = function() {
	container.loadMovie("article_mc.swf", "empresa"+i);
	var tMovie = container["empresa"+i];
        tMovie.label1.text = "teste";
	tMovie._x = 86;
	tMovie._y = (tMovie._height * i);
}


i.watch("value", valueWatcher);

i.value = 1;
i.value = 2;

stop();

Muito obrigado Berseck, isso já limpou muito meu código...

Mas agora não estou conseguindo acessar os métodos _x e _y, entretanto, consigo acessar o valor da label =S

 

O que está errado?

Compartilhar este post


Link para o post
Compartilhar em outros sites

LoadMovie

 

Não recebe os valores _x e _y... você pode alterar os mesmos com loadClip e a classe MovieClipLoader

 

Se você quiser acessar o x e o y ali tem que acessar assim:

// Create a new object
var i:Object = new Object();

// Add a property that tracks value
i.value = -1;

// Write the callback function to be executed if the value property changes
var valueWatcher:Function = function() {
 container.loadMovie("article_mc.swf", "empresa"+i);
 container["empresa"+i].label1.text = "teste";
 container["empresa"+i]._x = 86;
 container["empresa"+i]._y = (container["empresa"+i]._height * i);
}


i.watch("value", valueWatcher);

i.value = 1;
i.value = 2;

stop();
Mas mesmo assim não deve funcionar...

 

O height vai dar sempre 0, pois esse valor não é carregado pelo loadMovie

 

Então estude sobre MovieClipLoader e loadClip

 

Abraços

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.