Form mit 120 Bildern

  • Hallo zusammen,
    mir fehlt im Moment etwas die zündende Idee.
    Ich habe eine Form in der ca. 120 kleine Bilder sind, wenn der User auf eines oder auf mehrere Bilder clickt soll das Programm das Bild ändern und sich das geänderte Bild merken, denn es soll dann bestimmte Aufgaben durchführen.
    Das mit dem Bild ändern ist kein Problem das klappt schon, ich frag mich nur wie ich es "speichern" soll ob ein Bild aktiviert ist oder nicht.
    Eine andere Frage ist auch noch ob ich dann für die Form 120 Cases brauch, oder sollte man da dann auf die "onEvent-Methode" umstellen?
    Ich hab mir gedacht ich schreibe zu jedem Bild eine zusätzliche Variable, hier ein Beispiel:
    Das Bild auf der Form heißt z.b $Pic1 dann hab ich noch eine zusätzliche Variable $Pic1Status.
    Die Status-Variable könnte ich dann bei allen Bildern abfragen.
    So wie ich mir das gedacht habe wäre das viel "sinnlose" Schreibarbeit und ich denke es geht mit Sicherheit einfacher.
    Danke für eure Tipps :)

    Einmal editiert, zuletzt von h0scHberT (7. Februar 2010 um 21:21)

  • du kannst das einfach in einer ini speichern, die am anfang des scrpts ausgelesen wird

    Spoiler anzeigen

    Grundkenntnisse in: C++, JavaScript
    Sehr gute Kenntnisse: PHP, JAVA, C und näturlich AutoIt


    Klaviatur, Anhang UDF, GDI+ Mühle

    Zitat

    "Wenn einen um 20h der Pizzadienst anruft und fragt, ob man's nur vergessen hat und ob man das gleiche
    möchte wie immer -- dann sollte man sein Bestellverhalten evtl überdenken"

  • erstell Dir doch ein Array[2][120] mit einer For-Schleife.
    in die erste Zelle setzt Du das Bild und in die zweite Zelle den Status. Beim Beenden in einer For-Schleife die 2. Zelle auslesen und
    den Wert jeweils in der ini-Datei speichern.
    Kannst natürlich auch nur ein 1-dimensionales Array $array[120] erstellen...

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

  • So ungefähr meinte das mein Vorredner wahrscheinlich:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <WinAPI.au3>
    #include <WindowsConstants.au3>
    $hGUI = GUICreate("",700,500)

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

    Opt("GUIOnEventMode",1)
    GUISetFont(15)
    $hChild = GUICreate("",600,400,50,50,$WS_CHILD,-1,$hGUI)

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

    Dim $aButtons[200][2]
    $width = 50
    $height = 40
    $i = 0
    For $x = 1 to 12
    For $y = 1 to 10
    $aButtons[$i][0] = GUICtrlCreateButton("",($x-1)*$width,($y-1)*$height,$width,$height)
    GUICtrlSetOnEvent(-1,"_Switch")
    $aButtons[$i][1] = "Nicht aktiviert"
    $i += 1
    Next
    Next
    ;~ _ArrayDisplay($aButtons)

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

    GUISwitch($hGUI)
    $hLable = GUICtrlCreateLabel("test",0,0,700,500,BitOR(0x0200,0x01))

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

    GUISetState(@SW_SHOW,$hChild)
    GUISetState(@SW_SHOW,$hGUI)
    _WinAPI_RedrawWindow($hChild)
    While 1
    Sleep(1000)
    WEnd

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

    Func _Switch()
    $pos = _ArraySearch($aButtons,@GUI_CtrlID)
    If $aButtons[$pos][1] = "Nicht aktiviert" Then
    GUICtrlSetData($hLable,"Letzer Button hatte Ctrl-ID: "&@GUI_CtrlId)
    $aButtons[$pos][1] = "Aktiviert"
    Else
    GUICtrlSetData($hLable,"Dieser Knopf wurde schon aktiviert.")
    EndIf

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

    GUISetState(@SW_HIDE,$hChild)
    $LetzerButton = @GUI_CtrlId
    Sleep(1000)
    GUISetState(@SW_SHOW,$hChild)
    _WinAPI_RedrawWindow($hChild)
    EndFunc

    [/autoit]
  • Vielleicht kannst es so einfacher nachvollziehen:

    Spoiler anzeigen
    [autoit]


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

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

    Bilderauswahl()

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

    Func Bilderauswahl()
    $Bildnummer = IniRead(@ScriptDir & "\Bild.ini", "Aktuelles_Bild","Nummer","1")
    $Form1 = GUICreate("Form1", 965, 681, 192, 124)
    $Pic1 = GUICtrlCreatePic("C:\Dokumente und Einstellungen\All Users\Dokumente\Eigene Bilder\Beispielbilder\Blaue Berge.jpg", 112, 128, 100, 100, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS))
    $Pic2 = GUICtrlCreatePic("C:\Dokumente und Einstellungen\All Users\Dokumente\Eigene Bilder\Beispielbilder\Sonnenuntergang.jpg", 304, 160, 100, 100, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS))
    $Pic3 = GUICtrlCreatePic("C:\Dokumente und Einstellungen\All Users\Dokumente\Eigene Bilder\Beispielbilder\Wasserlilien.jpg", 568, 160, 100, 100, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS))
    $Pic4 = GUICtrlCreatePic("C:\Dokumente und Einstellungen\All Users\Dokumente\Eigene Bilder\Beispielbilder\Winter.jpg", 464, 360, 100, 100, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS))
    $Pic5 = GUICtrlCreatePic("C:\Dokumente und Einstellungen\All Users\Dokumente\Eigene Bilder\Beispielbilder\...", 304, 400, 100, 100, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS))
    $Pic6 = GUICtrlCreatePic("C:\Dokumente und Einstellungen\All Users\Dokumente\Eigene Bilder\Beispielbilder\...", 200, 400, 100, 100, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS))
    ; Restliche Sachen, wie zum Beispiel Buttons
    GUISetState(@SW_SHOW)

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

    While 1
    $Msg = GUIGetMsg()
    If $Msg >= 1 + 2 And $Msg <= 6 + 2 And $Msg <> $Bildnummer Then ; 6 durch die Anzahl der Bilder ersetzen
    ;MsgBox(0,"","Bild Nummer: " & $Msg - 2)
    $Bildnummer = $Msg - 2
    IniWrite(@ScriptDir & "\Bild.ini", "Aktuelles_Bild","Nummer",$Bildnummer)
    Exit
    EndIf
    If $Msg == $GUI_EVENT_CLOSE Then
    Exit
    EndIf
    WEnd
    EndFunc

    [/autoit]


    Wichtig ist, das du die Reihenfolge beachtest (1. Form deklarieren, 2. Bilder erstellen, 3. Die restlichen Sachen, wie Buttons erstellen)!

    Spoiler anzeigen

    Grundkenntnisse in: C++, JavaScript
    Sehr gute Kenntnisse: PHP, JAVA, C und näturlich AutoIt


    Klaviatur, Anhang UDF, GDI+ Mühle

    Zitat

    "Wenn einen um 20h der Pizzadienst anruft und fragt, ob man's nur vergessen hat und ob man das gleiche
    möchte wie immer -- dann sollte man sein Bestellverhalten evtl überdenken"

  • Danke für eure Hilfe, ich bin dadurch schon ein ganzes Stück weiter gekommen!
    Die Form erstellen klappt jetzt, mein Problem ist es jetzt nur noch das Mitteilen an die Switch-Case welches Pic geklickt wurde.
    Hier mal mein Code:

    [autoit]

    #include
    #include
    #include
    #include

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

    Global $FrmPic[120][2]
    $FrmX = 14
    $FrmY = 236
    $Feld = 0

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

    #Region ### START Koda GUI section ### Form=
    $Form1_1 = GUICreate("Excel helfer", 505, 559, 208, 144)
    Sleep(1000)
    For $iyFrm = 0 To 9 Step +1
    For $ixFrm = 0 To 11 Step +1
    $FrmPic[$Feld][1] = IniRead("Settings.ini","Feldstatus","Feld"&$Feld,"0")
    If $FrmPic[$Feld][1] = 0 Then
    $FrmPic[$Feld][0] = GUICtrlCreatePic(@ScriptDir&"\deselect.jpg", $FrmX, $FrmY, 25, 25, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS))
    Else
    $FrmPic[$Feld][0] = GUICtrlCreatePic(@ScriptDir&"\select.jpg", $FrmX, $FrmY, 25, 25, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS))
    EndIf

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

    $FrmX+=32
    $Feld+=1
    Next
    $FrmY+=32
    $FrmX=14
    Next

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

    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()

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

    ;HIER MÜSSTE JETZT WAS REIN; DAMIT DIE FORM CHECKT WELCHES BILD GEKLICKT WURDE

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

    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

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

    EndSwitch
    WEnd

    [/autoit]
  • wenn ich mich nicht irre müsste es mit so einer while schleife gehen:

    Spoiler anzeigen
    [autoit]

    While 1
    $nMsg = GUIGetMsg(1)
    Switch $nMsg[0]
    Case $GUI_EVENT_CLOSE
    Exit
    Case $FrmPic[0][0] To $FrmPic[$Feld - 1][0]
    MsgBox(0,"","Handle des Controls: " &$nMsg[2])
    EndSwitch
    WEnd

    [/autoit]

    kann aber gut sein das es falsch ist.

    ich benutz meistens den OnEvent-Modus. damit gehts sehr viel leichter

  • Hallo,
    mal ein Beispiel wie man so etwas abfragt...

    Spoiler anzeigen
    [autoit]

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

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

    For $k = 0 to 18 Step + 1
    $Blg[$k] = GUICtrlCreateButton($k, 40, 40 + $k * 14, 129, 15, $WS_GROUP)
    GUICtrlSetOnEvent(-1, "_do")
    GuiCtrlSetState(-1,$GUI_ONTOP)
    GUICtrlSetFont(-1, 8, 400, 0, "Arial")
    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]

    /EDIT/ Beispiel vereinfacht

    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

    Einmal editiert, zuletzt von Andy (19. Januar 2010 um 12:56)

  • Hab in meiner oberen Antwort das Beispiel mal vereinfacht...
    HIER gab es eine ähnliche Anfrage

    Generell KANN man das auch mit CASE abfragen machen...dann sollte man aber

    [autoit]

    $msg=guigetmsg(1)

    [/autoit]

    verwenden, man beachte den Parameter und lese die Hilfe^^

    /EDIT/ habs mal verdeutlicht^^

    Spoiler anzeigen
    [autoit]

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

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

    For $k = 0 to 18 Step + 1
    $Blg[$k] = GUICtrlCreateButton($k, 40, 40 + $k * 14, 129, 15, $WS_GROUP)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $msg[0] = ' & $Blg[$k] & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    GUICtrlSetOnEvent(-1, "_do")
    GuiCtrlSetState(-1,$GUI_ONTOP)
    GUICtrlSetFont(-1, 8, 400, 0, "Arial")
    Next

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

    guisetstate()

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

    do
    $msg=guigetmsg(1)
    switch $msg[0]

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

    case $Blg[0] to $Blg[18] ;alle buttons
    _do()
    endswitch

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

    until 0

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

    func _do()
    msgbox (0,"code: "&$msg[0],"Button Nr: "&$msg[0]-3)
    endfunc

    [/autoit]

    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 (19. Januar 2010 um 13:13)

  • ich hab jetzt mein Script auf onEvent umgestellt, leider geht bei mir aber die MsgBox nicht auf, den Fehler finde ich leider nicht :(
    auch kann ich in deinem Beispiel nicht verstehen warum du bei GUICtrlSetOnEvent(-1, "_do") als ersten Parameter die "-1" hast.
    Wenn ich das so klappen sollte müsste doch die msgbox aufgehen sobald ich auf eines der Bilder clicke.

    [autoit]

    #include
    #include
    #include
    #include
    Opt('GUIOnEventMode', 1)

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

    Global $FrmPic[120][2]
    $FrmX = 14
    $FrmY = 236
    $Feld = 0

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

    #Region ### START Koda GUI section ### Form=
    $Form1_1 = GUICreate("Excel helfer", 505, 559, 208, 144)
    Sleep(1000)
    For $iyFrm = 0 To 9 Step +1
    For $ixFrm = 0 To 11 Step +1
    $FrmPic[$Feld][1] = IniRead("Settings.ini","Feldstatus","Feld"&$Feld,"0")
    If $FrmPic[$Feld][1] = 0 Then
    $FrmPic[$Feld][0] = GUICtrlCreatePic(@ScriptDir&"\deselect.jpg", $FrmX, $FrmY, 25, 25, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS))
    Else
    $FrmPic[$Feld][0] = GUICtrlCreatePic(@ScriptDir&"\select.jpg", $FrmX, $FrmY, 25, 25, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS))
    EndIf
    GUISetOnEvent($FrmPic[$Feld][0], "test")
    $FrmX+=32
    $Feld+=1
    Next
    $FrmY+=32
    $FrmX=14
    Next

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

    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    Sleep(100)
    WEnd

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

    Func test()
    MsgBox(0,"","")
    EndFunc

    [/autoit]
  • [autoit]

    GUICtrlSetOnEvent(-1, "_do")

    [/autoit]

    bedeutet das dem zuletzte erstellten control die funktion zugewießen wird


    dein fehler is relativ klein:
    es sollte GUICtrlSetOnEvent() heißen und nicht GUISetOnEvent()

    ;)