multidimensionales array in bestehende inputboxen einfügen

  • ich will ein excel sheet in bestehende inputboxen einfügen.
    das hier habe ich:

    [autoit]

    Func _excelimport()
    $sFilePath1 = FileOpenDialog("Bitte Excel datei auswählen", @ScriptDir, "Text files (*.xlsx)") ; Diese Datei sollte bereits existieren
    $oExcel = _ExcelBookOpen($sFilePath1, 0)

    [/autoit][autoit][/autoit][autoit]

    If @error = 1 Then
    MsgBox(0, "Fehler!", "Das Excel-Objekt konnte nicht erstellt werden")
    Exit
    ElseIf @error = 2 Then
    MsgBox(0, "Fehler!", "Die Datei existiert nicht!")
    Exit
    EndIf
    $aArray = _ExcelReadSheetToArray($oExcel) ; Benutzt die vorgegebenen Parameter
    _ArrayDisplay($aArray, "Das Array benutzt die vorgegebenen Parameter")
    _ExcelBookClose($oExcel) ; Zum Abschluss verlassen wir das Programm
    $menge = UBound($aArray)
    For $i = 2 To $menge - 1
    GUICtrlSetData($Input1, $aArray[$i][6])
    Next

    [/autoit][autoit][/autoit][autoit]

    EndFunc ;==>_excelimport

    [/autoit]

    wie kann ich in der for.... next schleife so lange die nächste inputbox nutzen lassen bis die spalte des arrays abgearbeitet ist?
    im anschluss wird das gleiche nochmal mit einer anderen spalte in andere boxen gemacht. da kommt aber stringsplit noch dazu, da ich dort trennzeichen habe. dazu aber vielleicht später.

    I spent 10 minutes reviewing code and thinking "What kind of drugs is this guy on?" before realizing it was something I wrote.

    2 Mal editiert, zuletzt von Maximus1 (7. Mai 2012 um 22:36)

  • Erstmal reden wir von einem 2D Array laut Hilfe, Multidimensional kann alles oder nix sein.

    Jetzt zu deiner Frage. Das hängt davon ab wie du deine Input Controls erstellst. Ich würde dir da nahelegen sämtliche Input Controlids nicht in seperaten Variablen, sondern ebenfalls in einem Array zu speichern.
    Nun ergibt sich aber zwangsläufig die Frage, ob die werte Anzahl deiner Excel Tabelle variabel ist oder ob es sich immer um genau gleich viele Zeilen/Spalten handelt. Um genügend Inputs erstellen zu können muss die Datenmenge natürlich im Vorfeld bekannt sein, oder aber du erstellst die Inputs erst dann wenn sie gebraucht werden, dynamisch an der Anzahl der Daten gemessen. Das wiederum würde ggf. auch den Einsatz einer Scrollbar erfordern, da die GUI sonst möglicherweise nicht groß genug zur Darstellung ist.


    Eine andere Frage wäre noch ob inputs in der Handhabung überhaupt sinnvoll sind. Möglicherweise wäre es vielleicht sinnvoll stattdessen ein Listview zu verwenden? Ein Listview ist prinzipiell ja nichts anderes als viele zusammengebundene Inputs. Auch Listviews können editierbar gehalten werden sofern das notwndig sein sollte.


    Gehen wir mal davon aus du willst eine fixe Anzahl Inputs im array verwalten und dann befüllen:


    [autoit]


    dim $aInput[10] ; fixe größe, Datenmenge kann somit nicht variabel sein

    [/autoit][autoit][/autoit][autoit]

    ; inputerstellung

    [/autoit][autoit][/autoit][autoit]

    $left = 10
    $top = 10
    $width = 100
    $height = 20

    [/autoit][autoit][/autoit][autoit]

    for $i=0 to ubound($aInput)-1
    $aInput[$i] = guictrlcreateinput($left, $top + ($i*30),$width,$height)
    next

    [/autoit][autoit][/autoit][autoit]

    ; excel kram

    [/autoit][autoit][/autoit][autoit]

    ;...

    [/autoit][autoit][/autoit][autoit]

    ; input befüllen

    [/autoit][autoit][/autoit][autoit]

    For $i = 2 To $menge - 1
    if ubound($aInput)-1 <= $i-2 then ; zur sicherheit, falls du doch mehr Daten als Inputs hast
    GUICtrlSetData($aInput[$i-2], $aArray[$i][6])
    endif
    Next

    [/autoit][autoit][/autoit][autoit][/autoit]
  • danke erstmal für deine hilfe.
    es sind insgesammt 90 inputboxen die gefüllt werden sollen/können, die sich aufteilen in 30 user und ihren dazugehörigen nummern (asset). es gibt zudem ca 30 softwarepakete.
    die daten bekomme ich aus einer excel tabelle, welche bis zu 30 user nebst ihrer asset nummer und einem feld "software" besteht.... zumindest ist das was ich daraus brauche.
    die software ist von user zu user unterschiedlich.

    ich fragte mich schon wie man da ganze boxen erstellen übersichtlicher und kompakter halten kann, die antwort darauf habe ich somit ganz nebenher bekommen. :)

    das ganze soll schlussendlich dazu dienen altiris schneller mit daten füttern zu können.


    edit: wie kann ich die inputboxen denn ansprechen, wenn ich die so anlege?

    I spent 10 minutes reviewing code and thinking "What kind of drugs is this guy on?" before realizing it was something I wrote.

    Einmal editiert, zuletzt von Maximus1 (5. Mai 2012 um 23:14)

  • Für 30x3 Felder würde das ganze sinnvollerweise dann so ausschauen:

    [autoit]


    dim $aInput[30][3] ; fixe größe, Datenmenge kann somit nicht variabel sein

    [/autoit][autoit][/autoit][autoit]

    ; inputerstellung

    [/autoit][autoit][/autoit][autoit]

    $left = 10
    $top = 10
    $width = 100
    $height = 20

    [/autoit][autoit][/autoit][autoit]

    for $i=0 to ubound($aInput)-1 ; zeilen
    for $j=0 to ubound($aInput,2)-1 ; spalten
    $aInput[$i][$j] = guictrlcreateinput($left + ($j*110), $top + ($i*30),$width,$height)
    next
    next

    [/autoit][autoit][/autoit][autoit]

    ; excel kram

    [/autoit][autoit][/autoit][autoit]

    ;...

    [/autoit][autoit][/autoit][autoit]

    ; input befüllen

    [/autoit][autoit][/autoit][autoit]

    For $i = 2 To $menge - 1
    if ubound($aInput)-1 <= $i-2 then ; zur sicherheit, falls du doch mehr Daten als Inputs hast
    GUICtrlSetData($aInput[$i-2][0], $aArray[$i][6])
    GUICtrlSetData($aInput[$i-2][1], $aArray[$i][3]) ; 3 ist mangels kenntnis deiner Tabelle nun zufällig gewählt
    GUICtrlSetData($aInput[$i-2][2], $aArray[$i][5]) ; 5 ist mangels kenntnis deiner Tabelle nun zufällig gewählt
    endif
    Next

    [/autoit][autoit][/autoit][autoit][/autoit]


    EDIT:

    Ansprechen kannst du die Inputs wie man eben Arrays anspricht:

    [autoit]


    msgbox(0,"","Inhalt Input Zeile 1 Spalte 1: " & guictrlread($aInput[0][0]))
    msgbox(0,"","Inhalt Input Zeile 2 Spalte 1: " & guictrlread($aInput[1][0]))
    msgbox(0,"","Inhalt Input Zeile 3 Spalte 2: " & guictrlread($aInput[2][1]))

    [/autoit][autoit][/autoit][autoit]

    ;oder auch
    _arraydisplay($aInput)

    [/autoit]

    Einmal editiert, zuletzt von misterspeed (5. Mai 2012 um 23:22)

  • das ist alles gut zu wissen und ich bin dir sehr dankbar für den code, jedoch ist das projekt schon weit vortgeschritten und ein umbauen würde viel zeit kosten.
    in folgenden projekten wird der code auf jeden fall einfliessen.

    daher nochmals zurück zur ursprünglichen fragestellung.
    wie kann ich die bestehenden inputboxen aus dem array befüllen?

    I spent 10 minutes reviewing code and thinking "What kind of drugs is this guy on?" before realizing it was something I wrote.

  • Nicht in einer Schleife wenn du die Cotrol Ids nicht in einem Array hast, also wie ich mal annehme nach diesem schma erstellt hast:

    [autoit]


    $input1=guictrlcreate....
    $input2=guictrlcreate....
    $input3=guictrlcreate....
    $input4=guictrlcreate....

    [/autoit]

    Es gäbe jedoch noch einen Trick um nachträglich die IDs auch so anzusprechen. Das geht aber nur wenn du die Controls alle in Folge erstellst und zwischendrin nicht noch andere GUI Controls erstellt werden.

    [autoit]


    $startIndex=guictrlcreatedummy() ; dummy gui control bekommt ebenfalls id und alles danach ist dann für dich relevant
    $input1=guictrlcreate....
    $input2=guictrlcreate....
    $input3=guictrlcreate....
    $input4=guictrlcreate....
    $endIndex=guictrlcreatedummy() ; ab hier interessieren dich die ids nicht mehr

    [/autoit]

    Da Controlids fortlaufende Nummern haben kannst du so jetzt in deiner For Schleife die Controlids der Reihe nach durchgehen.

    [autoit]


    $currentID = $startIndex+1
    For $i = 2 To $menge - 1
    GUICtrlSetData($currentID, $aArray[$i][6])
    $currentID += 1
    if $currentID >= $endindex then exitloop ; zur Sicherheit, falls mehr Daten als Inputs vorhanden
    Next

    [/autoit]
  • Du könntest es auch so machen.

    [autoit]

    For $i = 2 To UBound($aArray) - 1
    GUICtrlSetData(Eval("Input" & $i - 1), $aArray[$i][6])
    Next

    [/autoit]
  • hallo leute,
    ich habe mich doch noch dran gesetzt und die boxen per for next schleife erstellen lassen.
    daraufhin ist mein script von knapp unter 700 zeilen auf gerade mal 250 zeilen geschrumpft.

    es war doch nicht so viel arbeit wie gedacht und mein projekt ist nun auch fertig und wartet auf den produktiveinsatz die nächste woche.
    die daten in arrays, das dann sortieren und per arrayunique und arraysort aufräumen ging recht schnell.
    ebenso das einfügen lasen dieser bereinigten daten in die checkboxen.

    vielen dank für den doch massiven denkanstoss :)

    I spent 10 minutes reviewing code and thinking "What kind of drugs is this guy on?" before realizing it was something I wrote.