Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 12-01-2005, 13:41   #1 (permalink)
Neuer User
 
Registriert seit: Jan 2005
Beiträge: 28
boolean toggle auf watch variable

hi,

ich habe eine variable die ich mit watch überwache und an einen callback sende. das ganze funktioniert auch ganz gut wenn ich die variable wie folgt ändere:

if ( InterruptPreload == true )
InterruptPreload = false;
else
InterruptPreload = true;

wenn ich allerdings

InterruptPreload = Boolean ( !InterruptPreload );

mache wird der wert von InterruptPreload nie wechseln. wenn ich die variable nicht watche funktioniert das allerdings bestens. irgendwie komisch oder?

greetz
killkolor
killkolor ist offline   Mit Zitat antworten
Alt 12-01-2005, 13:43   #2 (permalink)
mod_rewrite
 
Benutzerbild von sonar
 
Registriert seit: Feb 2003
Ort: München
Beiträge: 15.621
Und wenn du
ActionScript:
  1. InterruptPreload = !InterruptPreload;
schreibst..?

(wozu soll denn das mit dem Boolean davor gut sein?)
__________________
RTFM
Wie man Fragen richtig stellt.

Achim Bindannmalweg

Money makes the world go round, fear makes it turn much faster.
(New Model Army)
sonar ist offline   Mit Zitat antworten
Alt 12-01-2005, 13:49   #3 (permalink)
Neuer User
 
Benutzerbild von the binary
 
Registriert seit: Jul 2001
Ort: Berlin | Friedrichshain
Beiträge: 3.561
@sonar : TypeCasting...

überprüfe mal, welchen typ deine variable hat...

PHP-Code:
var b:String '0';
var 
t:Boolean;

traceBoolean(!b) );
traceBoolean(b) );


var 
0;
var 
t:Boolean;

traceBoolean(!b) );
traceBoolean(b) ); 

gruss
__________________
8bm | join ff@BOINC
formpackage.org | audiohunter.de | problematica.de | 8ball-media.de/blog | taikonauten.cn
the binary ist offline   Mit Zitat antworten
Alt 12-01-2005, 15:04   #4 (permalink)
querdenker
 
Benutzerbild von kelor
 
Registriert seit: Jun 2001
Ort: formel1-stadt hockenheim
Beiträge: 4.731
das ganze watch funktioniert genau so, wie es sollte..*mal anmerk*

ich empfehle mal: lies die referenz! da steht nämlich manchmal kluges drin..
undes ist logisch, dass das so nicht hinhauen kann.

wenn du nämlich ne watchpoint definierst auf ne var, dann ist der immer aktiv, und zwar schneller als die polizei...
änderst du also in deiner callback-funktion die gewatchte eigenschaft, dann wird logischerweiße auch der watch ausgelöst.
das heißt im klartext, der wird unendlich oft ausgelöst, wenn du in der callback den wert von var änderst.

bsp:
ActionScript:
  1. var InterruptPreload:Object = new Object ();
  2. InterruptPreload.interrupt = false;
  3.  
  4. InterruptPreload.watch ('interrupt', handle_interrupt );
  5.  
  6. function handle_interrupt ():Void{
  7.           trace('interrupt changed');
  8.           InterruptPreload.interrupt = !InterruptPreload.interrupt;
  9.           trace('after change interrupt is : '+InterruptPreload.interrupt);
  10. }
  11.  
  12.  
  13. btn.onPress = function(){
  14.     InterruptPreload.interrupt = true;
  15. }

nette idee...aber du änderst ja den wert, also wird, noch während die funktion läuft, die funktion erneut aufgerufen, und so ändert das ding ständig den wert und immer wieder gibt es aufrufe der funktion...
dass da einfach irgendwann 'undefined' rauskommen muss liegt auf der hand.

lösung:
mal lese die referenz!
man watche nicht nur, sondern man unwatche auch noch ..

