ich habe zum Thema "Treegadget sortieren" so gut wie nichts gefunden.
Also habe ich selber was geschrieben:
Code: Alles auswählen
; Treegadget sortieren
;{ Variablen
Structure eintrag
name.s
ebene.l
haken.l
index.l
EndStructure
Global NewList lista.eintrag()
Global NewList listb.eintrag()
Global NewList listc.eintrag()
Global ergebnis.l
Global anzahl.l
cur1 = LoadCursor_(0, #IDC_WAIT) ; Sanduhr
cur0 = LoadCursor_(0, #IDC_ARROW) ; Normaler Pfeil
;}
;{ sortieren
Procedure sortieren()
If CountGadgetItems(1) > 0
ClearList(lista())
ClearList(listb())
ClearList(listc())
;nun Treegadget in List A und List B einlesen
For i = 0 To CountGadgetItems(1)-1
AddElement(lista())
AddElement(listb())
lista()\name = GetGadgetItemText(1,i,0)
listb()\name = GetGadgetItemText(1,i,0)
If anzahl < GetGadgetItemAttribute(1,i,#PB_Tree_SubLevel)
anzahl = anzahl + 1
EndIf
lista()\ebene = GetGadgetItemAttribute(1,i,#PB_Tree_SubLevel)
listb()\ebene = GetGadgetItemAttribute(1,i,#PB_Tree_SubLevel)
ergebnis = GetGadgetItemState(1,i)
If ergebnis & #PB_Tree_Checked
lista()\haken = 1
listb()\haken = 1
EndIf
lista()\index = i
listb()\index = i
Next
; jetzt die List B nach Namen sortieren lassen
SortStructuredList(listb(),2,OffsetOf(eintrag\name),#PB_Sort_String)
; jetzt alle Einträge der Ebene 0 in List C
ResetList(listb())
While NextElement(listb())
If listb()\ebene = 0
AddElement(listc())
listc()\name = listb()\name
listc()\ebene = listb()\ebene
listc()\haken = listb()\haken
listc()\index = listb()\index
; Element, welches in List C eingefügt wurde aus List B entfernen
DeleteElement(listb())
EndIf
Wend
; nun die Liste B "umgekehrt" sortieren
SortStructuredList(listb(),3,OffsetOf(eintrag\name),#PB_Sort_String)
For i = 1 To anzahl
ResetList(listb())
While NextElement(listb())
If listb()\ebene = i
; Element der aktuellen Ebene gefunden
; jetzt den übergeordneten Eintrag suchen
; dazu lista auf letztes Element stellen
LastElement(lista())
While ListIndex(lista()) > -1
If lista()\index = listb()\index
; der Eintrag wurde in List A gefunden
While ListIndex(lista()) > -1
If lista()\ebene = i - 1
; der übergeordnete Eintrag wurde gefunden
; der Eintrag ListB muß nun unter den richtigen Übergeordneten Ordner
ResetList(listc())
While NextElement(listc())
If listc()\index = lista()\index
AddElement(listc())
listc()\name = listb()\name
listc()\ebene = listb()\ebene
listc()\haken = listb()\haken
listc()\index = listb()\index
; jetzt wieder gleich Element aus List B löschen
DeleteElement(listb())
Break
EndIf
Wend
Break 2
EndIf
PreviousElement(lista())
Wend
EndIf
PreviousElement(lista())
Wend
EndIf
Wend
Next i
; TreeGadget löschen
;ClearGadgetItemList(1)
ClearGadgetItemList(3)
ResetList(listc())
anzahl = 0
While NextElement(listc())
AddGadgetItem(3,-1,listc()\name , 0, listc()\ebene)
If listc()\haken = 1
SetGadgetItemState(3,anzahl,#PB_Tree_Checked)
EndIf
anzahl = anzahl + 1 ; zählt hier, bei welchem Eintrag man ist
Wend
EndIf
EndProcedure
;}
If OpenWindow(0, 216, 0, 600, 530, "Treegadget sortieren", #PB_Window_SystemMenu | #PB_Window_TitleBar )
If CreateGadgetList(WindowID(0))
TreeGadget(1, 30, 30, 230, 380,#PB_Tree_CheckBoxes)
ButtonGadget(2, 165, 460, 170, 40, "Sortieren")
TreeGadget(3,280,30,230,380,#PB_Tree_CheckBoxes)
EndIf
;{ Treegadet füllen
If MessageRequester("Treegadget füllen","Die Liste mit 10000 Werten füllen?",#PB_MessageRequester_YesNo | #MB_ICONQUESTION) = #PB_MessageRequester_Yes
; Liste mit 10000 Werten füllen
AddGadgetItem(1,-1,"Zu Ende",0,0)
For i = 1 To 9999
; Wort erzeugen
a.s = ""
b.s = ""
c.s = ""
d.s = ""
wort.s = ""
While a = ""
x = Random(90)
If x > 64
a = Chr(x)
EndIf
Wend
While b = ""
x = Random(90)
If x > 64
b = Chr(x)
EndIf
Wend
While c = ""
x = Random(90)
If x > 64
c = Chr(x)
EndIf
Wend
While d = ""
x = Random(90)
If x > 64
d = Chr(x)
EndIf
Wend
wort = a + b + c + d
x = Random(10)
If x = 0 ; neues Element in ebene 0
AddGadgetItem(1,-1,wort,0,0)
ElseIf 0 < x And x < 6 ; Element in der selben Ebene
ergebnis = CountGadgetItems(1)
eb = GetGadgetItemAttribute(1,ergebnis -1,#PB_Tree_SubLevel)
AddGadgetItem(1,-1,wort,0,eb)
ElseIf 5 < x And x < 11 ; Element eine Ebene tiefer
ergebnis = CountGadgetItems(1)
eb = GetGadgetItemAttribute(1,ergebnis -1,#PB_Tree_SubLevel)
AddGadgetItem(1,-1,wort,0,eb + 1)
EndIf
Next i
Else
AddGadgetItem(1,-1,"Z",0,0)
AddGadgetItem(1,-1,"Y",0,1)
AddGadgetItem(1,-1,"X",0,2)
AddGadgetItem(1,-1,"W",0,2)
AddGadgetItem(1,-1,"V",0,1)
AddGadgetItem(1,-1,"U",0,2)
AddGadgetItem(1,-1,"T",0,2)
AddGadgetItem(1,-1,"S",0,0)
AddGadgetItem(1,-1,"R",0,1)
AddGadgetItem(1,-1,"Q",0,2)
AddGadgetItem(1,-1,"P",0,2)
AddGadgetItem(1,-1,"O",0,1)
AddGadgetItem(1,-1,"N",0,2)
AddGadgetItem(1,-1,"M",0,2)
AddGadgetItem(1,-1,"L",0,0)
AddGadgetItem(1,-1,"K",0,0)
AddGadgetItem(1,-1,"J",0,1)
AddGadgetItem(1,-1,"I",0,1)
AddGadgetItem(1,-1,"H",0,0)
AddGadgetItem(1,-1,"G",0,1)
AddGadgetItem(1,-1,"F",0,1)
AddGadgetItem(1,-1,"E",0,2)
AddGadgetItem(1,-1,"D",0,3)
AddGadgetItem(1,-1,"C",0,3)
AddGadgetItem(1,-1,"B",0,4)
AddGadgetItem(1,-1,"A",0,4)
EndIf
;}
Repeat
Event = WaitWindowEvent()
WindowID = EventWindow()
GadgetID = EventGadget()
EventType = EventType()
If Event = #PB_Event_Gadget
If GadgetID = 1
ElseIf GadgetID = 2
SetCursor_(cur1)
sortieren()
SetCursor_(cur0)
EndIf
EndIf
Until Event = #PB_Event_CloseWindow
EndIf
End
;
Hat jemand eine Idee?
Grüße aus dem sonnigen Schweden
Torsten