Detection clic listview vide [Super Résolu]

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Detection clic listview vide [Super Résolu]

Message par Kwai chang caine »

Bonjour à tous

Je viens de voir que une listview ne detecte pas un clic si elle est vide :?

Code : Tout sélectionner

If OpenWindow(0,0,0,270,140,"ListViewGadget",#PB_Window_SystemMenu) 

 ListViewGadget(0,10,10,250,120)
 
  Repeat 
   
   Evenement = WaitWindowEvent()
 
   If Evenement = #PB_Event_Gadget
    Debug "Clic"
   EndIf
    
  Until WaitWindowEvent()=#PB_Event_CloseWindow
  
EndIf
Alors j'ai éssayé ça.
ça marche mieux, mais c'est pas le panard :roll:

Code : Tout sélectionner

If OpenWindow(0,0,0,270,140,"ListViewGadget",#PB_Window_SystemMenu) 

ListViewGadget(0,10,10,250,120) 

 Repeat 
  
  Evenement = WaitWindowEvent() 

  If Evenement =#WM_LBUTTONDOWN 
   
   a$ = Space(50) 
   GetClassName_(GadgetID(Gadget), @a$,49)   
 
   If a$ = "ListBox"
    Debug "Clic" 
   EndIf
   
  EndIf 
    
 Until WaitWindowEvent()=#PB_Event_CloseWindow 
  
EndIf
Mais dans mon code parfois ça me retourne "Edit" et parfois "Listbox" 8O
Quinquin a t'il mieux dans sa besace ???? :roll:

Merci de votre aide
Bonne journée
Dernière modification par Kwai chang caine le lun. 12/janv./2009 17:44, modifié 1 fois.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Y a peut-être plus simple mais ça marche

Regardes ton code, il ne faut pas employer WaitWindowEvent() plusieurs fois dans la boucle, sinon on perd des infos.


Dans le code qui suit, j'ai mis 2 listview et je ne sélectionne le clic que pour celle de gauche

Code : Tout sélectionner

Structure QuadPoint
     StructureUnion
          Q.q
          P.Point
     EndStructureUnion
EndStructure 


If OpenWindow(0, 0, 0, 260*2, 140, "ListViewGadget", #PB_Window_SystemMenu)
     
     If ListViewGadget(0, 10, 10, 245, 120) And ListViewGadget(1, GadgetWidth(0)+20, 10, 245, 120)
          
          Repeat
               
               Select WaitWindowEvent()
                         
                    Case #WM_LBUTTONDOWN;, #WM_NCLBUTTONDOWN
                         ;// retrouve la position du curseur en référence écran
                         If GetCursorPos_(@MousePos.QuadPoint)
                              ;// transforme les coordonnées écran en coordonnées relatives au gadget
                              If ScreenToClient_(GadgetID(0), @MousePos)
                                   ;// teste si le point appartient au gadget, si oui, on affiche 
                                   If ChildWindowFromPoint_(GadgetID(0), MousePos\Q)
                                        a + 1
                                        Debug "Clic" + Str(a)
                                   EndIf
                              EndIf
                         EndIf
                         
                    Case #PB_Event_CloseWindow
                         quit + 1 
               EndSelect
               
          Until quit 
          
     EndIf
EndIf
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Message par gnozal »

Un p'tit subclassing ?

Code : Tout sélectionner

Procedure MyCallback(hwnd.l, message.l, wParam.l, lParam.l)
  Protected OldCallback.l, ReturnValue.l
  OldCallback = GetProp_(hwnd, "OldCallback")
  If OldCallback
    ReturnValue = CallWindowProc_(OldCallback, hwnd, message, wParam, lParam)
    Select message
      Case #WM_LBUTTONDOWN
        
        Debug "LBUTTONDOWN dans le gadget " + Str( GetDlgCtrlID_(hwnd))
        
      Case #WM_NCDESTROY
        RemoveProp_(hwnd, "OldCallback")
    EndSelect
  EndIf
  ProcedureReturn ReturnValue
EndProcedure


If OpenWindow(0,0,0,270,140,"ListViewGadget",#PB_Window_SystemMenu) 
  
  ListViewGadget(1,10,10,250,120) 
  SetProp_(GadgetID(1), "OldCallback", SetWindowLongPtr_(GadgetID(1), #GWLP_WNDPROC, @MyCallback()))
  
  Repeat 
    
    Evenement = WaitWindowEvent() 
    
    
  Until WaitWindowEvent()=#PB_Event_CloseWindow 
  
EndIf
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Merci beaucoup DENIS de ta reponse rapide 8)

En plus c'est trop de la balle, car cette fois, j'ai l'impression que ton code reconnait l'element cliqué sans me mettre ce satané PIAF.....enfin j'veux dire "Edit" :D
J'sais pas d'ou qu'il reviens ce Edit ??

Code : Tout sélectionner

Structure QuadPoint 
     StructureUnion 
          Q.q 
          P.Point 
     EndStructureUnion 
EndStructure 


If OpenWindow(0, 0, 0, 260*2, 140, "ListViewGadget", #PB_Window_SystemMenu) 
      
     If ListViewGadget(0, 10, 10, 245, 120) And ListViewGadget(1, GadgetWidth(0)+20, 10, 245, 120) 
          
          Repeat 
                
               Select WaitWindowEvent() 
                          
                    Case #WM_LBUTTONDOWN;, #WM_NCLBUTTONDOWN 
                         ;// retrouve la position du curseur en référence écran 
                         If GetCursorPos_(@MousePos.QuadPoint) 
                              ;// transforme les coordonnées écran en coordonnées relatives au gadget 
                              If ScreenToClient_(GadgetID(0), @MousePos) 
                                   ;// teste si le point appartient au gadget, si oui, on affiche 
                                   If ChildWindowFromPoint_(GadgetID(0), MousePos\Q) 
                                         a$ = Space(50) 
                                        GetClassName_(GadgetID(Gadget), @a$,49)  
                                        a + 1 
                                        Debug "Clic" + Str(a) + " = " + a$
                                   EndIf 
                              EndIf 
                         EndIf 
                          
                    Case #PB_Event_CloseWindow 
                         quit + 1 
               EndSelect 
                
          Until quit 
          
     EndIf 
EndIf
Mille merci
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Bonjour mon bon GNOZAL
Excuse moi, j'avais pas vu ton POST :oops:
On a posté ensemble

ça marche aussi trop bien le tiens aussi
Merci beaucoup egalement pour ta rapidité, grace à vous deux KCC il a meme pas eu le temps de boire la tasse :D

Mais ç'est quand meme pas un bug cette histoire :?

C'est pas normal, qu'il repere tous les gadgets sauf celui la :roll:

Quinquin sait pourquoi j'obtenais des EDIT ou STATIC et parfois des LISTBOX ???
Parce que en attendant, je fouinais et je suis tombé sur ce super code de NETMAESTRO, et lui aussi y donne pas toujours le meme resultat pour le meme type de gadget, des fois LISTBOX il est en parent, des fois non 8O

http://www.purebasic.fr/english/viewtop ... ac9#224060

Drolement compliqué pour la tete à KCC :oops:

Il est fou ce code.....j'ai hésité à le passer sur le raccourci de ma banque....j'ai eu peur qu'il me donne mon code secret de carte bleue :lol:
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Message par gnozal »

Kwai chang caine a écrit :Quinquin sait pourquoi j'obtenais des EDIT ou STATIC et parfois des LISTBOX ???
Avec le code ci-dessous ?

Code : Tout sélectionner

If OpenWindow(0,0,0,270,140,"ListViewGadget",#PB_Window_SystemMenu) 
  
  ListViewGadget(0,10,10,250,120) 
  
  Repeat 
    
    Evenement = WaitWindowEvent() 
    
    If Evenement =#WM_LBUTTONDOWN 
      
      a$ = Space(50) 
      GetClassName_(GadgetID(0), @a$,49)    
      
      Debug a$
      
      If a$ = "ListBox" 
        Debug "Clic" 
      EndIf 
      
    EndIf 
    
  Until Evenement=#PB_Event_CloseWindow 
  
EndIf
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Bah ecoute........j'comprend fifre :oops:
J'te jure sur la tete de moi-meme que a un moment, j'avais des retour "EDIT" et "STATIC" mais j'arrive pas à retrouver ou :oops:

KCC quand y cherche, il est comme les puces, y saute de chien en chien.
Et des fois y retrouve plus sur quel yorkshire, il a fait une connerie :?

Si je retrouve, je donnerais l'exemple sur ce POST.

Une question qui me taraude.....un subclassing c'est pareil qu'un callback ??
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Chaque ligne étant éditable, c'est possible d'avoir un EDIT si la ligne a le focus.

Regardes mon code, j'ai viré le GetClassName_(), pourtant c'est resté moins d'une minute avant que je m'en aperçoive et que je le vire.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

D'accord !!!! Alors Edit ça voudrait dire qu'il a le focus et qu'il est actuellement EDITABLE :D
Donc il pourrait etre LISTBOX ou EDITABLE selon si il a le focus, je crois que je comprend mieux

En fait, j'ai encore un petit probleme.
J'ai voulu faire simple pour vous donner l'exemple, mais en fait mes Gadgets sont dynamiques.
Et j'ai du mal a adapter ton code, ou bien celui de GNOZAL.
Il faut cliquer plusieurs fois pour que ça marche et parfois ça plante et j'ai pas encore compris pourquoi

Ce que j'essaye de faire, c'est que quand je clic sur un listview ET SEULEMENT sur un listview qui sont a chaque champs a gauche dans l'angle, ça ouvre un petit popup avec des choix que je peux ajouter dedans en le selectionnant.
Si je decommente la ligne 48, ça marche au bout de 2 clics, sinon on reviens a mon probleme du debut :cry:

Code : Tout sélectionner

Enumeration
 #Form
 #FormPopUp
 #GadgetArea
 #ListPopUp
EndEnumeration

Global Dim IdCellule(100) 
Global Dim IdTexteTitre(100) 
Global Dim IdListeFormat(100) 

Structure QuadPoint ; Detection clic sur ListViewGadget vide
 StructureUnion 
  Q.q 
  P.Point 
 EndStructureUnion 
EndStructure 

Procedure EditerFichier()
 
 Hauteur = 20
 RazLongueurCellule = 400
 RazLongueurListeFormat = 90
 
 LongueurCellule = RazLongueurCellule
 LongueurListeFormat = RazLongueurListeFormat
 
 InterLig = 10
 InterCol = 10
 X = 10
 Y = 10
 ControleY = Y 
 
 IdRef = 0    
 ControleX = X 
   
 Repeat
           
  IdRef + 1 
  IdCellule(IdRef) = StringGadget(#PB_Any, ControleX + LargeurCheck + 5, ControleY, LongueurCellule, Hauteur, "")
  IdListeFormat(IdRef) = ListViewGadget(#PB_Any, ControleX + LargeurCheck + 5, ControleY + Hauteur, LongueurListeFormat, Hauteur)
  IdTexteTitre(IdRef) = ComboBoxGadget(#PB_Any, ControleX + LongueurListeFormat + LargeurCheck + 5, ControleY + Hauteur, LongueurCellule - LongueurListeFormat, Hauteur, #PB_ComboBox_Editable)
  ResizeGadget(IdCellule(IdRef), #PB_Ignore, #PB_Ignore, LongueurCellule, #PB_Ignore)
  ControleX + LongueurCellule + InterCol 
  ;AddGadgetItem(IdListeFormat(IdRef), - 1, "")
    
 Until IdRef = 5
  
 ControleY + (Hauteur * 2) + InterLig 
    
EndProcedure

Procedure PopUpFormat(Gadget)

 a$ = Space(50) 
 GetClassName_(GadgetID(Gadget), @a$,49)   
Debug a$
 If Not a$ = "ListBox"
  ProcedureReturn
 EndIf
  
 OpenWindow(#FormPopUp, DesktopMouseX(), DesktopMouseY(), 100, 100, "", #PB_Window_BorderLess)
 ListViewGadget(#ListPopUp, 0, 0, WindowWidth(#FormPopUp), WindowHeight(#FormPopUp))
 StickyWindow(#FormPopUp, 1)
 p = 0
 
 Repeat
  p + 1
  AddGadgetItem(#ListPopUp, - 1, Str(p))
 Until p = 6
 
 Repeat 

  Evenement = WaitWindowEvent()
  
  Select Evenement 
   
   Case #PB_Event_Gadget 
   
    If EventGadget() = #ListPopUp
    
     ChoixMenu$ = GetGadgetItemText(#ListPopUp, GetGadgetState(#ListPopUp), 0)
     AddGadgetItem(Gadget, - 1, ChoixMenu$)
     Break
    
    EndIf
   
   Case #WM_MOUSEMOVE
    
    If DesktopMouseX() < WindowX(#FormPopUp) - 20 Or DesktopMouseY() < WindowY(#FormPopUp) - 20 Or DesktopMouseX() > WindowX(#FormPopUp) + WindowWidth(#FormPopUp) + 20 Or DesktopMouseY() > WindowY(#FormPopUp) + WindowHeight(#FormPopUp) + 20
     Break
    EndIf
    
  EndSelect
  
 ForEver 
 
 CloseWindow(#FormPopUp)
 
EndProcedure

OpenWindow(#Form, 0, 0, 800, 600, "", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered|#PB_Window_SizeGadget) 
ScrollAreaGadget(#GadgetArea, 5, 30, WindowWidth(PbIdFenetre) - 10, WindowHeight(PbIdFenetre) - 60, WindowWidth(PbIdFenetre) * 4, WindowHeight(PbIdFenetre) * 4,  #PB_ScrollArea_Raised)
SetGadgetColor(#GadgetArea, #PB_Gadget_BackColor, RGB(255, 0, 0))
EditerFichier()
CloseGadgetList() 

Repeat 

 Evenement = WaitWindowEvent()
 
 Select Evenement
 
  Case #WM_LBUTTONDOWN
    
    Gadget = EventGadget()
    
    If Gadget 
     If GetCursorPos_(@MousePos.QuadPoint) And ScreenToClient_(GadgetID(Gadget), @MousePos) 
               
      If ChildWindowFromPoint_(GadgetID(Gadget), MousePos\Q) 
       PopUpFormat(Gadget)
     EndIf 
    EndIf
          
   EndIf 
 
 EndSelect
 
Until Evenement = #PB_Event_CloseWindow 

End
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Message par gnozal »

Comme çà ?

Code : Tout sélectionner

Enumeration 
  #Form 
  #FormPopUp 
  #GadgetArea 
  #ListPopUp 
EndEnumeration 

Global Dim IdCellule(100) 
Global Dim IdTexteTitre(100) 
Global Dim IdListeFormat(100) 

Global PbIdFenetre 

Structure QuadPoint ; Detection clic sur ListViewGadget vide 
  StructureUnion 
  Q.q 
  P.POINT 
  EndStructureUnion 
EndStructure 


Procedure PopUpFormat(Gadget) 
  
  OpenWindow(#FormPopUp, DesktopMouseX(), DesktopMouseY(), 100, 100, "", #PB_Window_BorderLess) 
  ListViewGadget(#ListPopUp, 0, 0, WindowWidth(#FormPopUp), WindowHeight(#FormPopUp)) 
  StickyWindow(#FormPopUp, 1) 
  P = 0 
  
  Repeat 
    P + 1 
    AddGadgetItem(#ListPopUp, - 1, Str(P)) 
  Until P = 6 
  
  Repeat 
    
    Evenement = WaitWindowEvent() 
    
    Select Evenement 
        
      Case #PB_Event_Gadget 
        
        If EventGadget() = #ListPopUp 
          
          ChoixMenu$ = GetGadgetItemText(#ListPopUp, GetGadgetState(#ListPopUp), 0) 
          AddGadgetItem(Gadget, - 1, ChoixMenu$) 
          Break 
          
        EndIf 
        
      Case #WM_MOUSEMOVE 
        
        If DesktopMouseX() < WindowX(#FormPopUp) - 20 Or DesktopMouseY() < WindowY(#FormPopUp) - 20 Or DesktopMouseX() > WindowX(#FormPopUp) + WindowWidth(#FormPopUp) + 20 Or DesktopMouseY() > WindowY(#FormPopUp) + WindowHeight(#FormPopUp) + 20 
          Break 
        EndIf 
        
    EndSelect 
    
  ForEver 
  
  CloseWindow(#FormPopUp) 
  
EndProcedure 


Procedure MyCallback(hwnd.l, message.l, wParam.l, lParam.l) 
  Protected OldCallback.l, ReturnValue.l 
  OldCallback = GetProp_(hwnd, "OldCallback") 
  If OldCallback 
    ReturnValue = CallWindowProc_(OldCallback, hwnd, message, wParam, lParam) 
    Select message 
      Case #WM_LBUTTONDOWN 
        
         Debug "LBUTTONDOWN dans le gadget " + Str( GetDlgCtrlID_(hwnd)) 
        PopUpFormat(GetDlgCtrlID_(hwnd)) 
        
      Case #WM_NCDESTROY 
        RemoveProp_(hwnd, "OldCallback") 
    EndSelect 
  EndIf 
  ProcedureReturn ReturnValue 
EndProcedure

Procedure EditerFichier() 
  
  Hauteur = 20 
  RazLongueurCellule = 400 
  RazLongueurListeFormat = 90 
  
  LongueurCellule = RazLongueurCellule 
  LongueurListeFormat = RazLongueurListeFormat 
  
  InterLig = 10 
  InterCol = 10 
  X = 10 
  Y = 10 
  ControleY = Y 
  
  IdRef = 0    
  ControleX = X 
  
  Repeat 
    
    IdRef + 1 
    IdCellule(IdRef) = StringGadget(#PB_Any, ControleX + LargeurCheck + 5, ControleY, LongueurCellule, Hauteur, "") 
    IdListeFormat(IdRef) = ListViewGadget(#PB_Any, ControleX + LargeurCheck + 5, ControleY + Hauteur, LongueurListeFormat, Hauteur) 
    SetProp_(GadgetID(IdListeFormat(IdRef)), "OldCallback", SetWindowLongPtr_(GadgetID(IdListeFormat(IdRef)), #GWLP_WNDPROC, @MyCallback()))
    IdTexteTitre(IdRef) = ComboBoxGadget(#PB_Any, ControleX + LongueurListeFormat + LargeurCheck + 5, ControleY + Hauteur, LongueurCellule - LongueurListeFormat, Hauteur, #PB_ComboBox_Editable) 
    ResizeGadget(IdCellule(IdRef), #PB_Ignore, #PB_Ignore, LongueurCellule, #PB_Ignore) 
    ControleX + LongueurCellule + InterCol 
    AddGadgetItem(IdListeFormat(IdRef), - 1, "") 
    
  Until IdRef = 5 
  
  ControleY + (Hauteur * 2) + InterLig 
  
EndProcedure 

OpenWindow(#Form, 0, 0, 800, 600, "", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered|#PB_Window_SizeGadget) 
ScrollAreaGadget(#GadgetArea, 5, 30, WindowWidth(PbIdFenetre) - 10, WindowHeight(PbIdFenetre) - 60, WindowWidth(PbIdFenetre) * 4, WindowHeight(PbIdFenetre) * 4,  #PB_ScrollArea_Raised) 
  SetGadgetColor(#GadgetArea, #PB_Gadget_BackColor, RGB(255, 0, 0)) 
  EditerFichier() 
CloseGadgetList() 

Repeat 
  
  Evenement = WaitWindowEvent() 
  
Until Evenement = #PB_Event_CloseWindow 

End
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

C'est exactement comme ça , Oouuuiiinnn 3 heures que je cherche !!! 8O

VOUS COMMENCEZ A ENNERVER KCC !!! :?

KCC y veut aussi que en trois coup de clavier, ça marche :lol: :lol:
Heureusement qu'on ecrit plus avec un stylo plume, parce que j'aurais ma feuille et mes doigts plein d'encre, depuis le temps que j'ecris et reecris :oops:

Mais pourquoi mes parents ont pas commandé l'option cerveau :?
C'etait un peu plus cher, mais ça m'aurait drolement servit

Mille millions de sabord de merci GNOZAL. 8)

Au fait, y'a une difference entre le subclassing et les callback ou c'est la meme soupe, avec pas la meme boite ??? :roll:
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Message par gnozal »

Kwai chang caine a écrit :Au fait, y'a une difference entre le subclassing et les callback ou c'est la meme soupe, avec pas la meme boite ??? :roll:
C'est le même genre que le callback de PB pour les fenêtres, mais pour un gadget.
Quand tu sousclasse un gadget, tu as accès à tous les évènements, y compris ceux que PB ne transmet pas.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

D'accord, donc j'imprime (Enfin j'essaie) Vrrrrr Vrrrrr

Les callbacks c'est pour les fenetres :D
Le sousclassing c'est pour les gadgets :D

Merci pour ta gentillesse ainsi que celle de DENIS.
Avec vous KCC il est comme "MOISI" ....enfin j'veux dire MOISE ....y peut faire s'ouvrir la mer :D

Mais alors si j'ai bien compris, ça reviens au meme de faire des callbacks et sousclassement que de faire la boucle de gestion d'evenement WaitWindowEvent() :roll:
C'est juste que c'est réservé aux gens comme toi, car c'est plus délicat, mais autrement on pourrait tout gérer comme ça, sans que le programme soit plus instable ou bien c'est mieux d'éviter ????
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

C'est un peu comme moi, le jour de la distribution de la connerie, je suis venu au rab... :D
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

C'est un peu comme moi, le jour de la distribution de la connerie, je suis venu au rab...
:lol: :lol:

Ouaih, mais ce que tu sais pas, c'est que j'm'etais déjà gavé avant, et j'sais meme pas si j'ai pas fait trois fois la queue ce jour la :roll:

Et en y reflechissant, je crois bien que j'ai encore un tupperware au congel qui traine, des fois qu'a votre contact ça me passe :lol:
Répondre