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.
Par contre, j'ai trouvé où cela pêche, mais je ne sais pas pourquoi :DisableGadget(11,0); Réactiver uniquement le bouton ajouter
DisableGadget(12,1); désactivons modifier
DisableGadget(13,1); et supprimer
Si je commente les lignes 78 et 79 :
Cela fonctionne (Les boutons Modifier et Supprimer deviennent désormais grisés).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
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