Unbestimmte Anzahl an Buttons

  • Hallo,

    ich möchte gerne Bildchen als Button gestalten. Dabei sollen soviele Bildchen wie Ordner in einem Verzeichnis sind angezeigt werden. Ich hbae zu jedem Ornernamen ein identisch heisendes Bilchen. ZB:

    Ordner1
    OrdnerTest

    Dann habe ich in einem zusatz Ordner eine Ordner1.jpg und OrdnerTest.jpg.
    Die Anzahl der Ordner und Bildchen ist unbestimmt. Ich habe es so geschafft dass die Bildchen angezeigt werden:

    [autoit]


    $SetPic[$x] = GUICtrlCreatePic(@ScriptDir & "\Pics\" & $aAllFolders[$x] & ".jpg",$y,0,21,15)

    [/autoit]


    So, das klappt soweit. Es wird für jeden in einem bestimmten Ordner enthaltenen Unterordner ein Bildchen mit demselben Namen wie der Ordner angezeigt.
    Was isch nicht schaffe ist es diesen Bildchen ein Befehl zuzuordnen, also ein Event wenn es angeklickt wird.
    Ich habe bei anderen, statischen Buttons mit

    [autoit]

    Case Buttonname
    Event...

    [/autoit]


    gearbeitet. Nun habe ich hier aber ein Problem mit "Buttonname"
    Hoffe das versteht jemand der mir helfen kann ;)
    Danke

    Einmal editiert, zuletzt von lumb (11. März 2011 um 12:38)

  • Die Buttons oder hier eher Bilder als Array erstellen wie du es gemacht hast und dann z.B. in einer For Schleife abfragen.

    Spoiler anzeigen
    [autoit]

    For $i = 0 To UBound($SetPic) - 1
    Case $SetPic[$i]
    ; ...
    Next

    [/autoit]
    • Offizieller Beitrag

    Ich würde dir dafür den GUIOnEventMode empfehlen.
    Nach jedem erstellten Button

    [autoit]

    GUICtrlSetOnEvent(-1,"DeineFunktion")

    [/autoit]


    Zusätzlich speicherst du deine Pictures nicht in eine 1D sondern in einem 2D Array.
    1.SubFeld = CtrlId, 2. SubFeld = Pfad und Dateiname.
    In der Func DeineFunktion kannst du dann im Array nach dem ControlID suchen , die ControlID des zuletzt geklickten
    Controls befindet sich im Makro @GUI_CtrlId. Suchen geht mit _ArraySearch
    Anhand des Suchergebnis bekommt du dann den Pfad heraus.

  • Hi
    Leider bekomme ich so haufenweise Fehlermeldungen, die sich teilweise auf ganz andere Passagen beziehen:

    MissingEnd, Missing EndSwitch

    -Bezog sich auf den ersten Beitrag-

    den zweiten werde ich mir mal ausarbeiten...

    • Offizieller Beitrag

    Dann poste mal deinen Code. Ohne diesen wird es eine Ratespiel.

  • So, Danke:
    So werden die Bildchen erstellt

    [autoit]


    ...
    If @error = 0 AND FileExists(@ScriptDir & "\Languages\Fahnen\" & $aAllLanguages[$x] & ".jpg") <> 0 Then
    $SetLang[$y] = GUICtrlCreatePic(@ScriptDir & "\Languages\Fahnen\" & $aAllLanguages[$x] & ".jpg",$y,0,21,15)
    $y = $y + 31
    $z=$z+1
    EndIf
    ...
    GUISetState(@SW_SHOW)
    ;GUI Events
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $GUIExit
    _Exit()
    Case $export
    _Export()
    Case $entfernen
    _Enfernen ()
    Case $import
    _Import()
    Case $InstStart
    _InstStart()
    Case $InDatei
    _InDatei()
    Case $InDateiL
    _InDateiL()
    For $i = 1 To 4
    Case $SetLang[$i]
    msgbox(0,"","")
    Next

    [/autoit]

    Danach folgen alle Funktionen.
    Das sind dann die Fehler:

    J:\CAD\Installation\AIS2011.au3(276,2) : ERROR: missing Next.
    Case
    ^
    J:\CAD\Installation\AIS2011.au3(275,13) : REF: missing Next.
    For $i = 1 To
    ~~~~~~~~~~~^
    J:\CAD\Installation\AIS2011.au3(277,3) : ERROR: missing EndSwitch.
    Next
    ^
    J:\CAD\Installation\AIS2011.au3(250,14) : REF: missing EndSwitch.
    Switch $nMsg
    ~~~~~~~~~~~~^
    J:\CAD\Installation\AIS2011.au3(277,3) : ERROR: missing Wend.
    Next
    ^
    J:\CAD\Installation\AIS2011.au3(248,2) : REF: missing Wend.
    While
    ^
    J:\CAD\Installation\AIS2011.au3(277,3) : ERROR: syntax error
    Next
    ^
    J:\CAD\Installation\AIS2011.au3(236,19) : ERROR: _InstalledYes(): undefined function.
    If _InstalledYes()
    ~~~~~~~~~~~~~~~~~^
    J:\CAD\Installation\AIS2011.au3(255,9) : ERROR: _Exit(): undefined function.
    _Exit()
    ~~~~~~^
    J:\CAD\Installation\AIS2011.au3(258,11) : ERROR: _Export(): undefined function.
    _Export()
    ~~~~~~~~^
    J:\CAD\Installation\AIS2011.au3(261,14) : ERROR: _Enfernen(): undefined function.
    _Enfernen ()
    ~~~~~~~~~~~^
    J:\CAD\Installation\AIS2011.au3(264,11) : ERROR: _Import(): undefined function.
    _Import()
    ~~~~~~~~^
    J:\CAD\Installation\AIS2011.au3(267,14) : ERROR: _InstStart(): undefined function.
    _InstStart()
    ~~~~~~~~~~~^
    J:\CAD\Installation\AIS2011.au3(270,12) : ERROR: _InDatei(): undefined function.
    _InDatei()
    ~~~~~~~~~^
    J:\CAD\Installation\AIS2011.au3(273,13) : ERROR: _InDateiL(): undefined function.
    _InDateiL()

    Danke

  • Für die die es Interessiert:
    Mit dem ganzen Script wird ein Programm installiert. Zu dem Programm gibt es Sprachpakete. Nun soll eben für jedes Vorhandene Sprachpaket ein Fähnchen angezeigt werden und bei Klick auf dieses die entprechenden Texte aus einer Ini ausgelesen werden. Damit nun nicht für jede hinzukommende Sprache das Programm geändert werden muss habe ich mir das so ausgedacht:
    Es werden alle Ordner im Sprachverzeichniss ausgelesen und ausgewertet ob es sich um ein richtiges Sprachpaket handelt. Wenn ja Wird ein gleichnamiges Fähnchen angezeigt.
    Die Fähnchen habe ich schon zuvor in einem zusätzlichen Ordner drin...

    Wenn ich es statisch mache klappt alles einwandfrei (Auch Danke dafür ;-))....es geht nur noch um die dynamische Anzahl an Fähnchen und dazugehörige Events..

    • Offizieller Beitrag

    Das bringt gar nichts, schau dir mal die Zeilen an, in welchen die Fehler aufgetreten sind.
    Alles nach Zeile 250 und du hast gerade mal 32 gepostet und anhand dem Codeschnipsel kann dir auch kein Mensch helfen.

    Die Fehlermeldungen das Funktionen nicht gefunden wurden, resultieren wahrscheinlich auch aus vorhergehenden Fehlern im Code.
    Aber das ist jetzt mal geraten und meine Glaskugel sagt mir auch nicht mehr.

  • Jetzt habe ich den Code mal soweit gekürzt dass der Fehler immer noch kommt:

    [autoit]


    #AutoIt3Wrapper_Res_requestedExecutionLevel=requireAdministrator
    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstants.au3>
    #Include <File.au3>
    #Include <Array.au3>
    $LanguageIniFile = @ScriptDir & "\Languages\Languages.ini"
    ;GUI
    GUICreate("Sprachen", 1000, 500, 192, 124)
    GUISetFont(10, 400, 0, "MS Sans Serif")
    ;Welche Sprachen/Ordner sind verfügbar
    Dim $SetLang[10]
    $y = 0
    Dim $aAllLanguages
    $AllLanguages = ""
    $aAllLanguages = _FileListToArray(@ScriptDir & '\Languages',"*",2) ;Vorhandene Ordner werden ausgelesen
    If @Error<>0 Then
    ;Wenn keine Sprachen/Ordner verfügbar sind passiert nichts
    Else
    For $x = 1 to $aAllLanguages[0]
    $SetLang[$x] = GUICtrlCreatePic(@ScriptDir & "\Languages\Fahnen\" & $aAllLanguages[$x] & ".jpg",$y,0,21,15)
    $y = $y + 31 ;Für die Position der Fahnen
    Next
    EndIf
    $GUIExit = GUICtrlCreateButton("Exit", 890, 430, 100, 55, $WS_GROUP)
    GUISetState(@SW_SHOW)
    ;GUI Events
    While 1 ;von Kodak
    $nMsg = GUIGetMsg() ;von Kodak
    Switch $nMsg ;von Kodak
    Case $GUI_EVENT_CLOSE ;von Kodak
    Exit ;von Kodak
    Case $GUIExit
    _Exit()
    For $i = 1 To $aAllLanguages[0] -1
    Case $SetLang[$i]
    msgbox(0,"Test","Test")
    Next
    EndSwitch
    WEnd
    Func _Exit()
    Exit
    EndFunc

    [/autoit]


    Fehler:

    >"C:\Program Files (x86)\AutoIt3\SciTE\AutoIt3Wrapper\AutoIt3Wrapper.exe" /run /prod /ErrorStdOut /in "J:\CAD\Installation\twest.au3" /autoit3dir "C:\Program Files (x86)\AutoIt3" /UserParams
    +>17:49:07 Starting AutoIt3Wrapper v.2.0.1.24 Environment(Language:0407 Keyboard:00000407 OS:WIN_7/Service Pack 1 CPU:X64 OS:X64)
    >Running AU3Check (1.54.19.0) from:C:\Program Files (x86)\AutoIt3
    J:\CAD\Installation\twest.au3(43,3) : ERROR: missing Next.
    Case
    ~ ^
    J:\CAD\Installation\twest.au3(42,14) : REF: missing Next.
    For $i = 1 To
    ~ ~~~~~~~~~~~^
    J:\CAD\Installation\twest.au3(45,3) : ERROR: missing EndSwitch.
    Next
    ~ ^
    J:\CAD\Installation\twest.au3(35,28) : REF: missing EndSwitch.
    Switch $nMsg ;von Kodak
    ~~~~~~~~~~~~ ~~~~~~~~~~^
    J:\CAD\Installation\twest.au3(45,3) : ERROR: missing Wend.
    Next
    ~ ^
    J:\CAD\Installation\twest.au3(33,2) : REF: missing Wend.
    While
    ^
    J:\CAD\Installation\twest.au3(45,3) : ERROR: syntax error
    Next
    ~ ^
    J:\CAD\Installation\twest.au3(40,9) : ERROR: _Exit(): undefined function.
    _Exit()
    ~~~~~~^
    J:\CAD\Installation\twest.au3 - 5 error(s), 0 warning(s)
    !>17:49:07 AU3Check ended.rc:2
    >Exit code: 0 Time: 1.648

    Bei Auskommentierung Zeile 38 - 41 weren zumindest mal die Fahnen, allerdings ohne Event angezeigt.

    Danke für die Hilfe

    • Offizieller Beitrag
    Spoiler anzeigen
    [autoit]

    #AutoIt3Wrapper_res_requestedExecutionLevel=requireAdministrator
    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstants.au3>
    #include <File.au3>
    #include <Array.au3>
    $LanguageIniFile = @ScriptDir & "\Languages\Languages.ini"
    ;GUI
    GUICreate("Sprachen", 1000, 500, 192, 124)
    GUISetFont(10, 400, 0, "MS Sans Serif")
    ;Welche Sprachen/Ordner sind verfügbar
    Dim $SetLang[10]
    $y = 0
    Dim $aAllLanguages
    $AllLanguages = ""
    $aAllLanguages = _FileListToArray(@ScriptDir & '\Languages', "*", 2) ;Vorhandene Ordner werden ausgelesen
    If @error <> 0 Then
    ;Wenn keine Sprachen/Ordner verfügbar sind passiert nichts
    Else
    For $x = 1 To $aAllLanguages[0]
    $SetLang[$x] = GUICtrlCreatePic(@ScriptDir & "\Languages\Fahnen\" & $aAllLanguages[$x] & ".jpg", $y, 0, 21, 15)
    $y = $y + 31 ;Für die Position der Fahnen
    Next
    EndIf
    $GUIExit = GUICtrlCreateButton("Exit", 890, 430, 100, 55, $WS_GROUP)
    GUISetState(@SW_SHOW)
    ;GUI Events
    While 1 ;von Kodak
    $nMsg = GUIGetMsg() ;von Kodak
    Switch $nMsg ;von Kodak
    Case $GUI_EVENT_CLOSE ;von Kodak
    Exit ;von Kodak
    Case $GUIExit
    _Exit()
    Case $SetLang[1] To $SetLang[$SetLang[0]]
    For $i = 1 To $aAllLanguages[0] - 1
    MsgBox(0, "Test", "Test")
    Next
    EndSwitch
    WEnd
    Func _Exit()
    Exit
    EndFunc ;==>_Exit

    [/autoit]

    So sollte die Dynamische Auswahl klappen, kann aber mangels der Daten nicht testen.

    Spoiler anzeigen
    [autoit]

    #AutoIt3Wrapper_res_requestedExecutionLevel=requireAdministrator
    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstants.au3>
    #include <File.au3>
    #include <Array.au3>
    $LanguageIniFile = @ScriptDir & "\Languages\Languages.ini"
    ;GUI
    GUICreate("Sprachen", 1000, 500, 192, 124)
    GUISetFont(10, 400, 0, "MS Sans Serif")
    ;Welche Sprachen/Ordner sind verfügbar
    Dim $SetLang[10]
    $y = 0
    Dim $aAllLanguages
    $AllLanguages = ""
    $aAllLanguages = _FileListToArray(@ScriptDir & '\Languages', "*", 2) ;Vorhandene Ordner werden ausgelesen
    If @error <> 0 Then
    ;Wenn keine Sprachen/Ordner verfügbar sind passiert nichts
    Else
    Redim $SetLang[ubound($aAllLanguages)][2]
    $SetLang[0][0]= $aAllLanguages[0]
    For $x = 1 To $aAllLanguages[0]
    $SetLang[$x][0] = GUICtrlCreatePic(@ScriptDir & "\Languages\Fahnen\" & $aAllLanguages[$x] & ".jpg", $y, 0, 21, 15)
    $SetLang[$x][1] = @ScriptDir & "\Languages\Fahnen\" & $aAllLanguages[$x] & ".jpg"
    $y = $y + 31 ;Für die Position der Fahnen
    Next
    EndIf
    $GUIExit = GUICtrlCreateButton("Exit", 890, 430, 100, 55, $WS_GROUP)
    GUISetState(@SW_SHOW)
    ;GUI Events
    While 1 ;von Kodak
    $nMsg = GUIGetMsg() ;von Kodak
    Switch $nMsg ;von Kodak
    Case $GUI_EVENT_CLOSE ;von Kodak
    Exit ;von Kodak
    Case $GUIExit
    _Exit()
    Case $SetLang[1][0] To $SetLang[$SetLang[0][0]][0]
    Local $index = _Arraysearch( $SetLang,$nMsg,0,0,0,0,0,1)
    MsgBox(0, "Auswahl", $SetLang[$index][1])
    EndSwitch
    WEnd
    Func _Exit()
    Exit
    EndFunc ;==>_Exit

    [/autoit]

    Wenn es nicht klappt schick mal bitte die notwendigen Daten.

  • Hallo,
    ind er Zeile 43

    [autoit]

    MsgBox(0, "Auswahl", $SetLang[$index][1])

    [/autoit]

    scheint noch ein Problem zu sein.

    ersetzte ich die Meassagebox durch eine statische

    [autoit]

    msgbox(0,"","")

    [/autoit]

    funktioniert es soweit. Es kommt dann halt immer die gleiche Box.

    Der Fehler lautet :

    MSGBox(0, "Auswahl", $SetLang[$index[1])

    Error Array variable subscipt badly formatted.

    (Kannst Du mir evtl auch kurz erklären was das $nMsg bedeutet?)

    Kannst Du damit was anfangen.

    Danke aber schonmal bis dahin!!!

  • Hallo lumb,

    der Fehler dürfte weiter oben zu finden sein, das Array muss so deklariert werden:

    [autoit]

    Dim $SetLang[10][2]

    [/autoit]

    $nMsg = die gerade erhaltene Controlid, der Nachricht, wenn diese sich im Array $setLang befindet wird anhand dessen der Index des Eintrags gesucht, damit man den Pfad zur Sprachdatei erhält

    mfg autoBert

  • Leider Nein, es ist das selbe wie zuvor. (Die Variable wird ja etwas weiter unten mit einem Redim 2Dimensional erstellt)
    Was ich herausgefunden habe icst, das $index -1 ist. dann steht da ja quasi

    [autoit]

    MsgBox(0, "Auswahl", $SetLang[-1][1])

    [/autoit]

    Kann das damit was zu tun haben?
    Danke aber auch Dir.
    Im Anhang habe ich das ganza mal als Zip Datei.

  • Hallo lumb,

    das mit dem Redim hatte ich übersehen. Wenn Index -1 ist bedeutet dass das es nicht gefunden wurde und das liegt wieder an Zeile 42 selbst, diese muss so lauten:

    [autoit]

    Local $index = _Arraysearch( $SetLang,$nMsg,0,0,0,0,0,0)

    [/autoit]

    mfg autoBert

  • [autoit]

    Local $index = _Arraysearch( $SetLang,$nMsg)

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

    Ich habe die Zahlenfolge weggelassen...klappt wunderbar.

    Danke an alle