Mit mehreren Arrays gleichen Case/Funktion etc. auslösen

  • Hallo liebe AutoIt.de Community,

    bisher konntet ihr mir immer wunderbar helfen und ich denke, auch dieses mal wird es nicht anders sein.

    Ich möchte mit mehreren Arrays die gleiche Funktion ansprechen.
    Also ich stelle mir das so vor:

    Spoiler anzeigen
    [autoit]

    Dim $MA[5]

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

    $MA[0] = GUICtrlCreateLabel("1", 10, 10, 20, 20)
    $MA[1] = GUICtrlCreateLabel("2", 10, 30, 20, 20)
    $MA[2] = GUICtrlCreateLabel("3", 10, 50, 20, 20)
    $MA[3] = GUICtrlCreateLabel("4", 10, 70, 20, 20)
    $MA[4] = GUICtrlCreateLabel("5", 10, 90, 20, 20)
    $MA[5] = GUICtrlCreateLabel("6", 10, 110, 20, 20)

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

    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $MA[<EGAL>]
    MsgBox(0, "", $MA[<WAS GEWÄHLT WURDE>])
    EndSelect
    WEnd

    [/autoit]


    Es soll also beim Click auf das jeweilige Label, eine Messagebox mit der Variablen des selbigen Lables erscheinen.
    Wahrscheinlich ist es einfacher als ich denke, aber ich komme nicht dahinter. =/

    Vielen Dank im Voraus!

    PS: Der Code ist jetzt so auf dem Kopf entstanden ohne Test.


  • Vielen Dank für die Antwort, funktioniert das denn auch mit mehrdimensionalen Arrays?

    [autoit]

    Case $MA[0][0] To $MA[5][10]

    [/autoit]

    Funktioniert leider nicht. =/

  • Das hat mit Arrays nichts zu tun sondern lediglich mit den Werten die du dort angibst.

    Ein Case 1 To 5 deckt z.B. die Fälle 1,2,3,4,5 ab.
    Blume nutzt in seinem Beispiel aus, dass die Control-IDs Ganzzahlen sind und nacheinander aufsteigend, nach dem Zeitpunkt ihrer Erstellung, sortiert sind.
    Wenn $MA[0] z.b. den Wert 3 bekommen hat, dann hat $MA[1] den Wert 4 bekommen und $MA[2] den Wert 5.

    Es kommt also nicht darauf an ob du die beiden Grenzwert für Case aus einem 1D oder 2D-Array holst, sondern schlicht nur welchen Wert sie besitzen.

  • Das hat mit Arrays nichts zu tun sondern lediglich mit den Werten die du dort angibst.

    Ein Case 1 To 5 deckt z.B. die Fälle 1,2,3,4,5 ab.
    Blume nutzt in seinem Beispiel aus, dass die Control-IDs Ganzzahlen sind und nacheinander aufsteigend, nach dem Zeitpunkt ihrer Erstellung, sortiert sind.
    Wenn $MA[0] z.b. den Wert 3 bekommen hat, dann hat $MA[1] den Wert 4 bekommen und $MA[2] den Wert 5.

    Es kommt also nicht darauf an ob du die beiden Grenzwert für Case aus einem 1D oder 2D-Array holst, sondern schlicht nur welchen Wert sie besitzen.


    Achso, verstehe, wie gehe ich dann mit der Mehrdimensionalität um? also kann ich die dann einfach ohne zweiten Wert erfassen? =/

  • Na was stehen denn für Werte im Array drin?
    Die Frage musst du dir stellen - ob das nun ein 2D-Array ist. ist schlicht wurscht.

    Du kannst mit Case Fälle in Bereiche von Ganzzahlen zusammenfassen.
    Nicht mehr und nicht weniger.

  • Na was stehen denn für Werte im Array drin?
    Die Frage musst du dir stellen - ob das nun ein 2D-Array ist. ist schlicht wurscht.

    Du kannst mit Case Fälle in Bereiche von Ganzzahlen zusammenfassen.
    Nicht mehr und nicht weniger.


    Also als Beispiel:

    Spoiler anzeigen
    [autoit]

    $MACountGUIDay = GUICtrlCreateLabel("", -100, -100)
    GUICtrlSetData($MACountGUIDay, _FileCountLines(@ScriptDir & "\MA.ini"))
    $MACountPosDay = GUICtrlCreateLabel("160", -100, -100)
    $MACountPosDayY = GUICtrlCreateLabel("100", -100, -100)
    For $i = 1 To GUICtrlRead($MACountGUI)-3 Step 1
    GUICtrlSetData($MACountPos, "0")
    For $j = 1 To 31 Step 1
    $MAWord[$i][$j] = GUICtrlCreateLabel("-", GUICtrlRead($MACountPosDay), GUICtrlRead($MACountPosDayY), 25, 25, $SS_SUNKEN)
    GUICtrlSetFont(-1, 13)
    If mod($i, 2) <> 0 Then GUICtrlSetBkColor(-1, 0xccc7c7)
    GUICtrlSetData($MACountPosDay, GUICtrlRead($MACountPosDay) + 25)
    Next
    GUICtrlSetData($MACountPosDayY, GUICtrlRead($MACountPosDayY) + 25)
    GUICtrlSetData($MACountPosDay, "160")
    Next

    [/autoit]

    Hier wird ein etwa 80x30 Felder (jw. 25x25 Px) erzeugt. Jedes dieser 240 Felder hat einen wert angegeben in $MA[1-80][1-31] und egal auf welches Label man nun Klickt, soll eine MsgBox mit dem jeweiligen Wert erscheinen. Dies kriege ich nicht realisiert.

  • So könnte man es mit guisetoneventmode lösen!

    Spoiler anzeigen
    [autoit]

    Opt("GUIOnEventMode",1);Hier (statt guigetmsg)

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

    $MACountGUIDay = GUICtrlCreateLabel("", -100, -100)
    GUICtrlSetData($MACountGUIDay, _FileCountLines(@ScriptDir & "\MA.ini"))
    $MACountPosDay = GUICtrlCreateLabel("160", -100, -100)
    $MACountPosDayY = GUICtrlCreateLabel("100", -100, -100)
    For $i = 1 To GUICtrlRead($MACountGUI)-3 Step 1
    GUICtrlSetData($MACountPos, "0")
    For $j = 1 To 31 Step 1
    $MAWord[$i][$j] = GUICtrlCreateLabel("-", GUICtrlRead($MACountPosDay), GUICtrlRead($MACountPosDayY), 25, 25, $SS_SUNKEN)
    GUICtrlSetOnEvent(-1,"_LabelPressed") ;HIER
    GUICtrlSetFont(-1, 13)
    If mod($i, 2) <> 0 Then GUICtrlSetBkColor(-1, 0xccc7c7)
    GUICtrlSetData($MACountPosDay, GUICtrlRead($MACountPosDay) + 25)
    Next
    GUICtrlSetData($MACountPosDayY, GUICtrlRead($MACountPosDayY) + 25)
    GUICtrlSetData($MACountPosDay, "160")
    Next

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

    ;ab hier
    Func _LabelPressed()
    local $x,$y
    for $i=0 to UBound($MAWord)-1 step 1
    for $j=0 to UBound($MAWord,0)-1 step 1
    if $MAWord[$i][$j]=@GUI_CtrlId then
    $x=$i
    $y=$j
    ExitLoop 2
    endif
    next
    next
    msgbox(48,"","Label "&$x&":"&$y&" geklickt!")
    EndFunc

    [/autoit]
  • Vielen Dank, funktioniert leider nicht. Es kommt zwar kein Fehler, aber auch keine MsgBox =(