Seite 1 von 2

ListIconGadget ... Select-Problem!?

Verfasst: 27.08.2007 16:28
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:

Re: ListIconGadget ... Select-Problem!?

Verfasst: 27.08.2007 17:11
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

Verfasst: 27.08.2007 18:37
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.

Verfasst: 27.08.2007 19:01
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.

Verfasst: 27.08.2007 19:58
von HeX0R
Das sollte helfen:

Code: Alles auswählen

SendMessage_(GadgetID(0), #LVM_SETSELECTIONMARK, #Null, P + 1)

Verfasst: 30.08.2007 09:37
von Xaby
Wo bekomme ich die Konstante her?

#LVM_SETSELECTIONMARK

Gruß, Folker :roll:

Verfasst: 30.08.2007 09:49
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:

Verfasst: 30.08.2007 10:19
von HeX0R
Xaby hat geschrieben:Wo bekomme ich die Konstante her?

#LVM_SETSELECTIONMARK

Gruß, Folker :roll:
Aus dem MSDN

Verfasst: 30.08.2007 11:07
von NicTheQuick
Xaby hat geschrieben:Wo bekomme ich die Konstante her?

#LVM_SETSELECTIONMARK

Gruß, Folker :roll:
Einfacher gehts über Google Codesearch: #LVM_SETSELECTIONMARK

Verfasst: 30.08.2007 12:16
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.

:?