Zurück   Flashforum > Flash > ActionScript > ActionScript 3

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 28-01-2012, 21:29   #1 (permalink)
Neuer User
 
Registriert seit: Jan 2012
Beiträge: 3
Erkennen welcher Button gedrückt wurde

Hallo!

Ich bearbeite grad fürs Studium eine Aufgabe bei der wir mittels Flash eine interaktive Anleitung erstellen sollen.

Meine Daten stehen in einer XML-Datei. Aus den Überschriften, lasse ich mir Buttons erstellen, die dann direkt auf den Hilfetext verweisen sollen (bzw. ihn laden sollen).

Ich steh jetzt nur vor der Frage wie ich abfrage, welcher Button gedrückt wurde. Stehe da irgendwie grad total auf dem Schlauch.

Code:
for (var i:int=0;i<=xmlData.kapitel.hilfetext.ueberschrift.length()-1; i++){
		
		this["tf" + i] = new Button();
		menu1.addChild(this["tf"+i]);
		this["tf"+i].label=xmlData.kapitel.hilfetext.ueberschrift[i];
		trace("tf"+i);
		
		
		
		this["tf"+i].addEventListener(MouseEvent.MOUSE_UP, loadxmlelement);
}
Wäre nett, wenn mir jemand nen Denkanstoß verpassen könnte, vielleicht ist ja auch weg, die Buttons so zu generieren, ein Irrweg.
JochenKnochen ist offline   Mit Zitat antworten
Alt 28-01-2012, 21:54   #2 (permalink)
mod_rewrite
 
Benutzerbild von sonar
 
Registriert seit: Feb 2003
Ort: München
Beiträge: 15.621
Hi,

du könntest den Button-Instanzen "verwertbare" Namen geben und damit arbeiten, so in der Art:

PHP-Code:
// in der Schleife
this["tf" i].name "btn_" i;

// im MouseUp-Listener
traceevent.target.name.split("_")[1] ); 
Also im MouseUp-Listener das jeweilige 'i' des Buttons rausholen und anhand dessen die Aktion bestimmen, die ausgelöst werden soll o.ä.
__________________
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 28-01-2012, 22:03   #3 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.139
Besser wäre es, wenn du eine direkte Assozition herstellst, beispielsweise über ein Dictionary. Dann muss deine Anwendung nicht wissen, wie die Konvention für die Namensgebung der Buttons ist:
Code:
const dict:Dictionary = new Dictionary();
const button:Sprite = new Sprite();
button.addEventListener(MouseEvent.CLICK, button_clickHandler);
dict[button] = "Hello World";

function button_clickHandler(event:MouseEvent):void
{
  const sprite:Sprite = event.target as Sprite;
  if (sprite) trace(dict[sprite]);
}
Omega Psi ist offline   Mit Zitat antworten
Alt 29-01-2012, 10:16   #4 (permalink)
Neuer User
 
Registriert seit: Jan 2012
Beiträge: 3
Hey,

danke für eure Antworten! Hab mich für die erste Version entschieden, da mir Dictionarys nicht so geläufig sind und ich im ersteren auch nachvollziehen kann was überhaupt in den Anweisungen passiert.
JochenKnochen ist offline   Mit Zitat antworten
Alt 29-01-2012, 11:03   #5 (permalink)
Flash-Designer
 
Benutzerbild von Martin Kraft
 
Registriert seit: May 2006
Ort: Wiesbaden
Beiträge: 6.162
Da Dich ja noch niemand begrüßt hat: Willkommen im FlashForum!
Zitat:
Zitat von JochenKnochen Beitrag anzeigen
Hab mich für die erste Version entschieden, da mir Dictionarys nicht so geläufig sind und ich im ersteren auch nachvollziehen kann was überhaupt in den Anweisungen passiert.
Ich würde Dir trotzdem empfehlen Dich mal einem Weg zu beschäftigen*, der ohne dynamische Objektzugriffe auskommt. Die sind nämlich sehr unperformant, fehleranfällig und zudem schwer zu lesen. In AS1/2 war sowas zwar gang und gäbe, aber spätens seit AS3 gibt es bessere Wege. Insbesondere, wenn man zigmal nacheinander dasselbe Objekt mit der Klammersyntax anspricht, ist es an der Zeit stattdessen eine lokale Variable zu verwenden.

Auch beim Durchlaufen Deines XMLs kannst Du ganz auf [] und einen Index verzichten und stattdessen einfach eine for each-Schleife verwenden.

Und Dictionarys sind übrigens kein Hexenwerk, sondern ungemein praktisch. Sie funktionieren genauso wie Arrays, können aber statt Zahlen beliebige Objekte als Schlüssel verwenden.

Alles in allem könnte Dein Code so aussehen:
ActionScript:
  1. import flash.utils.Dictionary;
  2. import flash.events.MouseEvent;
  3.  
  4. var btn:Button;
  5. var hilfetextByButton:Dictionary;
  6.  
  7. for (var hilfetext:XML in xmlData.kapitel.hilfetext) {
  8.     btn = new Button()
  9.     btn.label = hilfetext.ueberschrift.toString();
  10.     btn.addEventListener(MouseEvent.MOUSE_UP, loadxmlelement);
  11.    
  12.     menu1.addChild(btn);
  13.     hilfetextByButton[btn] = hilfetext;
  14. }
  15.  
  16. function loadxmlelement(event:MouseEvent):void {
  17.     var hilfeText:XML = hilfetextByButton[event.currentTarget];
  18.     trace("Das zum Button gehörige XML: " + hilfetext);
  19.    
  20.     // Deine Aktionen
  21. }
