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

Beiträge von BugFix

  • AutoIt's Word UDF - was fehlt?

    • BugFix
    • 30. April 2012 um 23:07

    Ich verwende für kein Office-Produkt die UDF. Ich finde es effektiver direkt mit den Methoden und Eigenschaften dieser Objekte zu arbeiten.
    Wer es auch mal selber probieren will, hier sind die entsprechenden Infos.

  • Kann gelöscht werden wegen Desinteresse

    • BugFix
    • 30. April 2012 um 19:14
    Zitat von fakeraol

    Wenn ich Closures richtig verstanden habe, dann sollte man, wenn man aus einer Funktion eine weitere Funktion aufruft, und diese im Funktionskörper Variablen anlegt, diese vor dem verlassen der Funktion explizit wieder löschen, mit $var = 0 oder ab der 3.3.9.x mit $var = null. Ist das richtig?
    Oder ist es besser einer Unterfunktion Variablen nur ByRef zu übergeben?


    Grundsätzlich ist es nie verkehrt, wenn man eine Variable nach deren Nutzung entlädt. In AutoIt besteht die Besonderheit, dass es außer in Funktionen keine Lokalen Deklarationen gibt. Das führt zu diesen Problemen der "Überblähung", alles ist Global. Da wäre es wirklich wünschenswert, wenn in dieser Richtung mal eine wirkliche Weiterentwicklung von AutoIt erfolgt, z.B. durch das Einführen von Do..End als Markierung eines Lokalen Blocks (oder ähnlich).

  • SciTE Individualisierung - Ermitteln freier command-Nummern

    • BugFix
    • 30. April 2012 um 12:33

    fire4orce@it:
    Dein Skript ist zum Einen länger ( bei solch kurzem Skript sind die 8 Zeilen Unterschied immerhin rund 25% ;) ) und zum Anderen sehe ich nicht, dass du auskommentierte Zeilen der Dateien auch ignorierst. Diese werden bei dir munter als existent betrachtet. :whistling:

  • Wer steigt auf Windows 8 um?

    • BugFix
    • 25. April 2012 um 17:40
    Zitat von GtaSpider

    Ich verstehe nicht ganz wieso man nicht umsteigen sollte? Geschwindigkeit hat sich immens erhöht und der Workflow wird schneller - ein perfektes Update meiner Meinung nach.

    Nun, mit einem Rechner der SSD hat, kann dir das total latte sein - schneller als schnell geht einfach nicht. :D (Zumindest kann das Win8 auf einer SSD nicht die Quantensprünge schaffen, wie auf einer HDD)
    Ein nicht ganz unwesentlicher Grund um nicht umzusteigen: M$ wird dir das OS nicht schenken, du mußt ordentlich berappen. Und warum soll ich etwas hervorragend Funktionierendes (Win7) in die Tonne treten um Geld auszugeben für was Neues, bei dem ich noch nicht weiß, was für Fallstricke da noch so verbaut sind. :wacko:

  • StringRegExp - Hauptwörter finden

    • BugFix
    • 25. April 2012 um 16:30

    Achja, die Umlaute :D
    Müssen wir das Pattern anpassen: "([A-ZÄÖÜ][\wäöüßÄÖÜ]+)"

  • StringRegExp - Hauptwörter finden

    • BugFix
    • 25. April 2012 um 15:43

    Pattern: "([A-ZÄÖÜ]\w+)"
    Wobei dir auf diese Art und Weise alle Nicht-Haupwörter, die aufgrund der Tatsache, dass sie am Satzanfang stehen, mit reinrutschen.
    Aber für deine Fragestellung: nur Wörter, die mit Großbuchstaben beginnen, paßt dieses Pattern.

  • Wer steigt auf Windows 8 um?

    • BugFix
    • 25. April 2012 um 13:27

    Nein, keine Verbesserung zu erwarten.
    Dank SSD ist mein Laptop nach spätestens 10 Sekunden komplett hochgefahren. Also Geschwindigkeit ist nichts, was noch reizen kann.
    Und die anderen Neuerungen muß man sowieso deaktivieren, damit man ein brauchbares OS besitzt.
    Wer das auf ein Tablet ziehen will, da macht es wahrscheinlich Sinn. Wer Tastatur benutzt, braucht es eher nicht.

  • Taptalk-App grösstenteils unbrauchbar

    • BugFix
    • 25. April 2012 um 12:50

    Ich habe "Convo" als App. Funktioniert auch mit anderen Foren - nur AutoIt bleibt leer- Ein weißer Screen.
    Ich vermute der Hund liegt bei WoltLab begraben.

  • Textdatei zeilenweise durchsuchen

    • BugFix
    • 25. April 2012 um 12:42

    He, da tobt ja ein Grundsatzfragen-Krieg. ;)
    Meiner Erfahrung nach sind die Laufzeiten wirklich nicht pauschalisierbar. Mit einer Datei geht die eine Variante, mit der nächsten die andere etwas besser.
    Sollte man allerdings in Minuten-Laufzeiten kommen und man braucht aber eine schnelle Lösung ist vermutlich die Grenze von AutoIt erreicht. - Dann bleibt nur noch der Blick über'n Gartenzaun zu anderen (Skript-) Sprachen.

  • Text in der Zwischenablage formatieren

    • BugFix
    • 25. April 2012 um 12:32

    Prinzipiell ist es egal, du möchtest etwas nach deinem Geschmack anpassen - ist auch völlig OK.

    Aber der Begriff Formatierung beinhaltet ein bestimmtes Textverhalten.
    Ein Zeilenumbruch der hartkodiert wird, dient in Texten zur Absatzmarkierung, da der 'normale' Umbruch ja von selbst an der Grenze des Editierfeldes passiert.
    Du kannst aber deinen Editor auch anweisen am Bildschirmrand (oder an bestimmter Spalten-Position) automatisch umzubrechen. Dann erübrigt sich das zusätzliche Einfügen harter Umbrüche.

  • Autoit GUI bei Focus eines Edit CTRL code ausführen

    • BugFix
    • 25. April 2012 um 10:05

    Einfach mal dasd Hilfe-Bsp. anschauen:
    (leicht umgebaut)

    Spoiler anzeigen
    [autoit]

    #include <GuiEdit.au3>
    #include <WinAPI.au3> ; used for Lo/Hi word
    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>

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

    Global $hGUI, $hEdit

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

    _Example()

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

    Func _Example()
    Local $hInput

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

    ; Create GUI
    $hGUI = GUICreate("Edit Create", 400, 300)
    $hInput = GUICtrlCreateInput('Blub', 10, 10, 380, 20)
    $hEdit = _GUICtrlEdit_Create($hGUI, "", 10, 40, 380, 250)
    GUISetState()

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

    GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")

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

    ; Loop until user exits
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
    GUIDelete()
    EndFunc ;==>_Example2

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

    Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
    #forceref $hWnd, $iMsg
    Local $hWndFrom, $iIDFrom, $iCode, $hWndEdit
    If Not IsHWnd($hEdit) Then $hWndEdit = GUICtrlGetHandle($hEdit)
    $hWndFrom = $ilParam
    $iIDFrom = _WinAPI_LoWord($iwParam)
    $iCode = _WinAPI_HiWord($iwParam)
    Switch $hWndFrom
    Case $hEdit, $hWndEdit
    Switch $iCode
    Case $EN_SETFOCUS ; Sent when an edit control receives the keyboard focus
    WinSetTitle($hGUI, '', '!! Edit-Ctrl hat Fokus erhalten !!')
    Case $EN_KILLFOCUS ; Sent when an edit control loses the keyboard focus
    WinSetTitle($hGUI, '', '!! Edit-Ctrl hat Fokus verloren !!')
    EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_COMMAND

    [/autoit]
  • Text in der Zwischenablage formatieren

    • BugFix
    • 25. April 2012 um 09:21
    Zitat von Slider99

    Immer wenn ich einen Text aus dem Internet in die Zwischenablage kopiere und
    später in eine TXT-Datei hineinkopiere, dann ärgert mich es, dass immer der
    Zeilenumbruch fehlt.


    Das liegt schlicht und einfach daran, dass es keinen Zeilenumbruch gibt. ;)
    Der "Umbruch" liegt doch nicht (zwingend) im Quelltext, sondern wird in deiner Browseransicht generiert (AutoWrap). Je nach Auflösung deines Monitors auch an völlig unterschiedlicher Position.
    Harte Umbrüche sind normalerweise auch in in der Zwischenablage enthalten.

    Wenn du jetzt also dort willkürlich Umbrüche einfügst, ist das eigentlich ein "De-Formatieren". ;)

  • Basic-AutoIt-Object -- Objekte sind auch nur Arrays ;)

    • BugFix
    • 23. April 2012 um 16:05

    - Bugs gefixed
    - Bsp. erweitert um "Überladen"
    akt. Version: v0.2

    AspirinJunkie
    Mit Scripting.Dictionary ist auch ein guter Gedanke. Ich versuche erst mal rein Array-basierend voranzukommen. Aber ich werde es nicht aus dem Auge verlieren, zumal das Auslesen von Objekt im Objekt wesentlich einfach zu handhaben ist als Array im Array.

  • Basic-AutoIt-Object -- Objekte sind auch nur Arrays ;)

    • BugFix
    • 22. April 2012 um 12:45

    Ich hab gerade noch ein paar kleine Bugs entdeckt. Man sollte wirklich mehr am Tage arbeiten als 2 Uhr nachts :D
    Die Änderungen werde ich dann mit einem erweiterten Bsp.-Skript im Laufe des Tages posten.

  • Basic-AutoIt-Object -- Objekte sind auch nur Arrays ;)

    • BugFix
    • 22. April 2012 um 02:14

    Hi,
    nachdem ich mich in Lua etwas mehr mit Objekten beschäftigt habe, ist mir erst mal aufgefallen, dass es zur Objektarbeit gar keiner Objekte bedarf. ;)
    Lua bildet alle Objekte als Arrays ab.
    Was in Lua geht, müßte man doch auch in AutoIt schaffen. Ein Wermutstropfen ist natürlich die Notation. Nur mit den reinen AutoIt-Funktionen kann ich auf meine Methoden und Eigenschaften nicht objektüblich mit Objekt.property zugreifen.
    Das hier vorgestellte ist wirklich nur ein Basis-Modell zur Objekt-Orientierten-Programmierung. Aber für einen Tag Arbeit ist es doch schon recht gelungen.
    Ich stelle zum Einen das Entwicklungsskript ein, da könnt ihr jeden Schritt nachvollziehen.
    Zum Anderen hänge ich die (inzwischen noch etwas überarbeiteten) Funktionen aus dem Entwicklungsskript als UDF + Bsp-Skript an.

    Das Skript ist bis jetzt eigentlich mehr eine Spielerei und kann keinesfalls gegen AutoItObject anstinken (das habe ich auch gar nicht vor).
    Ich wollte mich etwas mehr mit Objekten beschäftigen und habe eine Möglichkeit gesucht diese halbwegs komfortabel über Arrays abzubilden. Wobei mir die Vererbung wichtig war - und das funktioniert.
    Vielleicht findet auch jemand Gefallen daran und möchte es weiterentwickeln, Möglichkeiten gibt es da noch einige. ;)

    Also dann Viel Spaß damit.

    BAO-Entwicklung
    [autoit]

    #Region - TimeStamp
    ; 2012-04-22 01:32:17
    #EndRegion - TimeStamp

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

    #Include <Array.au3>

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

    ;====================================================================================================
    ; BAO = Basic-AutoIt-Object ( oder BugFix-AutoIt-Object ;=) )
    ;====================================================================================================
    ; FUNKTIONEN
    ; _BAO_Class_Create Erstellt eine Objekt-Klasse
    ; _BAO_Class_MethodSet Registriert eine Methode für die Klasse
    ; _BAO_Class_PropSet Registriert oder ändert eine Property der Klasse
    ; _BAO_Class_ObjCreate Erstellt ein Klassen-Objekt
    ; _BAO_Class_ObjMethodSet Registriert eine Methode für ein Klassen-Objekt
    ; _BAO_Class_ObjPropSet Registriert oder ändert eine Property eines Klassen-Objektes
    ; _BAO_Class_ObjGet Abfragen von Informationen der Klasse und/oder des Klassen-Objektes
    ; _BAO_Class_ObjMethodCall Aufrufen von Methoden
    ;====================================================================================================

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

    ;====================================================================================================
    ; KLASSEN
    ;====================================================================================================
    ; Funktion zum Erstellen einer Klasse
    Func _BAO_Class_Create($_sClass, $_sIndexClass='self')
    Local Static $aClass_MethodsTmp, $aClass_PropsTmp, $sClassTmp
    Local $aClass[4] ; == Array zum Speichern der Mitglieder dieser Klasse (KlassenObjekte), [Klassenname, Array-Methoden, Array-Properties, Array-KlassenObjekte]
    If $_sIndexClass = 'self' Then
    Local $aClass_Methods[1] = [0] ; == Array zur Aufnahme der Methoden, Erstellen mit Anzahl der akt. Methoden als erstem Element
    Local $aClass_Props[1][2] = [[0]] ; == 2D-Array zur Aufnahme der Properties, Erstellen mit Anzahl der akt. Properties als erstem Element, [['property','value']]
    Local $aMembers[1] = [0]
    If IsArray($aClass_MethodsTmp) Then $aClass_Methods = $aClass_MethodsTmp
    If IsArray($aClass_PropsTmp) Then $aClass_Props = $aClass_PropsTmp
    If $sClassTmp <> '' Then $_sClass = $sClassTmp
    $aClass[0] = $_sClass
    $aClass[1] = $aClass_Methods
    $aClass[2] = $aClass_Props
    $aClass[3] = $aMembers
    $aClass_MethodsTmp = ''
    $aClass_PropsTmp = ''
    $sClassTmp = ''
    Return $aClass
    Else
    $sClassTmp = $_sClass ; == zu verwendender KlassenObjekt-Name
    Local $aTmp = Execute('$' & $_sIndexClass) ; == alle zu vererbenden Informationen aus der "Index-Klasse" abfragen (Methoden und Eigenschaften)
    $aClass_MethodsTmp = $aTmp[1]
    $aClass_PropsTmp = $aTmp[2]
    Return _BAO_Class_Create($_sClass)
    EndIf
    EndFunc

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

    ; == die Klasse "Programmierer" erstellen als Array mit Elementen für Klassennamen, Array Methoden, Array Properties, Array Member
    Global $Programmierer = _BAO_Class_Create('Programmierer') ; == WICHTIG! Variablenname == '$' & 'Klassenname'

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

    ;====================================================================================================
    ; METHODEN
    ;====================================================================================================
    ; == Methoden für diese Klasse erstellen

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

    ;**************************************************************************************************************
    ; == HINWEIS: Als erster Parameter sind zwingend alle Methoden mit "$_self" zu versehen.
    ; == In der Funktion zum Aufruf der Methode wird an diesen Paramter das aufrufende Objekt übergeben.
    ; == Somit kann in den Methoden auf die Properties des KlassenObjektes zugegriffen werden.
    ; == ZUSÄTZLICHE Parameter werden von der aufrufenden Funktion IMMER als Array übergeben!!
    ;**************************************************************************************************************

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

    ; == unser Programmierer benötigt natürlich Methoden, er sollte zwei Dinge können: Kaffee trinken und Programmieren ;)
    Func DrinkCoffee($_self)
    ConsoleWrite('-> ' & _BAO_Class_ObjGet($_self, 'name') & ' schlürft Kaffee:' & @CRLF) ; Name des KlassenObjektes aus dem übergebenen Objekt abfragen
    ConsoleWrite('>> Hm… lecker Kaffe!' & @CRLF)
    EndFunc

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

    Func DoSomething($_self)
    Local Static $iDone = 0
    $iDone += 1
    ConsoleWrite('-> ' & _BAO_Class_ObjGet($_self, 'name') & ' tut etwas:' & @CRLF)
    If $iDone = 2 Then
    $iDone = 0
    ConsoleWrite(">> Man kann's auch übertreiben, erst mal Pause machen!" & @CRLF)
    _BAO_Class_ObjMethodCall($_self, 'DrinkCoffee')
    Else
    ConsoleWrite('>> *programmier*' & @CRLF)
    EndIf
    EndFunc
    ; == noch sind die Methoden "herrenlos", wir müssen sie jetzt mit der Klasse "Programmierer" verknüpfen

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

    ; == dazu bauen wir uns eine Funktion, die die Methoden setzt:
    Func _BAO_Class_MethodSet(ByRef $_aClass, $_sMethod) ; == Parameter: Klassen-Array, Methode als String
    Local $aMethods = $_aClass[1] ; == das Methoden-Array zum Bearbeiten aus dem Klassen-Array auslesen
    $aMethods[0] += 1 ; == Anzahl Methoden um 1 erhöhen
    ReDim $aMethods[$aMethods[0]+1] ; == Array vergrößern
    $aMethods[$aMethods[0]] = $_sMethod ; == Methode eintragen
    $_aClass[1] = $aMethods ; == bearbeitetes Methoden-Array zurückschreiben in Klassen-Array
    EndFunc

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

    ; == nun weisen wir mit dieser Funktion die erstellten Methoden der Klasse "Programmierer" zu
    _BAO_Class_MethodSet($Programmierer, 'DrinkCoffee')
    _BAO_Class_MethodSet($Programmierer, 'DoSomething')

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

    ;====================================================================================================
    ; PROPERTIES
    ;====================================================================================================
    ; == Objekte haben neben den Methoden auch Eigenschaften (Properties)
    ; == Der Unterschied sollte klar sein: Methoden sind ausführbare Funktionen, Properties sind Werte die gelesen/geschrieben werden können
    ; == Nun wollen wir für unsere Klasse "Programmierer" allgemeingültige Eigenschaften setzen, wahlweise gleich mit Wertzuweisung
    Func _BAO_Class_PropSet(ByRef $_aClass, $_sProp, $_vProp='') ; == Parameter: Klassen-Array, Eigenschaft als String, [optional] Wert der Eigenschaft
    Local $aProps = $_aClass[2] ; == das Properties-Array zum Bearbeiten aus dem Klassen-Array auslesen
    If $aProps[0][0] > 0 Then ; == suchen ob Property vorhanden ==> dann aktualisieren
    For $i = 1 To $aProps[0][0]
    If $aProps[$i][0] = $_sProp Then
    $aProps[$i][1] = $_vProp
    $_aClass[2] = $aProps
    Return
    EndIf
    Next
    EndIf
    $aProps[0][0] += 1 ; == Anzahl Properties um 1 erhöhen
    ReDim $aProps[$aProps[0][0]+1][2] ; == Array vergrößern
    $aProps[$aProps[0][0]][0] = $_sProp ; == Eigenschaft eintragen
    $aProps[$aProps[0][0]][1] = $_vProp ; == Wert eintragen
    $_aClass[2] = $aProps ; == bearbeitetes Properties-Array zurückschreiben in Klassen-Array
    EndFunc

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

    ; == Als Eigenschaften der Klasse Programmierer legen wir jetzt fest:
    _BAO_Class_PropSet($Programmierer, 'Arbeitsintensität', 'hoch')
    _BAO_Class_PropSet($Programmierer, 'Kaffee-Konsum', 'extrem')

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

    ;====================================================================================================
    ; KLASSENOBJEKT
    ;====================================================================================================
    ; == jetzt erstellen wir ein Klassenobjekt, also einen Programmierer, der die Eigenschaften der Klasse "Programmierer" besitzt
    Func _BAO_Class_ObjCreate(ByRef $_aClass, $_sName) ; == Parameter: Klassen-Array, Name des Klassen-Objektes als String
    Local $aClassObj_Methods[1] = [0] ; == Array zur Aufnahme der Methoden erstellen mit Anzahl der akt. Methoden als erstem Element
    Local $aClassObj_Props[1][2] = [[0]] ; == 2D-Array zur Aufnahme der Properties erstellen mit Anzahl der akt. Properties als erstem Element, [['property','value']]
    Local $objClass[4] = [$_sName, $_aClass[0], $aClassObj_Methods, $aClassObj_Props] ; == [Objektname, Klassenname, Array Objekt-Methoden, Array Objekt-Properties]
    Local $aMembers = $_aClass[3] ; == neues KlassenObjekt unter Members in der Klasse registrieren
    $aMembers[0] += 1
    ReDim $aMembers[$aMembers[0]+1]
    $aMembers[$aMembers[0]] = $_sName
    $_aClass[3] = $aMembers
    Return $objClass
    EndFunc

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

    Global $Klaus = _BAO_Class_ObjCreate($Programmierer, 'Klaus')
    Global $Peter = _BAO_Class_ObjCreate($Programmierer, 'Peter')

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

    ; == Klaus und Peter sind jetzt "Objekte" mit den
    ; == Lokalen Eigenschaften: "name" und "class" und den
    ; == Globalen Methoden der Klasse: "DrinkCoffee" und "DoSomething"

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

    ;====================================================================================================

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

    ; Wir wollen natürlich jetzt auch für das einzelne Klassenobjekt individuelle Methoden und Properties setzen können
    Func _BAO_Class_ObjMethodSet(ByRef $_objClass, $_sMethod) ; == Parameter: Klassen-Objekt, Methode als String
    Local $aMethods = $_objClass[2] ; == das Methoden-Array zum Bearbeiten aus dem KlassenObjekt-Array auslesen
    $aMethods[0] += 1 ; == Anzahl Methoden um 1 erhöhen
    ReDim $aMethods[$aMethods[0]+1] ; == Array vergrößern
    $aMethods[$aMethods[0]] = $_sMethod ; == Methode eintragen
    $_objClass[2] = $aMethods ; == bearbeitetes Methoden-Array zurückschreiben in KlassenObjekt-Array
    EndFunc

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

    Func _BAO_Class_ObjPropSet(ByRef $_objClass, $_sProp, $_vProp='') ; == Parameter: KlassenObjekt, Eigenschaft als String, [optional] Wert der Eigenschaft
    Local $aProps = $_objClass[3] ; == das Properties-Array zum Bearbeiten aus dem KlassenObjekt-Array auslesen
    If $aProps[0][0] > 0 Then ; == suchen ob Property vorhanden ==> dann aktualisieren
    For $i = 1 To $aProps[0][0]
    If $aProps[$i][0] = $_sProp Then
    $aProps[$i][1] = $_vProp
    $_objClass[3] = $aProps
    Return
    EndIf
    Next
    EndIf
    $aProps[0][0] += 1 ; == Anzahl Properties um 1 erhöhen
    ReDim $aProps[$aProps[0][0]+1][2] ; == Array vergrößern
    $aProps[$aProps[0][0]][0] = $_sProp ; == Eigenschaft eintragen
    $aProps[$aProps[0][0]][1] = $_vProp ; == Wert eintragen
    $_objClass[3] = $aProps ; == bearbeitetes Properties-Array zurückschreiben in KlassenObjekt-Array
    EndFunc

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

    ; == Wir erstellen nun eine Methode, die nur einer unserer Programmierer als Lokale Methode zugewiesen bekommt
    Func JustABreake($_self)
    ConsoleWrite('-> Anordnung von: ' & _BAO_Class_ObjGet($_self, 'name') & @CRLF)
    ConsoleWrite('!> Jetzt ist PAUSE!' & @CRLF)
    EndFunc

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

    ; == Diese Methode darf nur Klaus ausführen
    _BAO_Class_ObjMethodSet($Klaus, 'JustABreake')

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

    ; == Und nun weisen wir den beiden noch ein paar individuelle Eigenschaften zu
    _BAO_Class_ObjPropSet($Klaus, 'Position', 'Chef')
    _BAO_Class_ObjPropSet($Klaus, 'Gehalt', 4500)
    _BAO_Class_ObjPropSet($Peter, 'Hobby', 'Nerd')
    _BAO_Class_ObjPropSet($Peter, 'Freundin', 'keine')

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

    ;====================================================================================================

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

    ; == Wäre natürlich schick, wenn man diese Informationen abfragen kann, also brauchen wir eine Funktion dafür
    ; == Wobei wir jetzt aufpassen müssen, da es sowohl Lokale (nur für das einzeln Klassenobjekt gültige) als auch Globale (für alle Objekte der Klasse gültige) Eigenschaften und Methoden geben kann.
    ; == Priorität haben also Lokale Einträge, sollte dort nichts gefunden werden, wird auf Globale Einträge geprüft.
    ; == Parameter $_sWhat:
    ; == "about" gibt alle vorhandenen Informationen zum KlassenObjekt aus als 2D-Array: [[name], [class], [Lokale_Meth,..,..], [Globale_Meth,..,..], [Lokale_Props,..,..], [Globale_Props,..,..]]
    ; == "count" gibt die Anzahl der Mitglieder der Klasse zurück
    ; == "members" gibt ein Array mit den Mitgliedern der Klasse zurück
    ; == "name" gibt den Name des Klassenobjektes zurück
    ; == "class" gibt den Name der Klasse zurück
    ; == "methods_l" gibt ein Array aller Lokalen Methoden zurück
    ; == "methods_g" gibt ein Array aller Globalen Methoden zurück
    ; == "props_l" gibt ein 2D-Array aller Lokalen Properties zurück
    ; == "props_g" gibt ein 2D-Array aller Globalen Properties zurück
    ; == alles_andere Abfrage bezieht sich auf eine einzelne Property

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

    Func _BAO_Class_ObjGet($_objClass, $_sWhat, $_sAlternative=-1) ; == Parameter: Klassen-Objekt, Abfragebegriff als String, "$_sAlternative": bei Abfrage einer Propertie - wenn nicht gefunden wird dieser Alternativwert zurückgegeben (Standard: -1)
    Local $aClass = Execute('$' & Execute('$_objClass[1]')); == Zugriff auf das Klassenarray über den im Klassenobjekt hinterlegten Klassennamen [name, Array-Meth, Arr-Props, Array-Member]
    Local $vRet, $aProps, $fFound = False, $aAbout[6][2], $aTmp
    Switch $_sWhat ; == was wird abgefragt
    Case 'about' ; == Alle Informationen zum KlassenObjekt abfragen
    $aAbout[0][0] = $_objClass[0] ; == Objekt-Name
    $aAbout[1][0] = $_objClass[1] ; == Klassen-Name
    $aTmp = $_objClass[2] ; == Lokale Methoden
    If $aTmp[0] > 0 Then
    If UBound($aAbout,2) < $aTmp[0] Then ReDim $aAbout[6][$aTmp[0]]
    For $i = 1 To $aTmp[0]
    $aAbout[2][$i-1] = $aTmp[$i]
    Next
    EndIf
    $aTmp = $aClass[1] ; == Globale Methoden
    If $aTmp[0] > 0 Then
    If UBound($aAbout,2) < $aTmp[0] Then ReDim $aAbout[6][$aTmp[0]]
    For $i = 1 To $aTmp[0]
    $aAbout[3][$i-1] = $aTmp[$i]
    Next
    EndIf
    $aTmp = $_objClass[3] ; == Lokale Properties
    If $aTmp[0][0] > 0 Then
    If UBound($aAbout,2) < $aTmp[0][0] Then ReDim $aAbout[6][$aTmp[0][0]]
    For $i = 1 To $aTmp[0][0]
    $aAbout[4][$i-1] = $aTmp[$i][0]
    Next
    EndIf
    $aTmp = $aClass[2] ; == Globale Properties
    If $aTmp[0][0] > 0 Then
    If UBound($aAbout,2) < $aTmp[0][0] Then ReDim $aAbout[6][$aTmp[0][0]]
    For $i = 1 To $aTmp[0][0]
    $aAbout[5][$i-1] = $aTmp[$i][0]
    Next
    EndIf
    $vRet = $aAbout
    Case 'count' ; == Anzahl der Mitglieder der Klasse ausgeben
    $aTmp = $aClass[3]
    $vRet = $aTmp[0]
    Case 'members' ; == Mitglieder der Klasse ausgeben (Array)
    $aTmp = $aClass[3]
    $vRet = $aTmp
    Case 'name' ; == Name des KlassenObjektes ausgeben
    $vRet = $_objClass[0]
    Case 'class' ; == Name der Klasse ausgeben
    $vRet = $_objClass[1]
    Case 'methods_g' ; == das Methoden-Array aus dem Klassen-Array auslesen
    $vRet = $aClass[1]
    Case 'props_g' ; == das Properties-Array aus dem Klassen-Array auslesen
    $vRet = $aClass[2]
    Case 'methods_l' ; == das Methoden-Array aus dem KlassenObjekt-Array auslesen
    $vRet = $_objClass[2]
    Case 'props_l' ; == das Properties-Array aus dem KlassenObjekt-Array auslesen
    $vRet = $_objClass[3]
    Case Else ; == alles andere ist eine Abfrage zu einer einzelnen Eigenschaft
    $aProps = $_objClass[3] ; == Priorität beachten, zuerst lokal abfragen
    If $aProps[0][0] > 0 Then
    For $i = 1 To $aProps[0][0]
    If $aProps[$i][0] = $_sWhat Then
    $vRet = $aProps[$i][1]
    $fFound = True
    ExitLoop
    EndIf
    Next
    EndIf
    If Not $fFound Then
    $aProps = $aClass[2] ; == danach global abfragen
    If $aProps[0][0] > 0 Then
    For $i = 1 To $aProps[0][0]
    If $aProps[$i][0] = $_sWhat Then
    $vRet = $aProps[$i][1]
    $fFound = True
    ExitLoop
    EndIf
    Next
    EndIf
    If Not $fFound Then $vRet = $_sAlternative ; == abgefragte Property gibt es nicht
    EndIf
    EndSwitch
    Return $vRet
    EndFunc

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

    ; == Dann lassen wir uns doch mal die Anzahl der Mitglieder der Klasse von Klaus (also "Programmierer") ausgeben
    ; == Wobei wir hier direkt das KlassenObjekt (also Klaus oder Peter) zur Abfrage verwenden
    ConsoleWrite('Anzahl Mitglieder der Klasse "' & _BAO_Class_ObjGet($Klaus, 'class') & '": ' & _BAO_Class_ObjGet($Klaus, 'count') & @CRLF)
    ; == das stimmt
    ; == und nun wollen wir alle Mitglieder der Klasse auslesen, laut Definition erhalten wir ein Array
    $aMembers = _BAO_Class_ObjGet($Klaus, 'members')
    If $aMembers[0] > 0 Then
    ConsoleWrite('Mitglieder der Klasse "' & _BAO_Class_ObjGet($Klaus, 'class') & '": ' & @CRLF)
    For $i = 1 To $aMembers[0]
    ConsoleWrite(@TAB & $aMembers[$i] & @CRLF)
    Next
    EndIf

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

    ; == Nun schauen wir uns mal zuerst die Übersicht zu Klaus und Peter an
    $aAbout = _BAO_Class_ObjGet($Klaus, 'about')
    _ArrayDisplay($aAbout)
    $aAbout = _BAO_Class_ObjGet($Peter, 'about')
    _ArrayDisplay($aAbout)

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

    ; == Jetzt prüfen wir mal, ob die Zuordnung der lokalen und globalen Properties stimmt.
    ; == 'Kaffee-Konsum' ist Global und muss bei beiden vorhanden sein:
    ConsoleWrite('Kaffee-Konsum von ' & _BAO_Class_ObjGet($Klaus, 'name') & ': ' & _BAO_Class_ObjGet($Klaus, 'Kaffee-Konsum') & @CRLF)
    ConsoleWrite('Kaffee-Konsum von ' & _BAO_Class_ObjGet($Peter, 'name') & ': ' & _BAO_Class_ObjGet($Peter, 'Kaffee-Konsum') & @CRLF)
    ; == OK, das passt schon mal

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

    ; == Nun fragen wir mal das Gehalt ab, dürfte ja nur bei Klaus vorhanden sein. Bei Peter muß der Standardwert (-1) zurückgegeben werden
    ConsoleWrite('Gehalt von ' & _BAO_Class_ObjGet($Klaus, 'name') & ': ' & _BAO_Class_ObjGet($Klaus, 'Gehalt') & @CRLF)
    ConsoleWrite('Gehalt von ' & _BAO_Class_ObjGet($Peter, 'name') & ': ' & _BAO_Class_ObjGet($Peter, 'Gehalt') & @CRLF)
    ; == Und auch das tut, was es soll.

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

    ; == noch für Hobby, das nur bei Peter sein darf
    ConsoleWrite('Hobby von ' & _BAO_Class_ObjGet($Klaus, 'name') & ': ' & _BAO_Class_ObjGet($Klaus, 'Hobby') & @CRLF)
    ConsoleWrite('Hobby von ' & _BAO_Class_ObjGet($Peter, 'name') & ': ' & _BAO_Class_ObjGet($Peter, 'Hobby') & @CRLF)
    ; == Auch, wie gewünscht.

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

    ; == Jetzt wollen wir mal eine Property ändern
    _BAO_Class_ObjPropSet($Peter, 'Hobby', 'Schachspiel')
    ConsoleWrite('Hobby von ' & _BAO_Class_ObjGet($Peter, 'name') & ': ' & _BAO_Class_ObjGet($Peter, 'Hobby') & @CRLF)
    ; == auch das ist OK

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

    ; == Nun noch mal alle Lokalen Properties mit Werten von Klaus und Peter jeweils auf einen Blick
    $aProps = _BAO_Class_ObjGet($Klaus, 'props_l')
    _ArrayDisplay($aProps)
    $aProps = _BAO_Class_ObjGet($Peter, 'props_l')
    _ArrayDisplay($aProps)

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

    ;====================================================================================================
    ; Methoden aufrufen
    ; == Nun müssen wir nur noch die Methoden aufrufen und auch hierbei die Gültigkeit Lokaler und Globaler Methoden prüfen

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

    ; == Wenn die Methode mehrere Parameter erfordert, diese als Array übergeben; ein Einzelparameter braucht nicht in ein Array gepackt werden
    ; == als erster Parameter wird IMMER das Klassenobjekt selbst mit übergeben, somit kann in der Methode auf Properties dieses Objekts zugegriffen werden
    Func _BAO_Class_ObjMethodCall($_objClass, $_sMethod, $_vParam='')
    Local $aParam[1], $fFound = False
    If Not IsArray($_vParam) Then
    $aParam[0] = $_vParam
    Else
    $aParam = $_vParam
    EndIf
    Local $aMethods = $_objClass[2] ; == zuerst bei den Lokalen Methoden nachschauen
    If $aMethods[0] > 0 Then
    For $i = 1 To $aMethods[0]
    If $aMethods[$i] = $_sMethod Then
    $fFound = True
    ExitLoop
    EndIf
    Next
    EndIf
    If Not $fFound Then ; == dann bei den Globalen
    Local $aClass = Execute('$' & Execute('$_objClass[1]'))
    $aMethods = $aClass[1]
    If $aMethods[0] > 0 Then
    For $i = 1 To $aMethods[0]
    If $aMethods[$i] = $_sMethod Then
    $fFound = True
    ExitLoop
    EndIf
    Next
    EndIf
    EndIf
    If Not $fFound Then Return -1 ; == Aufruf enthält keine gültige Methode
    If $_vParam = '' Then
    Return Call($_sMethod, $_objClass) ; == evtl. Rückgabewert der Funktion wird ausgegeben
    Else
    Return Call($_sMethod, $_objClass, $aParam) ; == evtl. Rückgabewert der Funktion wird ausgegeben
    EndIf
    EndFunc

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

    ; == Also jetzt das Wichtigste im Programmierer-Alltag: Kaffee Trinken :D
    ConsoleWrite(@CRLF & 'Klaus soll Kaffee trinken:' & @CRLF)
    _BAO_Class_ObjMethodCall($Klaus, 'DrinkCoffee')
    ; == Na, das klappt doch prima

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

    ; == Und nun Arbeiten, am Besten wir sagen es ihm 2-mal. ;)
    ConsoleWrite(@CRLF & 'Klaus soll Arbeiten:' & @CRLF)
    _BAO_Class_ObjMethodCall($Klaus, 'DoSomething')
    _BAO_Class_ObjMethodCall($Klaus, 'DoSomething')
    ; == Tja, so reagieren die Jungs.

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

    ; == Wir hatten ja eine Lokale Methode für Klaus erstellt, das wollen wir nun testen
    ConsoleWrite(@CRLF & 'Klaus darf Pause ansagen:' & @CRLF)
    _BAO_Class_ObjMethodCall($Klaus, 'JustABreake')
    ; == Das funktioniert, wie erwartet.

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

    ; == Nun wollen wir testen, ob Peter darauf Zugriff hat. Das darf er ja nicht. Der Aufruf muß in diesem Fall "-1" zurückgeben.
    ConsoleWrite(@CRLF & 'Peter versucht eine Pause anzusagen:' & @CRLF)
    ConsoleWrite( _BAO_Class_ObjMethodCall($Peter, 'JustABreake') & @CRLF)
    ; == Und auch das klappt prima.

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

    ;====================================================================================================
    ; VERERBUNG
    ;====================================================================================================
    ; == Bis hierher waren das mehr oder weniger parametrisierte Funktionsaufrufe. Allerdings übersichtlicher, als wenn man nur die Funktionen ohne das Objekt-Modell nutzt.
    ; == Ein Wesenspunkt von Objekten ist die Vererbung. D.h., wenn ich ein Objekt als Abkömmling eines existierenden Objekts erstelle, besitzt dieses von vornherein dieselben
    ; == Methoden und Eigenschaften, wie das "Elternteil".

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

    ; == Wir haben z.Zt. eine Klasse "Programmierer"
    ; == Methoden: "DrinkCoffee" und "DoSomething"
    ; == Properties: "Arbeitsintensität" und "Kaffee-Konsum"

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

    ; == Jetzt erstellen wir eine neue Klasse "Codierer". Bei der Erstellung geben wir als Index die Klasse an, von der geerbt werden soll.
    Global $Codierer = _BAO_Class_Create('Codierer', 'Programmierer')

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

    ; == Wir erstellen gleich ein Objekt dieser Klasse und testen, ob es auf die ererbten Methoden zugreifen kann
    Global $Maria = _BAO_Class_ObjCreate($Codierer, 'Maria')

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

    ConsoleWrite(@CRLF & 'Maria soll Kaffee trinken:' & @CRLF)
    _BAO_Class_ObjMethodCall($Maria, 'DrinkCoffee')
    ConsoleWrite(@CRLF & 'Maria soll arbeiten:' & @CRLF)
    _BAO_Class_ObjMethodCall($Maria, 'DoSomething')
    ; == Das klappt, Maria als Mitglied der Klasse "Codierer" hat die Methoden von "Programmierer" geerbt

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

    ; == Nun noch die Prperties überprüfen
    $aProps = _BAO_Class_ObjGet($Maria, 'props_g')
    _ArrayDisplay($aProps, 'Props Maria')
    ; == Auch hier sind alle Eigenschaften vorhanden

    [/autoit]
    BasicAutoItObjekt(v0.2)
    [autoit]

    #Region - TimeStamp
    ; 2012-04-23 15:48:35 v 0.2
    #EndRegion - TimeStamp
    #include-once
    #include <Array.au3>

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

    ;====================================================================================================
    ; BAO = Basic-AutoIt-Object [ oder: BugFix-AutoIt-Object ;=) ]
    ;====================================================================================================
    ; FUNKTIONEN
    ; _BAO_Class_Create Erstellt eine Objekt-Klasse
    ; _BAO_Class_MethodSet Registriert eine Methode für die Klasse oder löscht sie
    ; _BAO_Class_PropSet Registriert, ändert oder löscht eine Property der Klasse
    ; _BAO_Class_ObjCreate Erstellt ein Klassen-Objekt oder löscht es aus der Klasse
    ; _BAO_Class_ObjMethodSet Registriert eine Methode für ein Klassen-Objekt oder löscht sie
    ; _BAO_Class_ObjPropSet Registriert, ändert oder löscht eine Property eines Klassen-Objektes
    ; _BAO_Class_ObjGet Abfragen von Informationen der Klasse und/oder des Klassen-Objektes
    ; _BAO_Class_ObjMethodCall Aufrufen von Methoden
    ;====================================================================================================

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

    ;===============================================================================
    ; Function Name....: _BAO_Class_Create
    ; Description......: Erstellt eine Objekt-Klasse
    ; Parameter(s).....: $_sClass Name der Klasse, die erstellt werden soll
    ; ........optional.: $_sIndexClass Name der Klasse, von der geerbt werden soll (Standard: 'self' = keine Vererbung)
    ; Requirement(s)...: Die Variable zum Aufnehmen des Objektes MUSS ZWINGEND identisch mit dem Klassennamen sein! ("$" & "Klassenname")
    ; Return Value(s)..: Array, das die Objekt-Klasse repräsentiert
    ; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
    ;===============================================================================
    Func _BAO_Class_Create($_sClass, $_sIndexClass='self')
    Local Static $aClass_MethodsTmp, $aClass_PropsTmp, $sClassTmp
    Local $aClass[4] ; == Array zum Speichern der Mitglieder der Klassenmerkmale: [Klassenname, Array-Methoden, Array-Properties, Array-KlassenObjekte]
    If $_sIndexClass = 'self' Then
    Local $aClass_Methods[1] = [0] ; == Array zur Aufnahme der Methoden, Erstellen mit Anzahl der akt. Methoden als erstem Element
    Local $aClass_Props[1][2] = [[0]] ; == 2D-Array zur Aufnahme der Properties, Erstellen mit Anzahl der akt. Properties als erstem Element, [['property','value']]
    Local $aMembers[1] = [0]
    If IsArray($aClass_MethodsTmp) Then $aClass_Methods = $aClass_MethodsTmp
    If IsArray($aClass_PropsTmp) Then $aClass_Props = $aClass_PropsTmp
    If $sClassTmp <> '' Then $_sClass = $sClassTmp
    $aClass[0] = $_sClass
    $aClass[1] = $aClass_Methods
    $aClass[2] = $aClass_Props
    $aClass[3] = $aMembers
    $aClass_MethodsTmp = ''
    $aClass_PropsTmp = ''
    $sClassTmp = ''
    Return $aClass
    Else
    $sClassTmp = $_sClass ; == zu verwendender KlassenObjekt-Name
    Local $aTmp = Execute('$' & $_sIndexClass) ; == alle zu vererbenden Informationen aus der "Index-Klasse" abfragen (Methoden und Eigenschaften)
    $aClass_MethodsTmp = $aTmp[1]
    $aClass_PropsTmp = $aTmp[2]
    Return _BAO_Class_Create($_sClass)
    EndIf
    EndFunc ;==>_BAO_Class_Create

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

    ;===============================================================================
    ; Function Name....: _BAO_Class_MethodSet
    ; Description......: weist einer Klasse eine Methode oder löscht sie, gültig für alle Mitglieder der Klasse
    ; Parameter(s).....: $_aClass die mit "_BAO_Class_Create" erstellte Klasse
    ; .................: $_sMethod Name der Methode
    ;*********************************************************************************************************
    ; HINWEIS: Als erster Parameter sind ZWINGEND alle Methoden mit "$_self" zu versehen.
    ; In der Funktion zum Aufruf der Methode wird an diesen Paramter das aufrufende Objekt übergeben.
    ; Somit kann in den Methoden auf die Properties des KlassenObjektes zugegriffen werden.
    ; ZUSÄTZLICHE Parameter werden von der aufrufenden Funktion ("_BAO_Class_ObjMethodCall")
    ; IMMER als Array übergeben!!
    ;*********************************************************************************************************
    ; ........optional.: $iDelete "1" - Löscht die Methode aus der Klasse (Standard: 0, nicht Löschen)
    ; Return Value(s)..: Erfolg nichts
    ; .................: Fehler -1 set @error=1 - Methode kann nicht zugewiesen werden, existiert bereits
    ; .................: @error=2 - zu Löschende Methode ist nicht vorhanden
    ; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
    ;===============================================================================
    Func _BAO_Class_MethodSet(ByRef $_aClass, $_sMethod, $iDelete=0) ; == Parameter: Klassen-Array, Methode als String
    Local $aMethods = $_aClass[1], $fFound = False ; == das Methoden-Array zum Bearbeiten aus dem Klassen-Array auslesen
    If $aMethods[0] > 0 Then ; == suchen ob Methode vorhanden ==> dann Löschen
    For $i = 1 To $aMethods[0]
    If $aMethods[$i] = $_sMethod Then
    $fFound = True
    If $iDelete = 1 Then
    _ArrayDelete($aMethods, $i)
    $aMethods[0] -= 1
    $_aClass[1] = $aMethods
    Return
    Else
    Return SetError(1,0,-1)
    EndIf
    ExitLoop
    EndIf
    Next
    If $iDelete = 1 And Not $fFound Then Return SetError(2,0,-1)
    EndIf
    $aMethods[0] += 1 ; == Anzahl Methoden um 1 erhöhen
    ReDim $aMethods[$aMethods[0]+1] ; == Array vergrößern
    $aMethods[$aMethods[0]] = $_sMethod ; == Methode eintragen
    $_aClass[1] = $aMethods ; == bearbeitetes Methoden-Array zurückschreiben in Klassen-Array
    EndFunc ;==>_BAO_Class_MethodSet

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

    ;===============================================================================
    ; Function Name....: _BAO_Class_PropSet
    ; Description......: Properties der Klasse Erstellen und/oder Ändern, Löschen, gültig für alle Mitglieder dieser Klasse
    ; Parameter(s).....: $_aClass die mit "_BAO_Class_Create" erstellte Klasse
    ; .................: $_sProp Name der Property
    ; ........optional.: $_vProp Wert der Property
    ; ........optional.: $iDelete "1" - Löscht die Property aus der Klasse (Standard: 0, nicht Löschen)
    ; Return Value(s)..: Erfolg nichts
    ; .................: Fehler -1 set @error=1 - zu Löschende Property ist nicht vorhanden
    ; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
    ;===============================================================================
    Func _BAO_Class_PropSet(ByRef $_aClass, $_sProp, $_vProp='', $iDelete=0) ; == Parameter: Klassen-Array, Eigenschaft als String, [optional] Wert der Eigenschaft
    Local $aProps = $_aClass[2], $fFound = False ; == das Properties-Array zum Bearbeiten aus dem Klassen-Array auslesen
    If $aProps[0][0] > 0 Then ; == suchen ob Property vorhanden ==> dann Aktualisieren od. Löschen
    For $i = 1 To $aProps[0][0]
    If $aProps[$i][0] = $_sProp Then
    $fFound = True
    If $iDelete = 1 Then
    _ArrayDelete($aProps, $i)
    $aProps[0][0] -= 1
    Else
    $aProps[$i][1] = $_vProp
    EndIf
    ExitLoop
    EndIf
    Next
    If $iDelete = 1 And Not $fFound Then Return SetError(1,0,-1)
    If $fFound Then
    $_aClass[2] = $aProps
    Return
    EndIf
    EndIf
    $aProps[0][0] += 1 ; == Anzahl Properties um 1 erhöhen
    ReDim $aProps[$aProps[0][0]+1][2] ; == Array vergrößern
    $aProps[$aProps[0][0]][0] = $_sProp ; == Eigenschaft eintragen
    $aProps[$aProps[0][0]][1] = $_vProp ; == Wert eintragen
    $_aClass[2] = $aProps ; == bearbeitetes Properties-Array zurückschreiben in Klassen-Array
    EndFunc ;==>_BAO_Class_PropSet

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

    ;===============================================================================
    ; Function Name....: _BAO_Class_ObjCreate
    ; Description......: Erstellt ein Objekt einer Klasse oder löscht es aus der Klasse
    ; Parameter(s).....: $_aClass die mit "_BAO_Class_Create" erstellte Klasse
    ; .................: $_sName Name des KlassenObjektes
    ; ........optional.: $iDelete "1" - Löscht das Objekt aus der Klasse (Standard: 0, nicht Löschen)
    ; Requirement(s)...: Die Variable zum Aufnehmen des KlassenObjektes MUSS ZWINGEND identisch mit dem KlassenObjekt-Namen sein! ("$" & "KlassenObjekt-Name")
    ; Return Value(s)..: Erfolg Array, das das KlassenObjekt repräsentiert
    ; .................: Fehler -1 set @error=1 - Objekt kann nicht erstellt werden, existiert bereits
    ; .................: @error=2 - zu Löschendes Objekt ist nicht vorhanden
    ; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
    ;===============================================================================
    Func _BAO_Class_ObjCreate(ByRef $_aClass, $_sName, $iDelete=0) ; == Parameter: Klassen-Array, Name des Klassen-Objektes als String
    Local $aClassObj_Methods[1] = [0] ; == Array zur Aufnahme der Methoden erstellen mit Anzahl der akt. Methoden als erstem Element
    Local $aClassObj_Props[1][2] = [[0]] ; == 2D-Array zur Aufnahme der Properties erstellen mit Anzahl der akt. Properties als erstem Element, [['property','value']]
    Local $objClass[4] = [$_sName, $_aClass[0], $aClassObj_Methods, $aClassObj_Props] ; == [Objektname, Klassenname, Array Objekt-Methoden, Array Objekt-Properties]
    Local $aMembers = $_aClass[3], $fFound = False
    If $aMembers[0] > 0 Then
    For $i = 1 To $aMembers[0]
    If $aMembers[$i] = $_sName Then
    $fFound = True
    If $iDelete = 1 Then
    _ArrayDelete($aMembers, $i)
    $aMembers[0] -= 1
    $_aClass[3] = $aMembers
    Return
    Else
    Return SetError(1,0,-1)
    EndIf
    ExitLoop
    EndIf
    Next
    If $iDelete = 1 And Not $fFound Then Return SetError(2,0,-1)
    EndIf
    $aMembers[0] += 1
    ReDim $aMembers[$aMembers[0]+1]
    $aMembers[$aMembers[0]] = $_sName
    $_aClass[3] = $aMembers
    Return $objClass
    EndFunc ;==>_BAO_Class_ObjCreate

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

    ;===============================================================================
    ; Function Name....: _BAO_Class_ObjMethodSet
    ; Description......: weist einem KlassenObjekt eine Methode zu oder löscht sie, gültig nur für dieses KlassenObjekt
    ; Parameter(s).....: $_objClass das mit "_BAO_Class_ObjCreate" erstellte KlassenObjekt
    ; .................: $_sMethod Name der Methode
    ;*********************************************************************************************************
    ; HINWEIS: Als erster Parameter sind ZWINGEND alle Methoden mit "$_self" zu versehen.
    ; In der Funktion zum Aufruf der Methode wird an diesen Paramter das aufrufende Objekt übergeben.
    ; Somit kann in den Methoden auf die Properties des KlassenObjektes zugegriffen werden.
    ; ZUSÄTZLICHE Parameter werden von der aufrufenden Funktion ("_BAO_Class_ObjMethodCall")
    ; IMMER als Array übergeben!!
    ; Methoden des KlassenObjektes werden beim Aufruf IMMER mit einem 2-ten Parameter, einem Array,
    ; aufgerufen. Dieses Array enthält an Array[0] ein Flag für das Überladen (0/1 = nein/ja).
    ; Um Fehler zu vermeiden einfach immer mit 2 Parametern deklarieren:
    ; Func MeineMethode($_self, $_aParam=0) <== so gibt es keine Fehler
    ;*********************************************************************************************************
    ; ........optional.: $iDelete "1" - Löscht die Methode aus dem KlassenObjekt (Standard: 0, nicht Löschen)
    ; Return Value(s)..: Erfolg nichts
    ; .................: Fehler -1 set @error=1 - Methode kann nicht zugewiesen werden, existiert bereits
    ; .................: @error=2 - zu Löschende Methode ist nicht vorhanden
    ; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
    ;===============================================================================
    Func _BAO_Class_ObjMethodSet(ByRef $_objClass, $_sMethod, $iDelete=0) ; == Parameter: Klassen-Objekt, Methode als String
    Local $aMethods = $_objClass[2], $fFound = False ; == das Methoden-Array zum Bearbeiten aus dem KlassenObjekt-Array auslesen
    If $aMethods[0] > 0 Then ; == suchen ob Methode vorhanden ==> dann Löschen
    For $i = 1 To $aMethods[0]
    If $aMethods[$i] = $_sMethod Then
    $fFound = True
    If $iDelete = 1 Then
    _ArrayDelete($aMethods, $i)
    $aMethods[0] -= 1
    $_objClass[2] = $aMethods
    Return
    Else
    Return SetError(1,0,-1)
    EndIf
    ExitLoop
    EndIf
    Next
    If $iDelete = 1 And Not $fFound Then Return SetError(2,0,-1)
    EndIf
    $aMethods[0] += 1 ; == Anzahl Methoden um 1 erhöhen
    ReDim $aMethods[$aMethods[0]+1] ; == Array vergrößern
    $aMethods[$aMethods[0]] = $_sMethod ; == Methode eintragen
    $_objClass[2] = $aMethods ; == bearbeitetes Methoden-Array zurückschreiben in KlassenObjekt-Array
    EndFunc ;==>_BAO_Class_ObjMethodSet

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

    ;===============================================================================
    ; Function Name....: _BAO_Class_ObjPropSet
    ; Description......: Properties des KlassenObjektes Erstellen und/oder ändern, Löschen, gültig nur für dieses KlassenObjekt
    ; Parameter(s).....: $_objClass das mit "_BAO_Class_ObjCreate" erstellte KlassenObjekt
    ; .................: $_sProp Name der Property
    ; ........optional.: $_vProp Wert der Property
    ; ........optional.: $iDelete "1" - Löscht die Property aus dem KlassenObjekt (Standard: 0, nicht Löschen)
    ; Return Value(s)..: Erfolg nichts
    ; .................: Fehler -1 set @error=1 - zu Löschende Property ist nicht vorhanden
    ; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
    ;===============================================================================
    Func _BAO_Class_ObjPropSet(ByRef $_objClass, $_sProp, $_vProp='', $iDelete=0) ; == Parameter: KlassenObjekt, Eigenschaft als String, [optional] Wert der Eigenschaft
    If Not IsArray($_objClass) Then $_objClass = Execute('$' & $_objClass)

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

    Local $aProps = $_objClass[3], $fFound = False ; == das Properties-Array zum Bearbeiten aus dem KlassenObjekt-Array auslesen
    If $aProps[0][0] > 0 Then ; == suchen ob Property vorhanden ==> dann Aktualisieren od. Löschen
    For $i = 1 To $aProps[0][0]
    If $aProps[$i][0] = $_sProp Then
    $fFound = True
    If $iDelete = 1 Then
    _ArrayDelete($aProps, $i)
    $aProps[0][0] -= 1
    Else
    $aProps[$i][1] = $_vProp
    EndIf
    ExitLoop
    EndIf
    Next
    If $iDelete = 1 And Not $fFound Then Return SetError(1,0,-1)
    If $fFound Then
    $_objClass[3] = $aProps
    Return
    EndIf
    EndIf
    $aProps[0][0] += 1 ; == Anzahl Properties um 1 erhöhen
    ReDim $aProps[$aProps[0][0]+1][2] ; == Array vergrößern
    $aProps[$aProps[0][0]][0] = $_sProp ; == Eigenschaft eintragen
    $aProps[$aProps[0][0]][1] = $_vProp ; == Wert eintragen
    $_objClass[3] = $aProps ; == bearbeitetes Properties-Array zurückschreiben in KlassenObjekt-Array
    EndFunc ;==>_BAO_Class_ObjPropSet

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

    ;===============================================================================
    ; Function Name....: _BAO_Class_ObjGet
    ; Description......: Gibt Informationen zu einem KlassenObjekt/ der Klasse des Objektes zurück
    ; Parameter(s).....: $_objClass das mit "_BAO_Class_ObjCreate" erstellte KlassenObjekt (alternativ der Name des Objektes) oder die Klasse
    ; .................: $_sWhat welche Info wird angefordert
    ; .................: mögl. Werte:
    ; .................: "about" gibt alle vorhandenen Informationen zur Klasse aus als 2D-Array: [[name], [class], [Lokale_Meth,..,..], [Globale_Meth,..,..], [Lokale_Props,..,..], [Globale_Props,..,..], [Member,..]]
    ; .................: "count" gibt die Anzahl der Klassenmitglieder zurück
    ; .................: "members" gibt ein Array mit den Namen der Klassenmitglieder zurück
    ; .................: "name" gibt den Name des Klassenobjektes zurück
    ; .................: "class" gibt den Name der Klasse zurück
    ; .................: "methods_l" gibt ein Array aller Lokalen Methoden zurück
    ; .................: "methods_g" gibt ein Array aller Globalen Methoden zurück
    ; .................: "props_l" gibt ein 2D-Array aller Lokalen Properties zurück
    ; .................: "props_g" gibt ein 2D-Array aller Globalen Properties zurück
    ; .................: alles_andere Abfrage bezieht sich auf eine einzelne Property
    ; ........optional.: $_sAlternative wird eine abgefragte Property nicht gefunden, wird der hier hinterlegte Wert zurückgegeben (Standard: -1)
    ; Return Value(s)..: Ergebnis der Abfrage
    ; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
    ;===============================================================================
    Func _BAO_Class_ObjGet($_objClass, $_sWhat, $_sAlternative=-1) ; == Parameter: Klassen-Objekt, Abfragebegriff als String, "$_sAlternative": bei Abfrage einer Propertie - wenn nicht gefunden wird dieser Alternativwert zurückgegeben (Standard: -1)
    Local $aClass = Execute('$' & Execute('$_objClass[1]')) ; == Zugriff auf das Klassenarray über den im Klassenobjekt hinterlegten Klassennamen [name, Array-Meth, Arr-Props, Array-Member]
    Local $vRet, $aProps, $fFound = False, $aAbout[7][2], $aTmp, $fIsClass = False
    If Not IsArray($aClass) Then
    If IsArray($_objClass) Then
    $fIsClass = True ; == $_objClass ist kein KlassenObjekt, sondern die Klasse selbst
    Else
    $_objClass = Execute('$' & $_objClass)
    $aClass = Execute('$' & Execute('$_objClass[1]'))
    EndIf
    EndIf
    Switch $_sWhat ; == was wird abgefragt
    Case 'about' ; == Alle Informationen zum KlassenObjekt/ zur Klasse abfragen
    If $fIsClass Then
    ReDim $aAbout[4][2] ; == [Klassenname, Array-Methoden, Array-Properties, Array-KlassenObjekte]
    $aAbout[0][0] = $_objClass[0] ; == Klassen-Name
    $aTmp = $_objClass[1] ; == Globale Methoden
    If $aTmp[0] > 0 Then
    If UBound($aAbout,2) < $aTmp[0] Then ReDim $aAbout[4][$aTmp[0]]
    For $i = 1 To $aTmp[0]
    $aAbout[1][$i-1] = $aTmp[$i]
    Next
    EndIf
    $aTmp = $_objClass[2] ; == Globale Properties (nur Namen, keine Werte)
    If $aTmp[0][0] > 0 Then
    If UBound($aAbout,2) < $aTmp[0][0] Then ReDim $aAbout[4][$aTmp[0][0]]
    For $i = 1 To $aTmp[0][0]
    $aAbout[2][$i-1] = $aTmp[$i][0]
    Next
    EndIf
    $aTmp = $_objClass[3] ; == Member
    If $aTmp[0] > 0 Then
    If UBound($aAbout,2) < $aTmp[0] Then ReDim $aAbout[6][$aTmp[0]]
    For $i = 1 To $aTmp[0]
    $aAbout[3][$i-1] = $aTmp[$i]
    Next
    EndIf
    Else
    $aAbout[0][0] = $_objClass[0] ; == Objekt-Name
    $aAbout[1][0] = $_objClass[1] ; == Klassen-Name
    $aTmp = $_objClass[2] ; == Lokale Methoden
    If $aTmp[0] > 0 Then
    If UBound($aAbout,2) < $aTmp[0] Then ReDim $aAbout[6][$aTmp[0]]
    For $i = 1 To $aTmp[0]
    $aAbout[2][$i-1] = $aTmp[$i]
    Next
    EndIf
    $aTmp = $aClass[1] ; == Globale Methoden
    If $aTmp[0] > 0 Then
    If UBound($aAbout,2) < $aTmp[0] Then ReDim $aAbout[6][$aTmp[0]]
    For $i = 1 To $aTmp[0]
    $aAbout[3][$i-1] = $aTmp[$i]
    Next
    EndIf
    $aTmp = $_objClass[3] ; == Lokale Properties (nur Namen, keine Werte)
    If $aTmp[0][0] > 0 Then
    If UBound($aAbout,2) < $aTmp[0][0] Then ReDim $aAbout[6][$aTmp[0][0]]
    For $i = 1 To $aTmp[0][0]
    $aAbout[4][$i-1] = $aTmp[$i][0]
    Next
    EndIf
    $aTmp = $aClass[2] ; == Globale Properties (nur Namen, keine Werte)
    If $aTmp[0][0] > 0 Then
    If UBound($aAbout,2) < $aTmp[0][0] Then ReDim $aAbout[6][$aTmp[0][0]]
    For $i = 1 To $aTmp[0][0]
    $aAbout[5][$i-1] = $aTmp[$i][0]
    Next
    EndIf
    $aTmp = $aClass[3] ; == Member
    If $aTmp[0] > 0 Then
    If UBound($aAbout,2) < $aTmp[0] Then ReDim $aAbout[6][$aTmp[0]]
    For $i = 1 To $aTmp[0]
    $aAbout[6][$i-1] = $aTmp[$i]
    Next
    EndIf
    EndIf
    $vRet = $aAbout
    Case 'count' ; == Anzahl der Mitglieder der Klasse ausgeben
    If $fIsClass Then
    $aTmp = $_objClass[3]
    Return $aTmp[0]
    EndIf
    $aTmp = $aClass[3]
    $vRet = $aTmp[0]
    Case 'members' ; == Mitglieder der Klasse ausgeben (Array)
    If $fIsClass Then Return $_objClass[3]
    $aTmp = $aClass[3]
    $vRet = $aTmp
    Case 'name' ; == Name des KlassenObjektes ausgeben
    If $fIsClass Then Return $_objClass[0] ; == bei Klasse, der Name der Klasse
    $vRet = $_objClass[0]
    Case 'class' ; == Name der Klasse ausgeben
    If $fIsClass Then Return
    $vRet = $_objClass[1]
    Case 'methods_g' ; == das Methoden-Array aus dem Klassen-Array auslesen
    If $fIsClass Then Return $_objClass[1]
    $vRet = $aClass[1]
    Case 'props_g' ; == das Properties-Array aus dem Klassen-Array auslesen
    If $fIsClass Then Return $_objClass[2]
    $vRet = $aClass[2]
    Case 'methods_l' ; == das Methoden-Array aus dem KlassenObjekt-Array auslesen
    If $fIsClass Then Return
    $vRet = $_objClass[2]
    Case 'props_l' ; == das Properties-Array aus dem KlassenObjekt-Array auslesen
    If $fIsClass Then Return
    $vRet = $_objClass[3]
    Case Else ; == alles andere ist eine Abfrage zu einer einzelnen Eigenschaft (Lokal oder Global)
    If Not $fIsClass Then
    $aProps = $_objClass[3] ; == Priorität beachten, zuerst Lokal abfragen
    If $aProps[0][0] > 0 Then
    For $i = 1 To $aProps[0][0]
    If $aProps[$i][0] = $_sWhat Then
    $vRet = $aProps[$i][1]
    $fFound = True
    ExitLoop
    EndIf
    Next
    EndIf
    EndIf
    If Not $fFound Then
    If $fIsClass Then
    $aProps = $_objClass[2]
    Else
    $aProps = $aClass[2] ; == danach global abfragen
    EndIf
    If $aProps[0][0] > 0 Then
    For $i = 1 To $aProps[0][0]
    If $aProps[$i][0] = $_sWhat Then
    $vRet = $aProps[$i][1]
    $fFound = True
    ExitLoop
    EndIf
    Next
    EndIf
    If Not $fFound Then $vRet = $_sAlternative ; == abgefragte Property gibt es nicht
    EndIf
    EndSwitch
    Return $vRet
    EndFunc ;==>_BAO_Class_ObjGet

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

    ;===============================================================================
    ; Function Name....: _BAO_Class_ObjMethodCall
    ; Description......: Aufruf von Methoden
    ; Parameter(s).....: $_objClass das mit "_BAO_Class_ObjCreate" erstellte KlassenObjekt
    ; .................: $_sMethod Name der Methode
    ; ........optional.: $_vParam Parameter, der übergeben werden soll (bei mehreren Parametern ein Array übergeben)
    ; Note.............: Diese Funktion übergibt IMMER als ersten Parameter den Namen des aufrufenden Objektes an die Methode.
    ; .................: Alle weiteren Parameter (auch wenn es nur einer ist) werden als ARRAY an die Methode übergeben.
    ; .................: Dies ist bei der Erstellung der Methoden unbedingt zu berücksichtigen.
    ; Return Value(s)..: Erfolg Der Rückgabewert der aufgerufenen Methode
    ; .................: Fehler -1 set @error=1
    ; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
    ;===============================================================================
    Func _BAO_Class_ObjMethodCall(ByRef $_objClass, $_sMethod, $_vParam='')
    Local $aParam[2] = [0], $fFound = False ; == $aParam wird als zweiter Parameter dem Aufruf übergeben, erstes Element =1 signalisiert Lokalen Aufruf
    If Not IsArray($_objClass) Then $_objClass = Execute('$' & $_objClass)
    If Not IsArray($_vParam) Then
    $aParam[1] = $_vParam
    Else
    $aParam = $_vParam
    _ArrayInsert($aParam, 0, 0)
    EndIf
    Local $aMethods = $_objClass[2] ; == zuerst bei den Lokalen Methoden nachschauen
    If $aMethods[0] > 0 Then
    For $i = 1 To $aMethods[0]
    If $aMethods[$i] = $_sMethod Then
    $fFound = True
    $aParam[0] = 1 ; == Methode ist Lokal registriert, ParameterArray[0] = 1
    ExitLoop
    EndIf
    Next
    EndIf
    If Not $fFound Then ; == dann bei den Globalen
    Local $aClass = Execute('$' & Execute('$_objClass[1]'))
    $aMethods = $aClass[1]
    If $aMethods[0] > 0 Then
    For $i = 1 To $aMethods[0]
    If $aMethods[$i] = $_sMethod Then
    $fFound = True
    ExitLoop
    EndIf
    Next
    EndIf
    EndIf
    If Not $fFound Then Return SetError(1,0,-1) ; == Aufruf enthält keine gültige Methode
    If $_vParam = '' And $aParam[0] = 0 Then ; == kein Parameter übergeben, kein Lokaler Aufruf
    Return Call($_sMethod, $_objClass) ; == evtl. Rückgabewert der Funktion wird ausgegeben
    Else
    Return Call($_sMethod, $_objClass, $aParam) ; == evtl. Rückgabewert der Funktion wird ausgegeben
    EndIf
    EndFunc ;==>_BAO_Class_ObjMethodCall

    [/autoit]
    BAO_Bsp
    [autoit]

    #Region - TimeStamp
    ; 2012-04-23 15:41:21 v 0.1
    #EndRegion - TimeStamp

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

    #include "BasicAutoItObject.au3"

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

    ; =========================================================================================================================================
    ; Einfaches Bsp. für Vererbung
    ; =========================================================================================================================================
    ; == Klasse Körper erstellen
    ; == gemeinsames Merkmal aller Körper: 3 Dimensionen
    $Koerper = _BAO_Class_Create('Koerper')
    _BAO_Class_PropSet($Koerper, 'dimension', 3)

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

    ; == Klasse Quader als Unterklasse der Körper erstellen, dazu wird als zweiter Parameter der Klassenname der 'Vaterklasse' übergeben
    ; == Merkmal von Quader: 6 Seiten
    ; == ererbt von Körper: 3 Dimensionen
    $Quader = _BAO_Class_Create('Quader', 'Koerper')
    _BAO_Class_PropSet($Quader, 'seiten', 6)

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

    ; == Ausgeben der Properties "dimension" und "seiten" der Klasse "Quader"
    ConsoleWrite('Dimensionen (ererbt) von ' & _BAO_Class_ObjGet($Quader, 'name') & ': ' & _BAO_Class_ObjGet($Quader, 'dimension') & @CRLF)
    ConsoleWrite('Seiten von ' & _BAO_Class_ObjGet($Quader, 'name') & ': ' & _BAO_Class_ObjGet($Quader, 'seiten') & @CRLF & @CRLF)

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

    ; == Klasse Würfel als Unterklasse von Quader
    ; == Merkmal von Würfel: Kantenlänge identisch
    ; == ererbt von Quader: 6 Seiten
    ; == (bereits ererbt von Körper: 3 Dimensionen)
    $Wuerfel = _BAO_Class_Create('Wuerfel', 'Quader')
    _BAO_Class_PropSet($Wuerfel, 'kantenlaenge', 'identisch')

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

    ; == Ausgeben der Properties "dimension", "seiten" und "kantenlaenge" der Klasse "Wuerfel"
    ConsoleWrite('Dimensionen (ererbt) von ' & _BAO_Class_ObjGet($Wuerfel, 'name') & ': ' & _BAO_Class_ObjGet($Wuerfel, 'dimension') & @CRLF)
    ConsoleWrite('Seiten (ererbt) von ' & _BAO_Class_ObjGet($Wuerfel, 'name') & ': ' & _BAO_Class_ObjGet($Wuerfel, 'seiten') & @CRLF)
    ConsoleWrite('Kantenlänge von ' & _BAO_Class_ObjGet($Wuerfel, 'name') & ': ' & _BAO_Class_ObjGet($Wuerfel, 'kantenlaenge') & @CRLF & @CRLF)

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

    ; == allen Würfeln eine gemeinsame Methode zur Verfügung stellen
    Func Wuerfeln($_self) ; == $_self ist immer als erster Parameter einer Methode anzugeben! An diesen Parameter wird beim Aufruf das aufrufende Objekt übergeben
    Return '"' & _BAO_Class_ObjGet($_self, 'name') & '" würfelt eine: ' & Random(1,6,1)
    EndFunc

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

    _BAO_Class_MethodSet($Wuerfel, 'Wuerfeln')

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

    ; == Objekte der Klasse Würfel erstellen
    $Wuerfel_Holz = _BAO_Class_ObjCreate($Wuerfel, 'Wuerfel_Holz')
    ; == nur für dieses Objekt gültige Eigenschaft setzen
    _BAO_Class_ObjPropSet($Wuerfel_Holz, 'material', 'Holz')

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

    $Wuerfel_Alu = _BAO_Class_ObjCreate($Wuerfel, 'Wuerfel_Alu')
    ; == nur für dieses Objekt gültige Eigenschaft setzen
    _BAO_Class_ObjPropSet($Wuerfel_Alu, 'material', 'Aluminium')

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

    $Wuerfel_Plast = _BAO_Class_ObjCreate($Wuerfel, 'Wuerfel_Plast')
    ; == nur für dieses Objekt gültige Eigenschaft setzen
    _BAO_Class_ObjPropSet($Wuerfel_Plast, 'material', 'Plastik')

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

    ; == Material aller Würfel-Objekte abfragen
    $aMember = _BAO_Class_ObjGet($Wuerfel, 'members') ; == es kann auch ein Objekt der Klasse Würfel zur Abfrage verwendet werden, da die Gruppe 'members' identisch ist
    If $aMember[0] > 0 Then
    For $i = 1 To $aMember[0]
    ConsoleWrite('Material von ' & _BAO_Class_ObjGet($aMember[$i], 'name') & ': ' & _BAO_Class_ObjGet($aMember[$i], 'material') & @CRLF)
    Next
    EndIf
    ConsoleWrite(@CRLF)

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

    ; == die Methode "Wuerfeln" auf alle Würfel-Objekte anwenden, die bereits abgefragte Memberauflistung verwenden
    For $i = 1 To $aMember[0]
    ConsoleWrite( _BAO_Class_ObjMethodCall($aMember[$i], 'Wuerfeln') & @CRLF)
    Next

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

    ; =========================================================================================================================================

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

    ; =========================================================================================================================================
    ; Lange Funktionsnamen sind unhandlich, aber in der UDF erforderlich.
    ; Lösung: Für das Skript eigene Aufrufe schaffen.
    ; =========================================================================================================================================

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

    ; == Ich schaffe mir jetzt ausschließlich für mein Skript einen Funktionsraum, der auf der UDF basiert aber nur ganz kurze Funktionsnamen aufweist
    #region - Funktionskonvertierung
    ; == Notation: C = Class; CO = ClassObject; M = Method; P = Property

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

    ; == _BAO_Class_Create => C_Create
    Func C_Create($_1, $_2='self')
    Return _BAO_Class_Create($_1, $_2)
    EndFunc

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

    ; == _BAO_Class_MethodSet => C_Mset
    Func C_Mset(ByRef $_1, $_2, $_3=0)
    Return _BAO_Class_MethodSet($_1, $_2, $_3)
    EndFunc

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

    ; == _BAO_Class_PropSet => C_Pset
    Func C_Pset(ByRef $_1, $_2, $_3='', $_4=0)
    Return _BAO_Class_PropSet($_1, $_2, $_3, $_4)
    EndFunc

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

    ; == _BAO_Class_ObjCreate => CO_Create
    Func CO_Create(ByRef $_1, $_2, $_3=0)
    Return _BAO_Class_ObjCreate($_1, $_2, $_3)
    EndFunc

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

    ; == _BAO_Class_ObjMethodSet => CO_Mset
    Func CO_Mset(ByRef $_1, $_2, $_3=0)
    Return _BAO_Class_ObjMethodSet($_1, $_2, $_3)
    EndFunc

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

    ; == _BAO_Class_ObjPropSet => CO_Pset
    Func CO_Pset(ByRef $_1, $_2, $_3='', $_4=0)
    Return _BAO_Class_ObjPropSet($_1, $_2, $_3, $_4)
    EndFunc

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

    ; == _BAO_Class_ObjGet => Get <== wird am häufigsten verwendet auch mehrfach in einer Befehlszeile, sollte deshalb besonders kurz und prägnant sein
    Func Get($_1, $_2, $_3=-1)
    Return _BAO_Class_ObjGet($_1, $_2, $_3)
    EndFunc

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

    ; == _BAO_Class_ObjMethodCall => M_Call
    Func M_Call($_1, $_2, $_3='')
    Return _BAO_Class_ObjMethodCall($_1, $_2, $_3)
    EndFunc
    #endregion

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

    ; =========================================================================================================================================
    ; == nun verwende ich nur noch die konvertierten Aufrufe
    ; =========================================================================================================================================

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

    ; =========================================================================================================================================
    ; Beispiel für Überladen
    ; =========================================================================================================================================
    #cs
    Was ist Überladen?
    Eine Klasse wird mit Methoden und Eigenschaften ausgestattet, die für alle Mitglieder der Klasse identisch sind.
    Oft ist es aber sinnvoll für einzelne Mitglieder der Klasse diese Methoden/Eigenschaften zu individualisieren, evtl. auch nur vorübergehend.
    D.h. dem einzelnen Mitglied der Klasse wird angewiesen, eine Methode anders auszuführen als die anderen Klassenmitglieder.
    Da ich in AutoIt keine Lokalen Funktionen erstellen kann (Funktionen sind immer Global), muß ich mir hier anders behelfen.
    Ich registriere die bereits für die Klasse registrierte Methode auch für das Klassenmitglied. Beim Aufruf der Methode durch das Klassenmitglied
    wird zuerst geprüft ob die Methode für das Klassenmitglied selbst (also Lokal) registriert wurde. Ist das der Fall, wird dem Aufruf der Methode
    zusätzlich ein Parameter übergeben, der signalisiert: Achtung! Abweichend vom Standard behandeln.
    In der Methode wird dann auf diesen Parameter geprüft, ist er vorhanden erfolgt eine abweichende, "überladene" Abarbeitung der Methode.
    #ce
    ; == Wir erstellen eine Klasse "Schüler"
    $Schueler = C_Create('Schueler')

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

    ; == diese Klasse bekommt 2 Methoden
    Func SagGutenMorgen($_self, $_aParam=0) ; == $_aParam enthält weiter Parameter, sofern übergeben; Bei Lokalem Aufruf wird $_aParam IMMER übergeben und bei Überladen ist $_aParam[0]=1
    Local $fOverLoad = False
    If IsArray($_aParam) Then ; == min. ein weiterer Parameter wurde übergebn
    If $_aParam[0] = 1 Then $fOverLoad = True ; == die Methode wurde durch das aufrufende Mitglied überladen
    EndIf
    If $fOverLoad Then ; == Behandlung bei Überladen (wenn Überladen durch mehrere Mitglieder vorgesehen, einfach Switch mit $_self.name )
    Local $Status = Get($_self, 'status_DE') ; == bisheriger Lernstatus
    If $Status > 0 And $Status < 40 Then ; == der aktuelle Lernstatus muss 40 erreichen um keine extra Deutschstunde ableisten zu müssen, >0 da ohne Property -1 zurückgegeben wird
    MsgBox(0, Get($_self, 'name'), 'Good Morning!'); == das normale Verhalten wird jetzt "Überladen" mit dem Mitglied-spezifischen Verhalten
    Return M_Call($_self, 'LerneDeutsch') ; == eine extra Deutschstunde wird angeordnet und deren Ergebnis (neuer Status) an den Methodenaufruf zurückgegeben
    EndIf
    EndIf
    MsgBox(0, Get($_self, 'name'), 'Guten Morgen!') ; == das ist das normale Verhalten der Methode
    Return 0 ; == im Normallfall Rückgabe von "0", da Rückgabe des Lernerfolgs (bei Überladen) immer ">0"
    EndFunc

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

    Func LerneDeutsch($_self)
    Local $Status = Get($_self, 'status_DE')
    If $Status = -1 Then Return 100 ; == diese Eigenschaft ist für das Mitglied nicht gesetzt, als Kenntnisstand wird "100" zurückgegeben
    Local $Lernfortschritt = Random(3,8,1) ; == Fortschritt des Lernens
    Return $Status + $Lernfortschritt ; == Rückgabe neuer Status
    EndFunc

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

    ; == die Methoden in der Klasse registrieren
    C_Mset($Schueler, 'LerneDeutsch')
    C_Mset($Schueler, 'SagGutenMorgen')

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

    ; == die allgemeingültige Eigenschaft
    C_Pset($Schueler, 'religion', 'katholisch')

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

    ; == Jetzt brauchen wir Schüler, also Objekte dieser Klasse
    $Peter = CO_Create($Schueler, 'Peter')
    $Julia = CO_Create($Schueler, 'Julia')
    $Mary = CO_Create($Schueler, 'Mary')

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

    #cs
    Nun wollen wir auch zusätzlich noch das Überladen von Eigenschaften mit betrachten. Die Klasse "Schüler" hat also z.B. die
    Eigenschaft "Religion=katholisch", da die Schule von einer kath. Einrichtung betrieben wird.
    Inzwischen hat sich die Schule aber weltoffen gestaltet und erlaubt auch den Zugang für Nichtkatholiken, allerdings ist dies nur vereinzelt
    der Fall. Als Klasseneigenschaft wird also "Religion=katholisch" vorbesetzt, hat ein Schüler nicht diese Religion, erhält er die nur für ihn
    gültige Eigenschaft "Religion=evangelisch" od. "Religion=ohne" etc. Die Eigenschaft "Religion" gibt es somit als individuelle und als
    allgemeingültige Eigenschaft. Die individuelle (Lokale) Eigenschaft genießt eine höhere Priorität und "überlädt" somit die allgemeingültige (Globale) Eigenschaft.
    #ce

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

    ; == Mary ist unsere Gastschülerin aus England - sie ist evangelisch und ihre Deutschkenntnisse lassen noch zu wünschen übrig
    CO_Pset($Mary, 'religion', 'evangelisch') ; == hier überladen wir die Property "religion"
    CO_Pset($Mary, 'status_DE', 30) ; == in dieser Property speichern wir Marys Deutschkenntnisse

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

    ; == Und da es anfangs mit der Sprache bei Mary hakt, müssen wir die Methode "SagGutenMorgen" überladen
    CO_Mset($Mary, 'SagGutenMorgen') ; == Mary bekommt diese Methode separat zugewiesen, sie wird somit anders ausgeführt als beim Aufruf durch andere Klassenmitglieder

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

    ; == Nun wollen wir mal schauen, ob die Religion auch überladen wurde
    ; == Wir geben ein Array aller Mitglieder der Klasse Schüler aus und fragen für jedes Mitglied die Religion ab
    $aMember = Get($Schueler, 'members')
    For $i = 1 To $aMember[0]
    ConsoleWrite('Religion von ' & Get($aMember[$i], 'name') & ': ' & Get($aMember[$i], 'religion') & @CRLF)
    Next
    ; == OK, das funkltioniert

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

    #cs
    Nun noch das Überladen der Methode testen.
    Die Methode "SagGutenMorgen" reagiert in Abhängigkeit zum aufrufenden Klassenmitglied. Von der Herangehensweise ist es nicht absolut
    identisch mit einem tatsächlichen Überladen, aber der Effekt ist derselbe - und darauf kommt es an.
    Unser Gast aus England ist am Anfang noch etwas schwach in Deutsch. Solange ihre Kenntnisse nicht mindestens einen Punktwert von 40 haben,
    wird sie uns in englisch begrüßen und muß eine extra Stunde Deutschunterricht ableisten.
    Erst wenn sie den Punktwert erreicht hat, braucht sie kein Deutsch zusätzlich lernen und die dann überflüssige Eigenschaft 'status_DE' wird
    gelöscht.
    #ce

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

    ; == Wir lassen uns erst mal von allen Mitgliedern der Klasse begrüßen
    While 1
    For $i = 1 To $aMember[0]
    $ret = M_Call($aMember[$i], 'SagGutenMorgen')
    If $ret > 0 Then ; == betrifft nur Mary
    ConsoleWrite('Mary war zum Deutsch-Unterricht, neuer Lern-Status: ' & $ret & @CRLF)
    If $ret > 39 Then ; == der erforderliche Lernstatus wurde erreicht
    CO_Pset($Mary, 'status_DE', '', 1) ; == die Eigenschaft 'status_DE' wird nicht mehr benötigt und daher gelöscht
    ExitLoop(2)
    EndIf
    CO_Pset($Mary, 'status_DE', $ret) ; == neuen Status in die Property eintragen
    EndIf
    Next
    ; == das wird solange wiederholt, bis Mary min. 40 Wissenspunkte hat
    WEnd

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

    ; == Nun sollten uns alle Schüler auf Deutsch begrüßen
    For $i = 1 To $aMember[0]
    $ret = M_Call($aMember[$i], 'SagGutenMorgen')
    Next

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

    ; == Wir haben also gesehen, dass sowohl Properties als auch Methoden überladen werden können.

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

    #cs
    Die bisherige Lösung hat allerdings einen Schwachpunkt, den ich nicht verschweigen möchte:
    Der Aufruf der Methoden wird mit dem AutoIt-Befehl "Call" veranlaßt. Dieser Befehl erlaubt aber nicht, Parameter ByRef zu übergeben.
    Das ist ein großes Handicap. Dadurch kann ich über Methoden keine Veränderung von Properties vornehmen, da ich dazu einen referenzierten
    Zugriff auf das entsprechende Klassenobjekt benötige.
    Bsp.:
    Die Methoden führen als ersten Parameter "$_self". Dieser Parameter wird von der Funktion zum MethodenCall an die Methode übergeben.
    Da eine ByRef-Übergabe nicht möglich ist, wird dieser Parameter ByVal übergeben - also als Kopie. Somit kann ich die aktuellen Werte
    des Klassenobjektes zwar auslesen, aber nicht ändern. :(
    Dazu muß ich immer direkt die Original-Variable des Klassenobjekts verwenden.
    #ce

    [/autoit]

    Edit 23.04.2012
    - In der UDF waren ein paar kleine Bugs - gefixed, aktuell: v0.2
    - Beispieldatei erweitert um das Thema Überladen

    Dateien

    BAO_Entwicklung.au3 23,82 kB – 284 Downloads BasicAutoItObject[0.2].au3 26,3 kB – 309 Downloads BAO_Bsp.au3 14,23 kB – 329 Downloads
  • _FileListToArray in Unterordnern

    • BugFix
    • 20. April 2012 um 13:37

    Gibt es schon viele Lösungen hier im Forum, suche mal nach dem Stichwort "rekursiv".

  • Hotlinkprotected FIle per Script downloaden

    • BugFix
    • 17. April 2012 um 20:09

    Wir können jetzt stundenlang und erfolglos theoretisieren oder du zeigst uns Beispiel-Code (inkl. den Seitencode) und dann können wir über konkrete Dinge reden. ;)

  • SciTE - Variablen- und Funktions- Tipp (CallTipp oder Konsolenausgabe) per HotKey od. Kontextmenü, Suche nach Variable [v0.11]

    • BugFix
    • 17. April 2012 um 15:50

    Ich habe nun noch einen Installer geschrieben, damit braucht ihr keinen Dateieingriff selbst vornehmen.
    Einfach die Installer.au3 und das Lua-Skript in einen gemeinsamen Ordner kopieren und dann den Installer ausführen.

  • Teil von Text fett

    • BugFix
    • 13. April 2012 um 21:21

    Im Label gar nicht. Unterschiedliche Formatierung innerhalb eines Controls kannst du im RichEdit Control vornehmen. Näheres findest du in der Hilfe.

  • Pfad zur Datei, die gerade am Bildschirm angezeigt wird auslesen

    • BugFix
    • 13. April 2012 um 15:25
    Zitat von AspirinJunkie

    Das funktioniert doch nur mit Programmen welche auch explizit und bewusst ein COM-Objekt zur Verfügung stellen.


    Das ist schon klar, aber für genau diese kann man das so lösen. Für den Rest braucht es dann etwas mehr Arbeit. ;)

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™