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

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
omega
Messages : 633
Inscription : sam. 26/nov./2011 13:04
Localisation : Alger

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

Message 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
Dernière modification par omega le sam. 12/août/2017 20:39, modifié 1 fois.
Win7 (x64) 64 bits Pb 5.72
Avatar de l’utilisateur
microdevweb
Messages : 1802
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

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

Message par microdevweb »

Bonjour,

Code : Tout sélectionner

If  GetGadgetItemState(IdList,Position) & #PB_ListIcon_Selected
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
omega
Messages : 633
Inscription : sam. 26/nov./2011 13:04
Localisation : Alger

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

Message 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
Win7 (x64) 64 bits Pb 5.72
Avatar de l’utilisateur
microdevweb
Messages : 1802
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

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

Message 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 
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
omega
Messages : 633
Inscription : sam. 26/nov./2011 13:04
Localisation : Alger

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

Message 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 ?
Win7 (x64) 64 bits Pb 5.72
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

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

Message par Ar-S »

Oui il est allé trop vite.
Oublie les callback via bindevent en 4.xx
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
microdevweb
Messages : 1802
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

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

Message 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 
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

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

Message 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:
Avatar de l’utilisateur
omega
Messages : 633
Inscription : sam. 26/nov./2011 13:04
Localisation : Alger

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

Message 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.
Win7 (x64) 64 bits Pb 5.72
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

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

Message 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>))
Avatar de l’utilisateur
omega
Messages : 633
Inscription : sam. 26/nov./2011 13:04
Localisation : Alger

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

Message 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
Win7 (x64) 64 bits Pb 5.72
Avatar de l’utilisateur
omega
Messages : 633
Inscription : sam. 26/nov./2011 13:04
Localisation : Alger

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

Message 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()
Win7 (x64) 64 bits Pb 5.72
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

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

Message 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
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
omega
Messages : 633
Inscription : sam. 26/nov./2011 13:04
Localisation : Alger

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

Message par omega »

@falsam

C'est exactement ce que je cherche !

Merci beaucoup Falsam ! ça marche.
Win7 (x64) 64 bits Pb 5.72
Répondre