Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 07-08-2005, 15:55   #1 (permalink)
FBx
 
Benutzerbild von xlive
 
Registriert seit: May 2003
Beiträge: 968
xml-ausgabe sortieren

hi,

habe eine kleine data selector mit xml/css gebastelt. es werden daten nach eingabe von drei parametern aus einer .xml selektiert und ausgeben.
die darstellung der werte in flash geschieht nach der reihenfolge, wie die daten aus der .xml ausgelesen werden.
jetzt soll aber die reihenfolge der daten nach der min. geschwindigkeit sortiert werden, d.h. der kleinste wert steht in der ersten zeile.
schreibe ich nun das ganze in einer Array.sort(). was aber aufgrund der xml.dynamik der anwendung nicht ganz einfach ist?!

erklärung zur anwendung eingaben der drei parameter:
combobox1: typ der düse
volumen: eingabe < 50
combobox2: geschwindikeit wählen

bei der ausgabe erscheint dann der düsentyp, die min/max geschwindigkeit und eine tabelle.
nicht für alle eingebenen werte, gibt es auch ein passende ausgabewerte->erscheint dann fehlermeldung "kein wert vorhanden"

hier mal drei parameter mit denen es klappt.
Größe: M
Volumen: 50
Geschwindigkeit:25

datei ist gepostet unter: http://www.flashbanditen.de/xmlsort.zip

gruß xlive

Geändert von xlive (07-08-2005 um 15:58 Uhr)
xlive ist offline   Mit Zitat antworten
Alt 07-08-2005, 21:30   #2 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.324
wenn du sortieren willst, dann musst du auch ein array haben. XML wird nicht sortiert!
wenn deine XML-daten geladen wurden, dann erstelle direkt daraus ein mehrdimensionales array. das kannst du dann nach den unterschiedlichsten kriterien sortieren.


----------
zu deiner selectauswahl
wenn du deine daten empfangen hast, dann kannst du überprüfen, was überhaupt da ist. was nicht existiert brauchst du erst garnicht in den selects anzubieten.

----------
gliedere deinen spagetticode!
je teilaufgabe eine function. an deren namen kann man dann den programmablauf erkennen und die funktionalität von einzelnen schritten besser testen.

----------
du erstellst einen ziemlich 'aufgeblasenen' code. das trägt nicht unbedingt zur übersichtlichkeit bei:
ActionScript:
  1. content_mc.attachMovie("player_mc", "player_" add playernum, contentlevel);
  2. content_mc["player_" add playernum]._x = xDiv*(playerwidth+20);
  3. content_mc["player_" add playernum]._y = yDiv+5;
  4. content_mc["player_" add playernum].artikel = rootnd.childNodes[i].childNodes[k].childNodes[0].firstChild;
  5. content_mc["player_" add playernum].picture.loadMovie("./" add rootnd.childNodes[i].childNodes[k].childNodes[1].firstChild);
  6. content_mc["player_" add playernum].link = rootnd.childNodes[i].childNodes[k].childNodes[2].firstChild;
  7. ...
  8. // ist das selbe:
  9. var _mc = content_mc.attachMovie("player_mc", "player_"+playernum, contentlevel);
  10. _mc._x = xDiv*(playerwidth+20);
  11. _mc._y = yDiv+5;
  12. var nodes = rootnd.childNodes[i].childNodes[k].childNodes;
  13. _mc.artikel = nodes[0].firstChild;
  14. _mc.picture.loadMovie("./"+nodes[1].firstChild);
  15. _mc.link = nodes[2].firstChild;
  16. ...
das ist kürzer, somit weniger tippfehler möglich, kann einfacher geändert werden und wesentlich schneller, da du z.b. ständig mit childNodes aus dem XML ein array machst. einmal langt doch ;-)
und warum lädst du farbige rechtecke als jpg's ???
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de
hgseib ist offline   Mit Zitat antworten
Alt 08-08-2005, 16:41   #3 (permalink)
FBx
 
Benutzerbild von xlive
 
Registriert seit: May 2003
Beiträge: 968
hi,

