schön wäre es wenn jemand eine überzeugende Methode findet
Anregungen sind erwünscht
Code: Alles auswählen
;by HJBremer PB 5.72 x64
;meine erste Demo mit Groups im Listicongadget
;based on https://www.purebasic.fr/english/viewtopic.php?p=436331
;https://www.purebasic.fr/english/viewtopic.php?t=54153&start=15 -- Additem ev. getitem
;http://forums.purebasic.com/english/viewtopic.php?p=270327 ---lvgroup
;https://www.paules-pc-forum.de/forum/thread/135899-gruppe-eines-items-in-einem-listview-ermitteln/
EnableExplicit
Structure LVGROUP64 Align #PB_Structure_AlignC ;für x86 + x64, unter x64 muß Align sein und .l
   cbSize.l
   mask.l
   *pszHeader
   cchHeader.l
   *pszFooter
   cchFooter.l
   iGroupId.l
   stateMask.l
   state.l
   uAlign.l
   ;
   ;    *pszSubtitle
   ;    cchSubtitle.l
   ;    *pszTask
   ;    cchTask.l
   ;    *pszDescriptionTop
   ;    cchDescriptionTop.l
   ;    *pszDescriptionBottom
   ;    cchDescriptionBottom.l
   ;    iTitleImage.l
   ;    iExtendedImage.l
   ;    iFirstItem.l
   ;    cItems.l
   ;    *pszSubsetTitle
   ;    cchSubsetTitle.l
EndStructure
Global Dim groupname.s(0)  ;beinhaltet groupnamen
Procedure.s GroupGetName(liste, groupid)
   
   Protected name$, lvgroup.LVGROUP64
   
   lvgroup\cbSize = SizeOf(LVGROUP64)   
   lvgroup\mask = #LVGF_HEADER 
   
   SendMessage_(GadgetID(liste), #LVM_GETGROUPINFO, groupid, lvgroup)   
   
   If lvgroup\pszHeader ;kann null sein
      name$ = PeekS(lvgroup\pszHeader)
   EndIf
   
   ProcedureReturn name$   
EndProcedure
Procedure.i SetGroupHide(liste, groupid, flag)
   Protected  lvgroup.LVGROUP64
   
   #LVGS_NORMAL = 0
   #LVGS_NOHEADER = $4
   
   lvgroup\cbSize = SizeOf(LVGROUP64)   
   lvgroup\mask = #LVGF_STATE 
   
   If flag = 1
      ;lvgroup\stateMask = #LVGS_HIDDEN  |#LVGS_COLLAPSED |#LVGS_NOHEADER
      lvgroup\state = #LVGS_HIDDEN | #LVGS_COLLAPSED |#LVGS_NOHEADER ;muß alles sein
      
   Else
     lvgroup\state = #LVGS_NORMAL
   EndIf
   
   SendMessage_(GadgetID(liste), #LVM_SETGROUPINFO, groupid, lvgroup)   
    
    
EndProcedure
Procedure.i GroupCount(liste)
   ;wieviele Gruppen gibt es, ab 1 gezählt
   ProcedureReturn SendMessage_(GadgetID(liste), #LVM_GETGROUPCOUNT, 0, 0)
EndProcedure
;-Sort
Procedure.i SortListIconCompare(id1, id2, param)
   
   ;id1 + id2 sind die Groupnummern, in diesem Fall gleichzeitig der Index vom Array siehe CreateListIconGroups()
   ;param hat den Wert 0 oder 1 für Sortierrichtung, Quelle ist der Aufruf von SortListIconGroups()
   
   If param = 0
      ProcedureReturn CompareMemoryString(@groupname(id1), @groupname(id2), #PB_String_NoCase)
      
   ElseIf param = 1      
      ProcedureReturn CompareMemoryString(@groupname(id2), @groupname(id1), #PB_String_NoCase)
   EndIf
EndProcedure
Procedure.i SortListIconGroups(liste, param=0)
 SendMessage_(GadgetID(liste), #LVM_SORTGROUPS, @SortListIconCompare(), param)
EndProcedure
;-Group create
Procedure.i GroupNew(liste, groupid, name$)
   
   ;für CreateListIconGroups()
   
   Protected lvgroup.LVGROUP64 
   
   If name$ = "": name$ = "Group " + Str(groupid): EndIf
   
   lvGroup\cbSize = SizeOf(LVGROUP64)
   lvGroup\mask   = #LVGF_HEADER |#LVGF_GROUPID | #LVGF_ALIGN  | #LVGF_STATE
   
   lvgroup\pszHeader = @name$     
   lvgroup\cchHeader = Len(name$)
   lvgroup\iGroupId  = groupid
   lvgroup\uAlign    = #LVGA_HEADER_LEFT
   lvgroup\state  = #LVGS_COLLAPSIBLE                             ;FaltPfeil sichtbar 
   SendMessage_(GadgetID(liste), #LVM_INSERTGROUP, -1, lvgroup)   ; -1 ans Ende oder Zahl oder auch LVM_INSERTGROUPSORTED
   
EndProcedure
Procedure.i GroupSetItem(liste, row, groupid)
   
   ;für CreateListIconGroups()
   
   Protected lvitem.LVITEM
   
   lvitem\mask     = #LVIF_GROUPID  
   lvitem\iItem    = row
   lvitem\iGroupId = groupid 
   SendMessage_(GadgetID(liste), #LVM_SETITEM, 0, lvitem)
      
EndProcedure
Procedure.i CreateListIconGroups(liste, column)
   ;liste  = pbnr liste
   ;column = column welche grouptext enthält, hier das Jahr   
   
   Protected j, row        ;für For Next
   Protected listanz       ;Anzahl Einträge in Liste ab null gezählt
   Protected index         ;Größe Array Groupname()
   Protected groupid       ;GroupId ab 1, entspricht index vom Array Groupname()
   Protected flag          ;true wenn text$ im Array Groupname() vorhanden, wenn false dann neue Gruppe   
   Protected text$         ; 
   
   Protected lvitem.LVITEM   
   
   ;Groupliste erstellen und Items zuweisen
   
   ReDim groupname.s(0)
   
   listanz = CountGadgetItems(liste) - 1 
   
   For row = 0 To listanz
      
      text$ = Trim(GetGadgetItemText(liste, row, column))  ;identifiziert Group
      If text$ = "": text$ = "?": EndIf                    ;falls Eintrag fehlt, sonst keine Anzeige
           
      flag = #False
      index = ArraySize(groupname())            ;index bei Start null
      For j = 0 To index                        ;groupname(0) wird nicht benutzt
         If groupname(j) = text$                ;beim 1. Aufruf wenn j=0, wird If nie true denn groupname(0) ist leer
            flag = #True                        ;Grouptext vorhanden
            groupid = j                         ;groupid ab 1
            GroupSetItem(liste, row, groupid)
            Break
         EndIf
      Next
      
      If flag = #False                          ;beim 1. Aufruf immer false
         index + 1                              ;index beginnt 1
         ReDim groupname(index)                 ;Array wird größer
         groupname(index) = text$               ;
         groupid = index                        ;groupid ab 1
         GroupNew(liste, groupid, text$)  
         GroupSetItem(liste, row, groupid)
      EndIf
      
   Next
   
EndProcedure
Enumeration
#window  
#mainliste
#maininfo
#button0:#button1:#button2
EndEnumeration
Define j, jahr
OpenWindow(#window, 200, 120, 900, 650, "LV Group")
; mit #PB_ListIcon_GridLines | geht ausklappen nicht
ListIconGadget(#mainliste, 0, 0, 500, 650, "Column 0", 150, #PB_ListIcon_FullRowSelect)
For j = 1 To 3
   AddGadgetColumn(#mainliste, j, "Column " + Str(j), 90)
Next
For j = 1 To 17   
   jahr = Random(2022, 2010)
   AddGadgetItem(#mainliste, -1, "Col 0 / " + Str(j) + #LF$ + Str(jahr) + #LF$ + "Column 2"  + #LF$ + "Column 3" )
Next
SetGadgetItemText(#mainliste, 5, "", 1)   ;Test wenn Groupident fehlt
SetGadgetItemText(#mainliste, 8, "", 1)   ;Test wenn Groupident fehlt
CreateListIconGroups(#mainliste, 1)       ;Groupident steht in col 1
;-Buttons
Define x = 515, y = 20
ButtonGadget(#button0, x, y, 125, 22, "Groups", #PB_Button_Toggle) : y + 30
ButtonGadget(#button1, x, y, 125, 22, "Sort Groups up/down", #PB_Button_Toggle) : y + 30
ButtonGadget(#button2, x, y, 125, 22, "hide group 2 on/off", #PB_Button_Toggle)
;-Infofeld
EditorGadget(#maininfo, 650, 10, 240, 580)
AddGadgetItem(#maininfo, -1, "groupanzahl " + GroupCount(#mainliste))
For j = 1 To GroupCount(#mainliste)   
   AddGadgetItem(#maininfo, -1, "GroupName: Nr." + Str(j) + " = " + GroupGetName(#mainliste, j))
Next
Define event, pos
Define gadget 
   
   Repeat
      event = WaitWindowEvent()
      gadget = EventGadget()
     
     Select Event
     
        Case #PB_Event_Gadget
           
         Select gadget
            Case #button0: 
               
                If GetGadgetState(#button0)               
                  SendMessage_(GadgetID(#mainliste), #LVM_ENABLEGROUPVIEW , #True, 0)
                  Else
                     SendMessage_(GadgetID(#mainliste), #LVM_ENABLEGROUPVIEW , #False, 0)
                  EndIf
               
            Case #button1: 
               
               If GetGadgetState(#button1)  
                  SortListIconGroups(#mainliste, #PB_Sort_Ascending)
               Else
                  SortListIconGroups(#mainliste, #PB_Sort_Descending)
               EndIf
                  
            Case #button2: 
               
               If GetGadgetState(#button2)               
                  SetGroupHide(#mainliste, 2, 1)                  
                  Else
                     SetGroupHide(#mainliste, 2, 0)
                  EndIf                  
               
            Case #mainliste
               If EventType() = #PB_EventType_LeftClick
                  Debug "pos " + GetGadgetState(#mainliste)
                  pos = GetGadgetState(#mainliste)
                  
                  Debug GetGadgetItemText(#mainliste, pos, 0) + " " + GetGadgetItemText(#mainliste, pos, 1)
                  Debug GetGadgetItemText(#mainliste, 0, 0) + " " + GetGadgetItemText(#mainliste, 0, 1)                  
               EndIf               
                  
         EndSelect
       
     
     EndSelect
   Until Event = #PB_Event_CloseWindow

