Seite 1 von 1

XTC_TreeListPointerManager -Pointer- und Strukturierte Liste

Verfasst: 17.05.2006 22:48
von Leonhard
Der TreeListPointerManager ist eine kleine Lib (Code), der es möglich macht, eine TreeListe zu erstellen. Dieses System basiert auf Pointer. Hab ich Öfters gebraucht, um in einem Interface oder in eine Liste mit Unter-Listen zu arbeiten. Dieses System ist schon manls im Forum freigegeben worden. Ich hab dies nur mit neuen Funktionen gefüllt und besser Strukturiert. Hilfe ist im Code mit eingebunden. Code für PB4.0 Optimiert.

Hinweis:
Die meisten Fehler treten dann auf, wenn man in ein Element einen Pointer geschreiben hat, der 0 ist und diesen dann auslesen möchte (auf jeden fall bei mir die häufigste Fehlerquelle).

Code: Alles auswählen

;{ Lib-Daten von: XTC_TreeListPointerManager.pbi
;// Beschreibung:
;// 	Einleitung:
;// 	-----------
;// 	Die Library basiert vollkommen auf Pointer. Entgegen
;// 	gesetzt der eingebauten Purebasic Linkedlist Funktionen.
;// 	
;// 	Da eine Liste in dieser Library als Pointer zurück
;// 	gegeben (und auch so behandelt) wird, kann man eine
;// 	Liste auch als Element hinzufügen.
;// 	
;// 	Ein Kleines Beispiel: Du machst zunächst Zwei Listen
;// 	wie hier:
;// 	*Liste1.TPL_List = TPL_CreateList()
;// 	*Liste2.TPL_List = TPL_CreateList()
;// 	
;// 	Nun kannst du den Pointer von Liste2 als Element zu
;// 	Liste1 angeben. Wie hier:
;// 	TPL_AddElement(*Liste1, *Liste2)
;// 	
;// 	Wenn du später die Liste in der Liste durchgehen
;// 	willst, dann musst du einfach eine zusätzliche
;// 	Schleife machen. Wie du alle Elemente durchscanst
;// 	wird hier im Code nun gezeigt. Der rest bleibt
;// 	dein logisches Denken überlassen.
;// 	
;// 	Wichtiger Hinweis!!!
;// 	--------------------
;// 	Diese Library sieht auf den ersten Blick etwas mager
;// 	aus. Aber wenn man mit Pointer umzugehen weis, der
;// 	wird wissen wie unnötig Childs und Parents wirklich
;// 	sind - woraus z.B. NicTheQuick's Library aufbaut.
;// Autor(en):
;// 	ShadowTurtle
;// 	Macron ALIAS Leonhard Schick (zusätzliche Funktionen)
;// Überarbeitet von:
;// 	Macron ALIAS Leonhard Schick
;// Version/Datum:
;// 	--/Fr., 18. Februar 2005  <-- ShadowTurtle
;// 	--/Di., 09. Mai 2006      <-- Macron ALIAS Leonhard Schick
;// Getestet mit...
;// 	PureBasic 3.94
;// Orginal-Datei-Name:
;// 	XTC_TreeListPointerManager.pbi ALIAS TreeManager.pb

;// Abkürzungserklärungen:
;// 	TPL = TreePointerList
CompilerIf Defined(TPL_Element, #PB_Structure) = #False
	Structure TPL_Element
		*Element_Next.TPL_Element ; der Pointer des nächsten   Elementens der Liste
		*Element_Prev.TPL_Element ; der Pointer des vorherigen Elementens der Liste
		*Pointer                  ; der Pointer des            Elementens der Liste
	EndStructure
CompilerEndIf

CompilerIf Defined(TPL_List, #PB_Structure) = #False
	Structure TPL_List
		*Element_Last  .TPL_Element ; Das letzte   Element
		*Element_First .TPL_Element ; Das erste    Element
		*Element_Actual.TPL_Element ; Das aktuelle Element
		
		ScanInverse.l ; Richtung des Durchlaufes
		ScanPos.l     ; Position der Liste
		Elements.l    ; Anzahl der Elemente
	EndStructure
CompilerEndIf

;// Syntax:
;// 	TPL_CreateList()
;// Änliche Befehle:
;// 	NewList
;// Beschreibung:
;// 	Erstellt eine Liste.
;// Rückgabewert(Pointer * ALIAS .l):
;// 	Der Pointer der Liste.
ProcedureDLL TPL_CreateList()
	Protected *List.TPL_List
	*List = AllocateMemory(SizeOf(TPL_List))
	*List\Elements = 0
	
	ProcedureReturn *List
EndProcedure

;// Syntax:
;// 	TPL_AddElement(*List.TPL_List, *Pointer)
;// Änliche Befehle:
;// 	AddElement(...)
;// Beschreibung:
;// 	Erstellt ein neues Element der angegebenen Liste.
;// Parameter:
;// 	*List.TPL_List
;// 		Der Pointer der Liste.
;// 	*Pointer
;// 		Der Pointer des Elemenetes der Liste.
ProcedureDLL.b TPL_AddElement(*List.TPL_List, *Pointer)
	Protected *AddElement.TPL_Element
	
	; Erstellt den Pointer des Elemenetes und schreibt den angegebenen Pointer
	; in den Element-Pointer.
	*AddElement = AllocateMemory(SizeOf(TPL_Element))
	*AddElement\Pointer = *Pointer
	
	If *List\Elements = 0 ; Wenn noch kein Element erstellt wurde ...
		*List\Element_First = *AddElement
	Else ; Wenn schon Elemente in der Liste vorhanden sind
		*List\Element_Last\Element_Prev = *AddElement
	EndIf
	
	*AddElement\Element_Next = *List\Element_Last
	*List\Element_Last = *AddElement
	
	; Setzt das Neu erstellte Element als Aktuelles Element
	*List\Element_Actual = *AddElement
	
	; Setze Anzahl der Elemente +1, da ein neues Element erstellt wurde
	*List\Elements = *List\Elements + 1
EndProcedure

;// Syntax:
;// 	TPL_RunInverse(*List.TPL_List, Mode.b)
;// Beschreibung:
;// 	Gibt an, ob die Liste forwärts oder Rückwerts abgelaufen wird.
;// 	Standart ist Mode.b = #TPL_RunInverse_forwards.
;// Parameter:
;// 	*List.TPL_List
;// 		Der Pointer der Liste.
;// 	Mode.b
;// 		Ist Standartmäsig #TPL_RunInverse_forwards. Kann in
Enumeration 0 ; TPL_RunInverse
	#TPL_RunInverse_forwards  ; vorwärts
	#TPL_RunInverse_backwards ; rückwerts
EndEnumeration
;// 		geändert werden.
;// 		Achtung !!! Verbindung mit | -Zeichen nicht möglich.
ProcedureDLL TPL_RunInverse(*List.TPL_List, Mode.b)
	*List\ScanInverse = Mode
EndProcedure

;// Syntax:
;// 	TPL_ListIndex(*List.TPL_List)
;// Beschreibung:
;// 	Gibt die Position des aktuellen Listenelements zurück. Beginnend bei 0.
;// Parameter:
;// 	*List.TPL_List
;// 		Der Pointer der Liste.
;// Rückgabewert:
;// 	Die aktuelle Position der Liste.
ProcedureDLL TPL_ListIndex(*List.TPL_List)
	ProcedureReturn *List\ScanPos
EndProcedure

;// Syntax:
;// 	TPL_FirstElement(*List.TPL_List)
;// Beschreibung:
;// 	Ändert das aktuelle Listenelement auf das erste Listenelement.
;// Parameter:
;// 	*List.TPL_List
;// 		Der Pointer der Liste.
ProcedureDLL TPL_FirstElement(*List.TPL_List)
	*List\ScanPos = 0
EndProcedure

;// Syntax:
;// 	TPL_NextElement(*List.TPL_List)
;// Änliche Befehle:
;// 	NextElement(...)
;// Beschreibung:
;// 	Springt zum nächsten Element der Liste.
;// Parameter:
;// 	*List.TPL_List
;// 		Der Pointer der Liste.
;// Rückgabewert(.b):
;// 	Gibt die Position des Aktuellen (nach der ausführung) Elementes zurück.
;// 	Wenn #False, gibt es kein weiteres Element.
ProcedureDLL.b TPL_NextElement(*List.TPL_List)
	*List\ScanPos = *List\ScanPos + 1
	
	If *List\ScanInverse = #True
		If *List\ScanPos = 1
			*List\Element_Actual = *List\Element_First
		Else
			*List\Element_Actual = *List\Element_Actual\Element_Prev
		EndIf
	Else
		If *List\ScanPos = 1
			*List\Element_Actual = *List\Element_Last
		Else
			*List\Element_Actual = *List\Element_Actual\Element_Next
		EndIf
	EndIf
	
	If *List\ScanPos-1 = *List\Elements
		ProcedureReturn #False
	Else
		ProcedureReturn *List\ScanPos
	EndIf
EndProcedure

;// Syntax:
;// 	TPL_PreviousElement(*List.TPL_List)
;// Änliche Befehle:
;// 	PreviousElement(...)
;// Beschreibung:
;// 	Springt zum letzten Element der Liste.
;// Parameter:
;// 	*List.TPL_List
;// 		Der Pointer der Liste.
;// Rückgabewert(.b):
;// 	Gibt die Position des Aktuellen (nach der ausführung) Elementes zurück.
;// 	Wenn #False, gibt es keine tiferen Element.
ProcedureDLL.b TPL_PreviousElement(*List.TPL_List)
	*List\ScanPos = *List\ScanPos - 1
	
	If *List\ScanInverse = #True
		If *List\ScanPos = 1
			*List\Element_Actual = *List\Element_First
		Else
			*List\Element_Actual = *List\Element_Actual\Element_Prev
		EndIf
	Else
		If *List\ScanPos = 1
			*List\Element_Actual = *List\Element_Last
		Else
			*List\Element_Actual = *List\Element_Actual\Element_Next
		EndIf
	EndIf
	
	If *List\ScanPos-1 = *List\Elements
		ProcedureReturn #False
	Else
		ProcedureReturn *List\ScanPos
	EndIf
EndProcedure

;// Syntax:
;// 	TPL_LastElement(*List.TPL_List)
;// Änliche Befehle:
;// 	LastElement(...)
;// Beschreibung:
;// 	Ändert das aktuelle Listenelement auf das letzte Listenelement.
;// Parameter:
;// 	*List.TPL_List
;// 		Der Pointer der Liste.
ProcedureDLL TPL_LastElement(*List.TPL_List)
	*List\ScanPos = *List\Elements
EndProcedure

;// Syntax:
;// 	TPL_CountList(*List.TPL_List)
;// Änliche Befehle:
;// 	CountList(...)
;// Beschreibung:
;// 	Zählt, wie viele Elemente in der verknüpften Liste vorhanden sind.
;// Parameter:
;// 	*List.TPL_List
;// 		Der Pointer der Liste.
;// Rückgabewert:
;// 	Die Anzahl der Elemente in der Liste.
ProcedureDLL TPL_CountList(*List.TPL_List)
	ProcedureReturn *List\Elements
EndProcedure

;// Syntax:
;// 	TPL_GetElementPointer(*List.TPL_List)
;// Beschreibung:
;// 	Gibt den Pointer des Elementes zurück.
;// Parameter:
;// 	*List.TPL_List
;// 		Der Pointer der Liste.
;// Rückgabewert(Pointer *):
;// 	Der Pointer des Elementes.
ProcedureDLL TPL_GetElementPointer(*List.TPL_List)
	ProcedureReturn *List\Element_Actual\Pointer
EndProcedure

;// Syntax:
;// 	TPL_GetElementPointer(*List.TPL_List)
;// Beschreibung:
;// 	Setzt den Pointer des Elementes. Der alte Pointer wird
;// 	bei dieser Funktion gelöscht (wenn unwar #False (0) ).
;// Parameter:
;// 	*List.TPL_List
;// 		Der Pointer der Liste.
;// 	*Pointer
;// 		Der Pointer, der Statt dem alten Pointer eingesetzt wirt.
;// 		Der alte Pointer wird (wenn unwar #False (0) ) gelöscht.
ProcedureDLL TPL_SetElementPointer(*List.TPL_List, *Pointer)
	If *List\Element_Actual\Pointer
		FreeMemory(*List\Element_Actual\Pointer)
	EndIf
	*List\Element_Actual\Pointer
EndProcedure

;// Syntax:
;// 	TPL_SelectElement(*List.TPL_List, Pos.l)
;// Änliche Befehle:
;// 	SelectElement(...)
;// Beschreibung:
;// 	Springt zur angegebenen Position der Liste. Das erste Element befindet sich an Position 1.
;// Parameter:
;// 	*List.TPL_List
;// 		Der Pointer der Liste.
;// 	Pos(.l)
ProcedureDLL TPL_SelectElement(*List.TPL_List, Pos)
	Protected ScanPos.l
	ScanPos = 0
	
	TPL_FirstElement(*List)
	While ScanPos > -1
		ScanPos = ScanPos + 1
		If ScanPos = Pos + 1
			ScanPos = -1
		Else
			If TPL_NextElement(*List) = 0
				ScanPos = -1
			EndIf
		EndIf
	Wend
EndProcedure

;// Syntax:
;// 	TPL_SwapNext(*List.TPL_List)
;// Beschreibung:
;// 	Tauscht mit dem nächsten Element.
;// Parameter:
;// 	*List.TPL_List
;// 		Der Pointer der Liste.
ProcedureDLL TPL_SwapNext(*List.TPL_List)
	Protected *TempPointer
	*TempPointer = *List\Element_Actual\Pointer
	*List\Element_Actual\Pointer = *List\Element_Actual\Element_Next\Pointer
	*List\Element_Actual\Element_Next\Pointer = *TempPointer
	
	*List\Element_Actual = *List\Element_Actual\Element_Next
EndProcedure

;// Syntax:
;// 	TPL_SwapPrevious(*List.TPL_List)
;// Beschreibung:
;// 	Tauscht mit dem vorherigem Element.
;// Parameter:
;// 	*List.TPL_List
;// 		Der Pointer der Liste.
ProcedureDLL TPL_SwapPrevious(*List.TPL_List)
	Protected *TempPointer
	*TempPointer = *List\Element_Actual\Pointer
	*List\Element_Actual\Pointer = *List\Element_Actual\Element_Prev\Pointer
	*List\Element_Actual\Element_Prev\Pointer = *TempPointer
	
	*List\Element_Actual = *List\Element_Actual\Element_Prev
EndProcedure

;// Syntax:
;// 	TPL_SwapElements(*List.TPL_List, PosA.l, PosB.l)
;// Änliche Befehle:
;// 	SwapElements(...)
;// 		Die Übergabe sind hier nur die Positionen, nicht die Pointer.
;// Beschreibung:
;// 	Tauscht die PosA und PosB -Elemente. Angaben in Nummer.
;// Parameter:
;// 	*List.TPL_List
;// 		Der Pointer der Liste.
;// 	PosA(.l)
;// 		Die Position des zu tauschendem Elementes.
;// 	PosB(.l)
;// 		Die Position des zu tauschendem Elementes.
ProcedureDLL TPL_SwapElements(*List.TPL_List, PosA, PosB)
	Protected *TempActualElement.TPL_Element, *TempPointer
	TPL_SelectElement(*List, PosA)
	*TempActualElement = *List\Element_Actual
	
	TPL_SelectElement(*List, PosB)
	*TempPointer = *TempActualElement\Pointer
	*TempActualElement\Pointer = *List\Element_Actual\Pointer
	*List\Element_Actual\Pointer = *TempPointer
EndProcedure

;// Syntax:
;// 	TPL_DeleteElement(*List.TPL_List)
;// Änliche Befehle:
;// 	DeleteElement(...)
;// Beschreibung:
;// 	Löscht ein Element aus der Liste.
;// Parameter:
;// 	*List.TPL_List
;// 		Der Pointer der Liste.
ProcedureDLL TPL_DeleteElement(*List.TPL_List)
	Protected *Element_Delete.TPL_Element
	*Element_Delete = *List\Element_Actual
	
	If *Element_Delete = *List\Element_First
		*List\Element_First = *List\Element_Actual\Element_Prev
		*List\Element_Actual = *List\Element_First
	ElseIf *Element_Delete = *List\Element_Last
		*List\Element_Last = *List\Element_Actual\Element_Next
		*List\Element_Actual = *List\Element_Last
	Else
		*List\Element_Actual\Element_Next\Element_Prev = *List\Element_Actual\Element_Prev
		*List\Element_Actual\Element_Prev\Element_Next = *List\Element_Actual\Element_Next
		*List\Element_Actual = *List\Element_Actual\Element_Prev
	EndIf
	
	FreeMemory(*Element_Delete)
	
	If *List\Elements > 0
		*List\Elements = *List\Elements - 1
	EndIf
EndProcedure

;// Syntax:
;// 	TPL_ClearList(*List.TPL_List)
;// Änliche Befehle:
;// 	ClearList(...)
;// Beschreibung:
;// 	Löscht alle Element aus der Liste.
;// Parameter:
;// 	*List.TPL_List
;// 		Der Pointer der Liste.
ProcedureDLL TPL_ClearList(*List.TPL_List)
	While *List\Elements > 0
		TPL_SelectElement(*List, 1)
		TPL_DeleteElement(*List)
	Wend
EndProcedure

;// Syntax:
;// 	TPL_DeleteList(*List.TPL_List)
;// Beschreibung:
;// 	Löscht die angegebene Liste aus dem Speicher.
;// 	Dies bedeutet, das diese nicht wirder verwendet werden kann.
;// Parameter:
;// 	*List.TPL_List
;// 		Der Pointer der Liste.
ProcedureDLL TPL_DeleteList(*List.TPL_List)
	TPL_ClearList(*List)
	
	FreeMemory(*List)
EndProcedure
;}

CompilerIf Defined(IXTC_TreeListPointerManager,#PB_Interface) = #False
;{ Lib-Daten von: XTC_ITreeListPointerManager.pbi
;// Beschreibung:
;// 	Mit der Hilfe dieser Lib können Sie die TreeListPointerManager -Liste
;// 	als Interface verwenden. Der Interface-Name ist 'IXTC_TreeListPointerManager'
;// 	Erstellen können Sie die das Interface mit dem Befehl: 'CreateITreeListPointerManager()'
;// Autor(en):
;// 	Macron ALIAS Leonhard Schick
;// Version/Datum:
;// 	--/Di., 09. Mai 2006
;// Getestet mit...
;// 	PureBasic 3.94
;// Orginal-Datei-Name:
;// 	XTC_ITreeListPointerManager.pbi

;// Abkürzungserklärungen:
;// 	TPL = TreePointerList

Interface IXTC_TreeListPointerManager
	AddElement(*Pointer)
	RunInverse(Mode.b)
	ListIndex()
	CountList()
	FirstElement()
	NextElement()
	PreviousElement()
	LastElement()
	GetElementPointer()
	SetElementPointer(*Pointer)
	SelectElement(Pos)
	SwapNext()
	SwapPrevious()
	SwapElements(PosA, PosB)
	DeleteElement()
	Free()
EndInterface

Structure IXTC_TreeListPointerManager_IT
	IT.l[SizeOf(IXTC_TreeListPointerManager)/4]
EndStructure

Structure IXTC_TreeListPointerManager_Date
	*VirtualT
	*List
EndStructure

Enumeration 0 ; IXTC_TreeListPointerManager_VT
	#IXTC_TreeListPointerManager_CP_Comand_AddElement
	#IXTC_TreeListPointerManager_CP_Comand_RunInverse
	#IXTC_TreeListPointerManager_CP_Comand_ListIndex
	#IXTC_TreeListPointerManager_CP_Comand_CountList
	#IXTC_TreeListPointerManager_CP_Comand_FirstElement
	#IXTC_TreeListPointerManager_CP_Comand_NextElement
	#IXTC_TreeListPointerManager_CP_Comand_PreviousElement
	#IXTC_TreeListPointerManager_CP_Comand_LastElement
	#IXTC_TreeListPointerManager_CP_Comand_GetElementPointer
	#IXTC_TreeListPointerManager_CP_Comand_SetElementPointer
	#IXTC_TreeListPointerManager_CP_Comand_SelectElement
	#IXTC_TreeListPointerManager_CP_Comand_SwapNext
	#IXTC_TreeListPointerManager_CP_Comand_SwapPrevious
	#IXTC_TreeListPointerManager_CP_Comand_SwapElements
	#IXTC_TreeListPointerManager_CP_Comand_DeleteElement
	#IXTC_TreeListPointerManager_CP_Comand_Free
EndEnumeration


Procedure __IXTC_TreeListPointerManager_AddElement(*this.IXTC_TreeListPointerManager_Date, *Pointer)
	TPL_AddElement(*this\List, *Pointer)
EndProcedure

Procedure __IXTC_TreeListPointerManager_RunInverse(*this.IXTC_TreeListPointerManager_Date, Mode.b)
	TPL_RunInverse(*this\List, Mode)
EndProcedure

Procedure __IXTC_TreeListPointerManager_ListIndex(*this.IXTC_TreeListPointerManager_Date)
	ProcedureReturn TPL_ListIndex(*this\List)
EndProcedure

Procedure __IXTC_TreeListPointerManager_CountList(*this.IXTC_TreeListPointerManager_Date)
	ProcedureReturn TPL_CountList(*this\List)
EndProcedure

Procedure __IXTC_TreeListPointerManager_FirstElement(*this.IXTC_TreeListPointerManager_Date)
	TPL_FirstElement(*this\List)
EndProcedure

Procedure.b __IXTC_TreeListPointerManager_NextElement(*this.IXTC_TreeListPointerManager_Date)
	ProcedureReturn TPL_NextElement(*this\List)
EndProcedure

Procedure.b __IXTC_TreeListPointerManager_PreviousElement(*this.IXTC_TreeListPointerManager_Date)
	ProcedureReturn TPL_PreviousElement(*this\List)
EndProcedure

Procedure __IXTC_TreeListPointerManager_LastElement(*this.IXTC_TreeListPointerManager_Date)
	TPL_LastElement(*this\List)
EndProcedure

Procedure __IXTC_TreeListPointerManager_GetElementPointer(*this.IXTC_TreeListPointerManager_Date)
	ProcedureReturn TPL_GetElementPointer(*this\List)
EndProcedure

Procedure __IXTC_TreeListPointerManager_SetElementPointer(*this.IXTC_TreeListPointerManager_Date, *Pointer)
	ProcedureReturn TPL_SetElementPointer(*this\List, *Pointer)
EndProcedure

Procedure __IXTC_TreeListPointerManager_SelectElement(*this.IXTC_TreeListPointerManager_Date, Pos)
	TPL_SelectElement(*this\List, Pos)
EndProcedure

Procedure __IXTC_TreeListPointerManager_SwapNext(*this.IXTC_TreeListPointerManager_Date)
	TPL_SwapNext(*this\List)
EndProcedure

Procedure __IXTC_TreeListPointerManager_SwapPrevious(*this.IXTC_TreeListPointerManager_Date)
	TPL_SwapPrevious(*this\List)
EndProcedure

Procedure __IXTC_TreeListPointerManager_SwapElements(*this.IXTC_TreeListPointerManager_Date, PosA, PosB)
	TPL_SwapElements(*this\List, PosA, PosB)
EndProcedure

Procedure __IXTC_TreeListPointerManager_DeleteElement(*this.IXTC_TreeListPointerManager_Date)
	TPL_DeleteElement(*this\List)
EndProcedure

Procedure __IXTC_TreeListPointerManager_Free(*this.IXTC_TreeListPointerManager_Date)
	; Lösche Liste
	TPL_DeleteList(*this\List)
	; Lösche Interface
	FreeMemory(*this)
EndProcedure


ProcedureDLL CreateITreeListPointerManager()
	Protected *object.IXTC_TreeListPointerManager_Date
	Static *VT.IXTC_TreeListPointerManager_IT
	If *VT = #Null
		*VT = AllocateMemory(SizeOf(IXTC_TreeListPointerManager_IT))
		*VT\IT[#IXTC_TreeListPointerManager_CP_Comand_AddElement     ] = @__IXTC_TreeListPointerManager_AddElement()
		*VT\IT[#IXTC_TreeListPointerManager_CP_Comand_RunInverse     ] = @__IXTC_TreeListPointerManager_RunInverse()
		*VT\IT[#IXTC_TreeListPointerManager_CP_Comand_ListIndex      ] = @__IXTC_TreeListPointerManager_ListIndex()
		*VT\IT[#IXTC_TreeListPointerManager_CP_Comand_CountList      ] = @__IXTC_TreeListPointerManager_CountList()
		*VT\IT[#IXTC_TreeListPointerManager_CP_Comand_FirstElement   ] = @__IXTC_TreeListPointerManager_FirstElement()
		*VT\IT[#IXTC_TreeListPointerManager_CP_Comand_NextElement    ] = @__IXTC_TreeListPointerManager_NextElement()
		*VT\IT[#IXTC_TreeListPointerManager_CP_Comand_PreviousElement] = @__IXTC_TreeListPointerManager_PreviousElement()
		*VT\IT[#IXTC_TreeListPointerManager_CP_Comand_LastElement    ] = @__IXTC_TreeListPointerManager_LastElement()
		*VT\IT[#IXTC_TreeListPointerManager_CP_Comand_GetElementPointer ] = @__IXTC_TreeListPointerManager_GetElementPointer()
		*VT\IT[#IXTC_TreeListPointerManager_CP_Comand_SetElementPointer ] = @__IXTC_TreeListPointerManager_SetElementPointer()
		*VT\IT[#IXTC_TreeListPointerManager_CP_Comand_SelectElement  ] = @__IXTC_TreeListPointerManager_SelectElement()
		*VT\IT[#IXTC_TreeListPointerManager_CP_Comand_SwapNext       ] = @__IXTC_TreeListPointerManager_SwapNext()
		*VT\IT[#IXTC_TreeListPointerManager_CP_Comand_SwapPrevious   ] = @__IXTC_TreeListPointerManager_SwapPrevious()
		*VT\IT[#IXTC_TreeListPointerManager_CP_Comand_SwapElements   ] = @__IXTC_TreeListPointerManager_SwapElements()
		*VT\IT[#IXTC_TreeListPointerManager_CP_Comand_DeleteElement  ] = @__IXTC_TreeListPointerManager_DeleteElement()
		*VT\IT[#IXTC_TreeListPointerManager_CP_Comand_Free           ] = @__IXTC_TreeListPointerManager_Free()
	EndIf
	*object = AllocateMemory(SizeOf(IXTC_TreeListPointerManager_IT))
	*object\VirtualT = *VT
	
	*object\List = TPL_CreateList()
	If *object\List = 0
		ProcedureReturn #False
	EndIf
	
	ProcedureReturn *object
EndProcedure

;}
CompilerEndIf

Verfasst: 17.05.2006 23:09
von MVXA
Beispiel?

Verfasst: 18.05.2006 18:28
von Leonhard
Hier. Beispiel 1 mit Befehlen, Beispiel 2 mit Interface.

Code: Alles auswählen

; Nun wird die Liste erstellt.
*TestList = TPL_CreateList()

; Erstelle 10 mal ein Element für die Liste.
For I = 1 To 10
	; Zunächst wird pro Durchlauf eine Test Struktur in Speicher
	; hergerichtet. MyString wird "Blub" + .. zugewiesen.
	*Test.STRING = AllocateMemory(SizeOf(STRING))
	*Test\s = "Blub" + Str(I)
	
	; Nun kommt der eigentliche Sinn einer Pointerliste: Füge ein
	; Element mit den Pointer des gerade reservierten Speichers
	; hinzu.
	TPL_AddElement(*TestList, *Test.STRING)
Next

; Öffne Konsole
OpenConsole()

; Scane die Liste Rückwärts ...
TPL_RunInverse(*TestList, #True)

; Neues Scanen.
TPL_FirstElement(*TestList)

; Gehe jedes Element durch der Liste "*TestList" durch.
While TPL_NextElement(*TestList)
	; Nun wird ein Pointer belegt. In dem fall muss man
	; .TestStruct angeben, weil es sich hierbei ja um
	; solch eine struktur handelt.
	
	; In den Pointer kommt nun die Adresse die im Element
	; Gespeichert ist.
	*ScanPoint.STRING = TPL_GetElementPointer(*TestList)
	
	; Nun ist es möglich anhand des Pointers seine Daten
	; (in dem fall ein String) auszugeben - wie man hier
	; sehen kann:
	PrintN(*ScanPoint\s)
Wend

PrintN("--------------------------------------------")
PrintN("Listen-Element-Anzahl: "+Str(TPL_CountList(*TestList)))

; Warte auf Return.
Input()

; Schließe Konsole.
CloseConsole()

; Lösche Liste
TPL_DeleteList(*TestList)

Code: Alles auswählen

; Nun wird die Liste erstellt.
TestList.IXTC_TreeListPointerManager = CreateITreeListPointerManager()

; Erstelle 10 mal ein Element für die Liste.
For I = 1 To 10
	; Zunächst wird pro Durchlauf eine Test Struktur in Speicher
	; hergerichtet. MyString wird "Blub" + .. zugewiesen.
	*Test.STRING = AllocateMemory(SizeOf(STRING))
	*Test\s = "Blub" + Str(I)
	
	; Nun kommt der eigentliche Sinn einer Pointerliste: Füge ein
	; Element mit den Pointer des gerade reservierten Speichers
	; hinzu.
	TestList\AddElement(*Test)
Next

; Öffne Konsole
OpenConsole()

; Scane die Liste Rückwärts ...
TestList\RunInverse(#True)

; Neues Scanen.
TestList\FirstElement()

; So ...
For S1 = 1 To TestList\CountList()
	TestList\SelectElement(S1)
	*ScanPoint.STRING = TestList\GetElementPointer()
	PrintN(*ScanPoint\s)
Next
TestList\FirstElement()
PrintN("--------------------------------------------")
; oder So ...
; Gehe jedes Element durch der Liste "*TestList" durch.
While TestList\NextElement()
	; Nun wird ein Pointer belegt. In dem fall muss man
	; .TestStruct angeben, weil es sich hierbei ja um
	; solch eine struktur handelt.
	
	; In den Pointer kommt nun die Adresse die im Element
	; Gespeichert ist.
	*ScanPoint.STRING = TestList\GetElementPointer()
	
	; Nun ist es möglich anhand des Pointers seine Daten
	; (in dem fall ein String) auszugeben - wie man hier
	; sehen kann:
	PrintN(*ScanPoint\s)
Wend

PrintN("--------------------------------------------")
PrintN("Listen-Element-Anzahl: "+Str(TestList\CountList()) )

; Warte auf Return.
Input()

; Schließe Konsole.
CloseConsole()

; Lösche Liste
TestList\Free()

Verfasst: 01.12.2006 15:45
von ShadowTurtle
Du hattest einen kleinen Fehler im Quellcode gemacht. Viele Deklarierungen der wichtigen ProcedureDLL.l Funktionen waren von Long in Byte umgeschrieben worden. So waren nur 256 einträge pro Linkedlist möglich.

Ansonsten gibt es nun eine ganz neue Version. Ich habe außerdem mal ausgerechnet bei welcher Version diese Library gelandet ist. Momentan ist das V1.2 und das original ( TreeListPointer.pbi ) war damals V1.0.

Zu beachten ist natürlich auch der Hinweis, welches ich in den Kommentar am Anfang hinterlegt habe. Weiterhin ist diese Library kompatibel zu Purebasic 3.94 und 4.0 / 4.1.

Hier ist die neue Version:

Code: Alles auswählen

;{ Lib-Daten von: XTC_TreeListPointerManager.pbi
;// Beschreibung:
;//    Einleitung:
;//    -----------
;//    Die Library basiert vollkommen auf Pointer. Entgegen
;//    gesetzt der eingebauten Purebasic Linkedlist Funktionen.
;//    
;//    Da eine Liste in dieser Library als Pointer zurück
;//    gegeben (und auch so behandelt) wird, kann man eine
;//    Liste auch als Element hinzufügen.
;//    
;//    Ein Kleines Beispiel: Du machst zunächst Zwei Listen
;//    wie hier:
;//    *Liste1.TPL_List = TPL_CreateList()
;//    *Liste2.TPL_List = TPL_CreateList()
;//    
;//    Nun kannst du den Pointer von Liste2 als Element zu
;//    Liste1 angeben. Wie hier:
;//    TPL_AddElement(*Liste1, *Liste2)
;//    
;//    Wenn du später die Liste in der Liste durchgehen
;//    willst, dann musst du einfach eine zusätzliche
;//    Schleife machen. Wie du alle Elemente durchscanst
;//    wird hier im Code nun gezeigt. Der rest bleibt
;//    dein logisches Denken überlassen.
;//    
;//    Wichtiger Hinweis!!!
;//    --------------------
;//    Diese Library sieht auf den ersten Blick etwas mager
;//    aus. Aber wenn man mit Pointer umzugehen weis, der
;//    wird wissen wie unnötig Childs und Parents wirklich
;//    sind - woraus z.B. NicTheQuick's Library aufbaut.
;// Hinweis:
;//    Um zu garantieren, dass keine Fehler auftreten, muss 
;//    diese Library als Include eingebunden werden. In
;//    Purebasic 3.94 ist das nicht nötig.
;// Autor(en):
;//    ShadowTurtle
;//    Macron ALIAS Leonhard Schick (zusätzliche Funktionen)
;// Überarbeitet von:
;//    Macron ALIAS Leonhard Schick
;// Version/Datum:
;//    V1.0 --/Fr., 18. Februar 2005  <-- ShadowTurtle
;//    V1.1 --/Di., 09. Mai 2006      <-- Macron ALIAS Leonhard Schick
;//    V1.2 --/Fr., 01. Dezember 2006 <-- ShadowTurtle
;// Getestet mit...
;//    PureBasic 3.94
;//    PureBasic 4.0 / 4.1
;// Orginal-Datei-Name:
;//    XTC_TreeListPointerManager.pbi ALIAS TreeManager.pb
;// Features:
;//    V1.0: Grundgerüst
;//    V1.1: Kleine erweiterungen und Interface integration
;//    V1.2: Neue Funktionen: TPL_SelectElementEx, TPL_LockList, TPL_UnlockList
;//          Verbessert/Optimiert: TPL_ClearList
;//          Sonstig neues: TPL_Clear() bzw. Clear() ist nun ein bestandteil
;//          des Interfaces.

;// Abkürzungserklärungen:
;//    TPL = TreePointerList
CompilerIf Defined(TPL_Element, #PB_Structure) = #False
   Structure TPL_Element
      *Element_Next.TPL_Element ; der Pointer des nächsten   Elementens der Liste
      *Element_Prev.TPL_Element ; der Pointer des vorherigen Elementens der Liste
      *Pointer                  ; der Pointer des            Elementens der Liste
   EndStructure
CompilerEndIf

CompilerIf Defined(TPL_List, #PB_Structure) = #False
   Structure TPL_List
      *Element_Last  .TPL_Element ; Das letzte   Element
      *Element_First .TPL_Element ; Das erste    Element
      *Element_Actual.TPL_Element ; Das aktuelle Element

      *Locked_Element_Actual.TPL_Element ; Das aktuelle Element
      
      ScanInverse.l ; Richtung des Durchlaufes
      ScanPos.l     ; Position der Liste
      Elements.l    ; Anzahl der Elemente
   EndStructure
CompilerEndIf

;// Syntax:
;//    TPL_CreateList()
;// Änliche Befehle:
;//    NewList
;// Beschreibung:
;//    Erstellt eine Liste.
;// Rückgabewert(Pointer * ALIAS .l):
;//    Der Pointer der Liste.
ProcedureDLL TPL_CreateList()
   Protected *List.TPL_List
   *List = AllocateMemory(SizeOf(TPL_List))
   *List\Elements = 0
   
   ProcedureReturn *List
EndProcedure

;// Syntax:
;//    TPL_AddElement(*List.TPL_List, *Pointer)
;// Änliche Befehle:
;//    AddElement(...)
;// Beschreibung:
;//    Erstellt ein neues Element der angegebenen Liste.
;// Parameter:
;//    *List.TPL_List
;//       Der Pointer der Liste.
;//    *Pointer
;//       Der Pointer des Elemenetes der Liste.
ProcedureDLL.b TPL_AddElement(*List.TPL_List, *Pointer)
   Protected *AddElement.TPL_Element
   
   ; Erstellt den Pointer des Elemenetes und schreibt den angegebenen Pointer
   ; in den Element-Pointer.
   *AddElement = AllocateMemory(SizeOf(TPL_Element))
   *AddElement\Pointer = *Pointer
   
   If *List\Elements = 0 ; Wenn noch kein Element erstellt wurde ...
      *List\Element_First = *AddElement
   Else ; Wenn schon Elemente in der Liste vorhanden sind
      *List\Element_Last\Element_Prev = *AddElement
   EndIf
   
   *AddElement\Element_Next = *List\Element_Last
   *List\Element_Last = *AddElement
   
   ; Setzt das Neu erstellte Element als Aktuelles Element
   *List\Element_Actual = *AddElement
   
   ; Setze Anzahl der Elemente +1, da ein neues Element erstellt wurde
   *List\Elements = *List\Elements + 1
EndProcedure

;// Syntax:
;//    TPL_DeleteElement(*List.TPL_List)
;// Änliche Befehle:
;//    DeleteElement(...)
;// Beschreibung:
;//    Löscht ein Element aus der Liste.
;// Parameter:
;//    *List.TPL_List
;//       Der Pointer der Liste.
ProcedureDLL TPL_DeleteElement(*List.TPL_List)
   Protected *Element_Delete.TPL_Element
   *Element_Delete = *List\Element_Actual

   If *Element_Delete = *List\Element_First
      *List\Element_First = *List\Element_Actual\Element_Prev
      *List\Element_Actual = *List\Element_First
   ElseIf *Element_Delete = *List\Element_Last
      *List\Element_Last = *List\Element_Actual\Element_Next
      *List\Element_Actual = *List\Element_Last
   Else
      *List\Element_Actual\Element_Next\Element_Prev = *List\Element_Actual\Element_Prev
      *List\Element_Actual\Element_Prev\Element_Next = *List\Element_Actual\Element_Next
      *List\Element_Actual = *List\Element_Actual\Element_Prev
   EndIf
   
   FreeMemory(*Element_Delete)
   
   If *List\Elements > 0
      *List\Elements = *List\Elements - 1
   EndIf
EndProcedure

;// Syntax:
;//    TPL_RunInverse(*List.TPL_List, Mode.b)
;// Beschreibung:
;//    Gibt an, ob die Liste forwärts oder Rückwerts abgelaufen wird.
;//    Standart ist Mode.b = #TPL_RunInverse_forwards.
;// Parameter:
;//    *List.TPL_List
;//       Der Pointer der Liste.
;//    Mode.b
;//       Ist Standartmäsig #TPL_RunInverse_forwards. Kann in
Enumeration 0 ; TPL_RunInverse
   #TPL_RunInverse_forwards  ; vorwärts
   #TPL_RunInverse_backwards ; rückwerts
EndEnumeration
;//       geändert werden.
;//       Achtung !!! Verbindung mit | -Zeichen nicht möglich.
ProcedureDLL TPL_RunInverse(*List.TPL_List, Mode.b)
   *List\ScanInverse = Mode
EndProcedure

;// Syntax:
;//    TPL_ListIndex(*List.TPL_List)
;// Beschreibung:
;//    Gibt die Position des aktuellen Listenelements zurück. Beginnend bei 0.
;// Parameter:
;//    *List.TPL_List
;//       Der Pointer der Liste.
;// Rückgabewert:
;//    Die aktuelle Position der Liste.
ProcedureDLL TPL_ListIndex(*List.TPL_List)
   ProcedureReturn *List\ScanPos
EndProcedure

;// Syntax:
;//    TPL_FirstElement(*List.TPL_List)
;// Beschreibung:
;//    Ändert das aktuelle Listenelement auf das erste Listenelement.
;// Parameter:
;//    *List.TPL_List
;//       Der Pointer der Liste.
ProcedureDLL TPL_FirstElement(*List.TPL_List)
   *List\ScanPos = 0
EndProcedure

;// Syntax:
;//    TPL_NextElement(*List.TPL_List)
;// Änliche Befehle:
;//    NextElement(...)
;// Beschreibung:
;//    Springt zum nächsten Element der Liste.
;// Parameter:
;//    *List.TPL_List
;//       Der Pointer der Liste.
;// Rückgabewert(.l):
;//    Gibt die Position des Aktuellen (nach der ausführung) Elementes zurück.
;//    Wenn #False, gibt es kein weiteres Element.
ProcedureDLL.l TPL_NextElement(*List.TPL_List)
   *List\ScanPos = *List\ScanPos + 1
   
   If *List\ScanInverse = #True
      If *List\ScanPos = 1
         *List\Element_Actual = *List\Element_First
      Else
         *List\Element_Actual = *List\Element_Actual\Element_Prev
      EndIf
   Else
      If *List\ScanPos = 1
         *List\Element_Actual = *List\Element_Last
      Else
         *List\Element_Actual = *List\Element_Actual\Element_Next
      EndIf
   EndIf

   If *List\ScanPos-1 = *List\Elements
      ProcedureReturn #False
   Else
      ProcedureReturn *List\ScanPos
   EndIf
EndProcedure

;// Syntax:
;//    TPL_PreviousElement(*List.TPL_List)
;// Änliche Befehle:
;//    PreviousElement(...)
;// Beschreibung:
;//    Springt zum letzten Element der Liste.
;// Parameter:
;//    *List.TPL_List
;//       Der Pointer der Liste.
;// Rückgabewert(.l):
;//    Gibt die Position des Aktuellen (nach der ausführung) Elementes zurück.
;//    Wenn #False, gibt es keine tiferen Element.
ProcedureDLL.l TPL_PreviousElement(*List.TPL_List)
   *List\ScanPos = *List\ScanPos - 1
   
   If *List\ScanInverse = #True
      If *List\ScanPos = 1
         *List\Element_Actual = *List\Element_First
      Else
         *List\Element_Actual = *List\Element_Actual\Element_Prev
      EndIf
   Else
      If *List\ScanPos = 1
         *List\Element_Actual = *List\Element_Last
      Else
         *List\Element_Actual = *List\Element_Actual\Element_Next
      EndIf
   EndIf
   
   If *List\ScanPos-1 = *List\Elements
      ProcedureReturn #False
   Else
      ProcedureReturn *List\ScanPos
   EndIf
EndProcedure

;// Syntax:
;//    TPL_LastElement(*List.TPL_List)
;// Änliche Befehle:
;//    LastElement(...)
;// Beschreibung:
;//    Ändert das aktuelle Listenelement auf das letzte Listenelement.
;// Parameter:
;//    *List.TPL_List
;//       Der Pointer der Liste.
ProcedureDLL TPL_LastElement(*List.TPL_List)
   *List\ScanPos = *List\Elements
EndProcedure

;// Syntax:
;//    TPL_CountList(*List.TPL_List)
;// Änliche Befehle:
;//    CountList(...)
;// Beschreibung:
;//    Zählt, wie viele Elemente in der verknüpften Liste vorhanden sind.
;// Parameter:
;//    *List.TPL_List
;//       Der Pointer der Liste.
;// Rückgabewert:
;//    Die Anzahl der Elemente in der Liste.
ProcedureDLL TPL_CountList(*List.TPL_List)
   ProcedureReturn *List\Elements
EndProcedure


;// Syntax:
;//    TPL_GetElementPointer(*List.TPL_List)
;// Beschreibung:
;//    Gibt den Pointer des Elementes zurück.
;// Parameter:
;//    *List.TPL_List
;//       Der Pointer der Liste.
;// Rückgabewert(Pointer *):
;//    Der Pointer des Elementes.
ProcedureDLL TPL_GetElementPointer(*List.TPL_List)
   ProcedureReturn *List\Element_Actual\Pointer
EndProcedure

;// Syntax:
;//    TPL_GetElementPointer(*List.TPL_List)
;// Beschreibung:
;//    Setzt den Pointer des Elementes. Der alte Pointer wird
;//    bei dieser Funktion gelöscht (wenn unwar #False (0) ).
;// Parameter:
;//    *List.TPL_List
;//       Der Pointer der Liste.
;//    *Pointer
;//       Der Pointer, der Statt dem alten Pointer eingesetzt wirt.
;//       Der alte Pointer wird (wenn unwar #False (0) ) gelöscht.
ProcedureDLL TPL_SetElementPointer(*List.TPL_List, *Pointer)
   If *List\Element_Actual\Pointer
      FreeMemory(*List\Element_Actual\Pointer)
   EndIf
   *List\Element_Actual\Pointer
EndProcedure

;// Syntax:
;//    TPL_SelectElement(*List.TPL_List, Pos.l)
;// Änliche Befehle:
;//    SelectElement(...)
;// Beschreibung:
;//    Springt zur angegebenen Position der Liste. Das erste Element befindet sich an Position 1.
;// Parameter:
;//    *List.TPL_List
;//       Der Pointer der Liste.
;//    Pos(.l)
ProcedureDLL TPL_SelectElement(*List.TPL_List, Pos)
   Protected ScanPos.l
   ScanPos = 0
   
   TPL_FirstElement(*List)
   While ScanPos > -1
      ScanPos = ScanPos + 1
      If ScanPos = Pos + 1
         ScanPos = -1
      Else
         If TPL_NextElement(*List) = 0
            ScanPos = -1
         EndIf
      EndIf
   Wend
EndProcedure

;// Syntax:
;//    TPL_SelectElementEx(*List.TPL_List, *MustHavePointer)
;// Änliche Befehle:
;//    -
;// Beschreibung:
;//    Findet ein Element aus der Liste und wählt dieses für die bearbeitung aus.
;// Parameter:
;//    *List.TPL_List
;//       Der Pointer der Liste.
;//    *MustHavePointer
;//       Der Pointer welches der eintrag in der Liste haben soll.
ProcedureDLL TPL_SelectElementEx(*List.TPL_List, *MustHavePointer)
   DoSearch.b = 1

   TPL_FirstElement(*List)
   While ( TPL_NextElement(*List) > 0 And DoSearch.b = 1)
     If ( *List\Element_Actual\Pointer = *MustHavePointer )
       DoSearch.b = 0
       ProcedureReturn #True
     EndIf
   Wend
   
   ProcedureReturn 0
EndProcedure



;// Syntax:
;//    TPL_SwapNext(*List.TPL_List)
;// Beschreibung:
;//    Tauscht mit dem nächsten Element.
;// Parameter:
;//    *List.TPL_List
;//       Der Pointer der Liste.
ProcedureDLL TPL_SwapNext(*List.TPL_List)
   Protected *TempPointer
   *TempPointer = *List\Element_Actual\Pointer
   *List\Element_Actual\Pointer = *List\Element_Actual\Element_Next\Pointer
   *List\Element_Actual\Element_Next\Pointer = *TempPointer
   
   *List\Element_Actual = *List\Element_Actual\Element_Next
EndProcedure

;// Syntax:
;//    TPL_SwapPrevious(*List.TPL_List)
;// Beschreibung:
;//    Tauscht mit dem vorherigem Element.
;// Parameter:
;//    *List.TPL_List
;//       Der Pointer der Liste.
ProcedureDLL TPL_SwapPrevious(*List.TPL_List)
   Protected *TempPointer
   *TempPointer = *List\Element_Actual\Pointer
   *List\Element_Actual\Pointer = *List\Element_Actual\Element_Prev\Pointer
   *List\Element_Actual\Element_Prev\Pointer = *TempPointer
   
   *List\Element_Actual = *List\Element_Actual\Element_Prev
EndProcedure

;// Syntax:
;//    TPL_SwapElements(*List.TPL_List, PosA.l, PosB.l)
;// Änliche Befehle:
;//    SwapElements(...)
;//       Die Übergabe sind hier nur die Positionen, nicht die Pointer.
;// Beschreibung:
;//    Tauscht die PosA und PosB -Elemente. Angaben in Nummer.
;// Parameter:
;//    *List.TPL_List
;//       Der Pointer der Liste.
;//    PosA(.l)
;//       Die Position des zu tauschendem Elementes.
;//    PosB(.l)
;//       Die Position des zu tauschendem Elementes.
ProcedureDLL TPL_SwapElements(*List.TPL_List, PosA, PosB)
   Protected *TempActualElement.TPL_Element, *TempPointer
   TPL_SelectElement(*List, PosA)
   *TempActualElement = *List\Element_Actual
   
   TPL_SelectElement(*List, PosB)
   *TempPointer = *TempActualElement\Pointer
   *TempActualElement\Pointer = *List\Element_Actual\Pointer
   *List\Element_Actual\Pointer = *TempPointer
EndProcedure

;// Syntax:
;//    TPL_LockList(*List.TPL_List)
;// Änliche Befehle:
;//    -
;// Beschreibung:
;//    Speichert den zustand der Liste.
;// Parameter:
;//    *List.TPL_List
;//       Der Pointer der Liste.
ProcedureDLL TPL_LockList(*List.TPL_List)
   *List\Locked_Element_Actual = *List\Element_Actual
EndProcedure

;// Syntax:
;//    TPL_UnlockList(*List.TPL_List)
;// Änliche Befehle:
;//    -
;// Beschreibung:
;//    Setzt den zustand zurück, welcher zuvor mit
;//    TPL_LockList zuvor gespeichert wurde.
;// Parameter:
;//    *List.TPL_List
;//       Der Pointer der Liste.
ProcedureDLL TPL_UnlockList(*List.TPL_List)
   *List\Element_Actual = *List\Locked_Element_Actual
EndProcedure

;// Syntax:
;//    TPL_ClearList(*List.TPL_List)
;// Änliche Befehle:
;//    ClearList(...)
;// Beschreibung:
;//    Löscht alle Element aus der Liste.
;// Parameter:
;//    *List.TPL_List
;//       Der Pointer der Liste.
ProcedureDLL TPL_ClearList(*List.TPL_List)
   TPL_FirstElement(*List)
   While ( TPL_NextElement(*List) > 0 )
     TPL_DeleteElement(*List)
     TPL_FirstElement(*List)
   Wend

   TPL_FirstElement(*List)
EndProcedure

;// Syntax:
;//    TPL_DeleteList(*List.TPL_List)
;// Beschreibung:
;//    Löscht die angegebene Liste aus dem Speicher.
;//    Dies bedeutet, das diese nicht wirder verwendet werden kann.
;// Parameter:
;//    *List.TPL_List
;//       Der Pointer der Liste.
ProcedureDLL TPL_DeleteList(*List.TPL_List)
   TPL_ClearList(*List)
   
   FreeMemory(*List)
EndProcedure
;}

CompilerIf Defined(IXTC_TreeListPointerManager,#PB_Interface) = #False
;{ Lib-Daten von: XTC_ITreeListPointerManager.pbi
;// Beschreibung:
;//    Mit der Hilfe dieser Lib können Sie die TreeListPointerManager -Liste
;//    als Interface verwenden. Der Interface-Name ist 'IXTC_TreeListPointerManager'
;//    Erstellen können Sie die das Interface mit dem Befehl: 'CreateITreeListPointerManager()'
;// Hinweis:
;//    Um zu garantieren, dass keine Fehler auftreten, muss 
;//    diese Library als Include eingebunden werden. In
;//    Purebasic 3.94 ist das nicht nötig.
;// Autor(en):
;//    Macron ALIAS Leonhard Schick
;//    ShadowTurtle
;// Version/Datum:
;//    --/Di., 09. Mai 2006
;//    --/Di., 01. Dezember 2006
;// Getestet mit...
;//    PureBasic 3.94
;//    PureBasic 4.0 / 4.1
;// Orginal-Datei-Name:
;//    XTC_ITreeListPointerManager.pbi
;// Features:
;//    V1.2: Neue Methoden: SelectElementEx(...), LockList(), UnlockList()
;//          Sonstig neues: TPL_Clear() bzw. Clear() ist nun ein bestandteil
;//          des Interfaces.
;// Abkürzungserklärungen:
;//    TPL = TreePointerList

Interface IXTC_TreeListPointerManager
   AddElement(*Pointer)
   RunInverse(Mode.b)
   ListIndex()
   CountList()
   FirstElement()
   NextElement()
   PreviousElement()
   LastElement()
   GetElementPointer()
   SetElementPointer(*Pointer)
   SelectElement(Pos)
   SwapNext()
   SwapPrevious()
   SwapElements(PosA, PosB)
   DeleteElement()
   Lock()
   Unlock()
   Clear()
   Free()
EndInterface

Structure IXTC_TreeListPointerManager_IT
   IT.l[SizeOf(IXTC_TreeListPointerManager)/4]
EndStructure

Structure IXTC_TreeListPointerManager_Date
   *VirtualT
   *List
EndStructure

Enumeration 0 ; IXTC_TreeListPointerManager_VT
   #IXTC_TreeListPointerManager_CP_Comand_AddElement
   #IXTC_TreeListPointerManager_CP_Comand_RunInverse
   #IXTC_TreeListPointerManager_CP_Comand_ListIndex
   #IXTC_TreeListPointerManager_CP_Comand_CountList
   #IXTC_TreeListPointerManager_CP_Comand_FirstElement
   #IXTC_TreeListPointerManager_CP_Comand_NextElement
   #IXTC_TreeListPointerManager_CP_Comand_PreviousElement
   #IXTC_TreeListPointerManager_CP_Comand_LastElement
   #IXTC_TreeListPointerManager_CP_Comand_GetElementPointer
   #IXTC_TreeListPointerManager_CP_Comand_SetElementPointer
   #IXTC_TreeListPointerManager_CP_Comand_SelectElement
   #IXTC_TreeListPointerManager_CP_Comand_SelectElementEx
   #IXTC_TreeListPointerManager_CP_Comand_SwapNext
   #IXTC_TreeListPointerManager_CP_Comand_SwapPrevious
   #IXTC_TreeListPointerManager_CP_Comand_SwapElements
   #IXTC_TreeListPointerManager_CP_Comand_DeleteElement
   #IXTC_TreeListPointerManager_CP_Comand_Lock
   #IXTC_TreeListPointerManager_CP_Comand_Unlock
   #IXTC_TreeListPointerManager_CP_Comand_Clear
   #IXTC_TreeListPointerManager_CP_Comand_Free
EndEnumeration


Procedure __IXTC_TreeListPointerManager_AddElement(*this.IXTC_TreeListPointerManager_Date, *Pointer)
   TPL_AddElement(*this\List, *Pointer)
EndProcedure

Procedure __IXTC_TreeListPointerManager_RunInverse(*this.IXTC_TreeListPointerManager_Date, Mode.b)
   TPL_RunInverse(*this\List, Mode)
EndProcedure

Procedure __IXTC_TreeListPointerManager_ListIndex(*this.IXTC_TreeListPointerManager_Date)
   ProcedureReturn TPL_ListIndex(*this\List)
EndProcedure

Procedure __IXTC_TreeListPointerManager_CountList(*this.IXTC_TreeListPointerManager_Date)
   ProcedureReturn TPL_CountList(*this\List)
EndProcedure

Procedure __IXTC_TreeListPointerManager_FirstElement(*this.IXTC_TreeListPointerManager_Date)
   TPL_FirstElement(*this\List)
EndProcedure

Procedure.b __IXTC_TreeListPointerManager_NextElement(*this.IXTC_TreeListPointerManager_Date)
   ProcedureReturn TPL_NextElement(*this\List)
EndProcedure

Procedure.b __IXTC_TreeListPointerManager_PreviousElement(*this.IXTC_TreeListPointerManager_Date)
   ProcedureReturn TPL_PreviousElement(*this\List)
EndProcedure

Procedure __IXTC_TreeListPointerManager_LastElement(*this.IXTC_TreeListPointerManager_Date)
   TPL_LastElement(*this\List)
EndProcedure

Procedure __IXTC_TreeListPointerManager_GetElementPointer(*this.IXTC_TreeListPointerManager_Date)
   ProcedureReturn TPL_GetElementPointer(*this\List)
EndProcedure

Procedure __IXTC_TreeListPointerManager_SetElementPointer(*this.IXTC_TreeListPointerManager_Date, *Pointer)
   ProcedureReturn TPL_SetElementPointer(*this\List, *Pointer)
EndProcedure

Procedure __IXTC_TreeListPointerManager_SelectElement(*this.IXTC_TreeListPointerManager_Date, Pos)
   TPL_SelectElement(*this\List, Pos)
EndProcedure

Procedure __IXTC_TreeListPointerManager_SelectElementEx(*this.IXTC_TreeListPointerManager_Date, *MustHavePointer)
   TPL_SelectElementEx(*this\List, *MustHavePointer)
EndProcedure

Procedure __IXTC_TreeListPointerManager_SwapNext(*this.IXTC_TreeListPointerManager_Date)
   TPL_SwapNext(*this\List)
EndProcedure

Procedure __IXTC_TreeListPointerManager_SwapPrevious(*this.IXTC_TreeListPointerManager_Date)
   TPL_SwapPrevious(*this\List)
EndProcedure

Procedure __IXTC_TreeListPointerManager_SwapElements(*this.IXTC_TreeListPointerManager_Date, PosA, PosB)
   TPL_SwapElements(*this\List, PosA, PosB)
EndProcedure

Procedure __IXTC_TreeListPointerManager_DeleteElement(*this.IXTC_TreeListPointerManager_Date)
   TPL_DeleteElement(*this\List)
EndProcedure

Procedure __IXTC_TreeListPointerManager_Lock(*this.IXTC_TreeListPointerManager_Date)
  TPL_LockList(*this\List)
EndProcedure

Procedure __IXTC_TreeListPointerManager_Unlock(*this.IXTC_TreeListPointerManager_Date)
  TPL_UnlockList(*this\List)
EndProcedure

Procedure __IXTC_TreeListPointerManager_Clear(*this.IXTC_TreeListPointerManager_Date)
  TPL_ClearList(*this\List)
EndProcedure

Procedure __IXTC_TreeListPointerManager_Free(*this.IXTC_TreeListPointerManager_Date)
   ; Lösche Liste
   TPL_DeleteList(*this\List)
   ; Lösche Interface
   FreeMemory(*this)
EndProcedure


ProcedureDLL CreateITreeListPointerManager()
   Protected *object.IXTC_TreeListPointerManager_Date
   Static *VT.IXTC_TreeListPointerManager_IT
   If *VT = #Null
      *VT = AllocateMemory(SizeOf(IXTC_TreeListPointerManager_IT))
      *VT\IT[#IXTC_TreeListPointerManager_CP_Comand_AddElement     ] = @__IXTC_TreeListPointerManager_AddElement()
      *VT\IT[#IXTC_TreeListPointerManager_CP_Comand_RunInverse     ] = @__IXTC_TreeListPointerManager_RunInverse()
      *VT\IT[#IXTC_TreeListPointerManager_CP_Comand_ListIndex      ] = @__IXTC_TreeListPointerManager_ListIndex()
      *VT\IT[#IXTC_TreeListPointerManager_CP_Comand_CountList      ] = @__IXTC_TreeListPointerManager_CountList()
      *VT\IT[#IXTC_TreeListPointerManager_CP_Comand_FirstElement   ] = @__IXTC_TreeListPointerManager_FirstElement()
      *VT\IT[#IXTC_TreeListPointerManager_CP_Comand_NextElement    ] = @__IXTC_TreeListPointerManager_NextElement()
      *VT\IT[#IXTC_TreeListPointerManager_CP_Comand_PreviousElement] = @__IXTC_TreeListPointerManager_PreviousElement()
      *VT\IT[#IXTC_TreeListPointerManager_CP_Comand_LastElement    ] = @__IXTC_TreeListPointerManager_LastElement()
      *VT\IT[#IXTC_TreeListPointerManager_CP_Comand_GetElementPointer ] = @__IXTC_TreeListPointerManager_GetElementPointer()
      *VT\IT[#IXTC_TreeListPointerManager_CP_Comand_SetElementPointer ] = @__IXTC_TreeListPointerManager_SetElementPointer()
      *VT\IT[#IXTC_TreeListPointerManager_CP_Comand_SelectElement  ] = @__IXTC_TreeListPointerManager_SelectElement()
      *VT\IT[#IXTC_TreeListPointerManager_CP_Comand_SelectElementEx] = @__IXTC_TreeListPointerManager_SelectElementEx()
      *VT\IT[#IXTC_TreeListPointerManager_CP_Comand_SwapNext       ] = @__IXTC_TreeListPointerManager_SwapNext()
      *VT\IT[#IXTC_TreeListPointerManager_CP_Comand_SwapPrevious   ] = @__IXTC_TreeListPointerManager_SwapPrevious()
      *VT\IT[#IXTC_TreeListPointerManager_CP_Comand_SwapElements   ] = @__IXTC_TreeListPointerManager_SwapElements()
      *VT\IT[#IXTC_TreeListPointerManager_CP_Comand_DeleteElement  ] = @__IXTC_TreeListPointerManager_DeleteElement()
      *VT\IT[#IXTC_TreeListPointerManager_CP_Comand_Lock           ] = @__IXTC_TreeListPointerManager_Lock()
      *VT\IT[#IXTC_TreeListPointerManager_CP_Comand_Unlock         ] = @__IXTC_TreeListPointerManager_Unlock()
      *VT\IT[#IXTC_TreeListPointerManager_CP_Comand_Clear          ] = @__IXTC_TreeListPointerManager_Clear()
      *VT\IT[#IXTC_TreeListPointerManager_CP_Comand_Free           ] = @__IXTC_TreeListPointerManager_Free()
   EndIf
   *object = AllocateMemory(SizeOf(IXTC_TreeListPointerManager_IT))
   *object\VirtualT = *VT
   
   *object\List = TPL_CreateList()
   If *object\List = 0
      ProcedureReturn #False
   EndIf
   
   ProcedureReturn *object
EndProcedure

;}
CompilerEndIf