meine erste + zweite Demo mit Groups im Listicongadget

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

meine erste + zweite Demo mit Groups im Listicongadget

Beitrag von hjbremer »

meine 2.Demo weiter unten kann mehr und das Prinzip der Group Zuweisung wurde geändert.

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

Zuletzt geändert von hjbremer am 13.07.2022 12:44, insgesamt 2-mal geändert.
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
jacdelad
Beiträge: 341
Registriert: 03.02.2021 13:39
Computerausstattung: Ryzen 5800X, 108TB Festplatte, 32GB RAM, Radeon 7770OC
Wohnort: Riesa
Kontaktdaten:

Re: meine erste Demo mit Groups im Listicongadget

Beitrag von jacdelad »

Ich hab das schon mal als Modul im englischen Forum vorgestellt: http://forums.purebasic.com/english/vie ... hp?t=78230
Ich will damit nicht unbedingt zur Konkurrenz verweisen, aber damit kann eine ganze Menge mit Gruppen machen (und TileView).
PureBasic 6.04/XProfan X4a/Embarcadero RAD Studio 11/Perl 5.2/Python 3.10
Windows 11/Ryzen 5800X/32GB RAM/Radeon 7770 OC/3TB SSD/11TB HDD
Synology DS1821+/36GB RAM/130TB
Synology DS920+/20GB RAM/54TB
Synology DS916+ii/8GB RAM/12TB
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Re: meine erste Demo mit Groups im Listicongadget

Beitrag von hjbremer »

Mini UpDateHinweis:

beim erstellen vom Listicongadget muß #PB_ListIcon_MultiSelect angegeben werden

dann werden beim Click auf den Gruppenheader auch alle Items markiert
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Re: meine erste + zweite Demo mit Groups im Listicongadget

Beitrag von hjbremer »

Code: Alles auswählen

;2. Demo ListIconGadget mit Groups 
;PB 5.72 x64  


EnableExplicit

#LVGS_NORMAL = 0        ;fehlt in PB 5.72
#LVGS_SELECTED = $20 
#LVGS_NOHEADER = $4  
#LVGF_ITEMS = $4000    

#LVNI_VISIBLEORDER = $10   ;wenn gesetzt: #LVM_GETNEXTITEMINDEX zeigt Group Reihenfolge
#LVNI_VISIBLEONLY  = $40   ;wenn gesetzt: #LVM_GETNEXTITEMINDEX zeigt Original Reihenfolge
#LVNI_SAMEGROUPONLY = $80  ;wenn gesetzt: #LVM_GETNEXTITEMINDEX gibt -1 in \iItem bei Groupwechsel

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

Structure LVITEMINDEX
   iItem.l
   dummy.l
   iGroup.i
EndStructure   

;interne Werte
Structure LVITEMSORT
   gadgetnr.l        ;wird momentan nicht gebraucht
   direction.l       ;Sortierrichtung
   Array name$(0)    ;für die GroupNamen
EndStructure

Global lastgroupindex   ;wichtig für sort etc !!! 

Procedure.i GetGroupCount(liste)
   ;wieviele Gruppen gibt es, ab 1 gezählt
   ProcedureReturn SendMessage_(GadgetID(liste), #LVM_GETGROUPCOUNT, 0, 0)
EndProcedure

Procedure.i GetGroupCountItem(liste, groupid)   
   ;wieviele Items enthält die Gruppe
   
   Protected lvgroup.LVGROUP64
   
   lvgroup\cbSize = SizeOf(LVGROUP64)   
   lvgroup\mask = #LVGF_ITEMS   
   SendMessage_(GadgetID(liste), #LVM_GETGROUPINFO, groupid, lvgroup)   
   
   ProcedureReturn lvgroup\cItems
EndProcedure

Procedure.i GetGroupIDofItem(liste, iItem)
   Protected lvitem.LVITEM
   lvitem\mask = #LVIF_GROUPID
   lvitem\iItem = iItem
   SendMessage_(GadgetID(liste), #LVM_GETITEM, 0, lvitem)
   ProcedureReturn lvitem\iGroupId
EndProcedure

Procedure.s GetGroupName(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 GetGroupFirstItem(liste, groupid)
   
   ;gibt 1.Item einer Gruppe zurück
   
   Protected lvgroup.LVGROUP64
   
   lvgroup\cbSize = SizeOf(LVGROUP64)   
   lvgroup\mask = #LVGF_ITEMS   
   SendMessage_(GadgetID(liste), #LVM_GETGROUPINFO, groupid, lvgroup)   
   
   ProcedureReturn lvgroup\iFirstItem   
EndProcedure

Procedure.i GetGroupNextItem(liste, groupid, iItem)
   
   Protected lvitemindex.LVITEMINDEX 
   
   lvitemindex\iItem = iItem
   lvitemindex\iGroup = groupid   
   SendMessage_(GadgetID(liste), #LVM_GETNEXTITEMINDEX, lvitemindex, #LVNI_VISIBLEORDER) 
   
   ProcedureReturn lvitemindex\iItem
EndProcedure

Procedure.i GroupHide(liste, groupid, flag=#True)   
   ;eine Group komplett verstecken / anzeigen
   
   Protected lvgroup.LVGROUP64
   
   lvgroup\cbSize = SizeOf(LVGROUP64)   
   lvgroup\mask = #LVGF_STATE 
   
   If flag = #True
      lvgroup\state = #LVGS_HIDDEN |#LVGS_NOHEADER |#LVGS_COLLAPSED       
   Else
      lvgroup\state = #LVGS_NORMAL |#LVGS_COLLAPSIBLE
   EndIf
   
   SendMessage_(GadgetID(liste), #LVM_SETGROUPINFO, groupid, lvgroup)     
   
EndProcedure

Procedure.i GroupHideHeader(liste, groupid, flag=#True)
   
   Protected lvgroup.LVGROUP64
   
   lvgroup\cbSize = SizeOf(LVGROUP64)   
   lvgroup\mask = #LVGF_STATE 
   
   If flag = #True      
      lvgroup\stateMask = #LVGS_NOHEADER
      lvgroup\state = #LVGS_NOHEADER      
   Else 
      lvgroup\stateMask = #LVGS_NOHEADER
      lvgroup\state = #LVGS_NORMAL
   EndIf
   
   SendMessage_(GadgetID(liste), #LVM_SETGROUPINFO, groupid, lvgroup)    
   
EndProcedure

Procedure.i GroupInsert(liste, groupname$="", groupposi = -1)
   
   ;erstellt eine neue Gruppe und fügt diese an groupposi ein
   
   ;groupposi -1 = ans Ende; null = an Anfang; oder Zahl = einfügen oder ev. auch #LVM_INSERTGROUPSORTED)
   
   ;die groupid wird automatisch vergeben und beginnt bei 1, gibt groupid zurück
   
   Protected lvgroup.LVGROUP64 
   
   Static groupid   
   groupid + 1
   
   lastgroupindex = groupid
   
   If groupname$ = "": groupname$ = "Group " + Str(groupid): EndIf
   
   lvGroup\cbSize = SizeOf(LVGROUP64)
   lvGroup\mask   = #LVGF_HEADER |#LVGF_GROUPID | #LVGF_ALIGN  | #LVGF_STATE
   
   lvgroup\pszHeader = @groupname$    
   lvgroup\cchHeader = Len(groupname$)
   lvgroup\iGroupId  = groupid
   lvgroup\uAlign    = #LVGA_HEADER_LEFT
   lvgroup\state  = #LVGS_COLLAPSIBLE              ;FaltPfeil sichtbar 
   SendMessage_(GadgetID(liste), #LVM_INSERTGROUP, groupposi, lvgroup) 
   
   ProcedureReturn groupid
EndProcedure

Procedure.i GroupRemove(liste, groupid)
   ;Gibt den Index der Gruppe zurück, falls erfolgreich oder -1 
   
   Protected ret = SendMessage_(GadgetID(liste), #LVM_REMOVEGROUP, groupid, 0)
   
   Protected j,text$
   
   
   For j = 1 To lastgroupindex
      text$ = GetGroupName(liste, j) 
      
      Debug text$ + " " + j
   Next
   
   ProcedureReturn ret
   
EndProcedure

Procedure.i GroupSelect(liste, groupid)   
   ;alle Items einer Gruppe werden Selected
   
   Protected lvgroup.LVGROUP64
   
   lvgroup\cbSize = SizeOf(LVGROUP64)   
   lvgroup\mask = #LVGF_STATE   
   lvgroup\stateMask = #LVGS_SELECTED
   lvgroup\state = #LVGS_SELECTED
   SendMessage_(GadgetID(liste), #LVM_SETGROUPINFO, groupid, lvgroup)
   
EndProcedure

Procedure.i SetItemToGroup(liste, row, groupid)   
   ;fügt Item zu einer Gruppe hinzu
   
   Protected lvitem.LVITEM
   
   lvitem\mask     = #LVIF_GROUPID  
   lvitem\iItem    = row
   lvitem\iGroupId = groupid 
   SendMessage_(GadgetID(liste), #LVM_SETITEM, 0, lvitem)
   
EndProcedure

Procedure.i SortGroupsCompare(id1, id2, param)
   
   ;id1 + id2 sind die GroupIDs
   ;param ist ein Zeiger auf die SortStruktur
   
   ;Hinweis
   ;damit dies mit einem Array funktioniert, 
   ;muß das Array so groß sein wie die größte groupId ( wenn 6, dann Array Dim name(6) ) !   
   ;die Verwaltung der Groups muß dies beachten, oder es wird etwas aufwändiger.
   
   ;GetGroupname() hier zu benutzen, hat bei mir nicht richtig funktioniert, darum in SortGroups()
   
   Debug "SortIds: " + Str(id1) + " " + Str(id2)
   
   Protected *sortparam.LVITEMSORT = param
   
   Protected name1$ = *sortparam\name$(id1) : Debug name1$
   Protected name2$ = *sortparam\name$(id2) : Debug name2$ : Debug "---"
   
   If *sortparam\direction = 0
      ProcedureReturn CompareMemoryString(@name1$, @name2$, #PB_String_NoCase)      
   Else 
      ProcedureReturn CompareMemoryString(@name2$, @name1$, #PB_String_NoCase)      
   EndIf   
   
EndProcedure

Procedure.i SortGroups(liste, param=0)   
   
   ;param = #PB_Sort_Ascending oder #PB_Sort_Descending bzw. 0 oder 1
   
   Protected j, sortparam.LVITEMSORT
   
   ReDim sortparam\name$(lastgroupindex)
   
   For j = 1 To lastgroupindex
      sortparam\name$(j) = GetGroupName(liste, j) 
   Next
   
   sortparam\direction = param
   
   SendMessage_(GadgetID(liste), #LVM_SORTGROUPS, @SortGroupsCompare(), sortparam)
   
EndProcedure

;-Main

Enumeration
   #window  
   #mainliste
   #container   
   #trackinfo
   #listeinfo
EndEnumeration

Global fontStd = LoadFont(#PB_Any, "Calibri", 11)
Global fontStdB = LoadFont(#PB_Any, "Arial", 10, #PB_Font_Bold)

Procedure.i MainCallback(hWnd, message, wParam, lParam)
   
   ;Beispiel für #NM_CUSTOMDRAW ListIconGadget
   
   Protected result = #PB_ProcessPureBasicEvents   
   
   Protected *lvkeydown.LVKEYDOWN   ;die wichtigsten Strukturen
   
   Protected *nmhdr.NMHDR
   Protected *nmlistview.NM_LISTVIEW   
   Protected *nmlvcustomdraw.NMLVCUSTOMDRAW
   
   Protected iitem, isubitem, hotitem, text$ 
   
   Protected gridlinePen               ;Pen für Gridlines 
   Protected gridlineColor = $d8d8d8   ;hellgrau
   
   Select message
         
      Case #WM_CLOSE: ;für globale Werte die PB nicht automatisch löscht
         
      Case #WM_NOTIFY     
         *nmhdr = lParam         ;*nmhdr sagt von welchem Gadget und was ist wo passiert         
         *nmlistview = lParam
         *nmlvcustomdraw = lParam
         
         If *nmhdr\idfrom = #mainliste
            
            Select *nmhdr\code
                  
               Case #LVN_KEYDOWN                  
               Case #LVN_COLUMNCLICK
                  
               Case #LVN_HOTTRACK                 
                  hotitem = *nmlistview\iItem ;item wo Maus ist
                  SetGadgetText(#trackinfo, Str(hotitem))
                  
               Case #NM_CUSTOMDRAW                  
                  
                  Select *nmlvcustomdraw\nmcd\dwDrawStage 
                     Case #CDDS_PREPAINT:     result = #CDRF_NOTIFYITEMDRAW 
                     Case #CDDS_ITEMPREPAINT: result = #CDRF_NOTIFYSUBITEMDRAW 
                        
                     Case #CDDS_ITEMPREPAINT | #CDDS_SUBITEM
                        
                        iitem = *nmlvcustomdraw\nmcd\dwItemSpec ;row
                        isubitem = *nmlvcustomdraw\iSubItem     ;col
                        
                        ;Text+Backcolor Zeile Standard
                        *nmlvcustomdraw\clrText = #Black
                        *nmlvcustomdraw\clrTextBk = #White
                        
                        If SendMessage_(*nmhdr\hwndFrom, #LVM_ISGROUPVIEWENABLED, 0, 0) = #False
                           ;Backcolor jede 2.Zeile dunkler, in Groups sieht nicht gut aus darum #false
                           If Mod(iitem,2): *nmlvcustomdraw\clrTextBk - $090909: EndIf
                        EndIf
                        
                        ;Font Standard, muß hier stehen
                        SelectObject_(*nmlvcustomdraw\nmcd\hDC, FontID(fontStd)) 
                        
                        Select isubitem 
                           Case 0: 
                           Case 1: *nmlvcustomdraw\clrText = #Red 
                              text$ = GetGadgetItemText(#mainliste, iitem, isubitem)
                              If FindString(text$, "2022")
                                 *nmlvcustomdraw\clrText = #Magenta
                                 SelectObject_(*nmlvcustomdraw\nmcd\hDC, FontID(fontStdB)) 
                              EndIf                              
                           Case 2     
                           Case 3: *nmlvcustomdraw\clrText = #Blue 
                        EndSelect
                        
                        ;bei Fontwechsel muß #CDRF_NEWFONT am Ende stehen, auch bei Farbwechsel !!!!!
                        
                        ;wenn ITEMPOSTPAINT vorhanden muß #CDRF_NEWFONT bei #CDDS_ITEMPOSTPAINT stehen
                        ;result = #CDRF_NEWFONT oder ProcedureReturn #CDRF_NEWFONT
                        
                        ProcedureReturn #CDRF_NOTIFYPOSTPAINT                     
                        
                     Case #CDDS_ITEMPOSTPAINT|#CDDS_SUBITEM ;Beispiel für POSTPAINT
                        
                        ;senkrechte Gitterlinien, man beachte die Reihenfolge beim zeichnen
                        
                        ;Debug "Reihenfolge #CDDS_ITEMPOSTPAINT " + *nmlvcustomdraw\iSubItem
                        
                        If *nmlvcustomdraw\iSubItem                        ;column ab 1
                           With *nmlvcustomdraw\nmcd                           
                              gridlinePen = CreatePen_(#PS_SOLID, 2, gridlineColor) ;Stärke 2 !!
                              SelectObject_(\hdc, gridlinePen)                      ;Pen wählen
                              MoveToEx_(\hdc, \rc\left, \rc\top, 0)                 ;Startposi links oben vom SubItem
                              LineTo_(\hdc, \rc\left, \rc\bottom)                   ;Line links nach unten
                              DeleteObject_(gridlinePen)                            ;muß sein bei CreatePen() 
                           EndWith
                        EndIf
                        
                        ;waagerechte line unten im GroupMode 
                        If SendMessage_(*nmhdr\hwndFrom, #LVM_ISGROUPVIEWENABLED, 0, 0) = #True
                           With *nmlvcustomdraw\nmcd                              
                              gridlinePen = CreatePen_(#PS_SOLID, 1, gridlineColor) ;Stärke 1 
                              SelectObject_(\hdc, gridlinePen)                      ;Pen wählen
                              MoveToEx_(\hdc, \rc\left, \rc\bottom-0, 0)            ;Startposi links unten vom SubItem
                              LineTo_(\hdc, \rc\right, \rc\bottom-0)                ;Line nach rechts 
                              DeleteObject_(gridlinePen)                            ;muß sein
                           EndWith                         
                        EndIf
                        
                        ProcedureReturn #CDRF_NEWFONT
                        
                  EndSelect ;von *nmlvcustomdraw
                  
            EndSelect   ;von *nmhdr\code
         EndIf          ;von *nmhdr\idfrom
         
   EndSelect 
   
   ProcedureReturn result    
EndProcedure 


Define x, y, w, h
Define j, jahr, zahl, text$

w = 940: h = 650
OpenWindow(#window, 50, 100, w, h, "LV Test", #PB_Window_SystemMenu|#PB_Window_Invisible)

SetWindowCallback(@MainCallback()) 

ListIconGadget(#mainliste, 5, 5, 500, h-10, "Column 0", 163, #PB_ListIcon_FullRowSelect|#PB_ListIcon_MultiSelect)
SetGadgetFont(#mainliste, FontID(fontStd))            ;bestimmt die Zeilenhöhe
SetWindowTheme_(GadgetID(#mainliste), "explorer", 0)

For j = 1 To 3
   AddGadgetColumn(#mainliste, j, "Column " + Str(j), 105)
Next

For j = 0 To 30   
   jahr = Random(2022, 2015)
   zahl = Random(6000, 1000)
   AddGadgetItem(#mainliste, -1, "Col 0/" + Str(j) + #LF$ + Str(jahr) + #LF$ + Str(zahl) + #LF$ + Str(zahl*2))
Next

SetGadgetItemText(#mainliste, 5, "", 1) 
SetGadgetItemText(#mainliste, 8, "", 1)

;-Infofeld erstellen
EditorGadget(#listeinfo, w-255, 5, 250, h-10)

;-Groups erstellen

GroupInsert(#mainliste, "Group 1 Leer")     ;die IDs ab 1 fortlaufend 
GroupInsert(#mainliste, "Group 2 2022")
GroupInsert(#mainliste, "Group 3 2021")
GroupInsert(#mainliste, "Group 4 2020")
GroupInsert(#mainliste, "Group 5 Rest")

;Groups füllen
For j = 0 To CountGadgetItems(#mainliste) - 1 
   
   text$ = Trim(GetGadgetItemText(#mainliste, j, 1))  ;je nach text in Col 1, item einer Group zuweisen     
   If text$ = ""
      SetItemToGroup(#mainliste, j, 1)   ;kein Text in Col1 nach Group 1
   ElseIf text$ = "2022"
      SetItemToGroup(#mainliste, j, 2)   ;2022 in Col1, nach Group 2  
   ElseIf text$ = "2021"
      SetItemToGroup(#mainliste, j, 3)   ;2021 in Col1, nach Group 3
   ElseIf text$ = "2020"
      SetItemToGroup(#mainliste, j, 4)   ;2020 in Col1, nach Group 4
   Else
      SetItemToGroup(#mainliste, j, 5)   ;alle anderen in Group 5
   EndIf
Next  

For j = 1 To lastgroupindex
   text$ = GetGroupName(#mainliste, j) + "  "
   text$ + "Firstitem: " + GetGroupFirstItem(#mainliste, j) + "  Anz." + GetGroupCountItem(#mainliste, j)    
   AddGadgetItem(#listeinfo, -1, text$)
Next

;-Buttons erstellen

Dim button(20)

x = GadgetWidth(#mainliste) + 20: y = 20: w = 150: h = 25 

button(0) = ButtonGadget(#PB_Any, x, y, w, h, "Groups on/off", #PB_Button_Toggle) : y + 35

ContainerGadget(#container, x, y, w, GadgetHeight(#mainliste) /2, 0) : y = 0

button(1) = ComboBoxGadget(#PB_Any, 0, y, w, h) : y + 35 ;Group wählen  
For j = 1 To 5
   AddGadgetItem(button(1), -1,"Group " + Str(j))
Next
SetGadgetState(button(1), 0) ;im Combo 1.Eintrag markieren

For j = 2 To 8 Step 2   ;to 8 10 12 usw
   button(j) = ButtonGadget(#PB_Any, 0, y, w, h, "") : y + h + 2
   button(j+1) = ButtonGadget(#PB_Any, 0, y, w, h, "") : y + h + 10
Next

button(20) = ButtonGadget(#PB_Any, 0, y, w, h, "Sortieren", #PB_Button_Toggle) 

PostEvent(#PB_Event_Gadget, EventWindow(), button(1)) ;Buttontexte zuweisen

CloseGadgetList()
HideGadget(#container, #True)

TextGadget(#PB_Any, x, WindowHeight(#window)-25, 100, 22, "Hottrack Item: ", #PB_Text_Right)  
TextGadget(#trackinfo, x+100, WindowHeight(#window)-25, 25, 22, "") 

HideWindow(#window, #False)

;-Repeat Event

Define event, gadget, pos, groupid = 1

Repeat
   event = WaitWindowEvent()
   gadget = EventGadget()
   
   Select Event         
      Case #PB_Event_Gadget
         
         Select gadget               
               
            Case button(0)               
               If GetGadgetState(gadget)               
                  SendMessage_(GadgetID(#mainliste), #LVM_ENABLEGROUPVIEW , #True, 0)
                  HideGadget(#container, #False)
               Else
                  SendMessage_(GadgetID(#mainliste), #LVM_ENABLEGROUPVIEW , #False, 0)
                  HideGadget(#container, #True)
               EndIf
               
            Case button(1): ;Buttontexte 
               groupid = GetGadgetState(gadget) + 1               ; +1 weil gadget bei null anfängt
               SetGadgetText(button(2), "Hide Group " + groupid)
               SetGadgetText(button(3), "Show Group " + groupid)
               
               SetGadgetText(button(4), "Hide Header " + groupid)
               SetGadgetText(button(5), "Show Header " + groupid)
               
               SetGadgetText(button(6), "Select + Items Group " + groupid)               
               SetGadgetText(button(7), "Get all Items Group " + groupid) 
               
               SetGadgetText(button(8), "Remove Group " + groupid) 
               SetGadgetText(button(9), "nix " + groupid) 
               
               SetGadgetText(button(20), "Sort Groups")
               
            Case button(2): GroupHide(#mainliste, groupid, #True)
            Case button(3): GroupHide(#mainliste, groupid, #False)
               
            Case button(4): GroupHideHeader(#mainliste, groupid, #True)
            Case button(5): GroupHideHeader(#mainliste, groupid, #False)
               
            Case button(6):  
               SetGadgetState(#mainliste, -1)      ;ev. vorhandene Markierungen weg
               GroupSelect(#mainliste, groupid)    ;Groupitems select
               
               Define iitem
               Define groupname$ = GetGroupName(#mainliste, groupid)
               Define groupfirstitem = GetGroupFirstItem(#mainliste, groupid)  
               Define groupitemanzahl = GetGroupCountItem(#mainliste, groupid) 
               
               AddGadgetItem(#listeinfo, -1, "")
               AddGadgetItem(#listeinfo, -1, groupname$ + ": hat " + Str(groupitemanzahl) + " Items")
               
               iitem = groupfirstitem  ;Start für #LVM_GETNEXTITEM
               AddGadgetItem(#listeinfo, -1, GetGadgetItemText(#mainliste, iitem, 0))
               For j = 1 To groupitemanzahl-1
                  iitem = SendMessage_(GadgetID(#mainliste), #LVM_GETNEXTITEM, iitem, #LVNI_SELECTED)                  
                  AddGadgetItem(#listeinfo, -1, GetGadgetItemText(#mainliste, iitem, 0))
               Next
               
            Case button(7):
               
               Define lvitemindex.LVITEMINDEX 
               
               Define itemanz = GetGroupCountItem(#mainliste, groupid) 
               
               Dim item$(itemanz)
               
               If itemanz                  
                  iItem = GetGroupFirstItem(#mainliste, groupid) 
                  item$(1) = GetGadgetItemText(#mainliste, iItem, 0)
                  
                  For j = 2 To itemanz                   
                     iItem = GetGroupNextItem(#mainliste, groupid, iItem)
                     item$(j) = GetGadgetItemText(#mainliste, iItem, 0)
                  Next              
                  
                  AddGadgetItem(#listeinfo, -1, "")
                  For j = 1 To itemanz
                     AddGadgetItem(#listeinfo, -1, item$(j))
                  Next
               Else
                  MessageRequester("", "keine Items vorhanden")
               EndIf
               
            Case button(8): GroupRemove(#mainliste, groupid) 
               
            Case button(20): 
               If GetGadgetState(gadget)  
                  SortGroups(#mainliste, #PB_Sort_Descending)
               Else
                  SortGroups(#mainliste, #PB_Sort_Ascending)
               EndIf
               
               
            Case #mainliste
               If EventType() = #PB_EventType_LeftClick
                  pos = GetGadgetState(#mainliste)
                  text$ = "Leftclick auf: " + GetGadgetItemText(#mainliste, pos, 0)
                  AddGadgetItem(#listeinfo, -1, text$)                  
               EndIf  
               
            Case #listeinfo
               If EventType() = #PB_EventType_LeftClick                   
               EndIf               
               
         EndSelect
   EndSelect
Until Event = #PB_Event_CloseWindow
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Antworten