SplitterGadGet mit mehr als 2 Gadgets (variabel)

Anfängerfragen zum Programmieren mit PureBasic.
Alpha1
Beiträge: 3
Registriert: 01.04.2014 14:43

SplitterGadGet mit mehr als 2 Gadgets (variabel)

Beitrag von Alpha1 »

Hallo Leute!
Hab ein Problem mit dem SplitterGadget.
Zur Ausgangslage:

Habe im linken Bereich eine Hauptliste. Im rechten Bereich sollen abhängig von einer mit Inputrequester eingelesenen Zahl X,
X Listen und X Buttons erzeugt werden.
Durch Doppelklick in der Hauptliste soll der Text entsprechend gewählter Liste (ButtonX) in die Liste X übernommen werden.
Das Grundgerüst steht soweit.
Nun besteht jedoch der Wunsch, die ausgewählte Liste auf ein mögliches Maximum zu vergrößern, sodass der Überblick besser ist. Die "Titelleisten" der anderen Listen sollen aber sichtbar bleiben!

Habe so ziemlich alle Beiträge zum SplitterGadget gelesen, aber ich komme nicht wirklich weiter.

Problem 1: Durch die variable Anzahl der Listen, bekomme ich die Zuordnung im SplitterGadget nicht hin (Liste1,Liste2) --> (Liste3,Slitter1)

Problem 2: Die Listen sollen bei Start gleich groß sein!

Danke im Vorraus!


Beispiel:

Code: Alles auswählen

;{- Enumerations / DataSections
;{ Windows
Enumeration
  #Window_0
  #MainList
EndEnumeration
;}
Define.l Event, EventWindow, EventGadget, EventType, EventMenu
Global Anz
Procedure OpenWindow_Window_0()
  
  Anz=Val(InputRequester("","Wieviele Listen?","4"))
  ExamineDesktops()
  x=DesktopWidth(0)
  y=DesktopHeight(0)-80
  H=y/Anz
  
  If OpenWindow(#Window_0, 0, 0, x-20, y, "Fenster 1" , #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar) 
    ListIconGadget(#MainList, 10, 75, x/2, y-150,"Nr:",200,#PB_ListIcon_GridLines|#PB_ListIcon_MultiSelect|#PB_ListIcon_FullRowSelect)
    For i=1 To 20
      AddGadgetItem(#MainList,-1,"Text "+Str(i))
    Next
    
    For i= 0 To Anz-1
      ListIconGadget(600+i+1, x/2+150, i*H+10, x/3, H,"Liste "+Str(i+1),200,#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect)
      ButtonGadget(700+i+1, x/2+30, 40+i*30+10, 100, 30, "Liste "+Str(i+1), #PB_Button_Toggle)
    Next
    
    
  EndIf
EndProcedure

OpenWindow_Window_0()

;{- Event loop
Repeat
  Event = WaitWindowEvent()
  Select Event
      ; ///////////////////
    Case #PB_Event_Gadget
      EventGadget = EventGadget()
      EventType = EventType()
      If EventGadget=#MainList ;-Doppelklich Mainlist
        If EventType=2
          
          For i=1 To Anz
            status+GetGadgetState(700+i)
          Next
          
          If status>0
            Code$=GetGadgetItemText(#MainList,GetGadgetState(#MainList),0)
            Debug Code$
            
           
            For i=1 To Anz
              status= GetGadgetState(700+i)
              If status=1
                AddGadgetItem(600+i,-1,Code$)
              EndIf
            Next
            RemoveGadgetItem(#MainList,GetGadgetState(#MainList))
            status=0 
            
          Else
            MessageRequester("","Sie haben keine Liste ausgewählt",#MB_ICONINFORMATION)
          EndIf
          
        EndIf
        
      EndIf
      
      If EventType=2 And Left(Str(EventGadget),1)="6"
        
        TEXT_DEL1$=GetGadgetItemText(EventGadget,GetGadgetState(EventGadget),0)
        AddGadgetItem(#MainList,-1,TEXT_DEL1$)
        RemoveGadgetItem(EventGadget,GetGadgetState(EventGadget))
      EndIf
      
    Case #PB_Event_CloseWindow
      EventWindow = EventWindow()
      If EventWindow = #Window_0
        CloseWindow(#Window_0)
        Break
      EndIf
  EndSelect
ForEver
;
;}
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Re: SplitterGadGet mit mehr als 2 Gadgets (variabel)

Beitrag von Andesdaf »

Hallo,

es ist besser, wenn du dir die Gadgetnummern mit #PB_Any zurückgeben lässt. Definiere dir ein
Array und speichere dort die Gadgetnummern hinein. Das macht das Arbeiten anschließend leichter.

Alle Listen mit SplitterGadgets zu verbinden ist denke ich zu aufwendig, schon wenn du eine ungerade
Zahl an Listen hast bekommst du Probleme, weil das SplitterGadget nur zwei andere Gadgets kombinieren
kann und so bei ungerader Gadgetanzahl keine "Splitter-Hierarchie" aufgebaut werden kann.

Wenn es dir nur um Maximierung/Minimierung von Listen geht, würde ich vorschlagen, einen bestimmten
EventType auf eine Liste auszuwerten und dann diese Liste zu maximieren, während alle anderen minimiert
werden.

Du musst also den Eventtyp abfangen, schauen, ob er eine der Listen betraf und dann alle Listen mit ResizeGadget
neu ausrichten, die nicht angeklickten minimiert, die angeklickte maximiert.
Win11 x64 | PB 6.20
Alpha1
Beiträge: 3
Registriert: 01.04.2014 14:43

Re: SplitterGadGet mit mehr als 2 Gadgets (variabel)

Beitrag von Alpha1 »

Danke für die Antwort.

Mit "#PB_Any" weiß ich nicht, wie ich dann erkenne, ob es eine Liste war.
Deshalb habe ich den 600-er Bereich gewählt, dass ich weiß-ok, es war eine Liste.
Oder war der Hinweis mit dem Array der Lösungsansatz?

Eine neue Überlegung war, alle Listen nur in der Höhe der Titelleisten zu öffnen und die jeweils ausgewählte unterhalb maximiert zu öffnen.

Code: Alles auswählen

ResizeGadget(ListeX,#PB_Ignore,(WindowHeight(#Window_0) -((Anz-1) x 20),#PB_Ignore,700) ;20=Höhe Titelleiste


Das führt wohl eher zum Ziel.
Werd dann wohl nicht lösen können, dass mehrere Listen maximiert sind.
Oder geht das zu lösen?
matbal
Beiträge: 261
Registriert: 30.03.2011 20:53

Re: SplitterGadGet mit mehr als 2 Gadgets (variabel)

Beitrag von matbal »

Ich habe dein Beispiel mit Splittern nachzubauen versucht. Prinzipiell geht das schon. Allerdings ist die Bedienung nicht optimal. Nach oben kann ich die Listen einfach zusammenschieben, nach unten muß ich aber jede Liste einzeln verschieben. Das liegt daran, daß die Splitter ineinander verschachtelt sind. Die obenen Splitter sind alle im unteren Splitter. - Bei sehr vielen Listen ist es also umständlich.

Für Splitter, ListIcon und Button habe ich Arrays genommen. Um die dynamischen Gadgets im Eventloop anzusprechen, benutze ich eine For-Schleife. Das geht bestimmt auch eleganter...

Code: Alles auswählen

EnableExplicit

Global ListCount = 4
Global Dim ListIcon.i(ListCount)
Global Dim Splitter.i(ListCount)
Global Dim Button_List.i(ListCount)

Enumeration FormWindow
   #Window_0
   #ListIconMain
EndEnumeration


Procedure FormMain_Open()
   Protected i
   Protected ww, wh, x, y, w, h, Text$
   
   ww = 800
   wh = 600
   OpenWindow(#Window_0, 0, 0, ww, wh, "Programm", #PB_Window_SystemMenu)
   
   ; -- Hauptliste
   x = 5 
   y = 5
   w = ww/2 - 60 
   h = wh - 10
   ListIconGadget(#ListIconMain, x, y, w, h, "Liste", 100, #PB_ListIcon_FullRowSelect)
   
   ; -- Unterlisten
   x = ww/2 + 55
   For i = 0 To ListCount - 1
      ListIcon(i) = ListIconGadget(#PB_Any, x, y, w, h, "Liste " + Str(i), 100)
      
      ; ab der zweiten Liste kommt ein splitter hinzu
      If i = 1       ; erster Splitter zwischen die beiden ListIcons
         Splitter(i) = SplitterGadget(#PB_Any, x, y, w, h, ListIcon(0), ListIcon(1), #PB_Splitter_FirstFixed)
         SetGadgetAttribute(Splitter(i), #PB_Splitter_FirstMinimumSize, 32)   
         SetGadgetAttribute(Splitter(i), #PB_Splitter_SecondMinimumSize, 32)
      ElseIf i > 1   ; nächster Splitter zwischen vorherigen Splitter und ListIcon
         Splitter(i) = SplitterGadget(#PB_Any, x, y, w, h, Splitter(i-1), ListIcon(i),#PB_Splitter_FirstFixed)
         SetGadgetAttribute(Splitter(i), #PB_Splitter_FirstMinimumSize, 32*i) 
         SetGadgetAttribute(Splitter(i), #PB_Splitter_SecondMinimumSize, 32)
      EndIf
   Next i
   
   ; -- Splittergrößen einstellen
   For i = ListCount-1 To 1 Step -1
      h = ((wh-10)/ListCount) * i
      SetGadgetState(Splitter(i), h)
   Next i
   
   ; --- Buttons
   x = ww/2 - 45 
   y = 5
   w = 90        
   h = 25
   For i = 0 To ListCount-1
      Button_List(i) = ButtonGadget(#PB_Any, x, y, w, h, "Liste " + Str(i), #PB_Button_Toggle)
      y + 25
   Next i
   
EndProcedure

Procedure MoveItem()
   Debug "Move Item"
   Protected n = GetGadgetState(#ListIconMain)
   Protected Text$
   Protected del, i
   
   If n >= 0
      Text$ = GetGadgetItemText(#ListIconMain, n)
      For i = 0 To ListCount-1
         If GetGadgetState(Button_List(i))
            AddGadgetItem(ListIcon(i), -1, Text$)
            del = 1
         EndIf
      Next i
      If del 
         RemoveGadgetItem(#ListIconMain, n)
      EndIf
   EndIf
         
EndProcedure

Procedure FillListIcon()
   Protected Text$, i
   
   For i = 0 To 20
      Text$ = "Text " + Str(i)
      AddGadgetItem(#ListIconMain, -1, Text$)
   Next i
EndProcedure


FormMain_Open()
FillListIcon()

Define i, event, gadget


Repeat
   event = WaitWindowEvent()
   
   Select event
      Case #PB_Event_CloseWindow
         Break
      Case #PB_Event_Gadget
         gadget = EventGadget()
         Select gadget
            Case #ListIconMain
               Select EventType()
                  Case #PB_EventType_LeftDoubleClick
                     MoveItem()
               EndSelect
               
            Default  
               ; ListIcon-Array und Button-Array
               For i = 0 To ListCount-1
                  If gadget = ListIcon(i)
                     Debug "EVENT ListIcon " + i
                     Break
                  EndIf
                  If gadget = Button_List(i)
                     Debug "EVENT Button " + i
                     Break
                  EndIf
               Next i
         EndSelect
   EndSelect
ForEver
matbal
Beiträge: 261
Registriert: 30.03.2011 20:53

Re: SplitterGadGet mit mehr als 2 Gadgets (variabel)

Beitrag von matbal »

Alpha1 hat geschrieben:Werd dann wohl nicht lösen können, dass mehrere Listen maximiert sind.
Oder geht das zu lösen?
Du kannst den verfügbaren Platz doch beliebig einteilen. Du ziehst von der Höhe des Fensters die Titelhöhe aller Listen ab. Den übrigen Platz gibst du nicht nur einer Liste, sondern du teilst ihn auf alle sichtbaren Listen auf.
Alpha1
Beiträge: 3
Registriert: 01.04.2014 14:43

Re: SplitterGadGet mit mehr als 2 Gadgets (variabel)

Beitrag von Alpha1 »

Danke an Euch zwei!

Die Lösung von matbal entspricht genau dem, was ich ursprünglich vorhatte.
Wegen der optimalen Bedienung brauchst Du Dir keine Sorgen machen. Der Regelfall sollen gleichgroße Listen sein.
Es sollte nur prinzipiell die Möglichkeit der Größenänderung vorhanden sein.

Nochmals danke für die schnellen Antworten!
Antworten