AutoItObject - OOP für AutoIt

  • Danke, dann ist alles klar. Werde dann gleich mal das erste Script in Angriff nehmen :).

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Kann man damit nun auch die D3D EndScene hooken?
    Ist ja ein Beispiel dabei, dass sowas ähnliches macht, nur diese Graphic soll halt in Programme eingeschleust werden, die DirectX verwenden.
    Geht das mit diesem AutoItObject?


    Hooken geht mit AutoIt nicht. Dafür benötigt man eine DLL in dem Programm das man hooken will. Diese nimmt dann von deinem Skript Befehle an, die sie bei EndScene ausführt. Das ist aber schön kompliziert, da mach ich dir kein Beispiel.

    Es ist ein großer Unterschied, ob die Graphik intern dargestellt werden soll oder in ein andres Programm eingeschleust wird.

  • So hab nun etwas rumporbiert, OOP ist mir schon aus anderen Sprachen bekannt, allerdings habe ich noch etwas was mir nicht ganz verständlich ist.

    Es gibt die funktion _AutoItObject_AddDestructor aber keine Funktion _AutoItObject_Destruct. So wie ich das nun verstanden habe löst sich das Objekt erst am Ende des Scriptes auf und man hat keine Möglichkeit es vorher aufzulösen, ist das richtig?

    Ist der Einbau von Klassen und Klassenvererbungen noch geplant?

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

    3 Mal editiert, zuletzt von chip (20. Februar 2010 um 20:40)

  • Einfach genial ;) Ich werde mich in nächster Zeit mal reinarbeiten und schauen was ich damit anfangen kann, aber soetwas umzusetzen ist lobenswert.
    :klatschen: ;)

  • Vor allem bringt das Struktur in deine Programme ;) Funktionen (Methoden) und Variablen (Properties) werden in einem Objekt zusammengefasst und diesem eindeutig zugeordnet.
    Du kannst damit z.B. bei einem Spiel die Spieler als Objekte erstellen.
    Willst du nun auf den Namen zugreifen, schreibst du einfach
    $oSpieler.name
    statt wie bei der Verwendung eines Arrays
    _Benutzer_GetName($aSpieler) oder $aSpieler[$SPIELER_NAME_INDEX]

    Ist jetzt ein schlechtes Beispiel, aber mit dem erklären hab ichs nicht so ^^

  • Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Danke, das hilft mir schonmal weiter. Progandys Beispiel erinnert mich an selbsterstellte Typen in BlitzBasic. Damit hätte ich schonmal einen Punkt, der mir vertraut vorkommt. Ich werde mal versuchen ein bisschen mit Objekten "rumzuspielen". Danke euch beiden für die Erklärung!

  • das is ziemlich geil... und ne richtig gute idee, oop für autoit
    is dir wirklich gut gelungen, danke dir

    offtopic: wo is denn die autoit-datenbank hier im forum? nen bbcode gibts ja auch:
    [db]1[/db]


  • Dann lade dir AutoIt v3.3.4.0 ;)

    Danke :)

    Und noch eine Frage: Wie kann man ein Array als Property zuweisen und verwenden?

    Einmal editiert, zuletzt von dsbghost (28. Februar 2010 um 16:10)

  • die udf ist klasse und ihr auch ;) thx!

    ich habe hier ein kleine funktion gemacht die das erstellen von objecte erleichtern soll

    Spoiler anzeigen
    [autoit]

    #include <AutoItObject.au3>
    #include <Array.au3>
    _AutoItObject_Startup()

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

    $oStringBetween = _ObjCreate('__StringBetween', 'StringBetween', 'String|Start|End')

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

    $oStringBetween.String = '<test>'
    $oStringBetween.Start = '<'
    $oStringBetween.End = '>'

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

    $String = $oStringBetween.StringBetween
    _ArrayDisplay($String)

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

    Func _ObjCreate($FuncName, $Name, $Propertys)
    If $Propertys = '' Or $FuncName = '' Or $Name = '' Then Return SetError(1, @extended, -1)
    Local $Obj = _AutoItObject_Create()
    Switch StringInStr($Propertys, '|')
    Case True
    $sPropertys = StringSplit($Propertys, '|', 2)
    Switch IsArray($sPropertys)
    Case True
    For $i = 0 To UBound($sPropertys) -1
    _AutoItObject_AddProperty($Obj, $sPropertys[$i])
    Next
    _AutoItObject_AddMethod($Obj, $Name, $FuncName)
    Return $Obj
    Case Else
    Return SetError(2, @extended, 0)
    EndSwitch
    Case Else
    _AutoItObject_AddProperty($Obj, $Propertys)
    _AutoItObject_AddMethod($Obj, $Name, $FuncName)
    Return $Obj
    EndSwitch
    Return SetError(3, @extended, 1)
    EndFunc

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

    Func __StringBetween($oSelf)
    $reg = StringRegExp($oSelf.String, '(?s)' & $oSelf.Start & '(.+?)' & $oSelf.End, 3)
    If @error Then Return SetError(1, @extended, 0)
    Return $reg
    EndFunc

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

    ist auf die schnelle gemacht
    geht sicher noch kürzer und besser

    ich freu mich wenns jmd gebrauchen kann^^

  • Hallo,

    wirklich schöne UDF. Gute Arbeit :)

    Hab eine Frage. Kann ich die mit Deiner erstellten Objekte auch mit GUICtrlCreateObject benutzen? Wäre echt super!


    Nein, du kannst keine GUI-Objekte erstellen, das wird auch nicht eingebaut werden.


    Und noch eine Frage: Wie kann man ein Array als Property zuweisen und verwenden?


    Ganz einfach:

    [autoit]

    Dim $array[4]
    $object.property = $array
    ;Zugriff z.B.:
    $array = $object.property
    $v = $array[3]
    ; oder (bei 1D und 2D)
    $v = $object.property(3)

    [/autoit]
  • Ein erstelltes Objekt ist eine Instanz. Um weitere Objecte (Instanzen) zu erzeugen kannst du entweder das Objekt komplett neu erstellen oder du übergibst das erste Object an _AutoItObject_Create, dann hat das neue alle Funktionen und Methoden des ersten inklusive den Werten:

    [autoit]

    $o1 = _AutoItObject_Create()
    _AutoItObject_Add...($o1, ....)
    ...
    $o2 = _AutoItObject_Create($o1)

    [/autoit]