AutoItObject - OOP für AutoIt

  • Was wurde denn jetzt an der UDF alles verändert?


    Das Changelog gibt es hier. Unter anderem wurde ein DLLStruct-Objekt eingeführt, dafür ein Danke an doudou aus dem engl. Forum.

  • Hallo,

    ich wollte fragen, wie ich folgendes machen kann:

    Also ich habe eine Klasse, mit der ich eine GUI mit vielen Kontrollelementen erstelle. Möchte ich z.B. ein Kontrollelement auslesen sieht das so aus:
    GUICtrlRead($MeineGUI.ButtonOben)
    Meine Frage jetzt: Wie kann ich es so machen, dass ich hinter jedem Property einfach ein CtrlRead anhängen kann?
    Beispiel: $MeineGUI.ButtonOben.CtrlRead()
    So wie bei Java mit .toString() oder .equals()

  • omg, wie geil. Thats going to make things a lot easier!
    Großartige Arbeit, fetten Dank!

    Lust auf Arrays? :D
    Das hier funktioniert prima:

    [autoit]


    #include "AutoItObject.au3"
    _AutoItObject_Startup()
    dim $objArray[2]

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

    for $i = 0 to 1
    $objArray[$i] = _AutoItObject_Create()
    _AutoItObject_AddProperty($objArray[$i], "prop_1")
    _AutoItObject_AddProperty($objArray[$i], "prop_2")
    next

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

    ; $objArray[0]
    $objArray[0].prop_1 = "foo"
    $objArray[0].prop_2 = "bar"
    ; $objArray[1]
    $objArray[1].prop_1 = "seems like I "
    $objArray[1].prop_2 = "<3 AutoItObject"

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

    MsgBox(1, $objArray[0].prop_1 & $objArray[0].prop_2, $objArray[1].prop_1 & $objArray[1].prop_2)

    [/autoit]


    http://img135.imageshack.us/i/aito.png/

  • hmm... also ich finds auch gut, dass du dir solche Mühe gegeben hast :thumbup:

    aber ich denke dass ich die UDF nicht verwenden werde, weil wenn ich OO programmieren will dann steige ich wohl auf eine OO Programmiersoftware um...

    ich hab mir mal c++ angeguckt.....uiuiuiuiuiui da muss man mal ne gui hinbekommen oO

    dann werd ich wenn dann also mit BlueJ programmieren;)

  • hmm... also ich finds auch gut, dass du dir solche Mühe gegeben hast :thumbup:


    Das war ich ja nicht allein ;)

    aber ich denke dass ich die UDF nicht verwenden werde, weil wenn ich OO programmieren will dann steige ich wohl auf eine OO Programmiersoftware um...


    Das ist sozusagen nur ein Abfallprodukt. Die Hauptmotivation war, mehr COM-Objekte in AutoIt ansprechbar zu machen. Das ist vor allem seit Windows Vista wichtig, da die Lautstärkeregelung, die Jumplists usw. nur über COM manipulierbar sind.

  • Hey.

    Kleine Frage.

    Ich wollte nun ein Objekt als eine Art 2D Array nutzen bsw. so.

    [autoit]


    $aArray[2][3] = [['Dieter','Musterstraße','11'],['Max','Musterstraße','12']]

    [/autoit]

    leider geht sowas ja nicht

    [autoit]


    $oObject.Dieter.Strasse
    $oObject.Dieter.Hausnummer

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

    $oObject.Max.Strasse
    $oObject.Max.Hausnummer

    [/autoit]

    Wie wäre sowas am besten umsetzbar ?

    natürlich würde es so funktionieren, wie ein paar Posts weiter oben, aber gibt es noch ne andere möglichkeit

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

  • Der logische Aufbau wäre ein Objekt für jede Person. Eventuell würde ich einfach Dictionary-Objekte statt eigenen verwenden, vor allem wenn die Zahl der Eigenschaften variiert und nicht feststeht.
    Also

    [autoit]


    $Dictionary = ObjCreate(Dictionary)
    $person1 = _AutoItObject_Create...
    Dictionary.add("Schlüssel", $person1)
    $person2 = _AutoItObject_Create...
    Dictionary.add("Schlüssel2", $person2)

    [/autoit]
  • vor allem wenn die Zahl der Eigenschaften variiert und nicht feststeht.


    Genau das ist aber nicht der fall, Die Zahl der Eigenschaften bleibt konstant.

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

  • Aber die Zahl der Personen ist nicht konstant, richtig? Deshalb für jede Person ein AutoItObject und diese Objekte in einem Dictionary oder Array verwalten.

  • Ok Also im Prinzip meinst du sowas richtig ?

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

  • Ich meinte was in der Art:

    [autoit]

    [#include<AutoITObject.au3>
    _AutoItObject_Startup()

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

    $oAdresses = ObjCreate("Scripting.Dictionary")

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

    _AddPerson($oAdresses, _CreatePerson("Hans", "Hauptstraße"))

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

    MsgBox(0, $oAdresses.item("Hans").name, $oAdresses.item("Hans").strasse)
    $oAdresses = 0
    _AutoItObject_Shutdown()

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

    Func _AddPerson(ByRef $oAdresses, $oPerson)
    $oAdresses.add($oPerson.name, $oPerson)
    EndFunc

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

    Func _CreatePerson($sName, $sStrasse)
    Local $oClass = _AutoItObject_Class()
    $oClass.AddProperty("name", $ELSCOPE_PUBLIC, $sName)
    $oClass.AddProperty("strasse", $ELSCOPE_PUBLIC, $sStrasse)
    Return $oClass.object
    EndFunc

    [/autoit]
  • Ok gut, das hab ich jetzt soweit verstanden.

    Kann ich die Funktion _AutoItObject_AddEnum() nun auch auf das "Scripting.Dictionary" Object anwenden, sodass ich herausbekomen kann, wie viele Personen- Objecte sich darin befinden ?

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

  • Das brauchst du da nicht. Es gibt erstens schon einen Enum, zum anderen ist eine andere Methode/Eigenschaft dafür praktischer:

    [autoit]

    For $sKey in $oAdresses
    MsgBox(0, 'Key Name', $sKey)
    Next

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

    $aKeys = $oAdresses.Keys
    For $i = 0 To Ubound($aKeys)-1
    MsgBox(0, 'Key Name', $aKeys[$i])
    Next
    MsgBox(0, 'Anzahl', $oAdresses.Count)

    [/autoit]

    Weiteres hier: http://msdn.microsoft.com/en-us/library/…28VS.85%29.aspx

    Edit: Übrigens gibt es noch eine einfachere Zugriffsmöglichkeit:

    [autoit]

    $oAdresses("Peter") = "test"
    MsgBox(0, 'Anderer Zugriff', $oAdresses("Peter"))
    MsgBox(0, 'Anderer Zugriff: Nichtexistent', $oAdresses("Nichtexistierender Key"))

    [/autoit]
  • So ich nochmal xD

    Ich speicher mir und local in einer Funktion die Property namen, um dass ganze in einer For schleife durchlaufen zu lassen.
    Über eine Methode gebe ich mir dies namen wieder in einem Array zurück, und nun wollte ich so den Propertys neue Werte zuweisen.

    Sowas geht natürlich nicht:

    [autoit]

    For $i = 0 To UBound($aArray)-1
    $oClass.$a__InfoNames[$i] = $aArray[$i]
    Next

    [/autoit]

    Sowas geht ja leider auch nicht:

    [autoit]

    For $sKey in $oObject('Dieter')
    MsgBox(0, 'Key Name', $sKey)
    Next

    [/autoit]

    Da es relativ viele Propertys sind, wollte ich diese schon gerne in ner Schleife Werte zuweisen, gibt es da eine Möglichkeit?

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

    Einmal editiert, zuletzt von Darter (3. März 2011 um 13:00)

  • Nein, das geht nicht, da Execute keine Wertzuweisungen durchführt. Du kannst dir aber setter-Methoden schreiben, diese kannst du problemlos per Execute aufrufen.

    [autoit]

    AddMethod("setName", "_Object_SetName")

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

    Func _Object_SetName(ByRef $oObject, $sName)
    $oObject.name = $sName
    EndFUnc
    ...
    Execute("$oObj.set" & $sKey & "($sValue)")

    [/autoit]

    Alternative:

    Spoiler anzeigen
    [autoit]

    #include<AutoITObject.au3>
    _AutoItObject_Startup()

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

    $oAdresses = ObjCreate("Scripting.Dictionary")

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

    _AddPerson($oAdresses, _CreatePerson("Hans", "Hauptstraße"))

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

    ; Impliziter Aufruf von __default__:
    $o = $oAdresses("Hans")
    $o("Name") = 12
    ; Direkter Aufruf:
    MsgBox(0, '', $oAdresses("Hans").__default__("Name"))

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

    ; Noch eine Möglichkeit zu setzen:
    $o("Name", 48)
    MsgBox(0, '', $oAdresses("Hans").__default__("Name"))

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

    $oAdresses = 0
    _AutoItObject_Shutdown()

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

    Func _AddPerson(ByRef $oAdresses, $oPerson)
    $oAdresses.add($oPerson.name, $oPerson)
    EndFunc

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

    Func _CreatePerson($sName, $sStrasse)
    Local $oClass = _AutoItObject_Class()
    $oClass.AddProperty("name", $ELSCOPE_PUBLIC, $sName)
    $oClass.AddProperty("strasse", $ELSCOPE_PUBLIC, $sStrasse)
    $oClass.AddMethod("__default__", "__Person_SetGetProperty")
    Return $oClass.object
    EndFunc

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

    Func __Person_SetGetProperty(ByRef $oObject, $sProperty, $vValue=0)
    If $oObject.__propcall__ And @NumParams <> 2 Then
    If @NumParams = 2 Then Return SetError(1,0,0)
    ElseIf @NumParams = 2 Then
    Local $vResult = Execute("$oObject." & $sProperty)
    If @error Then Return SetError(2, 0, 0)
    Return $vResult
    EndIf
    Switch $sProperty
    Case "name"
    $oObject.name = $vValue
    Case "strasse"
    $oObject.strasse = $vValue
    Case Else
    Return SetError(3,0,0)
    EndSwitch
    EndFunc

    [/autoit]

    3 Mal editiert, zuletzt von progandy (3. März 2011 um 13:02)

  • Ok.

    Aber, hat "__default__" eine spezielle wirkung auf ein Objekt, sonst kann dieser aufruf doch nicht stimmen oder ?

    [autoit]

    $oObjekt("Name", "Wert")

    [/autoit]

    Oder versteh ich nur das Bsp. nicht ?(

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

  • Habs gerade noch mal bearbeitet. Ja __default__ hat eine spezielle Wirkung. Die ist sogar dokumentiert, __propcall__ dagegen ist es nicht, das haben wir vergessen. __propcall__ ist dazu da, um den Methodenaufruf $o.Methode(1, 2) von $o.Methode(1) = 2 zu unterscheiden.

  • wow,
    und ich bin nur zufällig drauf gestoßen, als ich das Forum aus langeweile durchstöbert hab^^. Echt geil! Werd jetzt mein Projekt auf OO ummünzen.
    Eine Frage hab ich noch: Kann man die Hilfedatei in Scite integrieren? Und wenn, wie geht das:D

  • Eine Frage hab ich noch: Kann man die Hilfedatei in Scite integrieren? Und wenn, wie geht das:D


    Direkt in die AutoIt-Hilfe kann man es nicht integrieren. Wie es anders geht weiß ich nicht.