Gui Button Funktionen Zuweisen

11/04/2011 16:39 .Chakratos#1
Hallo
ich bin gerade dabei eine Gui für meine Autoclicker zu erstellen und brauche hilfe
Code:
HotKeySet ("{F6}","Start")
HotKeySet ("{F7}","Pause")
HotKeySet ("{F8}","Ende")

#include <GUIConstants.au3>

#Region ### START Koda GUI section ### Form=
$Gui = GUICreate("AutoClicker Made By Chakratos", 468, 377, 217, 125)
$AutoClicker = GUICtrlCreateLabel("AutoClicker", 168, 32, 168, 41)
GUICtrlSetFont(-1, 24, 400, 0, "MS Sans Serif")
$input = GUICtrlCreateInput("Wie oft soll geklickt werden", 176, 144, 145, 21)
$start = GUICtrlCreateButton("Start (F6)", 24, 224, 113, 49, 0)
$blub = GUICtrlCreateButton("Pause (F7)", 184, 224, 113, 49, 0)
$stop = GUICtrlCreateButton("Beenden (F8)", 344, 224, 113, 49, 0)
$Madeby = GUICtrlCreateLabel("Made By Chakratos", 192, 352, 103, 17)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
Opt("GuiOnEventMode",1)

While 1
	GUICtrlSetOnEvent($start, "Start")
	GUICtrlSetOnEvent($blub, "Pause")
	GUICtrlSetOnEvent($stop, "Ende")
WEnd
so sieht bei mir die GUI aus und so habe ich bis jetzt die funktionen für die buttons gemacht

nur ist das problem wenn ich einmal einen Button Drücke funktionieren die anderen buttons nicht mehr z.b

ich drücke auf start er startet aber man kann nicht auf pause bzw Beenden Drücken bzw passiert einfach nichts

Das gleiche bei den anderen buttons



Ich hoffe ihr könnt mir helfen


LG Chakratos
11/04/2011 17:01 uragan#2
1. wieso haste dein post geändert? den grund sieht man jetzt jetzt net mehr
2. du hast zu viele schleifen, mach diese weg und arbeite mehr mit ifsätzen,
versuch nur eine schleife


hier bitte

Code:
HotKeySet ("{F6}","Start")
HotKeySet ("{F7}","Pause")
HotKeySet ("{F8}","Ende")

#include <GUIConstants.au3>

#Region ### START Koda GUI section ### Form=
$Gui = GUICreate("AutoClicker Made By Chakratos", 468, 377, 217, 125)
$AutoClicker = GUICtrlCreateLabel("AutoClicker", 168, 32, 168, 41)
GUICtrlSetFont(-1, 24, 400, 0, "MS Sans Serif")
$input = GUICtrlCreateInput("Wie oft soll geklickt werden", 176, 144, 145, 21)
$start = GUICtrlCreateButton("Start (F6)", 24, 224, 113, 49, 0)
$blub = GUICtrlCreateButton("Pause (F7)", 184, 224, 113, 49, 0)
$stop = GUICtrlCreateButton("Beenden (F8)", 344, 224, 113, 49, 0)
$Madeby = GUICtrlCreateLabel("Made By Chakratos", 192, 352, 103, 17)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
Opt("GuiOnEventMode",1)
Local $action = 0

While Sleep(10)
	GUICtrlSetOnEvent($start, "Start")
	GUICtrlSetOnEvent($blub, "Pause")
	GUICtrlSetOnEvent($stop, "Ende")
	If $action == 0 Then
		Sleep(1000)
	elseif $action == 1 Then
		MouseClick("left")
	EndIf
WEnd

Func Ende ()		
		Exit
EndFunc

Func Start ()
	$action = 1
EndFunc

Func Pause ()
	$action = 0
EndFunc
11/04/2011 17:22 .Chakratos#3
ehm Wow So weit bin ich noch nicht ich kenne die sachen die du gemacht hast noch nicht

Code hat sich geändert hier der neue

Code:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

#Region ### START Koda GUI section ### Form=
$Gui = GUICreate("AutoClicker Made By Chakratos", 468, 377, 217, 125)
$AutoClicker = GUICtrlCreateLabel("AutoClicker", 168, 32, 168, 41)
GUICtrlSetFont(-1, 24, 400, 0, "MS Sans Serif")
$input = GUICtrlCreateInput("Wie oft soll geklickt werden", 176, 144, 145, 21)
$start = GUICtrlCreateButton("Start (F6)", 24, 224, 113, 49, 0)
$blub = GUICtrlCreateButton("Pause (F7)", 184, 224, 113, 49, 0)
$stop = GUICtrlCreateButton("Beenden (F8)", 344, 224, 113, 49, 0)
$Madeby = GUICtrlCreateLabel("Made By Chakratos", 192, 352, 103, 17)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

HotKeySet ("{F6}","Start")
HotKeySet ("{F7}","Pause")
HotKeySet ("{F8}","Ende")
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit

		Case $start
			Start ()
		Case $blub
			Pause ()
		Case $stop
			Ende ()
	EndSwitch
