ListIconGadget ... Select-Problem!?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

ListIconGadget ... Select-Problem!?

Beitrag von Xaby »

Hallo Freunde ....

Code: Alles auswählen

; Autor Folker Linstedt
; 2007|08|27

If OpenWindow(0, 100, 100, 400, 400, "ListIcon Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CreateToolBar(0,WindowID(0))
  
  ToolBarStandardButton(1,#PB_ToolBarIcon_Paste)
  ToolBarToolTip(0,1,"Fügt Auswahl hinzu")
  ToolBarSeparator()
  ToolBarStandardButton(2,#PB_ToolBarIcon_Redo,#PB_ToolBar_Toggle)
  ToolBarToolTip(0,2,"Markiert automatisch den nächsten")
  ToolBarSeparator()
  ToolBarStandardButton(3,#PB_ToolBarIcon_Delete)
  ToolBarToolTip(0,3,"Hebt Auswahl auf")
  
  If CreateGadgetList(WindowID(0))
    ListIconGadget(0,   5, 50, 180, 300, "Name", 100, #PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_MultiSelect|#PB_ListIcon_GridLines)
    ListIconGadget(1, 205, 50, 180, 300, "Name", 100, #PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_MultiSelect|#PB_ListIcon_GridLines)
    For i=0 to 100
      AddGadgetItem(0, -1, RSet(Str(i),8,"0"))
    Next
    Repeat
      Event = WaitWindowEvent()
      
      If Event = #PB_Event_Menu
        MenuEvent=EventMenu()
        
        If MenuEvent=1
          
          For i=0 to 100
            If GetGadgetItemState(0,i)
              AddGadgetItem(1,-1,GetGadgetItemText(0,i,0))
              SetGadgetItemColor(0,i,#PB_Gadget_BackColor,RGB(0,255,0),0)
              P=i
            EndIf
            
            If GetToolBarButtonState(0,2)
              ;  Hebt Auswahl auf
               SetGadgetItemState(0,i,0)
            EndIf
            
          Next 
          
          If GetToolBarButtonState(0,2)
            ; SetGadgetState(0,-1)
             SetGadgetState(0,P+1)
          EndIf 
          
        EndIf
        
        If MenuEvent=3
          SetGadgetState(0,-1)
        EndIf
        
      EndIf
      
    Until Event = #PB_Event_CloseWindow
  EndIf
EndIf
Bitte versucht einmal folgendes:

Markiert auf der linken Seite ein paar Einträge, mit der Umschalt-Taste.
So, dass viele unter einander markiert sind. Probiert das ruhig mal mit und ohne Zwischenräumen.

Folgendes soll möglich sein, wenn man nun auf HINZUFÜGEN klickt, werden die markierten Einträge hinzugefügt. Wählt man "->" soll automatisch der nächste Eintrag gewählt werden.

Von dort möchte ich wieder mit der Umschalt-Taste einige Einträge markieren.

>>>>>> Nun das Problem, scheinbar bleibt die Selektierung
obwohl ich das Gadget auf -1 gesetzt habe und keine Markierung mehr zu sehen ist. Sogar jedes einzelne Item auf NULL gesetzt, damit keine Markierung mehr vorhanden sein kann und dennoch, werden Einträge markiert, die ich nicht markiert haben will, wenn ich gleich Umschalt und Mausklick benutze.

Und fragt bitte, nicht, wieso ich nicht STRG nehme, oder wieso ich nicht zweimal klicken möchte. In der Liste sind später mehr als 100 Einträge und die automatische Weiterschaltung spart einfach unheimlich Zeit.

Doch sobald es sich um mehrere neue ausgewählte Einträge handeln soll, werden auch alte Markierungen wieder markiert, was irgendwie ja nun nicht so schön ist.

Wer weiß, was ich übersehen habe?

Gruß, Folker :allright:
Kinder an die Macht http://scratch.mit.edu/
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Re: ListIconGadget ... Select-Problem!?

Beitrag von PureLust »

Xaby hat geschrieben:Wählt man "->" soll automatisch der nächste Eintrag gewählt werden.
Hmmm ... und wo ist dann das entsprechende Event-Handling dazu??? :roll:

Code: Alles auswählen

If MenuEvent=2
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Der Button ist getogglet.

Er wird einfach nur gecheckt via

Code: Alles auswählen

GetToolBarButtonState(0,2)
Habs auch erst nicht gerafft (eigentlich die ganze Erklärung), aber konnte dann immerhin das Verhalten reproduzieren.
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Beitrag von PureLust »

Ahh, klar ... hast recht.
Nun hab ich's auch gesehen und verstanden was und wie er's wollte. :wink:

Das es nicht so geht wie er es gerne hätte wird aber wohl am OS liegen, denn die Mehrfachselektion per Shift-Klick ist eine OS Geschichte die scheinbar den letzten (nicht mit Shift) angeklickten Eintrag zwischenspeichert.

Einen Eintrag per SetGadgetItemState() zu de-/aktivieren ist ja nicht das selbe wie diesen durch einen Mausklick zu markieren.
Um das gewünschte Verhalten zu erreichen muss man also wohl die API bemühen.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Das sollte helfen:

Code: Alles auswählen

SendMessage_(GadgetID(0), #LVM_SETSELECTIONMARK, #Null, P + 1)
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag von Xaby »

Wo bekomme ich die Konstante her?

#LVM_SETSELECTIONMARK

Gruß, Folker :roll:
Kinder an die Macht http://scratch.mit.edu/
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

SetGadgetState() markiert bei einem ListIconGadget einen einzelnen Eintrag
und setzt den Tastaturfokus darauf.
GetGadgetState() gibt den Eintrag mit dem Fokus zurück, der aber nicht
markiert sein muss.
Mit SetGadgetItemState() kann man Einträge markieren, aber nicht den
Fokus setzen.
Mit GetGadgetItemState() kann man herausfinden, ob ein Eintrag markiert
ist, aber man kann nicht feststellen, ob er den Fokus hat.

Ich hab den ersten Post nicht durchgelesen, aber ich dachte, ich erwähne das
trotzdem mal. Also wenn es nicht hilft, dann ist auch egal. :wink:
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Xaby hat geschrieben:Wo bekomme ich die Konstante her?

#LVM_SETSELECTIONMARK

Gruß, Folker :roll:
Aus dem MSDN
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Xaby hat geschrieben:Wo bekomme ich die Konstante her?

#LVM_SETSELECTIONMARK

Gruß, Folker :roll:
Einfacher gehts über Google Codesearch: #LVM_SETSELECTIONMARK
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag von Xaby »

@Nick

>>
SetGadgetState() markiert bei einem ListIconGadget einen einzelnen Eintrag
und setzt den Tastaturfokus darauf.
<<

Genau da ist das Problem. Den Tastaturfokus setzt es scheinbar, aber das funktioniert nur mit den Pfeiltasten und der STRG-Taste und einem Mausklick, aber nicht mit der Umschalttaste und der Maustaste.

Und dafür suche ich die Lösung. :?

@HeXor
#LVM_SETSELECTIONMARK=#LVM_FIRST+67

Und deinen Code eingefügt, funktioniert hervorragend.

Kann ich mit solchen Tricks mein ListIconGadget() auch so manipulieren, dass ich zum Beispiel die STRG-Taste nicht drücken brauche, aber die Markierungen nicht weggehen.

Also sich das Gadget so verhält als würde ich sie drücken ...

Das muss doch auch ohne VirtualKeys und umständlichen Abfragen gehen.

:?
Kinder an die Macht http://scratch.mit.edu/
Antworten