Hallo,
ich habe mal wieder eine einfache Frage , wobei die Antwort eventuell nicht so einfach sein wird.
Besteht die Möglichkeit in einer ListIconGadget-Tabelle einzelne Zeilen aus- und einzublenden?
Ausblenden Tabellen Zeilen
- Pelagio
- Beiträge: 424
- Registriert: 11.11.2004 17:52
- Computerausstattung: Intel Core i3-4170 CPU 3,70 GHz
8,00 GB Arbeitsspeicher
WIN 10 Pro 64 Bit Betriebssystem - Wohnort: Bremen
Ausblenden Tabellen Zeilen
Ohne Zeit kein Fleiß
Auf neustem Stand zu sein ist eine Kunst die nicht jeder perfektioniert [Win10Pro(64); PB6.10 LTS].
Auf neustem Stand zu sein ist eine Kunst die nicht jeder perfektioniert [Win10Pro(64); PB6.10 LTS].
Re: Ausblenden Tabellen Zeilen
Soweit ich weiß nicht. Es könnte aber sein, dass man per OwnerDraw-Callback selber bestimmen kann, was im ListIconGadget angezeigt wird.
Du kannst mal nach Ownerdraw im Forum suchen. Vielleicht gibt es ein Beispielcode.
Du kannst mal nach Ownerdraw im Forum suchen. Vielleicht gibt es ein Beispielcode.
Re: Ausblenden Tabellen Zeilen
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.Pelagio hat geschrieben:Besteht die Möglichkeit in einer ListIconGadget-Tabelle einzelne Zeilen aus- und einzublenden?
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
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