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.
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 wissen, wofür ich die Funktion
_AutoItObject_Variant*
_AutoItObject_Wrapper*
_AutoItObject_IUnknownAddRef
_AutoItObject_CLSIDFromString
_AutoItObject_CoCreateInstance
_AutoItObject_PtrToIDispatch
_AutoItObject_IDispatchToPtr
brauche. Wofür braucht man einen Wrapper?
Danke im Voraus!
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?
Das hier funktioniert prima:
#include "AutoItObject.au3"
_AutoItObject_Startup()
dim $objArray[2]
for $i = 0 to 1
$objArray[$i] = _AutoItObject_Create()
_AutoItObject_AddProperty($objArray[$i], "prop_1")
_AutoItObject_AddProperty($objArray[$i], "prop_2")
next
; $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"
MsgBox(1, $objArray[0].prop_1 & $objArray[0].prop_2, $objArray[1].prop_1 & $objArray[1].prop_2)
[/autoit]hmm... also ich finds auch gut, dass du dir solche Mühe gegeben hast
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
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']]
leider geht sowas ja nicht
[autoit]
$oObject.Dieter.Strasse
$oObject.Dieter.Hausnummer
$oObject.Max.Strasse
$oObject.Max.Hausnummer
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
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
$Dictionary = ObjCreate(Dictionary)
$person1 = _AutoItObject_Create...
Dictionary.add("Schlüssel", $person1)
$person2 = _AutoItObject_Create...
Dictionary.add("Schlüssel2", $person2)
vor allem wenn die Zahl der Eigenschaften variiert und nicht feststeht.
Genau das ist aber nicht der fall, Die Zahl der Eigenschaften bleibt konstant.
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 ?
Alles anzeigenomg, wie geil. Thats going to make things a lot easier!
Großartige Arbeit, fetten Dank!Lust auf Arrays?
[autoit]
Das hier funktioniert prima:[/autoit] [autoit][/autoit] [autoit]
#include "AutoItObject.au3"
_AutoItObject_Startup()
dim $objArray[2]for $i = 0 to 1
[/autoit] [autoit][/autoit] [autoit]
$objArray[$i] = _AutoItObject_Create()
_AutoItObject_AddProperty($objArray[$i], "prop_1")
_AutoItObject_AddProperty($objArray[$i], "prop_2")
next; $objArray[0]
[/autoit] [autoit][/autoit] [autoit]
$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"MsgBox(1, $objArray[0].prop_1 & $objArray[0].prop_2, $objArray[1].prop_1 & $objArray[1].prop_2)
[/autoit]
Ich meinte was in der Art:
[autoit][#include<AutoITObject.au3>
_AutoItObject_Startup()
$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()
Func _AddPerson(ByRef $oAdresses, $oPerson)
$oAdresses.add($oPerson.name, $oPerson)
EndFunc
Func _CreatePerson($sName, $sStrasse)
Local $oClass = _AutoItObject_Class()
$oClass.AddProperty("name", $ELSCOPE_PUBLIC, $sName)
$oClass.AddProperty("strasse", $ELSCOPE_PUBLIC, $sStrasse)
Return $oClass.object
EndFunc
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 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
$aKeys = $oAdresses.Keys
For $i = 0 To Ubound($aKeys)-1
MsgBox(0, 'Key Name', $aKeys[$i])
Next
MsgBox(0, 'Anzahl', $oAdresses.Count)
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"))
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
Sowas geht ja leider auch nicht:
[autoit]For $sKey in $oObject('Dieter')
MsgBox(0, 'Key Name', $sKey)
Next
Da es relativ viele Propertys sind, wollte ich diese schon gerne in ner Schleife Werte zuweisen, gibt es da eine Möglichkeit?
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)")
Alternative:
#include<AutoITObject.au3>
_AutoItObject_Startup()
$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"))
; Noch eine Möglichkeit zu setzen:
$o("Name", 48)
MsgBox(0, '', $oAdresses("Hans").__default__("Name"))
$oAdresses = 0
_AutoItObject_Shutdown()
Func _AddPerson(ByRef $oAdresses, $oPerson)
$oAdresses.add($oPerson.name, $oPerson)
EndFunc
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
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
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
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.