Zurück   Flashforum > Flash > Stuff

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 02-05-2008, 20:27   #1 (permalink)
Neuer User
 
Benutzerbild von _crypto_
 
Registriert seit: Mar 2006
Beiträge: 1.573
[STUFF] DataBinding über Signal-Slot

Wem es nicht reicht nur "Events" über Flashs EventDispatcher zu
schmeißen und/oder jede der Klassen dafür vom EventDispatcher
erben zu lassen, hab ich jetzt mal einen kleinen Weg gebastelt um
simples Databinding zu ermöglichen, also Kommunikation zwischen
Objekten, die sich nicht unbedingt kennen müssen.

Das Prinzip ist einfach:
Ein Signal wird mit einem Slot verbunden.
Wenn das Signal nun entsprechende emitiert wird,
wird die Slot-Funktion aufgerufen.

ActionScript:
  1. // erstmal muss alles importiert werden ...
  2. import std.signal.*;
  3.  
  4. /*
  5. die funktion die gecalled werden soll,
  6. (info: das caller QSignal ist optional und wird mitgegeben,
  7. wenn das signal gecalled wird, das ermöglicht es das signal
  8. zu entfernen auch wenn die funktion den caller nicht kennt!)
  9. */
  10. function hello( m: String, caller: QSignal ): void {
  11.     trace( m );
  12.     // signal wieder entfernen um einen erneuten aufruf zu vehindern.
  13.     SignalDispatcher.disconnect( caller, SIGNAL(arguments.callee) );
  14. }
  15.  
  16. // die funktion die das signal schmeißen muss(!)
  17. function emit(): void {
  18.     // call( signal: QSignal, caller: Function );
  19.     SignalDispatcher.call( signal, arguments.callee );
  20. }
  21.  
  22. var signal: QSignal = SIGNAL( emit );
  23. var slot:   QSignal = SIGNAL( hello );
  24.  
  25. // signal mit dem entsprechenden slot verbinden
  26. // connect( signal: QSignal, slot: QSignal [, ... parameters );
  27. SignalDispatcher.connect( signal, slot, "Hello" );
  28.  
  29. // und alles starten
  30. emit();

Um es korrekt zu halten, muss bei .call() der 2. Parameter arguments.calle sein.
Da es arguments.caller nichtmehr gibt, kann nur so überpfüt werden, dass der call von der richtigen Funktion aus stattfindet.

Ein call( signal, emit ) würde auch funktionieren, ist dann aber sinnlos, da ich dann auch gleich das ganze
vergessen kann

Trozdem hoff ich mal auf Kritik.
(Zur info noch: wer das arguments.caller ersetzen will, kann ja gerne mit getStackTrace() arbeiten, aber das funktioniert glaube ich nur im Debug Player)
Angehängte Dateien
Dateityp: rar SignalSlot-Package.rar (1,0 KB, 6x aufgerufen)
__________________

Currently working on:

- --- ---

-----------------------------------------------------------------
ActionScript 3.0, C++, Java, Delphi
_crypto_ ist offline   Mit Zitat antworten
Alt 02-05-2008, 20:56   #2 (permalink)
voidboy
 
Benutzerbild von rendner[i]
 
Registriert seit: Sep 2004
Ort: München
Beiträge: 5.588
Wozu eigentlich die Klasse "SIGNAL"?
Man könnte doch gleich direkt die Klasse "QSignal" nutzen.
__________________
ERROR: Signature is too large
rendner[i] ist offline   Mit Zitat antworten
Alt 02-05-2008, 21:23   #3 (permalink)
Neuer User
 
Benutzerbild von _crypto_
 
Registriert seit: Mar 2006
Beiträge: 1.573
Oh, das is wohl noch ein überbeibsel.
Hab das ganze ja von der Qt library nachgebaut, im sinne
von wie funktioniert das ganze.

ist natürlich egal ob ich jetzt eine funktion habe die mir ein signal
liefert oder ein konstruktur habe. hast recht
__________________

Currently working on:

- --- ---

-----------------------------------------------------------------
ActionScript 3.0, C++, Java, Delphi
_crypto_ 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 19:21 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele