Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > AutoIt
You last visited: Today at 22:35

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



Befehl um neue Intervalle zu erstellen ?

Discussion on Befehl um neue Intervalle zu erstellen ? within the AutoIt forum part of the Coders Den category.

Reply
 
Old   #1
 
Defkahn52's Avatar
 
elite*gold: 8
Join Date: Aug 2009
Posts: 1,504
Received Thanks: 396
Befehl um neue Intervalle zu erstellen ?

Hi Leute,

Bald soll irgendso ein Programmier Wettbewerb stattfinden und deswegen hat mir mein Informatik Lehrer Übungen dazu gegeben. In der einen Aufgabe soll ich ein Programm schreiben ( in einer Sprache meiner Wahl, in diesem Fall AutoIt), dass die Entfernung der Gebäude von einem Wahrzeichen berechnet und dann die max. erlaubte höhe rausgibt. Alle 100m darf das Gebäude 1m höher sein als 100m. Ich wusste nicht wie ich das genau machen soll, deswegen, habe ich einen Intervall gesetzt. Von 0 bis 99 m nur 100m Bauhöhe, 100-199 m 101m Bauhöhe usw. . Doch so kann das Programm nur solange rechnen bis eine Entfernung kommt, deren Intervall ich nicht im Script gesetzt habe. Gibt es dazu eine Alternative ? So sieht zurzeit mein Quellcode aus.

PHP Code:
HotKeySet "e""Ende")
HotKeySet "b""Anfang")

Anfang ()

Func Anfang ()

MsgBox (0"Wilkommen""Wilkommen im Programm für die Berechnung der Bauhöhe." & @CRLF "Falls das Gebäude in der linken Hälfte des Koordinaten-Systems liegt bzw. negative x-Koordinaten hat," & @CRLF "dann geben sie den zweiten Punkt ein."& @CRLF "Falls auf der rechten Hälfte, dann bitte den ersten Punkt")

$xKoordinate InputBox "Die x-Koordinate""Bitte geben sie hier die x-Koordinate ein!")
$yKoordinate InputBox "Die y-Koordinate""Bitte geben sie hier die y-Koordinate ein!")

$Hypotenuse2 Sqrt ($xKoordinate $xKoordinate $yKoordinate $yKoordinate)

If 
$Hypotenuse2 100 Then
    MsgBox 
(0"Die erlaubte Bauhöhe""Das Gebäude darf max. 100m hoch gebaut werden!")

ElseIf 
$Hypotenuse2 100 $Hypotenuse2 200 Then
    MsgBox 
(0"Die erlaubte Bauhöhe""Das Gebäude darf max. 101m hoch gebaut werden!")

ElseIf 
$Hypotenuse2 200 $Hypotenuse2 300 Then
    MsgBox 
(0"Die erlaubte Bauhöhe""Das Gebäude darf max. 102m hoch gebaut werden!")

ElseIf 
$Hypotenuse2 300 $Hypotenuse2 400 Then
    MsgBox 
(0"Die erlaubte Bauhöhe""Das Gebäude darf max. 103m hoch gebaut werden!")

ElseIf 
$Hypotenuse2 400 $Hypotenuse2 500 Then
    MsgBox 
(0"Die erlaubte Bauhöhe""Das Gebäude darf max. 104m hoch gebaut werden!")

ElseIf 
$Hypotenuse2 500 $Hypotenuse2 600 Then
    MsgBox 
(0"Die erlaubte Bauhöhe""Das Gebäude darf max. 105m hoch gebaut werden!")

EndIf

Return 
"Weiter oder Ende ?" "Wenns sie weiter machen möchten," & @CRLF "drücken sie bitte die Taste 'B'." & @CRLF "Zum Beenden drücken sie die Taste 'E'." & @CRLF "Klicken sie anschließend auf OK."

Exit

EndFunc



While 1
    Sleep 
(1)
WEnd

Func Ende 
()
    Exit
EndFunc

While 1
    Sleep
(1)
WEnd 
MfG Defkahn52
Defkahn52 is offline  
Old 09/19/2012, 17:25   #2
 
Achat's Avatar
 
elite*gold: 528
Join Date: Jan 2012
Posts: 2,127
Received Thanks: 2,404
Schleifen

Gleich kommt noch ein Beispiel^^

Code:
#include <Misc.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#region ### START Koda GUI section ### Form=
$Form1_1 = GUICreate("Gebäudehöhe", 203, 101, 282, 155)
GUISetFont(12, 400, 0, "Arial Black")
$Input1 = GUICtrlCreateInput("", 24, 0, 177, 31, BitOR($GUI_SS_DEFAULT_INPUT, $ES_NUMBER))
$Input2 = GUICtrlCreateInput("", 24, 32, 177, 31, BitOR($GUI_SS_DEFAULT_INPUT, $ES_NUMBER))
$Label1 = GUICtrlCreateLabel("X:", 0, 8, 21, 27)
$Label2 = GUICtrlCreateLabel("Y:", 0, 40, 21, 27)
$Edit1 = GUICtrlCreateEdit("", 24, 64, 177, 33, BitOR($ES_READONLY, $ES_WANTRETURN))
GUICtrlSetData(-1, "Ergebnis in Meter")
GUISetState(@SW_SHOW)
#endregion ### END Koda GUI section ###
MsgBox(0, 'Wilkommen', '' & @CRLF & _
		'Falls das Gebäude in der linken Hälfte des Koordinaten-Systems liegt bzw. negative x-Koordinaten hat,' & @CRLF & _
		'dann geben sie den zweiten Punkt ein.' & @CRLF & _
		'Falls auf der rechten Hälfte, dann bitte den ersten Punkt')
While GUIGetMsg() <> -3
	$iXKoordinate = GUICtrlRead($Input1)
	$iYKoordinate = GUICtrlRead($Input2)
	If $iXKoordinate <> '' And $iYKoordinate <> '' Then
		$iHypotenuse2 = Sqrt($iXKoordinate * $iXKoordinate + $iYKoordinate * $iYKoordinate)
		$iEntfernung = 100
		$iMaxGebaedeHoehe = 100
		Local $fStop = False
		Do
			If $iHypotenuse2 >= $iEntfernung And $iHypotenuse2 <= $iEntfernung + 100 Then
				$fStop = True
			EndIf
			$iEntfernung += 100
			$iMaxGebaedeHoehe += 1
		Until $fStop Or GUIGetMsg() = -3
		GUICtrlSetData($Edit1, $iMaxGebaedeHoehe - 1 & ' m')
	EndIf
	Sleep(100)
WEnd
Für Werte über ~1000.000 ist die Do-Schleife aber nicht geeignet.
Bei Fragen kannst du mir gerne eine PM schreiben

MfG
Achat is offline  
Thanks
1 User
Old 09/19/2012, 17:30   #3
 
omer36's Avatar
 
elite*gold: 0
Join Date: Mar 2009
Posts: 2,317
Received Thanks: 1,254
solang er seinen beispiel noch schreibt, hier hattest du nen kleinen "fehler"

aus
ElseIf $Hypotenuse2 > 100 & $Hypotenuse2 < 200 Then
wird
ElseIf $Hypotenuse2 > 100 AND $Hypotenuse2 < 200 Then
omer36 is offline  
Old 09/19/2012, 18:09   #4
 
-STORM-'s Avatar
 
elite*gold: 124
Join Date: Dec 2009
Posts: 2,114
Received Thanks: 3,141
Die InputBoxen machen es unübersichtlich, pack lieber alle Inputs in ein GUI.
Hotkeys sind auch unpraktisch (jedenfalls für dieses Programm), verwende lieber Buttons.

GUIGetMsg() ist auch bei Fortgeschrittenen hier sehr verbreitet, man kann damit auch alles irgendwie umsetzen, aber OnEvents sind einfach besser, das sollte man sich gleich angewöhnen.

Die Konstruktion aus If-Abfragen ist, wie schon erwähnt, ziemlich ungeeignet.
Schleifen (falls ich richtig verstanden hab z.B. die Entfernung um 100 verringern und die Bauhöhe um 1 erhöhen bis Entfernung<100) würden auch funktionieren, aber der Informatiklehrer wird kommen mit "Bei xkm Entfernung dauert das so und so viele ms => unnötig". Hört sich blöd an, stimmt aber, denn irgendwann will man mehr berechnen, und es macht sich bemerkbar. Besser ist es also, das direkt mit einer Rechnung zu lösen.
Edit: Achats Script bestätigt das ebenfalls, man kann nicht mal das GUI Schließen, da If GUIGetMsg<>-3 nicht erreicht wird, während die Do Schleife ausgeführt wird.

Betrag/Abs und Potenz/^2 sind wichtige Rechenoperationen und sollten auch verwendet werden. Besonders wichtig ist hier Floor(), andere Lösungen wären deutlich länger und komplizierter.
Edit: Achats Script bestätigt das. Funktioniert, wäre aber einfacher möglich.

Lange Rede, kurzer Sinn, hier ein Beispiel:

Code:
Opt("GUIOnEventMode", 1) ;// damit GUI(Ctrl)SetOnEvent() funktioniert

#region ### GUI Section ###
$gui = GUICreate("Bauhöhe", 180, 100)
GUICtrlCreateLabel("X:", 10, 14)
$inputx = GUICtrlCreateInput("", 30, 10, 100)
GUICtrlCreateLabel("Y:", 10, 39)
$inputy = GUICtrlCreateInput("", 30, 35, 100)
$button = GUICtrlCreateButton("Berechnen", 50, 65, 80, 30)
GUICtrlSetOnEvent(-1, "_berechnen") ;// führt _berechnen() aus wenn der Button gedrückt wird
GUISetState()
GUISetOnEvent(-3, "_exit") ;// -3 = $gui_event_exit ==> include unnötig
#endregion ### GUI Section ###

While 1 ;// nur damit das GUI nicht schließt (Script wird automatisch beendet, wenn keine Befehle ausgeführt werden)
	Sleep(100)
WEnd

Func _berechnen()
	$xKoordinate = Abs(GUICtrlRead($inputx)) ;// Abs/Betrag rechnet in positiven Wert um, falls negativ (<=> if x<0 then x*(-1) )
	$yKoordinate = Abs(GUICtrlRead($inputy))
	$Entfernung = Sqrt($xKoordinate^2 + $yKoordinate^2) ;// x*x = x^2 ==> Matheunterricht!
	$Bauhoehe = 100 + Floor($Entfernung/100) ;// Floor() rundet im Gegensatz zu Round() immer ab
	MsgBox(0, "", "Entfernung: " & @TAB & Round($Entfernung,3) & @CRLF & "maximale Bauhöhe: " & @TAB & $Bauhoehe) ;// 3 Nachkommastellen reichen?
EndFunc

Func _exit()
	Exit
EndFunc
Falls etwas unklar ist, einfach fragen.
Die Chancen im Wettbewerb kann ich nicht einschätzen, ohne euren Kurs zu kennen, aber mit diesem simplen Programm solltest du dir nicht allzu viele Hoffnungen machen bzw. solltest es noch erweitern/verbessern.
Dass du es nicht nur kopieren musst, sollte klar sein. Nicht, weil mich das stören würde, sondern weil du es dem Lehrer/der Klasse auch erklären können musst.

PS: Die Msgbox am Anfang hab ich mal weggelassen. Falls euer Lehrer so eine Erläuterung möchte, würde sich ein ?-Button anbieten, dem sie als OnEvent zugewiesen wird. Ich persönlich finde es immer blöd, wenn vor dem Programmstart erst PopUps kommen.
-STORM- is offline  
Thanks
1 User
Old 09/19/2012, 18:13   #5
 
Defkahn52's Avatar
 
elite*gold: 8
Join Date: Aug 2009
Posts: 1,504
Received Thanks: 396
Quote:
Originally Posted by Achat View Post
Schleifen

Gleich kommt noch ein Beispiel^^

Code:
#include <Misc.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#region ### START Koda GUI section ### Form=
$Form1_1 = GUICreate("Gebäudehöhe", 203, 101, 282, 155)
GUISetFont(12, 400, 0, "Arial Black")
$Input1 = GUICtrlCreateInput("", 24, 0, 177, 31, BitOR($GUI_SS_DEFAULT_INPUT, $ES_NUMBER))
$Input2 = GUICtrlCreateInput("", 24, 32, 177, 31, BitOR($GUI_SS_DEFAULT_INPUT, $ES_NUMBER))
$Label1 = GUICtrlCreateLabel("X:", 0, 8, 21, 27)
$Label2 = GUICtrlCreateLabel("Y:", 0, 40, 21, 27)
$Edit1 = GUICtrlCreateEdit("", 24, 64, 177, 33, BitOR($ES_READONLY, $ES_WANTRETURN))
GUICtrlSetData(-1, "Ergebnis in Meter")
GUISetState(@SW_SHOW)
#endregion ### END Koda GUI section ###
MsgBox(0, 'Wilkommen', '' & @CRLF & _
		'Falls das Gebäude in der linken Hälfte des Koordinaten-Systems liegt bzw. negative x-Koordinaten hat,' & @CRLF & _
		'dann geben sie den zweiten Punkt ein.' & @CRLF & _
		'Falls auf der rechten Hälfte, dann bitte den ersten Punkt')
While GUIGetMsg() <> -3
	$iXKoordinate = GUICtrlRead($Input1)
	$iYKoordinate = GUICtrlRead($Input2)
	If $iXKoordinate <> '' And $iYKoordinate <> '' Then
		$iHypotenuse2 = Sqrt($iXKoordinate * $iXKoordinate + $iYKoordinate * $iYKoordinate)
		$iEntfernung = 100
		$iMaxGebaedeHoehe = 100
		Local $fStop = False
		Do
			If $iHypotenuse2 >= $iEntfernung And $iHypotenuse2 <= $iEntfernung + 100 Then
				$fStop = True
			EndIf
			$iEntfernung += 100
			$iMaxGebaedeHoehe += 1
		Until $fStop Or GUIGetMsg() = -3
		GUICtrlSetData($Edit1, $iMaxGebaedeHoehe - 1 & ' m')
	EndIf
	Sleep(100)
WEnd
Für Werte über ~1000.000 ist die Do-Schleife aber nicht geeignet.
Bei Fragen kannst du mir gerne eine PM schreiben

MfG
Also erstmal herzlichen Dank sieht sehr Klasse aus, aber ich kann einige Stellen nicht ganz verstehen, bin ja noch recht neu in AutoIt. Ich habe grade keine Zeit, aber könntest du mir vielleicht später mal über Skype TeamViewer oder so, den Quellcode erläutern ?

Quote:
Originally Posted by omer36 View Post
solang er seinen beispiel noch schreibt, hier hattest du nen kleinen "fehler"

aus
ElseIf $Hypotenuse2 > 100 & $Hypotenuse2 < 200 Then
wird
ElseIf $Hypotenuse2 > 100 AND $Hypotenuse2 < 200 Then
Aber bei mir hat es so doch funktioniert, oder war das nur Zufall xD

EDIT:
Quote:
Originally Posted by -STORM- View Post
Die InputBoxen machen es unübersichtlich, pack lieber alle Inputs in ein GUI.
Hotkeys sind auch unpraktisch (jedenfalls für dieses Programm), verwende lieber Buttons.

GUIGetMsg() ist auch bei Fortgeschrittenen hier sehr verbreitet, man kann damit auch alles irgendwie umsetzen, aber OnEvents sind einfach besser, das sollte man sich gleich angewöhnen.

Die Konstruktion aus If-Abfragen ist, wie schon erwähnt, ziemlich ungeeignet.
Schleifen (falls ich richtig verstanden hab z.B. die Entfernung um 100 verringern und die Bauhöhe um 1 erhöhen bis Entfernung<100) würden auch funktionieren, aber der Informatiklehrer wird kommen mit "Bei xkm Entfernung dauert das so und so viele ms => unnötig". Hört sich blöd an, stimmt aber, denn irgendwann will man mehr berechnen, und es macht sich bemerkbar. Besser ist es also, das direkt mit einer Rechnung zu lösen.
Edit: Achats Script bestätigt das ebenfalls, man kann nicht mal das GUI Schließen, da If GUIGetMsg<>-3 nicht erreicht wird, während die Do Schleife ausgeführt wird.

Betrag/Abs und Potenz/^2 sind wichtige Rechenoperationen und sollten auch verwendet werden. Besonders wichtig ist hier Floor(), andere Lösungen wären deutlich länger und komplizierter.
Edit: Achats Script bestätigt das. Funktioniert, wäre aber einfacher möglich.

Lange Rede, kurzer Sinn, hier ein Beispiel:

Code:
Opt("GUIOnEventMode", 1) ;// damit GUI(Ctrl)SetOnEvent() funktioniert

#region ### GUI Section ###
$gui = GUICreate("Bauhöhe", 180, 100)
GUICtrlCreateLabel("X:", 10, 14)
$inputx = GUICtrlCreateInput("", 30, 10, 100)
GUICtrlCreateLabel("Y:", 10, 39)
$inputy = GUICtrlCreateInput("", 30, 35, 100)
$button = GUICtrlCreateButton("Berechnen", 50, 65, 80, 30)
GUICtrlSetOnEvent(-1, "_berechnen") ;// führt _berechnen() aus wenn der Button gedrückt wird
GUISetState()
GUISetOnEvent(-3, "_exit") ;// -3 = $gui_event_exit ==> include unnötig
#endregion ### GUI Section ###

While 1
	Sleep(100)
WEnd

Func _berechnen()
	$xKoordinate = Abs(GUICtrlRead($inputx)) ;// Abs/Betrag rechnet in positiven Wert um, falls negativ (<=> if x<0 then x*(-1) )
	$yKoordinate = Abs(GUICtrlRead($inputy))
	$Entfernung = Sqrt($xKoordinate^2 + $yKoordinate^2) ;// x*x = x^2 ==> Matheunterricht!
	$Bauhoehe = 100 + Floor($Entfernung/100) ;// Floor() rundet im Gegensatz zu Round() immer ab
	MsgBox(0, "", "Entfernung: " & @TAB & Round($Entfernung,3) & @CRLF & "maximale Bauhöhe: " & @TAB & $Bauhoehe) ;// 3 Nachkommastellen reichen?
EndFunc

Func _exit()
	Exit
EndFunc
Falls etwas unklar ist, einfach fragen.
Die Chancen im Wettbewerb kann ich nicht einschätzen, ohne euren Kurs zu kennen, aber mit diesem simplen Programm solltest du dir nicht allzu viele Hoffnungen machen bzw. solltest es noch erweitern/verbessern.
Dass du es nicht nur kopieren musst, sollte klar sein. Nicht, weil mich das stören würde, sondern weil du es dem Lehrer/der Klasse auch erklären können musst.
Vielen, vielen Dank! Das ich auf die Rechnung nicht gekommen bin.
Ich glaube deins ist auch etwas Anfänger freundlicher (Kam mir jetzt so vor)

Also ich werde, dann mal versuchen das selber nochmal neu zu programmieren, und ein paar eigene Sachen reinzubringen.

Vielen Dank nochmal, fürs erste sollte mein Problem geklärt sein, aber gleich oder Morgen kommen noch die anderen Übungsaufgaben ;D
Defkahn52 is offline  
Old 09/19/2012, 18:28   #6
 
Achat's Avatar
 
elite*gold: 528
Join Date: Jan 2012
Posts: 2,127
Received Thanks: 2,404
Quote:
Originally Posted by -STORM- View Post
[color=darkblue]
Edit: Achats Script bestätigt das ebenfalls, man kann nicht mal das GUI Schließen, da If GUIGetMsg<>-3 nicht erreicht wird, während die Do Schleife ausgeführt wird.

Quote:
Originally Posted by Achat
Do
If $iHypotenuse2 >= $iEntfernung And $iHypotenuse2 <= $iEntfernung + 100 Then
$fStop = True
EndIf
$iEntfernung += 100
$iMaxGebaedeHoehe += 1
Until $fStop Or GUIGetMsg() = -3
Funktionieren tut es aber nicht, da die While-Schleife nach 100 ms wieder neu anfängt. Da müsste man dann noch einen Exit Befehl mit einbauen^^.


[/code]

Dass du es nicht nur kopieren musst, sollte klar sein. Nicht, weil mich das stören würde, sondern weil du es dem Lehrer/der Klasse auch erklären können musst.
Ja, also bei Fragen fragen. Mit C&P kommt man nämlich nicht weit :O

Quote:
Originally Posted by Defkahn52 View Post
Also erstmal herzlichen Dank sieht sehr Klasse aus, aber ich kann einige Stellen nicht ganz verstehen, bin ja noch recht neu in AutoIt. Ich habe grade keine Zeit, aber könntest du mir vielleicht später mal über Skype TeamViewer oder so, den Quellcode erläutern ?
Danke.

PM / Profilnachricht / hier im Thread ...

MfG

Btw: Mit einem Druck auf F1 kommst du zur Hilfe, wenn der Cursor über einem Befehl ist, wird dazu direkt die Hilfeseite aufgerufen. Im Internet gibt es auch eine deutsche Hilfe, wenn du Englisch nicht kannst (brauchst du aber).

STRG+T räumt dein Script auf und macht es leserlicher.

Quote:
Originally Posted by Defkahn52 View Post
PS: Ich habe grade keine Zeit
Du musst dir Zeit nehmen für das üben.
Eine Programmiersprache lernt man durch Erfahrung, Ausprobieren.

Lies dir mal das TuT durch:



Danach weißt du mehr.

Den Kanal hier kann ich dir sehr empfehlen

MfG
Achat is offline  
Thanks
1 User
Old 09/19/2012, 18:41   #7
 
-STORM-'s Avatar
 
elite*gold: 124
Join Date: Dec 2009
Posts: 2,114
Received Thanks: 3,141
Quote:
Originally Posted by Achat View Post
Den Kanal hier kann ich dir sehr empfehlen
Auf jeden Fall! Hat mir am Anfang auch sehr geholfen.
Ansonsten noch für die Grundlagen diese beiden Tutorials:


Und anschließend spezifische Tuts je nach dem Thema, das du behandeln willst.
-STORM- is offline  
Thanks
1 User
Old 09/19/2012, 19:04   #8
 
Defkahn52's Avatar
 
elite*gold: 8
Join Date: Aug 2009
Posts: 1,504
Received Thanks: 396
Also vielen Dank nochmal !

So ist jetzt mein Endergebnis

PHP Code:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#region ### START Koda GUI section ### Form=
$Form1 GUICreate("Berechnung der Gebäudehöhe"279144192144)
$xInput GUICtrlCreateInput(""1203212121)
$yInput GUICtrlCreateInput(""1206412121)
$Label1 GUICtrlCreateLabel("X-Koordinate :"40327117)
$Label2 GUICtrlCreateLabel("Y-Koordinate :"40647117)
$berechnen GUICtrlCreateButton("Berechnen"1209612333)
$anleitung GUICtrlCreateButton("Anleitung"32967533)
GUISetState(@SW_SHOW)
#endregion ### END Koda GUI section ###

While 1
    $nMsg 
GUIGetMsg()
    Switch 
$nMsg
        
Case $GUI_EVENT_CLOSE
            
Exit
        Case 
$anleitung
            MsgBox
("""Anleitung"'Falls das Gebäude auf der linken Seite des Koordinatensystems liegt' & @CRLF _
                    
'bzw. die X-Koordinaten negativ sind, dann geben sie die Koordinaten' & @CRLF _
                    
'des zweiten Punktes ein. Andernfalls geben sie die Koordinaten, des' & @CRLF _
                    
'ersten Punktes ein. Dann klicken sie anschließen auf berechnen.')
                Case 
$berechnen

                    $xKoordinate 
Abs(GUICtrlRead($xInput))
                    
$yKoordinate GUICtrlRead($yInput)

                    
$entfernung Sqrt($xKoordinate^$yKoordinate^2)
                    
$_hoehe 100 Floor($entfernung/100)

                    
MsgBox (0"""Entfernung :" & @TAB & @TAB Round($entfernung3) & @CRLF "max. Bauhöhe :" & @TAB & @TAB $_hoehe)


    EndSwitch
WEnd 
Ich habe jetzt den Unterschied zwischen dem Events On und dem hier irgendwie nicht verstanden, ich kannte sowieso nur die eine Variante mit den Cases deswegen habe ich es so programmiert, geht das auch so in Ordnung ?

Ich habe bis jetzt keine Fehler entdeckt, aber ihr könnt ja auch mal ein Feedback geben.
Defkahn52 is offline  
Old 09/19/2012, 20:12   #9
 
-STORM-'s Avatar
 
elite*gold: 124
Join Date: Dec 2009
Posts: 2,114
Received Thanks: 3,141
OnEvent / GUIGetMsg()

Hier ein Beispiel.
Alle Scripts tun das gleiche.
1. mit GUIGetMsg()
Code:
$gui = GUICreate("", 200, 100)
$button = GUICtrlCreateButton("Button", 10, 10)
GUISetState()

While 1
	If GUIGetMsg() = $button Then
		MsgBox(0,"","")
	EndIf
WEnd
2. mit GUIGetMsg und Switch (sinnvoller für mehrere Events)
Code:
$gui = GUICreate("", 200, 100)
$button = GUICtrlCreateButton("Button", 10, 10)
GUISetState()

While 1
	Switch GUIGetMsg()
		Case $button
			MsgBox(0,"","")
	EndSwitch
WEnd
3. mit OnEvent
Code:
Opt("GUIOnEventMode", 1)

$gui = GUICreate("", 200, 100)
$button = GUICtrlCreateButton("Button", 10, 10)
GUICtrlSetOnEvent($button, "_msg") ;//statt $button auch -1 möglich (steht für letzten definierten Control)
GUISetState()

While 1
	Sleep(100)
WEnd

Func _msg()
	MsgBox(0,"","")
EndFunc
Diese Beispiele habe ich gemacht, um den Unterschied in der Syntax zu zeigen.

Der größte Vorteil des OnEvents ist hier nicht offensichtlich:
Events werden SOFORT ausgelöst, auch wenn das Script groß ist.
Ist es auf GUIGetMsg() basiert, werden z.B. keine Events ausgelöst, während etwas anderes berechnet wird (siehe Beispiel von Achat).
Man kann das zwar durch weitere Abfragen trotzdem hinkriegen, aber das dauert und macht das Script unnötig kompliziert.
OnEvents funktionieren schnell und einfach.


Zu deinem Script: Insgesamt gut, mit OnEvents wäre es wie gesagt noch etwas besser und später einfacher, neue/größere Funktionen hinzuzufügen.
Beim Auslesen der y-Koordinate hast du den Betrag vergessen, was bei negativen Zahlen zu Fehlern führt.
Ansonsten ist es nah an meinem Script. Falls du alle verwendeten Befehle verstanden hast, ist das aber überhaupt kein Problem.
Optimieren könntest du es noch, indem du unnötige Includes auslässt (werden von Koda immer eingebaut, egal ob verwendet oder nicht), aber das ist ne Kleinigkeit und der dafür mehr benötigte Speicher fällt kaum auf.
-STORM- is offline  
Thanks
1 User
Old 09/20/2012, 21:16   #10
 
Defkahn52's Avatar
 
elite*gold: 8
Join Date: Aug 2009
Posts: 1,504
Received Thanks: 396
Quote:
Originally Posted by -STORM- View Post
Hier ein Beispiel.
Alle Scripts tun das gleiche.
1. mit GUIGetMsg()
Code:
$gui = GUICreate("", 200, 100)
$button = GUICtrlCreateButton("Button", 10, 10)
GUISetState()

While 1
	If GUIGetMsg() = $button Then
		MsgBox(0,"","")
	EndIf
WEnd
2. mit GUIGetMsg und Switch (sinnvoller für mehrere Events)
Code:
$gui = GUICreate("", 200, 100)
$button = GUICtrlCreateButton("Button", 10, 10)
GUISetState()

While 1
	Switch GUIGetMsg()
		Case $button
			MsgBox(0,"","")
	EndSwitch
WEnd
3. mit OnEvent
Code:
Opt("GUIOnEventMode", 1)

$gui = GUICreate("", 200, 100)
$button = GUICtrlCreateButton("Button", 10, 10)
GUICtrlSetOnEvent($button, "_msg") ;//statt $button auch -1 möglich (steht für letzten definierten Control)
GUISetState()

While 1
	Sleep(100)
WEnd

Func _msg()
	MsgBox(0,"","")
EndFunc
Diese Beispiele habe ich gemacht, um den Unterschied in der Syntax zu zeigen.

Der größte Vorteil des OnEvents ist hier nicht offensichtlich:
Events werden SOFORT ausgelöst, auch wenn das Script groß ist.
Ist es auf GUIGetMsg() basiert, werden z.B. keine Events ausgelöst, während etwas anderes berechnet wird (siehe Beispiel von Achat).
Man kann das zwar durch weitere Abfragen trotzdem hinkriegen, aber das dauert und macht das Script unnötig kompliziert.
OnEvents funktionieren schnell und einfach.


Zu deinem Script: Insgesamt gut, mit OnEvents wäre es wie gesagt noch etwas besser und später einfacher, neue/größere Funktionen hinzuzufügen.
Beim Auslesen der y-Koordinate hast du den Betrag vergessen, was bei negativen Zahlen zu Fehlern führt.
Ansonsten ist es nah an meinem Script. Falls du alle verwendeten Befehle verstanden hast, ist das aber überhaupt kein Problem.
Optimieren könntest du es noch, indem du unnötige Includes auslässt (werden von Koda immer eingebaut, egal ob verwendet oder nicht), aber das ist ne Kleinigkeit und der dafür mehr benötigte Speicher fällt kaum auf.
Danke jetzt habe ich das auch mit den OnEvents verstanden, woher weis ich eigentlich welche includes unnötig sind ?

Achja und würde das bei negativen Zahlen auch ohne Betrag nicht klappen ? Weil es wird ja sowieso positiv da es quadriert wird oder ?
Defkahn52 is offline  
Old 09/20/2012, 21:28   #11
 
Achat's Avatar
 
elite*gold: 528
Join Date: Jan 2012
Posts: 2,127
Received Thanks: 2,404
Quote:
Originally Posted by Defkahn52 View Post
Danke jetzt habe ich das auch mit den OnEvents verstanden, woher weis ich eigentlich welche includes unnötig sind ?
Includes entfernen, wenn das Script ohne Fehler startet, dann brauchst du das Include nicht.

MfG
Achat is offline  
Thanks
1 User
Old 09/20/2012, 22:16   #12
 
Defkahn52's Avatar
 
elite*gold: 8
Join Date: Aug 2009
Posts: 1,504
Received Thanks: 396
Ich hab lange gesucht, aber nicht wirklich was gefunden.

Ich wollte ein kleines Registrations Programm als Übung erstellen. Ich hab alles im Koda erstellt, aber ich weis nicht wie man dafür sorgt, dass die Buchstaben bei der Inputbox durch Sternchen ersetzt werden.
Defkahn52 is offline  
Old 09/20/2012, 22:18   #13
 
H@CT0R's Avatar
 
elite*gold: 0
Join Date: Apr 2012
Posts: 1,214
Received Thanks: 153
Code:
$Input14 = GUICtrlCreateInput("", 8, 24, 121, 21)
_GUICtrlEdit_SetPasswordChar($Input14, "*")
nur schnell aus einem meiner scripte rüberkopiert
H@CT0R is offline  
Thanks
1 User
Old 09/20/2012, 22:31   #14
 
Defkahn52's Avatar
 
elite*gold: 8
Join Date: Aug 2009
Posts: 1,504
Received Thanks: 396
Quote:
Originally Posted by H@CT0R View Post
Code:
$Input14 = GUICtrlCreateInput("", 8, 24, 121, 21)
_GUICtrlEdit_SetPasswordChar($Input14, "*")
nur schnell aus einem meiner scripte rüberkopiert
brauche ich dafür einen Speziellen include ? Denn mir wird ein Fehler angezeigt, dass dieser Befehl nicht definiert wurde.

EDIT:

Das Programm sagt immer erflogreich eingeloggt, wo liegt mein Fehler ?
PHP Code:
#region ### START Koda GUI section ### Form=
Opt("GUIOnEventMode"1)
$Form1 GUICreate("Registration"251146192144)
$Label1 GUICtrlCreateLabel("Benutzername :"16327817)
$Label2 GUICtrlCreateLabel("Passwort :"40645317)
$_Username GUICtrlCreateInput(""963212121)
$_Password GUICtrlCreateInput(""966412121)
$_Registrieren GUICtrlCreateButton("Registrieren"16969133)
$_Anmelden GUICtrlCreateButton("Anmelden"1129610733)
GUICtrlSetOnEvent($_Registrieren"_Registrieren")
GUICtrlSetOnEvent($_Anmelden"_Anmelden")
GUISetOnEvent(-3"_exit")
GUISetState(@SW_SHOW)
#endregion ### END Koda GUI section ###

While 1
    Sleep
(100)
WEnd

Func _Registrieren
()

    
IniWrite("Daten.ini""ACCDATEN""USER"$_Username)
    
IniWrite("Daten.ini""ACCDATEN""PASS"$_Password)

EndFunc   ;==>_Registrieren



Func _Anmelden
()

    
$_iUsername IniRead("Daten.ini""ACCDATEN""USER"$_Username)
    
$_iPassword IniRead("Daten.ini""ACCDATEN""PASS"$_Password)

    If 
$_Username == $_iUsername And $_Password == $_iPassword Then
        MsgBox
(0"Eingeloggt!""Herzlichen Glückwunsch" & @CRLF " Sie haben sich erfolgreich eingeloggt!")
    Else
        
MsgBox(0"Fehlerhafte Eingabe!""Benutzername existiert nicht oder das Passwort wurde falsch eingegeben")

    EndIf

EndFunc   ;==>_Anmelden

Func _exit
()
    Exit
EndFunc   ;==>_exit 
Defkahn52 is offline  
Old 09/20/2012, 23:30   #15
 
butter123's Avatar
 
elite*gold: 95
Join Date: May 2011
Posts: 982
Received Thanks: 189
Um das was in einer Inputbox steht auszulesen musst du immer GUICtrlRead($Inputbox) verwenden. Dann klappts

Edit: beim Anmelden solltest du etwas anderes für den Defaultvalue zurückgeben. Die Inputboxen, als Variable oder ausgelesen führen zu Lücken im System.

Edit2: Zu deiner Frage davor: $_Password = GUICtrlCreateInput("", 96, 64, 121, 21,$ES_PASSWORD) erstellt eine Inputbox, die nur Punkte anzeigt. Nach der Höhe kannst du noch einen Style angeben. Hier ist der Style halt, dass es nur Punkte anzeigen soll. Dazu brauchst du dann noch #include <EditConstants.au3> Steht aber auch alles in der Hilfe
butter123 is offline  
Thanks
1 User
Reply


Similar Threads Similar Threads
Musik Hilfe -Intervalle-
10/20/2011 - Off Topic - 2 Replies
Morgen schreiben wir eine HÜ(Hausaufgabenüberprüfung) und zwar habe ich vergessen wie die Intervalle heißen Die kenne ich noch 1. Prime 2. Sekunde 3Terz 4. 5. 6. 7. 8.
[Frage]neuer cmd befehl erstellen per game.py?
08/22/2011 - Metin2 Private Server - 0 Replies
hey Com, ich arbeite momentan an einem Projekt, wozu ich aller dings einen neuen Questbefehl oder allgemein Befehl laden soll. Den befehl start ich dann per quest zb cmd ("befehl. pfad") so in der art joa wie genau setzt man das eigtl um?
GM befehl für neue Kingrüssi
08/02/2011 - Metin2 Private Server - 9 Replies
Ich suche die GM Befehle für die neuen Kingrüssis für Metin2 pls wenn einer des weis sagtts mir bitte.
Report-Intervalle
04/09/2010 - Off Topic - 32 Replies
Hallo Leute, ich möchte ein Problem ansprechen, dass ich leider nicht länger ignorieren kann. Meiner Meinung nach ist die Zeit zwischen den Reports, die man abwarten muss, von Nachteil. Manchmal will ich schnell alles reporten, was anffällt, und wie ihr euch sicher vorstellen könnt, ist das in der Metin2-Sektion ne Menge. Aber diese Minute, die man zwischen jedem Report abwarten muss, ist ehrlich gesagt hemmend.



All times are GMT +2. The time now is 22:35.


Powered by vBulletin®
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2024 elitepvpers All Rights Reserved.