- Offizieller Beitrag
Eine aktuelle Fragestellung im Forum hat mich dazu angeregt, diese Erweiterung für die Treeview Funktionen zu erstellen.
• _GUICtrlTreeView_CreateItemFromOrderFile
Erstellt Treeview Item aus einer Datei gemäß der gespeicherten Ordnung.
Root hat die Ornungsnummer "0". Childs unter Root bekommen "0.1", "0.2" ...
Deren Childs erhalten dann "0.1.1", "0.1.2", "0.2.1", "0.2.2" ... usw.
• _GUICtrlTreeView_GetItemOrder
Liest die Ordnungsreihenfolge der Einträge eines Treeview in einen speicherbaren String (Standard), aus dem mit der vorigen Funktion ein Treeview wieder befüllt werden kann, oder in ein Array.
Das ergibt dan z.B. folgenden String:
Spoiler anzeigen
Edit 04.12.2013:
2 Bugs gefixed
• Schreiben von nur 1 Item schlug fehl
• Item können jetzt folgende Zeichen enthalten: a-zA-Z0-9ßäöüÄÖÜ _,.+-|µ€§%$&
Beispiel
#include <GuiTreeView.au3>
#include <TreeViewConstants.au3>
#include <WindowsConstants.au3>
#include "TreeviewOrder.au3"
Global $aTreeview
Global $File = @ScriptDir & '\OrderTree.txt'
If Not FileExists($File) Then FileWrite($File, _
"0|Autos" & @CRLF & _
"0.1|Oldies" & @CRLF & _
"0.1.1|Ford" & @CRLF & _
"0.1.1.1|Capri" & @CRLF & _
"0.1.2|Opel" & @CRLF & _
"0.1.2.1|Manta" & @CRLF & _
"0.2|Neu" & @CRLF & _
"0.2.1|Ford" & @CRLF & _
"0.2.1.1|Fiesta" & @CRLF & _
"0.2.1.2|Mondeo" & @CRLF & _
"0.2.2|Opel" & @CRLF & _
"0.2.2.1|Insignia" & @CRLF & _
"0.2.3|BMW" & @CRLF & _
"0.2.3.1|3er" & @CRLF & _
"0.2.3.1.1|blau" & @CRLF & _
"0.2.3.1.2|silber" & @CRLF & _
"0.2.3.2|8er" & @CRLF)
$hGUI = GUICreate("Test", 350, 215)
$hTV = GUICtrlCreateTreeView(5, 5, 180, 200, BitOR($TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS), $WS_EX_CLIENTEDGE)
$btFile = GUICtrlCreateButton('Load From File', 245, 45, 100, 20)
$btWrite = GUICtrlCreateButton('Write To File', 245, 85, 100, 20)
GUISetState()
While 1
Switch GUIGetMsg()
Case -3
Exit
Case $btFile
_GUICtrlTreeView_BeginUpdate($hTV)
$aTreeview = _GUICtrlTreeView_CreateItemFromOrderFile($File, $hTV)
_GUICtrlTreeView_Expand($hTV)
$hItem = _GUICtrlTreeView_GetFirstChild($hTV, $aTreeview[0][0])
_GUICtrlTreeView_Expand($hTV, $hItem, False)
While 1
$hItem = _GUICtrlTreeView_GetNextSibling($hTV, $hItem)
If $hItem = 0 Then ExitLoop
_GUICtrlTreeView_Expand($hTV, $hItem, False)
WEnd
_GUICtrlTreeView_EndUpdate($hTV)
Case $btWrite
Local $sWrite = _GUICtrlTreeView_GetItemOrder($hTV)
;~ ConsoleWrite($sWrite & @LF)
Local $fH = FileOpen($File, 2)
FileWrite($fH, $sWrite)
FileClose($fH)
EndSwitch
WEnd
Die Funktion zum Speichern des Treeview-Inhalts arbeitet rekursiv und ist somit in der Anzahl der lesbaren Treeview-Ebenen nur begrenzt durch das Rekursionsmaximum.
TreeviewOrder.au3 (v0.3)
#Region - TimeStamp
; 2013-12-04 09:05:03 v 0.3
#EndRegion - TimeStamp
#include-once
#include <GuiTreeView.au3>
#include <Array.au3>
#cs ============================================================================= F U N C T I O N S =============================
• _GUICtrlTreeView_CreateItemFromOrderFile
Erstellt Treeview Item aus einer Datei gemäß der gespeicherten Ordnung
• _GUICtrlTreeView_GetItemOrder
Liest die Ordnungsreihenfolge der Einträge eines Treeview in einen speicherbaren String (Standard) oder in ein Array
#ce =============================================================================================================================
[/autoit] [autoit][/autoit] [autoit]; #FUNCTION# ====================================================================================================================
; Name ..........: _GUICtrlTreeView_CreateItemFromOrderFile
; Description ...: Erstellt Treeview Item aus einer Datei gemäß der gespeicherten Ordnung
; Syntax ........: _GUICtrlTreeView_CreateItemFromOrderFile($_sFile, $_hWnd[, $_sDelim = -1])
; Parameters ....: $_sFile - Dateipfad.
; ...............: $_hWnd - Treeview Handle.
; ...............: $_sDelim - [optional] Trenner. Standard ist -1 = Opt("GUIDataSeparatorChar")
; ...............: $_sDelim trennt Ordnungsnummer von Itemtext
; Return values .: Erfolg Array [[Handle-Item, Ordnungsnummer, Item-Text]]
; ...............: Fehler 0 @error = 1: Datei lesen fehlgeschlagen
; ...............: = 2: Datei enthält keine Einträge
; Author ........: BugFix ( [email='bugfix@autoit.de'][/email] )
; ===============================================================================================================================
Func _GUICtrlTreeView_CreateItemFromOrderFile($_sFile, $_hWnd, $_sDelim=-1)
If $_sDelim = -1 Then $_sDelim = Opt("GUIDataSeparatorChar")
Local $sRead = FileRead($_sFile)
If @error Then Return SetError(1,0,0)
Local $aItem = StringRegExp($sRead, "([\d\.]*)" & $_sDelim & "([a-zA-Z0-9ßäöüÄÖÜ _,.+-|µ€§%$&]+)", 3)
If Not IsArray($aItem) Then Return SetError(2,0,0)
Local $n = 0, $aTree[UBound($aItem)/2][3] ; == [[Handle-Item, sOrder, Item-Text]]
Local $sOrderParent
For $i = 0 To UBound($aItem) -2 Step 2
$sOrderParent = __OrderNumber($aItem[$i], False)
Switch $sOrderParent
Case ''
$aTree[$n][0] = _GUICtrlTreeView_Add($_hWnd, 0, $aItem[$i+1])
Case Else
For $j = 0 To $n
If $aTree[$j][1] = $sOrderParent Then
$aTree[$n][0] = _GUICtrlTreeView_AddChild($_hWnd, $aTree[$j][0], $aItem[$i+1])
EndIf
Next
EndSwitch
$aTree[$n][1] = $aItem[$i] ; == sOrder
$aTree[$n][2] = $aItem[$i+1] ; == Item-Name
$n += 1
Next
Return $aTree
EndFunc ;==>_GUICtrlTreeView_CreateItemFromOrderFile
; #FUNCTION# ====================================================================================================================
; Name ..........: _GUICtrlTreeView_GetItemOrder
; Description ...: Liest die Ordnungsreihenfolge der Einträge eines Treeview in einen speicherbaren String (Standard)
; ...............: oder in ein Array
; ...............: Root hat die Ornungsnummer "0". Childs unter Root bekommen "0.1", "0.2" ...
; ...............: Deren Childs erhalten dann "0.1.1", "0.1.2", "0.2.1", "0.2.2" ... usw.
; Syntax ........: _GUICtrlTreeView_GetItemOrder($_hWnd[, $_fString = 1[, $_sDelim = -1]])
; Parameters ....: $_hWnd Handle des Treeview
; ...............: $_fString 1 (Standard): Ausgabe als String "OrdnungsNr TRENNER ItemText CRLF", 0 gibt Array zurück
; ...............: $_sDelim -1 (Standard): Trennzeichen von Opt(GUIDataSeparatorChar)
; Return values .: Erfolg String um Inhalte mit Ordnungsreihenfolge in Datei zu speichern oder
; ...............: Array [[Item-Handle, Ordnungsnummer, Item-Text]]
; Author ........: BugFix ( [email='bugfix@autoit.de'][/email] )
;================================================================================================================================
Func _GUICtrlTreeView_GetItemOrder($_hWnd, $_fString=1, $_sDelim=-1)
If $_sDelim = -1 Then $_sDelim = Opt("GUIDataSeparatorChar")
Local $iCount = _GUICtrlTreeView_GetCount($_hWnd)
If $iCount = 0 Then Return SetError(1,0,0)
Local $hItem = _GUICtrlTreeView_GetFirstItem($_hWnd), $sOrder = '0'
Local $aItem[$iCount][3] = [[$hItem, $sOrder, _GUICtrlTreeView_GetText($_hWnd, $hItem)]], $iCurrIndex = 1
If $iCount > 1 Then __GetItemArray($_hWnd, $hItem, $aItem, $iCurrIndex, $sOrder)
If Not $_fString Then Return $aItem
Local $sRet = ''
For $i = 0 To UBound($aItem) -1
$sRet &= $aItem[$i][1] & $_sDelim & $aItem[$i][2] & @CRLF
Next
Return $sRet
EndFunc ;==>_GUICtrlTreeView_GetItemOrder
#Region - Helper Functions
Func __GetItemArray($_hWnd, $_hParent, ByRef $_aItem, ByRef $_iIndex, $_sOrderParent)
Local $sOrder = __OrderNumber($_sOrderParent, True, True)
Local $hItem = _GUICtrlTreeView_GetFirstChild($_hWnd, $_hParent)
$_aItem[$_iIndex][0] = $hItem
$_aItem[$_iIndex][1] = $sOrder
$_aItem[$_iIndex][2] = _GUICtrlTreeView_GetText($_hWnd, $hItem)
$_iIndex += 1
If _GUICtrlTreeView_GetChildCount($_hWnd, $hItem) > 0 Then
__GetItemArray($_hWnd, $hItem, $_aItem, $_iIndex, $sOrder)
EndIf
While 1
$hItem = _GUICtrlTreeView_GetNextSibling($_hWnd, $hItem)
If $hItem = 0 Then ExitLoop
$sOrder = __OrderNumber($sOrder)
$_aItem[$_iIndex][0] = $hItem
$_aItem[$_iIndex][1] = $sOrder
$_aItem[$_iIndex][2] = _GUICtrlTreeView_GetText($_hWnd, $hItem)
$_iIndex += 1
If _GUICtrlTreeView_GetChildCount($_hWnd, $hItem) > 0 Then
__GetItemArray($_hWnd, $hItem, $_aItem, $_iIndex, $sOrder)
EndIf
WEnd
EndFunc ;==>__GetItemArray
Func __OrderNumber($_sOrder, $_fIncrease=True, $_fNextSub=False)
If $_fIncrease Then ; == increase order number
If $_fNextSub Then Return $_sOrder & '.1'
Local $sLeft, $sRight, $iPos
$iPos = StringInStr($_sOrder, '.', 1, -1)
$sLeft = StringLeft($_sOrder, $iPos)
$sRight = StringTrimLeft($_sOrder, $iPos)
Return $sLeft & ($sRight +1)
Else ; == get parent order number
If $_sOrder = '0' Then Return ''
Local $iPos = StringInStr($_sOrder, '.', 1, -1)
Return StringLeft($_sOrder, $iPos -1)
EndIf
EndFunc ;==>__OrderNumber
#EndRegion - Helper Functions
DL bisher: 34