Problème Gestion d'évènements avec les Gadgets

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
GG
Messages : 239
Inscription : jeu. 09/déc./2004 12:23

Problème Gestion d'évènements avec les Gadgets

Message par GG »

Bonjour à tous,

J'ai découvert PureBasic depuis peu, et me rends compte progressivement de ses formidables capacités. Je me lance aujourd'hui à l'eau pour évoquer mon souci et solliciter votre aide.

Mon programme (source ci dessous) affiche 1 fenêtre principale avec 3 boutons gadget et une ListIconGadget.

Cinématique :

1/ je clique une fois sur l'enregistrement de la ListIconGadget pour le sélectionner (ça active les boutons Modifier et Supprimer qui étaient initialement grisés)
2/ je clique sur le bouton Modifier
3/ je clique sur le bouton Annuler qui apparait

=> Le bouton Ajouter est activé, Modifier et Supprimer sont désactivés (normal, c'est voulu dans le code)

Par contre si j'effectue la cinématique suivante :

1/ je clique une fois sur l'enregistrement de la ListIconGadget
2/ je clique sur le bouton modifier
3/ je clique sur le bouton OK

=> Ajouter, Modifier et Supprimer sont tous les 3 activés (le seul moment où ce cas de figure est souhaité dans le code, c'est à la sélection de l'enregistrement dans la ListIconGadget), alors que la procédure utilisée (Modif_Client) est la même que précédemment, et se termine par les mêmes DisableGadget.
DisableGadget(11,0); Réactiver uniquement le bouton ajouter
DisableGadget(12,1); désactivons modifier
DisableGadget(13,1); et supprimer
Par contre, j'ai trouvé où cela pêche, mais je ne sais pas pourquoi :

Si je commente les lignes 78 et 79 :
RemoveGadgetItem(10,noelement); On supprime l'enregistrement modifié avec l'ancien paramétrage
AddGadgetItem(10,noelement,client$+Chr(10)+Str(noelement+1)+Chr(10)+os$(noelement+1)+Chr(10)+sgbd$(noelement+1)); Rafraichissement de la liste clients pour y inclure le nouvel enregistrement saisi
Cela fonctionne (Les boutons Modifier et Supprimer deviennent désormais grisés).

C'est comme ci les AddGadgetItem et RemoveGadgetItem étaient interprétés par le Select EventGadgetId()...Case 10 de la boucle principale de mon source.
Quelqu'un a une idée ? Le comportement est-il le même de votre côté ?

D'avance, merci de vos commentaires.

Pour info, j'utilise jaPBe 2.4.9.25 avec Purebasic 3.92, avec les update présents dans www.purebasic.com/update

Source :

Code : Tout sélectionner

version1 = 0
version2  = 0
version3 = 1
#WindowWidth  = 1200
#WindowHeight = 900
Maxi = 100
Global nbclients
; identifiants des entités graphiques
; 0 : Fenêtre principale
; 10 : ListIconGadget renfermant les informations affichées dans Table des Clients
; 11 : Bouton ajouter (TDC)
; 12 : Bouton modifier (TDC)
; 13 : Bouton Supprimer (TDC)
; 20 : Fenêtre Table des Clients
;
;Structure Table CLIENTS
Dim os$(Maxi)
Dim nocli$(Maxi)
Dim libcli$(Maxi)
Dim sgbd$(Maxi)
; Paramètres fixes
Dim choix_os$(Maxi)
Dim choix_sgbd$(Maxi)
choix_os$(1)="Windows XP"
choix_os$(2)="Windows 2000"
choix_os$(3)="Windows NT"
choix_sgbd$(1)="Sybase"
choix_sgbd$(2)="Oracle"
choix_sgbd$(3)="SQL Server"

;/ ***********
;/ * Procédures *
;/ ***********

Procedure Modif_Client(noelement);
  DisableGadget(11,1); Désactivation des boutons Ajouter
  DisableGadget(12,1); modifier
  DisableGadget(13,1); et supprimer lors de la modification d'un client
  Frame3DGadget(17,225,325,200,350, "Modification d'un Client");
  StringGadget    (14,250,350,120,24,libcli$(noelement+1))    ; 
  ListViewGadget   (15,250,400,120, 80)
  For a=1 To 3
    AddGadgetItem  (15,-1,choix_os$(a))   ; Choix des OS
  Next
  ListViewGadget   (16,250,500,120, 80)
  For a=1 To 3
    AddGadgetItem  (16,-1,choix_sgbd$(a))   ; Choix des SGBD
  Next
  For indice=1 To 4
    If os$(noelement+1)=choix_os$(indice)
      stockage_os=indice
    EndIf
  Next 
  SetGadgetState(15,stockage_os-1); On affiche la valeur de l'OS par défaut
  For indice=1 To 4
    If sgbd$(noelement+1)=choix_sgbd$(indice)
      stockage_sgbd=indice
    EndIf
  Next 
  SetGadgetState(16,stockage_sgbd-1); On affiche la valeur du SGBD par défaut
  ButtonGadget     (18, 250, 620, 70, 24, "OK")          ; OK
  ButtonGadget     (19, 340, 620, 70, 24, "Annuler")          ; Annuler
  DisableGadget(18,1); Désactivation du bouton OK tant que infos non insérées
  DisableGadget(18,0); On réactive le bouton OK, toutes les infos sont là
  Flag=0
  Repeat 
    EventID3=WaitWindowEvent();
    If EventID3=#PB_Event_Gadget
      Select EventGadgetID();
        Case 18; Appui sur OK
          os=GetGadgetState(15); On récupère l'OS
          sgbd=GetGadgetState(16); On récupère le SGBD
          client$=GetGadgetText(14); On récupère le Nom du client
          libcli$(noelement+1)=client$
          os$(noelement+1)=choix_os$(os+1)
          sgbd$(noelement+1)=choix_sgbd$(sgbd+1)
          indice=1
          RemoveGadgetItem(10,noelement); On supprime l'enregistrement modifié avec l'ancien paramétrage          
          AddGadgetItem(10,noelement,client$+Chr(10)+Str(noelement+1)+Chr(10)+os$(noelement+1)+Chr(10)+sgbd$(noelement+1)); Rafraichissement de la liste clients pour y inclure le nouvel enregistrement saisi 
          For gg= 14 To 19
            FreeGadget(gg); Nettoyage des Gadgets après validation
          Next  
          Flag=1 
        Case 19; Appui sur Annuler
          For gg= 14 To 19
            FreeGadget(gg); Nettoyage des Gadgets après validation
          Next
          Flag=1 
      EndSelect 
    EndIf
    DisableGadget(11,0); Réactiver uniquement le bouton ajouter
    DisableGadget(12,1); désactivons modifier
    DisableGadget(13,1); et supprimer
  Until Flag=1 
EndProcedure

;- Début du programme

If OpenWindow(0, 200, 120, #WindowWidth, #WindowHeight, #PB_Window_MinimizeGadget, "TOTO v"+Str(version1)+"."+Str(version2)+Str(version3))
 clients=2;
 nbclients=clients-1; 
  If CreateGadgetList(WindowID()); On créée la GadgetList pour afficher les infos
    ListIconGadget   (10,150,20,390, 200,"Nom du Client",150)        ; LIBCLI
    AddGadgetColumn(10, 1, "No Client",65)                       ; NOCLI
    AddGadgetColumn(10, 2, "OS",75)                      ; OS
    AddGadgetColumn(10, 3, "SGBD",75)                       ; SGBD 
  EndIf
  libcli$(1)="Libellé"
  nocli$(1)="1"
  os$(1)="Système"
  sgbd$(1)="Windows XP"
  For k = 1 To clients-1
    AddGadgetItem  (10,-1, libcli$(k)+Chr(10)+nocli$(k)+Chr(10)+os$(k)+Chr(10)+sgbd$(k))   ; Alimentation de la ListIconGadget 
  Next
  noelement=clients;
  ButtonGadget     (11, 30, 20, 80, 24, "Ajouter")          ; Bouton Ajouter
  ButtonGadget     (12, 30, 70, 80, 24, "Modifier")          ; Bouton Modifier
  ButtonGadget     (13, 30, 120, 80, 24, "Supprimer")          ; Bouton Supprimer
  DisableGadget(11,0);
  DisableGadget(12,1);
  DisableGadget(13,1);
  Repeat 
    EventID=WaitWindowEvent()
    If EventID=#PB_EventGadget 
      Select EventGadgetID() 
        Case 10; Selection Client
          DisableGadget(11,0);  On active Ajouter
          DisableGadget(12,0); Modifier
          DisableGadget(13,0); Supprimer
          noelement=GetGadgetState(10);   
        Case 12
          Modif_Client(noelement);
      EndSelect 
    EndIf 
  Until EventID=#PB_EventCloseWindow 
EndIf
PureBasic 6.03 - Windows 11 22H2 (64 bits)
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Pfooouuuuu!!! Tu arrives à t'y retrouver, la-dedans :lol:

1 - Tu sais que tu peux donner des noms à tes gadgets, en les mettant sous forme de constante! (Par exemple, le bouton "Ajouter", tu peux l'appeler #Bouton_Ajoute, ou autre chose, à ta convenance).
Tu mets toutes les constantes des gadgets dans une "Enumeration", et le tour est joué.
Si ce n'est pas plus facile à lire pour toi, ça l'est nettement pour ceux qui vont debugger ton code :wink:

2 - Je vois que tu utilises plusieurs tableaux.

Code : Tout sélectionner

Dim os$(Maxi) 
Dim nocli$(Maxi) 
Dim libcli$(Maxi) 
Dim sgbd$(Maxi) 
Des (une) liste(s) chainées ne serait-elles pas plus simples à gérer dans ton cas?

Pour en revenir à ton problème, c'est pas facile de voir quelque chose la dedans.

On peut toujours essayer...
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

voici la correction, voir explication plus bas

Code : Tout sélectionner

version1 = 0
version2 = 0
version3 = 1
#WindowWidth = 1200
#WindowHeight = 900
Maxi = 100
Global nbclients
; identifiants des entités graphiques
; 0 : Fenêtre principale
; 10 : ListIconGadget renfermant les informations affichées dans Table des Clients
; 11 : Bouton ajouter (TDC)
; 12 : Bouton modifier (TDC)
; 13 : Bouton Supprimer (TDC)
; 20 : Fenêtre Table des Clients
;
; Structure Table CLIENTS
Dim os$(Maxi)
Dim nocli$(Maxi)
Dim libcli$(Maxi)
Dim sgbd$(Maxi)
; Paramètres fixes
Dim choix_os$(Maxi)
Dim choix_sgbd$(Maxi)
choix_os$(1) = "Windows XP"
choix_os$(2) = "Windows 2000"
choix_os$(3) = "Windows NT"
choix_sgbd$(1) = "Sybase"
choix_sgbd$(2) = "Oracle"
choix_sgbd$(3) = "SQL Server"

;/ ***********
;/ * Procédures *
;/ ***********

Procedure Modif_Client(noelement) ;
  DisableGadget(11, 1) ; Désactivation des boutons Ajouter
  DisableGadget(12, 1) ; modifier
  DisableGadget(13, 1) ; et supprimer lors de la modification d'un client
  Frame3DGadget(17, 225, 325, 200, 350, "Modification d'un Client") ;
  StringGadget (14, 250, 350, 120, 24, libcli$(noelement + 1)) ;
  ListViewGadget (15, 250, 400, 120, 80)
  For a = 1 To 3
    AddGadgetItem (15, -1, choix_os$(a)) ; Choix des OS
  Next
  ListViewGadget (16, 250, 500, 120, 80)
  For a = 1 To 3
    AddGadgetItem (16, -1, choix_sgbd$(a)) ; Choix des SGBD
  Next
  For indice = 1 To 4
    If os$(noelement + 1) = choix_os$(indice)
      stockage_os = indice
    EndIf
  Next
  SetGadgetState(15, stockage_os - 1) ; On affiche la valeur de l'OS par défaut
  For indice = 1 To 4
    If sgbd$(noelement + 1) = choix_sgbd$(indice)
      stockage_sgbd = indice
    EndIf
  Next
  SetGadgetState(16, stockage_sgbd - 1) ; On affiche la valeur du SGBD par défaut
  ButtonGadget (18, 250, 620, 70, 24, "OK") ; OK
  ButtonGadget (19, 340, 620, 70, 24, "Annuler") ; Annuler
  DisableGadget(18, 1) ; Désactivation du bouton OK tant que infos non insérées
  DisableGadget(18, 0) ; On réactive le bouton OK, toutes les infos sont là
  Flag = 0
  Repeat
    EventID3 = WaitWindowEvent() ;
    If EventID3 = #PB_Event_Gadget
      Select EventGadgetID() ;
        Case 18 ; Appui sur OK
          os = GetGadgetState(15) ; On récupère l'OS
          sgbd = GetGadgetState(16) ; On récupère le SGBD
          client$ = GetGadgetText(14) ; On récupère le Nom du client
          libcli$(noelement + 1) = client$
          os$(noelement + 1) = choix_os$(os + 1)
          sgbd$(noelement + 1) = choix_sgbd$(sgbd + 1)
          indice = 1
          RemoveGadgetItem(10, noelement) ; On supprime l'enregistrement modifié avec l'ancien paramétrage
          AddGadgetItem(10, noelement, client$ + Chr(10) + Str(noelement + 1) + Chr(10) + os$(noelement + 1) + Chr(10) + sgbd$(noelement + 1)) ; Rafraichissement de la liste clients pour y inclure le nouvel enregistrement saisi
          For gg = 14 To 19
            FreeGadget(gg) ; Nettoyage des Gadgets après validation
          Next
          Flag = 1
        Case 19 ; Appui sur Annuler
          For gg = 14 To 19
            FreeGadget(gg) ; Nettoyage des Gadgets après validation
          Next
          Flag = 1
      EndSelect
    EndIf
    DisableGadget(11, 0) ; Réactiver uniquement le bouton ajouter
    DisableGadget(12, 1) ; désactivons modifier
    DisableGadget(13, 1) ; et supprimer
  Until Flag = 1
EndProcedure

;- Début du programme

If OpenWindow(0, 200, 120, #WindowWidth, #WindowHeight, #PB_Window_MinimizeGadget, "TOTO v" + Str(version1) + "." + Str(version2) + Str(version3))
  clients = 2 ;
  nbclients = clients - 1 ;
  If CreateGadgetList(WindowID()) ; On créée la GadgetList pour afficher les infos
    ListIconGadget (10, 150, 20, 390, 200, "Nom du Client", 150) ; LIBCLI
    AddGadgetColumn(10, 1, "No Client", 65) ; NOCLI
    AddGadgetColumn(10, 2, "OS", 75) ; OS
    AddGadgetColumn(10, 3, "SGBD", 75) ; SGBD
  EndIf
  libcli$(1) = "Libellé"
  nocli$(1) = "1"
  os$(1) = "Système"
  sgbd$(1) = "Windows XP"
  For k = 1 To clients - 1
    AddGadgetItem (10, -1, libcli$(k) + Chr(10) + nocli$(k) + Chr(10) + os$(k) + Chr(10) + sgbd$(k)) ; Alimentation de la ListIconGadget
  Next
  noelement = clients ;
  ButtonGadget (11, 30, 20, 80, 24, "Ajouter") ; Bouton Ajouter
  ButtonGadget (12, 30, 70, 80, 24, "Modifier") ; Bouton Modifier
  ButtonGadget (13, 30, 120, 80, 24, "Supprimer") ; Bouton Supprimer
  DisableGadget(11, 0) ;
  DisableGadget(12, 1) ;
  DisableGadget(13, 1) ;
  Repeat
    EventID = WaitWindowEvent()
    If EventID = #PB_EventGadget
      Select EventGadgetID()
        Case 10 ; Selection Client
          Pos = GetGadgetState(10)
          If Pos >= 0 ; donc si un élément est activé dans la liste
            DisableGadget(11, 0) ; On active Ajouter
            DisableGadget(12, 0) ; Modifier
            DisableGadget(13, 0) ; Supprimer
            noelement = Pos
          EndIf
        Case 12
          Modif_Client(noelement) ;
      EndSelect
    EndIf
  Until EventID = #PB_EventCloseWindow
EndIf

Bon, quand on récupère l'élément sélectionné d'une listIonGadget au autre liste (Combobox, listview),il faut toujours tester si un élément est bien sélectionné
Quand aucun élément est sélectionné, getgadgetstate renvoie -1
pourquoi ? simplement parce que plusieur type évènement sont renvoyé vers le gadget :
- la sélection d'un élément
- le double click
- le changement
- etc ...

donc il est important de vérifier ceci


autre chose, moi, j'aurai simplement édité le texte plutot que supprimé et ajouter une ligne. voir la fonction setgadgetitemtext
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
GG
Messages : 239
Inscription : jeu. 09/déc./2004 12:23

Message par GG »

Merci beaucoup Soldat Inconnu, OK pour le test du GetGadgetState.
Effectivement, je vais appliquer le SetGadgetItemText, plutôt que de me compliquer la tâche.
Chris : Je vais effectivement gérer tout ce beau monde via listes chainées, ce sera plus souple.
Merci pour votre réactivité Chris et Soldat !
PureBasic 6.03 - Windows 11 22H2 (64 bits)
jbernard13
Messages : 1501
Inscription : dim. 18/avr./2004 15:04
Localisation : sud de la france

Message par jbernard13 »

heu tu programme quoi comme application ?

essaye d'agrandir un peu ta listicon
Jbernard13
GG
Messages : 239
Inscription : jeu. 09/déc./2004 12:23

Message par GG »

En fait, travaillant dans l'informatique Boursière, je développe un programme me permettant de gérer les jours fériés sur les différentes places boursières mondiales. Mon programme doit me générer des scripts SQL que j'insère directement dans les bases de données, en fonction du système d'exploitation, du SGBD, et d'autres contraintes externes liées à des spécificités des clients.
L'exemple que j'ai fourni est un minuscule extrait. J'approche les 1500 lignes, ce qui reste encore très loin des projets que l'on peut apercevoir chez certains sur ce forum, et mon projet n'en pas terminé, loin s'en faut. En tout cas, Purebasic répond parfaitement à mes besoins, en termes de souplesse de programmation fenêtrée, comme en rapidité de développement.
PureBasic 6.03 - Windows 11 22H2 (64 bits)
Répondre