Arrays, Arrays, Arrays... ich verweilfe-.-

  • Hallo,

    ich weiß was arrays sind und wozu sie genutzt werden, jedoch habe ich es bisher imma noch net hinbekommen sie wirksam und richtig einzusetzen.

    Hier habe ich ein programm, was aus 2 Gleichen teilen besteht, nur jeweils die variablen sind anders und die angabe der y position im gui.
    Da ich nicht nur 2 teile brauche sondern eig. so ca 60-100 davon, wäre es eine krasse arbeit dies alles zu machen. Dafür gibt es ja arrays die einem die arbeit bei sowas erleichtern.

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>

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

    $in = 0
    $schonda=0
    GuiCreate("DKP Manager",340,80,100,100)

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

    ;_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_

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

    $name1=GuiCtrlCreateLabel("Antipope",20,20,90,15)
    $dkp1=GuiCtrlCreateLabel("275",115,20,35,15)
    $input1=GUICtrlCreateInput("", 160, 18, 40,19)
    $buttonplus1=GUICtrlCreateButton("+", 210, 18, 30, 19)
    $buttonminus1=GUICtrlCreateButton("-", 250, 18, 30, 19)

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

    GuiSetState()

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

    func plus1()
    $in=GUICtrlRead($input1)
    $schonda=GUICtrlRead($dkp1)
    GUICtrlDelete($dkp1)
    $dkp1=GUICtrlCreateLabel($schonda + $in, 115, 20, 35, 15)
    GUICtrlDelete($input1)
    $input1=GUICtrlCreateInput("", 160, 18, 40,19)
    $schonda=0
    $in = 0
    EndFunc

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

    func minus1()
    $in=GUICtrlRead($input1)
    $schonda=GUICtrlRead($dkp1)
    GUICtrlDelete($dkp1)
    $dkp1=GUICtrlCreateLabel($schonda - $in, 115, 20, 35, 15)
    GUICtrlDelete($input1)
    $input1=GUICtrlCreateInput("", 160, 18, 40,19)
    $schonda=0
    $in = 0
    endfunc

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

    ;_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_

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

    $name2=GuiCtrlCreateLabel("Antipope",20,50,90,15)
    $dkp2=GuiCtrlCreateLabel("275",115,50,35,15)
    $input2=GUICtrlCreateInput("", 160, 48, 40,19)
    $buttonplus2=GUICtrlCreateButton("+", 210, 48, 30, 19)
    $buttonminus2=GUICtrlCreateButton("-", 250, 48, 30, 19)

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

    GuiSetState()

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

    func plus2()
    $in=GUICtrlRead($input2)
    $schonda=GUICtrlRead($dkp2)
    GUICtrlDelete($dkp2)
    $dkp2=GUICtrlCreateLabel($schonda + $in, 115, 50, 35, 15)
    GUICtrlDelete($input2)
    $input2=GUICtrlCreateInput("", 160, 48, 40,19)
    $schonda=0
    $in = 0
    EndFunc

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

    func minus2()
    $in=GUICtrlRead($input2)
    $schonda=GUICtrlRead($dkp2)
    GUICtrlDelete($dkp2)
    $dkp2=GUICtrlCreateLabel($schonda - $in, 115, 50, 35, 15)
    GUICtrlDelete($input2)
    $input2=GUICtrlCreateInput("", 160, 48, 40,19)
    $schonda=0
    $in = 0
    endfunc

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

    ;_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_

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

    While 1
    $msg=GuiGetMsg()
    If $msg=-3 Then Exit
    if $msg = $buttonplus1 then plus1()
    If $msg = $buttonminus1 then minus1()
    If $msg = $buttonplus2 Then plus2()
    if $msg = $buttonminus2 then minus2()
    Wend

    [/autoit]

    Das problem ist halt, das ich es net alleine auf die reihe bekomme diese angaben alle in arrays zu setzen, und richtig erkennen zu lassen von autoit.

    Darum bitte ich euch, mir zu helfen, mir vllt. mein programm in arrays zu setzten, und/oder mir dabei zu helfen es selber zu machen.
    mfg

  • hat bisschen gedauert aber hier mal mein ergebnis:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>

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

    Opt("GuiOnEventMode", 1)

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

    Dim $name[20], $dkp[20], $input[20], $buttonplus[20], $buttonminus[20]

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

    GUICreate("DKP Manager", 340, 700)
    For $i = 0 To 19
    $name[$i] = GUICtrlCreateLabel("Antipope", 20, 20 + $i * 30, 90, 15)
    $dkp[$i] = GUICtrlCreateLabel("275", 115, 20 + $i * 30, 35, 15)
    $input[$i] = GUICtrlCreateInput("", 160, 18 + $i * 30, 40, 19)
    $buttonplus[$i] = GUICtrlCreateButton("+", 210, 18 + $i * 30, 30, 19)
    GUICtrlSetOnEvent(-1, "plus")
    $buttonminus[$i] = GUICtrlCreateButton("-", 250, 18 + $i * 30, 30, 19)
    GUICtrlSetOnEvent(-1, "minus")
    Next

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

    GUISetState()
    GUISetOnEvent($GUI_EVENT_CLOSE, "close")

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

    While 1
    Sleep(100)
    WEnd

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

    Func close()
    Exit
    EndFunc

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

    Func plus()
    GUICtrlSetData(@GUI_CtrlId-2, GUICtrlRead(@GUI_CtrlId-2) + GUICtrlRead(@GUI_CtrlId-1))
    GUICtrlSetData(@GUI_CtrlId-1, "")
    EndFunc

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

    Func minus()
    GUICtrlSetData(@GUI_CtrlId-3, GUICtrlRead(@GUI_CtrlId-3) - GUICtrlRead(@GUI_CtrlId-2))
    GUICtrlSetData(@GUI_CtrlId-2, "")
    EndFunc

    [/autoit]


    Bei vielen Controls die in einem Array erstellt werden ist der OnEvent modus einfach viel besser ;)
    wenn du mir genauer sagst wie dus willst bau ichs dir evtl auch um

  • Hi, eigentlich brauchst du keine Arrays^^
    Habe sie dennoch eingebaut, schau mal, ob du damit was anfangen kannst

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    Dim $dkp[10] ;10 label, eigentlich sind die arrays in diesem beispiel unnötig...
    Dim $input[10]
    Dim $buttonplus[10]
    Dim $buttonminus[10]

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

    $gui = GUICreate("Buttonarray")
    For $zeile = 0 To 9 ;10 Zeilen füllen
    $dkp[$zeile] = GUICtrlCreateLabel("275", 115, 20 + 30 * $zeile, 35, 15)
    $input[$zeile] = GUICtrlCreateInput($zeile, 160, 18 + 30 * $zeile, 40, 19) ;dem array die ID des inputcontrols übergeben
    $buttonplus[$zeile] = GUICtrlCreateButton("+", 210, 18 + 30 * $zeile, 30, 19)
    $buttonminus[$zeile] = GUICtrlCreateButton("-", 250, 18 + 30 * $zeile, 30, 19)
    Next
    GUISetState()

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

    While 1
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_CLOSE
    $string = ""
    For $i = 0 To 9 ;inhalte der inputs ausgeben
    $string &= "Input Zeile " & $i & " hat den Wert " & GUICtrlRead($input[$i]) & @CRLF ;aus dem array die ID des inputcontrols auslesen
    Next
    MsgBox(0, "Dialog wurde beendet", $string)
    Exit
    Case $GUI_EVENT_MINIMIZE
    MsgBox(0, "", "Dialog wurde minimiert", 2)
    Case $GUI_EVENT_MAXIMIZE
    MsgBox(0, "", "Dialog wurde wiederhergestellt", 2)

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

    Case $buttonplus[0] To $buttonminus[9] ;alle plus- und minus-buttons abfragen
    $gedruecktezeile = Int(($msg / 4) - 1) ;zeile ermitteln (eigentlich unnötig)
    If Mod($msg - 1, 4) = 0 Then ;plus wurde gedrückt
    MsgBox(0, "PLUS-Button gedrückt", "in Zeile " & $gedruecktezeile & @CRLF & "Zahl im input wird um 1 erhöht!", 2)
    GUICtrlSetData($msg - 1, Number(GUICtrlRead($msg - 1)) + 1) ;wert im input eins erhöhen
    Else ;minus wurde gedrückt
    MsgBox(0, "MINUS-Button gedrückt", "in Zeile " & $gedruecktezeile & @CRLF & "Zahl im input wird um 1 erniedrigt!", 2)
    GUICtrlSetData($msg - 2, Number(GUICtrlRead($msg - 2)) - 1) ;wert im input 1 erniedrigen
    EndIf
    EndSwitch
    WEnd

    [/autoit]

    /edit/ Schnitzel, du benötigst die Arrays in deinem Script genausowenig wie ich die in meinem...^^
    Bsp: [ gelöst ] Automatische Variablennamen

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    2 Mal editiert, zuletzt von Andy (24. Juni 2010 um 18:54)

    • Offizieller Beitrag

    GUICtrlSetData(@GUI_CtrlId-2, GUICtrlRead(@GUI_CtrlId-2) + GUICtrlRead(@GUI_CtrlId-1))
    GUICtrlSetData(@GUI_CtrlId-1, "")

    das versteh ich net


    @GUI_CtrlId ist ein Makro (nur im OnEvent-Mode verfügbar), das die ID des zuletzt geklickten Controls zurückgibt.
    Die hier verwendete Konstruktion ist eigentlich nicht unbedingt zu empfehlen. Sie bedingt eine bestimmte Reihenfolge in der Erstellung der Controls (Controls bekommen eine fortlaufende ID in der Reihenfolge ihrer Erstellung). Manchmal ändert man später noch was im Skript und baut sich dann einen Fehler ein. ;)
    Somit kann man mit @GUI_CtrlId -1/+1 relativ zum geklickten Control adressieren.

  • ok und dann wüsste ich noch gerne ob man iwie so eine art runterscroll einbauen könnte, das wenn halt die tabelle über das gui hinaus nach unten reicht, das man es mit dem mausrad oda von mir aus mit einem balken an der rechten seite des guis runterscrollen kann?

    Und: Kann man alle einträge iwie den werten nach von groß nach klein anzeigen lassen, also das sich das wenn man einen wert verändert, direkt halt verschiebt und sortiert=
    mfg

  • Dtex,
    ggf wäre es sinnvoll, wenn du mal umschreiben würdest um was es überhaupt geht, bzw. was du erreichen willst.
    Einen Thread zu starten in dem es um Arrays geht (die man im vorliegenden Fall nichtmal braucht) um dann dem Tip für eine Listview hinterherzulaufen und nach 38 Postingss dann festzustellen es wäre mit einer anderen Lösung viel einfacher zu realisieren gewesen, ist m.E. suboptimal....
    Problem bzw. Ziel beschreiben und dafür Lösungen abfragen ist erstens wesentlich schneller und zweitens vergrault es keine Helfer, die sich nicht gern doppelt und dreifach Arbeit machen.