Problème avec ComboBoxGadget

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
omega
Messages : 623
Inscription : sam. 26/nov./2011 13:04
Localisation : Alger

Problème avec ComboBoxGadget

Message 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:

Code : Tout sélectionner

numdoc$=GetGadgetText(#Numdoc)
debug Numdoc$
AfficherDoc()
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
Dernière modification par omega le dim. 12/août/2018 11:37, modifié 1 fois.
Win7 (x64) 64 bits Pb 5.72
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Incroyable mais vrai malheureusement

Message par Ollivier »

Avec un poil plus d'objectivité pour réussir à t'aider s'il te plaît.

Merci...
Avatar de l’utilisateur
Ar-S
Messages : 9476
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Incroyable mais vrai malheureusement

Message 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" :wink:
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Incroyable mais vrai malheureusement

Message par falsam »

Ar-S a écrit :On est pas dans "détective magazine"
On est dans "Enquête exclusive"
Configuration : Windows 11 Famille 64-bit - PB 6.03 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
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Incroyable mais vrai malheureusement

Message 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
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
boby
Messages : 261
Inscription : jeu. 07/juin/2007 22:54

Re: Incroyable mais vrai malheureusement

Message 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 :wink:
Avatar de l’utilisateur
microdevweb
Messages : 1800
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Incroyable mais vrai malheureusement

Message 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()

Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
omega
Messages : 623
Inscription : sam. 26/nov./2011 13:04
Localisation : Alger

Re: Incroyable mais vrai malheureusement

Message 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
Win7 (x64) 64 bits Pb 5.72
G-Rom
Messages : 3627
Inscription : dim. 10/janv./2010 5:29

Re: Problème avec ComboBoxGadget

Message 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.
Marc56
Messages : 2147
Inscription : sam. 08/févr./2014 15:19

Re: Problème avec ComboBoxGadget

Message 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.

:wink:
Avatar de l’utilisateur
Ar-S
Messages : 9476
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Problème avec ComboBoxGadget

Message 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)
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
omega
Messages : 623
Inscription : sam. 26/nov./2011 13:04
Localisation : Alger

Re: Problème avec ComboBoxGadget

Message 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
Win7 (x64) 64 bits Pb 5.72
Avatar de l’utilisateur
Ar-S
Messages : 9476
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Problème avec ComboBoxGadget

Message par Ar-S »

Et GetGadgetItemText() ?
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
omega
Messages : 623
Inscription : sam. 26/nov./2011 13:04
Localisation : Alger

Re: Problème avec ComboBoxGadget

Message 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:

Code : Tout sélectionner

Valeur$=GetGadgetItemText(#Combo,2) 
Debug valeur$
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
Win7 (x64) 64 bits Pb 5.72
Avatar de l’utilisateur
microdevweb
Messages : 1800
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Problème avec ComboBoxGadget

Message 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.
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Verrouillé