- Offizieller Beitrag
Hallo,
Es hat ja mittlerweile schon Tradition, dass es zu Weihnachten meistens eine neue AutoIt stable gibt. So auch dieses Jahr, und diesmal hat sich einiges geändert! Hier ist ein kleines Beispiel, wie sich der Syntax geändert hat - falls ihr Fragen habt, immer her damit, ich hoffe es hilft dem Ein oder Anderen weiter
Spoiler anzeigen
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_AU3Check_Parameters= -q -d -w 1 -w 2 -w 3 -w- 4 -w 5 -w 6 -w- 7
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <Array.au3>
Example()
[/autoit] [autoit][/autoit] [autoit]Func Example()
Local $tStruct, $sTest, $vMsgB, $vTestFunc
;Automatische größe von Arrays, wenn [] benutzt wird (danke an minx)
Local $aTestArray[] = [1, 2, 3, 4]
;Hier gab es gleich zwei Probleme: Zum einen konnte kein leeres Array erstellt werden. ([0])
;Zum anderen konnten statische Arrays nicht mit ReDim erhöht werden - das funktioniert nun beides!
Static $aEmptyArrayOnStatic[0]
;Vergrößere das Array
ReDim $aEmptyArrayOnStatic[4]
$aEmptyArrayOnStatic[0] = "Testbla"
$aEmptyArrayOnStatic[1] = "Test"
$aEmptyArrayOnStatic[2] = "Test1"
$aEmptyArrayOnStatic[3] = "Test2"
;Neuer Array Display Dialog. Wähle paar Elemente aus, klick auf "Run User Func" und schau was passiert
_ArrayDisplay($aEmptyArrayOnStatic, "Item auswählen + auf User Func klicken", "", 0, Default, Default, Default, 0xff9999, "_UserArrayFunc")
$vMsgB = MsgBox;Setze Variable vMsgB auf die Funktion MsgBox
;Hier beschwert sich zwar der Wrapper, funktioniert aber trotzdem. (Ohne Wrapper ausführen)
$vTestFunc = _TestFunc123;und die Variable auf die Funktion _TestFunc123
$tStruct = DllStructCreate("char bla[1024]; int x[4]");tStruct auf eine Struktur
;Setzte den datatype bla auf "Hallo Welt"
$tStruct.bla = "Hallo Welt"
;Das funktioniert nicht, da tStruct.bla eine konstante ist
;~ _TestFunc123($tStruct.bla)
;Da muss man erstmal sTest den wert von tStruct.bla zuweisen
$sTest = $tStruct.bla
;und dann (jetzt neu) mit Call aufrufen, ByRef ging früher mit Call nicht
Call($vTestFunc, $sTest)
;Oder aber auch so:
;~ $vTestFunc($sTest)
;Hier geben wir das nun in einer MessageBox aus (die wir ja oben deklariert haben)
$vMsgB(0, "", "tStruct: " & $tStruct.bla & @CRLF & "sTest: " & $sTest)
;Hier schauen wir noch mal mit tenären operator (wie in C++) nach, ob sTest nicht tStruct.bla enstpricht
[/autoit] [autoit][/autoit] [autoit]$vMsgB(0, "", ($sTest = $tStruct.bla ? "Ups, da ist was falsch gelaufen" : "Jipp, genau so solls sein, sTest != tStruct.bla"))
[/autoit] [autoit][/autoit] [autoit];Hier noch mal FuncName und IsFunc ausprobieren
$vMsgB(0, "", "vTestFunc entspricht der Funktion " & FuncName($vTestFunc) & " und es ist eine " & (IsFunc($vTestFunc) = 2 ? "native Funktion" : "User defined Funktion"))
;Auch interessat, nun kann man direkt hinter Funktionen die ein Array zurück geben, das spezifische Element auswählen
$vMsgB(0, "", "Erstes Element: " & StringSplit("Hallo,Welt,Komma,Seperator", ",")[1] & @CRLF & "Erstes Element von UserFunc: " & $vTestFunc($sTest)[1])
;Hardcoded funktioniert der Zugriff auf Subindexe
$tStruct.x(1) = 11
$tStruct.x(2) = 22
$tStruct.x(3) = 33
$tStruct.x(4) = 44
$vMsgB(0, "", "Sollte 33 sein: " & $tStruct.x(3))
[/autoit] [autoit][/autoit] [autoit]For $i = 1 To 4
;~ $tStruct.x($i) = $i; Das funktioniert nicht, fehler vom Compiler, wird wohl noch ausgebessert. Stattdessen z.B. die untere Zeile verwenden
$tStruct.x(($i)) = $aTestArray[$i - 1]; Mit doppelter klammer funktioniert es. Dannk an Mars
Next
[/autoit] [autoit][/autoit] [autoit]$vMsgB(0, "", "Sollte " & $aTestArray[2] & " sein: " & $tStruct.x(3))
EndFunc ;==>Example
Func _UserArrayFunc($aArray, $aSelected)
#forceref $aArray
MsgBox(0, "", "Du hast " & $aSelected[0] & " Item(s) selected!")
EndFunc ;==>_UserArrayFunc
Func _TestFunc123(ByRef $sTest)
Local $avTest[] = [5, 4, 3, 2, 1]
$sTest = "Test 2"
Return $avTest
EndFunc ;==>_TestFunc123
Gruß,
Spider
Edit: Subindex bei Struktur und automatische Array größe hinzugefügt (dank an minx)
Edit2: Paar kleine Updates