Gui's + While's?

12/28/2011 14:04 Project_X#16
Quote:
Originally Posted by lolkop View Post
Du hast doch deine eine hauptschleife, in welcher du auf guiaktionen checkst. Dort baust du einfach über zustandsabfragen die jeweiligen Aktionen mit ein.
Hatte ich ja anfangs gehabt aber sobald ich dann bei der checkbox 2 sachen aktivieren lasse, läuft nur eine schleife durch :(
12/28/2011 14:11 lolkop#17
Quote:
Originally Posted by Project_X View Post
Hatte ich ja anfangs gehabt aber sobald ich dann bei der checkbox 2 sachen aktivieren lasse, läuft nur eine schleife durch :(
du solltest allgemein nur eine schleife laufen lassen. da du beim gui sowieso schon eine schleife am laufen hast, wäre jede weitere schleife schlecht, da sie ja schonmal die gui-abfrage schleife ausser gefecht setzt.
12/28/2011 14:12 Project_X#18
Quote:
Originally Posted by lolkop View Post
du solltest allgemein nur eine schleife laufen lassen. da du beim gui sowieso schon eine schleife am laufen hast, wäre jede weitere schleife schlecht, da sie ja schonmal die gui-abfrage schleife ausser gefecht setzt.
Also gibt's so keine lösung, mehrer schleifen in einem programm unter zubringen o.o?

schuldige bin ein Anfänger :(
12/28/2011 14:24 lolkop#19
Quote:
Originally Posted by Project_X View Post
Also gibt's so keine lösung, mehrer schleifen in einem programm unter zubringen o.o?

schuldige bin ein Anfänger :(
du baust dir das über zustände selbst auf. der zustand kann wahr oder falsch sein. ist er war, wird gesendet, ist er falsch wird nicht gesendet.

hier mal ein beispiel, wie du 2 dinge gleichzeitig über eine schleife verwalten kannst:
Code:
$zustand1=False  ;<-- zustand vom ersten befehl auf [Aus]
$zustand2=True  ;<-- zustand vom zweiten befehl auf [An]

While 1
    If $zustand1 Then
        [...]
    EndIf
    If $zustand2 Then
        [...]
    EndIf
WEnd
12/28/2011 14:26 Project_X#20
Quote:
Originally Posted by lolkop View Post
du baust dir das über zustände selbst auf. der zustand kann wahr oder falsch sein. ist er war, wird gesendet, ist er falsch wird nicht gesendet.

hier mal ein beispiel, wie du 2 dinge gleichzeitig über eine schleife verwalten kannst:
Code:
$zustand1=False  ;<-- zustand vom ersten befehl auf [Aus]
$zustand2=True  ;<-- zustand vom zweiten befehl auf [An]

While 1
    If $zustand1 Then
        [...]
    EndIf
    If $zustand2 Then
        [...]
    EndIf
WEnd

aaah ok, aber kann das programm dann auch mal ne nacht durchlaufen?.

also halt, wie in einer while schleife?
12/28/2011 16:32 lolkop#21
das ist doch nur eine while schleife. <.<

in deinem falle wären deine zustände dann die checkboxen.

Code:
;--------Erstelle das GUI---------
GUICreate(...)
$box1 = GUICtrlCreateCheckbox(...)
$box2 = GUICtrlCreateCheckbox(...)
;---------------------------------

;-----Erstelle Endlosschleife-----
Do
	;----Wenn Checkbox1 Aktiv, dann----
	If BitAND(GUICtrlRead($box1),1) Then
		[...]
	EndIf
	;----------------------------------
	;----Wenn Checkbox2 Aktiv, dann----
	If BitAND(GUICtrlRead($box2),1) Then
		[...]
	EndIf
	;----------------------------------
Until GUIGetMsg()=-3 ;Wenn das gui geschlossen wird, springe aus endlosschleife
;---------------------------------
12/28/2011 18:28 Project_X#22
Quote:
Originally Posted by lolkop View Post
das ist doch nur eine while schleife. <.<

in deinem falle wären deine zustände dann die checkboxen.

Code:
;--------Erstelle das GUI---------
GUICreate(...)
$box1 = GUICtrlCreateCheckbox(...)
$box2 = GUICtrlCreateCheckbox(...)
;---------------------------------

;-----Erstelle Endlosschleife-----
Do
	;----Wenn Checkbox1 Aktiv, dann----
	If BitAND(GUICtrlRead($box1),1) Then
		[...]
	EndIf
	;----------------------------------
	;----Wenn Checkbox2 Aktiv, dann----
	If BitAND(GUICtrlRead($box2),1) Then
		[...]
	EndIf
	;----------------------------------
Until GUIGetMsg()=-3 ;Wenn das gui geschlossen wird, springe aus endlosschleife
;---------------------------------

Aaah ok ich hab's vielen dank, für deine Geduld :)
12/28/2011 19:16 lolkop#23
poste mal nochmal deinen vollständigen fertigen code bitte.
würde gerne sehen ob du nun wirklich verstanden hast, wovon ich rede =)
12/28/2011 22:17 Project_X#24
Quote:
Originally Posted by lolkop View Post
poste mal nochmal deinen vollständigen fertigen code bitte.
würde gerne sehen ob du nun wirklich verstanden hast, wovon ich rede =)
PHP Code:
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_UseUpx=n
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <GUIConstants.au3>

#Region ### START Koda GUI section ### Form=
$Form1 GUICreate("Privat-Bot"167127193125)
$Checkbox1 GUICtrlCreateCheckbox("1.Skill"8248117)
GUICtrlSetFont(-188000"MS Sans Serif")
$Checkbox2 GUICtrlCreateCheckbox("2.Skill"96247317)
GUICtrlSetFont(-188000"MS Sans Serif")
$Checkbox3 GUICtrlCreateCheckbox("Exp-Scrolls"8648117)
GUICtrlSetFont(-188000"MS Sans Serif")
$Checkbox4 GUICtrlCreateCheckbox("Lilien"96645717)
GUICtrlSetFont(-188000"MS Sans Serif")
$Checkbox5 GUICtrlCreateCheckbox("Samen"8968117)
GUICtrlSetFont(-188000"MS Sans Serif")
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

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

            If 
BitAND (GUICtrlRead($Checkbox1), 1Then
                Send 
("{1}")
                
Sleep (1000)

            EndIf

            If 
BitAND (GUICtrlRead($Checkbox2),1Then
                Send 
("{2}")
                
Sleep (1000)

            EndIf

    EndSwitch
WEnd 
So habe ich es momentan :), hab ich das denn so jetzt richtig gemacht?xd er öffnet's zwar nur schreibt er mir nicht die Zahlen 1 & 2?.

Warum genau nicht,? oder irgendwas falsch gemacht? :(
12/29/2011 00:09 lolkop#25
das sieht soweit schonmal gut aus.

das hauptproblem hier liegt darin, das du die abfragen in deiner switch abfrage nur dann aufrufst, wenn dein programm beendet wird.

also statt das in deiner switch abfrage bei case exit anzuwenden, entweder in den case else zweig packen, oder unter die switch abfrage.

jetzt musst du noch von den sleeps weg kommen.

sleep sollte man in autoit allgemein nicht nutzen. stattdessen macht es viel mehr sinn mit timern zu arbeiten.

in deinem falle musst du für jedes send einen timer anlegen. hierfür gibt es die funktionen timerinit und timerdiff.

timerinit() gibt die aktuelle laufzeit deiner cpu in millisekunden aus. timerdiff($timestamp) berechnet die differenz von dem zeitstempel, welcher von timerinit erzeugt wird, und der aktuellen laufzeit.

wird also zb bei 500.000ms cpu laufzeit
Code:
$timer = timerinit
angewendet, so speichert $timer jetzt 500.000.

wird dann 2ms später (also bei 500.002 ms cpu laufzeit)
Code:
$diff = timerdiff($timer)
angewendet, so wird $diff berechnet aus 500.002 - 500.000 und demzufolge auf 2ms gesetzt.

dh es sind 2ms vergangen...

setzen wir das nun in deinen code ein, so erhalten wir folgendes:
Code:
Dim $timer1, $timer2

$Form1 = GUICreate("Privat-Bot", 167, 127, 193, 125)
$Checkbox1 = GUICtrlCreateCheckbox("1.Skill", 8, 24, 81, 17)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
$Checkbox2 = GUICtrlCreateCheckbox("2.Skill", 96, 24, 73, 17)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
$Checkbox3 = GUICtrlCreateCheckbox("Exp-Scrolls", 8, 64, 81, 17)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
$Checkbox4 = GUICtrlCreateCheckbox("Lilien", 96, 64, 57, 17)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
$Checkbox5 = GUICtrlCreateCheckbox("Samen", 8, 96, 81, 17)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
GUISetState(@SW_SHOW)

While 1
	Switch GUIGetMsg()
		Case -3
			Exit
		Case Else
			If BitAND (GUICtrlRead($Checkbox1), 1) And TimerDiff($timer1)>=1000 Then
				Send ("{1}")
				$timer1 = TimerInit()
			EndIf
			If BitAND (GUICtrlRead($Checkbox2),1) And TimerDiff($timer2)>=1000 Then
				Send ("{2}")
				$timer2=TimerInit()
			EndIf
	EndSwitch
WEnd
vorteil hier ist, das du die timer beliebig für jede aktion einzeln setzen kannst =)
12/29/2011 02:04 Project_X#26
Quote:
Originally Posted by lolkop View Post
das sieht soweit schonmal gut aus.

das hauptproblem hier liegt darin, das du die abfragen in deiner switch abfrage nur dann aufrufst, wenn dein programm beendet wird.

also statt das in deiner switch abfrage bei case exit anzuwenden, entweder in den case else zweig packen, oder unter die switch abfrage.

jetzt musst du noch von den sleeps weg kommen.

sleep sollte man in autoit allgemein nicht nutzen. stattdessen macht es viel mehr sinn mit timern zu arbeiten.

in deinem falle musst du für jedes send einen timer anlegen. hierfür gibt es die funktionen timerinit und timerdiff.

timerinit() gibt die aktuelle laufzeit deiner cpu in millisekunden aus. timerdiff($timestamp) berechnet die differenz von dem zeitstempel, welcher von timerinit erzeugt wird, und der aktuellen laufzeit.

wird also zb bei 500.000ms cpu laufzeit
Code:
$timer = timerinit
angewendet, so speichert $timer jetzt 500.000.

wird dann 2ms später (also bei 500.002 ms cpu laufzeit)
Code:
$diff = timerdiff($timer)
angewendet, so wird $diff berechnet aus 500.002 - 500.000 und demzufolge auf 2ms gesetzt.

dh es sind 2ms vergangen...

setzen wir das nun in deinen code ein, so erhalten wir folgendes:
Code:
Dim $timer1, $timer2

$Form1 = GUICreate("Privat-Bot", 167, 127, 193, 125)
$Checkbox1 = GUICtrlCreateCheckbox("1.Skill", 8, 24, 81, 17)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
$Checkbox2 = GUICtrlCreateCheckbox("2.Skill", 96, 24, 73, 17)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
$Checkbox3 = GUICtrlCreateCheckbox("Exp-Scrolls", 8, 64, 81, 17)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
$Checkbox4 = GUICtrlCreateCheckbox("Lilien", 96, 64, 57, 17)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
$Checkbox5 = GUICtrlCreateCheckbox("Samen", 8, 96, 81, 17)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
GUISetState(@SW_SHOW)

While 1
	Switch GUIGetMsg()
		Case -3
			Exit
		Case Else
			If BitAND (GUICtrlRead($Checkbox1), 1) And TimerDiff($timer1)>=1000 Then
				Send ("{1}")
				$timer1 = TimerInit()
			EndIf
			If BitAND (GUICtrlRead($Checkbox2),1) And TimerDiff($timer2)>=1000 Then
				Send ("{2}")
				$timer2=TimerInit()
			EndIf
	EndSwitch
WEnd
vorteil hier ist, das du die timer beliebig für jede aktion einzeln setzen kannst =)
Vielen Vielen dank :) Funktioniert super & habe es sogar verstanden :)

Sehr nett von dir gewesen :)