WEnd


While 1
		Sleep(250)
	WEnd

Func Ende ()

	While 1

		Exit
	WEnd

EndFunc

Func Start ()

	While 1

		MouseClick("left")
	WEnd
EndFunc

Func Pause ()

	While 1
			Sleep(250)
		WEnd
	EndFunc
Nur Leider Funktioniert es auf diesem wege mit Case auch nicht...
11/04/2011 17:33 uragan#4
Quote:
Originally Posted by .Chakratos View Post
ehm Wow So weit bin ich noch nicht ich kenne die sachen die du gemacht hast noch nicht

Code hat sich geändert hier der neue

#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

#Region ### START Koda GUI section ### Form=
$Gui = GUICreate("AutoClicker Made By Chakratos", 468, 377, 217, 125)
$AutoClicker = GUICtrlCreateLabel("AutoClicker", 168, 32, 168, 41)
GUICtrlSetFont(-1, 24, 400, 0, "MS Sans Serif")
$input = GUICtrlCreateInput("Wie oft soll geklickt werden", 176, 144, 145, 21)
$start = GUICtrlCreateButton("Start (F6)", 24, 224, 113, 49, 0)
$blub = GUICtrlCreateButton("Pause (F7)", 184, 224, 113, 49, 0)
$stop = GUICtrlCreateButton("Beenden (F8)", 344, 224, 113, 49, 0)
$Madeby = GUICtrlCreateLabel("Made By Chakratos", 192, 352, 103, 17)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

HotKeySet ("{F6}","Start")
HotKeySet ("{F7}","Pause")
HotKeySet ("{F8}","Ende")

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

Case $start
Start ()
Case $blub
Pause ()
Case $stop
Ende ()
EndSwitch
WEnd

While 1
Sleep(250)
WEnd

Func Ende ()

While 1

Exit
WEnd

EndFunc

Func Start ()

While 1
MouseClick("left")
WEnd
EndFunc

Func Pause ()

While 1
Sleep(250)
WEnd
EndFunc

Nur Leider Funktioniert es auf diesem wege mit Case auch nicht...

so, ich erklär dir jetzt farblich, wieso es bei dir net geht

rot = falsch
orange = braucht man zwar, aber nicht durch gui button abzubrechen, nur per hotkey
gelb = unnötig wird von grün schon übernühmen

falsch, WEIL dein script immer in der while schleife bleibt und nicht von dort abhauen kann

deswegen, schau mein script an
11/04/2011 19:39 lolkop#5
Quote:
Originally Posted by uragan View Post
Code:
[...]
While Sleep(10)
	GUICtrlSetOnEvent($start, "Start")
	GUICtrlSetOnEvent($blub, "Pause")
	GUICtrlSetOnEvent($stop, "Ende")
	[...]
WEnd
[...]
events niemals in einer schleife deklarieren.

wenn du einer person sagst, "gib mir 10 euro", machst du das auch nur einmal und nicht unendlich oft...
11/04/2011 19:49 .Chakratos#6
nein eigentlich nicht nur wenn ich z.b start ohne schleife mache klickt er nur 1x und nicht unendlich oft

wenn wir pause nicht in einer schleife machen wird nur für 25ms Pausiert und nicht für immer bis wir wieder starten

ok du hast recht bei Ende ist es unnötig xD
11/04/2011 20:17 lolkop#7
du solltest dir gleich angewöhnen mit zuständen zu arbeiten.

erstelle dir eine variable, welche true oder false sein kann. das hat den vorteil, das dein script dadurch ebenfalls schlauer ist, und selbst weis, ob eine aktion gerade ausgeführt wird oder nicht.

danach solltest du dir mal überlegen, was eine endlos-schleife macht.

Code:
$blubb = 1
While 1
    ; irgend eine aktion
WEnd
$blubb = 2
was genau passiert hier?

die variable blubb wird auf 1 gesetzt... danach wird irgend eine aktion ausgeführt... danach wird irgend eine aktion ausgeführt... danach wird irgend eine aktion ausgeführt... ....

was bedeutet das für uns? blubb kann niemals 2 werden.

was passiert in deinem script nun?
Code:
While 1
	$nMsg = GUIGetMsg()
	[...]
WEnd
du erstellst eine endlos schleife, welche immer wieder die GUIGetMsg() funktion aufruft.

GUIGetMsg() ist eine funktion, welche prüft ob gerade ein event von deinem gui ausgerufen wird (zb ob ein button gedrückt wird).

warum hast du das nun in einer endlos-schleife? weil du ständig gucken musst, ob irgend etwas passiert.

angenommen jemand drückt nun einen deiner buttons. was passiert dann?

angenommen jemand drückt den start button. GUIGetMsg() hat nun als returnwert das handle des startbuttons. das handle des stzartbuttons hast du beim erstellen des buttons in $start gespeichert:
Code:
$start = GUICtrlCreateButton("Start (F6)", 24, 224, 113, 49, 0)
nun vergleicht dein switch befehl den returnwert von GUIGetMsg() (hier $start) mit den jeweiligen case fällen, und stellt fest, das es mit dem inhalt von der variable $start übereinstimmt.

