Case abfrage bei unbekannten vielen controls

  • Hey ,

    ich hab da ma wieder nen problem und zwar.

    Ich weiß garne wie ich das richtig beschreiben soll.

    erstma Quellcode :)

    Spoiler anzeigen
    [autoit]


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

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

    $anzeige=0
    $ini = IniReadSectionNames ( "progs.ini" )
    $h = IniRead ( "config.ini", "config", "top", "20" )
    $size = IniRead ( "config.ini", "config", "size", "20" )
    $ini[0] += 1
    Global $pic[$ini[0]] , $pic1[$ini[0]]
    $ini[0] -= 1
    $width = @DesktopWidth
    $width -=$size
    $width1 = @DesktopWidth
    $width1 -=$size
    $h1 = $size + $h
    ;MsgBox (0,0,$ini[1])

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

    $gui = GUICreate("", 0, 0,0,0,$WS_POPUP)

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

    $startpicgui= GUICreate("", $size, $size, $width, $h, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_MDICHILD), $gui)
    $startpic = GUICtrlCreatePic("startbutton.gif", 0, 0, $size, $size)
    For $i = 1 to $ini[0] Step +1
    $width -=$size
    $pic[$i]= GUICreate("", $size, $size, $width, $h, $WS_POPUP, $WS_EX_MDICHILD, $gui)
    $pic1[$i] = GUICtrlCreatePic(IniRead ( "progs.ini", $ini[$i], "bild", "default" ), 0, 0,$size,$size)
    Next

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

    GUISetState(@SW_SHOW,$startpicgui)
    While 1

    If WinGetTitle("[ACTIVE]") = "Program Manager" Or WinGetTitle("[ACTIVE]") = "" or WinGetTitle ("[ACTIVE]") = "Start" Then
    $mousepos = MouseGetPos ()
    if ($mousepos[1] >= $h and $mousepos[1] <= $h1 and $mousepos[0] >= $width1) Then
    if ($anzeige==0)then
    For $i = 1 to $ini[0] Step +1
    GUISetState(@SW_SHOW, $pic[$i])
    GUIctrlSetState($pic1[$i],$Gui_SHOW )
    $anzeige=1
    Next
    EndIf
    Else

    if ($anzeige==1) Then
    if ($mousepos[1] >= $h and $mousepos[1] <= $h1 and $mousepos[0] >= $width) then


    else
    For $i = 1 to $ini[0] Step +1
    GUISetState(@SW_HIDE, $pic[$i])
    GUIctrlSetState($pic1[$i],$Gui_Hide )
    $anzeige=0
    Next
    EndIf
    EndIf
    endif
    EndIf

    $nMsg = GUIGetMsg()
    ;AB HIER
    Switch $nMsg
    For $i = 1 to $ini[0] Step +1

    case $pic[$i]
    run (IniRead ( "progs.ini", $ini[$i], "pfad", default )

    Next
    EndSwitch
    ;HIER ENDE

    Sleep (10)
    WEnd

    [/autoit]

    Ich muss halt wissen ob das Bild geklickt wurde oder nicht.

    ich hab versucht das case so zu erstellen

    [autoit]


    For $i = 1 to $ini[0] Step +1

    case $pic[$i]
    run (IniRead ( "progs.ini", $ini[$i], "pfad", default )

    Next

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

    aber das geht leider nicht

    hat jemannd vllt noch ne idee

    bilder uns so sind im anhang

    Gruß Nitrama

  • Hi

    Hab den Code schnell überflogen.
    Ich würde es so machen:

    1 GuiOnEventModus verwenden
    2 vor und nach der Schleife, in der die BilderControls erzeugt werden, ein Dummycontrol erstellen.
    3 in der OnEventClick-Funktion überprüfen, ob der Wert von @GUI_CtrlId größer als das erste Dummy und kleiner als das zweite Dummy ist.
    durch @GUI_CtrlId - Dummy1 kannst du ausrechnen, welches Bild geklickt wurde...

    ist das verständlich? ;)

    E

  • OK ein sehr minimalistisches Beispiel:

    Spoiler anzeigen
    [autoit]

    #include <File.au3>
    #include <GUIConstantsEx.au3>

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

    Opt("GUIOnEventMode", 1)

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

    $hGui = GUICreate("Test")
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    GUISetState()

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

    $aFiles = _FileListToArray(@ScriptDir, "*.gif")
    $cDummy1 = GUICtrlCreateDummy()
    For $i = 1 To $aFiles[0]
    GUICtrlCreatePic($aFiles[$i], 10, ($i - 1) * 40 + 10, 30, 30)
    GUICtrlSetOnEvent(-1, "_Click")
    Next
    $cDummy2 = GUICtrlCreateDummy()

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

    While Sleep(100)
    WEnd

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

    Func _Click()
    If @GUI_CtrlId > $cDummy1 And @GUI_CtrlId < $cDummy2 Then
    MsgBox(0, "", "Bild Nr.: " & @GUI_CtrlId - $cDummy1 & " wurde geklickt")
    EndIf
    EndFunc ;==>_Click

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

    Func _Exit()
    Exit
    EndFunc ;==>_Exit

    [/autoit]

    Umsetzen musst du das nun schon selber :D

    E

  • eukalyptus

    ich bekomme es blos hin das das letzte ertstellte bild funktioniert die anderen gehen einfach nicht ^^

    Fresapore

    deins geht fast perfeckt nur man muss fast immer mehrmals klicken damit es reagiert ist natürlich auch nicht das gelbe vom ei


    Ich danke euch wirkle für eure Hilfe

    Aber ich glaube ich brauch noch mehr Hilfe ^^

    • Offizieller Beitrag

    Wenn du zeigen würdest wie du versucht hast ,dein Script in den OnEventMode zu schaffen,
    könnte man dir auch helfen. Kein Mensch weiß was du fabriziert hast.
    Alleine sowas, wie es geht net, ist nicht produktiv.

  • also

    mit dem Beispiel von Fresapore

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    ;GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    ;Opt("GUIOnEventMode", 1)
    $anzeige=0
    $ini = IniReadSectionNames ( "progs.ini" )
    $h = IniRead ( "config.ini", "config", "top", "20" )
    $size = IniRead ( "config.ini", "config", "size", "20" )
    $ini[0] += 1
    Global $pic[$ini[0]] , $pic1[$ini[0]]
    $ini[0] -= 1
    $width = @DesktopWidth
    $width -=$size
    $width1 = @DesktopWidth
    $width1 -=$size
    $h1 = $size + $h

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


    $gui = GUICreate("", 0, 0,0,0,$WS_POPUP)

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

    $startpicgui= GUICreate("", $size, $size, $width, $h, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_MDICHILD), $gui)

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

    $startpic = GUICtrlCreatePic("startbutton.gif", 0, 0, $size, $size)

    ;$cDummy1 = GUICtrlCreateDummy()
    For $i = 1 to $ini[0] Step +1
    $width -=$size
    $pic[$i]= GUICreate("", $size, $size, $width, $h, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_MDICHILD), $gui)
    $pic1[$i] = GUICtrlCreatePic(IniRead ( "progs.ini", $ini[$i], "bild", "default" ), 0, 0,$size,$size)
    ; GUICtrlSetOnEvent(-1, "_Click")
    Next
    ;$cDummy2 = GUICtrlCreateDummy()
    GUISetState(@SW_SHOW,$startpicgui)
    While 1

    If WinGetTitle("[ACTIVE]") = "Program Manager" Or WinGetTitle("[ACTIVE]") = "" or WinGetTitle ("[ACTIVE]") = "Start" Then
    $mousepos = MouseGetPos ()
    if ($mousepos[1] >= $h and $mousepos[1] <= $h1 and $mousepos[0] >= $width1) Then
    if ($anzeige==0)then
    For $i = 1 to $ini[0] Step +1
    GUISetState(@SW_SHOW, $pic[$i])
    GUIctrlSetState($pic1[$i],$Gui_SHOW )
    $anzeige=1
    Next
    EndIf
    Else

    if ($anzeige==1) Then
    if ($mousepos[1] >= $h and $mousepos[1] <= $h1 and $mousepos[0] >= $width) then


    else
    For $i = 1 to $ini[0] Step +1
    GUISetState(@SW_HIDE, $pic[$i])
    GUIctrlSetState($pic1[$i],$Gui_Hide )
    $anzeige=0
    Next
    EndIf
    EndIf
    endif
    EndIf

    $nMsg = GUIGetMsg(1)
    For $i = 1 to $ini[0] Step +1
    If $nMsg[1] = $pic[$i] And $nMsg[0] = $pic1[$i] Then run (IniRead ( "progs.ini", $ini[$i], "pfad", default ))
    Next
    WEnd

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

    ;Func _Click()
    ; If @GUI_CtrlId > $cDummy1 And @GUI_CtrlId < $cDummy2 Then
    ; MsgBox(0, "", "Bild Nr.: " & @GUI_CtrlId - $cDummy1 & " wurde geklickt")

    ; EndIf
    ;EndFunc ;==>_Click

    [/autoit]


    und hier noch ma mit dem Beispiel von eukalyptus

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    Opt("GUIOnEventMode", 1)
    $anzeige=0
    $ini = IniReadSectionNames ( "progs.ini" )
    $h = IniRead ( "config.ini", "config", "top", "20" )
    $size = IniRead ( "config.ini", "config", "size", "20" )
    $ini[0] += 1
    Global $pic[$ini[0]] , $pic1[$ini[0]]
    $ini[0] -= 1
    $width = @DesktopWidth
    $width -=$size
    $width1 = @DesktopWidth
    $width1 -=$size
    $h1 = $size + $h

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


    $gui = GUICreate("", 0, 0,0,0,$WS_POPUP)

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

    $startpicgui= GUICreate("", $size, $size, $width, $h, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_MDICHILD), $gui)

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

    $startpic = GUICtrlCreatePic("startbutton.gif", 0, 0, $size, $size)

    $cDummy1 = GUICtrlCreateDummy()
    For $i = 1 to $ini[0] Step +1
    $width -=$size
    $pic[$i]= GUICreate("", $size, $size, $width, $h, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_MDICHILD), $gui)
    $pic1[$i] = GUICtrlCreatePic(IniRead ( "progs.ini", $ini[$i], "bild", "default" ), 0, 0,$size,$size)
    GUICtrlSetOnEvent(-1, "_Click")
    Next
    $cDummy2 = GUICtrlCreateDummy()
    GUISetState(@SW_SHOW,$startpicgui)
    While 1

    If WinGetTitle("[ACTIVE]") = "Program Manager" Or WinGetTitle("[ACTIVE]") = "" or WinGetTitle ("[ACTIVE]") = "Start" Then
    $mousepos = MouseGetPos ()
    if ($mousepos[1] >= $h and $mousepos[1] <= $h1 and $mousepos[0] >= $width1) Then
    if ($anzeige==0)then
    For $i = 1 to $ini[0] Step +1
    GUISetState(@SW_SHOW, $pic[$i])
    GUIctrlSetState($pic1[$i],$Gui_SHOW )
    $anzeige=1
    Next
    EndIf
    Else

    if ($anzeige==1) Then
    if ($mousepos[1] >= $h and $mousepos[1] <= $h1 and $mousepos[0] >= $width) then


    else
    For $i = 1 to $ini[0] Step +1
    GUISetState(@SW_HIDE, $pic[$i])
    GUIctrlSetState($pic1[$i],$Gui_Hide )
    $anzeige=0
    Next
    EndIf
    EndIf
    endif
    EndIf

    ;$nMsg = GUIGetMsg(1)
    ; For $i = 1 to $ini[0] Step +1
    ; If $nMsg[1] = $pic[$i] And $nMsg[0] = $pic1[$i] Then run (IniRead ( "progs.ini", $ini[$i], "pfad", default ))
    ; Next
    WEnd

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

    Func _Click()
    If @GUI_CtrlId > $cDummy1 And @GUI_CtrlId < $cDummy2 Then
    MsgBox(0, "", "Bild Nr.: " & @GUI_CtrlId - $cDummy1 & " wurde geklickt")

    EndIf
    EndFunc ;==>_Click

    [/autoit]


    ich hab bestimmt bloß so einen selten dämlichen Fehler drin den ich einfach nicht finde

    ma sehen ob du helfen kannst ^^


    PS: es das erst bild geht nicht habe ich grad rausgefunden aber der rest geht komischer weise

    Einmal editiert, zuletzt von Nitrama (13. Oktober 2011 um 23:49)

  • Hallo nitrama,

    hier auf deinem Skript aufbauend eine Lösung:

    Spoiler anzeigen
    [autoit]

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

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

    $anzeige = 0
    $ini = IniReadSectionNames("progs.ini")
    ;_ArrayDisplay($ini)
    $h = IniRead("config.ini", "config", "top", "20")
    $size = IniRead("config.ini", "config", "size", "20")
    Global $pic[$ini[0] + 1], $pic1[$ini[0] + 1]
    $width = @DesktopWidth
    $width -= $size
    $width1 = @DesktopWidth
    $width1 -= $size
    $h1 = $size + $h
    ;MsgBox (0,0,$ini[1])

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

    $gui = GUICreate("", 0, 0, 0, 0, $WS_POPUP)

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

    $startpicgui = GUICreate("", $size, $size, $width, $h, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_MDICHILD), $gui)
    $startpic = GUICtrlCreatePic("startbutton.gif", 0, 0, $size, $size)
    For $i = 1 To $ini[0] ;Step +1
    $width -= $size
    $pic[$i] = GUICreate("", $size, $size, $width, $h, $WS_POPUP, $WS_EX_MDICHILD, $gui)
    $pic1[$i] = GUICtrlCreatePic(IniRead("progs.ini", $ini[$i], "bild", "default"), 0, 0, $size, $size)
    Next
    ;_ArrayDisplay($pic1)
    GUISetState(@SW_SHOW, $startpicgui)
    While 1
    If WinGetTitle("[ACTIVE]") = "Program Manager" Or WinGetTitle("[ACTIVE]") = "" Or WinGetTitle("[ACTIVE]") = "Start" Then
    $mousepos = MouseGetPos()
    if ($mousepos[1] >= $h And $mousepos[1] <= $h1 And $mousepos[0] >= $width1) Then
    if ($anzeige == 0) Then
    For $i = 1 To $ini[0] Step +1
    GUISetState(@SW_SHOW, $pic[$i])
    GUICtrlSetState($pic1[$i], $Gui_SHOW)
    $anzeige = 1
    Next
    EndIf
    Else

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

    if ($anzeige == 1) Then
    if ($mousepos[1] >= $h And $mousepos[1] <= $h1 And $mousepos[0] >= $width) Then

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

    Else
    For $i = 1 To $ini[0] Step +1
    GUISetState(@SW_HIDE, $pic[$i])
    GUICtrlSetState($pic1[$i], $Gui_Hide)
    $anzeige = 0
    Next
    EndIf
    EndIf
    EndIf
    EndIf

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

    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

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

    Case $pic1[1] To $pic1[$ini[0]]
    $iClickOn = $nMsg - $pic1[1] + 1 ;ausrechnen welches Bild geklickt wurde
    ConsoleWrite("Bild: " & $iClickOn & " wurde geklickt" & @CRLF)
    run (IniRead ( "progs.ini", $ini[$i], "pfad", default )
    EndSwitch
    ;Sleep (10) hat in einer Schleife in der bereits GuiGetMsg enhalten ist nichts verloren => schädlich
    WEnd

    [/autoit]

    mfg autoBert