1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. Yjuq

Beiträge von Yjuq

  • Tutorial – OOP in AutoIt

    • Yjuq
    • 29. November 2014 um 19:07

    Stimmt, hast recht!
    Wird sofort gefixt ^^

  • Suche Ansatz für einen "Offline Poster"

    • Yjuq
    • 29. November 2014 um 16:19

    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... :|

  • Suche Ansatz für einen "Offline Poster"

    • Yjuq
    • 29. November 2014 um 15:54

    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
    [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]
    Alles anzeigen

    [/spoiler]

    Gesendet von meinem HTC Desire HD A9191 mit Tapatalk 2

  • Tutorial – OOP in AutoIt

    • Yjuq
    • 29. November 2014 um 15:35

    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…_Programmierung


    OOP 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 it

    syntax 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_wrappercreate

    Hinweis: 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()
    _AutoItObject_AddProperty($oObj, 'x', Default, 1)
    _AutoItObject_AddProperty($oObj, 'y')

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    $oObj.y = 7
    ConsoleWrite(@CRLF & ' (' & $oObj.x & '|' & $oObj.y & ')' & @CRLF & @CRLF)

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

    [/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>
    #include <AutoItObject.au3>

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

    _AutoItObject_Startup()

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    Global $aiArray[3][3], $hFunc

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

    Global $oTmp = _AutoItObject_Create()
    _AutoItObject_AddProperty($oTmp, 'var')

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

    Global $oObj = _AutoItObject_Create()
    _AutoItObject_AddProperty($oObj, 'arr', Default, $aiArray)
    _AutoItObject_AddProperty($oObj, 'obj', Default, $oTmp)
    _AutoItObject_AddProperty($oObj, 'fnc', Default, _fnc)

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    $oObj.arr(1, 1) = 5
    $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]

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    _AutoItObject_Shutdown()

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    Func _fnc()
    Return '! Func'
    EndFunc

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

    [/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()
    _AutoItObject_AddProperty($oObj, 'var')
    _AutoItObject_AddMethod($oObj, 'fvar', '_Obj_Var')

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    $oObj.fvar('Set')
    ConsoleWrite(@CRLF & '! var = ' & $oObj.fvar() & @CRLF)
    $oObj.fvar = 'Set it too'
    ConsoleWrite('! var = ' & $oObj.fvar & @CRLF & ' ' & $oObj.var & @CRLF & @CRLF)

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    _AutoItObject_Shutdown()

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    Func _Obj_Var($oSelf, $vValue = Null)
    If $vValue Then $oSelf.var = $vValue
    Return $oSelf.var
    EndFunc

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

    [/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
    Global $oTwo = Class().Object

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    $oOne.fvar = 7
    $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()
    Local $oClass = _AutoItObject_Class()
    $oClass.AddProperty('var')
    $oClass.AddMethod('fvar', '_Obj_Var')

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

    Return $oClass
    EndFunc

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

    Func _Obj_Var($oSelf, $vValue = Null)
    If $vValue Then $oSelf.var = $vValue
    Return $oSelf.var
    EndFunc

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

    [/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
    $oOne.fvar = 7
    Global $oTwo = _AutoItObject_Create($oOne)

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

    [/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()
    Local $oClass = _AutoItObject_Class()
    $oClass.AddProperty('var')
    $oClass.AddMethod('fvar', '_Obj_Var')

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

    Return $oClass
    EndFunc

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

    Func _Obj_Var($oSelf, $vValue = Null)
    If $vValue Then $oSelf.var = $vValue
    Return $oSelf.var
    EndFunc

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

    [/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
    $oOne.fvar = 7
    Global $oTwo = $oOne
    $oTwo.fvar = 9

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

    [/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()
    Local $oClass = _AutoItObject_Class()
    $oClass.AddProperty('var')
    $oClass.AddMethod('fvar', '_Obj_Var')

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

    Return $oClass
    EndFunc

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

    Func _Obj_Var($oSelf, $vValue = Null)
    If $vValue Then $oSelf.var = $vValue
    Return $oSelf.var
    EndFunc

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

    [/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()
    Local $oClass = _AutoItObject_Class()
    $oClass.AddProperty('var')
    $oClass.AddMethod('fvar', '_Obj_Var')

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

    Local $oObj = $oClass.Object
    $oObj.fvar = 7

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

    Return $oObj
    EndFunc

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

    Func _Obj_Var($oSelf, $vValue = Null)
    If $vValue Then $oSelf.var = $vValue
    Return $oSelf.var
    EndFunc

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

    [/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()
    Local $oClass = _AutoItObject_Class()
    $oClass.AddDestructor('_Dest1')
    $oClass.AddDestructor('_Dest2')
    $oClass.AddDestructor('_Dest3')

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

    Return $oClass
    EndFunc

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

    Func _Dest1($oSelf)
    ConsoleWrite('Dest 1' & @CRLF)
    EndFunc

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

    Func _Dest2($oSelf)
    ConsoleWrite('Dest 2' & @CRLF)
    EndFunc

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

    Func _Dest3($oSelf)
    ConsoleWrite('Dest 3' & @CRLF)
    EndFunc

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

    [/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
    $oObj.b = 7

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

    ConsoleWrite(@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()
    $oClass = _AutoItObject_Class()
    $oClass.AddProperty('a')

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

    Return $oClass
    EndFunc

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

    Func ClassChild()
    Local $oClass = ClassParent()
    $oClass.AddProperty('b')

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

    Return $oClass
    EndFunc

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

    [/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
    $oObj.b = 7

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

    ConsoleWrite(@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()
    $oClass = _AutoItObject_Class()
    $oClass.AddProperty('a')

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

    Return $oClass
    EndFunc

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

    Func ClassChild()
    Local $oClass = ClassParent()
    $oClass.AddProperty('b')
    $oClass.RemoveMember('a')

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

    Return $oClass
    EndFunc

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

    [/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! :)

  • Welche AutoIt Version nutzt ihr?

    • Yjuq
    • 28. November 2014 um 22:43

    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. ^^

  • FASM UDF (X86 u X64)

    • Yjuq
    • 28. November 2014 um 20:33

    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. :)

  • FASM UDF (X86 u X64)

    • Yjuq
    • 28. November 2014 um 18:44

    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..

  • SerialKeyGenerator mit Array und Random erstellen.

    • Yjuq
    • 28. November 2014 um 18:33

    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.

  • FASM UDF (X86 u X64)

    • Yjuq
    • 28. November 2014 um 16:18

    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.

  • "Tree"-Variable

    • Yjuq
    • 28. November 2014 um 15:42

    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
    Author: myName

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

    Script Function:
    Template AutoIt script.

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

    #ce ----------------------------------------------------------------------------

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

    ; Script Start - Add your code below here
    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    #include <Array.au3>
    #include ".\include\Tree.au3"

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    Global $oTree = _FromPathToTree('C:\Users\abc\', _AttribRules, 4)
    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 Knotenpunkte

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

    For $i = 0 To UBound($sPath)-1
    MsgBox(0x40000, 'Tree', $sPath[$i])
    Next
    For $i = 0 To UBound($avKeys)-1
    _ArrayDisplay($avKeys[$i])
    Next

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    Func _FromPathToTree($sPath, $hRules, $iLevel = -1)
    Local $oTree = _Tree_Object()
    Local $hFile = FileFindFirstFile($sPath & '*')
    Local $sFile = FileFindNextFile($hFile)
    Local $bDir = @extended
    Local $bRules, $sKey, $vTmp

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

    $oTree.append('__obj__') = $sPath ; HINZUGEFÜGT!

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

    If $iLevel Then
    While $sFile
    $bRules = $hRules($sPath & $sFile)

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

    If $bRules Then
    $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

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

    $sFile = FileFindNextFile($hFile)
    $bDir = @extended
    WEnd
    Else
    FileClose($hFile)
    Return
    EndIf

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

    FileClose($hFile)
    Return $oTree
    EndFunc ;==>_FromPathToTree

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

    Func _AttribRules($sPath)
    $sAttrib = FileGetAttrib($sPath)
    Return StringRegExp($sAttrib, '[D]')
    EndFunc ;==>_AttribRules

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

    [/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. :)

  • FASM UDF (X86 u X64)

    • Yjuq
    • 28. November 2014 um 14:47

    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 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])
    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    #include-once

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

    Global $FASM_DLL = 'FASM.dll'
    Global $FASM_RUN[1][2] = [['dword']]

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

    Global Const $tagFASM_STATE = 'dword condition; dword output_length; dword error_code; dword output_data; dword error_line'
    Global Const $tagLINE_HEADER = 'dword file_path; dword line_number; dword file_offset; dword macro_calling_line; dword macro_line'

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

    Global Const $FASM_OK = 0
    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 = -8

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

    Global Const $FASMERR_FILE_NOT_FOUND = -101
    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]

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    Func FASM_Assemble($sAsm)
    Local $tMemory = DllStructCreate('byte var[8388608]')
    Local $tState = DllStructCreate($tagFASM_STATE, DllStructGetPtr($tMemory))
    Local $iAdd, $tBuffer, $tError, $tCode

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

    $sAsm = StringReplace($sAsm, '#', @CRLF)
    $iAdd = @extended
    $tBuffer = DllStructCreate('byte var[' & StringLen($sAsm) + $iAdd & ']')
    DllStructSetData($tBuffer, 'var', $sAsm)

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

    DllCall($FASM_DLL, 'dword', 'fasm_Assemble', 'ptr', DllStructGetPtr($tBuffer), 'ptr', DllStructGetPtr($tMemory), 'dword', DllStructGetSize($tMemory), 'dword', 100, 'dword', 0)
    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

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

    $tCode = DllStructCreate('byte var[' & DllStructGetData($tState, 'output_length') & ']', DllStructGetData($tState, 'error_code'))
    Return SetError($FASM_OK, 2, DllStructGetData($tCode, 'var'))
    EndFunc

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

    Func FASM_Error($iError = @error, $iExtended = @extended)
    Local $sError

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

    Switch $iExtended
    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'
    EndSwitch

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

    If $iError <> $FASM_OK Then ConsoleWrite('! FASM Error: ' & $sError & @CRLF)
    Return SetError($iError, $iExtended, $iError)
    EndFunc

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

    Func FASM_Run($dCode, $avParam = $FASM_RUN)
    Local $tCode = DllStructCreate('byte var[' & BinaryLen($dCode) +6 & ']')
    Local $sScript = 'DllCallAddress("' & $avParam[0][0] & '",DllStructGetPtr($tCode)'
    Local $i, $n, $avRet

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

    DllStructSetData($tCode, 'var', $dCode)
    For $i = 1 To UBound($avParam, 1) -1
    $sScript &= ',"' & $avParam[$i][0] & '","' & $avParam[$i][1] & '"'
    Next
    $sScript &= ')'

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

    $avRet = Execute($sScript)
    If Not @error Then Return $avRet[0]
    Return SetError(@error, 3, 0)
    EndFunc

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

    [/autoit]
  • FASM UDF (X86 u X64)

    • Yjuq
    • 27. November 2014 um 21:34

    Klar, kein Problem: (so sinnlos ^^)

    [autoit]

    #include "FASM.au3"

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

    Global $vRet
    Global $sASM = _
    '# use64' & _
    '# movq mm0, mm1' & _
    '# ret'

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

    $FASM_RUN[0][0] = 'INT64'

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

    $dCode = FASM_Assemble($sASM)
    If Not FASM_Error() Then $vRet = FASM_Run($dCode)
    ConsoleWrite($vRet & @CRLF)

    [/autoit]
  • "Tree"-Variable

    • Yjuq
    • 27. November 2014 um 21:13
    Zitat

    Gehen bei OnAutoItExitRegister mehrere Funktionen?


    Ja


    Zitat

    So, 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.


    Zitat

    Knoten 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 erkannt


    Zitat

    Append 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.


    Zitat

    Insert 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')

  • FASM UDF (X86 u X64)

    • Yjuq
    • 27. November 2014 um 20:56

    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.

  • Raupi hat Geburtstag!

    • Yjuq
    • 27. November 2014 um 13:24

    <p>Auch von mir gibt's fr&ouml;hliche Gr&uuml;&szlig;e!<br />
    Kannst ja gleich in den DD-Day hinein feiern ^^</p>

    <p>&nbsp;</p>

    <p>LG. make :)</p>

  • AutoItObject - OOP für AutoIt

    • Yjuq
    • 27. November 2014 um 09:18

    Achso, das habe ich in der Referenz nicht so verstanden. Vielen dank! :)

    Gesendet von meinem HTC Desire HD A9191 mit Tapatalk 2

  • AutoItObject - OOP für AutoIt

    • Yjuq
    • 26. November 2014 um 22:22

    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

  • "Tree"-Variable

    • Yjuq
    • 25. November 2014 um 22:28

    Hallo :)
    In der angehängten "Tree UDF.zip" findest du folgende Dateien:
    - AutoItObject.au3
    - Tree.au3
    - Example.au3
    - Tree Doc.txt

    Die "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>
    #include "Tree.au3"

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    Global $oTree = _FromPathToTree('C:\', _AttribRules, 2)
    Global $avKeys = $oTree.Windows.Keys
    Global $sPath = $oTree.Windows.Boot ; Zugriff auf untergeordnete Knotenpunkte

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

    MsgBox(0x40000, 'Tree', $sPath)
    _ArrayDisplay($avKeys)

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    Func _FromPathToTree($sPath, $hRules, $iLevel = -1)
    Local $oTree = _Tree_Object()
    Local $hFile = FileFindFirstFile($sPath & '*')
    Local $sFile = FileFindNextFile($hFile)
    Local $bDir = @extended
    Local $bRules, $sKey, $vTmp

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

    If $iLevel Then
    While $sFile
    $bRules = $hRules($sPath & $sFile)

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

    If $bRules Then
    $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

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

    $sFile = FileFindNextFile($hFile)
    $bDir = @extended
    WEnd
    Else
    FileClose($hFile)
    Return
    EndIf

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

    FileClose($hFile)
    Return $oTree
    EndFunc

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

    Func _AttribRules($sPath)
    $sAttrib = FileGetAttrib($sPath)
    Return Not StringRegExp($sAttrib, '[SHT]')
    EndFunc

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

    [/autoit]
  • "Tree"-Variable

    • Yjuq
    • 25. November 2014 um 14:35

    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

  • Apropos Alles Gute

    • Yjuq
    • 25. November 2014 um 12:44

    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. ^^

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™