somit wird die aktion unter dem case fall ausgeführt.

hierbei handelt es sich um einen funktionsaufruf. die funktion Start() wird ausgeführt.

in ihr befindet sich eine endlosschleife:
Code:
While 1
    MouseClick("left")
WEnd
dieser code wird nun ausgeführt.

dh dein script macht jetzt folgendes:
MouseClick("left") -> MouseClick("left") -> MouseClick("left") -> MouseClick("left") -> ....

und nichts anderes!

das bedeutet es wird nicht mehr geprüft, ob einer deiner buttons genutzt wird, da die funktion GUIGetMsg() nichtmehr angewendet wird.

selbiges gilt für den pause button.

um das zu umgehen, musst du stets mit deiner einen endlosschleife arbeiten.
dies gelingt dir ebenfalls mit den anfangs erwähnten zuständen...

damit du dir das ganze etwas besser vorstellen kannst, hier dein code mal überarbeitet:
Code:
HotKeySet("{F6}", "Start")
HotKeySet("{F7}", "Pause")
HotKeySet("{F8}", "Ende")

Dim $klicker_active = False

GUICreate("AutoClicker Made By Chakratos", 468, 377, 217, 125)
GUICtrlCreateLabel("AutoClicker", 168, 32, 168, 41)
GUICtrlSetFont(-1, 24, 400, 0, "MS Sans Serif")
$input = GUICtrlCreateInput("Wie oft soll geklickt werden", 176, 144, 145, 21)
$start = GUICtrlCreateButton("Start (F6)", 24, 224, 113, 49, 0)
$blub = GUICtrlCreateButton("Pause (F7)", 184, 224, 113, 49, 0)
$stop = GUICtrlCreateButton("Beenden (F8)", 344, 224, 113, 49, 0)
GUICtrlCreateLabel("Made By Chakratos", 192, 352, 103, 17)
GUISetState(@SW_SHOW)

While 1
	Switch GUIGetMsg()
		Case -3
			Exit
		Case $start
			$klicker_active = True
		Case $blub
			$klicker_active = False
		Case $stop
			Exit
	EndSwitch
	If $klicker_active Then MouseClick("left")
WEnd

Func Ende()
	Exit
EndFunc

Func Start()
	$klicker_active = True
EndFunc

Func Pause()
	$klicker_active = False
EndFunc
11/04/2011 20:31 uragan#8
Quote:
Originally Posted by lolkop View Post
du solltest dir gleich angewöhnen mit zuständen zu arbeiten.
...
Code:
HotKeySet("{F6}", "Start")
HotKeySet("{F7}", "Pause")
HotKeySet("{F8}", "Ende")

Dim $klicker_active = False

GUICreate("AutoClicker Made By Chakratos", 468, 377, 217, 125)
GUICtrlCreateLabel("AutoClicker", 168, 32, 168, 41)
GUICtrlSetFont(-1, 24, 400, 0, "MS Sans Serif")
$input = GUICtrlCreateInput("Wie oft soll geklickt werden", 176, 144, 145, 21)
$start = GUICtrlCreateButton("Start (F6)", 24, 224, 113, 49, 0)
$blub = GUICtrlCreateButton("Pause (F7)", 184, 224, 113, 49, 0)
$stop = GUICtrlCreateButton("Beenden (F8)", 344, 224, 113, 49, 0)
GUICtrlCreateLabel("Made By Chakratos", 192, 352, 103, 17)
GUISetState(@SW_SHOW)

While 1
	Switch GUIGetMsg()
		Case -3
			Exit
		Case $start
			$klicker_active = True
		Case $blub
			$klicker_active = False
		Case $stop
			Exit
	EndSwitch
	If $klicker_active Then MouseClick("left")
WEnd

Func Ende()
	Exit
EndFunc

Func Start()
	$klicker_active = True
EndFunc

Func Pause()
	$klicker_active = False
EndFunc

guckst du , post NR 2, kommt das gleich raus :)
11/04/2011 20:38 lolkop#9
Quote:
Originally Posted by uragan View Post
guckst du , post NR 2, kommt das gleich raus :)
leider ist das ein trugschluss...
wie bereits erwähnt bombardierst du das script, mit dem script bereits bekannten anweisungen.

davon abgesehen deklarierst du im globalden bereich eine variable als lokal.

und auch wenn du immerhin schon mit zuständen gearbeitet hast, hast du diesen vorteil durch das sleep von einer sekunde wieder unbrauchbar gemacht :s

bitte nicht beleidigt auf diese posts reagieren...
mir ging es hier nur darum mit konstruktiver kritik auf fehler aufmerksam zu machen =)
11/04/2011 21:45 uragan#10
naja, um erlich zu sein, habe ich es mit GUICtrlSetOnEvent noch nie gebraucht, deswege hatte ich das vorerst drin gelassen

den man kann das ganze auch per Switch Case klären, so mache ich das immer, bis jetzt keine probleme