AutoItObject - OOP für AutoIt

  • ok,
    gleich eine Frage hinterher:D Wie baut man sich den einen Konstruktor, bei dem ich die Properties gleich initialisieren kann oder zumindest Standardwerte setzen kann?

    EDIT: hab selbst eine Lösung gefunden

    [autoit]


    Func _Object()
    Local $oClass = _AutoItObject_Class()
    With $oClass
    .AddProperty("wert")
    EndWith
    local $obj = $oClass.Object
    $obj.wert="42"
    return $obj
    ;:D
    EndFunc

    [/autoit]

    Das mit With $obj ... EndWith ist übrigens sau cool (Wie in VB:D)

    2 Mal editiert, zuletzt von Teek (24. April 2011 um 20:09)

  • Bei AddProperty kannst du auch einen Startwert angeben. Das müsste so funktionieren, wenn ich mich richtig erinnere.
    .AddProperty("name", $ELSCOPE_..., "wert")

    Übrigens bin ich mit _Class noch nicht wirklich zufrieden. Das sollte eher wie eine echte "Klasse" funktionieren und bei jedem Aufruf von .Object ein neues Objekt mit den zuvor hinzugefügten Methoden und Attributen erzeugen. Da haben wir nur noch keine gute Lösung gefunden.

  • Ich hab mir mal fürs eigene Verständnis was zusammen gecoded. Vielleicht kanns ja irgendwer auch mal brauchen.

    Spoiler anzeigen
    [autoit]

    #include <AutoItObject.au3>

    [/autoit] [autoit][/autoit] [autoit]

    _AutoItObject_Startup()

    [/autoit] [autoit][/autoit] [autoit]

    ; In Anführungsstriche :D
    ; |
    ; V
    #region "Class" Rechteck{

    [/autoit] [autoit][/autoit] [autoit]

    ;Initialisierungs- und Standardkonstruktor
    Func _New_Rechteck($pLaenge=0.0, $pBreite=0.0)
    Local $newClass = _AutoItObject_Class()
    With $newClass
    .AddProperty("laenge", $ELSCOPE_PRIVATE)
    .AddProperty("breite", $ELSCOPE_PRIVATE)
    .AddMethod("getLaenge", "_Rechteck_getLaenge")
    .AddMethod("setLaenge", "_Rechteck_setLaenge")
    .AddMethod("getBreite", "_Rechteck_getBreite")
    .AddMethod("setBreite", "_Rechteck_setBreite")
    .AddMethod("getFlaeche", "_Rechteck_getFlaeche")
    .AddMethod("getUmfang", "_Rechteck_getUmfang")
    .AddMethod("toString", "_Rechteck_toString")
    .AddMethod("Clone", "_Rechteck_Clone")
    EndWith
    $This = $newClass.Object
    $This.setLaenge($pLaenge)
    $This.setBreite($pBreite)
    return $This
    EndFunc

    ;Kopierkonstruktor
    Func _New_Rechteck_From_Object($pRechteck)
    return _New_Rechteck($pRechteck.getLaenge(), $pRechteck.getBreite())
    EndFunc

    Func _Rechteck_Clone($This)
    return _New_Rechteck($This.getLaenge(), $This.getBreite())
    EndFunc

    ;Getter und Setter
    Func _Rechteck_getLaenge($This)
    return $This.laenge
    EndFunc
    Func _Rechteck_setLaenge($This, $pLaenge)
    If IsNumber($pLaenge) Then
    $This.laenge=$pLaenge
    Else
    $This.laenge=0
    EndIf
    EndFunc

    Func _Rechteck_getBreite($This)
    return $This.breite
    EndFunc
    Func _Rechteck_setBreite($This, $pBreite)
    If IsNumber($pBreite) Then
    $This.breite=$pBreite
    Else
    $This.breite=0
    EndIf
    EndFunc

    ;Methoden
    Func _Rechteck_getFlaeche($This)
    return $This.getLaenge()*$This.getBreite()
    EndFunc

    Func _Rechteck_getUmfang($This)
    return ($This.getLaenge()*2)+($This.getBreite()*2)
    EndFunc

    Func _Rechteck_toString($This)
    return "Rechteck(Laenge: "&$This.getLaenge&", Breite: "&$This.getBreite()&", Flaeche: "&$This.getFlaeche()&", Umfang: "&$This.getUmfang()&")"
    EndFunc

    #endregion}

    [/autoit] [autoit][/autoit] [autoit]

    $myRect = _New_Rechteck()
    $myRect.setLaenge(6)
    $myRect.setBreite(7)
    $myRect2 = _New_Rechteck(2, 2)
    $myRect3 = $myRect.Clone()
    $myRect4 = _New_Rechteck_From_Object($myRect)

    [/autoit] [autoit][/autoit] [autoit]

    ConsoleWrite($myRect.toString()&@CRLF&$myRect2.toString()&@CRLF&$myRect3.toString()&@CRLF&$myRect4.toString()&@CRLF)

    [/autoit]

    3 Mal editiert, zuletzt von Teek (16. Dezember 2011 um 16:44)

  • Hab mal was kleines gebastelt, war eig nur als Übung gedacht aber vllt interessiert es jmd. War auch gleichzeitig eine kleine Sin/Cos Übung und aus Zeitgründen auch mein Ergebnis in Ludum Dare (Leider nichts tolles, zu wenig Zeit :()

  • Ich bin im Besitz einer UDF in der AutoitObject eingebetet ist. Nun mochte ich gern die UDF davon befreien, hab aber keine Ahnung wie ich das nun bewirkstelligen könnte, damit diese trotzdem lauffähig bleibt. Könte mir jemand bitte dazu einen Rat geben :)

    • Offizieller Beitrag

    Ich bin im Besitz einer UDF in der AutoitObject eingebetet ist. Nun mochte ich gern die UDF davon befreien, hab aber keine Ahnung wie ich das nun bewirkstelligen könnte, damit diese trotzdem lauffähig bleibt. Könte mir jemand bitte dazu einen Rat geben :)


    Falls AutoItObject in der UDF genutzt wird, ist das Vorhaben sinnlos.
    Falls nicht, woher sollen wir wissen wie deine UDF aussieht - Glaskugel ist grad zur Reparatur... :whistling:

  • bow, kann hier kein Quelltext posten ?(

    Zitat

    Falls AutoItObject in der UDF genutzt wird, ist das Vorhaben sinnlos.


    Ich glaub du bist im Begriff zu scherzen :rofl:

    Einmal editiert, zuletzt von John (27. Dezember 2011 um 21:11)

  • Naja, du könntest auf mehr oder weniger einfache Art und Weise aus den einzelnen Objekten wieder "normale" Funktionen machen, je nach Länge der UDF dauert das natürlich seine Zeit.
    Überleg dir einfach wie du die einzelnen Befehle normalerweise schreiben würdest.

    MfG, James

  • Okey, ich hab da mal noch ein zwei Fragen zu der UDF welche ich mir nicht selber beantworten konnte. Ich hoffe jemand kann mir helfen.

    Welchen Sinn haben die Variant Funktionen in der UDF? Ich meine sie verwalten lediglich Variablen vom Typ Variant, aber AutoIt kann das standardmäßig sowieso schon, und die Attribute in Objekten sind ebenfalls direkt schon variant. Von daher sehe ich den Sinn so nicht.

    Das Zweite ist, wofür ist das __default__ Attribut/Methode (?). __propcall__ (undokumentiert) hab ich schon verstanden.

    Gesendet von meinem HTC Desire HD A9191 mit Tapatalk 2

  • Welchen Sinn haben die Variant Funktionen in der UDF?

    AutoItObject ist in C++ umgesetzt. Dort gibt es nur feste Datentypen. Damit also in C++ AutoIt-Variants verarbeitet werden können müssen diese noch in einer für C++ geeigneten Struktur verpackt werden.
    In AutoItObject ist dies die Struktur __Au3Obj_tagVARIANT.
    Die Variantfunktionen dienen also primär der Handhabung und des Datenaustausches der AutoIt-Variants mit den "Variants" für die C++-Komponenten.
    Im Normalfall solltest du diese nicht benötigen da sie eher intern verwendet werden.

    Das Zweite ist, wofür ist das __default__ Attribut/Methode (?).

    Wenn du eine Methode einem Object hinzufügst, kannst du diese dann über deren Namen aufrufen:

    [autoit]

    $oObject.name()

    [/autoit]


    Wenn du hingen als Name "__default__" setzt, kannst du diese Funktion direkt durch Angabe des Objektes ohne Methodenname aufrufen:

    [autoit]

    $oObject()

    [/autoit]