Hallo,
schön, dass ihr zu meinem Thread gefunden habt :)
Die Gründe für die Erstellung dieses Threads waren mehrere grottige Sourcecodes von AutoIt.
Vermehrt hab ich gesehen, dass diese Sources schwer für Außenstehende zu lesen waren.
Deshalb versuch ich nun in der AutoIt Section einen gewissen Standard für Sources einzuführen, damit jeder direkt erkennen kann, was der Source macht, ohne sich lange durch das Gewirr durchzuarbeiten.
Ich glaube es würde allen sehr helfen, denn ihr wollt ja auch schnell Hilfe bekommen, das geht einfacher mit einem sauberen Source ;)
Themen:
- Allgemein
- Variablen
- Einrückungen
- Funktionen
- Schleifen
- Schluss
Allgemein:
Um ein gut organisiertes Script zu haben sollte man immer folgendes Schema abarbeiten:
- Includes
- HotKeySets (optional)
- Options (Als AutoIt Funktion: "Opt")
- Variablen
- GUI
- Schleife
- Funktionen
Damit ist gewährleistet, dass ein Fremder direkt weiß, wo er die einzelnen Funktionen zu finden hat!
HotKeySets müssen nicht zu Start angegeben sein, sollte man jedoch machen, wenn man das HotKeySet die ganze Laufzeit über benutzt.
Außerdem sollten nach den "Opts" direkt die Variablen folgen, wie man sie besser benennt erkläre ich später.
Letztendlich kommt die GUI mit der dazugehörigen Loop.
Nach Möglichkeit immer ein Sleep in die Loop setzen, es sei denn man benutzt die MessageLoop, die besitzt von selber schon eine gute Sleepfunktion.
Variablen:
Wichtig bei einem guten Sourcecode sind außerdem die Variablen.
Da bei AutoIt eine Variable jeden Wert annehmen kann, ist es wichtig, dass sie einen guten Namen bekommt.
Bei C++ zum Beispiel ist es so, dass eine "int" Variable nur einen Integer Wert besitzen kann, es würde zu einem Runtime Error kommen, wenn diese Variable als "char" oder "string" benutzt werden würde.
Zurück zu den AutoIt Variablen.
Wie man vielleicht merkt, könnte die ein und selbe Variable verschiedene Werte annehmen, z.B. könnte man ihr erst einen String zuordnen und danach direkt einen Integer Wert, AutoIt ist das egal.
Aber damit man den Überblick nicht verliert, ist es, wie eingangs schon erläutert, von großer Wichtigkeit, dass sie einen guten Namen bekommt.
Kontraproduktiv sind Variablennamen wie "read1", "send", "read2", "send2" oder "read435879".
Ein Außenstehender - oder auch ihr selbst - verliert dort sehr schnell den Überblick.
Deshalb ist es wichtig, die Variable so zu benennen, was sie macht!
Gut wäre zum Beispiel "$Count" statt "$Cnt" oder "$Variable".
Aber man weiß nun noch nicht, was für einen Datentyp die Variable haben kann. Damit man direkt weiß: "Aha, diese Variable besitzt nur den Wert "Float"", sollte man der Variable noch ein kleines Vorzeichen geben.
Optimal wäre nun also $iCount. Man erkennt, dass es eine Integer Variable ist, die anscheinend "Dinge" zählt.
So benutzt man:
- a für Arrays
- b für Binary
- c/id für Control-ID
- o für Object
- h für Handles
- t für DLLStructs
- i für Integer
- s für Strings
- n für Float
- f für Boolean (True/False)
Falls ihr noch Fragen dazu habt, welches Vorzeichen Datentyp xyz bekommen soll, dann einfach in dem Thread fragen.
Einrückungen:
Gerade für die Übersicht ist es wichtig, wenn ihr eure Sources passend einrückt.
So sollte eine Schleife auf jedenfall mit einem Tab weiter eingerückt sein, als die Schleife darüber.
Wenn ihr euer Script fertig programmiert habt, klickt einfach oben im Editor auf "Tools" und dann "Tidy AutoIt Source Code".
Dafür benötigt ihr jedoch das große "SciTe" Packet, welches ihr hier bekommt:
[Only registered and activated users can see links. Click Here To Register...]
Einfach auf der linken Seite schauen, dort ist eine kleine Box, wo u.a. auch "SciTe" steht. Einfach auf den Downloadlink klicken, downloaden und installieren.
Als kleine Anmerkung nebenbei:
Darunter seht ihr 2 weitere Download Links.
Eines ist die deutsche Hilfe, die sehr hilfreich für euch sein könnte, wenn ihr nicht so gut in Englisch seid. Und einmal "Organize Includes" das würde ich jedem empfehlen.
Denn wenn ihr fertig programmiert habt und es unter "Tools" im Editor (SciTe) startet, wirft es automatisch alle unnötigen Includes raus und fügt die hinzu, die man braucht.
Super Tool :)
Funktionen:
Wie bereits erwähnt sollten Funktionen immer an das Ende des Scripts verschoben werden, diese werden automatisch erkannt, d.h. sie müssen nicht an die Stelle verschoben werden, wo sie erstellt werden sollen! Sie werden automatisch am Start des Scriptes erstellt.
Zu den Funktionen gibt es weiter nichts zu sagen, außer, dass man auch hier auf die Beschriftung achten sollte! Außerdem sollten alle Funktionsnamen mit einem "_" beginnen, da es sich so entwickelt hat.
Schleifen:
Um die Performance des Scripts zu erhöhen empfiehlt es sich immer die optimalsten Schleifen zu verwenden.
So sollte man nicht eine While Schleife mit ExitLoop nehmen, wenn man zu einer bestimmten Zeit etwas beenden möchte, besser ist eine Do Until.
Oder auch eine For Schleife!
Auch kann man den Gebrauch von zuvielen "If" Abfragen durch ein gut durchdachtes "Switch" ersetzen bzw. sollte man "ElseIf" Abfragen verwenden. Einfach der übersichtlichkeitshalber.
Schluss:
Ich hoffe euch hat das Tutorial gefallen und will nun sehen, dass hier immer mehr strukturierte Sources sind, da man so einfach am Schnellsten helfen kann!
Zum Abschluss zeige ich nochmal einen kleinen Beispiel Sourcecode mit allen Punkten inbegriffen, wie er am optimalsten aussähe.
Beispiel:
MfG Pinguin.
PS: Fragen, Anregungen, Feedback ist gerne erwünscht, Flames jedoch nicht!
schön, dass ihr zu meinem Thread gefunden habt :)
Die Gründe für die Erstellung dieses Threads waren mehrere grottige Sourcecodes von AutoIt.
Vermehrt hab ich gesehen, dass diese Sources schwer für Außenstehende zu lesen waren.
Deshalb versuch ich nun in der AutoIt Section einen gewissen Standard für Sources einzuführen, damit jeder direkt erkennen kann, was der Source macht, ohne sich lange durch das Gewirr durchzuarbeiten.
Ich glaube es würde allen sehr helfen, denn ihr wollt ja auch schnell Hilfe bekommen, das geht einfacher mit einem sauberen Source ;)
Themen:
- Allgemein
- Variablen
- Einrückungen
- Funktionen
- Schleifen
- Schluss
Allgemein:
Um ein gut organisiertes Script zu haben sollte man immer folgendes Schema abarbeiten:
- Includes
- HotKeySets (optional)
- Options (Als AutoIt Funktion: "Opt")
- Variablen
- GUI
- Schleife
- Funktionen
Damit ist gewährleistet, dass ein Fremder direkt weiß, wo er die einzelnen Funktionen zu finden hat!
HotKeySets müssen nicht zu Start angegeben sein, sollte man jedoch machen, wenn man das HotKeySet die ganze Laufzeit über benutzt.
Außerdem sollten nach den "Opts" direkt die Variablen folgen, wie man sie besser benennt erkläre ich später.
Letztendlich kommt die GUI mit der dazugehörigen Loop.
Nach Möglichkeit immer ein Sleep in die Loop setzen, es sei denn man benutzt die MessageLoop, die besitzt von selber schon eine gute Sleepfunktion.
Variablen:
Wichtig bei einem guten Sourcecode sind außerdem die Variablen.
Da bei AutoIt eine Variable jeden Wert annehmen kann, ist es wichtig, dass sie einen guten Namen bekommt.
Bei C++ zum Beispiel ist es so, dass eine "int" Variable nur einen Integer Wert besitzen kann, es würde zu einem Runtime Error kommen, wenn diese Variable als "char" oder "string" benutzt werden würde.
Zurück zu den AutoIt Variablen.
Wie man vielleicht merkt, könnte die ein und selbe Variable verschiedene Werte annehmen, z.B. könnte man ihr erst einen String zuordnen und danach direkt einen Integer Wert, AutoIt ist das egal.
Aber damit man den Überblick nicht verliert, ist es, wie eingangs schon erläutert, von großer Wichtigkeit, dass sie einen guten Namen bekommt.
Kontraproduktiv sind Variablennamen wie "read1", "send", "read2", "send2" oder "read435879".
Ein Außenstehender - oder auch ihr selbst - verliert dort sehr schnell den Überblick.
Deshalb ist es wichtig, die Variable so zu benennen, was sie macht!
Gut wäre zum Beispiel "$Count" statt "$Cnt" oder "$Variable".
Aber man weiß nun noch nicht, was für einen Datentyp die Variable haben kann. Damit man direkt weiß: "Aha, diese Variable besitzt nur den Wert "Float"", sollte man der Variable noch ein kleines Vorzeichen geben.
Optimal wäre nun also $iCount. Man erkennt, dass es eine Integer Variable ist, die anscheinend "Dinge" zählt.
So benutzt man:
- a für Arrays
- b für Binary
- c/id für Control-ID
- o für Object
- h für Handles
- t für DLLStructs
- i für Integer
- s für Strings
- n für Float
- f für Boolean (True/False)
Falls ihr noch Fragen dazu habt, welches Vorzeichen Datentyp xyz bekommen soll, dann einfach in dem Thread fragen.
Einrückungen:
Gerade für die Übersicht ist es wichtig, wenn ihr eure Sources passend einrückt.
So sollte eine Schleife auf jedenfall mit einem Tab weiter eingerückt sein, als die Schleife darüber.
Wenn ihr euer Script fertig programmiert habt, klickt einfach oben im Editor auf "Tools" und dann "Tidy AutoIt Source Code".
Dafür benötigt ihr jedoch das große "SciTe" Packet, welches ihr hier bekommt:
[Only registered and activated users can see links. Click Here To Register...]
Einfach auf der linken Seite schauen, dort ist eine kleine Box, wo u.a. auch "SciTe" steht. Einfach auf den Downloadlink klicken, downloaden und installieren.
Als kleine Anmerkung nebenbei:
Darunter seht ihr 2 weitere Download Links.
Eines ist die deutsche Hilfe, die sehr hilfreich für euch sein könnte, wenn ihr nicht so gut in Englisch seid. Und einmal "Organize Includes" das würde ich jedem empfehlen.
Denn wenn ihr fertig programmiert habt und es unter "Tools" im Editor (SciTe) startet, wirft es automatisch alle unnötigen Includes raus und fügt die hinzu, die man braucht.
Super Tool :)
Funktionen:
Wie bereits erwähnt sollten Funktionen immer an das Ende des Scripts verschoben werden, diese werden automatisch erkannt, d.h. sie müssen nicht an die Stelle verschoben werden, wo sie erstellt werden sollen! Sie werden automatisch am Start des Scriptes erstellt.
Zu den Funktionen gibt es weiter nichts zu sagen, außer, dass man auch hier auf die Beschriftung achten sollte! Außerdem sollten alle Funktionsnamen mit einem "_" beginnen, da es sich so entwickelt hat.
Schleifen:
Um die Performance des Scripts zu erhöhen empfiehlt es sich immer die optimalsten Schleifen zu verwenden.
So sollte man nicht eine While Schleife mit ExitLoop nehmen, wenn man zu einer bestimmten Zeit etwas beenden möchte, besser ist eine Do Until.
Oder auch eine For Schleife!
Auch kann man den Gebrauch von zuvielen "If" Abfragen durch ein gut durchdachtes "Switch" ersetzen bzw. sollte man "ElseIf" Abfragen verwenden. Einfach der übersichtlichkeitshalber.
Schluss:
Ich hoffe euch hat das Tutorial gefallen und will nun sehen, dass hier immer mehr strukturierte Sources sind, da man so einfach am Schnellsten helfen kann!
Zum Abschluss zeige ich nochmal einen kleinen Beispiel Sourcecode mit allen Punkten inbegriffen, wie er am optimalsten aussähe.
Beispiel:
Code:
; ***Includes***
#include <EditConstants.au3>
#include <WindowsConstants.au3>
; **************
; ***HotKeySets***
HotKeySet("{ESC}", "_Exit")
; ****************
; ***Options (Opt)***
Opt("GUIOnEventMode", 1)
; *******************
; ***Variablen***
Global $GUI, $Text, $Run, $Cancel
$sTitle = "Beispielscript: Notepad-Send (Tutorial pinguin94)"
$sRunLable = "Run"
$sCancelLabel = "Cancel"
; ***GUI***
$GUI = GUICreate($sTitle, 418, 437, 611, 266)
GUISetOnEvent(-3, "_Exit")
GUISetFont(14, 400, 0, "Arial")
$Text = GUICtrlCreateEdit("", 16, 16, 385, 337, BitOR($ES_AUTOVSCROLL, $ES_WANTRETURN, $WS_VSCROLL))
$Run = GUICtrlCreateButton($sRunLable, 40, 376, 121, 41)
GUICtrlSetOnEvent(-1, "_RunNotepad")
$Cancel = GUICtrlCreateButton($sCancelLabel, 256, 376, 121, 41)
GUICtrlSetOnEvent(-1, "_Exit")
GUISetState(@SW_SHOW)
; ***Main-Loop***
While 1
Sleep(100)
WEnd
; ***Funktionen***
Func _Exit()
Exit
EndFunc ;==>_Exit
Func _RunNotepad()
Local $PID = Run("notepad.exe")
WinWait(_GetHwndFromPID($PID))
$sReadEdit = GUICtrlRead($Text)
Send($sReadEdit)
EndFunc ;==>_RunNotepad
Func _GetHwndFromPID($PID)
$hWnd = 0
$stPID = DllStructCreate("int")
Do
$winlist2 = WinList()
For $i = 1 To $winlist2[0][0]
If $winlist2[$i][0] <> "" Then
DllCall("user32.dll", "int", "GetWindowThreadProcessId", "hwnd", $winlist2[$i][1], "ptr", DllStructGetPtr($stPID))
If DllStructGetData($stPID, 1) = $PID Then
$hWnd = $winlist2[$i][1]
ExitLoop
EndIf
EndIf
Next
Sleep(100)
Until $hWnd <> 0
Return $hWnd
EndFunc ;==>_GetHwndFromPID
PS: Fragen, Anregungen, Feedback ist gerne erwünscht, Flames jedoch nicht!