|
You last visited: Today at 22:35
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.
09/19/2012, 16:28
|
#1
|
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
|
|
|
09/19/2012, 17:25
|
#2
|
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
|
|
|
09/19/2012, 17:30
|
#3
|
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
|
|
|
09/19/2012, 18:09
|
#4
|
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.
|
|
|
09/19/2012, 18:13
|
#5
|
elite*gold: 8
Join Date: Aug 2009
Posts: 1,504
Received Thanks: 396
|
Quote:
Originally Posted by Achat
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
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-
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
|
|
|
09/19/2012, 18:28
|
#6
|
elite*gold: 528
Join Date: Jan 2012
Posts: 2,127
Received Thanks: 2,404
|
Quote:
Originally Posted by -STORM-
[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
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
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
|
|
|
09/19/2012, 18:41
|
#7
|
elite*gold: 124
Join Date: Dec 2009
Posts: 2,114
Received Thanks: 3,141
|
Quote:
Originally Posted by Achat
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.
|
|
|
09/19/2012, 19:04
|
#8
|
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", 279, 144, 192, 144) $xInput = GUICtrlCreateInput("", 120, 32, 121, 21) $yInput = GUICtrlCreateInput("", 120, 64, 121, 21) $Label1 = GUICtrlCreateLabel("X-Koordinate :", 40, 32, 71, 17) $Label2 = GUICtrlCreateLabel("Y-Koordinate :", 40, 64, 71, 17) $berechnen = GUICtrlCreateButton("Berechnen", 120, 96, 123, 33) $anleitung = GUICtrlCreateButton("Anleitung", 32, 96, 75, 33) 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^2 + $yKoordinate^2) $_hoehe = 100 + Floor($entfernung/100) MsgBox (0, "", "Entfernung :" & @TAB & @TAB & Round($entfernung, 3) & @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.
|
|
|
09/19/2012, 20:12
|
#9
|
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.
|
|
|
09/20/2012, 21:16
|
#10
|
elite*gold: 8
Join Date: Aug 2009
Posts: 1,504
Received Thanks: 396
|
Quote:
Originally Posted by -STORM-
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 ?
|
|
|
09/20/2012, 21:28
|
#11
|
elite*gold: 528
Join Date: Jan 2012
Posts: 2,127
Received Thanks: 2,404
|
Quote:
Originally Posted by Defkahn52
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
|
|
|
09/20/2012, 22:16
|
#12
|
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.
|
|
|
09/20/2012, 22:18
|
#13
|
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
|
|
|
09/20/2012, 22:31
|
#14
|
elite*gold: 8
Join Date: Aug 2009
Posts: 1,504
Received Thanks: 396
|
Quote:
Originally Posted by H@CT0R
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", 251, 146, 192, 144) $Label1 = GUICtrlCreateLabel("Benutzername :", 16, 32, 78, 17) $Label2 = GUICtrlCreateLabel("Passwort :", 40, 64, 53, 17) $_Username = GUICtrlCreateInput("", 96, 32, 121, 21) $_Password = GUICtrlCreateInput("", 96, 64, 121, 21) $_Registrieren = GUICtrlCreateButton("Registrieren", 16, 96, 91, 33) $_Anmelden = GUICtrlCreateButton("Anmelden", 112, 96, 107, 33) 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
|
|
|
09/20/2012, 23:30
|
#15
|
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
|
|
|
|
|
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.
|
|