Zurück   Flashforum > Flash > Stuff

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 31-10-2004, 19:16   #1 (permalink)
Flashaholic
 
Benutzerbild von atothek
 
Registriert seit: Feb 2003
Ort: Berlin
Beiträge: 1.459
Lightbulb [stuff] SelectManager

hab mal heute nen kleinen SelectManager gebastellt.
mit multi und single select
PHP-Code:
/**
* @class        SelectManager
* @version        0.1
* @author        Alex Kämmerer (alex@gengon.de)

* @build          31.10.2004
* @update         31.10.2004
* @released     31.10.2004

* @return         Void
* @access        public
*
* @desc            Creates a SelectManager Object.

* @history        31.10.2004    starting propgamming
*/
class de.gengon.fgui.manager.SelectManager{
    
    
/** stores all registered elements */
    
private var _elements : Array;
    
    
/** stores a singleselect selected object or null */
    
private var _selectedItem Object null;
    
    
/** stores all selected objects */
    
private var _selectedItems : Array;
    
    
/** stores if manager worx in single or multiselect mode */
    
private var _singleSelect Boolean true;
    
    
/** stores if manager automaticly deselect the selected item in single select mode */
    
private var _autoDeselect Boolean true;
    
    
/**
    * constructor creates a new SelectManager object
    */
    
public function SelectManager(){
        
_elements = new Array();
        
_selectedItems = new Array();
    }
    
    
/** 
    * adds the specific element to the 
    * elements array if not exists
    * 
    * @param    element : Object
    */
    
public function addElement(element Object) : Void {
        
        if(
exists(_elementselement) == -1){
            
_elements.push(element);
            
element.setSelectManager(this);            
        }
    }
    
    
/** 
    * removes the specific element from the 
    * elements array if exists
    * 
    * @param    element : Object
    */
    
public function removeElement(element Object) : Void {
        
        var 
Number exists(_elementselement);        
        if(
> -1){
            
_elements.splice(i1);
            
element.setSelectManager(null);
        }
    }
    
    
/**
    * resets the selectManager
    */
    
public function reset():Void{
        
_elements = new Array();
    }
    
    
    
/** setter and getter */
    
public function setAutoDeselect(Boolean) : Void{
        
_autoDeselect b;
    }

    public function 
getAutoDeselect() : Boolean{
        return 
_autoDeselect;
    }
    
    public function 
setSingleSelect(Boolean) : Void{
        
_singleSelect b;
    }
    
    public function 
getSingleSelect() : Boolean{
        return 
_singleSelect;
    }
    
/** end getter and setter */
    
    /**
    * cleares all selected items
    */
    
public function clearSelected() : Void{
        if(
_singleSelect)
            
_selectedItem.onDeselect();
        else{
            for(var 
_selectedItems.length 1>= 0i--){
                
_selectedItems[i].onDeselect();
                
_selectedItems.splice(i1);
            }
        }
    }
    
    
/**
    * setts the specified object 
    * to selected oder deselcted by invoking
    * the events onSelect or onDeselect
    * 
    * @param    o : Object
    */
    
public function setSelected(Object) : Void{
        if(
_singleSelect){            
            if(
_selectedItem == null){
                
_selectedItem o;
                
_selectedItem.onSelect();
            }else if(
_autoDeselect && _selectedItem != null){
                if(
_selectedItem == o){
                    
_selectedItem.onDeselect();
                    
_selectedItem null;
                }else if(
_selectedItem != o){                    
                    
_selectedItem.onDeselect();
                    
_selectedItem o;
                    
_selectedItem.onSelect();
                }
            }else if(!
_autoDeselect && _selectedItem == o){
                
_selectedItem.onDeselect();
                
_selectedItem null;
            }
        }else{            
            if(
exists(_selectedItemso) == -1){
                
addObject(o);
                
o.onSelect();                
            }else{
                
removeObject(o);                
                
o.onDeselect();
            }
        }
    }
    
    
/**
    * if singleselect mode is used returns the single
    * selected item else returns a array with all selected items
    * in the selected order
    * 
    * @return     Object
    */
    
public function getSelected() : Object{
        if(
_singleSelect)
            return 
_selectedItem;
        else
            return 
_selectedItems;
    }
    
    
/**
    * checks if the specified object o is
    * part of the array arr
    * 
    * @param    arr : Array
    * @param    o : Object
    * 
    * @return     Number
    */
    
private function exists(arr : Array, Object) : Number{
        for(var 
arr.length 1>= 0i--)
            if(
arr[i] === o)
                return 
i;
        return -
1;
    }

    
/**
    * adds the object to 
    * the array with selected objects
    * 
    * @param    o : Object
    */
    
private function addObject(Object) : Void{
        if(
exists(_selectedItemso) == -1)
            
_selectedItems.push(o);
    }
    
    
/**
    * removes the object from
    * the array with selected objects
    * 
    * @param    o : Object
    */
    
private function removeObject(Object) : Void{
        
        var 
Number exists(_selectedItemso);        
        if(
> -1)
            
_selectedItems.splice(i1);
    }

zum anwenden einfach nen kleinen mc machen 100x20 und verknüpfen mit clip als namen nun noch folgendes script und schon ist alles easy .

PHP-Code:

import de
.gengon.fgui.manager.SelectManager;

/* neuer SelectManager */
var sm SelectManager = new SelectManager();

/* für multiselect einfach false setzen */
sm.setSingleSelect(true);

/* erklärt sich selbst */
sm.setAutoDeselect(false);

init = function(){
    
    for(var 
i=0i<5i++){
        
        var 
mc this.attachMovie("clip""mc"+ii);
        
mc._x 50 + (mc._width 5) * i
        
mc._y 50;        
        
mc.onRelease = function(){
            
sm.setSelected(this);
        }
        
/* event wenn ausgewählt */
        
mc.onSelect = function(){
            var 
= new Color(this);
            
c.setRGB(0x00FF00);
        }
        
/* event wenn abgewählt */
        
mc.onDeselect = function(){
            var 
= new Color(this);
            
c.setRGB(0xFF0000);
        }
        
/* anmelden beim manager */
        
sm.addElement(mc);
    }
}

init(); 
Kritik, anregung und/oder Lob sind gern gesehen .

mfg
alex
__________________
TVNEXT Solutions

Geändert von atothek (31-10-2004 um 19:17 Uhr)
atothek ist offline   Mit Zitat antworten
Alt 31-10-2004, 22:20   #2 (permalink)
helpQLODhelp
 
Benutzerbild von bokel
 
Registriert seit: Feb 2002
Ort: Köln
Beiträge: 8.505
Ich finds ganz gut. Folgendes ist mir aufgefallen:
1. Anstatt des s für Vielzahl würde ich List anhängen, das macht deutlicher, dass es eine Liste ist, also z.B. _elementList anstatt _elements
2. Die Typisierung mit Object solltest du weglassen, kaneda hat das mal analysiert, Flash macht da u.U. Probleme.
3. Die Elemente scheinen ein Interface (onSelect, onDeselect, setSelectManager) zu haben, das würde ich explizit machen
4. exists würde ich eher find nennen, von exists würde ich Boolean erwarten
5. Die Verwaltung des/der selektierten Objekte würde ich auslagern. Du könntest vielleicht zwei Klassen SingleSelection und MultipleSelection dafür benutzen, die dann vom Manager je nach Bedarf benutzt werden können.
6. Die ElementListe könnte man vielleicht zusaetzlich noch als abstrakten Datentyp auskoppeln, den man dann an anderer Stelle auch noch benutzen kann.
7. Die Logik in setSelected ist mir zu komplex. Das äußere if würde schon durch die Delegation von setSelected an SingleSelection/MultipleSelection verschwinden. Aber zusaetzlich würde ich setSelected noch in select und deselect aufteilen.

mfg r.
bokel ist offline   Mit Zitat antworten
Alt 01-11-2004, 09:37   #3 (permalink)
Flashaholic
 
Benutzerbild von atothek
 
Registriert seit: Feb 2003
Ort: Berlin
Beiträge: 1.459
@bokel vielen dank für die klasse kritik hab mich auch dieser gerne angenommen und habe vieles davon umgesetzt. Freut mich mal eine so ausführliche beurteilung zu bekommen, da kann man ja nur lernen. Find auch alle punkte passend .

Anbei nun mal eine umsetzung des ganzen mit einer kleinen demo Anwendung

mfg
alex
Angehängte Dateien
Dateityp: zip SelectManager.zip (13,1 KB, 53x aufgerufen)
__________________
TVNEXT Solutions
atothek ist offline   Mit Zitat antworten
Alt 01-11-2004, 23:36   #4 (permalink)
nerdig working
 
Benutzerbild von michael
 
Registriert seit: Jul 2001
Ort: Hamburg
Beiträge: 5.832
klasse, ein ganz tolles OOP-Lehrstück an dem man viel lernen kann.

zwei kleine frage kommen mir beim überfliegen auf die schnelle:
ActionScript:
  1. public function SelectManager(type : String){
  2.        
  3.         _type = type == undefined ? "single" : type;
  4.        
  5.         if(_type == undefined || _type == "single")
  6.             _selection = new SingleSelection();
  7.         else if(_type == "multi")
  8.             _selection = new MultipleSelection();      
  9.     }
warum fragst du _type == undefined ab wenn du es vorher ausgeschlossen hast?

warum ist AbstractSelection eine klasse und kein interface?

was übersehe ich?


gruß
michael

Geändert von michael (01-11-2004 um 23:42 Uhr)
michael ist offline   Mit Zitat antworten
Alt 02-11-2004, 09:29   #5 (permalink)
MiM
Neuer User
 
Registriert seit: Sep 2001
Ort: Neckarsulm
Beiträge: 273
Was passiert wenn type weder 'singel' noch 'multi' entspricht? Dann würde sich die Klasse in einem nicht erlaubtem Zustand befinden, da _selection undefined wäre.

Ich würde den Typ nicht als String sonder als Number übergeben. Die geeignete Nummer erhält man über Konstanten in der Klasse SelectManager. Bei Strings kann es leicht zu Fehlern bei der Eingabe kommen.

PHP-Code:
class de.gengon.manager.SelectManager{
  public static var 
TYPE_SINGLE:Number 0;
  public static var 
TYPE_MULTI:Number 1;
  .. 
AbstractSelection würde ich auch zu einem Interface machen, da es ja keinen auszuführenden Programmcode enthält und nur vorschreibt, welche Methoden implementiert werden sollen (und dies wird im jetzigen Fall auch nicht vom Compiler erzwungen wird).
Falls es dennoch eine abstrakte Klassen bleiben soll, würde ich zumindest in jeder Methode die überschrieben werden soll, eine AbstractOperationException werfen, damit wenigstens zur Laufzeit erkannt wird, das man vergessen hat eine Methode zu implementieren.

Der Name des Interfaces ISelectManager verwirrt mich ein wenig. Ich würde daraus schließen, dass dieses Interface vom SelectManger implementiert werden sollte und nicht vom SelectItem.

Ansonsten schöne Sache.

Gruß
Simon
MiM ist offline   Mit Zitat antworten
Alt 02-11-2004, 09:31   #6 (permalink)
Flashaholic
 
Benutzerbild von atothek
 
Registriert seit: Feb 2003
Ort: Berlin
Beiträge: 1.459
@gutknut thx
das mit dem doppelten prüfen ist einer der klassiker, code proggen und nächsten tag überarbeiten und dabei übersehen danke für den Hinweis, has natürlich korrigiert. Die AbstractSelection ist nun das Interface Selection, hab verpeilt das man auf ein Interface Typesieren kann deshalb wars eine klasse. zudem eine kleine ergänzung im interface ISelectManager und im SelectManager wenn schon vorher ein mc per default selektiert ist wird dies nun auch erkannt.

mfg
alex

Edit:
@MiM haben wohl gleichzeitig gepostet
das mit dem Namen des interfaces ist wirklich verwirrend aber Selectable ist in dem fall auch nicht wirklich passend Managerable ist auch komisch hast du vielleicht eine Idee?

Das mit den Konstanten ist ne Gute Idee werde ich mal mit einbauen.
Angehängte Dateien
Dateityp: zip SelectManager.zip (13,9 KB, 18x aufgerufen)
__________________
TVNEXT Solutions

Geändert von atothek (02-11-2004 um 10:23 Uhr)
atothek ist offline   Mit Zitat antworten
Alt 02-11-2004, 10:07   #7 (permalink)
helpQLODhelp
 
Benutzerbild von bokel
 
Registriert seit: Feb 2002
Ort: Köln
Beiträge: 8.505
Warum Nummern, wenn man gleich eine ganze Klasse nehmen kann

ActionScript:
  1. class SelectionType {
  2.        static var SINGLE:SelectionType = new SelectionType("single", 1);
  3.        static var MULTIPLE:SelectionType = new SelectionType("multiple", 2);
  4.  
  5.        private var name:String;
  6.        private var value:Number;
  7.  
  8.        private function SelectionType( name:String, value:Number){
  9.               this.name = name;
  10.               this.value = value;
  11.        } 
  12.  
  13.        function getName(){
  14.             return this.name
  15.        }
  16.  
  17.        function getValue(){
  18.             return this.value
  19.        }
  20. }

Der Vorteil ist, dass der Compiler Typsicherheit herstellt.

Wg. des Konstruktors:
Normalerweise halte ich meine Konstruktoren immer so einfach wie möglich. So wie du es jetzt gemacht hast, legt es eigentlich nahe, zwei verschiedene ManagerKlassen zu schreiben, eine für Single und eine für Multi und vielleicht eine gemeinsame Oberklasse und ein ManagerInterface. Ich habe mich dann aber gefragt, was es letzlich in der Anwendung bedeutet. Wenn mein Manager ein IManager ist, dann muesste ich für die erweiterten Eigenschaften meines Managers immer casten. Dann ist es so vielleicht doch so besser, also dass der Manager praktisch zwei Klassen in sich vereint. Trotzdem würde ich das Auswerten des Typs in eine extra Routine packen.

mfg. r
bokel ist offline   Mit Zitat antworten
Alt 02-11-2004, 10:23   #8 (permalink)
Flashaholic
 
Benutzerbild von atothek
 
Registriert seit: Feb 2003
Ort: Berlin
Beiträge: 1.459
so hab mich nun dafür entschieden das Interface Selectable zu nennen was noch am passendsten ist. habe auch die Konstanten eingebaut.
@bokel steh gerade auf dem schlauch und komm nicht ganz hinterher .

hab den 2. download aktualisiert damit es nicht zu viel wird ^^

mfg
alex
__________________
TVNEXT Solutions
atothek ist offline   Mit Zitat antworten
Alt 02-11-2004, 12:59   #9 (permalink)
helpQLODhelp
 
Benutzerbild von bokel
 
Registriert seit: Feb 2002
Ort: Köln
Beiträge: 8.505
Oh sorry,
mit der Klasse SelectionType kannst du die Konstanten definieren. Dann kann dir nicht jemand eine falsche Nummer unterschieben. (Na ja, null und undefined würden immer noch durchgehen, so viel bringt es also nicht )

Im zweiten Absatz habe ich nur laut gedacht. Es scheint ja so zu sein, dass der SelectManager nur im Konstruktor initialisiert wird und dass der Typ dann nicht mehr geändert wird. Deshalb habe ich mich gefragt, was passiert wenn man gleich zwei verschiedene SelectManager definiert, einen für single- und einen für multi-select.

mfg .r
bokel ist offline   Mit Zitat antworten
Alt 02-11-2004, 13:23   #10 (permalink)
Neuer User
 
Registriert seit: Jul 2002
Ort: Hamburg
Beiträge: 195
Hallo,
@bokel: gibt es dazu einen thread bzw. was ist das problem?

Zitat:
2. Die Typisierung mit Object solltest du weglassen, kaneda hat das mal analysiert, Flash macht da u.U. Probleme.
lg
mOgli
mogli0815 ist offline   Mit Zitat antworten
Alt 02-11-2004, 14:43   #11 (permalink)
MiM
Neuer User
 
Registriert seit: Sep 2001
Ort: Neckarsulm
Beiträge: 273
Wir haben darüber auf dem as2lib Weblog gepostet: :Object is Evil.
Die Typprobleme treten beim Gebrauch von Interfaces auf, weil diese laut Compiler nicht vom Typ Object seien.
MiM ist offline   Mit Zitat antworten
Alt 09-07-2005, 14:21   #12 (permalink)
Flashaholic
 
Benutzerbild von atothek
 
Registriert seit: Feb 2003
Ort: Berlin
Beiträge: 1.459
Is zwar schon etwas älter hatte aber ne kleine ergänzung gemacht
und zwar CountableSelection fehlte noch

mann kann angeben wieviele elemente wählbar sind.
zudem ist das ganze nu in eine neue herachie gewandert und ne kleine Doc
mit dabei probier mich gerade an as2api

mfg
alex
Angehängte Dateien
Dateityp: zip SelectManager.zip (34,7 KB, 29x aufgerufen)
__________________
TVNEXT Solutions
atothek 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 18:38 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele