Stimmt, hast recht!
Wird sofort gefixt ![]()
Beiträge von Yjuq
-
-
Hab's gefunden: GDI+ Textrendering (BB-Code)
Ja, die "Vorschau" via HTML und CSS hatte ich mir auch so in etwa gedacht. Ist am einfachsten da man die Darstellung dann nicht selber umsetzen müsste.
Ob du allerdings an die alten Dateien heran kommst bezweifel ich mal. Die werden wahrscheinlich dann nur die Admin's haben, und lassen sich nicht so oft hier blicken...
-
Da hast du glück, hab gerade erst vor 4 Tagen eine komplette Liste aller BB-Codes erstellt, die hier im Forum genutzt werden können erstellt. Ja, Mars hat schonml sowas geschrieben, wo genau das Skript ist weiß ich gerade nicht.

Hatte jedoch vor als nächste Projekt selber so einen Editor zu schreiben da ich das Formatieren hier im direkt im Forum ebenfalls so lästig finde. Wenn du willst können wir uns mal gemeinsam ransetzen, hab auch schon Ansãtze etc. erarbeitet.
Liste BB-Codes
Code
Alles anzeigen[b]Fett[/b] [i]Kursiv[/i] [u]Unterstrichen[/u] [s]Durchgestrichen[/s] [sub]Tiefgestellt[/sub] [sup]Hochgestellt[/sup] [align=left]Linksbündig[/align] [align=center]Zentriert[/align] [align=right]Rechtsbündig[/align] [align=justify]Blocksatz[/align] [font='arial,helvetica,sans-serif']Arial[/font] [font='comic sans ms,cursive']Comic Sans MS[/font] [font='courier new,courier,monospace']Courier New[/font] [font='georgia,serif']Georgia[/font] [font='lucida sans unicode,lucida grande,sans-serif']Lucida Sans Unicode[/font] [font='tahoma,geneva,sans-serif']Tahoma[/font] [font='times new roman,times,serif']Times New Roman[/font] [font='trebuchet ms,helvetica,sans-serif']Trebuchet MS[/font] [font='verdana,geneva,sans-serif']Verdana[/font] [size=8]Größe 8[/size] [size=10]Größe 10[/size] [size=12]Größe 12[/size] [size=14]Größe 14[/size] [size=18]Größe 18[/size] [size=24]Größe 24[/size] [size=36]Größe 36[/size] [color=#000000]Schwarz[/color] [color=#800000]Kastanienbraun[/color] [color=#8B4513]Braun[/color] [color=#2F4F4F]Dunkles Schiefergrau[/color] [color=#008080]Blaugrün[/color] [color=#000080]Navy[/color] [color=#4B0082]Indigo[/color] [color=#696969]Dunkelgrau[/color] [color=#B22222]Ziegelrot[/color] [color=#A52A2A]Braun[/color] [color=#DAA520]Goldgelb[/color] [color=#006400]Dunkelgrün[/color] [color=#40E0D0]Türkis[/color] [color=#0000CD]Medium Blau[/color] [color=#800080]Lila[/color] [color=#808080]Grau[/color] [color=#FF0000]Rot[/color] [color=#FF8C00]Dunkelorange[/color] [color=#FFD700]Gold[/color] [color=#008000]Grün[/color] [color=#00FFFF]Cyan[/color] [color=#0000FF]Blau[/color] [color=#EE82EE]Hellviolett[/color] [color=#A9A9A9]Dunkelgrau[/color] [color=#FFA07A]Helles Lachsrosa[/color] [color=#FFA500]Orange[/color] [color=#FFFF00]Gelb[/color] [color=#00FF00]Lime[/color] [color=#AFEEEE]Blaß-Türkis[/color] [color=#ADD8E6]Hellblau[/color] [color=#DDA0DD]Pflaumenblau[/color] [color=#D3D3D3]Hellgrau[/color] [color=#FFF0F5]Lavendel[/color] [color=#FAEBD7]Antik Weiß[/color] [color=#FFFFE0]Hellgelb[/color] [color=#F0FFF0]Honigtau[/color] [color=#F0FFFF]Azurblau[/color] [color=#F0F8FF]Alice Blau[/color] [color=#E6E6FA]Lavendel[/color] [color=#FFFFFF]Weiß[/color] [url]URL-Link[/url] [email=email@email.email]E-Mail[/email] [img]Bild-Link[/img] [quote=Name]Zitat[/quote] [code]Quellcode[/ code] [spoiler=Beschreibung]Spoiler[/spoiler] [tt]Inline-Code[/tt] [autoit]AutoIt-Quellcode[/autoit] Nummerierte Liste: [list=1] [*]Element 1 [*]Element 2 [*]Element 3 [/list] Liste: [list] [*]Element 1 [*]Element 2 [*]Element 3 [/list] Tabelle: [table][tr][td]Element 1[/td][td]Element 2[/td][/tr][tr][td]Element 3[/td][td]Element 4[/td][/tr][/table][/spoiler]
Gesendet von meinem HTC Desire HD A9191 mit Tapatalk 2
-
Teil #1
(Alle Beispiele sind für die AutoIt Version 3.3.12.0 geschrieben und laufen eventuell auf älteren Versionen nicht!)
+ ++ +++ ++++ +++++ ++++++ +++++++ ++++++++ +++++++++ ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
Teil #2
Teil #3
+ ++ +++ ++++ +++++ ++++++ +++++++ ++++++++ +++++++++ ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +Was ist OOP?
Normalerweise kennen wir als AutoIt Programmierer ausschließlich die prozedurale Programmierung mit normalen Variablen und Funktionen. Ein typisches AutoIt Skript ist eigentlich immer Prozedural aufgebaut. Jedoch existiert auch ein objektorientiertes Konzept welche in vielen anderen Programmiersprachen bereits nativ nutzbar ist. Das Konzept verfolgt eigentlich eine einfache Idee. Stellen wir uns einmal vor, dass wir einen Menschen programmieren wollten. Wir müssen diesen Menschen durch sein Aussehen und seinem Charakter (oder Verhalten) definieren. Dabei behalten wir im Hinterkopf, dass jeder Mensch individuell ist und deshalb nicht alle Eigenschaften oder Eigenarten auf jeden Menschen zutreffen. Diese sind also auf den individuellen Menschen bezogen. Bei der OOP ist dies genauso, wir haben ein Objekt welches wir durch Attribute (Eigenschaften) und Methoden (Verhalten) definieren können. Alle Attribute und Methoden beziehen sich dann auf dieses eine Objekt. Diese Grundidee verfolgt OOP. Wie wir dieses Konzept für die AutoIt Programmierung einsetzen können, möchte ich im folgendem erklären. Wer noch vorab weitere Informationen benötigt kann sich in der Wikipedia schlau machen: http://de.wikipedia.org/wiki/Objektori…_ProgrammierungOOP und AutoIt:
AutoIt unterstützt nativ kein OOP, daher wurde 2010 die AutoItObject UDF ins Leben gerufen. Mithilfe dieser UDF wurde OOP in AutoIt nutzbar. Damit sind neue Möglichkeiten für uns AutoIt Programmierer eingeräumt. Es wird (und kann) ausschließlich nur mit dieser UDF im gesamten Tutorial gearbeitet, daher ist es empfehlenswert die AutoItObject UDF hier zu downloaden: http://www.autoitscript.com/forum/topic/11…toitobject-udf/AutoItObject UDF
Die UDF liefert eine Hilfedatei sowie Beispiele und zwei DLLs mit. Im Grunde reicht nur die AutoItObject.au3 Datei aus um OO zu programmieren. Vorab muss stetig die UDF initialisiert werden, dass kann mit der Funktion _AutoItObject_Startup() erreicht werden. Zwar ist es nicht nötig die UDF wieder zu schließen, jedoch gehört dies zum guten Programmierstil und deswegen sollte die Funktion _AutoItObject_Shutdown() vor dem Programmende aufgerufen werden.Für alle die für die UDF Syntax Highlights und Calltips für die UDF wünschen, ich habe ein kleines Präsent für euch:
calltips
_AutoItObject_AddDestructor ( ByRef $oObject, $sAutoItFunc ) Adds a destructor to an AutoIt-object
_AutoItObject_AddEnum ( ByRef $oObject, $sNextFunc, $sResetFunc [, $sSkipFunc = ""] ) Adds an Enum to an AutoIt-object
_AutoItObject_AddMethod ( ByRef $oObject, $sName, $sAutoItFunc [, $fPrivate = False] ) Adds a method to an AutoIt-object
_AutoItObject_AddProperty ( ByRef $oObject, $sName [, $iFlags = $ELSCOPE_PUBLIC [, $vData = ""]] ) Adds a property to an AutoIt-object
_AutoItObject_Class ( ) AutoItObject COM wrapper function
_AutoItObject_CLSIDFromString ( $sString ) Converts a string to a CLSID-Struct (GUID-Struct)
_AutoItObject_CoCreateInstance ( $rclsid, $pUnkOuter, $dwClsContext, $riid, ByRef $ppv ) Creates a single uninitialized object of the class associated with a specified CLSID
_AutoItObject_Create ( [$oParent = 0] ) Creates an AutoIt-object
_AutoItObject_DllOpen ( $sDll [, $sTag = "" [, $iFlag = 0]] ) Creates an object associated with specified dll
_AutoItObject_DllStructCreate ( $sTag [, $vParam = 0] ) Object wrapper for DllStructCreate and related functions
_AutoItObject_IDispatchToPtr ( ByRef $oIDispatch ) Returns pointer to AutoIt's object type
_AutoItObject_IUnknownAddRef ( $vUnknown ) Increments the refrence count of an IUnknown-Object
_AutoItObject_IUnknownRelease ( $vUnknown ) Decrements the refrence count of an IUnknown-Object
_AutoItObject_ObjCreate( $sID [, $sRefId = Default [, $tagInterface = Default]] ) Creates a reference to a COM object
_AutoItObject_ObjCreateEx ( $sModule, $sCLSID [, $sRefId = Default [, $tagInterface = Default [, $fWrapp = False]]] ) Creates a reference to a COM object
_AutoItObject_ObjectFromDtag ( $sFunctionPrefix, $dtagInterface [, $fNoUnknown = False] ) Creates custom object defined with "dtag" interface description string
_AutoItObject_PtrToIDispatch ( $pIDispatch ) Converts IDispatch pointer to AutoIt's object type
_AutoItObject_RegisterObject ( $vObject, $sID ) Registers the object to ROT
_AutoItObject_RemoveMember ( ByRef $oObject, $sMember ) Removes a property or a function from an AutoIt-object
_AutoItObject_Shutdown ( [$fFinal = False] ) frees the AutoItObject DLL
_AutoItObject_Startup ( [$fLoadDLL = False [, $sDll = "AutoitObject.dll"]] ) Initializes AutoItObject
_AutoItObject_UnregisterObject ( $iHandle ) Unregisters the object from ROT
_AutoItObject_VariantClear( $pvarg ) Clears the value of a variant
_AutoItObject_VariantCopy ( $pvargDest, $pvargSrc ) Copies a VARIANT to another
_AutoItObject_VariantFree ( $pvarg ) Frees a variant created by _AutoItObject_VariantSet
_AutoItObject_VariantInit ( $pvarg ) Initializes a variant
_AutoItObject_VariantRead ( $pVariant ) Reads the value of a VARIANT
_AutoItObject_VariantSet ( $pVar, $vVal [, $iSpecialType = 0] ) sets the value of a varaint or creates a new one.
_AutoItObject_WrapperAddMethod ( ByRef $oWrapper, $sReturnType, $sName, $sParamTypes, $ivtableIndex ) Adds additional methods to the Wrapper-Object, e.g if you want alternative parameter types
_AutoItObject_WrapperCreate ( $pUnknown, $tagInterface [, $fNoUnknown = False [, $fCallFree = False]] ) Creates an IDispatch-Object for COM-Interfaces normally not supporting itsyntax highlight
; AutoItObject UDF \
_autoitobject_adddestructor \
_autoitobject_addenum \
_autoitobject_addmethod \
_autoitobject_addproperty \
_autoitobject_class \
_autoitobject_clsidfromstring \
_autoitobject_cocreateinstance \
_autoitobject_create \
_autoitobject_dllopen \
_autoitobject_dllstructcreate \
_autoitobject_idispatchtoptr \
_autoitobject_iunknownaddref \
_autoitobject_iunknownrelease \
_autoitobject_objcreate \
_autoitobject_objcreateex \
_autoitobject_objectfromdtag \
_autoitobject_ptrtoidispatch \
_autoitobject_registerobject \
_autoitobject_removemember \
_autoitobject_shutdown \
_autoitobject_startup \
_autoitobject_unregisterobject \
_autoitobject_variantclear \
_autoitobject_variantcopy \
_autoitobject_variantfree \
_autoitobject_variantinit \
_autoitobject_variantread \
_autoitobject_variantset \
_autoitobject_wrapperaddmethod \
_autoitobject_wrappercreateHinweis: Die Referenz sollte im Verlauf dieses Tutorials parallel genutzt werden.
Objekte erstellen:
Uns stehen zwei Möglichkeiten zur Verfügung neue Objekte zu erstellen. Die erste Funktion die das bewerkstelligen kann nennt sich _AutoItObject_Create(), die zweite _AutoItObject_Class(). Im Grunde liefern beide Funktionen das gleiche Ergebnis, aber sind von der Verwendung her unterschiedlich. Dazu später mehr, vorab werden wir nur mit der _AutoItObject_Create() Funktion arbeiten.Um also ein neues Objekt zu erstellen ist nur die Funktion _AutoItObject_Create() aufzurufen.
Spoiler anzeigen
[autoit]; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]#include <AutoItObject.au3>
[/autoit] [autoit][/autoit] [autoit]_AutoItObject_Startup()
[/autoit] [autoit][/autoit] [autoit]; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]Global $oObj = _AutoItObject_Create()
[/autoit] [autoit][/autoit] [autoit]; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]ConsoleWrite(@CRLF & '! IsObj = ' & IsObj($oObj) & @CRLF & @CRLF)
[/autoit] [autoit][/autoit] [autoit]; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]_AutoItObject_Shutdown()
[/autoit] [autoit][/autoit] [autoit]; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit]Jedoch enthält das Objekt weder Attribute oder Methoden. Das können wir jedoch mit den Funktionen _AutoItObject_AddProperty() und _AutoItObject_AddMethod() sehr schnell ändern.
Attribute
Attribute sind die Eigenschaften eines Objektes. Diese sind im Grunde nichts anderes als Variablen die mit jedem X beliebigen Wert gefüllt werden können. Um einem Objekt neue Attribute zuzuordnen, kann die Funktion _AutoItObject_AddProperty() verwendet werden. Mithilfe des vierten Parameters kann dem Attribut direkt ein Wert zugewiesen werden:Spoiler anzeigen
[autoit]; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]#include <AutoItObject.au3>
[/autoit] [autoit][/autoit] [autoit]_AutoItObject_Startup()
[/autoit] [autoit][/autoit] [autoit]; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]Global $oObj = _AutoItObject_Create()
[/autoit] [autoit][/autoit] [autoit]
_AutoItObject_AddProperty($oObj, 'x', Default, 1)
_AutoItObject_AddProperty($oObj, 'y'); ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]$oObj.y = 7
[/autoit] [autoit][/autoit] [autoit]
ConsoleWrite(@CRLF & ' (' & $oObj.x & '|' & $oObj.y & ')' & @CRLF & @CRLF); ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]_AutoItObject_Shutdown()
[/autoit] [autoit][/autoit] [autoit]; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit]Selbst Arrays, weitere Objekte oder gar Funktionen können in den Attributen hinterlegt werden:
Spoiler anzeigen
[autoit]; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]#include <Array.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <AutoItObject.au3>_AutoItObject_Startup()
[/autoit] [autoit][/autoit] [autoit]; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]Global $aiArray[3][3], $hFunc
[/autoit] [autoit][/autoit] [autoit]Global $oTmp = _AutoItObject_Create()
[/autoit] [autoit][/autoit] [autoit]
_AutoItObject_AddProperty($oTmp, 'var')Global $oObj = _AutoItObject_Create()
[/autoit] [autoit][/autoit] [autoit]
_AutoItObject_AddProperty($oObj, 'arr', Default, $aiArray)
_AutoItObject_AddProperty($oObj, 'obj', Default, $oTmp)
_AutoItObject_AddProperty($oObj, 'fnc', Default, _fnc); ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]$oObj.arr(1, 1) = 5
[/autoit] [autoit][/autoit] [autoit]
$oObj.obj.var = 321
$aiArray = $oObj.arr
$hFunc = $oObj.fnc
ConsoleWrite(@CRLF & ' ' & $oObj.obj.var & @CRLF & $hFunc() & @CRLF & '[1][1] = ' & $oObj.arr[1][1] & @CRLF & @CRLF)
_ArrayDisplay($aiArray); ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]_AutoItObject_Shutdown()
[/autoit] [autoit][/autoit] [autoit]; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]Func _fnc()
[/autoit] [autoit][/autoit] [autoit]
Return '! Func'
EndFunc; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit]Methoden
Methoden sind nichts anderes als Funktionen. Deswegen werden die Methoden auch nur als normale Funktionen definiert. Das wichtige ist jedoch, dass bei jeder Methoden Funktion über den ersten Parameter eine Referenz des Objektes übergeben wird, von dem es aufgerufen wurde. Alles andere bleibt wie gewohnt. Um die Funktion als Methode für ein Objekt zu registrieren, ist die Funktion _AutoItObject_AddMethod() zu nutzen:Spoiler anzeigen
[autoit]; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]#include <AutoItObject.au3>
[/autoit] [autoit][/autoit] [autoit]_AutoItObject_Startup()
[/autoit] [autoit][/autoit] [autoit]; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]Global $oObj = _AutoItObject_Create()
[/autoit] [autoit][/autoit] [autoit]
_AutoItObject_AddProperty($oObj, 'var')
_AutoItObject_AddMethod($oObj, 'fvar', '_Obj_Var'); ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]$oObj.fvar('Set')
[/autoit] [autoit][/autoit] [autoit]
ConsoleWrite(@CRLF & '! var = ' & $oObj.fvar() & @CRLF)
$oObj.fvar = 'Set it too'
ConsoleWrite('! var = ' & $oObj.fvar & @CRLF & ' ' & $oObj.var & @CRLF & @CRLF); ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]_AutoItObject_Shutdown()
[/autoit] [autoit][/autoit] [autoit]; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]Func _Obj_Var($oSelf, $vValue = Null)
[/autoit] [autoit][/autoit] [autoit]
If $vValue Then $oSelf.var = $vValue
Return $oSelf.var
EndFunc; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit]Zugriffsbeschränkungen
Es ist möglich Attribute und Methoden mit Zugriffsbeschränkungen zu belegen. Bei den Attributen gibt es drei, bei den Methode zwei mögliche Beschränkungen.$ELSCOPE_PUBLIC (Attribut)
Das Attribut ist von außerhalb lesbar und veränderbar.$ELSCOPE_READONLY (Attribut)
Das Attribut ist von außerhalb nur lesbar.$ELSCOPE_PRIVATE (Attribut)
Das Attribut ist von außerhalb überhaupt nicht ansprechbar.Diese Zugriffsbeschränkungen gelten nur, wenn man versucht auf das Attribut von außerhalb irgendwie zuzugreifen. Geschehen die Zugriffe direkt in eines der Methoden des entsprechenden Objektes gibt es keine Probleme. So können z.B. intern irgendwelche wichtigen Attribute angelegt werden ohne sich sorgen machen zu müssen dass sie außerhalb irgendwie manipuliert werden können. Es stellt eine Art Schutzmechanismus dar. Die Zugriffsberechtigungen können bei der Funktion _AutoItObject_AddProperty() im dritten Parameter übergeben werden.
Wird bei der _AutoItObject_AddMethod() Funktion der vierte Parameter auf True gesetzt, so kann die Methode außerhalb nicht aufgerufen werden. Andere Methoden im gleichen Objekt hingegen können diese Methode ohne weiteres benutzen. Wird der Parameter jedoch weggelassen oder auf False gesetzt, so kann die Methode außerhalb aufgerufen werden.
Klassen erstellen:
Eine Klasse beinhalten ausschließlich die Definition eines Objektes. Das Objekt selber wird bei einer Klasse nicht erstellt. Durch die Klassen ist es möglich ein Objekt nur einmal zu definieren, aber dafür beliebig oft das selbe Objekt zu erstellen. Um eine neue Klasse zu erstellen liefert uns die AutoItObject UDF die Funktion _AutoItObject_Class mit.Spoiler anzeigen
[autoit]; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]#include <AutoItObject.au3>
[/autoit] [autoit][/autoit] [autoit]_AutoItObject_Startup()
[/autoit] [autoit][/autoit] [autoit]; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]Global $oOne = Class().Object
[/autoit] [autoit][/autoit] [autoit]
Global $oTwo = Class().Object; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]$oOne.fvar = 7
[/autoit] [autoit][/autoit] [autoit]
$oTwo.fvar = 9ConsoleWrite(@CRLF & ' One = ' & $oOne.fvar & @CRLF & ' Two = ' & $oTwo.fvar & @CRLF & @CRLF)
[/autoit] [autoit][/autoit] [autoit]; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]_AutoItObject_Shutdown()
[/autoit] [autoit][/autoit] [autoit]; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]Func Class()
[/autoit] [autoit][/autoit] [autoit]
Local $oClass = _AutoItObject_Class()
$oClass.AddProperty('var')
$oClass.AddMethod('fvar', '_Obj_Var')Return $oClass
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
EndFuncFunc _Obj_Var($oSelf, $vValue = Null)
[/autoit] [autoit][/autoit] [autoit]
If $vValue Then $oSelf.var = $vValue
Return $oSelf.var
EndFunc; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit]Die Klasse sollte dabei in eine eigene Funktion ausgelegt werden da nach der Verwendung des Attribut .Object die gesamte Klasse gelöscht wird. Die bereits erlernten Funktionen müssen bei einer Klasse als Methoden genutzt werden. Im weiteren Verlauf des Tutorials werde ich nur noch ausschließlich mit Klasse arbeiten. Natürlich bleibt es jeden selber überlassen ob das Objekt direkt erstellt wird oder mit Klassen gearbeitet wird. Beides liefert (wie bereits erwähnt) das selbe Ergebnis.
Objekte Kopie / Referenz erzeugen:
Was genau ist nun eine Kopie und was nun eine Referenz bezogen auf OOP? Bei einer Kopie handelt es sich um ein komplett neues Objekt welche alle Attribute und Methoden eines anderen Objektes kopiert. Bei einer Referenz hingegen, zeigt diese Referenz auf ein bereits existierende Objekt und greift auf die fremden Attribute und Methoden zu. Doch alles der Reihe nach.Kopie
Um ein Objekt vollständig zu kopieren benötigen wir unsere bekannte Funktion _AutoItObject_Create(). Geben wir dort als Parameter des zu kopierenden Objektes mit, erhalten wir eine vollständige Kopie des Objektes:Spoiler anzeigen
[autoit]; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]#include <AutoItObject.au3>
[/autoit] [autoit][/autoit] [autoit]_AutoItObject_Startup()
[/autoit] [autoit][/autoit] [autoit]; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]Global $oOne = Class().Object
[/autoit] [autoit][/autoit] [autoit]
$oOne.fvar = 7
Global $oTwo = _AutoItObject_Create($oOne); ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]ConsoleWrite(@CRLF & ' One = ' & $oOne.fvar & @CRLF & ' Two = ' & $oTwo.fvar & @CRLF & @CRLF)
[/autoit] [autoit][/autoit] [autoit]; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]_AutoItObject_Shutdown()
[/autoit] [autoit][/autoit] [autoit]; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]Func Class()
[/autoit] [autoit][/autoit] [autoit]
Local $oClass = _AutoItObject_Class()
$oClass.AddProperty('var')
$oClass.AddMethod('fvar', '_Obj_Var')Return $oClass
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
EndFuncFunc _Obj_Var($oSelf, $vValue = Null)
[/autoit] [autoit][/autoit] [autoit]
If $vValue Then $oSelf.var = $vValue
Return $oSelf.var
EndFunc; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit]Referenz
Um eine Referenz zu einem Objekt zu erzeugen, müssen wir lediglich den = Operator verwenden. Bedenke jedoch, wir erstellen damit kein neues Objekt, sondern zeigen auf ein existierendes Objekt:Spoiler anzeigen
[autoit]; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]#include <AutoItObject.au3>
[/autoit] [autoit][/autoit] [autoit]_AutoItObject_Startup()
[/autoit] [autoit][/autoit] [autoit]; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]Global $oOne = Class().Object
[/autoit] [autoit][/autoit] [autoit]
$oOne.fvar = 7
Global $oTwo = $oOne
$oTwo.fvar = 9; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]ConsoleWrite(@CRLF & ' One = ' & $oOne.fvar & @CRLF & ' Two = ' & $oTwo.fvar & @CRLF & @CRLF)
[/autoit] [autoit][/autoit] [autoit]; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]_AutoItObject_Shutdown()
[/autoit] [autoit][/autoit] [autoit]; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]Func Class()
[/autoit] [autoit][/autoit] [autoit]
Local $oClass = _AutoItObject_Class()
$oClass.AddProperty('var')
$oClass.AddMethod('fvar', '_Obj_Var')Return $oClass
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
EndFuncFunc _Obj_Var($oSelf, $vValue = Null)
[/autoit] [autoit][/autoit] [autoit]
If $vValue Then $oSelf.var = $vValue
Return $oSelf.var
EndFunc; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit]Konstruktor / Destruktor:
In der OOP gibt es die Möglichkeit einen Konstruktor und einen Destruktor anzugeben. Beides sind nur Methoden in eines Objektes die jedoch nicht irgendwann, sondern zu einem ganz bestimmten Zeitpunkt aufgerufen werden. Der Konstruktor wird aufgerufen wenn ein Objekt erstellt wird, der Destruktor wenn dieses Objekt gelöscht wird. Jedoch bietet die AutoItObject UDF nur die Möglichkeit einen Destruktor anzugeben. Jedoch können wir unseren Konstruktor auch mit einem einfachen Workaround selber erstellen.Konstruktor
Wie bereits erwähnt können wir so nicht direkt einen Konstruktor angeben, wir können aber Code ausführen unmittelbar nach der Erstellung eines Objektes. Somit haben wir die Funktionsweise eines Konstruktors mithilfe eines Workarounds nachgebaut:Spoiler anzeigen
[autoit]; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]#include <AutoItObject.au3>
[/autoit] [autoit][/autoit] [autoit]_AutoItObject_Startup()
[/autoit] [autoit][/autoit] [autoit]; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]Global $oObj = Obj()
[/autoit] [autoit][/autoit] [autoit]; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]ConsoleWrite(@CRLF & ' var = ' & $oObj.fvar & @CRLF & @CRLF)
[/autoit] [autoit][/autoit] [autoit]; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]_AutoItObject_Shutdown()
[/autoit] [autoit][/autoit] [autoit]; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]Func Obj()
[/autoit] [autoit][/autoit] [autoit]
Local $oClass = _AutoItObject_Class()
$oClass.AddProperty('var')
$oClass.AddMethod('fvar', '_Obj_Var')Local $oObj = $oClass.Object
[/autoit] [autoit][/autoit] [autoit]
$oObj.fvar = 7Return $oObj
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
EndFuncFunc _Obj_Var($oSelf, $vValue = Null)
[/autoit] [autoit][/autoit] [autoit]
If $vValue Then $oSelf.var = $vValue
Return $oSelf.var
EndFunc; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit]Destruktor
Um eine Methode als Destruktor für ein Objekt zu definieren, benötigen wir einfach die Funktion _AutoItObject_AddDestructor(). Wird nun das Objekt gelöscht, so wird die zugewiesene Methode aufgerufen. Wir können sogar mehrere Destruktors zuweisen, sie werden dann in der umgekehrten Reihenfolge aufgerufen, in der sie zugewiesen wurden:Spoiler anzeigen
[autoit]; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]#include <AutoItObject.au3>
[/autoit] [autoit][/autoit] [autoit]_AutoItObject_Startup()
[/autoit] [autoit][/autoit] [autoit]; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]Global $oObj = Class().Object
[/autoit] [autoit][/autoit] [autoit]; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]$oObj = Null
[/autoit] [autoit][/autoit] [autoit]; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]_AutoItObject_Shutdown()
[/autoit] [autoit][/autoit] [autoit]; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]Func Class()
[/autoit] [autoit][/autoit] [autoit]
Local $oClass = _AutoItObject_Class()
$oClass.AddDestructor('_Dest1')
$oClass.AddDestructor('_Dest2')
$oClass.AddDestructor('_Dest3')Return $oClass
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
EndFuncFunc _Dest1($oSelf)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
ConsoleWrite('Dest 1' & @CRLF)
EndFuncFunc _Dest2($oSelf)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
ConsoleWrite('Dest 2' & @CRLF)
EndFuncFunc _Dest3($oSelf)
[/autoit] [autoit][/autoit] [autoit]
ConsoleWrite('Dest 3' & @CRLF)
EndFunc; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit]Die Destruktors werden jedoch nur aufgerufen, wenn dass Objekt „per Hand“ gelöscht wird.
Vererbung:
Klassen können beliebig erweitert werden. Dies ist z.B. hilfreich wenn man eine bestehende Klasse einfach erweitern möchte. Wir benötigen nur eine Kopie der Klasse die wir erweitern möchten:Spoiler anzeigen
[autoit]; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]#include <AutoItObject.au3>
[/autoit] [autoit][/autoit] [autoit]_AutoItObject_Startup()
[/autoit] [autoit][/autoit] [autoit]; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]Global $oObj = ClassChild().Object
[/autoit] [autoit][/autoit] [autoit]; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]$oObj.a = 5
[/autoit] [autoit][/autoit] [autoit]
$oObj.b = 7ConsoleWrite(@CRLF & ' a = ' & $oObj.a & @CRLF & ' b = ' & $oObj.b & @CRLF & @CRLF)
[/autoit] [autoit][/autoit] [autoit]; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]_AutoItObject_Shutdown()
[/autoit] [autoit][/autoit] [autoit]; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]Func ClassParent()
[/autoit] [autoit][/autoit] [autoit]
$oClass = _AutoItObject_Class()
$oClass.AddProperty('a')Return $oClass
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
EndFuncFunc ClassChild()
[/autoit] [autoit][/autoit] [autoit]
Local $oClass = ClassParent()
$oClass.AddProperty('b')Return $oClass
[/autoit] [autoit][/autoit] [autoit]
EndFunc; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit]Auch Objekte zu erweitern ist kein Problem, dafür stehen uns ja die Funktionen _AutoItObject_Create(), _AutoItObject_AddProperty(), _AutoItObject_AddMethod() und _AutoItObject_AddDestructor() zur Verfügung. Zudem haben wir auch die Möglichkeit mit _AutoItObject_RemoveMember bereits existierende Attribute und Methoden von einem Objekt zu löschen. Für Klassen steht parallel die Methode .RemoveMember() zur Verfügung:
Spoiler anzeigen
[autoit]; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]#include <AutoItObject.au3>
[/autoit] [autoit][/autoit] [autoit]_AutoItObject_Startup()
[/autoit] [autoit][/autoit] [autoit]; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]Global $oObj = ClassChild().Object
[/autoit] [autoit][/autoit] [autoit]; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]$oObj.a = 5
[/autoit] [autoit][/autoit] [autoit]
$oObj.b = 7ConsoleWrite(@CRLF & ' a = ' & $oObj.a & @CRLF & ' b = ' & $oObj.b & @CRLF & @CRLF)
[/autoit] [autoit][/autoit] [autoit]; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]_AutoItObject_Shutdown()
[/autoit] [autoit][/autoit] [autoit]; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]Func ClassParent()
[/autoit] [autoit][/autoit] [autoit]
$oClass = _AutoItObject_Class()
$oClass.AddProperty('a')Return $oClass
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
EndFuncFunc ClassChild()
[/autoit] [autoit][/autoit] [autoit]
Local $oClass = ClassParent()
$oClass.AddProperty('b')
$oClass.RemoveMember('a')Return $oClass
[/autoit] [autoit][/autoit] [autoit]
EndFunc; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit]Vielleicht wunderst du dich jetzt warum AutoIt kein Fehler entgegen schmeißt. Da alle Objekte extern gehandhabt wird, weiß AutoIt beim Syntax Check nicht, ob das Attribut oder die Methode wirklich existiert. Stattdessen geben unzulässige Abrufe im besten Fall einfach einen Leerstring zurück.
Abschluss Teil 1:
OOP ist ein umfassendes Thema, deshalb sind mehrere Teile geplant welche immer das jeweilige Teilgebiet größtmöglich abdecken soll. In zukünftigen Teilen wird dann darauf eingegangen wie Objekte in DLLs angesprochen werden können. Doch zunächst möchte ich im nächsten Teil näher darauf eingehen wie sinnvolle Anwendungen / Spiele mit OOP realisiert werden können. Kritik, Anregungen und Wünsche sind gerne gesehen und willkommen!
-
Ich glaube kaum dass diese Information noch irgendwen was nützt...
Zudem gibt's ja sowieso schon die Version 3.3.12.0
Das nächste mal überleg doch bitte zweimal bevor du einen alten Thread ausgräbst.

-
Im Grunde ist das möglich, dann müssten die Mnemonics vorab komplett geparst werden.
Jedoch müssen dann auch bestimmte Regeln beachtet werden dass z.B. push in Kombination mit einem 32 Bit Register nicht mehr funktioniert. (und so ein Gedönse ^^)
Generell machbar, aber aufwendig...Ich bin gespannt was bei herum kommt!
@WhiteLion
Wenn du dann schon was brauchbares hast zögere nicht mit uns zu teilen! Das wäre wirklich fantastisch.
-
In dem Fall wirst du auf die FASM.exe zurückgreifen müssen (sofern du selber nicht die DLL anpassen willst).
Wenn du ganz ohne EXE und DLL auskommen willst, darfst du dir dein eigenen Assemblierer schreiben.
Aber stell dir mal die Frage welchen Sinn es hat Code in einem eigenen Programm zu assemblieren.
Normalerweise kompiliert man den Code vorher und nutzt diesen dann. Sei es als Anwendung, DLL oder Binärcode.. -
Du bist hier im falschen Unterforum

Das nächste mal poste bitte Probleme in https://autoit.de/index.php/Boar…rst%C3%BCtzung/1. Arrays beginnen bei dem Index 0. Entweder setzt du hinter Zeile 6 noch ein -1 oder lässt die Random() Funktion eine Zahl von 0 bis 36 generieren.
2. Der + Operator ist für Strings unzulässig. Normalerweise bekommst du bei der "Addition" von zwei Zeichen eine 0 zurück. Wenn jedoch zufällig eine Zahl als Zeichen erwischt wird, wandelt AutoIt dieses automatisch in ein Integer um. Deswegen bekommst du nicht die Anzahl der Wiederholungen zurück, sondern irgend eine wilde Nummer. Verwende stattdessen den & Operator.
-
Das kannst du im Grunde gleich vergessen...
Wenn ich mich nicht irre nutzt sowohl Andy und eukalyptus die FASM.dll
Diese wurde nur als 32 Bit Dll kompiliert.
Sofern du den ganzen Sourcecode der DLL nicht umschreiben möchtest (auf x64 anpassen) kannst du die DLL im 64 Bit Mode nicht nutzen.
Aber evtl. kannst du die FASM.exe nutzen und diese deinen Code kompilieren lassen.Ich glaub da kann dir Andy bestimmt besser helfen als ich.
-
Ja, in Zeile 21 versuchst du ein Knotenpunkt auszulesen. Aber die Knotenpunkte sind halt nur Objekte welche keine eigenen Werte besitzen. Kannst du jedoch umgehen indem du ein "globales" Schlüsselwort verwendest was du einfach jedem Knotenpunkt zuordnest.
z.B. das Schlüsselwort __obj__ oder sowas. Dann kannst du auch "Knotenpunkte auslesen" (Siehe Zeile 39):
Spoiler anzeigen
[autoit]#cs ----------------------------------------------------------------------------
[/autoit] [autoit][/autoit] [autoit]AutoIt Version: 3.3.10.2
[/autoit] [autoit][/autoit] [autoit]
Author: myNameScript Function:
[/autoit] [autoit][/autoit] [autoit]
Template AutoIt script.#ce ----------------------------------------------------------------------------
[/autoit] [autoit][/autoit] [autoit]; Script Start - Add your code below here
[/autoit] [autoit][/autoit] [autoit]
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +#include <Array.au3>
[/autoit] [autoit][/autoit] [autoit]
#include ".\include\Tree.au3"; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]Global $oTree = _FromPathToTree('C:\Users\abc\', _AttribRules, 4)
[/autoit] [autoit][/autoit] [autoit]
Global $avKeys[2] = [$oTree.AppData.Keys, $oTree.AppData.Boot.Keys]
Global $sPath[2] = [$oTree.AppData.Local.__obj__, $oTree.AppData.Local.Adobe.__obj__] ; Zugriff auf untergeordnete KnotenpunkteFor $i = 0 To UBound($sPath)-1
[/autoit] [autoit][/autoit] [autoit]
MsgBox(0x40000, 'Tree', $sPath[$i])
Next
For $i = 0 To UBound($avKeys)-1
_ArrayDisplay($avKeys[$i])
Next; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]Func _FromPathToTree($sPath, $hRules, $iLevel = -1)
[/autoit] [autoit][/autoit] [autoit]
Local $oTree = _Tree_Object()
Local $hFile = FileFindFirstFile($sPath & '*')
Local $sFile = FileFindNextFile($hFile)
Local $bDir = @extended
Local $bRules, $sKey, $vTmp$oTree.append('__obj__') = $sPath ; HINZUGEFÜGT!
[/autoit] [autoit][/autoit] [autoit]If $iLevel Then
[/autoit] [autoit][/autoit] [autoit]
While $sFile
$bRules = $hRules($sPath & $sFile)If $bRules Then
[/autoit] [autoit][/autoit] [autoit]
$sKey = StringRegExpReplace($sFile, '[^a-zA-Z_]', '')
If $bDir Then
$vTmp = _FromPathToTree($sPath & $sFile & '\', $hRules, $iLevel - 1)
$oTree.append($sKey) = ((IsObj($vTmp)) ? ($vTmp) : ($sPath & $sFile))
Else
$oTree.append($sKey) = $sPath & $sFile
EndIf
EndIf$sFile = FileFindNextFile($hFile)
[/autoit] [autoit][/autoit] [autoit]
$bDir = @extended
WEnd
Else
FileClose($hFile)
Return
EndIfFileClose($hFile)
[/autoit] [autoit][/autoit] [autoit]
Return $oTree
EndFunc ;==>_FromPathToTreeFunc _AttribRules($sPath)
[/autoit] [autoit][/autoit] [autoit]
$sAttrib = FileGetAttrib($sPath)
Return StringRegExp($sAttrib, '[D]')
EndFunc ;==>_AttribRules; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit]Ich hoffe dass du jetzt klar kommst! Wie du eine Baumstruktur beispielsweise erstellen kannst ist nun hoffentlich klar. Ich denke mit Objekten zu arbeiten ist hier die beste Lösung da du halt einen Direktzugriff auf einzelne Knotenpunkte etc. hast.

