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