Treegadget sortieren

Anfängerfragen zum Programmieren mit PureBasic.
tmjuk
Beiträge: 380
Registriert: 30.06.2006 00:10
Wohnort: Backaryd, Schweden

Treegadget sortieren

Beitrag von tmjuk »

Hallo,

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
;
Das funktioniert auch ganz nett. Aber ich habe da noch ein kleines Problem: Wie kann man erfahren, ob ein Eintrag in einem Treegadget ein Icon zugeordnet wurde und wie kann man die BildID auslesen?

Hat jemand eine Idee?

Grüße aus dem sonnigen Schweden

Torsten
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Ich glaube, das geht nicht. Ich wollte nämlich auch schon mal aus einem ListIcongadget() auslesen, ob ein Item ein Bild zugewiesen hat...

Warum speicherst du diese Info nicht mit in der LinkedList? Dann kannst du bequem ablesen, ob ein Bild da ist. Statt einfach nur 'True oder #False zu speichern kannst du entweder #False oder die Id speichern; so hast du gleizeitig sogar die ImageID des Bildes, falls du wisen musst, um welches Bild es sich handelt.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
tmjuk
Beiträge: 380
Registriert: 30.06.2006 00:10
Wohnort: Backaryd, Schweden

Beitrag von tmjuk »

@and51

Ja, die Idee ist nicht schlecht. Hat aber einen Haken. Wenn ich nämlich ein Treegadget habe, welches der User frei manipulieren kann (also auch ein Häkchen setzen, oder wie in unserem Beispiel ein Icon dranhängen), dann ist eben zuerst das Treegadget da. Dieses wird dann erst ausgelesen zum Sortieren.
Deswegen ja die Frage, schade /:->
Torsten
tmjuk
Beiträge: 380
Registriert: 30.06.2006 00:10
Wohnort: Backaryd, Schweden

Beitrag von tmjuk »

@and51
Doch. Ist eine sehr gute Idee. Wenn man nämlich einen Tree "editieren" will, muß man die Daten irgendwo gespeichert haben, da ich ja in der "Mitte" eines Tree nicht so einfach was hinzufügen kann.

Noch mal vielen Dank :)
Torsten
Benutzeravatar
vonTurnundTaxis
Beiträge: 2130
Registriert: 06.10.2004 20:38
Wohnort: Bayreuth
Kontaktdaten:

Beitrag von vonTurnundTaxis »

Es gibt den Befehl SetGadgetItemData(), mit dem man Gadget-Items eine Long (hier also die Image-ID) hinzufügen und auch wieder auslesen kann - unabhängig von der Position.

Hier ein Beispiel aus der PureBasic-Hilfe:

Code: Alles auswählen

; This code uses SetGadgetItemData to store the original position
  ; of each item to later know it, even if the items index changed.
  ;
  If OpenWindow(0, 0, 0, 280, 250, "SetGadgetItemData", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
    ButtonGadget(0,  10, 10, 80, 20, "Add")
    ButtonGadget(1, 100, 10, 80, 20, "Remove") 
    ButtonGadget(2, 190, 10, 80, 20, "Test")
    ListViewGadget(3, 10, 40, 260, 200)
    For i = 0 To 10
      AddGadgetItem(3, i, "Old Item "+Str(i))
      SetGadgetItemData(3, i, i)
    Next i
   
    Repeat
      Event = WaitWindowEvent()
      If Event = #PB_Event_Gadget
        item = GetGadgetState(3)
       
        Select EventGadget()       
          Case 0 ; Add         
            AddGadgetItem(3, item, "New Item")
            If item <> -1
              SetGadgetItemData(3, item, -1)
            Else
              SetGadgetItemData(3, CountGadgetItems(3)-1, -1)
            EndIf
           
          Case 1 ; Remove
            If item <> -1
              RemoveGadgetItem(3, item)
            EndIf
           
          Case 2 ; Test
            If item <> -1
              value = GetGadgetItemData(3, item)
              If value = -1
                MessageRequester("", "Its a new item.")
              Else
                MessageRequester("", "It was item number "+Str(value))
              EndIf
            EndIf
                     
        EndSelect
      EndIf
    Until Event = #PB_Event_CloseWindow
  EndIf
Nicht durch Zorn, sondern durch Lachen tötet man
ClipGrab | Pastor - jetzt mit kurzen URLs!
tmjuk
Beiträge: 380
Registriert: 30.06.2006 00:10
Wohnort: Backaryd, Schweden

Beitrag von tmjuk »

@vonTurnundTaxis
ganz herzallerliebst

danke
Torsten
Antworten