So noch ein TuT von mir.^^
Diesmal geht es um allsamt interesantes was AutoIT angeht.
Übersicht
1. Dynamische GUI Erzeugung mit Arrays und For Schleifen
So klingt jetz etwas kompliziert, da ich mehrere Dinge aufeinmal erklären werde, ist aber eigentlich ganz simpel.
Es geht darum sein Script etwas dynamischer zu erstellen. Es mag nicht umbedingt überall angepasst seien, aber dort wo man viel mit sich "wiederholenden" (Gui)Formen zu tuen hat, ist es immer praktisch.
Also fangen wir mal an. Zunächst definieren wir mal den Array:
So und jetz setzten wir uns mal an unser GUI:
Ok dann verusch ich es mal zu erklären:
UBound gibt uns den Index eines Arrays zurück, also "6". Die Größe des GUI`s wird von dem Index des Arrays bestimmt: 30*UBound($Test)
Das entspricht: 30*6
Das nächste müsste auch verständlich seien: Zuerst initialisieren wir den Array. Dann definieren wir die Elemente durch die For Scheife. hier solltet ihr auf das (UBound($Test) -1) achten. Da wir nun die elemente des Arrays definieren müssen wir 1 abziehen, da ja das größte Element nur 5 beträgt. Die einzelnen Buttons haben je die ID $Button[1-5].
Ok jetz fehlt aber immer noch was. Wir müssen natürlich noch die Message While dynamisch schreiben:
Jetzt bleibt aber immernoch eine Frage offen. Jeder Button hat ja jetz die selbe Funktion(exit), was soll mir das bringen. Die Antwort ist simpel: So bringt euch das überhaupt nicht, habt ihr jedoch eine Funktion die Parameter benutzt kann das ziemlich praktisch ist. Simples Beispiel:
wenn ihr lust habt könnt ihr eine Funktion erstellen die $Test[x] ausgibt und diese in die Loop einbauen.
2. Kommunikation zwischen zwei Programmen
Ein Problem das vorkommen kann wenn programmiert ist das man gerne einen anderen Programm einen bestimmten Wert mitteilen möchte. Ich werde euch heute zeigen wie man es mit einem INI File macht. wir benutzen dazu unseren File aus den obrigen Tutorial:
Wie ihr seht habe ich die Funktion innerhalb der IF ein bischen abgewandt, aber dazu werden wir später kommen. Zuerst müssen wir ersteinmal ein INI File erstellen:
Ok und jetz werden wird den INI File "schreiben":
Wie ihr seht kommt das Neugelernte von oben zu Einsatz. Wenn ihr jetz alles richtig gemacht habt und das Script ausgeführt habt, sollte sich jetz in euren Verzeichniss eine Datei mit dem Namen inifile.ini befinden und folgenden Inhalt habe:
Das ist etwas was ich persöhnlich total cool finde, wir können einen INI file dynamisch schreiben lassen. Ok jetz gehen wir zu der Funktion die in dem IF stand. Den folgenden Code könnt ihr über oder unter den GUI Bereich schreiben:
Wars auch schon; Noch das Kommentar wegmachen, dann könnt den File speichern und compilen.
Ok jetz machen wir uns auf unseres zweites Programm zu schreiben:
Ok was machen wir? Zuerst besorgen wir den Index(-1) von unserem Test Array. Dann kopieren wir diesen sozusagen indem wir ihn selber neu definieren und die Werte dafür aus dem IniFile beziehen. am Schluß steht noch eine Schleife, die in unseren Fall eine GUI Loop darstellen soll. Und genau diese Schleife bearbeiten wir jetz *hehe*:
So jetz nur noch beide scripts compilen, öffnen und Spaß haben.
Hier noch einige Aufgaben für euch, um ein bischen zu üben, falls ihr daran Spaß habt:
3. Decryption mit MC4
So was auch noch ganz praktisch seien kann ist die Verschlüßelung von Strings mithilfe von MC4. Hierfür benötigen wir die Funktion _StringEncrypt :
Mit _StringEncrypt können wir Decrypten und Crypten. Der erste Parameter gibt dies an: 1 wenn wir crypten wollen, 0 wenn wir decrypten wollen. Der nächste Parameter gibt den Text an den wir verschlüsseln wollen und der nächste das Passwort dazu. Das Passwort dient dazu das wir das Verschlüsselte wieder entschlüsseln können, da ihr das selbe Passwort bei der Entschlüsselung nehmen müsst wie bei der Verschlüsselung. Der letzte Wert gibt an wie gut die Verschlüsselung ist. Sollte er zu hoch seien, kann das Verschlüsseln sehr lange dauern.
4. Alles was mit dem Internet zu tuen hat
Hach das schöne Internet. Damit lassen sich sehr viele Dinge anstellen und einige Sachen können wir mit AutoIT auch. Als erstes werden wir mal sehen wie wir den ein Patcher für unser Programm schreiben können:
Mit InetGet holen wir uns ein File aus dem Internet. Probieren wir das doch einfach mal indem wir uns ein Programm schreiben das uns immer die aktuellste version von diesen Tutorial holt:
Zunächst holen wir uns das Tutorial(erster Parameter), danach speicher wir sie als "Tutorial.html"(zweiter Parameter). Der dritte Parameter gibt an ob wir sie aus den Cache holen(0) oder sie aufjedenfall neuladen(1). Der vierte Parameter gibt an ober wir warten bis die Datei gedownlaodet ist(0) oder ob wir gleich weitermachen(1). Wenn ihr im Background downloadet könnt ihr folgenen Makro benutzen um die aktuell heruntergeladenen Bytes zu ermitteln(zB für ein Fortschritts Balken) : @InetGetBytesRead. Wenn ihr einen Download abrechen wollt dann get "abort" als ersten Parameter mit. Wenn euer Server Passwort geschützt ist müsst ihr eure Adresse folgendermaßen eintragen:
Bevor wir jedoch die Datei runterladen wollen wir doch vieleicht vorher unseren User wissen lassen wie groß diese ist. Dazu benutzen wir InetGetSize. Hier fallen alles zusätzlichen Parameter(also ob BG download usw.) weg und man muss jeglich die URL als Parameter angeben. Der Rückgabe Wert ist die größe in Bytes.
Auch wollen wir vieleicht erst checken, ob wir den Host überhaupt erreichen.
Dazu benutzen wir Ping:
4.1. Downloader mit Fortschrittsbalken
In der vorherigen Section haben wir gesehen, wie man einen file downloaden kann. In dieser Section werden wir lernen, wie man anhand dieses Beispiel Fortschrittsbalken erstellt. Wir beginnen damit indem wir erstmal das Script so umformen, dass der Download im hintergrund läuft
Wie ihr seht habe ich noch 2 Variablen und die Schleife am Ende hinzugefügt, die als Platzhalter dient. $Size ist die Größe des Files während $Percent 1% dieser Größe darstellt. Mit ProgressOn werden wir jetz ein Fortschritts Balken erstellen:
ProgressOn kreirt ein Fenster mit einem Fortschrittsbalken. Der erste Parameter ist der Fenstertitel, der zweite eine Art Überschrift über den Balken und der dritte eine Angabe unter dem Balken. So und jetz werden wir mal unseren Balken zu Leben erwecken indem wir die While Schleife druch folgendes ersetzen:
Ok eins nach den anderen. Zuerst erstellen wir eine For Schleife die von 0 bis 100 durchläuft, vergleichbar mit 0%-100%. In dieser wird jetz eine While erzeugt, welche nur beendet wird, wenn 1% des downloads fertig sind. Denn mit @InetGetBytesRead bekommen wir die bereits heruntergeladenen Bytes raus. Sollte also 1% fertig geladen seien kommt ProgressSet($i,$i & "%") zum Einsatzt. Der erste Parameter ändert den Fortschrittsbalken in Prozent. Der zweite ändert den Text unter dem Balken. Jetz kommt nocheinmal eine IF zum Einsatz: Wenn wir bei 100% angelangt sind soll sich der Balken mithilfe von ProgressOff() schließen. Sollte sich ein error während diesem ganzen Prozess ereignen wird @InetGetBytesRead auf -1 gesetzt. Das überprüfen wir mit dem ElseIf. Aber jetz ist da noch eine Unklarheit: Wofür ist das Sleep? Das Sleep brauchen wir damit wir den Balken überhaupt sehen(wenn ihr ein richtigen Dwonloader macht, macht das sleep bitte raus), da eine HTML Datei so klein ist, ist sie in null komma nichts gedownloadet und von unseren Balken sehen wir überhaupt nichts. Daher haben wir einen kleinen Sleep der den Balken etwas verzögert.
5. File Management
Ok hierfür werden wir ein größeres Projekt ähnlich denen wie in Section 1 und 2 schreiben. Wir beginnen indem wir erstmal das GUI schreiben:
Wie ihr seht habe ich den Code von Koda generieren lassen(außer ein paar Sachen wie zB die Variable $path und dne Include). Wir beginnen damit indem wir einfach mal ein File öffnen:
Ok zur Erläuterung: Zunächst ienmal holen wir uns den Pfad der datei mit den OpDialog.Die Parameter bauen sich wiefolgt auf: 1. Name des dialoges 2. Voreingestellter Pfad wo sich der Dialog befindet(dardurch das wir $patch neu schreiben, kommen wir immer an die Stelle zurück wo wir zuletzt etwas ausgewählt haben). 3. Filtergruppen: Zunächst einmal geben wir der Gruppe einen Namen(Textdateien), dann bestimmen wir welche Dateien in diesen Filter fallen(.txt Datein). Wir können mehrere Dateitypen so eintragen: "Filter1 (*.bla;*.bla2)"
Die nächsten Zeilen dürften klar seien. Wir holen uns die Zeilenanzahl des Files und holen uns dann immer Zeile um Zeile(mit FileReadLine) und tragen diese in unsere Box ein.
So das war auch schon alles zu unseren ausles, jetz kommen wir zum schreiben was sich als einfacher erweisen sollte:
Ok FileSaveDialog verhält sich genauso von den Parametern wie FileOpenDialog. Jedoch müssen wir aufpassen, da uns der SaveDialog das ".txt" hinten dran hängt. Daher das IF, welches einfach noch ".txt" an den Pfad dranhängt falls nichts anderes angeben. FileOpen im Modus 2 benötigen wir damit der vorherige Inhalt gelöscht wird.
So das wars erstmal mit meinem Tutorial. Schickt mir eure Vorschläge was man noch rein machen könnte, ich freue mich drauf. Sollte etwas nicht funktionieren: mir Bescheid sagen. Ich habe teilweiße manche Stellen nachträglich geändert und da ich keine Lust hatte alles neu einzufügen habe ich die Sachen von Hand nachgebessert.
MfG
Xereon
Diesmal geht es um allsamt interesantes was AutoIT angeht.
Übersicht
- Dynamische GUI Erzeugung mit Arrays und For Schleifen
- Kommunikation zwischen zwei Programmen
- Decryption mit MC4
- Alles was mit dem Internet zu tuen hat
- Downloader mit Fortschrittsbalken
- File Management
1. Dynamische GUI Erzeugung mit Arrays und For Schleifen
So klingt jetz etwas kompliziert, da ich mehrere Dinge aufeinmal erklären werde, ist aber eigentlich ganz simpel.
Es geht darum sein Script etwas dynamischer zu erstellen. Es mag nicht umbedingt überall angepasst seien, aber dort wo man viel mit sich "wiederholenden" (Gui)Formen zu tuen hat, ist es immer praktisch.
Also fangen wir mal an. Zunächst definieren wir mal den Array:
PHP Code:
Dim $Test[6]
$Test[0] = "Hallo Welt" ;~ Deutsch
$Test[1] = "Hello World" ;~ Englisch
$Test[2] = "Bonjour tout le monde" ;~ Französich
$Test[3] = "Ciao a tutti!" ;~ Italienisch
$Test[4] = "Hola Mundo" ;~ Spanisch
$Test[5] = "Merhaba Dünya" ;~ Türkisch
PHP Code:
#Region GUI SECTION
$GUI = GUICreate("TEST: Hello World",300,30*UBound($Test))
Dim $Button[UBound($Test)]
For $i = 0 To (UBound($Test) -1) Step 1
$Button[$i] = GUICtrlCreateButton($Test[$i],0,30*$i,300,30)
Next
GUISetState(@SW_SHOW,$GUI)
#EndRegion
While 1
WEnd
UBound gibt uns den Index eines Arrays zurück, also "6". Die Größe des GUI`s wird von dem Index des Arrays bestimmt: 30*UBound($Test)
Das entspricht: 30*6
Das nächste müsste auch verständlich seien: Zuerst initialisieren wir den Array. Dann definieren wir die Elemente durch die For Scheife. hier solltet ihr auf das (UBound($Test) -1) achten. Da wir nun die elemente des Arrays definieren müssen wir 1 abziehen, da ja das größte Element nur 5 beträgt. Die einzelnen Buttons haben je die ID $Button[1-5].
Ok jetz fehlt aber immer noch was. Wir müssen natürlich noch die Message While dynamisch schreiben:
PHP Code:
While 1
$msg = GUIGetMsg();
For $i = 0 To (UBound($Test) -1) Step 1
If ($msg == $Button[$i]) Then
Exit
EndIf
Next
WEnd
PHP Code:
For $i = 0 To (UBound($Test) -1) Step 1
If ($msg == $Button[$i]) Then
Eure_komische_Funktion($i*400)
EndIf
Next
2. Kommunikation zwischen zwei Programmen
Ein Problem das vorkommen kann wenn programmiert ist das man gerne einen anderen Programm einen bestimmten Wert mitteilen möchte. Ich werde euch heute zeigen wie man es mit einem INI File macht. wir benutzen dazu unseren File aus den obrigen Tutorial:
PHP Code:
Dim $Test[6]
$Test[0] = "Hallo Welt" ;~ Deutsch
$Test[1] = "Hello World" ;~ Englisch
$Test[2] = "Bonjour tout le monde" ;~ Französich
$Test[3] = "Ciao a tutti!" ;~ Italienisch
$Test[4] = "Hola Mundo" ;~ Spanisch
$Test[5] = "Merhaba Dünya" ;~ Türkisch
#Region GUI SECTION
$GUI = GUICreate("TEST: Hello World",300,30*UBound($Test))
Dim $Button[UBound($Test)]
For $i = 0 To (UBound($Test) -1) Step 1
$Button[$i] = GUICtrlCreateButton($Test[$i],0,30*$i,300,30)
Next
GUISetState(@SW_SHOW,$GUI)
#EndRegion
While 1
$msg = GUIGetMsg();
For $i = 0 To (UBound($Test) -1) Step 1
If ($msg == $Button[$i]) Then
;~ SendReponse($i)
EndIf
Next
WEnd
PHP Code:
#include <file.au3>
$ini = "inifile.ini"
Dim $Test[6]
$Test[0] = "Hallo Welt" ;~ Deutsch
...
$Test[5] = "Merhaba Dünya" ;~ Türkisch
_FileCreate ($ini)
PHP Code:
$file = FileOpen($ini,2)
FileWriteLine($file,"[Arrays]")
FileWriteLine($file,"Index = " & (UBound($test) -1))
For $i = 0 To (UBound($Test) -1) Step 1
FileWriteLine($file,"Test" & $i & " = " & $test[$i])
Next
FileWriteLine($file,"[Answere]")
FileWriteLine($file,"Code = -1")
FileClose($file)
Code:
[Arrays] Count = 5 Test0 = Hallo Welt Test1 = Hello World Test2 = Bonjour tout le monde Test3 = Ciao a tutti! Test4 = Hola Mundo Test5 = Merhaba Dünya [Answere] Code = -1
PHP Code:
func SendReponse($Code)
IniWrite($ini,"Answere","Code",$Code)
EndFunc
Ok jetz machen wir uns auf unseres zweites Programm zu schreiben:
PHP Code:
$ini = "inifile.ini"
$ArrayIndex = IniRead($ini,"Arrays","Index","0")
Dim $Test[$ArrayIndex +1]
For $i = 0 To $ArrayIndex Step 1
$Test[$i] = IniRead($ini,"Arrays","Test" & $i,"N/A")
Next
While 1
WEnd
PHP Code:
While 1
$code = IniRead($ini,"Answere","Code",-1)
For $i = 0 To $ArrayIndex Step 1
If ($code == $i) Then
MsgBox(-1,"Hello World",$Test[$i])
IniWrite($ini,"Answere","Code",-1)
EndIf
Next
WEnd
Hier noch einige Aufgaben für euch, um ein bischen zu üben, falls ihr daran Spaß habt:
- Macht noch ein paar Sprachen hinzu indem ihr den GoogleTranslator verwendet
- Macht den X button im ersten Script funktionstüchtig und lasst das zweite Script automatisch beenden sobald durch den Button das erste beendet hat
- Versucht diese Techniken in euren Programmen anzuwenden, falls sie dort sinn ergeben
3. Decryption mit MC4
So was auch noch ganz praktisch seien kann ist die Verschlüßelung von Strings mithilfe von MC4. Hierfür benötigen wir die Funktion _StringEncrypt :
PHP Code:
#include <string.au3>
$string_1 = "cRy^Pt`iON"
$password = "Cryption can be so hard..."
$crypted = _StringEncrypt (1,$string_1,$password,1)
$decrypted = _StringEncrypt (0,$crypted,$password,1)
MsgBox(-1,"Cryption",$crypted)
MsgBox(-1,"Decryption",$decrypted)
Mit _StringEncrypt können wir Decrypten und Crypten. Der erste Parameter gibt dies an: 1 wenn wir crypten wollen, 0 wenn wir decrypten wollen. Der nächste Parameter gibt den Text an den wir verschlüsseln wollen und der nächste das Passwort dazu. Das Passwort dient dazu das wir das Verschlüsselte wieder entschlüsseln können, da ihr das selbe Passwort bei der Entschlüsselung nehmen müsst wie bei der Verschlüsselung. Der letzte Wert gibt an wie gut die Verschlüsselung ist. Sollte er zu hoch seien, kann das Verschlüsseln sehr lange dauern.
4. Alles was mit dem Internet zu tuen hat
Hach das schöne Internet. Damit lassen sich sehr viele Dinge anstellen und einige Sachen können wir mit AutoIT auch. Als erstes werden wir mal sehen wie wir den ein Patcher für unser Programm schreiben können:
Mit InetGet holen wir uns ein File aus dem Internet. Probieren wir das doch einfach mal indem wir uns ein Programm schreiben das uns immer die aktuellste version von diesen Tutorial holt:
PHP Code:
InetGet("http://www.elitepvpers.com/forum/epvp-coders-tutorials/286071-autoit-tipps-und-tricks.html","Tutorial.html",1,0)
exit
PHP Code:
InetGet("http://EureUsername:[Only registered and activated users can see links. Click Here To Register...]")
Auch wollen wir vieleicht erst checken, ob wir den Host überhaupt erreichen.
Dazu benutzen wir Ping:
PHP Code:
Ping("www.elitepvpers.com")
If @error Then
MsgBox(-1,"ERROR","Cant connect to server")
Exit
Else
InetGet("http://www.elitepvpers.com/forum/epvp-coders-tutorials/286071-autoit-tipps-und-tricks.html","Tutorial2.html",1,1)
EndIf
4.1. Downloader mit Fortschrittsbalken
In der vorherigen Section haben wir gesehen, wie man einen file downloaden kann. In dieser Section werden wir lernen, wie man anhand dieses Beispiel Fortschrittsbalken erstellt. Wir beginnen damit indem wir erstmal das Script so umformen, dass der Download im hintergrund läuft
PHP Code:
Ping("www.elitepvpers.com")
If @error Then
MsgBox(-1,"ERROR","Cant connect to server")
Exit
Else
InetGet("http://www.elitepvpers.com/forum/epvp-coders-tutorials/286071-autoit-tipps-und-tricks.html","Tutorial2.html",1,1)
EndIf
$Size = InetGetSize("http://www.elitepvpers.com/forum/epvp-coders-tutorials/286071-autoit-tipps-und-tricks.html")
$Percent = $Size / 100
While 1
WEnd
PHP Code:
ProgressOn("Downloader","Size = " & $Size & " Bytes","0%")
While 1
WEnd
PHP Code:
For $i = 0 To 100 Step 1
While 1
If @InetGetBytesRead >= $Percent*$i Then
ProgressSet($i,$i & "%")
Sleep(100)
If $i == 100 Then
ProgressOff()
EndIf
ExitLoop
ElseIf @InetGetBytesRead == -1 Then
ProgressSet(100,"ERROR","An Error Occured!!!")
ProgressOff()
MsgBox(-1,"ERROR","An Error Occured!!!")
Exit
EndIf
WEnd
Next
MsgBox(-1,"Succes","Download Complete!!!")
5. File Management
Ok hierfür werden wir ein größeres Projekt ähnlich denen wie in Section 1 und 2 schreiben. Wir beginnen indem wir erstmal das GUI schreiben:
PHP Code:
#include <file.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
$path = "C:\"
#Region ### START Koda GUI section ### Form=
$Window = GUICreate("Texteditor - Tutorial", 668, 525, 230, 209)
GUISetBkColor(0xFFFFE1)
$Box = GUICtrlCreateEdit("", 10, 10, 536, 501)
GUICtrlSetData(-1, "Open a file please")
$Open = GUICtrlCreateButton("Open File", 560, 10, 101, 41, 0)
$Save = GUICtrlCreateButton("Save File", 560, 65, 101, 41, 0)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
PHP Code:
Case $Open
$path = FileOpenDialog("Datei öffnen",$path,"Textdateien (*.txt)")
GUICtrlSetData($Box,"")
For $i = 0 To _FileCountLines($path) Step 1
Local $line = FileReadLine($path,$i)
Local $data = GUICtrlRead($Box)
GUICtrlSetData($Box,$data & @CRLF & $line)
Next
Die nächsten Zeilen dürften klar seien. Wir holen uns die Zeilenanzahl des Files und holen uns dann immer Zeile um Zeile(mit FileReadLine) und tragen diese in unsere Box ein.
So das war auch schon alles zu unseren ausles, jetz kommen wir zum schreiben was sich als einfacher erweisen sollte:
PHP Code:
Case $Save
$path = FileSaveDialog("Datei speichern",$path,"Textdatein (*.txt)")
If StringRight($path,4) <> ".txt" Then
$path = $path & ".txt"
EndIf
Local $data = GUICtrlRead($Box)
FileWrite($path,$data)
EndSwitch
So das wars erstmal mit meinem Tutorial. Schickt mir eure Vorschläge was man noch rein machen könnte, ich freue mich drauf. Sollte etwas nicht funktionieren: mir Bescheid sagen. Ich habe teilweiße manche Stellen nachträglich geändert und da ich keine Lust hatte alles neu einzufügen habe ich die Sachen von Hand nachgebessert.
MfG
Xereon