-
Diese "neumodischen" Objekte kannst du einfach durch DllStructGetData() ersetzen, dann läuft die UDF auch auf älteren Versionen. Ich hab's dir freundlicherweise mal gemacht:
Spoiler anzeigen
[autoit]; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]
; AutoIt Version: 3.3.12.0
; FASM Version: 1.71
; Author: Make-Grafik
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
; FASM_Assemble ($sAsm)
; FASM_Error ([$iError = @error[, $iExtended = @extended]])
; FASM_Run ($dCode[, $avParam = $FASM_RUN])
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +#include-once
[/autoit] [autoit][/autoit] [autoit]Global $FASM_DLL = 'FASM.dll'
[/autoit] [autoit][/autoit] [autoit]
Global $FASM_RUN[1][2] = [['dword']]Global Const $tagFASM_STATE = 'dword condition; dword output_length; dword error_code; dword output_data; dword error_line'
[/autoit] [autoit][/autoit] [autoit]
Global Const $tagLINE_HEADER = 'dword file_path; dword line_number; dword file_offset; dword macro_calling_line; dword macro_line'Global Const $FASM_OK = 0
[/autoit] [autoit][/autoit] [autoit]
Global Const $FASM_WORKING = 1
Global Const $FASM_ERROR = 2
Global Const $FASM_INVALID_PARAMETER = -1
Global Const $FASM_OUT_OF_MEMORY = -2
Global Const $FASM_STACK_OVERFLOW = -3
Global Const $FASM_SOURCE_NOT_FOUND = -4
Global Const $FASM_UNEXPECTED_END_OF_SOURCE = -5
Global Const $FASM_CANNOT_GENERATE_CODE = -6
Global Const $FASM_FORMAT_LIMITATIONS_EXCEDDED = -7
Global Const $FASM_WRITE_FAILED = -8Global Const $FASMERR_FILE_NOT_FOUND = -101
[/autoit] [autoit][/autoit] [autoit]
Global Const $FASMERR_ERROR_READING_FILE = -102
Global Const $FASMERR_INVALID_FILE_FORMAT = -103
Global Const $FASMERR_INVALID_MACRO_ARGUMENTS = -104
Global Const $FASMERR_INCOMPLETE_MACRO = -105
Global Const $FASMERR_UNEXPECTED_CHARACTERS = -106
Global Const $FASMERR_INVALID_ARGUMENT = -107
Global Const $FASMERR_ILLEGAL_INSTRUCTION = -108
Global Const $FASMERR_INVALID_OPERAND = -109
Global Const $FASMERR_INVALID_OPERAND_SIZE = -110
Global Const $FASMERR_OPERAND_SIZE_NOT_SPECIFIED = -111
Global Const $FASMERR_OPERAND_SIZES_DO_NOT_MATCH = -112
Global Const $FASMERR_INVALID_ADDRESS_SIZE = -113
Global Const $FASMERR_ADDRESS_SIZES_DO_NOT_AGREE = -114
Global Const $FASMERR_DISALLOWED_COMBINATION_OF_REGISTERS = -115
Global Const $FASMERR_LONG_IMMEDIATE_NOT_ENCODABLE = -116
Global Const $FASMERR_RELATIVE_JUMP_OUT_OF_RANGE = -117
Global Const $FASMERR_INVALID_EXPRESSION = -118
Global Const $FASMERR_INVALID_ADDRESS = -119
Global Const $FASMERR_INVALID_VALUE = -120
Global Const $FASMERR_VALUE_OUT_OF_RANGE = -121
Global Const $FASMERR_UNDEFINED_SYMBOL = -122
Global Const $FASMERR_INVALID_USE_OF_SYMBOL = -123
Global Const $FASMERR_NAME_TOO_LONG = -124
Global Const $FASMERR_INVALID_NAME = -125
Global Const $FASMERR_RESERVED_WORD_USED_AS_SYMBOL = -126
Global Const $FASMERR_SYMBOL_ALREADY_DEFINED = -127
Global Const $FASMERR_MISSING_END_QUOTE = -128
Global Const $FASMERR_MISSING_END_DIRECTIVE = -129
Global Const $FASMERR_UNEXPECTED_INSTRUCTION = -130
Global Const $FASMERR_EXTRA_CHARACTERS_ON_LINE = -131
Global Const $FASMERR_SECTION_NOT_ALIGNED_ENOUGH = -132
Global Const $FASMERR_SETTING_ALREADY_SPECIFIED = -133
Global Const $FASMERR_DATA_ALREADY_DEFINED = -134
Global Const $FASMERR_TOO_MANY_REPEATS = -135
Global Const $FASMERR_SYMBOL_OUT_OF_SCOPE = -136
Global Const $FASMERR_USER_ERROR = -140
Global Const $FASMERR_ASSERTION_FAILED = -141; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]Func FASM_Assemble($sAsm)
[/autoit] [autoit][/autoit] [autoit]
Local $tMemory = DllStructCreate('byte var[8388608]')
Local $tState = DllStructCreate($tagFASM_STATE, DllStructGetPtr($tMemory))
Local $iAdd, $tBuffer, $tError, $tCode$sAsm = StringReplace($sAsm, '#', @CRLF)
[/autoit] [autoit][/autoit] [autoit]
$iAdd = @extended
$tBuffer = DllStructCreate('byte var[' & StringLen($sAsm) + $iAdd & ']')
DllStructSetData($tBuffer, 'var', $sAsm)DllCall($FASM_DLL, 'dword', 'fasm_Assemble', 'ptr', DllStructGetPtr($tBuffer), 'ptr', DllStructGetPtr($tMemory), 'dword', DllStructGetSize($tMemory), 'dword', 100, 'dword', 0)
[/autoit] [autoit][/autoit] [autoit]
If @error Then Return SetError(@error, 1, 0)
If DllStructGetData($tBuffer, 'condition') Then
$tError = DllStructCreate($tagLINE_HEADER, DllStructGetData($tState, 'error_code'))
Return SetError(DllStructGetData($tState, 'output_length'), 2, DllStructGetData($tError, 'line_number'))
EndIf$tCode = DllStructCreate('byte var[' & DllStructGetData($tState, 'output_length') & ']', DllStructGetData($tState, 'error_code'))
[/autoit] [autoit][/autoit] [autoit]
Return SetError($FASM_OK, 2, DllStructGetData($tCode, 'var'))
EndFuncFunc FASM_Error($iError = @error, $iExtended = @extended)
[/autoit] [autoit][/autoit] [autoit]
Local $sErrorSwitch $iExtended
[/autoit] [autoit][/autoit] [autoit]
Case 1
Switch $iError
Case 1
$sError = 'unable to use the DLL file'
Case 2
$sError = 'unknown "return type"'
Case 3
$sError = '"function" not found in the DLL file'
Case 4
$sError = 'bad number of parameters'
Case 5
$sError = 'bad parameter'
EndSwitch
Case 2
Switch $iError
Case $FASM_OK
$sError = 'OK'
Case $FASM_WORKING
$sError = 'WORKING'
Case $FASM_ERROR
$sError = 'ERROR'
Case $FASM_INVALID_PARAMETER
$sError = 'INVALID PARAMETER'
Case $FASM_OUT_OF_MEMORY
$sError = 'OUT OF MEMORY'
Case $FASM_STACK_OVERFLOW
$sError = 'STACK OVERFLOW'
Case $FASM_SOURCE_NOT_FOUND
$sError = 'NOT FOUND'
Case $FASM_UNEXPECTED_END_OF_SOURCE
$sError = 'END OF SOURCE'
Case $FASM_CANNOT_GENERATE_CODE
$sError = 'GENERATE CODE'
Case $FASM_FORMAT_LIMITATIONS_EXCEDDED
$sError = 'FORMAT LIMITATIONS EXCEDDED'
Case $FASM_WRITE_FAILED
$sError = 'WRITE FAILED'
Case $FASMERR_FILE_NOT_FOUND
$sError = 'FILE NOT FOUND'
Case $FASMERR_ERROR_READING_FILE
$sError = 'ERROR READING FILE'
Case $FASMERR_INVALID_FILE_FORMAT
$sError = 'INVALID FILE FORMAT'
Case $FASMERR_INVALID_MACRO_ARGUMENTS
$sError = 'INVALID MACRO ARGUMENTS'
Case $FASMERR_INCOMPLETE_MACRO
$sError = 'INCOMPLETE MACRO'
Case $FASMERR_UNEXPECTED_CHARACTERS
$sError = 'UNEXPECTED CHARACTERS'
Case $FASMERR_INVALID_ARGUMENT
$sError = 'INVALID ARGUMENT'
Case $FASMERR_ILLEGAL_INSTRUCTION
$sError = 'ILLEGAL INSTRUCTION'
Case $FASMERR_INVALID_OPERAND
$sError = 'INVALID OPERAND'
Case $FASMERR_INVALID_OPERAND_SIZE
$sError = 'INVALID OPERAND SIZE'
Case $FASMERR_OPERAND_SIZE_NOT_SPECIFIED
$sError = 'OPERAND SIZE NOT SPECIFIED'
Case $FASMERR_OPERAND_SIZES_DO_NOT_MATCH
$sError = 'OPERAND SIZES DO NOT MATCH'
Case $FASMERR_INVALID_ADDRESS_SIZE
$sError = 'INVALID ADDRESS SIZE'
Case $FASMERR_ADDRESS_SIZES_DO_NOT_AGREE
$sError = 'ADDRESS SIZES DO NOT AGREE'
Case $FASMERR_DISALLOWED_COMBINATION_OF_REGISTERS
$sError = 'DISALLOWED COMBINATION OF REGISTERS'
Case $FASMERR_LONG_IMMEDIATE_NOT_ENCODABLE
$sError = 'LONG IMMEDIATE NOT ENCODABLE'
Case $FASMERR_RELATIVE_JUMP_OUT_OF_RANGE
$sError = 'RELATIVE JUMP OUT OF RANGE'
Case $FASMERR_INVALID_EXPRESSION
$sError = 'INVALID EXPRESSION'
Case $FASMERR_INVALID_ADDRESS
$sError = 'INVALID ADDRESS'
Case $FASMERR_INVALID_VALUE
$sError = 'INVALID VALUE'
Case $FASMERR_VALUE_OUT_OF_RANGE
$sError = 'VALUE OUT OF RANGE'
Case $FASMERR_UNDEFINED_SYMBOL
$sError = 'UNDEFINED SYMBOL'
Case $FASMERR_INVALID_USE_OF_SYMBOL
$sError = 'INVALID USE OF SYMBOL'
Case $FASMERR_NAME_TOO_LONG
$sError = 'NAME TOO LONG'
Case $FASMERR_INVALID_NAME
$sError = 'INVALID NAME'
Case $FASMERR_RESERVED_WORD_USED_AS_SYMBOL
$sError = 'RESERVED WORD USED AS SYMBOL'
Case $FASMERR_SYMBOL_ALREADY_DEFINED
$sError = 'SYMBOL ALREADY DEFINED'
Case $FASMERR_MISSING_END_QUOTE
$sError = 'MISSING END QUOTE'
Case $FASMERR_MISSING_END_DIRECTIVE
$sError = 'END DIRECTIVE'
Case $FASMERR_UNEXPECTED_INSTRUCTION
$sError = 'UNEXPECTED INSTRUCTION'
Case $FASMERR_EXTRA_CHARACTERS_ON_LINE
$sError = 'EXTRA CHARACTERS ON LINE'
Case $FASMERR_SECTION_NOT_ALIGNED_ENOUGH
$sError = 'SECTION NOT ALIGNED ENOUGHT'
Case $FASMERR_SETTING_ALREADY_SPECIFIED
$sError = 'SETTING ALREADY SPECIFIED'
Case $FASMERR_DATA_ALREADY_DEFINED
$sError = 'DATA ALREADY DEFINED'
Case $FASMERR_TOO_MANY_REPEATS
$sError = 'TOO MANY REPEATS'
Case $FASMERR_SYMBOL_OUT_OF_SCOPE
$sError = 'SYMBOL OUT OF SCOPE'
Case $FASMERR_USER_ERROR
$sError = 'USER ERROR'
Case $FASMERR_ASSERTION_FAILED
$sError = 'ASSERTION FAILED'
EndSwitch
Case 3
$sError = 'RUN'
EndSwitchIf $iError <> $FASM_OK Then ConsoleWrite('! FASM Error: ' & $sError & @CRLF)
[/autoit] [autoit][/autoit] [autoit]
Return SetError($iError, $iExtended, $iError)
EndFuncFunc FASM_Run($dCode, $avParam = $FASM_RUN)
[/autoit] [autoit][/autoit] [autoit]
Local $tCode = DllStructCreate('byte var[' & BinaryLen($dCode) +6 & ']')
Local $sScript = 'DllCallAddress("' & $avParam[0][0] & '",DllStructGetPtr($tCode)'
Local $i, $n, $avRetDllStructSetData($tCode, 'var', $dCode)
[/autoit] [autoit][/autoit] [autoit]
For $i = 1 To UBound($avParam, 1) -1
$sScript &= ',"' & $avParam[$i][0] & '","' & $avParam[$i][1] & '"'
Next
$sScript &= ')'$avRet = Execute($sScript)
[/autoit] [autoit][/autoit] [autoit]
If Not @error Then Return $avRet[0]
Return SetError(@error, 3, 0)
EndFunc; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] -
Klar, kein Problem: (so sinnlos ^^)
[autoit]#include "FASM.au3"
[/autoit][autoit][/autoit][autoit]Global $vRet
[/autoit][autoit][/autoit][autoit]
Global $sASM = _
'# use64' & _
'# movq mm0, mm1' & _
'# ret'$FASM_RUN[0][0] = 'INT64'
[/autoit][autoit][/autoit][autoit]$dCode = FASM_Assemble($sASM)
[/autoit]
If Not FASM_Error() Then $vRet = FASM_Run($dCode)
ConsoleWrite($vRet & @CRLF) -
Zitat
Gehen bei OnAutoItExitRegister mehrere Funktionen?
JaZitatSo, wie ich das verstanden habe, gibt $oTree.exists aus, an welcher Stelle das Blatt auf der Ebene ist?
Nein, es gibt dir an welchen Index dieser in dem Attribut keys hat. Damit kannst du eigentlich prüfen ob der Schlüssel bereits vergeben ist. Das mit der Position ist nur intern so geregelt da ich nicht die neuste AutoItObject Version genutzt habe. Merke dir einfach: Es gibt dir zurück OB das Schlüsselwort für den Knotenpunkt bereits vergeben ist.ZitatKnoten können keine Werte haben und Blätter können keine Knoten werden?
An den knoten hängen ja die Blätter. Die Blätter sind in dem Fall die Attribute und die Knoten das eigentliche Objekt. Demnach also: Richtig erkanntZitatAppend hängt ein Blatt am Schluss an oder ein Knoten mit Blättern?
Append hängt dem Knotenpunkt (dem Objekt) ein weiteres Blatt (Attribut) an.ZitatInsert hängt einen Knoten direkt an die Root und zwischen alle bisherigen Knoten und Blätter?
Ja, der Knotenpunkt wird mitten im Pfad erstellt. Du wählst den Knotenpunkt aus wo ein weiterer Knotenpunkt eingefügt wird. Du hast z.B. den Pfad $oTree.a.b.c und willst zwischen b und c einen weiteren Knotenpunkt x erzeugen. Dann rufst du die Methode einfach bei dem Objekt b auf. Sprich: $oTree.a.b.insert('x') -
Ich fand die FASM UDF von eukalyptus immer sehr "umständlich".
Daher hatte ich mir selber eine FASM.au3 geschrieben die nur 3 Funktionen beinhaltet:FASM_Assemble($sAsm) > Gibt den Bytecode eins ASM Codes zurück
FASM_Error($iError = @error, $iExtended = @extended) > Gibt den letzten Fehler von einer FASM_Assemble() Ausführung zurück
FASM_Run(Func FASM_Run($dCode, $avParam = $FASM_RUN) > Führt einen Bytecode aus (Parameter können als Array angegeben werden)Ich hab dir mal die meine Version der FASM.au3 hochgeladen, jedoch ist eine DLL nötig die ebenfalls im Archiv beiliegt.
Im Grunde brauchst du nur die FASM_Assemble() Funktion aufrufen und schon bekommst du den Bytecode als Rückgabewert ausgespuckt. -
<p>Auch von mir gibt's fröhliche Grüße!<br />
Kannst ja gleich in den DD-Day hinein feiern ^^</p><p> </p>
<p>LG. make :)</p>
-
Achso, das habe ich in der Referenz nicht so verstanden. Vielen dank!

Gesendet von meinem HTC Desire HD A9191 mit Tapatalk 2
-
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
-
Hallo

In der angehängten "Tree UDF.zip" findest du folgende Dateien:
- AutoItObject.au3
- Tree.au3
- Example.au3
- Tree Doc.txtDie "Tree.au3" ist die eigentliche UDF welche's eine Baumstruktur erstellen kann.
Diese UDF basiert auf OOP, daher ist die "AutoItObject.au3" nötig.
Die "Example.au3" Datei enthält ein einfaches Beispiel über die Funktionsweise aller Methoden und Attribute eines Objektes.
Bei der "Tree Doc.txt" handelt es sich um eine Dokumentation zu der "Tree.au3".Ich hoffe diese nun fertige UDF hilft dir weiter.
Du kannst das Objekt ja beliebig extern erweitern, dass ist sehr vorteilhaft da du es an deine Bedürfnisse anpassen kannst.
Die eine oder andere Funktion kannst du aus der alten UDF ja einfach übernehmen und mit nutzen.
Damit sollte es dir eigentlich gelingen!Falls noch Fragen da sind, dann immer her damit!
Habe drz. Langeweile...
€dit: Dazu ein Beispiel direkt bezogen auf dein aktuelles Problem!
Spoiler anzeigen
[autoit]; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]#include <Array.au3>
[/autoit] [autoit][/autoit] [autoit]
#include "Tree.au3"; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]Global $oTree = _FromPathToTree('C:\', _AttribRules, 2)
[/autoit] [autoit][/autoit] [autoit]
Global $avKeys = $oTree.Windows.Keys
Global $sPath = $oTree.Windows.Boot ; Zugriff auf untergeordnete KnotenpunkteMsgBox(0x40000, 'Tree', $sPath)
[/autoit] [autoit][/autoit] [autoit]
_ArrayDisplay($avKeys); ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]Func _FromPathToTree($sPath, $hRules, $iLevel = -1)
[/autoit] [autoit][/autoit] [autoit]
Local $oTree = _Tree_Object()
Local $hFile = FileFindFirstFile($sPath & '*')
Local $sFile = FileFindNextFile($hFile)
Local $bDir = @extended
Local $bRules, $sKey, $vTmpIf $iLevel Then
[/autoit] [autoit][/autoit] [autoit]
While $sFile
$bRules = $hRules($sPath & $sFile)If $bRules Then
[/autoit] [autoit][/autoit] [autoit]
$sKey = StringRegExpReplace($sFile, '[^a-zA-Z_]', '')
If $bDir Then
$vTmp = _FromPathToTree($sPath & $sFile & '\', $hRules, $iLevel -1)
$oTree.append($sKey) = ((IsObj($vTmp)) ? ($vTmp) : ($sPath & $sFile))
Else
$oTree.append($sKey) = $sPath & $sFile
EndIf
EndIf$sFile = FileFindNextFile($hFile)
[/autoit] [autoit][/autoit] [autoit]
$bDir = @extended
WEnd
Else
FileClose($hFile)
Return
EndIfFileClose($hFile)
[/autoit] [autoit][/autoit] [autoit]
Return $oTree
EndFuncFunc _AttribRules($sPath)
[/autoit] [autoit][/autoit] [autoit]
$sAttrib = FileGetAttrib($sPath)
Return Not StringRegExp($sAttrib, '[SHT]')
EndFunc; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] -
Nein, ich speicher dann Objekte in Objekte. Das hat den Vorteil dass man ein Direktzugriff darauf hat und sich quasi selber erneuert, wenn Zweige im Baum bearbeitet werden. Eine Löschen und Hinzufügen Funktion hat das schon. Jetzt fehlt nur noch eine Einfügen Funktion.

Ich schick dir das Beispiel via OOP heute Abend, da ich mich jetzt erstmal noch um mein RL kümmern muss. Hab drz. Kein Zugriff mehr auf die Datei.
Gesendet von meinem HTC Desire HD A9191 mit Tapatalk 2
-
Das Forum existiert schon seit dem 7. Dezember 2005 wenn ich mich nicht irre.
Bis zum 10 jährigen Jubiläum dauert's noch'n Jährchen.