genau ein new array muss he, soweit ist das schon klar. nur leider stehe auf dem schlauch.
die frage ist wann bzw. wo ich das array anlege, denke mal vor dem attacheMovie, d.h. die werte werden dann sortiert, attached und ausgeben. nur wenn ich, das new Array in die schleife schreibe, wird es ja bei jedem schleifendurchlauf neu angelegt?!
hier mal ein wenig script denke mal hier muss eingriff stattfinden
ActionScript:
  1. rootnd = mein_xml.childNodes[0].childNodes[5];
  2. var noresult:Number = 0;
  3. //Hier wird _root.comboBox1.getValue() übergeben, d.h. ob VF, F, M usw.)
  4. for (i=droplet1; i<droplet2; i++) {
  5.     //Der Wert(km/h) der zweiten Combobox
  6.     var columnB4:Number = ((combowert2/1200)*volumen);
  7.     var j:Number = 0;
  8.     //Hier werden werden die ausgewählten Werte (min/max) eingelesen
  9.     for (k=0; k<rootnd.childNodes[i].childNodes.length; k++) {
  10.         _root["columnF"+j] = new Number(rootnd.childNodes[i].childNodes[k].childNodes[6].firstChild.toString());
  11.         _root["columnG"+j] = new Number(rootnd.childNodes[i].childNodes[k].childNodes[7].firstChild.toString());
  12.         trace("Alle Werte: "+_root["columnF"+j]);
  13.         var valuevmin:Number = (Math.round(((_root["columnF"+j]*1200)/volumen)*10)/10);
  14.         var valuevmax:Number = Math.floor(((_root["columnG"+j]*1200)/volumen)*10)/10;
  15.         //--
  16.         //Erfüllen die Werte aus der ersten Combobox die Bedingung, werden die dazugehörigen Nodes eingelesen
  17.         if (columnB4>_root["columnF"+j] && columnB4<_root["columnG"+j]) {
  18.             //
  19.             noresult = 1;
  20.             ausgabe_txt12.text = "";
  21.             trace("Ausgabe: "+_root["columnF"+j]);
  22.             switch (rootnd.childNodes[i].nodeName) {
  23.             case "droplet" :
  24.                 contentlevel++;
  25.                 playernum++;
  26.                 if (xDiv == 1) {
  27.                     xDiv = 0;
  28.                     yDiv = content_mc._height;
  29.                 }
  30.                 //Play_mc attachen und ausrichten
  31.                 var ausgabe = content_mc.attachMovie("player_mc", "player_" add playernum, contentlevel);
  32.                 ausgabe._x = xDiv*(playerwidth+20);
  33.                 ausgabe._y = yDiv+5;
  34.                 var nodes = rootnd.childNodes[i].childNodes[k].childNodes;
  35.                 //player_mc LadeBefehle absetzen, Felder befüllen und Link setzen
  36.                 ausgabe.artikel = nodes[0].firstChild;
  37.                 ausgabe.picture.loadMovie("./" add nodes[1].firstChild);
  38.                 ausgabe.link = nodes[2].firstChild;
  39.                 //Abfrage um bei Ganzzahlen ein Komma zu setzen
  40.                 var valuevmin1:String = valuevmin.toString();
  41.                 if (valuevmin1.indexOf(".", 0) == -1) {
  42.                     ausgabe.vmin = valuevmin1+".0";
  43.                 } else {
  44.                     ausgabe.vmin = valuevmin1;
  45.                 }
  46.                 //--
  47.                 var valuevmax1:String = valuevmax.toString();
  48.                 if (valuevmax1.indexOf(".", 0) == -1) {
  49.                     ausgabe.vmax = valuevmax1+".0";
  50.                 } else {
  51.                     ausgabe.vmax = valuevmax1;
  52.                 }
  53.                 //Balkenanzeige
  54.                 ausgabe.balken._x = ((valuevmin*3)+218);
  55.                 ausgabe.balken._width = ((valuevmax-valuevmin)*3);
  56.                 //--------------------------------------------------------------------------
  57.                 //Highlighten
  58.                 //Artikel No.
  59.                 ausgabe.button.onRollOver = function() {
  60.                     this._parent.button.artikelcolor.textColor = 0xAACEAB;
  61.                     _root["container"+i]._x = 0;
  62.                     _root["container"+i]._y = 325;
  63.                     _root["container"+i].loadMovie(this._parent.link);
  64.                 };
  65.                 ausgabe.button.onRollOut = function() {
  66.                     this._parent.button.artikelcolor.textColor = 0x0A510A;
  67.                     _root["container"+i].unloadMovie();
  68.                 };
  69.                 //--------------------------------------------------------------------------
  70.                 xDiv++;
  71.                 //}
  72.                 //Da jetzt ein neuer Wert kommt, muß unbedigt yDiv neu gesetzt werden, damit auch auf jeden Fall gewährleistet ist, daß die Abstände stimmen;
  73.                 yDiv = content_mc._height;
  74.                 xDiv = 0;
  75.                 yDiv++;
  76.                 break;
  77.             case "FRAGEN" :
  78.                 break;
  79.             }
  80.         }
  81.         j += 1;
  82.     }
  83. }
  84. if (noresult == 0) {
  85.     ausgabe_txt12.text = _root.errorvalue4;
  86. }

gruß xlive

