Page 1 sur 8
Problème avec ComboBoxGadget
Publié : sam. 11/août/2018 18:18
par omega
Bonjour à tous et à toutes
Comme l'indique le titre, vous allez sûrement me dire que c'est incroyable ! et pourtant, c'est bel et bien vrai. Tenez-vous bien: J'ai un comboBoxGadget éditable (portant le nom : numdoc). Ce combo est rempli automatiquement par tous les numdoc existants (jusqu'ici tout va bien). Quand on sélectionne un n° de doc, il sera affiché sur la combo (c normal), on peut le voir sur écran noir sur blanc. Donc ma combo contient le n° du doc sélectionné (visible).
Quand je veux afficher le document (grâce au n° de doc qui figure sur la zône Numdoc), je fais:
Dans la procédure (AfficherDoc) c'est le document portant le n° précédent qui s'affiche. J'ai fait un debug pour vérifier juste après (numdoc$=GetGadgetText(#numdoc), il m'affiche le n° précédent et non pas le n° qui figure sur la combobox ! Oui, je sais que cela vous parait impossible mais cela m'est arrivé aujourd'hui et pour éviter ce bug, j'ai tout simplement enlevé (numdoc$=GetGadgetText(#numdoc)), et ça marche mais quand même je ne suis pas convaincu car il faut bien une raison qui empêche de prendre en considération le numdoc.
LE PROBLEME C'EST QUE CA N'ARRIVE PAS DANS TOUS LES CAS ! C'EST CA QUI COMPLIQUE TOUT !
Merci
Re: Incroyable mais vrai malheureusement
Publié : sam. 11/août/2018 19:21
par Ollivier
Avec un poil plus d'objectivité pour réussir à t'aider s'il te plaît.
Merci...
Re: Incroyable mais vrai malheureusement
Publié : sam. 11/août/2018 21:37
par Ar-S
"un numdoc qui est rempli par les numdoc..." c'est pas très parlant. Et puis comme en général l'erreur vient de l'engin entre la chaise et le clavier, montre nous ton code ou un exemple simplifié. En l'état ce topic ne sert pas à grand chose. Et si tu peux aussi changer de titre avec "problème de ComboBox ou un truc plus parlant"... On est pas dans "détective magazine"

Re: Incroyable mais vrai malheureusement
Publié : sam. 11/août/2018 21:45
par falsam
Ar-S a écrit :On est pas dans "détective magazine"
On est dans "Enquête exclusive"
Re: Incroyable mais vrai malheureusement
Publié : sam. 11/août/2018 22:33
par falsam
Ce qui est "
Incroyable mais vrai malheureusement" c'est que tu ne fournis même pas un embryon de code pour essayer de nous expliquer ce qui ne va pas.
Après interprétation de ton délire très mince, voici un code minimaliste que tu es prié de compléter si besoin. j'ai supposé qu'il y a un bouton pour voir le doc sélectionné.
Code : Tout sélectionner
EnableExplicit
Enumeration Window
#mf
EndEnumeration
Enumeration Gadget
#NumDoc
#ShowDoc
EndEnumeration
Declare Start()
Declare ShowDocs()
Declare Exit()
Start()
Procedure Start()
Protected i
OpenWindow(#mf, 0, 0, 800, 600, "Test", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
ComboBoxGadget(#NumDoc, 10, 10, 150, 24, #PB_ComboBox_Editable)
For i = 0 To 9
AddGadgetItem(#NumDoc, -1, "doc" + Str(i))
Next
SetGadgetState(#NumDoc, 0)
ButtonGadget(#ShowDoc, 170, 10, 80, 24, "Voir Doc")
;Declencheur
BindGadgetEvent(#ShowDoc, @ShowDocs())
BindEvent(#PB_Event_CloseWindow, @Exit())
Repeat : WaitWindowEvent() : ForEver
EndProcedure
Procedure ShowDocs()
Protected numdoc$ = GetGadgetText(#Numdoc)
Debug numdoc$
EndProcedure
Procedure Exit()
End
EndProcedure
Celui là fonctionne
Re: Incroyable mais vrai malheureusement
Publié : dim. 12/août/2018 10:23
par boby
Incroyable mais vrai ! Si tu n'arrive pas à reproduire ton bud dans un code minimaliste (du genre ce que te propose falsam) c'est que le bug ne vient pas de PB mais de ton code !
Une autre info Incroyable mais vrai, avec ce genre de titre et "dexplication" relativement farfelu, c'est difficile de venir t'aider quand naturellement la première envie qui viens c'est de te répondre de façon ironique (un peut à l'image de ton poste quoi). Choisis mieux tes mots pour les prochains posts

Re: Incroyable mais vrai malheureusement
Publié : dim. 12/août/2018 11:01
par microdevweb
Je ne suis pas certain d'avoir tout compris, mais il vaut mieux utilisé SetGadgetItemData et GetGadgetItemData que de jouer avec GetGadgetText
Voici un exemple concret, qui pourrait facilement être utilisé avec une bd.
Code : Tout sélectionner
; exemple avec gadgetItemData
; une liste quelconque
EnableExplicit
Global NewList myItems.s()
Enumeration
#MAIN_FORM
#CB_ITEMS
EndEnumeration
; déclaration des procédures
Declare makeList()
Declare start()
Declare makeWindow()
Declare fillCombo()
Declare EventExit()
Declare EventCombo()
; crétion d'article pour la liste
Procedure makeList()
Protected n
For n = 0 To 101
AddElement(myItems())
myItems() = "item : "+Str(n)
Next
EndProcedure
Procedure start()
makeList() ; création de la list d'articles
If makeWindow()
Repeat : WaitWindowEvent() : ForEver
EndIf
EndProcedure
Procedure makeWindow()
Protected returnedValue.b
; ouverture de la fenêtre
returnedValue = OpenWindow(#MAIN_FORM,0,0,800,600,"Test",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
If returnedValue ; si la fenêtre est ouverte
; mise en place du callback de fermeture
BindEvent(#PB_Event_CloseWindow,@EventExit(),#MAIN_FORM)
; Création du combo
If ComboBoxGadget(#CB_ITEMS,350,300,100,30)
fillCombo()
; mise en place du callback du combo
BindGadgetEvent(#CB_ITEMS,@EventCombo())
EndIf
EndIf
ProcedureReturn returnedValue
EndProcedure
Procedure fillCombo()
Protected n = 0 ; indice de l'ajout
ForEach myItems()
AddGadgetItem(#CB_ITEMS,-1,myItems())
; on mémorise l'index de la list
; on aurais peu aussi mémorisé& l'adresse
SetGadgetItemData(#CB_ITEMS,n,ListIndex(myItems()))
n +1 ; on incrémente l'indice
Next
EndProcedure
Procedure EventExit()
CloseWindow(#MAIN_FORM)
End
EndProcedure
Procedure EventCombo()
Protected index = GetGadgetItemData(#CB_ITEMS,GetGadgetState(#CB_ITEMS))
; on se positione sur l'élément de la liste
SelectElement(myItems(),index)
Debug myItems()
EndProcedure
start()
Re: Incroyable mais vrai malheureusement
Publié : dim. 12/août/2018 11:35
par omega
Bonjour à tous et merci pour tout
Je reconnais que le titre du post n'est pas significatif, désolé j'aurais du mettre problème avec combobox ou qq chose comme ça... Bon, pour ce qui est du code source, d'abord il est volumineux et contient des images et des tables sqlite, vous ne pouvez donc pas le tester directement puisqu'il va falloir créer toutes les images ainsi que la base de données et ses nombreuses tables... ça sera une perte de temps considérable. En plus, le problème réside uniquement au niveau de cette partie de code puisque le debug le prouve! le gadget #numdoc est un ComboBoxGadget (éditable), il contient une liste de numéro chronologique (de 1 à 1256). Quand on sélectionne un n° quelconque celui-ci s'affiche sur la zône visible du combo. Donc, jusqu'ici tout va bien. Mais quand je clique sur le bouton Afficher le document (qui pointe vers la procédure AfficherDoc(), voici ce qui se passe: (et là le code est nécessaire) raison pour laquelle j'ai fourni cette partie de code qui ne fonctionne pas comme prévu:
Code : Tout sélectionner
Procedure AfficherDoc()
numdoc$=GetGadgetText(#Numdoc)
debug Numdoc$
...Affichage du document ici ....
EndProcedure()
Le N° doc affiché par Debug n'affiche PAS TOUJOURS (je dis bien PAS TOUJOURS) le N° affiché sur le gadget mais la plupart du temps (heureusement d'ailleurs) il affiche le bon n°, parfois un blanc (chaîne vide) et rarement le n° du doc précédent. Si vous tenez à voir le code complet pas de problème mais je ne pense pas que cela va vous aider puisque tout le reste marche bien sauf cette procédure.
D'après vos interventions, il semble que personne n'a eu ce genre de problème avec combobox et getgadgettext. Moi aussi d'ailleurs c'est la première fois que cela m'arrive (sur pb5.62), par contre sur Pb4, je n'ai jamais eu ce genre de problème.
Merci encore une fois
Re: Problème avec ComboBoxGadget
Publié : dim. 12/août/2018 13:22
par G-Rom
Heu, le bug, c'est toi a mon avis.
Code : Tout sélectionner
Procedure afficheDoc()
doc$ = GetGadgetText(0)
MessageRequester("",doc$)
EndProcedure
OpenWindow(0,0,0,320,240,"")
ComboBoxGadget(0,0,0,320,32, #PB_ComboBox_Editable)
ButtonGadget(1,0,42,320,32,"affiche moi")
BindGadgetEvent(1,@afficheDoc())
For i = 0 To 5000
AddGadgetItem(0,-1,"Item numéro : " + Str(i))
Next
Repeat
Repeat
event = WindowEvent()
If event = #PB_Event_CloseWindow
End
EndIf
Until event = 0
ForEver
Donne un code qui reproduit le bug. si tu n'y arrives pas c'est que le problème viens de ton code et pas d'autre chose. là, sa marche bien même avec 5000 éléments éditable.
Re: Problème avec ComboBoxGadget
Publié : dim. 12/août/2018 13:31
par Marc56
Une erreur classique (oubli) avec les gadgets est de mélanger le texte et le numéro d'index, quand on a une liste déroulante 1, 2, 3 ...
On mélange GetGadgetState() et GetGadgetText()
Seulement GetGadgetState() retourne le numéro d'index, qui lui commence à 0...
- GetGadgetState() : Renvoie l'index de l'élément sélectionné ou -1 si aucun élément n'a été ajouté ou sélectionné.
- GetGadgetText() : Renvoie le contenu texte de la zone visible de la ComboBox.
Fais une recherche dans ton code source, si tu as un GetGadgetState(), c'est probablement là.
Il y a peu de chance que ce soit un bug de PB étant donné que ce fonctions sont utilisées depuis plus de 10 ans.

Re: Problème avec ComboBoxGadget
Publié : dim. 12/août/2018 15:31
par Ar-S
Je penche vraiment pour cette dernière explication de Marc56
Sans compter les index qui sont souvent en N-1 vu qu'ils commencent à 0 et non pas à 1
(5 éléments, 0.1.2.3.4)
Re: Problème avec ComboBoxGadget
Publié : dim. 12/août/2018 22:02
par omega
@G-Rom : J'aimerais bien que cela provient de mon code, mais justement la question est là. Le code que tu viens de fournir ne sert à rien car j'ai bien précisé que cela ne marche pas à tous les coups et que la plupart du temps ça marche...si tu ne me crois pas je te donne raison car moi même je suis étonné pourquoi une instruction aussi simple ne marche pas dans certains cas (??), pourtant j'utilise cette même instruction depuis des années (plus de 10 ans) mais sous une ancienne version de pb (pb4) je n'ai jamais eu de problème, mais depuis que j'ai installé la version 5.62, je rencontre des problèmes de temps en temps mais j'arrive à les corriger jusqu'à cette fois ...
@Ar-s: Pourquoi tu me parles des indexes? ça n'a aucun rapport avec mon problème. C'est vrai que j'ai utilisé quelque part GetGadgetState() mais cela n'a rien à voir avec mon cas , il s'agit de GetGadgetText (sur combobox) j'ai vu dans l'aide et c'est bien clair, cela permet d'avoir le texte affiché sur une zône combo.
@Marc56
Une erreur classique (oubli) avec les gadgets est de mélanger le texte et le numéro d'index, quand on a une liste déroulante 1, 2, 3 ...
On mélange GetGadgetState() et GetGadgetText()
Seulement GetGadgetState() retourne le numéro d'index, qui lui commence à 0...
Je crois que tu n'as pas bien saisi mon problème, il s'agit de getGadgetText() et non pas de GetGadgetState() avec cette dernière instruction, je n'ai pas de problème. Je sais très bien faire la différence entre ces 2 instructions...
J'ai essayé de poster le code, mais ça n'a pas marché parce que le nombre de lignes dépasse la limite !
Y a t il un autre moyen de vous le montrer?
Merci
Re: Problème avec ComboBoxGadget
Publié : dim. 12/août/2018 22:14
par Ar-S
Et GetGadgetItemText() ?
Re: Problème avec ComboBoxGadget
Publié : dim. 12/août/2018 22:35
par omega
@Ar-s: GetGadgetItemText() retourne une valeur à partir de la ligne spécifiée, par exemple si je veux afficher une valeur qui se trouve en 3ème position dans une ComboBoxGadget, je ferais:
Là encore, ce n'est pas ce que je cherche à faire. Je vais essayer de fabriquer un lien pour déposer mon code compressé pour pouvoir le télécharger.
Merci
Re: Problème avec ComboBoxGadget
Publié : lun. 13/août/2018 10:16
par microdevweb
omega a écrit :
Je crois que tu n'as pas bien saisi mon problème, il s'agit de getGadgetText() et non pas de GetGadgetState() avec cette dernière instruction, je n'ai pas de problème. Je sais très bien faire la différence entre ces 2 instructions...
Bon tu parle bien d'un combo et
getGadgetText() ne fonctionne pas avec un combo, tu dois utilisé
GetGadgetItemText(#Gadget,GetGadgetState(#Gadget))
Oups pas vu ton dernier poste, mais jouer avec les textes n'est pas la meilleur solution des fois tu peut avoir des soucis (ascci, utf8 etc...) personnellement je n'utilise le texte que pour info utilisateur et les data pour le moteur du soft.