Page 1 sur 1

[RESOLU] sélection d'une colonne (ListIconGadget)

Publié : ven. 11/août/2017 14:12
par omega
Bonjour à tous

Comment savoir si une colonne d'une ListIconGadget a été sélectionnée?
(Je croyais que la valeur -1 était réservée pour les colonnes mais je constate que ce n'est pas le cas malheureusement)
Attention, il s'agit d'une ancienne version de Pb (4.2), le programme est volumineux et compliqué (je n'ai pas envie d'émigrer cette version)

Merci

Re: sélection d'une colonne (ListIconGadget)

Publié : ven. 11/août/2017 15:33
par microdevweb
Bonjour,

Code : Tout sélectionner

If  GetGadgetItemState(IdList,Position) & #PB_ListIcon_Selected

Re: sélection d'une colonne (ListIconGadget)

Publié : ven. 11/août/2017 17:19
par omega
Non, j'ai déjà vu cette instuction:

Code : Tout sélectionner

If  GetGadgetItemState(IdList,Position) & #PB_ListIcon_Selected
Ceci concerne les lignes et non pas les colonnes

Merci quand même

Re: sélection d'une colonne (ListIconGadget)

Publié : ven. 11/août/2017 18:00
par microdevweb
Oui c'est vrai je ne pense pas qu'il existe une commande pour cette action, par-contre voici une procédure qui pourrait le faire

Code : Tout sélectionner

Procedure myEvent()
  Protected x=WindowMouseX(0)
  Protected i,x1=GadgetX(0),x2=x1
  For i=1 To 5
    x2+GadgetX(0)+GetGadgetItemAttribute(0,i,#PB_ListIcon_ColumnWidth)
    If x>=x1 And x<=x2
      Debug "You're on column "+Str(i)
      Break
    EndIf
    x1=x2
  Next
EndProcedure

; Open window
OpenWindow(0,0,0,800,600,"Test",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
ListIconGadget(0,0,0,800,600,"Column_1",100,#PB_ListIcon_FullRowSelect)
; add few columns
For i=2 To 5
  AddGadgetColumn(0,i,"Column_"+Str(i),100)
Next
; add few records
For i=1 To 10
  text.s="Record A_"+Str(i)+Chr(10)+
         "Record B_"+Str(i)+Chr(10)+
         "Record C_"+Str(i)+Chr(10)+
         "Record D_"+Str(i)+Chr(10)+
         "Record E_"+Str(i)+Chr(10)+
  AddGadgetItem(0,-1,text)
Next
; set callbacks
BindGadgetEvent(0,@myEvent())

; Main loop
Repeat
  WaitWindowEvent()
Until Event()=#PB_Event_CloseWindow 

Re: sélection d'une colonne (ListIconGadget)

Publié : ven. 11/août/2017 20:34
par omega
J'ai testé ce code mais je reçois un message d'erreur au niveau de cette commande:

Code : Tout sélectionner

BindGadgetEvent(0,@myEvent())
C'est peut être lié à mon ancienne version de Pb ?

Re: sélection d'une colonne (ListIconGadget)

Publié : ven. 11/août/2017 23:12
par Ar-S
Oui il est allé trop vite.
Oublie les callback via bindevent en 4.xx

Re: sélection d'une colonne (ListIconGadget)

Publié : sam. 12/août/2017 7:23
par microdevweb
Bonjour je n'ai pas installer Pb 4.2, mais j'ai modifié le code qui devrait fonctionné avec

Code : Tout sélectionner

Procedure myEvent()
  Protected x=WindowMouseX(0)
  Protected i,x1=GadgetX(0),x2=x1
  For i=1 To 5
    x2+GadgetX(0)+GetGadgetItemAttribute(0,i,#PB_ListIcon_ColumnWidth)
    If x>=x1 And x<=x2
      Debug "You're on column "+Str(i)
      Break
    EndIf
    x1=x2
  Next
EndProcedure

; Open window
OpenWindow(0,0,0,800,600,"Test",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
ListIconGadget(0,0,0,800,600,"Column_1",100,#PB_ListIcon_FullRowSelect)
; add few columns
For i=2 To 5
  AddGadgetColumn(0,i,"Column_"+Str(i),100)
Next
; add few records
For i=1 To 10
  text.s="Record A_"+Str(i)+Chr(10)+
         "Record B_"+Str(i)+Chr(10)+
         "Record C_"+Str(i)+Chr(10)+
         "Record D_"+Str(i)+Chr(10)+
         "Record E_"+Str(i)+Chr(10)+
  AddGadgetItem(0,-1,text)
Next

Global gEvent

; Main loop
Repeat
  gEvent=WaitWindowEvent()
  Select gEvent
    Case #PB_Event_Gadget
      myEvent()
  EndSelect
Until gEvent=#PB_Event_CloseWindow 

Re: sélection d'une colonne (ListIconGadget)

Publié : sam. 12/août/2017 10:42
par Marc56
(Précision pour les débutants qui pourraient lire ce topic)

Le principe consiste à comparer la position X de la souris (WindowMouseX()) par rapport à la largeur de chaque colonne GetGadgetItemAttribute(0,i,#PB_ListIcon_ColumnWidth) relative à la position X du gadget GadgetX() dans la fenêtre.

:wink:

Re: sélection d'une colonne (ListIconGadget)

Publié : sam. 12/août/2017 20:37
par omega
Merci beaucoup, ça marche !

Cependant, j'ai 2 petites remarques :

1. La version 4.2 n'accepte pas cette syntaxe:

Code : Tout sélectionner

  text.s="Record A_"+Str(i)+Chr(10)+
            "Record B_"+Str(i)+Chr(10)+
            "Record C_"+Str(i)+Chr(10)+
            "Record D_"+Str(i)+Chr(10)+
            "Record E_"+Str(i)

Je l'ai donc modifiée de cette façon:

Code : Tout sélectionner

  text.s="Record A_"+Str(i)+Chr(10)+"Record B_"+Str(i)+Chr(10)+"Record C_"+Str(i)+Chr(10)+"Record D_"+Str(i)+Chr(10)+"Record E_"+Str(i)


2. J'aurais préféré que la sélection soit détectée au niveau des titres des colonnes (car je dois trier la colonne sélectionnée), le fait
de sélectionner une ligne m'oblige à faire autre chose que le tri (modification ou suppression de l'enregistrement par exemple).

De toute façon, c'est toujours un plus pour moi.

Je vous remercie pour votre aide.

Re: [RESOLU] sélection d'une colonne (ListIconGadget)

Publié : dim. 13/août/2017 7:56
par Marc56
J'aurais préféré que la sélection soit détectée au niveau des titres des colonnes
Tu ne peux pas cliquer sur l'entête de colonne, mais tu peux utiliser -1 avec GetGadgetItemText() pour avoir le titre de la colonne.
GetGadgetItemText(<Listicon>, -1, <numéro de la colonne>))

Re: [RESOLU] sélection d'une colonne (ListIconGadget)

Publié : dim. 13/août/2017 20:58
par omega

Code : Tout sélectionner

GetGadgetItemState()
cette instruction donne le texte de l'élément sélectionné (élément = ligne et non pas la colonne)
J'ai déjà testé cette instruction qui ne donne rien.

Merci quand même

Re: [RESOLU] sélection d'une colonne (ListIconGadget)

Publié : dim. 13/août/2017 21:19
par omega
RECTIFICATIF : L'instruction GetGatgetItemText donne en effet le texte de la colonne spécifiée

Code : Tout sélectionner

GetGatgetItemText(#Listicon,-1,wcol)
Ce que je veux, c'est savoir QUELLE EST LA COLONNE qui a été sélectionnée.
Dans cet exemple, la colonne est une donnée connue (il faut obligatoirement la spécifier), alors que celle que je cherche est inconnue.
J'ai essayé

Code : Tout sélectionner

GetGatgetItemState(#Listicon,ligne)
pour ligne=-1
malheureusement, ce cas n'est pas détecté par EventGadget()

Re: [RESOLU] sélection d'une colonne (ListIconGadget)

Publié : dim. 13/août/2017 22:46
par falsam
Ce que je veux, c'est savoir QUELLE EST LA COLONNE qui a été sélectionnée.
En natif avec PureBasic ce n'est pas possible.

■ Tu vas devoir associer un callback qui va analyser les actions sur ton ListIconGadget.

Ce callback va recevoir des messages envoyés par un control de ta fenêtre. Dans ton cas ce control est ta ListIconGadget()

- Les messages sont analysés avec l'API événementielle #WM_NOTIFY .

- Le message est associé à la structure Microsoft NMHDR.
- Le membre hwndFrom de cette structure permettra de connaitre quel est le gadget émetteur du message.
- Le membre code de cette structure permet de connaitre le type d’événement. Par exemple #LVN_COLUMNCLICK

- S'agissant de ton ListIconGadget(), la structure Miscrosoft NMLISTVIEW sera associé à ce gadget.
- Le membre iSubItem de cette structure permet de connaitre la colonne sélectionnée.

:idea: Il est inutile de déclarer ces structures : C'est inclus dans PureBasic.

■ Le code de test.

Code : Tout sélectionner

EnableExplicit

Enumeration window
  #mf
EndEnumeration

Enumeration gadget
  #ListIcon  
EndEnumeration

Procedure Callback(Window.l, Message.l, wParam.l, lParam.l)
  Protected result = #PB_ProcessPureBasicEvents, Column
  
  Protected *pnmh.NMHDR       ; Le messages receptionné est associé à la structure Microsoft NMHDR
  Protected *pnmv.NMLISTVIEW  ; la structure Miscrosoft NMLISTVIEW est associé au ListIconGadget
  
  Select Message
    Case #WM_NOTIFY ; Reception d'un message
      *pnmh = lParam ; Le message est envoyé au pointeur de la structure NMHDR
      
      ;Le membre hwndFrom permet de connaitre quel est le gadget émetteur du message
      If *pnmh\hwndFrom = GadgetID(#ListIcon)
        ;Le membre code de cette structure permet de connaitre le type d’événement
        Select *pnmh\code  
          Case #LVN_COLUMNCLICK 
            ;L'information est envoyé au poineur de la structure NMLISTVIEW
            *pnmv = lParam ;
            
            ;Le membre iSubItem permet de connaitre la colonne sélectionnée.
            Column = *pnmv\iSubItem 
            
            MessageRequester("Information", "Clicked on Column "+Str(Column),0)         
        EndSelect 
      EndIf 
  EndSelect
  
  ProcedureReturn result
EndProcedure

If OpenWindow(#mf, 0, 0, 800, 600, "ListiconGadget : Quel est la colonne sélectionnée ?", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)  
  ListIconGadget(#ListIcon, 10, 10, 780, 550, "Column0", 100, #PB_ListIcon_FullRowSelect )
  
  AddGadgetColumn(#ListIcon, 1, "Column1", 200)
  AddGadgetColumn(#ListIcon, 2, "Column2", 200)
  AddGadgetColumn(#ListIcon, 3, "Column3", 200)
    
  AddGadgetItem(#ListIcon, 0, "Row0" +Chr(10) + "XXX" + Chr(10)+ "XXX" + Chr(10)+ "XXX")
  AddGadgetItem(#ListIcon, 1, "Row1" +Chr(10) + "XXX" + Chr(10)+ "XXX" + Chr(10)+ "XXX")
  AddGadgetItem(#ListIcon, 2, "Row2" +Chr(10) + "XXX" + Chr(10)+ "XXX" + Chr(10)+ "XXX")
  AddGadgetItem(#ListIcon, 3, "Row3" +Chr(10) + "XXX" + Chr(10)+ "XXX" + Chr(10)+ "XXX")
  
  SetWindowCallback(@Callback())
  
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
■ Références (En anlais)
NMHDR structure : https://msdn.microsoft.com/fr-fr/librar ... s.85).aspx
NMLISTVIEW structure : https://msdn.microsoft.com/fr-fr/librar ... s.85).aspx

Re: [RESOLU] sélection d'une colonne (ListIconGadget)

Publié : dim. 13/août/2017 23:05
par omega
@falsam

C'est exactement ce que je cherche !

Merci beaucoup Falsam ! ça marche.