dann sieht das ganze so aus und funktioniert auch wunderprächtig
(wenn der unwatch VOR allem anderen steht, besonders VOR der eigentlichen änderung, sonst wird der unwatch nicht mehr ausgeführt, da watch die fähigkeit besitzt IN einen laufende funktion einzugreifen..

ActionScript:
  1. var InterruptPreload:Object = new Object ();
  2. InterruptPreload.interrupt = false;
  3.  
  4. InterruptPreload.watch ('interrupt', handle_interrupt );
  5.  
  6. function handle_interrupt ():Void{
  7.               // zuerst ent-watchen!
  8.           InterruptPreload.unwatch('interrupt');
  9.           trace('interrupt changed');
  10.                   // dann wieder ändern!
  11.           InterruptPreload.interrupt = !InterruptPreload.interrupt;
  12.           trace('after change interrupt is : '+InterruptPreload.interrupt);
  13.                   // und erst jetzt zum schluss wiueder den watch drauf setzen, sonst bekommt man n karussell...*g*
  14.           InterruptPreload.watch ('interrupt', handle_interrupt );
  15. }
  16.  
  17.  
  18. btn.onPress = function(){
  19.     InterruptPreload.interrupt = true;
  20. }

achja: ein 'danke' wär nett...


greetz

kelor

Geändert von kelor (12-01-2005 um 15:05 Uhr)
kelor ist offline   Mit Zitat antworten
Alt 12-01-2005, 15:17   #5 (permalink)
Neuer User
 
Benutzerbild von the binary
 
Registriert seit: Jul 2001
Ort: Berlin | Friedrichshain
Beiträge: 3.561
von mir bekommste ein 'NICE'
__________________
8bm | join ff@BOINC
formpackage.org | audiohunter.de | problematica.de | 8ball-media.de/blog | taikonauten.cn
the binary ist offline   Mit Zitat antworten
Alt 12-01-2005, 15:33   #6 (permalink)
querdenker
 
Benutzerbild von kelor
 
Registriert seit: Jun 2001
Ort: formel1-stadt hockenheim
Beiträge: 4.731
aaabbber!
wem ist der 'knacks' an der sache aufgefallen?*gugg*

noch bevor der befehl vom btn, den interrupt zu ändern, durchgeführt werden konnte, hat der watchpoint zugeschlagen.
dieser wird VOR ALLEM ANDEREN, auch vor dem script, dass die eigentliche änderung bringen sollte, ausgeführt.
das heißt - in der callbackfunktion ist der wert von interrupt NOCH false - auch wenn außerhalb der funktion der wert bereits true ist...

aus diesem grund ist diese bsp da oben nur bedingt brauchbar, da man nicht innerhalb der cb die gewatchte eigenschaft ändern sollte...*mal anmerk*

leicht zu sehen, wenn ihr das trace ein bischen anders gestaltet...
ActionScript:
  1. var InterruptPreload:Object = new Object ();
  2. InterruptPreload.interrupt = false;
  3.  
  4. InterruptPreload.watch ('interrupt', handle_interrupt );
  5.  
  6.  
  7. function handle_interrupt ():Void{
  8.           InterruptPreload.unwatch('interrupt');
  9.           trace('interrupt changed ...it is :'+InterruptPreload.interrupt);
  10.           InterruptPreload.interrupt = (!InterruptPreload.interrupt);
  11.           trace('after change interrupt is : '+InterruptPreload.interrupt);
  12.           InterruptPreload.watch ('interrupt', handle_interrupt );
  13. }
  14.  
  15.  
  16. btn.onPress = function(){
  17.     InterruptPreload.interrupt = true;
  18. }

einfach mal testen und staunen...
innerhalb der fkt ist der wert noch nicht geändert.
außerhalb wohl...wenn man nun aber inner halb nochmals ändert, bekommt man diesne wert.

witzigerweiße wird der watchpoint auch dann ausgelöst, wenn der wert gar nicht geändert wurde, sondern einfach bereits dann, wenn die eigenschaft, die man überwacht, aufgerufen wird.
unabhängig davon, ob ein wert geändert wird, oder nicht..


greetz

kelor

Geändert von kelor (12-01-2005 um 15:34 Uhr)
kelor 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 21:35 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele