- Offizieller Beitrag
Hi,
ich habe mal ein wenig mit AutoItObject gespielt und mir vorgestellt, wie AutoIt-Syntax als AutoIt-Object aussehen könnte. Dazu habe ich die String-Bibliothek kpl. in einem Objekt gewrappt.
Jede String-Funktion ist hier als Methode abgebildet. Dabei habe ich unterschieden in "aktive Methoden", welche Manipulationen am String vornehmen, und "passive Methoden", welche Auswertungen vornehmen.
Zusätzlich wird der String, der dem Objekt erstmalig zugewiesen wird als Initialstring unveränderbar im Objekt gespeichert. Auf diesen kann wahlweise zugegriffen werden, solange das Objekt existiert. Standardmäßig verwenden jedoch alle Methoden .Val und speichern dort auch die Veränderungen. Somit ist gewährleistet, dass bei verketteten Methoden, jede Methode auf das Ergebnis der vorigen zugreift.
(Über Sinn oder Unsinn dieses Projektes wollen wir hier aber nicht reden. Es geht einzig um die Möglichkeiten. - Auch wenn ich den Eindruck habe, dass kaum jemand ausser MG und mir sich mit AutoIt-Object befasst. )
Und hier mal ein Bsp. mit einigen Funktionen in der Anwendung.
Beispiel
#include "oopAU3.au3"
; für ein besseres Handling lege ich die Funktion zum Erstellen von Stringobjekten auf eine kurze Variable
$oS = _objString_Create
; Der String kann direkt als Parameter beim Erstellen des Objektes übergeben werden oder später an .Value gesetzt werden
; Im Objekt wird der Initialwert unveränderbar gespeichert. Mit Flag "$iUseInit=$_INIT" kann jede Methode angewiesen werden den Initialstring zu verwenden.
; Das Ergebnis einer (aktiven) Methode wird in .Val gespeichert. Dieser Wert wird als Standard ("$iUseInit=$_VAL") bei weiteren Aufrufen verwendet.
$oA = $oS('Hallo Welt!') ; String-Objekt erstellen und String initialisieren
$oB = $oS() ; leeres String-Objekt erstellen
$oB.Val = 'Das ist ein String.' ; Initialstring zuweisen (nur bei erstmaliger Zuweisung wird der Initialstring gesetzt)
; oder
;~ $oB.Val('Das ist ein String.' )
; Um den String, der vom Objekt vekörpert wird, auszugeben wird auf .Val zugegriffen
ConsoleWrite( $oA.Val & @CRLF )
ConsoleWrite( $oB.Val & @CRLF & @CRLF )
; Soll nur das Ergebnis einer Stringmanipulation erstellt werden, ohne dass später weitere Operationen an diesem String durchgeführt werden,
; dann ist es nicht zwingend erforderlich die Objektvariable aufzufangen, ich kann auch gleich das Ergebnis der Operation zurückgeben
; Bsp. von "[ Text in eckigen Klammern ]" sollen die Klammern abgetrennt werden
ConsoleWrite( $oS("[ Text in eckigen Klammern ]").Trim(1).Trim(-1).Val & @CRLF )
; Die Methode .Trim() umfasst: StringTrimLeft(), StringTrimRight(), StringStripWS()
; Positive Zahlen schneiden von links, negative von rechts ab. Zusätzlich ist das Flag für StringStripWS() verfügbar.
; Es kann also in einem Rutsch abgetrennt und evtl. Leerzeichen vorn und hinten mit abgeschnitten werden:
ConsoleWrite( $oS("[ Text in eckigen Klammern ]").Trim(1).Trim(-1, 3).Val & @CRLF & @CRLF )
; Will ich Methoden verketten ist es erforderlich, dass ich auf ein Objekt zugreife. Die Methoden müssen also das Objekt selbst zurückliefern.
; Wenn ich mit dem Initialwert mehrfach arbeiten möchten rufe ich die Methode mit $_INIT als letztem Parameter auf.
; Bsp.: Jeder Buchstabe des Strings wird einmal als Großbuchstabe ausgegeben
$oT = $oS('hallo autoit')
For $i = 1 To $oT.Len
ConsoleWrite( $oT.Get($i-1, $_INIT).Val & $oT.Mid($i, 1, $_INIT).Upper.Val & $oT.Mid($i+1, -1, $_INIT).Val & @LF )
Next
ConsoleWrite( @CRLF )
; so haben wir Zugriff auf den Initialstring - aber nur lesend
ConsoleWrite( 'Initialstring: ' & $oT._Init & @CRLF & @CRLF )
; noch ein paar Funktionsbeispiele
; .Get() umfasst StringLeft(), StringRight()
ConsoleWrite( '"Hallo Welt!" -- 5 Zeichen von links: ' & $oA.Get(5).Val & @CRLF )
ConsoleWrite( '"Hallo Welt!" -- 5 Zeichen von rechts: ' & $oA.Get(-5, $_INIT).Val & @CRLF & @CRLF )
Local $a[6] = [72,65,76,76,79,33]
ConsoleWrite( 'FromASCIIArray: ' & $oS().FromASCIIArray($a).Val & @LF & @LF )
_ArrayDisplay( ($oS('Hallo Welt!').ToASCIIArray.Val), 'StringToASCIIArray' )
ConsoleWrite( $oS('HALLO').Lower.Val & @CRLF & @CRLF )
ConsoleWrite( $oS('hallo').Upper.Val & @CRLF & @CRLF )
ConsoleWrite( $oS('hallo').RegExpReplace('l', 'm').Replace('o', 'er').Initial.Val & @CRLF & @CRLF ) ; ->> Hammer
ConsoleWrite( $oS('hallo hecht!').Replace('h', 'H', 2).Val & @CRLF & @CRLF )
ConsoleWrite( $oS('Lager').Reverse.Initial.Val & @CRLF & @CRLF ) ; umdrehen und neuen Anfangsbuchstaben groß, den Rest klein
$oC = $oS('AutoIt').Split
ConsoleWrite( $oC.Val[1] & @CRLF )
ConsoleWrite( $oC.Val[2] & @CRLF )
ConsoleWrite( $oC.Val[3] & @CRLF )
ConsoleWrite( $oC.Val[4] & @CRLF )
ConsoleWrite( $oC.Val[5] & @CRLF )
ConsoleWrite( $oC.Val[6] & @CRLF & @CRLF )
ConsoleWrite( $oS(1.15).Format('%.3f').Val & @CRLF )
; ----------------------------------------------------------------------------------------
; Das angenehme bei OOP-Notation ist die gute Lesbarkeit und Verkettbarkeit von Methoden.
; Hier mal im direkten Vergleich, der Dateiname (ohne Endung) soll abgefragt werden.
$string = "C:\Ordner_1.0\Ordner_1.1\Datei.abc 10.01.2015 18:50:09"
; >> AutoIt-Syntax (hier versuche ich gar nicht erst, einen Einzeiler zu produzieren)
$path = StringLeft($string, StringInStr($string,' ',0,-2))
$file_name_ext = StringTrimLeft($path,StringInStr($path,'\',0,-1))
$file_name = StringTrimRight($file_name_ext,StringLen($file_name_ext)-StringInStr($file_name_ext,'.',0,-1)+1)
ConsoleWrite("file_name (AutoIt-Syntax): " & $file_name & @LF & @LF)
; >> Objekt-Syntax
With $oS($string)
ConsoleWrite("file_name (Objekt-Syntax): " & .Get(.InStr(' ',0,-2)).Trim(.InStr('\',0,-1)).Get(.InStr('.')-1).Val & @LF)
EndWith
Alles anzeigen