Geändert von xlive (08-08-2005 um 16:43 Uhr)
xlive ist offline   Mit Zitat antworten
Alt 08-08-2005, 18:19   #4 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.324
bitte deinen endlosen spagetticode entwirren:
- die XML-daten müssen geladen werden. das ergibt eine eigenständige function. so eine funktion kann man auch für andere projekte nutzen.
- die tabelle löschen == eine eigenständige funktion
- die tabelle anzeigen == eine eigenständige funktion (vorraussichtlich sogar mehrere)
- das xml in ein array überführen == eine eigenständige funktion
usw.
damit man mal durchblicken kann ;-)

dann:
function fINIT() {
fTabelleClear();
fXML_load();
fXML2Array();
}

selects.onChange() {
parameter = xyz;
fTabelleClear();
fTabelleShow();
}

column kannst du ruhig zusammenfassen und bei data ein id ergänzen.
PHP-Code:
<?xml version="1.0"?>
<element>
  <level>...</level>
  <selector>...</selector>
  <combobox>...</combobox>   
  <table>...</table>
  <error>...</error>
  <data id='data'>
    <droplet size="VF">
      <nozzle>
        <name>XR11001</name>
        <flag>data/orange.jpg</flag>
        <link>data/b40.jpg</link>
        <column>0.23,2.5,4.5,0.36,0.49</column>    
      </nozzle>
      <nozzle>
        <name>XR110015</name>
        <flag>data/lightgreen.jpg</flag>
        <link>data/b41.jpg</link>
        <column>0.34,3.5,4.5,0.64,0.72</column>    
      </nozzle>
      <nozzle>
        <name>TF 035</name>
        <flag>data/darkblue.jpg</flag>
        <link>data/b32.jpg</link>
        <column>,,,0.39,0.83</column>
      </nozzle>
    </droplet>
  </data>
</element>
ActionScript:
  1. droplet_ary = [];
  2. fXML_load("data/data2.xml");
  3. //
  4. function fXML_load(vFileName) {
  5.     var _xml = new XML();
  6.     _xml.ignoreWhite = true;
  7.     _xml.load(vFileName);
  8.     _xml.onLoad = function(ok) {
  9.         if (ok) {
  10.             fXML2Array(this);
  11.             fTest();
  12.         } else {
  13.             trace("fehler");
  14.         }
  15.     };
  16. }
  17. function fXML2Array(_xml) {
  18.     // durch id='xxx' kann man geziehlt werte auslesen
  19.     var droplet = _xml['data'].childNodes;
  20.     for (var i in droplet) {
  21.         var nozzle_ary = [];
  22.         var nozzle = droplet[i].childNodes;
  23.         for (var j in nozzle) {
  24.             var nj = nozzle[j].childNodes;
  25.             var name = nj[0].firstChild;
  26.             var flag = nj[1].firstChild;
  27.             var link = nj[2].firstChild;
  28.             var column = nj[3].firstChild.toString().split(',');
  29.             for (var k in column) {
  30.                 column[k] = Number(column[k]);
  31.             }
  32.             nozzle_ary.push({name:name, flag:flag, link:link, column:column});
  33.         }
  34.         droplet_ary.push({size:droplet[i].attributes.size, nozzle:nozzle_ary});
  35.     }
  36. }
  37. function fTest() {
  38.     for (var i in droplet_ary) {
  39.         trace(droplet_ary[i].size);
  40.         trace(droplet_ary[i].nozzle[0].name);
  41.         var h = droplet_ary[i].nozzle[0].column[0];
  42.         if (!isNaN(h)) {
  43.             trace(h);
  44.         }
  45.     }
  46. }
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de

Geändert von hgseib (08-08-2005 um 18:21 Uhr)
hgseib ist offline   Mit Zitat antworten
Alt 08-08-2005, 23:46   #5 (permalink)
FBx
 
Benutzerbild von xlive
 
Registriert seit: May 2003
Beiträge: 968
hi,

ersmal danke für das professionelle script. werde jetzt mal versuchen, das ganze mit meinen bescheidenen programmierkenntnissen in mein script einzuarbeiten.
werde mich diesbezüglich bestimmt nochmal melden

danke. bis dahin.

gruß xlive

Geändert von xlive (08-08-2005 um 23:48 Uhr)
xlive ist offline   Mit Zitat antworten
Alt 09-08-2005, 14:19   #6 (permalink)
FBx
 
Benutzerbild von xlive
 
Registriert seit: May 2003
Beiträge: 968
hi,

bastel noch an der xml-sortierung. danke nochmal hgseib für dein script, leider klappt es noch nicht ganz, dass ganze in mein script einzubauen und es drängt schon etwas die zeit. die anwendung ist soweit fertig und läuft wunderbar, bis auf die sortierung. habe nun mal eine teilscript zum testen der sortierung rausgenommen und nun folgendes problem:
wenn in das array die werte aus columnF schreibe, kann ich sie aufssteigend sortieren, gut.
jetzt sollen noch die dazugehörigen werte aus columnG mit ausgegeben werden, .d.h. wenn die werte aus columnF sortiert werden, müssen natürlich die werte aus columG mitsortiert werden.
Code:
bsp:
vor sortierung:
2 -> 20
3 -> 30
1 -> 10

