Dynamische Generierung der UI-Komponenten... [MX 2004 Prof.]

Vaio82

Erfahrenes Mitglied
Hallo zusammen...

Bevor ich hier endlosen Code einfüge, würde ich lieber mein Problem genauer beschreiben.

Ich möchte aus Strukturinformationen (XML) für jede Unterseite (In meinem Fall Module 1 - n) die Anzahl der Komponenten auslesen und anzeigen.

Bisher habe ich in der XML Textfelder definiert, die dynamisch angezeigt werden. Darin steht z.B. Name (XY), Type(Dynamic), MaxChars(120),...

Code:
---------- BEGINN XML ----------

<STRUKTUR>
<MODUL ID="0" BESCHREIBUNG="Modul 1">
<FELDER>
<FELD>
<EIGENSCHAFTEN NAME="KNR" TYPE="dynamic" INHALT="Kundennummer:" X="150" Y="100" BORDER="false" LENGTH="100" HEIGTH="20" BACKGROUND="false" PASSWORD="false" MULTILINE="false" HTML="false" EMBEDFONTS="false" VARIABLE="null" MAXCHARS="null" STYLE_FORMAT="b13_format"/>
</FELD>
<FELD>
<EIGENSCHAFTEN NAME="KNR_Input" TYPE="input" INHALT="..." X="210" Y="200" BORDER="true" LENGTH="120" HEIGTH="20" BACKGROUND="false" PASSWORD="false" MULTILINE="false" HTML="false" EMBEDFONTS="false" VARIABLE="null" MAXCHARS="9" STYLE_FORMAT="b13_format"/>
</FELD>

...

---------- ENDE XML  ----------


Mit einer For-Schleife lese ich die einzelnen Felder eines Moduls (Definiert in der XML) aus. Die Laufvariable ist in diesem Fall die Anzahl der ChildNodes eines Moduls. Beispielsweise Feld 1 - n...

// Integration von XML in FLASH

---------- BEGINN AS  ----------


for (var i = 0; i<Felder; i++){ // GEBRAUCH DES DYNAMISCHEN WERTES

// DETAILDEFINITIONEN EINES FELDES
FeldName = meinXML.firstChild.childNodes[ModulID].childNodes[0].childNodes[i].childNodes[0].attributes.NAME;
FeldType = meinXML.firstChild.childNodes[ModulID].childNodes[0].childNodes[i].childNodes[0].attributes.TYPE;

...



// Erstellung von n Textfeldern auf _root. - Sichtbare Fehler: 1,2,3



var FeldName_String = FeldName; 

_root.createTextField(FeldName_String,i,FeldY,FeldX,FeldLength,FeldHeigth); // FEHLER 3

FeldName_Object=eval(FeldName_String); 
FeldName_Object.text = FeldInhalt;

//trace(FeldBorder);
//trace(FeldName_Object.border);

FeldName_Object.border = FeldBorder; // FEHLER 1
FeldName_Object.type = FeldType;
FeldName_Object.maxChars = FeldMaxchars;
FeldName_Object.type = FeldMultiline;
FeldName_Object.type = FeldEmbedFonts;
FeldName_Object.type = FeldHtml;
FeldName_Object.type = FeldVariable;

FeldName_Object.setTextFormat(FeldStyleFormat); // FEHLER 2 


---------- ENDE AS  ----------


FEHLER 1:

Hierbei wird in der XML entweder true oder false in die Variable FeldBorder geschrieben. Wenn ich FeldBorder nun trace steht dort (false, true, false, true, false, false, false). Somit solten theoretisch Textfeld 1 und 3 mit Border sein, der Rest ohne. Wenn ich allerdings im Anschluß FeldName_Object.border trace steht dort immer nur true. Handelt es sich dabei um ein syntaktisches Problem?

FEHLER 2:

Bei diesem Fehler geht es darum, dass er mit der Variablen FeldStyleFormat nichts anfangen kann. Dort werden spezifische Formate aus der XML gezogen, beispielsweise Format: b13_format (dies steht in der XML und wird in die Variable FeldStyleFormat geladen). Wenn ich allerdings b13_format "hart" reinschreibe -> FeldName_Object.setTextFormat(b13_format); klappt es wunderbar...
Wüßte dazu evtl. jemand eine Lösung? (Die Formate sind in einem ext. *.as hinterlegt, welches sich als Top-include in _root befindet)...

FEHLER 3:

Bei diesem Fehler handelt es sich um den schönen Index. Der Index ist in meiner Version mit der Laufvariable i identisch. Dies hat allerdings folgenden Nachteil:

Angenommen der Benutzer klickt auf Modul 1 (Dann wird die Struktur XML ausgelesen. Darüber hinaus werden 6 Textfelder angelegt. 3 Input und 3 Dynamic. Da sich alles unter _root abspielt ist der Index in diesem Fall auf 6. (Index == i).
Klickt der Benutzer nun auf Modul 2 (Dort sind nur 4 Textfelder definiert), werden die 4 neuen Textfelder angezeigt, darüber hinaus werden aber noch 2 Felder aus Modul 1 angezeigt...

Nun zu meinen ursprünglichen Fragen ;)

Ist es möglich _root komplett zu "leeren"? Obwohl ich ja lieber für jedes Modul einen eigenen MC hätte, nur hat das vor einigen Tagen nicht funktioniert, da er die Textformate (..._format) komischer Weise nur auf der _root Bühne angezeigt hat.

// Evtl. ein kleines Beispiel für einen dynamischen MC... :)

Darüber hinaus würde ich sehr gerne die neuen V2-Komponenten nutzen. Allerdings will ich sie dynamisch zur Laufzeit auf die Bühne ziehen und damit arbeiten. Jedoch bleibt meine Bühne immer leer, wenn ich eine Komponente mit diesem Code anlege. (Vieleicht bin ich zu dumm, allerdings denke ich, dass es an dem neuen Thema und der fehlenden Routine liegt *G*)

// Damit habe ich es versucht: UIObject.createClassObject()

Code:
---------- BEGINN AS  ----------


import mx.controls.Button;
createClassObject(Button,"button2",5,{label:"Test Button"});


---------- ENDE AS  ----------


Frage: Mir ist zwar bewußt, dass da noch etwas fehlen muss, allerdings finde ich im Netz momentan nur OOP-Beispiele. Diese sind bei mir momentan allerdings nicht umzusetzen.

Ich würde mich sehr über eure Hilfe freuen und würde mein bestes geben, um mich in Zukunft zu revangieren.

Schöne Grüße aus Gütersloh,
Claus Gronemeier
 
Hi,

Fehler 1: Hast Du es einmal mit eval(FeldBorder) versucht? Ich vermute, dass diese Variable "true" bzw. "false" als String enthält, object.border allerdings einen bool'schen Wert erwartet.

Fehler 2: Da muss ich mich selbst erst noch reinlesen ;)


Fehler 3: Du kannst vorhandene Objekte natürlich überschreiben, wobei Du mit "getNextHighestDepth" bzw. "getInstanceAtDepth" vorhandene Objekte "auslesen" könntest. Die selben Eigenschaften könntest Du auch verwenden, um auf "i" einen Offset zu setzen, um alle Modulsätze quasi gleichzeitig erzeugen zu können (und die nicht benötigten z.B. zu verbergen).


Gruß
 
Hallo,

diese Fehlerquellen wurden alle beseitigt... ;)

Ich habe es nun auch komplett mit den V2-Komponenten realisiert, die zur Laufzeit auf die Bühne "gezogen" werden.

Allerdings habe ich da noch ein kleines Problem:

Code:
var myDataGrid = _root.attachMovie("DataGrid","d", 10,{_x: 0, _width:600});

So ziehe ich die V2's auf die Bühne. Nur bekomme ich sie nicht mehr gelöscht.

Mit:

Code:
removeMovieClip("DataGrid");

funktioniert das nicht... Den Z-Index möchte ich nicht überschreiben, da dieser für ca. 500 div. Komponenten in der fertigen Anwendung dynamisch generiert wird.

Kennt jmd. da evtl. eine Lösung?
 
Zuletzt bearbeitet:
Hi
FLash-Referenz:
Rückgaben
Ein Verweis auf die neu erstellte Instanz.
Bei dieser Instanzierung erhälst Du doch einen Verweis auf das Objekt; der Clip müsste sich also mit
PHP:
myData.removeMovieClip();
entfernen lassen?

Ansonsten: Um aus einem Instannamen einen Objektverweis zu erhalten, hilft wieder mal eval():
PHP:
eval("d").removeMovieClip();

Gruß
 
Zuletzt bearbeitet:
hmm... dann könnte ich mir höchstens vorstellen, dass die Adressierung etwas durcheinander kommt (ich denke, wenn Du das Objekt auf _root instanzierst, sollte der Verweis auf _root schon im zurückgegebenen Objekt enthalten sein...).

EDIT: außerdem habe ich mich mit dem Namen vertan (:-)) "DataGrid" ist die Komponente, "d" war Dein neuer Name, oder? Ich habe das im vorherigen Beitrag mal geändert.

Alternativen:
PHP:
_root.myData.removeMovieClip();
// oder:
eval("_root.d").removeMovieClip(); // hierbei MUSS das _root unbedingt angegeben werden!
Oder die Instanzierung etwas abändern:
PHP:
_root.attachMovie("DataGrid","d", 10,{_x: 0, _width:600});
MyData = eval("_root.d");
Ob in den jeweiligen Variablen auch wirklich die gewünschten Objekte liegen, lässt sich prima mit trace(var) herausfinden; Adressierungsprobleme in Flash sind so alt wie der Mond - da hilft oft einfach ausgiebiges "tracen", überdenken der Hierarche und rumprobieren.;)

Gruß
 
Zuletzt bearbeitet:
Ohne jetzt gross meckern zu wollen:

Komplexe Fragestellungen, auch wenn sie aus einem monetären Zusammenhang wie hier eindeutig stammen sind hier ja willkommen.
Dennoch sollten eben gerade bei komplexen Fragestellungen auf jeden Fall Beispieldateien gepostet werden, die natürlich nicht das komplette Produkt enthalten sollten, aber zumindest das Element in light, das das Problem verursacht.

Auch wenn du durch deine Fragestellung schon das Problem richtig eingrenzt, so ist es doch für den Antwortenden fast schon fahrlässig auf Grundlage solcherart begrenzter Informationen zu antworten. Das kann ein Sport sein, muss aber nicht, und ausserdem liegen die Antworten dann öfter falsch, siehe vorherigen Beitrag....

B
 
@ Basileus:

Entschuldige bitte Basileus,

in Zukunft werde ich noch mehr Code hier posten.

@ Datic:

Vielen Dank für Deine Hilfe, allerdings klappten all diese Dinge nicht. Ich habe nun auf lvl0 (root) einen MC generiert (Dieser nimmt alle attached MC's in sich auf), welchen ich dann zur Laufzeit mit einer for( i in _root ) - Schleife lösche/remove.
 
Zurück