Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 16-08-2004, 13:46   #1 (permalink)
lernwillig
 
Benutzerbild von Bugfixer
 
Registriert seit: May 2004
Ort: Berlin
Beiträge: 221
Variable ausserhalb der fnc aufrufen

Hi, ich krieg einfach den inhalt meiner variable einfach nicht aus der function raus, weder mit return, _root, oder _global.
Hat sicherlich mit dem intervall zu tun, aber komme nicht drauf was ich verändern muss.

Was mach ich falsch?

Code:
var onInterval = function (tf) {
	return test = "output";
};
var id = setInterval(onInterval, 5, this);
trace(test);

vielen dank im vorraus

gruss fabian

Geändert von Bugfixer (16-08-2004 um 13:47 Uhr)
Bugfixer ist offline   Mit Zitat antworten
Alt 16-08-2004, 14:03   #2 (permalink)
lernwillig
 
Benutzerbild von Bugfixer
 
Registriert seit: May 2004
Ort: Berlin
Beiträge: 221
Ah bin selber draufgekommen.

So gehts:

Code:
var onInterval = function (tf) {
	test = "output";
	return test;

};
var id = setInterval(onInterval, 5, this);
blub = onInterval();
trace(blub);
Bugfixer ist offline   Mit Zitat antworten
Alt 16-08-2004, 14:05   #3 (permalink)
MiM
Neuer User
 
Registriert seit: Sep 2001
Ort: Neckarsulm
Beiträge: 273
Ich denke hier liegt ein allgemeines Verständnisproblem vor. Nehmen wir an du hast folgende Function:
Code:
function onInterval(tf) {
  return "output";
};
Aufrufen tust du die Function wie folgt:
Code:
var result:String = onInterval("muh");
Wenn du die Methode nun vom Interval aufrufen lässt, dann kannst du das Resultat natürlich auch nicht abspeichern, weil der Aufruf nicht von dir sondern intern gemacht wird.
Code:
var id = setInterval(onInterval, 5, this);
Wenn du die Variable einfach auf _root setzen möchtest (was nicht seh schön/gut ist), dann brauchst du kein return. Dann sagst du einfach:
Code:
_root.test = "output";
MiM ist offline   Mit Zitat antworten
Alt 16-08-2004, 14:23   #4 (permalink)
lernwillig
 
Benutzerbild von Bugfixer
 
Registriert seit: May 2004
Ort: Berlin
Beiträge: 221
Hallo,

das hat mir von der verständnis schon mal weitergeholfen.

Zitat:
Wenn du die Variable einfach auf _root setzen möchtest (was nicht seh schön/gut ist), dann brauchst du kein return. Dann sagst du einfach:
Code:
_root.test = "output";
Habe ich vorhin auch shcon gelesen, die _root variante. Was wäre den eine saubere lösung?

Hier ist mal das ganze script, ich benötige test nach dem intervalldurchlauf zu weiterverarbeitung.

Code:
TextField.prototype.deCript = function(myMsg) {
	this.autoSize = true;
	// 
	var i = 0;
	var onInterval = function (tf) {
		if (i<myMsg.length) {
			var singleLetter = myMsg.substr(i, 1);
			if (singleLetter == " ") {
				singleLetter = " ";
			} else {
				singleLetter = "-";
			}
			tf.text += singleLetter;
			test += singleLetter;
			i++;
		}
		if (i == myMsg.length) {
			return test;
			clearInterval(id);
		}
	};
	var id = setInterval(onInterval, 5, this);
	trace(test);
	
	// Hier benötige ich test zur weiterverarbeitung
	
	
};

// Aufruf
var message1 = "Dies ist mein aufzubauender Text";
this.createTextField("myTxt1", 1, 0, 0, 1, 1);
myTxt1.deCript(message1);
Vielen dank

Fabian
Bugfixer ist offline   Mit Zitat antworten
Alt 16-08-2004, 16:24   #5 (permalink)
MiM
Neuer User
 
Registriert seit: Sep 2001
Ort: Neckarsulm
Beiträge: 273
Eine Methode direkt in die TextField Klasse zu setzen ist nie sauber.
Sauber wäre es wenn du eine eigene TextField Klasse schreibst, diese dann die eigentlich TextField Klasse erweitert. Dann musst du nur noch dein Textfeld mit dieser Klasse registrieren.
In dieser Klasse legst du eine Instanzvariable Namens test an. Dann deine Methode deCript() und noch eine Methode die z.B. onInterval() heißt (ein mehraussagender Name wäre besser).
Dann setzt du das Interval nicht via: setInterval(onInterval, 5, this); sondern via: setInterval(this, "onInterval", 5);. Jetzt wird die Methode onInterval() auf this aufgerufen. Dann benötigst du das Argument nicht, weil this in der Methode auf das Textfeld verweist und außerdem kannst du über this.test = "output" deine Varaible setzen.
Das wäre eine schöne objektorientierte Methode, wobei du natürlich einen etwas größeren Aufwand treiben musst.
MiM ist offline   Mit Zitat antworten
Alt 16-08-2004, 16:42   #6 (permalink)
querdenker
 
Benutzerbild von kelor
 
Registriert seit: Jun 2001
Ort: formel1-stadt hockenheim
Beiträge: 4.731
davon ab...
5 ist kein interval den flash noch korrekt hinbekäme...iss viel zu kurz...

und , noch wichtiger...

wenn du einen return setzt wird alles danch nicht mher ausgeführt...
oben in deinem bsp setzt du einen return und versuchst dann den interval zu löschen...
des geht net...*mal anmerk*

ansonsten hat MiM ja schon das wesentliche gesagt...

greetz

kelor
kelor ist offline   Mit Zitat antworten
Alt 16-08-2004, 16:47   #7 (permalink)
lernwillig
 
Benutzerbild von Bugfixer
 
Registriert seit: May 2004
Ort: Berlin
Beiträge: 221
Ah ok,

ich verstehe jetzt zwar was ich machen soll und auch das warum ist mir klar, allerdings noch nicht das wie.

Besonders dieser part:

Zitat:
Sauber wäre es wenn du eine eigene TextField Klasse schreibst, diese dann die eigentlich TextField Klasse erweitert. Dann musst du nur noch dein Textfeld mit dieser Klasse registrieren.
In dieser Klasse legst du eine Instanzvariable Namens test an. Dann deine Methode deCript() und noch eine Methode die z.B. onInterval() heißt (ein mehraussagender Name wäre besser).
Könnt ihr mir das vielleicht zeigen, ich will das unbedingt lernen. Soll ich ne neue klasse mit class anlegen ?

@kelor:
Habe während der suche nach ner lösung auch gesehen, das 5 viel zu kurz für ein intervall ist, aber danke nochmal

Zitat:
wenn du einen return setzt wird alles danch nicht mher ausgeführt...
oben in deinem bsp setzt du einen return und versuchst dann den interval zu löschen...
des geht net...*mal anmerk*
Kannst du mir bitte zeigen wie es richtig gehört?

Gruss Fabian

Geändert von Bugfixer (16-08-2004 um 16:49 Uhr)
Bugfixer ist offline   Mit Zitat antworten
Alt 17-08-2004, 07:37   #8 (permalink)
MiM
Neuer User
 
Registriert seit: Sep 2001
Ort: Neckarsulm
Beiträge: 273
Genau, eine neue Klasse mit class, die TextField erweitert.
Aber es gibt noch eine Kleinigkeit, die ich ganz vergessen hab, neben dem, was Kelor oben schon erklärt hat bezüglich return etc.

TextField.prototype.deCript = function(myMsg) {
var onInterval = function (tf) {
...
};
var id = setInterval(onInterval, 5, this);
trace(test);
// Hier benötige ich test zur weiterverarbeitung
};

Wenn du die Variable in der Methode onInterval() setzt, sei es auf _root oder auf dein Textfeld, wird sie dir trotzdem nie an der Stelle zur Verfügung stehen, an der du gerade trace(test) stehen hast. Die Methode onInterval() wird ja erst nach 5 Millisekunden aufgerufen (zumindest theoretisch) und in dieser Zeit ist die eigentliche Methode deCript() schon lang durchgelaufen.
Die Ausführung der Methode wird bei setInterval() nicht angehalten sondern einfach fortgeführt. Also setInterval() != Pause.
Wenn du die Verzögerung von 5 ms haben möchtest muss setInterval() also eine andere Methode aufrufen, und dieser dann den Wert von Variable test als Argument übergeben.
MiM ist offline   Mit Zitat antworten
Alt 17-08-2004, 10:30   #9 (permalink)
lernwillig
 
Benutzerbild von Bugfixer
 
Registriert seit: May 2004
Ort: Berlin
Beiträge: 221
Vielen dank für die zahlreichen erklärungsversuche.
Aber könnte mir bitte wer das anhand meines scriptes zeigen?

Ich lerne am besten aus beispielen und tue mich mit den theoretischen beschreibungen leider etwas schwer.

Vielen dank

Gruss Fabian

Geändert von Bugfixer (17-08-2004 um 14:53 Uhr)
Bugfixer ist offline   Mit Zitat antworten
Alt 17-08-2004, 14:55   #10 (permalink)
lernwillig
 
Benutzerbild von Bugfixer
 
Registriert seit: May 2004
Ort: Berlin
Beiträge: 221
MiM?

Könntest du mir bitte zeigen wie es anhand meines scripts funktioniert?
Bugfixer ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 08:25 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele