Variable Funktionen!?

  • Hey, ich wüsste gerne, ob es möglich ist, variable Funktionen zu erstellen!?...

    Also eine Art "Schleife", die "Funktionen erstellt"!?...

    Zur besseren Erläuterung ->

    Spoiler anzeigen
    [autoit]

    Func _bo0()
    $nr = 0
    _bo()
    EndFunc
    Func _bo1()
    $nr = 1
    _bo()
    EndFunc
    Func _bo2()
    $nr = 2
    _bo()
    EndFunc
    Func _bo3()
    $nr = 3
    _bo()
    EndFunc
    Func _bo4()
    $nr = 4
    _bo()
    EndFunc
    Func _bo5()
    $nr = 5
    _bo()
    EndFunc
    Func _bo6()
    $nr = 6
    _bo()
    EndFunc
    Func _bo7()
    $nr = 7
    _bo()
    EndFunc
    Func _bo8()
    $nr = 8
    _bo()
    EndFunc

    [/autoit]

    Das ist ein "wichtiger2 Teil meines Scriptes... Ich möchte das natürlich gerne abkürzen, mit ner For...Next-Schleife, z.B....
    Aber man kann das ja nicht so einfach... Gibts da einen Trick!?...

    Warum ich dafür jeweils eine Funktion habe?!...
    GuiCtrlSetOnEvent...!
    Ich kann da leider keine Parameter mitgeben... Ich habe ein TreeView und möchte, wenn man auf einen Eintrag klickt, dass dieser verschwindet(klappt alles soweit auch^^!) und ich nutze NICHT GetMsg! Sondern muss SetOnEvent nehmen...
    Damit kann ich aber nur Funktionen ansteuern... Und er kann ohne Mitgabe von Parametern ja NUR durch eigene Funktionen unterscheiden, WELCHER Eintrag aktiviert wurde, oder?!


    Wenns da eine Lösung für gibt, wäre das toll^^ Würde mein Script viel übersichtlicher machen *hehe*


    LG

    Einmal editiert, zuletzt von Acanis (24. November 2009 um 09:59)

    • Offizieller Beitrag

    Hier mal ein Beispiel:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    Opt('GUIOnEventMode', 1)

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

    $hGui = GUICreate('Treeview', 400, 300)
    GUISetOnEvent($GUI_EVENT_CLOSE, '_End')
    $hTreeView = GUICtrlCreateTreeView(10, 10, 240, 280)
    $hDummy = GUICtrlCreateDummy()
    Dim $hItem[18]
    For $j = 0 To 12 Step 6
    $hItem[$j] = GUICtrlCreateTreeViewItem('root' & $j, $hTreeView)
    GUICtrlSetOnEvent(-1, '_TreeviewClick')
    For $i = 1 To 5
    $hItem[$j + $i] = GUICtrlCreateTreeViewItem('test' & $i, $hItem[$j])
    GUICtrlSetOnEvent(-1, '_TreeviewClick')
    Next
    Next
    GUISetState()

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

    While True
    Sleep(1000)
    WEnd

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

    Func _End()
    Exit
    EndFunc

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

    Func _TreeviewClick()
    Local $iItem, $sText
    $iItem = @GUI_CtrlId - $hDummy - 1
    $sText = ControlTreeView($hGui, '', $hTreeView, 'GetSelected')
    ToolTip('Item: ' & $iItem & @CR & 'Tree: ' & $sText)
    EndFunc

    [/autoit]
  • Danke euch beiden, werde mir das anschauen!^^

    LG


    *edit*

    HAMMER! Danke^^ Perfekte Lösung, konnte es problemlos umsetzen, gutes Beispiel^^
    Aus der Hilfe wird gar nicht ersichtlich, wie man das richtig nutzen kann Oo...

    Einmal editiert, zuletzt von Acanis (24. November 2009 um 09:58)

  • Sorry für Doppelpost, war aber ja schon als gelöst eingetragen... *hust*...

    Habe die Abkürzung nun auch auf andere Bereiche übertragen und z.B. ->

    Spoiler anzeigen
    [autoit]

    For $k = 0 to 4 Step + 1
    Dim $Blg[19]
    $Blg[$k] = GUICtrlCreateButton($b[$k], 40, 40 + $k * 14, 129, 15, $WS_GROUP)
    GUICtrlSetOnEvent(-1, "")
    GuiCtrlSetState(-1,$GUI_ONTOP)
    GUICtrlSetFont(-1, 8, 400, 0, "Arial")
    Next
    For $k = 6 to 8 Step + 1
    $Blg[$k] = GUICtrlCreateButton($b[$k], 40, 40 + ($k - 1) * 14, 129, 15, $WS_GROUP)
    GUICtrlSetOnEvent(-1, "_do")
    GuiCtrlSetState(-1,$GUI_ONTOP)
    GUICtrlSetFont(-1, 8, 400, 0, "Arial")
    Next
    For $k = 10 to 11 Step + 1
    $Blg[$k] = GUICtrlCreateButton($b[$k], 40, 40 + ($k - 2) * 14, 129, 15, $WS_GROUP)
    GUICtrlSetOnEvent(-1, "_do")
    GuiCtrlSetState(-1,$GUI_ONTOP)
    GUICtrlSetFont(-1, 8, 400, 0, "Arial")
    Next
    For $k = 13 to 13
    $Blg[$k] = GUICtrlCreateButton($b[$k], 40, 40 + ($k - 3) * 14, 129, 15, $WS_GROUP)
    GUICtrlSetOnEvent(-1, "_do")
    GuiCtrlSetState(-1,$GUI_ONTOP)
    GUICtrlSetFont(-1, 8, 400, 0, "Arial")
    Next
    For $k = 15 to 18
    $Blg[$k] = GUICtrlCreateButton($b[$k], 40, 40 + ($k - 4) * 14, 129, 15, $WS_GROUP)
    GUICtrlSetOnEvent(-1, "_do")
    GuiCtrlSetState(-1,$GUI_ONTOP)
    GUICtrlSetFont(-1, 8, 400, 0, "Arial")
    Next

    [/autoit]


    Dadurch klappt die Func dazu nur bis zu einem gewissen Grad!

    Spoiler anzeigen
    [autoit]

    Func _do()
    For $i = 0 to 8 Step + 1
    $build = $b[@GUI_CtrlId - $gdummy - 1]
    if GUICtrlRead($TreeView[$i], 1) = " *****" then
    GuiCtrlSetData($TreeView[$i], $build)
    ExitLoop
    endif
    Next
    EndFunc

    [/autoit]


    Und zwar bei 1-4... Bei 6 auch noch! 7 fügt er einfach einen leeren String ein und ab 8 teils leere Strings, teils um -1 verschobene Strings... Muss ich dafür immer neue Dummys dann machen!? Liegt das an der komischen Abkürzung? Kann man das auch anders umgehen!?

    Und JA! ich brauche die Lücken... :(

    Spoiler anzeigen
    [autoit]

    $b[0] = "000"
    $b[1] = "123"
    $b[2] = "234"
    $b[3] = "456"
    $b[4] = "678"
    $b[6] = "789"
    $b[7] = "890"
    $b[8] = "901"
    $b[10] = "111"
    $b[11] = "222"
    $b[13] = "333"
    $b[15] = "444"
    $b[16] = "555"
    $b[17] = "666"
    $b[18] = "777"

    [/autoit]


    (nicht wirklich, aber das "echte" Innenleben ist unnütz umfangreich!)


    So sind die Werte definiert...

    *edit*
    Also eig. ist das Problem wohl genau: "Kann man AUSNAHMEN in einer For...Next-Schleife festlegen?"

    *edit*

    Spoiler anzeigen
    [autoit]

    For $k = 0 to 18 Step + 1
    Dim $Blg[19]
    if $k <> 5 AND $k <> 9 AND $k <> 12 AND $k <> 14 Then
    $Blg[$k] = GUICtrlCreateButton($b[$k], 40, 40 + $k * 14, 129, 15, $WS_GROUP)
    GUICtrlSetOnEvent(-1, "_do")
    GuiCtrlSetState(-1,$GUI_ONTOP)
    GUICtrlSetFont(-1, 8, 400, 0, "Arial")
    EndIf
    Next

    [/autoit]


    Dieses war übrigens mein Versuch, aber da habe ich halt das $k noch nicht richtig drin... Habe die "Leerstellen" dann auch als Sprünge in der Button-Reihe!

    6 Mal editiert, zuletzt von Acanis (24. November 2009 um 12:26)

  • Spoiler anzeigen
    [autoit]

    For $k = 0 to 18 Step + 1
    Dim $Blg[19]
    if $k <> 5 AND $k <> 9 AND $k <> 12 AND $k <> 14 Then
    $Blg[$k] = GUICtrlCreateButton($b[$k], 40, 40 + $k * 14, 129, 15, $WS_GROUP)
    GUICtrlSetOnEvent(-1, "_do")
    GuiCtrlSetState(-1,$GUI_ONTOP)
    GUICtrlSetFont(-1, 8, 400, 0, "Arial")
    EndIf
    Next

    [/autoit]


    Habe es jetzt so umgeschrieben... Vergiss den Rest *gg*...

    Wie man sieht, sind k = 5, 9, 12, 14 "weg"... Die dürfen nicht mit rein!
    Nun habe ich aber das Problem in dem Teil -> GUICtrlCreateButton($b[$k], 40, 40 + $k * 14, 129, 15, $WS_GROUP)

    Ich habe also bei k * 5, k * 9, k * 12 und k * 14 ein LOCH!
    Das will ich nicht haben... Habe versucht da was anderes reinzubauen, mit if k < 5, etc... Dann gabs auf einmal Falschbelegungen...
    Ich müsste also eig. zwischen 5 und 9 die Werte mit ($k - 1) * 14, zwischen 9 und 12 mit ($k - 2) *14 , etc... berechnen...

    Die Ausnahmen muss es geben und ich will das gerne in eine Funktion reinkriegen... In 4 Stücken hatte ich es schon laufen... Ist aber unnötig, denke ich mir... Will den Code aufräumen, bevor ich weiter mache Oo Ist schon so lang und noch so wenig Funktionen xD *gg*


    Jedenfalls greife ich halt so -> $b[@GUI_CtrlId - $gdummy - 1] auf ein Array zu... Wenn ich also die Funktion so bearbeite, dass die Button aneinander rücken, verschwindet die richtige Array-Belegung immer...


    Ich hoffe, das ist klarer ausgedrückt und du kannst mir helfen^^...


    LG

  • schau mal hier, so kann man es lösen. Ich schreibe ggf zu diesen variablen Sequenzen (Array of Buttons/Radios usw) gerne mal ein TUT.

    nur zur kurzen Erklärung, der Ausdruck ($i>10) liefert für alle $i>10 EINS und ansonsten NULL

    für 2 Spalten a 15 Checkboxen

    [autoit]

    For $i = 1 To 30
    $pc[$i] = GUICtrlCreateCheckbox($i, 10 + (($i > 15) * 40), 30 + ($i - (($i > 15) * 15)) * 20)
    Next

    [/autoit]


    für 3 Spalten a 10 Checkboxen

    [autoit]

    For $i = 1 To 30
    $pc[$i] = GUICtrlCreateCheckbox($i, 10 + ((($i > 10)+($i>20)) * 40), 30 + ($i - (($i > (($i>20)+1)*10) * (($i>20)+1)*10)) * 20)
    Next

    [/autoit]


    nicht vergessen DIM anzupassen

  • Ach, so kommt man an den Namen? Sowas habe ich gesucht, aber in der Hilfe steht NICHTS über diesen Parameter... Nur halt, dass man die nutzen kann...

    Werde das probieren, Andys Lösung kann ich nicht ganz nachvollziehen, versuche das nachher nochmal zu verstehen xD

    Muss ich aber anpassen, ne? Naja, muss leider erstmal weg, denke aber, dass ich die Func wieder umgebaut mit dem Auslesen dann hin kriege,... :)

    LG


    *edit*

    Also der Befehl passt schon mal xD Nur noch die Func umbasteln^^

    Falls Andy das genauer auf mein Beispiel beziehen könnte, wäre das perfekt, denn die Func muss ich ja trotzdem umbauen^^,... Sieht kürzer aus, als meine Lösung xD *hehe*


    *edit*

    Denke, mit probieren "versteh" ich das wohl... ABER die Ausnahmen erklärt das ja nicht, oder?!... -.-
    Button kreiieren klappt ja auch so sehr gut...

    4 Mal editiert, zuletzt von Acanis (24. November 2009 um 16:36)

  • Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    Opt('GUIOnEventMode', 1)
    Dim $Blg[19]
    dim $b[19]
    $gui=guicreate("",300,300)

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

    $m=-1
    For $k = 0 to 18 Step + 1

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

    if $k <> 5 AND $k <> 9 AND $k <> 12 AND $k <> 14 Then
    $m+=1
    $Blg[$m] = GUICtrlCreateButton($b[$m], 40, 40 + $m * 14, 129, 15, $WS_GROUP)
    GUICtrlSetOnEvent(-1, "_do")
    GuiCtrlSetState(-1,$GUI_ONTOP)
    GUICtrlSetFont(-1, 8, 400, 0, "Arial")
    EndIf
    Next

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

    guisetstate()

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

    do
    until 0

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

    func _do()
    msgbox (0,@GUI_CtrlId,"button nr. "&@GUI_CtrlId-$blg[0])
    endfunc

    [/autoit]

    so?

  • Andy: Ich habe KEINE AHNUNG, warum das geht... Ehrlich... Es ist mir einfach ein RÄTSEL, wie du darauf kommst...

    ABER -> Es funktioniert Oo...

    Unglaublich xD...

    Vielen Dank *lach*!!!

    LG