nach sortierung:
1 -> 10
2 -> 20
3 -> 30
ActionScript:
  1. rootnd = mein_xml.childNodes[0].childNodes[5];
  2. personDB = new Array();
  3. for (i=droplet1; i<droplet2; i++) {
  4.     var columnB4:Number = ((combowert2/1200)*volumen);
  5.     for (k=0; k<rootnd.childNodes[i].childNodes.length; k++) {
  6.         xmlpath = rootnd.childNodes[i].childNodes[k];
  7.         var columnF = new Number(xmlpath.childNodes[6].firstChild.toString());
  8.         var columnG = new Number(xmlpath.childNodes[7].firstChild.toString());
  9.         //--
  10.         //personDB.push(columnF);
  11.         personDB.push({min:columnF, max:columnG});
  12.        
  13.     }
  14.  
  15. }
  16. var sortwert = personDB.sort();
  17. //--
  18. // Sortieren
  19. function sortieren(sortwert) {
  20.     personDB = sortwert;
  21.     //min = max;
  22.     for (i=0; i<personDB.length; i++) {
  23.         //output1.text += personDB[i]+"\n";
  24.         output1.text += personDB[i]["min"]+"\n";
  25.         output2.text += personDB[i]["max"]+"\n";
  26.     }
  27. }
  28. sortieren(sortwert);

nur leider haut es nicht ganz hin. wie kann ich meine array aufsteigend nach columF sortieren das die dazugehörigen werte aus columnG mit sortiert werden?
gruß xlive

P.S.: hgseib, werde mir auf alle dein script in einer ruhigeren minute mal ganz genau anschauen.
xlive ist offline   Mit Zitat antworten
Alt 09-08-2005, 15:58   #7 (permalink)
Neuer User
 
Registriert seit: Jan 2005
Ort: In the arena
Beiträge: 165
hmmm...

zugegebenermassen: ich verstehe nicht so ganz genau, was dein problem ist, aber eins ist sicher: ein blick in die hilfe hilft (autsch) immer.

ActionScript:
  1. personDB=new Array();
  2. personDB.push({min: .36, max: .49});
  3. personDB.push({min: .64, max: .72});
  4. personDB.push({min: .39, max: .83});
  5. personDB.push({min: .6, max: .75});
  6. // zur veranschaulichung
  7. minSortedArr=personDB.slice();
  8. maxSortedArr=personDB.slice();
  9. minSortedArr.sortOn("min", Array.NUMERIC);
  10. maxSortedArr.sortOn("max", Array.NUMERIC);

hoffe'shilft
-sh
subHero ist offline   Mit Zitat antworten
Alt 09-08-2005, 17:17   #8 (permalink)
FBx
 
Benutzerbild von xlive
 
Registriert seit: May 2003
Beiträge: 968
danke für den tipp. aus der hilfe bin ich nicht so recht schlau geworden.
habe es also jetzt mal so gemacht, und? puuuhh, es funktioniert bis jetzt...
kurz zur erklärung was das ganze soll
habe eine xml-tabelle mit zwei "spalten". in der einen steht vmin. in der anderen die vmax. die ausgabe der geschwindigkeitswerte in flash soll nach vmin. sortiert werden, d.h. jetzt muss für produkt a natürlich der vmax-wert noch der gleiche sein wie auch in der tabelle, muss also in der richtigen reihenfolge mit vmin sortiert werden.
ActionScript:
  1. rootnd = mein_xml.childNodes[0].childNodes[5];
  2. personDB = new Array();
  3. for (i=droplet1; i<droplet2; i++) {
  4.     var columnB4:Number = ((combowert2/1200)*volumen);
  5.     for (k=0; k<rootnd.childNodes[i].childNodes.length; k++) {
  6.         xmlpath = rootnd.childNodes[i].childNodes[k];
  7.         var columnF = new Number(xmlpath.childNodes[6].firstChild.toString());
  8.         var columnG = new Number(xmlpath.childNodes[7].firstChild.toString());
  9.         //--
  10.         //personDB.push(columnF);
  11.         personDB.push({min:columnF, max:columnG});
  12.     }
  13. }
  14. minSortedArr = personDB.slice();
  15. minSortedArr.sortOn("min", Array.NUMERIC);
  16. // Sortieren
  17. function sortieren(minSortedArr) {
  18.     personDB = minSortedArr;
  19.     for (i=0; i<personDB.length; i++) {
  20.         output1.text += personDB[i]["min"]+"\n";
  21.         output2.text += personDB[i]["max"]+"\n";
  22.     }
  23. }
  24. sortieren(minSortedArr);

gruß xlive
xlive 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 13:49 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele