Tree in DB abspeichern und wieder auslesen

  • Hallo zusammen,
    ich hab folgendes Problem. Ich würde gerne einen während der Laufzeit generierten
    Tree in eine Datenbank (z.B. MSAccess) abspeichern und auch wieder rekonstruieren können.
    Dieser soll dann im weiteren Verlauf erweiterbar, änderbar usw. sein.
    Wie ich einen Treeview erzeuge weiß ich.
    Wie ich Werte in eine DB scheibe weiß ich auch.
    Ich hab auch schon geschafft den Tree über ein Array auszulesen und dann in eine DB zu
    schreiben.
    Ich kann ihn nur nicht wieder einlesen.(ER bleibt entweder leer , oder die Verkettung stimmt
    nicht mehr.
    Hat jemand einen einfachen Lösungsansatz für so etwas?

    Viele Grüße und Danke
    MaDeBuVie ?(

    Einmal editiert, zuletzt von MaDeBuVie (4. Oktober 2013 um 20:28)

  • Zitat

    Ich hab auch schon geschafft den Tree über ein Array auszulesen und dann in eine DB zu
    schreiben.


    Wenn du uns nicht zeigst, wie du die Daten speicherst, wie sollen wir dir dann sagen wie du sie wieder auskesen kannst?

    Datenbanktyp .... Datenbankstruktur ... irgendwelche Query???????

  • Ich habe hier einmal Versucht, den Sourcecode so kurz wie möglich zusammenzufassen
    Als DB nutze ich eine MSACCESS-DB ==> Data.mdb Tabellenfelder; VorgängerID, VorgängerName, Ordnername


    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #Include <GuiTreeView.au3>
    Opt("GUIOnEventMode", 1)

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

    Global $GUIWidthGlobal, $GUIHeight, $GUIWidth = 633, $GUIHeight = 454
    Global $childwin1Global, $sQueryGlobal, $Input88 ; == habs hierher verschoben, Globale Variablen deklariert man nicht in Funktionen! (BugFix)
    Global $oRSGlobal, $oConn ; == hier dasselbe

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

    $mainwindow = GUICreate("Hauptmaske", $GUIWidth, $GUIHeight)
    $Hauptmaske_Pos = WinGetPos($mainwindow, "")
    GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")
    GUISetBkColor(0x00E0FFFF) GUISetFont(9, 300)
    $treeview = GUICtrlCreateTreeView (6,40,200,420,BitOr($TVS_HASBUTTONS,$TVS_HASLINES,$TVS_LINESATROOT,$TVS_DISABLEDRAGDROP,$TVS_SHOWSELALWAYS),$WS_EX_CLIENTEDGE) ;$Root = GUICtrlCreateTreeViewitem ("Wurzel",$treeview)
    $DialogBoxNewItem = GUICtrlCreateButton("Neu", 270, 150, 60)
    GUICtrlSetOnEvent($DialogBoxNewItem, "DialogBoxNewItem")
    GUISwitch($mainwindow)

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

    GUISetState(@SW_SHOW)

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

    While 1
    Sleep(1000)
    WEnd

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

    Func DialogBoxNewItem()
    $childwin1 = GUICreate("Child GUI", 320, 150, $Hauptmaske_Pos[0] + 100, $Hauptmaske_Pos[1] + 100, -1, -1, $mainwindow)
    GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")
    $Label1 = GUICtrlCreateLabel("ItemName:", 25, 35, 79, 17)
    $Input88 = GUICtrlCreateInput("" ,144, 35, 281, 21)
    $OKButton1 = GUICtrlCreateButton("OK", 230, 70, 80)
    GUICtrlSetOnEvent($OKButton1, "NewItem")
    GUISwitch($childwin1)
    GUISetState(@SW_SHOW)
    EndFunc

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

    Func NewItem()
    $oConn = ObjCreate("ADODB.Connection")
    $oRS = ObjCreate("ADODB.Recordset")
    $CC = _GUICtrlTreeView_InsertItem($treeview,GUICtrlRead($Input88),GUICtrlSendMsg($treeview, $TVM_GETNEXTITEM, $TVGN_CARET, 0) )
    $oConn.Open("Driver={Microsoft Access Driver (*.mdb)};Dbq=D:\MyProgs\Data\Data.mdb")
    $sQuery = "INSERT INTO Tree (`VorgängerID`,`VorgängerName`,`OrdnerName`) VALUES ('" & _
    _GUICtrlTreeView_GetLastChild ($treeview, GUICtrlSendMsg($treeview, $TVM_GETNEXTITEM, $TVGN_CARET, 0)) & "'," & _
    GUICtrlSendMsg($treeview, $TVM_GETNEXTITEM, $TVGN_CARET, 0) & ",'" & _
    GUICtrlRead($Input88) & "')"
    $oConn.Execute($sQuery)
    $oConn.Close
    GUISetState(@SW_SHOW)
    _GUICtrlTreeView_Sort ($treeview)
    GUIDelete()
    EndFunc

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

    Func CLOSEClicked()
    If @GUI_WINHANDLE = $mainwindow Then Exit MsgBox(0, "GUI Event", "Programm wird beendet!")
    If @GUI_WINHANDLE = $childwin1 Then GUIDelete()
    EndFunc

    [/autoit]

    Viele Grüsse
    MaDeBuVie

    Edit BugFix: Habe deinen Code mal lesbar formatiert und kleine Sachen, die mir sofort aufgefallen sind, korrigiert. Vielleicht schaut nun jemand drüber.

    Einmal editiert, zuletzt von BugFix (1. Oktober 2013 um 09:38)

    • Offizieller Beitrag

    Ich habe den Code nicht im Detail betrachtet, könnte mangels Access DB eh nichts testen.
    Aber Folgendes:
    1.
    Es ist wenig sinnvoll, bei jedem neuen Item die Datenbank zu öffnen, Item einzufügen und DB wieder zu schließen.
    Stelle am Anfang die Verbindung zur DB her und beende diese beim Schließen des Programms, z.B. in einer autom. Funktion (OnAutoItExitRegister).

    2.
    Du solltest auch das Child nur einmalig am Programmstart erstellen und es dann mit SHOW/HIDE anzeigen oder ausblenden.

    Und an welcher Stelle verhält sich das Programm denn anders als von dir erwartet? Hast du die entsprechenden Variablen dann auch dir mal in die Konsole ausgeben lassen um zu wissen, was wann hängt?

  • Erste einmal Danke für Deine Antwort.

    zu 1) Hab ich verstanden.

    zu 2) Mein Problem ist, dass ich nicht genau weiss, an was ich genau an Information abspeichern muss, damit ich den
    Baum wieder ganauso verschachelt rekonstruiert bekomme.
    Nach meinem Kenntnisstand gibt es 2 Wege ein Item zu erstellen:

    - $Root = GUICtrlCreateTreeViewitem ("Wurzel",$treeview) In meinem Programm auskommentiert
    - $CC = _GUICtrlTreeView_InsertItem($treeview,GUICtrlRead($Input88),GUICtrlSendMsg($treeview, $TVM_GETNEXTITEM, $TVGN_CARET, 0) )

    Beide dieser Anweisungen gibt mir eine ID zurück, von der ich ausgehen, dass diese sich meinem Parent bezieht.
    Das heisst für mich, der Parent ist auf irgedeine Weise schon auszulesen. Auch den Inhalt des Parents kann ich lesen.
    Was mir fehlt, ist das aktuell erzeugte Item mit ID und Inhalt.
    Ein neu hinzugefügtes Item ist bei mir auch erst sichtbar, wenn ich mit der Maus auf den Parent des erzuegten Items klicke.

    Ich hoffe, ich konnte mein Problem damit besser beschreiben.

  • OK, ich versuche das Programm so umzugestalten,dass ich den Tree in einer Textdatei
    schreibe und versuche von dort wieder auszulesen.
    Dauert jedoch etwas.

    • Offizieller Beitrag

    So, hab dir mal eine Lösung erstellt.
    Du musst die Daten natürlich so speichern, dass die Struktur ersichtlich ist. Für ein Treeview heisst das: Wer ist das Parent zum Item.
    Das Bsp. liest aus folgender Datei (Zuordnung: Parent-Name; Item-Name) :

    Code
    ;Autos
    Autos;Ford
    Autos;Opel
    Autos;BMW
    Ford;Fiesta
    Ford;Mondeo
    Opel;Manta
    Opel;Insignia
    BMW;3er
    BMW;8er


    Die Funktionen kann man natürlich auch so gestalten, dass sie auch auf tiefere Ebenen zugreifen. Muss man dann rekursiv lösen. Für die Variante reicht das aber so.
    Das Abspeichern der Item-Handle ist für dieses 2-Ebenen Treeview nicht erforderlich, da diese beim Erstellen neu zugewiesen werden und eine Unterscheidung anhand des Item-Textes möglich ist. Ein Treeview strukturiert sich nach: Root-Parent-(Siblings v. Parent)-Child-(Siblings v. Child).. usw.
    Diese Struktur musst du beim Auslesen des Trees auch erfassen und in deiner Datei/DB hinterlegen. Du kannst es, wie in meinem Bsp., so machen, dass du die Einträge in der Reihenfolge der Ebenen erfasst, oder hintereinanderweg ausliest und die Zuordnung Parent-Child speicherst. Aufwändiger wird es, wenn ein Item-Text mehrfach in verschiedenen Zweigen auftauchen kann. In diesem Fall ist das Abspeichern des Handle zum Item-Text nötig.

    Eine Funktion zum Neuerstellen habe ich hier jetzt nicht eingebunden, das lief bei dir ja bereits.

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    #include <GuiTreeView.au3>
    #include <TreeViewConstants.au3>
    #include <WindowsConstants.au3>

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

    #cs Datei mit Tree-Struktur
    Parent-Name; Item-Name

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

    ;Autos // erster Eintrag, somit kein Parent
    Autos;Ford
    Autos;Opel
    Autos;BMW
    Ford;Fiesta
    Ford;Mondeo
    Opel;Manta
    Opel;Insignia
    BMW;3er
    BMW;8er
    #ce

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

    Global $File = @ScriptDir & '\Tree.txt'
    Global $hTV

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

    $hGUI = GUICreate("Test", 350, 215)
    $TV = GUICtrlCreateTreeView(5, 5, 180, 200, BitOR($TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS), $WS_EX_CLIENTEDGE)
    $hTV = GUICtrlGetHandle($TV)
    $btNew = GUICtrlCreateButton('New Item', 245, 5, 100, 20)
    $btFile = GUICtrlCreateButton('Load From File', 245, 45, 100, 20)
    $btWrite = GUICtrlCreateButton('Write To File', 245, 85, 100, 20)
    GUISetState()

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

    Global $aFromFile = _ReadFile2TreeArray()

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

    While 1
    Switch GUIGetMsg()
    Case -3
    Exit
    Case $btNew
    ; == Dialog NEU
    Case $btFile
    _Load()
    Case $btWrite
    _WriteTreeToFile()
    EndSwitch
    WEnd

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

    Func _Load()
    $aTVHandle = _FillTreeFromArray()
    _GUICtrlTreeView_Expand($hTV)
    EndFunc

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

    Func _ReadFile2TreeArray()
    Local $sRead = FileRead($File)
    If @error Then Return SetError(1,0,0)
    Local $a = StringRegExp($sRead, '(\w+)*;(\w+)', 3)
    If Not IsArray($a) Then Return SetError(2,0,0)
    Local $aTree[UBound($a)/2][2], $n = 0
    For $i = 0 To UBound($a) -2 Step 2
    $aTree[$n][0] = $a[$i] ; == Parent-Name
    $aTree[$n][1] = $a[$i+1] ; == Item-Name
    $n += 1
    Next
    Return $aTree
    EndFunc

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

    Func _FillTreeFromArray()
    Local $aHwnd[UBound($aFromFile)][2]
    Local $hRoot, $hParent, $hItem
    For $i = 0 To UBound($aFromFile) -1
    If $aFromFile[$i][0] = '' Then ; == erster Eintrag - Root
    $hRoot = _GUICtrlTreeView_Add($hTV, 0, $aFromFile[$i][1])
    $aHwnd[0][0] = $aFromFile[$i][1] ; == Text Root
    $aHwnd[0][1] = $hRoot ; == Handle Root
    ElseIf $aFromFile[$i][0] = $aFromFile[0][1] Then ; == Root ist übergeordnet, Item wird Child des Root und selbst dann Parent für Childs
    $hItem = _GUICtrlTreeView_AddChild($hTV, $hRoot, $aFromFile[$i][1])
    $aHwnd[$i][0] = $aFromFile[$i][1] ; == Text Item
    $aHwnd[$i][1] = $hItem ; == Handle Item
    Else ; == andere Item sind dann in der nächsten Unterebene
    For $j = 0 To UBound($aHwnd) -1
    If $aFromFile[$i][0] = $aHwnd[$j][0] Then ; == übergeordnetes Item suchen
    $hParent = $aHwnd[$j][1] ; == dessen Handle übernehmen
    ExitLoop
    EndIf
    Next
    $hItem = _GUICtrlTreeView_AddChild($hTV, $hParent, $aFromFile[$i][1])
    $aHwnd[$i][0] = $aFromFile[$i][1] ; == Text Item
    $aHwnd[$i][1] = $hItem ; == Handle Item
    EndIf
    Next
    Return $aHwnd
    EndFunc

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

    Func _WriteTreeToFile()
    Local $sWrite = '', $sSubs = ''
    Local $hRoot = _GUICtrlTreeView_GetFirstItem($hTV), $sRoot, $sItem
    If $hRoot <> 0 Then
    $sRoot = _GUICtrlTreeView_GetText($hTV, $hRoot)
    $sWrite &= ';' & $sRoot & @CRLF
    Local $n = _GUICtrlTreeView_GetChildCount($hTV, $hRoot), $hChild
    Local $m, $hSub, $hItem
    If $n > 0 Then
    $hChild = _GUICtrlTreeView_GetFirstChild($hTV, $hRoot)
    $sWrite &= $sRoot & ';' & _GUICtrlTreeView_GetText($hTV, $hChild) & @CRLF
    $sSubs &= _GetSubs($hChild, _GUICtrlTreeView_GetText($hTV, $hChild)) ; == alle SubItem hiervon auslesen
    If $n > 1 Then
    For $i = 2 To $n
    $hChild = _GUICtrlTreeView_GetNextSibling($hTV, $hChild)
    $sItem = _GUICtrlTreeView_GetText($hTV, $hChild)
    $sWrite &= $sRoot & ';' & $sItem & @CRLF
    $sSubs &= _GetSubs($hChild, $sItem) ; == alle SubItem hiervon auslesen
    Next
    EndIf
    EndIf
    EndIf
    $sWrite &= $sSubs
    Local $fH = FileOpen($File, 2)
    FileWrite($fH, $sWrite)
    ;~ ConsoleWrite($sWrite & @LF)
    EndFunc

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

    Func _GetSubs($_hItem, $_sParent)
    Local $hSub, $sSub = ''
    $m = _GUICtrlTreeView_GetChildCount($hTV, $_hItem)
    If $m > 0 Then
    $hSub = _GUICtrlTreeView_GetFirstChild($hTV, $_hItem)
    $sSub &= $_sParent & ';' & _GUICtrlTreeView_GetText($hTV, $hSub) & @CRLF
    If $m > 1 Then
    For $j = 2 To $m
    $hSub = _GUICtrlTreeView_GetNextSibling($hTV, $hSub)
    $sSub &= $_sParent & ';' & _GUICtrlTreeView_GetText($hTV, $hSub) & @CRLF
    Next
    EndIf
    EndIf
    Return $sSub
    EndFunc

    [/autoit]
  • Vielen Dank,

    wie komme ich denn beim erstellen der Datei an den Parent-Namen. Bisher habe ich immer nur
    etwas über Parent-ID bzw Parent-Handle gefunden.

    • Offizieller Beitrag

    Da verstehe ich deine Frage nicht. Wenn du selbst ein neues Item erstellst, weißt du doch in welcher Ebene du es einfügen möchtest.
    • User klickt auf Item, zu dem ein SubItem erstellt werden soll
    • das Handle davon bekommst du dann mit $hSelected = _GUICtrlTreeView_GetSelection($hTV)
    oder du legst per Skript fest zu welchem Item ein Child erstellt werden soll.
    • _GUICtrlTreeView_GetText($hTV, $hSelected) gibt dir den Item-Text (kannst du meinem Code-Bsp. entnehmen, Fkt: _WriteTreeToFile() )
    • dieses nutzt du dann um mit _GUICtrlTreeView_AddChild($hTV, $hSelected, "Item-Text") den neuen Eintrag zu erstellen
    • wenn noch kein Eintrag vorhanden ist, wird der erste Eintrag mit _GUICtrlTreeView_Add($hTV, 0, "erstes-Item") erstellt


    Edit: Habe das nochmal bearbeitet. Das Speichern in der Reihenfolge der Item ist effizienter, auch das Erstellen. Schau dir einfach den Code an, deutlich kürzer und erlaubt beliebige Childtiefe.

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <GuiTreeView.au3>
    #include <TreeViewConstants.au3>
    #include <WindowsConstants.au3>

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

    #cs Datei mit Tree-Struktur
    Parent-Name; Item-Name

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

    ;Autos // erster Eintrag, somit kein Parent
    Autos;Ford
    Ford;Fiesta
    Ford;Mondeo
    Autos;Opel
    Opel;Manta
    Opel;Insignia
    Autos;BMW
    BMW;3er
    3er;blau
    3er;silber
    BMW;8er
    #ce

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

    Global $File = @ScriptDir & '\Tree.txt'
    Global $hTV

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

    $hGUI = GUICreate("Test", 350, 215)
    $TV = GUICtrlCreateTreeView(5, 5, 180, 200, BitOR($TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS), $WS_EX_CLIENTEDGE)
    $hTV = GUICtrlGetHandle($TV)
    $btNew = GUICtrlCreateButton('New Item', 245, 5, 100, 20)
    $btFile = GUICtrlCreateButton('Load From File', 245, 45, 100, 20)
    $btWrite = GUICtrlCreateButton('Write To File', 245, 85, 100, 20)
    GUISetState()

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

    While 1
    Switch GUIGetMsg()
    Case -3
    Exit
    Case $btNew
    ; == Dialog NEU
    Case $btFile
    _Load()
    Case $btWrite
    _WriteTreeToFile()
    EndSwitch
    WEnd

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

    Func _Load()
    Local $aFromFile = _ReadFile2TreeArray()
    For $i = 0 To UBound($aFromFile) -1
    _GuiCtrlTreeView_NewItem($hTV, $aFromFile[$i][1], $aFromFile[$i][0])
    Next
    _GUICtrlTreeView_Expand($hTV)
    EndFunc

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

    Func _ReadFile2TreeArray()
    Local $sRead = FileRead($File)
    If @error Then Return SetError(1,0,0)
    Local $a = StringRegExp($sRead, '(\w+)*;(\w+)', 3)
    If Not IsArray($a) Then Return SetError(2,0,0)
    Local $aTree[UBound($a)/2][2], $n = 0
    For $i = 0 To UBound($a) -2 Step 2
    $aTree[$n][0] = $a[$i] ; == Parent-Name
    $aTree[$n][1] = $a[$i+1] ; == Item-Name
    $n += 1
    Next
    Return $aTree
    EndFunc

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

    Func _WriteTreeToFile()
    Local $sWrite = '', $sParent, $hItem = _GUICtrlTreeView_GetFirstItem($hTV)
    If $hItem <> 0 Then
    $sWrite &= ';' & _GUICtrlTreeView_GetText($hTV, $hItem) & @CRLF
    While 1
    $hItem = _GUICtrlTreeView_GetNext($hTV, $hItem)
    If $hItem = 0 Then ExitLoop
    $sParent = _GUICtrlTreeView_GetText($hTV, _GUICtrlTreeView_GetParentHandle($hTV, $hItem))
    $sWrite &= $sParent & ';' & _GUICtrlTreeView_GetText($hTV, $hItem) & @CRLF
    WEnd
    EndIf
    Local $fH = FileOpen($File, 2)
    FileWrite($fH, $sWrite)
    ;~ ConsoleWrite($sWrite & @LF)
    EndFunc

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

    Func _GuiCtrlTreeView_NewItem($_hWnd, $_sText, $_sParentUnique='')
    Local $hItem
    If $_sParentUnique = '' Then
    Return _GUICtrlTreeView_Add($_hWnd, 0, $_sText)
    Else
    $hItem = _GUICtrlTreeView_GetFirstItem($_hWnd)
    If _GUICtrlTreeView_GetText($_hWnd, $hItem) = $_sParentUnique Then
    Return _GUICtrlTreeView_AddChild($_hWnd, $hItem, $_sText)
    Else
    While 1
    $hItem = _GUICtrlTreeView_GetNext($_hWnd, $hItem)
    If $hItem = 0 Then ExitLoop
    If _GUICtrlTreeView_GetText($_hWnd, $hItem) = $_sParentUnique Then
    Return _GUICtrlTreeView_AddChild($_hWnd, $hItem, $_sText)
    EndIf
    WEnd
    EndIf
    EndIf
    EndFunc

    [/autoit]
  • Vielen Dank dafür,

    hast mir sehr geholfen. Mein größtes Problem war letztendlich diese Zeile:

    $Parent = _GUICtrlTreeView_GetText($treeview, _GUICtrlTreeView_GetSelection($treeview))

    So kann ich jetzt eine Verbindung vom Child zum Parent herstellen :)

    ich hoffe, den Rest kann ich jetzt alleine stemmen (evtl. noch bzgl. Drag&Drop im Tree. Aber so weit bin ich noch nicht)

  • Eine Frage hätte ich doch noch.

    Wenn man den Tree eingelesen hat, stimmt zunächst alles. Clicked man dann mit der Maus
    z.B. auf Ford, so wird der komplette Baum nochmals als Kopie eingelesen, ohne dass man
    erneut auf einlesen geclicked hat.

    • Offizieller Beitrag
    Zitat

    Inder Beispieldatei einfach mit der Maus auf Fiesta clicken.(Im Anhang)

    Habs getan - und es passiert: absolut nichts!
    Der Code bietet auch nicht die Möglichkeit, dass durch Klick auf ein Item irgendwas passiert, da dieses Event mit keiner Aktion verknüpft ist.

  • Kann es sein, dass es mit dem Betriebssystem zusammenhängt? Ich nutze Win7 HomePremium 64Bit AutoIt3 Version 3.2.10.0

    • Offizieller Beitrag

    AutoIt3 Version 3.2.10.0


    *Hust *Hust
    AutoIt hat sich ab v3.3 massiv verändert, aktuell Stable ist 3.3.8.1 !!
    Solltest du zwingend aktualisieren.
    OS halte ich für nicht massgeblich (habe Win 7 Pro 64Bit).

    Ich habe dein Problem mal als Anlass für eine allgemeine Funktion genommen: TreeviewOrder.au3