meine erste + zweite Demo mit Groups im Listicongadget
Verfasst: 02.07.2022 11:00
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
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