Pelagio hat geschrieben:Besteht die Möglichkeit
in einer ListIconGadget-Tabelle einzelne Zeilen aus- und einzublenden?
In Windows ist es in einem ListView (das ListIconGadget in PureBasic ist davon abgeleitet) nicht vorgesehen, einzelne Zeilen aus- und einzublenden. Wie RSBasic schon richtig bemerkt hat, wäre es möglich, dies mit selbst gezeichneten Zeilen im Modus "Ownerdraw" zu realisieren, was aber enorm aufwendig zu programmieren wäre, weil man dann jede Zeile selbst zeichnen und alle Klicks auf eine Zeile selbst abfangen und darauf korrekt reagieren müsste.
Es gibt im Windows ListView aber die Möglichkeit, eine oder mehrere Zeilen unter eine Gruppenüberschrift zu stellen. Diese Gruppen können dann entweder über den Klick auf ein Icon am rechten Rand der Gruppenüberschrift oder programmgesteuert mit allen zur Gruppe gehörenden Zeilen aus- und eingeblendet werden. Für beide Möglichkeiten habe ich Beispiele erstellt, die ich erfolgreich unter Windows 7 SP1 x64 mit PB 5.46 x86 und x64 im ASCII- und Unicode-Modus und mit PB 5.70 x86 und x64 getestet habe.
Das erste Beispiel erstellt zwei Gruppen und demonstriert, wie man das Ein-/Ausblende-Icon am rechten Rand der Gruppenüberschrift anzeigt und wieder entfernt. Der Anwender hat dann die Möglichkeit, bei angezeigtem Icon alle Einträge einer Gruppe aus- und wieder einzublenden:
Code: Alles auswählen
EnableExplicit
Structure LVGROUPA Align #PB_Structure_AlignC
cbSize.l
mask.l
*pszHeader
cchHeader.l
*pszFooter
cchFooter.l
iGroupId.l
stateMask.l
state.l
uAlign.l
EndStructure
Define i.I
Define j.I
Procedure AddListIconGroup(ListIconID.I, GroupID.I, GroupText.S)
Protected Group.LVGROUPA
Protected UnicodeText.S
Group\cbSize = SizeOf(LVGROUPA)
Group\mask = #LVGF_GROUPID | #LVGF_ALIGN | #LVGF_HEADER
Group\iGroupId = GroupID
Group\uAlign = #LVGA_HEADER_LEFT
UnicodeText = Space(128)
PokeS(@UnicodeText, GroupText, -1, #PB_Unicode)
Group\pszHeader = @UnicodeText
SendMessage_(GadgetID(ListIconID), #LVM_INSERTGROUP, -1, @Group)
EndProcedure
Procedure AddListIconItem(ListIconID.I, GroupID.I, ItemText.S)
Protected Item.LVITEM
Item\mask = #LVIF_TEXT | #LVIF_GROUPID
Item\pszText = @ItemText
Item\iGroupId = GroupID
SendMessage_(GadgetID(ListIconID), #LVM_INSERTITEM, 0, @Item)
EndProcedure
Procedure ToggleGroupCollapsibility(ListIconID.I, GroupID.I)
Protected Group.LVGROUPA
If SendMessage_(GadgetID(ListIconID), #LVM_GETGROUPSTATE, GroupID,
#LVGS_COLLAPSIBLE) = 0
Group\state = #LVGS_COLLAPSIBLE
EndIf
Group\cbSize = SizeOf(LVGROUPA)
Group\mask = #LVGF_STATE
Group\iGroupId = GroupID
SendMessage_(GadgetID(ListIconID), #LVM_SETGROUPINFO, GroupID, @Group)
EndProcedure
OpenWindow(0, 100, 100, 240, 220, "Gruppe einklappbar machen")
ListIconGadget(0, 10, 10, WindowWidth(0) - 20, WindowHeight(0) - 50, "",
WindowWidth(0) - 24)
SetWindowLongPtr_(GadgetID(0), #GWL_STYLE,
GetWindowLongPtr_(GadgetID(0), #GWL_STYLE) | #LVS_NOCOLUMNHEADER)
SendMessage_(GadgetID(0), #LVM_ENABLEGROUPVIEW, 1, 0)
ButtonGadget(1, 10, GadgetHeight(0) + 20, 220, 20,
"Einklappmöglichkeit von Gruppe 1 ändern")
For j = 1 To 2
AddListIconGroup(0, j - 1, "Gruppe " + Str(j))
For i = 1 To 3
AddListIconItem(0, j - 1, "Eintrag "+ Str((j - 1) * 3 + i) +
" gehört zu Gruppe " + Str(j))
Next i
Next j
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Break
Case #PB_Event_Gadget
If EventGadget() = 1
ToggleGroupCollapsibility(0, 0)
EndIf
EndSelect
ForEver
Das zweite Beispiel erstellt zwei Gruppen und demonstriert, wie man programmgesteuert eine Gruppe ein- und ausklappt. Dabei ist es auch möglich, alternativ die Gruppenüberschrift selbst nach dem Einklappen auszublenden oder sie weiterhin angezeigt zu lassen und nur die dazugehörigen Zeilen einzuklappen:
Code: Alles auswählen
EnableExplicit
#LVGS_NOHEADER = 4
Structure LVGROUPA Align #PB_Structure_AlignC
cbSize.l
mask.l
*pszHeader
cchHeader.l
*pszFooter
cchFooter.l
iGroupId.l
stateMask.l
state.l
uAlign.l
EndStructure
Define i.I
Define j.I
Procedure AddListIconGroup(ListIconID.I, GroupID.I, GroupHeader.S)
Protected Group.LVGROUPA
Protected UnicodeText.S
Group\cbSize = SizeOf(LVGROUPA)
Group\mask = #LVGF_GROUPID | #LVGF_ALIGN | #LVGF_HEADER
Group\iGroupId = GroupID
Group\uAlign = #LVGA_HEADER_LEFT
UnicodeText = Space(128)
PokeS(@UnicodeText, GroupHeader, -1, #PB_Unicode)
Group\pszHeader = @UnicodeText
SendMessage_(GadgetID(ListIconID), #LVM_INSERTGROUP, -1, @Group)
EndProcedure
Procedure AddListIconItem(ListIconID.I, GroupID.I, ItemText.S)
Protected Item.LVITEM
Item\mask = #LVIF_TEXT | #LVIF_GROUPID
Item\pszText = @ItemText
Item\iGroupId = GroupID
SendMessage_(GadgetID(ListIconID), #LVM_INSERTITEM, 0, @Item)
EndProcedure
Procedure ToggleGroupVisibility(ListIconID.I, GroupID.I, GroupHeader.S)
Protected Group.LVGROUPA
Protected UnicodeText.S
Group\cbSize = SizeOf(LVGROUPA)
Group\mask = #LVGF_STATE
If SendMessage_(GadgetID(ListIconID), #LVM_GETGROUPSTATE, GroupID,
#LVGS_HIDDEN) = 0
Group\state = #LVGS_COLLAPSED | #LVGS_HIDDEN
If GetGadgetState(1)
Group\mask | #LVGF_HEADER
If SendMessage_(GadgetID(ListIconID), #LVM_GETGROUPSTATE, GroupID,
#LVGS_NOHEADER) = 0
Group\state | #LVGS_NOHEADER
EndIf
EndIf
Else
If SendMessage_(GadgetID(ListIconID), #LVM_GETGROUPSTATE, GroupID,
#LVGS_NOHEADER) <> 0
Group\mask | #LVGF_ALIGN | #LVGF_HEADER
UnicodeText = Space(128)
PokeS(@UnicodeText, GroupHeader, -1, #PB_Unicode)
Group\pszHeader = @UnicodeText
Group\uAlign = #LVGA_HEADER_LEFT
EndIf
EndIf
SendMessage_(GadgetID(ListIconID), #LVM_SETGROUPINFO, GroupID, @Group)
EndProcedure
OpenWindow(0, 100, 100, 240, 250, "Gruppe 1 aus-/einblenden")
ListIconGadget(0, 10, 10, WindowWidth(0) - 20, WindowHeight(0) - 80, "",
WindowWidth(0) - 24)
SetWindowLongPtr_(GadgetID(0), #GWL_STYLE,
GetWindowLongPtr_(GadgetID(0), #GWL_STYLE) | #LVS_NOCOLUMNHEADER)
SendMessage_(GadgetID(0), #LVM_ENABLEGROUPVIEW, 1, 0)
CheckBoxGadget(1, 10, GadgetHeight(0) + 20, 220, 20,
"Gruppenüberschrift auch aus-/einblenden")
ButtonGadget(2, 10, GadgetHeight(0) + 50, 220, 20,
"Sichtbarkeit von Gruppe 1 ändern")
For j = 1 To 2
AddListIconGroup(0, j - 1, "Gruppe " + Str(j))
For i = 1 To 3
AddListIconItem(0, j - 1, "Eintrag "+ Str((j - 1) * 3 + i) +
" gehört zu Gruppe " + Str(j))
Next i
Next j
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Break
Case #PB_Event_Gadget
If EventGadget() = 2
ToggleGroupVisibility(0, 0, "Gruppe 1")
EndIf
EndSelect
ForEver