Problem mit SetGadgetItemState

Für allgemeine Fragen zur Programmierung mit PureBasic.
Hugo
Beiträge: 56
Registriert: 30.03.2005 12:07
Wohnort: Nähe München

Problem mit SetGadgetItemState

Beitrag von Hugo »

Hallo,

ich bin von GFA-Basic 32 auf PureBasic umgestiegen unter anderem auf Grund von diesem Forum.

Nun habe ich ein kleines Problem mit ListIconGadgets festgestellt und hoffe, dass ihr mir helfen könnt.

Ich möchte vom Programm aus einen Eintrag in der Liste markieren (auswählen). Laut Hilfe sollte das mit dem SetGadgetItemState auch gehen. Das Problem dabei ist, dass der Eintrag erst dann sichtbar markiert ist, wenn man in den Spaltenkopf klickt. Kennt jemand eine Möglichkeit, dass der Eintrag sofort als markiert erscheint?

Hier mal ein kleines Beispiel, das das Verhalten zeigen soll.

Code: Alles auswählen


OpenWindow( 0, 50, 50, 410, 600, #PB_Window_SystemMenu, "TEST" )
CreateGadgetList( WindowID( 0  ) )
ListIconGadget(  1, 5, 5, 400 ,590, "Spalte 1", 198)
AddGadgetColumn( 1, 1,              "Spalte 2", 198 )

For x = 1 To 20 
  AddGadgetItem( 1, -1, "Zeile " + Str( x ) + Chr( 10 ) + Str( x * Random( 100 ) ) )
Next x

SetGadgetItemState( 1, 3, #PB_ListIcon_Selected )

Repeat
Until WaitWindowEvent() = #PB_EventCloseWindow

Benutzeravatar
125
Beiträge: 1322
Registriert: 19.09.2004 16:52
Wohnort: Neu Wulmstorf (Hamburg)
Kontaktdaten:

Beitrag von 125 »

Code: Alles auswählen

OpenWindow( 0, 50, 50, 410, 600, #PB_Window_SystemMenu, "TEST" ) 
CreateGadgetList( WindowID( 0  ) ) 
ListIconGadget(  1, 5, 5, 400 ,590, "Spalte 1", 198) 
AddGadgetColumn( 1, 1,              "Spalte 2", 198 ) 

For x = 1 To 20 
  AddGadgetItem( 1, -1, "Zeile " + Str( x ) + Chr( 10 ) + Str( x * Random( 100 ) ) ) 
Next x 

SetGadgetItemState( 1, 3, #PB_ListIcon_Selected ) 
SendMessage_(GadgetID(1),#WM_ACTIVATE,1,0)
Repeat 
Until WaitWindowEvent() = #PB_EventCloseWindow
:D
Hugo
Beiträge: 56
Registriert: 30.03.2005 12:07
Wohnort: Nähe München

Beitrag von Hugo »

Vielen Dank für die schnelle Hilfe.

Ich frage mich aber, ob das so gewollt ist, dass man mit API's arbeiten muss. Eigentlich sollte das ja laut Hilfe auch ohne API gehen.

Trotzdem nochmals vielen Dank für die Hilfe.
Benutzeravatar
125
Beiträge: 1322
Registriert: 19.09.2004 16:52
Wohnort: Neu Wulmstorf (Hamburg)
Kontaktdaten:

Beitrag von 125 »

jap,
Es du hast beim Listicongadget das Flag PB_ListIcon_AlwaysShowSelection nicht angegeben. ich dachte deshalb du willst es nur kurz anzeigen lassen (nur wenn das Gadget den Focus hat was ich mit der Message gemacht habe) hier ist es ohne Api mit grauer makierung auch wenn das Gadget unselektiert ist:

Code: Alles auswählen

OpenWindow( 0, 50, 50, 410, 600, #PB_Window_SystemMenu, "TEST" ) 
CreateGadgetList( WindowID( 0  ) ) 
ListIconGadget(  1, 5, 5, 400 ,590, "Spalte 1", 198,#PB_ListIcon_AlwaysShowSelection) 
AddGadgetColumn( 1, 1,              "Spalte 2", 198 ) 

For x = 1 To 20 
  AddGadgetItem( 1, -1, "Zeile " + Str( x ) + Chr( 10 ) + Str( x * Random( 100 ) ) ) 
Next x 

SetGadgetItemState( 1, 3, #PB_ListIcon_Selected ) 

Repeat 
Until WaitWindowEvent() = #PB_EventCloseWindow
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag von Danilo »

Hugo hat geschrieben:Ich frage mich aber, ob das so gewollt ist, dass man mit API's arbeiten muss.
Man kann auch ActivateGadget() nutzen.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Hugo
Beiträge: 56
Registriert: 30.03.2005 12:07
Wohnort: Nähe München

Beitrag von Hugo »

genial, mit ,#PB_ListIcon_AlwaysShowSelection geht's genau wie ich es wollte!

Danke nochmals!
Hugo
Beiträge: 56
Registriert: 30.03.2005 12:07
Wohnort: Nähe München

Beitrag von Hugo »

Nun habe ich ein Folgeproblem.

Wenn die Liste mehr Einträge hat als angezeigt werden können und ein Eintrag ausgewählt wird der in diesem nicht sichtbaren Bereich ist, wie schaffe ich es, dass die Liste nach oben bzw. unten gescrollt wird um den ausgewählten Eintrag anzuzeigen?
Benutzeravatar
125
Beiträge: 1322
Registriert: 19.09.2004 16:52
Wohnort: Neu Wulmstorf (Hamburg)
Kontaktdaten:

Beitrag von 125 »

Code: Alles auswählen

OpenWindow( 0, 50, 50, 410, 600, #PB_Window_SystemMenu, "TEST" ) 
CreateGadgetList( WindowID( 0  ) ) 
ListIconGadget(  1, 5, 5, 400 ,590, "Spalte 1", 198,#PB_ListIcon_AlwaysShowSelection) 
AddGadgetColumn( 1, 1,              "Spalte 2", 198 ) 
Procedure ListIconChoose(Gadget,Eintrag.l) 
SendMessage_(GadgetID(Gadget),#LVM_GETITEMRECT,0,r.Rect) 
SendMessage_(GadgetID(Gadget),#LVM_SCROLL,0,((r\bottom - r\top)*(Eintrag-1))) 
SetGadgetState(Gadget,Eintrag-1) 
EndProcedure

For x = 1 To 989 
  AddGadgetItem( 1, -1, "Zeile " + Str( x ) + Chr( 10 ) + Str( x * Random( 100 ) ) ) 
Next x 

ListIconChoose(1,899)
Repeat 

Until WaitWindowEvent() = #PB_EventCloseWindow

:D
Hugo
Beiträge: 56
Registriert: 30.03.2005 12:07
Wohnort: Nähe München

Beitrag von Hugo »

nicht schlecht!

Nur sieht es so aus, als ob es nur einmal geht. Sobald ich die Prozedur ein zweitesmal aufrufe, wird nicht mehr gescrollt.

Hier das Beispiel:

Code: Alles auswählen

OpenWindow( 0, 50, 50, 410, 600, #PB_Window_SystemMenu, "TEST" ) 
CreateGadgetList( WindowID( 0  ) ) 
ListIconGadget(  1, 5, 5, 400 ,550, "Spalte 1", 198,#PB_ListIcon_AlwaysShowSelection) 
AddGadgetColumn( 1, 1,              "Spalte 2", 198 )
 
ButtonGadget( 2, 150, 570, 100, 20, "nächstes")


Procedure ListIconChoose(Gadget,Eintrag.l) 
  SendMessage_(GadgetID(Gadget),#LVM_GETITEMRECT,0,r.RECT) 
  SendMessage_(GadgetID(Gadget),#LVM_SCROLL,0,((r\bottom - r\top)*(Eintrag-1))) 
  SetGadgetState(Gadget,Eintrag-1) 
EndProcedure 


For x = 1 To 989 
  AddGadgetItem( 1, -1, "Zeile " + Str( x ) + Chr( 10 ) + Str( x * Random( 100 ) ) ) 
Next x 

ListIconChoose(1,899) 

Repeat 
  Select WaitWindowEvent()
    Case #PB_EventCloseWindow : End
    Case #PB_Event_Gadget
      If EventGadgetID() = 2
        zeile = Random( 1000 ) : Debug zeile
        ListIconChoose( 1, zeile )
      EndIf
  EndSelect
ForEver

Benutzeravatar
Donald
Beiträge: 307
Registriert: 03.01.2005 02:21
Wohnort: Marl

Beitrag von Donald »

Hugo hat geschrieben:nicht schlecht!
Nur sieht es so aus, als ob es nur einmal geht. Sobald ich die Prozedur ein zweitesmal aufrufe, wird nicht mehr gescrollt.
Dann nimm diesen Source:

Code: Alles auswählen

OpenWindow( 0, 50, 50, 410, 600, #PB_Window_SystemMenu, "TEST" ) 
CreateGadgetList( WindowID( 0  ) ) 
ListIconGadget(  1, 5, 5, 400 ,550, "Spalte 1", 198,#PB_ListIcon_AlwaysShowSelection) 
AddGadgetColumn( 1, 1,              "Spalte 2", 198 ) 
  
ButtonGadget( 2, 150, 570, 100, 20, "nächstes") 

Procedure ListIconChoose(Gadget,Eintrag.l) 
  SendMessage_(GadgetID(Gadget),#LVM_ENSUREVISIBLE,Eintrag,#True) 
  SetGadgetItemState(Gadget, Eintrag, 1)
  ActivateGadget(Gadget)
;  SendMessage_(GadgetID(Gadget),#LVM_GETITEMRECT,0,r.RECT) 
;  SendMessage_(GadgetID(Gadget),#LVM_SCROLL,0,((r\bottom - r\top)*(Eintrag-1))) 
;  SetGadgetState(Gadget,Eintrag-1) 
EndProcedure 


For x = 1 To 989 
  AddGadgetItem( 1, -1, "Zeile " + Str( x ) + Chr( 10 ) + Str( x * Random( 100 ) ) ) 
Next x 

ListIconChoose(1,899) 

Repeat 
  Select WaitWindowEvent() 
    Case #PB_EventCloseWindow : End 
    Case #PB_Event_Gadget 
      If EventGadgetID() = 2 
        zeile = Random( 1000 ) : Debug zeile 
        ListIconChoose( 1, zeile ) 
        
        EndIf 
  EndSelect 
ForEver
DONALD :D www.PureBasic-Donald.de gibt es im Moment nicht mehr
PureBasic - jaPBe - PureVisonXP - TailBite
Antworten