"OOP" problem

  • morgen,
    ich verzweifle hier gerade an einer (für c++ verhältnisse) geradezu lächerlich banalen sache.
    Ich möchte einfach nur ein Objekt erstellen Namens "book",welches Elemente des Typs "node" hat. Also lege ich ein feld vom typ "node" an (als member des Objekts "book"). Nun Soll das objekt books ausserdem eine methode "addNode" enthalten,die zu diesem Objekt weitere "nodes" anlegt. Das geschieht mithilfe einer hilfsfunktion createNode deren rückgabewert anschließen mit _ArrayAdd an das "nodes"-Feld angehängt werden soll.
    Eigentlich ganz einfach....Aber auch nur für C++ verhältnisse. Ich krieg es einfach nicht gebacken mit Autoit.Ist das irgendwie zu realisieren??
    Hier mein Code:

    [autoit]


    #AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
    #include <GUIConstants.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <TreeViewConstants.au3>
    #include <GuiTreeView.au3>
    #include<Array.au3>
    #include "AutoItObject.au3"

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

    Opt("MustDeclareVars", 1)

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

    ; Initialize AutoItObject
    _AutoItObject_Startup()

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

    Global $hGui = GUICreate("Hello World", 500, 500, -1, -1)
    GUISetState(@SW_SHOW)
    Global $treeview = GUICtrlCreateTreeView(100, 100, 200, 300)
    GUISetState()

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

    Func createBook($Filename, $Name)
    Local $oNode = _AutoItObject_Create()

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

    ;Public Members

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

    _AutoItObject_AddProperty($oNode, "NAME", $ELSCOPE_PUBLIC)
    _AutoItObject_AddProperty($oNode, "PAGE", $ELSCOPE_PUBLIC)
    _AutoItObject_AddProperty($oNode, "ID", $ELSCOPE_PUBLIC)
    _AutoItObject_AddProperty($oNode, "FILENAME", $ELSCOPE_PUBLIC)
    _AutoItObject_AddProperty($oNode, "NODES", $ELSCOPE_PUBLIC) ;ISt ein FELD, oder sollte eins sein...
    _AutoItObject_AddMethod($oNode, "addNode", "addNode") ;die funktion,obj selbst

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

    ;"noch" Public Members
    _AutoItObject_AddProperty($oNode, "CurrentNodes", $ELSCOPE_PUBLIC)

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

    Local $hCtrlID
    $hCtrlID = GUICtrlCreateTreeViewItem($Name, $treeview)

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

    With $oNode
    .NODES = 0
    .NAME = $Name
    .Page = 1
    .ID = $hCtrlID
    .FILENAME = $Filename
    .CurrentNodes = 0
    EndWith
    Return $oNode
    EndFunc ;==>createBook

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

    Func createNode(ByRef $oParent, _
    $ParentID, _
    $Type, _
    $Name, _
    $Page)
    Local $oNode = _AutoItObject_Create()

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

    ;Public Members

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

    _AutoItObject_AddProperty($oNode, "TYPE", $ELSCOPE_PUBLIC)
    _AutoItObject_AddProperty($oNode, "NAME", $ELSCOPE_PUBLIC)
    _AutoItObject_AddProperty($oNode, "PAGE", $ELSCOPE_PUBLIC)
    _AutoItObject_AddProperty($oNode, "ID", $ELSCOPE_PUBLIC)
    _AutoItObject_AddProperty($oNode, "PARENTID", $ELSCOPE_PUBLIC)
    _AutoItObject_AddProperty($oNode, "FILENAME", $ELSCOPE_PUBLIC)
    _AutoItObject_AddProperty($oNode, "NODES[10]", $ELSCOPE_PUBLIC) ;ISt ein FELD
    _AutoItObject_AddMethod($oNode, "addNode", "addNode")

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

    ; Private Members
    _AutoItObject_AddProperty($oNode, "CurrentNodes", $ELSCOPE_PRIVATE)

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

    Local $hCtrlID
    $hCtrlID = GUICtrlCreateTreeViewItem($Name & " S." & $Page, $ParentID)

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

    With $oNode
    .TYPE = $Type
    .NAME = $Name
    .Page = $Page
    .ID = $hCtrlID
    .CurrentNodes = 0
    .PARENTID = $ParentID
    .FILENAME = $oParent.FILENAME
    EndWith
    return $oNode
    EndFunc ;==>createNode

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

    Func addNode(ByRef $oParent, $Type, $Name, $Page)
    Local $oNode = 0
    With $oParent
    $oNode = createNode($oParent, .ID, $Type, $Name, $Page)
    _ArrayAdd(.NODES, $oNode)
    EndWith
    EndFunc ;==>addNode

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

    Global $books[10]
    $books[0] = createBook("test.pdf", "Buch 1")
    $books[0] .addNode($books[0], 1, "test", 20)
    ConsoleWrite($books[0] .Name)
    _AutoItObject_Shutdown()

    [/autoit]

    edit:habe eben noch etwas gestöbert und meine,dass ich mein problem mit Enmus lösen muss. Wusste bis vor einigen minuten nicht einmal was das ist. Hat jemand vielleicht eine Erklärung parat,was diese enumfunktionen machen und was der iterator ist?

    Einmal editiert, zuletzt von taugenix (3. August 2012 um 06:41)

    • Offizieller Beitrag

    Die Enum Funktion nummeriert, besser gesagt es weist Variablen fortlaufende Nummern zu

    [autoit]

    Global Enum $E1VAR1, $E1VAR2, $E1VAR3

    [/autoit]

    Bei dem obrigen Code werden die einzelnen Variablen Werte von 0 bis 3 zugewiesen, da kein Startwert angegeben wurde.

    [autoit]

    Global Enum $E1VAR1=10, $E1VAR2, $E1VAR3

    [/autoit]


    Damit würde die Variaben von 10 aufwärts nummeriert. Man kann auch nuoch zusätzlich die Stepweite angeben.

    Iterieren kannst du hier nachlesen: http://lexikon.martinvogel.de/iteration.html

    • Offizieller Beitrag

    Zeile 93:

    [autoit]

    _ArrayAdd(.NODES, $oNode)

    [/autoit]

    kann nicht funktionieren. AutoIt erwartet die Referenz auf ein Array. Du lieferst mit .NODES jedoch einen Ausdruck.
    Du mußt das Array auslesen, den Wert hinzufügen und dann das Array zurückschreiben:

    [autoit]

    Func addNode(ByRef $oParent, $Type, $Name, $Page)
    Local $oNode = 0
    With $oParent
    $oNode = createNode($oParent, .ID, $Type, $Name, $Page)
    Local $aTmp = .NODES
    _ArrayAdd($aTmp, $oNode)
    .NODES = $aTmp
    EndWith
    EndFunc ;==>addNode

    [/autoit]

    Diese Zeile verwirrt mich:

    [autoit]

    _AutoItObject_AddProperty($oNode, "NODES[10]", $ELSCOPE_PUBLIC)

    [/autoit]

    Wieso NODES[10]?? Das ist nur der Name für die Property, auch wenn du da eckige Klammern drumsetzt wird kein Array draus.

  • danke für die antwort.
    Habe mich nun etwas in das thema eingelesen und konnte das problem mit Linked Lists lösen.
    Nun ist auch folgendes möglich : node.addnode.addnode.addnode etc.
    Bin echt überrascht was autoit alles kann, dank udfs :)

    BugFix : Die lösung ist ja noch viel einfacher...habe garnicht daran gedacht.
    Wieso weisst du eigentlich immer alles?? Bist du beruflich Programmierer?? Würde mich mal interessieren.

    • Offizieller Beitrag

    Bist du beruflich Programmierer?? Würde mich mal interessieren.


    Beruflich habe ich gar nix mit Programmierung zu tun. :D (Ausser, dass ich eigene Programme für die Arbeit nutze)
    Aber ich habe seit meiner Kindheit in den 70er Jahren mit Rechentechnik (so hieß das damals :D) zu tun. Hat mich immer interessiert, angefangen mit Lochkarten über Eigenbau-PC bis heute.
    Alles, was ich kann und weiß in dem Bereich, habe ich mit Learning-By-Doing erworben. Try&Error ist immer noch eine der besten Methoden um Ergebnisse dauerhaft zu speichern. :thumbup:

  • Zitat von »taugenix«



    Bist du beruflich Programmierer?? Würde mich mal interessieren.

    Beruflich habe ich gar nix mit Programmierung zu tun. :D (Ausser, dass ich eigene Programme für die Arbeit nutze)
    Aber ich habe seit meiner Kindheit in den 70er Jahren mit Rechentechnik (so hieß das damals :D) zu tun. Hat mich immer interessiert, angefangen mit Lochkarten über Eigenbau-PC bis heute.
    Alles, was ich kann und weiß in dem Bereich, habe ich mit Learning-By-Doing erworben. Try&Error ist immer noch eine der besten Methoden um Ergebnisse dauerhaft zu speichern. :thumbup:


    Dann warst du ja von Anfang an dabei. Das konnte ich leider noch nicht miterleben,war bestimmt ne aufregende zeit..:Dafür gibts heut so riesige communities und man kann sich einiges an trial & error zeit sparen,auch wenn das verständnis dafür hin und wieder drunter leiden muss.
    Jedenfalls vertrete ich dieselbe philosophie erweitert um das element community ,also trial & error & forum for the win :rock: