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
Form mit 120 Bildern
-
- [ gelöst ]
-
h0scHberT -
10. Januar 2010 um 16:45 -
Geschlossen -
Erledigt
-
-
du kannst das einfach in einer ini speichern, die am anfang des scrpts ausgelesen wird
-
Mit 120 "Cases" wird das schon eher ein zähes Script
-
poste doch mal dein script, dann sieht man am besten was sich da machen lässt^^
-
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... -
So ungefähr meinte das mein Vorredner wahrscheinlich:
Spoiler anzeigen
[autoit]#include <Array.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <WinAPI.au3>
#include <WindowsConstants.au3>
$hGUI = GUICreate("",700,500)Opt("GUIOnEventMode",1)
[/autoit] [autoit][/autoit] [autoit]
GUISetFont(15)
$hChild = GUICreate("",600,400,50,50,$WS_CHILD,-1,$hGUI)Dim $aButtons[200][2]
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$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)GUISwitch($hGUI)
[/autoit] [autoit][/autoit] [autoit]
$hLable = GUICtrlCreateLabel("test",0,0,700,500,BitOR(0x0200,0x01))GUISetState(@SW_SHOW,$hChild)
[/autoit] [autoit][/autoit] [autoit]
GUISetState(@SW_SHOW,$hGUI)
_WinAPI_RedrawWindow($hChild)
While 1
Sleep(1000)
WEndFunc _Switch()
[/autoit] [autoit][/autoit] [autoit]
$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.")
EndIfGUISetState(@SW_HIDE,$hChild)
[/autoit]
$LetzerButton = @GUI_CtrlId
Sleep(1000)
GUISetState(@SW_SHOW,$hChild)
_WinAPI_RedrawWindow($hChild)
EndFunc -
Vielleicht kannst es so einfacher nachvollziehen:
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <Misc.au3>Bilderauswahl()
[/autoit] [autoit][/autoit] [autoit]Func Bilderauswahl()
[/autoit] [autoit][/autoit] [autoit]
$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)While 1
[/autoit]
$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
Wichtig ist, das du die Reihenfolge beachtest (1. Form deklarieren, 2. Bilder erstellen, 3. Die restlichen Sachen, wie Buttons erstellen)! -
Danke für eure Hilfe, ich bin dadurch schon ein ganzes Stück weiter gekommen!
[autoit]
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:#include
[/autoit][autoit][/autoit][autoit]
#include
#include
#includeGlobal $FrmPic[120][2]
[/autoit][autoit][/autoit][autoit]
$FrmX = 14
$FrmY = 236
$Feld = 0#Region ### START Koda GUI section ### Form=
[/autoit][autoit][/autoit][autoit]
$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$FrmX+=32
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
$Feld+=1
Next
$FrmY+=32
$FrmX=14
NextGUISetState(@SW_SHOW)
[/autoit][autoit][/autoit][autoit]
#EndRegion ### END Koda GUI section ###While 1
[/autoit][autoit][/autoit][autoit]
$nMsg = GUIGetMsg();HIER MÜSSTE JETZT WAS REIN; DAMIT DIE FORM CHECKT WELCHES BILD GEKLICKT WURDE
[/autoit][autoit][/autoit][autoit]Switch $nMsg
[/autoit][autoit][/autoit][autoit]
Case $GUI_EVENT_CLOSE
ExitEndSwitch
[/autoit]
WEnd -
wenn ich mich nicht irre müsste es mit so einer while schleife gehen:
Spoiler anzeigen
[autoit]While 1
[/autoit]
$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
WEndkann 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>
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
#include <WindowsConstants.au3>
Opt('GUIOnEventMode', 1)
Dim $Blg[19]
dim $b[19]
$gui=guicreate("",300,500)For $k = 0 to 18 Step + 1
[/autoit] [autoit][/autoit] [autoit]
$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")
Nextguisetstate()
[/autoit] [autoit][/autoit] [autoit]do
[/autoit] [autoit][/autoit] [autoit]
until 0func _do()
[/autoit]
msgbox (0,@GUI_CtrlId,"button nr. "&@GUI_CtrlId-$blg[0])
endfunc/EDIT/ Beispiel vereinfacht
-
Hallo,
HIER mal ein Beispiel wie man so etwas abfragt...*g* ich sag ja ihm onevent isses viel leichter. aber er will wohl getmsg
-
Hab in meiner oberen Antwort das Beispiel mal vereinfacht...
HIER gab es eine ähnliche AnfrageGenerell 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>
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
#include <WindowsConstants.au3>
;Opt('GUIOnEventMode', 1)
Dim $Blg[19]
dim $b[19]
$gui=guicreate("",300,500)For $k = 0 to 18 Step + 1
[/autoit] [autoit][/autoit] [autoit]
$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")
Nextguisetstate()
[/autoit] [autoit][/autoit] [autoit]do
[/autoit] [autoit][/autoit] [autoit]
$msg=guigetmsg(1)
switch $msg[0]case $Blg[0] to $Blg[18] ;alle buttons
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
_do()
endswitchuntil 0
[/autoit] [autoit][/autoit] [autoit]func _do()
[/autoit]
msgbox (0,"code: "&$msg[0],"Button Nr: "&$msg[0]-3)
endfunc -
ich hab jetzt mein Script auf onEvent umgestellt, leider geht bei mir aber die MsgBox nicht auf, den Fehler finde ich leider nicht
[autoit]
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.#include
[/autoit][autoit][/autoit][autoit]
#include
#include
#include
Opt('GUIOnEventMode', 1)Global $FrmPic[120][2]
[/autoit][autoit][/autoit][autoit]
$FrmX = 14
$FrmY = 236
$Feld = 0#Region ### START Koda GUI section ### Form=
[/autoit][autoit][/autoit][autoit]
$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
NextGUISetState(@SW_SHOW)
[/autoit][autoit][/autoit][autoit]
#EndRegion ### END Koda GUI section ###While 1
[/autoit][autoit][/autoit][autoit]
Sleep(100)
WEndFunc test()
[/autoit]
MsgBox(0,"","")
EndFunc -
[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() -
argh, wie ich solche Fehler hasse
Vielen Dank! -
argh, wie ich solche Fehler hasse
Vielen Dank!hab ich auch nur auf den ersten blick gesehn weil ichs selber schon x-mal hatte
der fehler is echt so unauffällig