Aktuelle Zeit: 17.09.2019 04:51

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Ausblenden Tabellen Zeilen
BeitragVerfasst: 25.04.2019 14:01 
Offline
Benutzeravatar

Registriert: 11.11.2004 17:52
Wohnort: Bremen
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); PB5.70 LTS].


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Ausblenden Tabellen Zeilen
BeitragVerfasst: 25.04.2019 14:04 
Offline
Admin
Benutzeravatar

Registriert: 05.10.2006 18:55
Wohnort: Deutschland::Berlin()
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.

_________________
BildBildBildBild(Update: 17.08.2019 (+196 Dateien, +1392 MB)) BildBild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Ausblenden Tabellen Zeilen
BeitragVerfasst: 27.04.2019 21:59 
Offline
Benutzeravatar

Registriert: 25.01.2005 12:19
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:
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:
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


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  
cron

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye