[Résolu] Validation ListIcon

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

[Résolu] Validation ListIcon

Message par Micoute »

Bonjour à tous,

Je me suis programmé un petit annuaire familial et j'aimerais savoir s'il est possible quand une ligne du ListIconGadget est sélectionnée de valider avec la touche Entrée ou la barre espace ?

J'attend vos réponses avec impatience et je vous en remercie d'avance.

Code : Tout sélectionner

;Liste téléphonique

Enumeration Fenetre
  #Fenetre_principale
EndEnumeration

Enumeration Gadgets
  #Btn_Nouveau
  #Btn_Supprimer
  #Btn_MAJ
  #Txt_Prenom
  #Txt_Nom
  #Txt_Adresse
  #Txt_CP
  #Txt_Ville
  #Txt_Mobile
  #Txt_Fixe
  #Str_Prenom
  #Str_Nom
  #Str_Adresse
  #Str_CP
  #Str_Ville
  #Str_Mobile
  #Str_Fixe
  #BDD
  #Liste
EndEnumeration

Structure sPersonne
  Nom.s ; Nom de la personne
  Prenom.s ; Prénom de la personne
  Adresse.s ; Adresse de la personne
  CP.s ; Code postal
  Ville.s ; Ville
  Mobile.s ; numéro de téléphone mobile
  Fixe.s ; numéro de téléphone fixe
EndStructure

Global NewList Personne.sPersonne()

UseSQLiteDatabase()

Resultat = OpenDatabase(#BDD, "D:\Programmation\Prg Perso\B\Base de donnees\Annuaire\Annuaire.SQLite", "", "", #PB_Database_SQLite)
If Resultat 
  If DatabaseQuery(#BDD, "SELECT * FROM Annuaire")
    While NextDatabaseRow(#BDD)
      AddElement(Personne())  
      Personne()\Nom       = UCase(GetDatabaseString(#BDD, 0))
      Personne()\Prenom    = UCase(GetDatabaseString(#BDD, 1))
      Personne()\Adresse   = GetDatabaseString(#BDD, 2)
      Personne()\CP        = GetDatabaseString(#BDD, 3)
      Personne()\Ville     = GetDatabaseString(#BDD, 4)
      Personne()\Mobile    = GetDatabaseString(#BDD, 5)
      Personne()\Fixe      = GetDatabaseString(#BDD, 6)
    Wend
    FinishDatabaseQuery(#BDD)
  EndIf
EndIf  

Procedure RemplirListe()
  
  ClearGadgetItems(#Liste)
  
  ForEach Personne()
    AddGadgetItem(#Liste, -1, Personne()\Prenom + #LF$ + Personne()\Nom )
    SetGadgetItemData(#Liste, CountGadgetItems(#Liste) - 1, ListIndex(Personne()))
  Next
  
EndProcedure

Procedure Evenement_Liste()
  
  Protected ElementSelectionne = GetGadgetState(#Liste)
  
  If ElementSelectionne = -1
    
    SetGadgetText(#Str_Prenom, "")
    SetGadgetText(#Str_Nom,    "")
    SetGadgetText(#Str_Adresse,"")
    SetGadgetText(#Str_CP,     "")
    SetGadgetText(#Str_Ville,  "")
    SetGadgetText(#Str_Mobile, "")
    SetGadgetText(#Str_Fixe,   "")
    
    ProcedureReturn
    
  EndIf
  
  Protected IndexSelectionne = GetGadgetItemData(#Liste, ElementSelectionne)
  
  SelectElement(Personne(), IndexSelectionne)
  
  SetGadgetText(#Str_Prenom, UCase(Left(Personne()\Prenom,1))+LCase(Right(Personne()\Prenom,Len(Personne()\Prenom)-1)))
  SetGadgetText(#Str_Nom,    Personne()\Nom)
  SetGadgetText(#Str_Adresse,Personne()\Adresse)
  SetGadgetText(#Str_CP,     Personne()\CP)
  SetGadgetText(#Str_Ville,  Personne()\Ville)
  SetGadgetText(#Str_Mobile, Personne()\Mobile)
  SetGadgetText(#Str_Fixe,   Personne()\Fixe)
  
EndProcedure

Procedure Evenement_Btn_Nouveau()
  
  LastElement(Personne())
  AddElement(Personne())
  Personne()\Prenom = "Inconnu"
  Personne()\Nom    = "Inconnu"
  Personne()\Adresse = "Inconnue"
  Personne()\CP = "Inconnu"
  Personne()\Ville = "Inconnue"
  Personne()\Mobile = "Inconnu"
  Personne()\Fixe = "Inconnu"
  
  RemplirListe()
  
  SetGadgetState(#Liste, ListSize(Personne()) - 1)
  
  Evenement_Liste()
  
EndProcedure

Procedure Evenement_Btn_MAJ()
  
  Protected IndexSelectionne = ListIndex(Personne())
  
  Personne()\Prenom = GetGadgetText(#Str_Prenom)
  Personne()\Nom = GetGadgetText(#Str_Nom)
  Personne()\Adresse = GetGadgetText(#Str_Adresse)
  Personne()\CP = GetGadgetText(#Str_CP)
  Personne()\Ville = GetGadgetText(#Str_Ville)
  Personne()\Mobile = GetGadgetText(#Str_Mobile)
  Personne()\Fixe = GetGadgetText(#Str_Fixe)
  
  RemplirListe()
  
  SetGadgetState(#Liste, IndexSelectionne)
  
EndProcedure

Procedure Evenement_Btn_Supprimer()
  
  If ListSize(Personne()) = 0
    
    SetGadgetText(#Str_Prenom, "")
    SetGadgetText(#Str_Nom,    "")
    SetGadgetText(#Str_Adresse, "")
    SetGadgetText(#Str_CP, "")
    SetGadgetText(#Str_Ville, "")
    SetGadgetText(#Str_Mobile, "")
    SetGadgetText(#Str_Fixe, "")
    
    ProcedureReturn
    
  EndIf
  
  Protected IndexSelectionne = ListIndex(Personne())
  
  DeleteElement(Personne())
  
  RemplirListe()
  
  SetGadgetState(#Liste, IndexSelectionne)
  
  Evenement_Liste()
  
EndProcedure



Procedure Ouvrir_Fenetre_principale()  
  If OpenWindow(#Fenetre_principale, 0, 0, 520, 400, "Liste téléphonique avec Base de données", 
                #PB_Window_SystemMenu|#PB_Window_TitleBar|#PB_Window_ScreenCentered)
    ButtonGadget(#Btn_Nouveau, 10, 10, 105, 24, "Nouveau")
    ButtonGadget(#Btn_Supprimer, 120, 10, 105, 24, "Supprimer")
    ListIconGadget(#Liste, 10, 50, 220, 335, "Prénom", 95, 
                   #PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_GridLines|
                   #PB_ListIcon_FullRowSelect)
    AddGadgetColumn(#Liste, 1, "Nom", 95)
    TextGadget(#Txt_Prenom, 240, 75, 60, 24, "Prénom:")
    TextGadget(#Txt_Nom, 240, 50, 60, 24, "Nom:")
    TextGadget(#Txt_Adresse, 240, 100, 60, 24, "Adresse:")
    TextGadget(#Txt_CP, 240, 125, 60, 24, "Code postal:")
    TextGadget(#Txt_Ville, 240, 150, 60, 24, "Ville:")
    TextGadget(#Txt_Mobile, 240, 175, 60, 24, "Mobile:")
    TextGadget(#Txt_Fixe, 240, 200, 60, 24, "Fixe:")
    StringGadget(#Str_Prenom, 310, 75, 185, 24, "")
    StringGadget(#Str_Nom, 310, 50, 185, 24, "")
    StringGadget(#Str_Adresse, 310, 100, 185, 24, "")
    StringGadget(#Str_CP, 310, 125, 80, 24, "")
    StringGadget(#Str_Ville, 310, 150, 185, 24, "")
    StringGadget(#Str_Mobile, 310, 175, 80, 24, "")
    StringGadget(#Str_Fixe, 310, 200, 80, 24, "")
    ;ButtonGadget(#Btn_MAJ, 345, 205, 104, 30, "Mise à jour")
  EndIf
EndProcedure

Ouvrir_Fenetre_principale()

BindGadgetEvent(#Btn_Nouveau, @Evenement_Btn_Nouveau())
;BindGadgetEvent(#Btn_MAJ, @Evenement_Btn_MAJ())
BindGadgetEvent(#Btn_Supprimer, @Evenement_Btn_Supprimer())
BindGadgetEvent(#Liste,  @Evenement_Liste(), #PB_EventType_LeftClick)

RemplirListe()

Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
Dernière modification par Micoute le jeu. 27/nov./2014 9:40, modifié 1 fois.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Validation ListIcon

Message par MLD »

Salut Micoute

J'ai pas bien compris ta question.
Quand tu as selectionné une ligne, quesque tu appels sélectionner, et pour faire quoi??

Remplir les champs a droite de la liste je suppose

il faut te servir de

GetGadgetState(#Gadget)
avec Select EventType() et Case #PB_EventType_LeftClick .Ensuite tu fait une recherche dans ton fichier adresse.
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Validation ListIcon

Message par Micoute »

Bonjour mon cher voisin MLD, ce que j'entend par sélectionné, c'est quand je tape un caractère et que le programme trouve un prénom commençant par ce caractère et que la ligne se colore en bleu !

Les champs sont déjà remplis, car ils sont contenus dans une base données et je veux valider le champ choisi pour afficher les coordonnées de cette personne, bien sûr ça le fait automatiquement en cliquant sur l'élément de la liste, mais je souhaiterais valider soit avec Entrée ou Espace.

Merci beaucoup de ton aide.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Validation ListIcon

Message par falsam »

Micoute a écrit :car ils sont contenus dans une base données
Bonjour Micoute. Utilises tu une base de données SQlite ?
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
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Validation ListIcon

Message par Micoute »

Bonjour falsam, oui j'utilise une base de données SQlite.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: Validation ListIcon

Message par Marc56 »

Hello,

Juste après la ligne:

Code : Tout sélectionner

BindGadgetEvent(#Liste,  @Evenement_Liste(), #PB_EventType_LeftClick)
Ajoutes une autre ligne mais avec: #PB_EventType_Change

Code : Tout sélectionner

BindGadgetEvent(#Liste,  @Evenement_Liste(), #PB_EventType_Change)
Ainsi tes données détaillées changent même en temps réel au clavier.

8)
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: Validation ListIcon

Message par Marc56 »

Quelques trucs:

- Mettre les variables au début du code (ou mieux dans un fichier prefs/ini)
- Gérer la possible absence de fichier de données: un 'if' doit de préférence avoir un else: le mettre dès le début
- Dans le cas d'un if / else, mettre l'hypothèse la plus défavorable au début (on est sûr de ne pas oublier) en utilisant Not si le résultat est différent de 0

Tel que tu avais écrit ton code, si la base n'existe pas, le programme continue quand même.

Je te propose ceci par exemple

Code : Tout sélectionner

UseSQLiteDatabase()

BDD_Path.s 	= "C:\Tmp\"
BDD_Name.s 	= "Annuaire.SQLite"
SQL.s 		= "SELECT * FROM Annuaire"

Resultat = OpenDatabase(#BDD, BDD_Path + BDD_Name , "", "", #PB_Database_SQLite)
If Not Resultat 
	MessageRequester("Aie!", "Impossible de trouver la base de données", 48)
	End
Else
  If DatabaseQuery(#BDD, SQL)
  ; etc
bien plus facile à lire donc à maintenir
:wink:
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Validation ListIcon

Message par Micoute »

Bonsoir Marc56 et merci beaucoup, car ce code va me servir, mais pour un autre programme.

Je ne souhaite pas modifier ma base de données, ce que je souhaite, c'est afficher les valeurs de l'élément sélectionné de ma liste dans des StringGadget comme il le fait déjà en cliquant le bouton gauche, sauf qu'à la place, j'aurais souhaité utiliser la touche Entrée ou la barre espace.

Encore mille mercis.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Validation ListIcon

Message par Ollivier »

Salut Micoute,

AddKeyboardShortcut permet le rajout d'un raccourci clavier. Attention à l'utiliser avec parcimonie pour les touches fréquemment utilisées. Il y a normalement RemoveKeyboardShortcut pour supprimer le raccourci.

Mais la subtilité n'est pas finie, puisqu'il faut créer un menu factice pour ce raccourci, car le raccourci te dirige vers l'item de menu de ton choix.

Ensuite, il faut surveiller les menus, par exemple avec BindMenuEvent().

Enfin, il reste à créer ta procédure qui s'exécutera quand tu auras validé ta sélection.

Voilà... Quatre étapes. Et le résultat sera là.
Je résume quand même...
1) Raccourci clavier. On précise la fenêtre, le code de touche et le numéro d'item menu (ce numéro c'est toi qui le décide, pas de vraie difficulté si tu es au courant de ça)
2) Un menu factice avec un numéro d'item dédié
3) Une surveillance du menu
4) La procédure qui fait suite à la validation
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: Validation ListIcon

Message par Marc56 »

Micoute a écrit : Je ne souhaite pas modifier ma base de données, ce que je souhaite, c'est afficher les valeurs de l'élément sélectionné de ma liste dans des StringGadget comme il le fait déjà en cliquant le bouton gauche, sauf qu'à la place, j'aurais souhaité utiliser la touche Entrée ou la barre espace.
Je ne vois pas comment le faire (simplement), par contre avec le code que je t'ai indiqué, les valeurs de l'élément sélectionné dans la liste s'affichent dans les détails dès qu'on change de ligne, que ce soit au clavier ou à la souris. (les deux évènement sont gérés sur la même procédure)

Code : Tout sélectionner

Ouvrir_Fenetre_principale()

BindGadgetEvent(#Btn_Nouveau, @Evenement_Btn_Nouveau())
;BindGadgetEvent(#Btn_MAJ, @Evenement_Btn_MAJ())
BindGadgetEvent(#Btn_Supprimer, @Evenement_Btn_Supprimer())
BindGadgetEvent(#Liste,  @Evenement_Liste(), #PB_EventType_LeftClick)
BindGadgetEvent(#Liste,  @Evenement_Liste(), #PB_EventType_Change) ; <--- Ajouter cette ligne pour gérer le clavier
Il suffit donc juste d'ajouter la dernière ligne à ton code existant.

En plus, si la fenêtre liste à le focus, il suffit de taper la première lettre du texte de la ligne cherchée pour l'atteindre et afficher les détails.

8)

Mais si tu veux en plus valider avec espace ou entrée, je pense qu'il suffit que tu ajoute une procédure intermédiaire, type:
- Si #PB_EventType_Change
- Récupérer numéro index (GetGadgetState)
- Vérifier touche clavier
- Si Entrée ou espace
- Procédure Evenement_Liste

:wink:
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Validation ListIcon

Message par MLD »

@ Micoute

Je n'est plus rien a ajouter aprés les conseils avisés d'Ollivier :lol:
Je fait habituellement exactement comme il a dit.

Bonne soirée
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Validation ListIcon

Message par falsam »

Micoute a écrit :ce que j'entend par sélectionné, c'est quand je tape un caractère et que le programme trouve un prénom commençant par ce caractère et que la ligne se colore en bleu !
MLD, Marc56 et Ollivier à mon avis vous n'avez pas répondu à la vraie demande de Micoute (Je sens que je vais me prendre une gamelle dans la gueule :mrgreen: )

Je pense (meme si je ne suis pas frais en ce moment) que micoute souhaite trouver des noms se rapprochant le plus possible des premiers caractéres qu'il est en train de saisir.

La requête SQL à utiliser est dans ce cas un truc de ce style

Code : Tout sélectionner

DatabaseQuery(#Database, "SELECT * FROM contacts WHERE nom LIKE '%" + Value + "%'")
Value est une variable qui contient le nom ou une partie du nom à rechercher quelque soit sa position.

Petite animation pour illustrer mon propos

Image

Le code et une base de 500 noms tests sont dans ce fichier compressé.
:arrow: SqliteTuto10.zip

Je ne me suis pas appliquer à afficher le contact correspondant à ta sélection car tu sais faire. Néanmoins la procédure ShowContact() t'affiche un debug du nom et surtout ..... le numéro d'enregistrement qui te servira à faire la mise à jour de l' enregistrement sélectionné. (Est ce bien clair ce que j'ai dit ! Pas certain)
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
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Validation ListIcon

Message par Micoute »

Bonjour et merci infiniment à tous pour votre précieuse.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: [Résolu] Validation ListIcon

Message par Ollivier »

Falsam a écrit :MLD, Marc56 et Ollivier à mon avis vous n'avez pas répondu à la vraie demande de Micoute ( Je sens que je vais me prendre une gamelle
dans la gueule )
Je reste humblement stoïque au regard de cette provocation évidemment irréaliste car je ne sacrifierai jamais une Tefal pour si peu...

Cependant, je me permets de dire tout de même que je comprends parfaitement Micoute: la preuve? Il vient justement d'écrire ci-dessus ô combien la vaisselle était précieuse!
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: [Résolu] Validation ListIcon

Message par falsam »

Ollivier a écrit :Je reste humblement stoïque au regard de cette provocation évidemment irréaliste
Micoute est juste suffisamment diplomate pour ne pas donner suite à mes propos. :)
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%
Répondre