Ausblenden Tabellen Zeilen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
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

Beitrag von Pelagio »

Hallo,

ich habe mal wieder eine einfache Frage :?:, wobei die Antwort eventuell nicht so einfach sein wird.
Besteht die Möglichkeit :idea: in einer ListIconGadget-Tabelle einzelne Zeilen aus- und einzublenden?
Ohne Zeit kein Fleiß
Auf neustem Stand zu sein ist eine Kunst die nicht jeder perfektioniert [Win10Pro(64); PB6.10 LTS]. :allright:
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Ausblenden Tabellen Zeilen

Beitrag von RSBasic »

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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Shardik
Beiträge: 738
Registriert: 25.01.2005 12:19

Re: Ausblenden Tabellen Zeilen

Beitrag von Shardik »

Pelagio hat geschrieben:Besteht die Möglichkeit :idea: 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:

Bild

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:

Bild

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
Antworten