*gerade im Studium geht's ja darum, was neues zu lernen und nicht nur auf ausgetrampelten (Irr-)Wegen zu bleiben
__________________
Viele Grüße // Martin

Martin Kraft // Interaktionsdesign

Hilfreiche Websites:
// Hilfe zur Adobe Flash Plattform
// ActionScript 2 Referenz
// ActionScript 3 Referenz
// ActionScript 3 Arbeitshandbuch
// weitere Flash Ressourcen

Bitte keine Flashfragen per PM oder Profilnachricht! Dafür ist das Forum da!

Geändert von Martin Kraft (29-01-2012 um 11:09 Uhr)
Martin Kraft ist offline   Mit Zitat antworten
Alt 29-01-2012, 11:57   #6 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.139
Eine andere, ähnliche Art und Weise wäre es, über eine zweite Map die Assoziation herzustellen:
Code:
const map:Object = {};
const button:Sprite = new Sprite();
button.addEventListener(MouseEvent.CLICK, button_clickHandler);

setTextFor(sprite.name = "key1", "Hello world");

function button_clickHandler(event:MouseEvent):void
{
  const sprite:Sprite = event.target as Sprite;
  if (sprite) trace(getText(sprite.name));
};

function getTextFor(key:String):String
{
  if (!key || key == '')
    throw new ArgumentError('Key must not be empty or null.');;

  if (!map.hasOwnProperty(key))
    throw new ArgumentError('Key not found.');;

  return map[key];
}

function setTextFor(key:String, text:String = ""):void
{
  if (!key || key == '')
    throw new ArgumentError('Key must not be empty or null');;

  map[key] = text;
}
Du benutzt einfach die name Eigenschaft als id für die Map. Zugriffe so zu kapseln erleichtert oft die Fehlersuche im Nachhinein.

Geändert von Omega Psi (29-01-2012 um 18:00 Uhr)
Omega Psi ist offline   Mit Zitat antworten
Alt 29-01-2012, 12:09   #7 (permalink)
Flash-Designer
 
Benutzerbild von Martin Kraft
 
Registriert seit: May 2006
Ort: Wiesbaden
Beiträge: 6.162
Zitat:
Zitat von Omega Psi Beitrag anzeigen
Du benutzt einfach die name Eigenschaft als id für die Map. Zugriffe so zu kapseln erleichtert oft die Fehlersuche im Nachhinein.
Das fängt zwar die Fehler ab, macht IMHO die Sache im Kern aber nicht wirklich besser und bläht sie nebenbei durch zusätzliche Werte und Abhängigkeiten unnötig auf. Was passiert z.B. wenn sich irgendjemand außerhalb dieser Konstruktion an der name-Eigenschaft vergreift?!
__________________
Viele Grüße // Martin

Martin Kraft // Interaktionsdesign

Hilfreiche Websites:
// Hilfe zur Adobe Flash Plattform
// ActionScript 2 Referenz
// ActionScript 3 Referenz
// ActionScript 3 Arbeitshandbuch
// weitere Flash Ressourcen

Bitte keine Flashfragen per PM oder Profilnachricht! Dafür ist das Forum da!

Geändert von Martin Kraft (29-01-2012 um 12:11 Uhr)
Martin Kraft ist offline   Mit Zitat antworten
Alt 29-01-2012, 12:28   #8 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.139
Naja, Seiteneffekte können immer auftreten. Daher das schmeißen der Fehler.

Was ist wenn man in deinem Beispiel das Dictionary "nullt"? Das var macht die Sache nicht sicherer und daher sind solche Argumente auch immer schwer haltbar. So gesehen sind so ziemlich alle Beispiele hier im Forum potenziell schlecht, da sie Risiken im Laufzeit verhalten aufweisen.

-> Es gibt keine optimale Lösung, nur eine Menge von Kompromissen und man muss sich darüber im Klaren sein. Und auch wenn die Zugriffsoperationen den code aufblähen, so helfen sie beim Suchen der Fehler und beim Debuggen.

Da man in ActionScript kaum ohne Seiteneffekte arbeiten kann, würde ich auch mit gekapselten Dictionarys arbeiten, aber das ist nunmal nicht unsere Entscheidung.
Omega Psi 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


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
formular - welcher button wurde geklickt? benicio PHP und MySQL 6 25-06-2009 12:22
welcher button wurde gedrückt? wannebe ActionScript 3 3 26-06-2008 20:53
Überprüfen welcher button gedrückt wurde Lythron Flash 4 und Flash 5 7 12-10-2005 11:12
welche button wurde gedrückt? match ActionScript 1 6 26-10-2004 21:09
Login... Abfragen ob Send Button schon gedrückt wurde MacEvil PHP und MySQL 5 02-12-2003 11:59


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:55 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele