Flashhilfe.de - Flash Community

GUICreator für Darstellung/Bearbeitung von Daten [Flash 9]

 


AntwortenRegistrieren Seite1 2 3  

springer#1
Benutzerbild von springer
Beiträge: 4909
Wohnort: zuhaus
Registriert: Apr 2004

10.08.2008, 10:07

da ich im anderen thread etwas abgeschweift bin, versuch ich es nochmals verständlicher zu erklären was ich gemeint habe.
nehmen wir mal an wir haben eine Klasse Person:

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package
{
   public class Person
   {
      private var _fistname:String;
      private var _lastname:String;
      private var _haircolor:unit;
      
      public function Person(){
         
      }
      
      public function get firstname():String{
         return this._firstname;
      }
      
      public function get lastname():String{
         return this._lastname;
      }
      
      public function set firstname(firstname:String):void{
         this._firstname = firstname;
      }
      
      public function set lastname(lastname:String):void{
         this._lastname = lastname;
      }
      
      public function get haircolor():uint{
         return this._haircolor;
      }
      
      public function set haircolor(haircolor:uint):void{
         this._haircolor = haircolor;
      }
   }
}


jetzt willst du eine GUI bauen um die daten zu bearbeiten. Das wäre dann "normalerweise" so, zum beispiel:


PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?
<mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml" width="400" height="150" layout="vertical" title="Person bearbeiten">
    <
mx:HBox width="100%">
        <
mx:Label text="Firstname" width="50%"/>
        <
mx:TextInput width="50%"/>
    </
mx:HBox>
    <
mx:HBox width="100%">
        <
mx:Label text="Lastname" width="50%"/>
        <
mx:TextInput width="50%"/>
    </
mx:HBox>
    <
mx:HBox width="100%">
        <
mx:Label text="Lastname" width="50%"/>
        <
mx:ColorPicker/>
    </
mx:HBox>
</
mx:TitleWindow>
?>


nun gehen wir von 2 verschiedene rollen aus (admin, user). dafür erstellst du dir die zwei besagten schemas in einer anderen Klasse (GUISchemas zb).
(@sebastian: displaycolor hab ich mal eingebaut, weil du ja im anderen thread sagtest, bei einem user muss etwas rot dargestellt werden)

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?xml version="1.0" encoding="UTF-8"?>
<schemas type="Person">
    <schema role="admin">
        <data type="text" variable="_firstname"  editable="true" hasLabel="true">
          <maxChars>100</maxChars>
          <displaycolor>0x000000</displaycolor>
        </data>
         <data type="text" variable="_lastname"  editable="true" hasLabel="true">
          <maxChars>100</maxChars>
          <displaycolor>0x000000</displaycolor>
        </data>
        <data type="color" variable="_haircolor"  editable="true" hasLabel="true">
          <value>0xff9900</value>
        </data>
    </schema>
    <schema role="user">
        <data type="text" variable="_firstname" editable="true" hasLabel="true">
          <maxChars>100</maxChars>
          <displaycolor>0xff9900</displaycolor>
        </data>
         <data type="text" variable="_lastname" editable="true" hasLabel="true">
          <maxChars>100</maxChars>
          <displaycolor>0x000000</displaycolor>
        </data>
        <data type="color" variable="_haircolor" editable="false" hasLabel="true">
          <value>0xff9900</value>
        </data>
    </schema>
</schemas>


loggt sich nun jemand ein, sieht die ausgabe wie in den zwei angefügten bildern aus. einmal für admin, einmal für user

ansicht user:



ansicht admin:




jetzt mal angenommen man hätte diese GUICreator-Klasse wäre die darstellung des GUIs denkbar einfach:

PHP:
1
2
3
4
5
6
<?
<mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml" width="400" height="150" layout="vertical" title="Person bearbeiten">
    <
ns:GUICreator role="admin" klassename="Person" ref="referenzAufDieZuBearbeitendeInstanzDerKlassePerson"/>
</
mx:TitleWindow>
?>


mal angenommen, du brauchst "nur" dein besagtes Inputfeld ganz alleine an einer komplett anderen stelle. sagen wir mal du willst, unten
rechts in deiner Applikation in einer leiste (nennen wir das mal "dock"), den usernamen nicht bearbeitbar darstellen, ginge das vollgendermassen.
Du legst ein neues schema so an, mit den gewünschten variablen aus der klasse:
hasLabel=false würde hier zb bewirken, dass nur das InputFeld ohne zugehöriges Label dargestellt wird.

PHP:
1
2
3
4
5
6
7
8
9
10
11
<?
<schemas type="Person">
    <
schema role="dock">
        <
data type="text" variable="firstname"  editable="false" hasLabel="false">
          <
maxChars>100</maxChars>
          <
displaycolor>0xff9900</displaycolor>
        </
data>
    </
schema>
</
schemas>
?>

   
in mxml (oder per script) gehts dann wieder denkbar einfach:

PHP:
1
2
3
4
<?
<ns:GUICreator role="dock" klassename="Person" ref="referenzAufDieAnzuzeigendeInstanzDerKlassePerson"/>
?>



die anzeige wäre dann (hans müsste jetzt eigentlich orange stehen, fehler von mir):





erweitere ich nun die klasse person um eine variable _age, muss ich "nur" in der klasse die variable definieren, und die schemas anpassen. alle GUIs, Anzeigen, etc. werden dynamisch generiert, und
ich brauch mit eigentlich nicht weiter drum zu kümmern. die GUICreator-Klasse übernimmt auch das komplette Binding, ebenfalls dynamisch auf grund der vorhandenen daten in der jeweiligen klasse.

zudem hätte es in einem team zum beispiel den vorteil, dass man sich nur die schemas anschauen muss und gleich weiss wer was darf, und was wie dargestellt wird. und du musst nicht irgendwelche
hart-gecodete - userspezifische anzeigen in deine komponenten einbauen, die dann genau für andere programmierer unter umständen fast nicht nachvollziehbar wären. die komplette darstellung von daten wird  zentral gesteuert und ist somit für andere mitarbeiter leicht verständlich.

damit wäre es auch möglich einem ganz bestimmten user die anzeige spezifisch zu machen:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?
   
<schema username="sebastian">
        <
data type="text" variable="firstname" editable="true">
          <
maxChars>100</maxChars>
          <
displaycolor>0x333333</displaycolor>
        </
data>
         <
data type="text" variable="lastname" editable="true">
          <
maxChars>100</maxChars>
          <
displaycolor>0x000000</displaycolor>
        </
data>
        <
data type="color" variable="haircolor" editable="true">
          <
value>0xff9900</value>
        </
data>
    </
schema>
?>



wie gesagt könnten damit sämtliche klassen abgebildet werden und user/rollenspezifisch die GUIs dazu kreiert werden.

meine frage diesbezüglich ist, ob sich ein solcher aufwand überhaupt lohnt. ich denke wenn man immer wieder neue applikationen bauen muss, sollte man nicht jedes mal
das rad neu erfinden, sondern bestehende sachen "zusammensetzen". hätte man einen solchen aufbau, könnte man diesen gegebenenfalls in jeder applikation verwenden. und wäre
extrem flexibel, da es nicht draufankommt, was für daten in der klasse verwendet werden. sollte es ein neues datenfeld zb. für ein bild geben, erweitert man nur die
GUICreator um besagten Datentyp. die in der GUI dargestellten "editor-komponenten" können dann auch wieder mit individuellen funktionen ausgestattet werden. (zb könnte ein bild direkt aus dem explorer/finder in die applikation gezogen werden etc....)

ich habe diese klassen noch nicht implementiert. spiele aber mit dem gedanken, das einzubauen. gibt aber hohen initial-aufwand, der sich aber auf dauer wohl gut rechtfertigen liesse, wenn man aus mehreren applikationen darauf zugreifen kann...

bei der applikation die ich gerade entwickle, muss es möglich sein, dass die "rechte" für daten bis auf den einzelnen user runtergebrochen werden müssen. löst man dies mit solchen klassen (GUICreator, GUISchema) können die rechte der user ziemlich einfach gesetzt werden. vorausgesetzt man hat eine userverwaltung bei der dies möglich ist. jedoch wäre es fast ein kinderspiel, wenn man den GUICreator hätte....

PHP:
1
2
3
4
5
6
7
8
9
10
11
<?
<schemas type="Rights">
    <
schema role="admin">
        <
data type="checkbox" variable="edit_username" editable="true">
        </
data>
        <
data type="checkbox" variable="edit_firstname" editable="true">
        </
data>
    </
schema>
</
schemas>
?>


(Bild dazu im nächsten post)

bin da noch nicht ganz durch mit richtig durchdenken. aber auf dauer hab ich keinen bock zeit mit der erstellung von irgendwelchen GUI zu verbringen....
lieber chips essen und danach voller zweifel sein, als voller zweifel chips essen...
Geändert von springer am 10.08.08 um 14:53 Uhr
Werbung
Beiträge: 0
Registriert: Feb 2016


springer#2
Benutzerbild von springer
Beiträge: 4909
Wohnort: zuhaus
Registriert: Apr 2004

Themenautor/in

10.08.2008, 14:55

bild zum obigen post:

lieber chips essen und danach voller zweifel sein, als voller zweifel chips essen...
omega psi#3
Benutzerbild von omega psi
Beiträge: 791
Registriert: Apr 2004

10.08.2008, 15:11

Und wie funktioniert das mit Composite Klassen?
Architectures - Refactoring - Prototyping - Coding - Training
springer#4
Benutzerbild von springer
Beiträge: 4909
Wohnort: zuhaus
Registriert: Apr 2004

Themenautor/in

10.08.2008, 15:38

was verstehst du unter Composite Klassen ? Vererbung ?
lieber chips essen und danach voller zweifel sein, als voller zweifel chips essen...
Geändert von springer am 10.08.08 um 15:40 Uhr
Werbung
Beiträge: 0
Registriert: Feb 2016


omega psi#5
Benutzerbild von omega psi
Beiträge: 791
Registriert: Apr 2004

10.08.2008, 16:03

Nein, ich meine Objekte, die andere Objekte (keine Strings sondern komplexe Objekte) enthalten.
Architectures - Refactoring - Prototyping - Coding - Training
springer#6
Benutzerbild von springer
Beiträge: 4909
Wohnort: zuhaus
Registriert: Apr 2004

Themenautor/in

10.08.2008, 16:35

hatte dies auch schon überlegt, es wäre denkbar das in der form zu machen:

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
package
{
  public class Person
  {
      private var _fistname:String;
      private var _lastname:String;
      private var _haircolor:unit;

    private var _complexObject:ComplexObject;
  }
}




PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?
<schemas type="Person"/>
<
schema role="admin">
        <
data type="text" variable="_firstname"  editable="true" hasLabel="true">
          <
maxChars>100</maxChars>
          <
displaycolor>0x000000</displaycolor>
        </
data>
         <
data type="text" variable="_lastname"  editable="true" hasLabel="true">
          <
maxChars>100</maxChars>
          <
displaycolor>0x000000</displaycolor>
        </
data>
        <
data type="color" variable="_haircolor"  editable="true" hasLabel="true">
          <
value>0xff9900</value>
        </
data>
       <
data type="ComplexObject" variable="_complexObject" hasOwnSchema="true"/>
</
schema>
</
schemas

<
schemas type="ComplexObject">
     <
schema role="admin">
    ......
    </
schema>
</
schemas>
?>


irgendwann kommt man dann ja in den complexen objekten auch meist auf einen primitiven datentyp wie ein string....

dann stellt sich natürlich die frage, was passiert wenn mehrere komplexe typen zb in einem array abgelegt werden....
PHP:
1
2
3
4
5
6
<?
<data type="array" variable="_complexObjectsArray" hasOwnSchema="true">
          <
data type="ComplexObject" variable="_complexObject" hasOwnSchema="true"/>
</
data>
?>


um es nicht unnötig kompliziert zu machen, wäre es auch möglich für arrays, komplexe objekte einfach im GUI einen button zu erstellen, der wiederrum "nur" den GUICreator aufruft in einem neuen PopUp, sprich: komplexe objekte öffnen ein neues GUI.

ActionScript:
1<ns:GUICreator role="admin" klassename="complexObject" ref="dieAktuellePerson.complexObject"/>



der komplexe objekttyp ist ja für sich selbst eigentlich dann wieder simple und besteht nur aus strings oder numerischen werten... so wäre es auch denkbar...
lieber chips essen und danach voller zweifel sein, als voller zweifel chips essen...
Geändert von springer am 10.08.08 um 16:52 Uhr
omega psi#7
Benutzerbild von omega psi
Beiträge: 791
Registriert: Apr 2004

10.08.2008, 19:51

Mal so als Frage: wieso benutzt du nicht XML Schema.
Architectures - Refactoring - Prototyping - Coding - Training
springer#8
Benutzerbild von springer
Beiträge: 4909
Wohnort: zuhaus
Registriert: Apr 2004

Themenautor/in

10.08.2008, 21:25

wie gesagt, die sache ist noch nicht implementiert, ich überlege noch...

wie würde das denn deiner meinung nach aussehen?
lieber chips essen und danach voller zweifel sein, als voller zweifel chips essen...
omega psi#9
Benutzerbild von omega psi
Beiträge: 791
Registriert: Apr 2004

10.08.2008, 21:46

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
   targetNamespace="http://www.example.org/Example"
   xmlns:tns="http://www.example.org/Example">
   <xsd:complexType name="Person">
      <xsd:sequence>
         <xsd:element name="dateOfBirth" type="xsd:date" />
         <xsd:element name="firstName" type="xsd:string" />
         <xsd:element name="friends" type="tns:Person"
            maxOccurs="unbounded" minOccurs="0" />
         <xsd:element name="lastName" type="xsd:string" />
         <xsd:element name="city" type="tns:City" />
      </xsd:sequence>
   </xsd:complexType>
   <xsd:complexType name="City">
      <xsd:sequence>
         <xsd:element name="zipCode" type="xsd:int" />
         <xsd:element name="name" type="xsd:string" />
      </xsd:sequence>
   </xsd:complexType>
</xsd:schema>
Das Beispiel beschreibt zwei Datentypen: Person und City. City ist dabei der Datentyp eines Attributs des Typs Person und Person kann andere Person Instanzen in der Sammlung friends beinhalten (gekennzeichnet).

Hier ein Link, der im Zusammenhang mit Collections sinnvoll ist: http://www.w3.org/2005/07/xml-schema-patterns.html

Vorteil von XML Schema: es ist ein offizieller W3C Standart und die Chance, dass es schon existierende Bibliotheken zur Verarbeitung gibt, die auch dir helfen, ist groß.
Architectures - Refactoring - Prototyping - Coding - Training
springer#10
Benutzerbild von springer
Beiträge: 4909
Wohnort: zuhaus
Registriert: Apr 2004

Themenautor/in

10.08.2008, 21:54

ja, auf die seite bin ich soeben auch gestossen, muss das aber mal durchrackern....

ist denn ein solches vorhaben (ich meine den GUICreator generell) überhaupt sinnvoll, oder halst man sich damit zu viel auf?
ich denke man würde sich auf dauer extrem viel arbeit sparen, wenn es auf diese oder eine ähnliche weise funktionieren könnte....

eigentlich war ich schon nah dran, natürlich ist es sinnvoll auf standard zurückzugreifen, aber die muss man erst mal kennen ;-), komme halt eher von der grafischen seite und lebe mit langsam in die programmierwelt ein...
lieber chips essen und danach voller zweifel sein, als voller zweifel chips essen...
Geändert von springer am 10.08.08 um 21:57 Uhr
omega psi#11
Benutzerbild von omega psi
Beiträge: 791
Registriert: Apr 2004

10.08.2008, 22:54

Code Generatoren sind ja keine Seltenheit mehr und ich denke gerade im Hinblick auf MXML kann man da eine Menge reissen. Aber ob nun generische Views der richtige Weg sind... ich weiss es nicht. Allerdings sind die echt schnell zusammengezimmert. Aber gerade im Hinblick auf ItemRenderer und ItemEditoren kann man da viel mehr rausholen, als generische Views einem bieten könnten.

Aber falls du da noch etwas rumspielen willst: nimm lieber eine Form anstatt vieler HBoxes. Das ist performanter.
Architectures - Refactoring - Prototyping - Coding - Training
Geändert von omega psi am 10.08.08 um 22:55 Uhr
springer#12
Benutzerbild von springer
Beiträge: 4909
Wohnort: zuhaus
Registriert: Apr 2004

Themenautor/in

11.08.2008, 08:18

was spricht dagegen, die views samt itemeditoren und itemrenderer zu generieren?
schlussundendlich hat man genau dasselbe vor sich, halt nicht von hand zusammengezimmert...

vielleicht ist dazu zu sagen, dass ich mir anhand dessen nicht irgendwelche mxml - codezeilen zusammenschustern lassen will, die ich als einzelne komponenten in mein projekt einbauen muss, sondern die views werden bei aufruf dynamisch erstellt, sprich die checkboxen, combos etc. werden anhand eines definierten schemas (in welcher form auch immer) zum formular geaddet... sonst bin ich ja wieder gleich weit wie vorher und muss bei änderungen quasi eine neue view generieren, was ich aber nicht möchte.... es gibt nur eine view-komponente, und die kann alle klassen abbilden...

vielleicht wäre GUIRenderer der bessere ausdruck dafür....
lieber chips essen und danach voller zweifel sein, als voller zweifel chips essen...
omega psi#13
Benutzerbild von omega psi
Beiträge: 791
Registriert: Apr 2004

11.08.2008, 08:29

Das ist auf jeden Fall eine interessante Sache an die ich mich auch noch ransetzen werde. Ich hatte dich zunächst falsch verstanden.
Architectures - Refactoring - Prototyping - Coding - Training
Sebastian#14
Benutzerbild von SebastianFlashhilfe.de Moderator
Beiträge: 6981
Wohnort: München
Registriert: Jan 2002

11.08.2008, 10:17

Grundsätzlich finde ich den Ansatz toll und ich denke wenn man viel mit Formularen bzw. Ausgaben an den User zu tun hat, auch eine Interessante Lösung. Nur wird ein solches Format auch nur dafür ausreichend bzw. von Vorteil sein. - also Webseiten
So sieht es für mich zumindest aus. Sagen wir mal bei Spielen, oder Anwendungen wird es weniger helfen. Grundsätzlich würde ich eine User Berechtigung auch nicht auf Textfeld Ebene machen, sondern auf Stack Ebene. Den wie ist es z.B. mit Events die auf Elementen sitzen, die dynamisch erzeugt wurden und z.B. nur für Admins sichtbar sind bzw. generelle Abhängigkeiten? Abgesehen davon halte ich ein solches System nicht für praktikabel da wie gesagt, nicht nur die reine Ausgabe an den User erzeugt werden muss, sondern auch das gesamte drumherum.

Ich brauche für mein Projekt ebenfalls eine Rollenverteilung, allerdings werde ich die wohl eher auf Clientseite steuern und nur über das Backend ansprechen. - muss mir allerdings noch mal Gedanken machen was die für mich sinnvollste Lösung ist
JavaScript & JavaFX Freelancer || Flashhilfe @ Twitter || XING Profil
Geändert von Sebastian am 11.08.08 um 10:19 Uhr
omega psi#15
Benutzerbild von omega psi
Beiträge: 791
Registriert: Apr 2004

11.08.2008, 10:24

Eine zur Laufzeit erstellte Benutzungsoberfläche kann durchaus sehr sinnvoll und mächtig sein (siehe Eclipse). Was Springer da aufzeigte war nur ein Beispiel.

Rollen-basierte Interfaces würde ich gleich in in verschiedene Module auslagern.
Architectures - Refactoring - Prototyping - Coding - Training
springer#16
Benutzerbild von springer
Beiträge: 4909
Wohnort: zuhaus
Registriert: Apr 2004

Themenautor/in

11.08.2008, 10:32

hallo sebastian,
da die view anhand der schemas generiert werden, hat zb ein normaler user nicht die anzeige, oder textfelder, die der administrator angezeigt bekommt. es wird nur das generiert das benötigt wird. daher hat es auch keine events oder listener die nicht gebraucht werden...

was verstehst du unter "das ganze drumherum" ?

es ist klar das zum beispiel in einem spiel, wenn man zb ein grösseres schwert findet, die werte direkt geändert werden, nicht über eine gui. das sind für mich aber zwei grundlegend verschiedene dinge. dort spielt der programmfluss dann die grössere rolle, als das bearbeiten von daten... dies würde ich dann über Events lösen. auch würde es sich in einer applikation ähnlich verhalten: useraktion feuert event, daten werden direkt geändert....

muss mal noch drüber nachdenken, ob es sogar möglich wäre, den GUIRenderer so intelligent zu gestalten, dass es möglich wäre zu sagen: führ mir diese aktion mit diesen werten direkt aus....dass wäre dann aber eine deluxe-deluxe-deluxe variante.....
lieber chips essen und danach voller zweifel sein, als voller zweifel chips essen...

AntwortenRegistrieren Seite1 2 3  

Schnellantwort

Du musst registriert sein, um diese Funktion nutzen zu können.

 
Ähnliche Beiträge zum Thema
Partner Webseiten: art-and-law.de  Mediengestalter.info   php-resource.de   phpforum.de   phpwelt.de   Pixelio.de   Scubacube.de  
Haftungsausschluss   Datenschutzerklärung   Hier Werben   Impressum
© 1999-2020 Sebastian Wichmann - Flashhilfe.de