Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | Calendrier |
|
|
| clicked(n) problème | |
| | |
Auteur | Message |
---|
bignono
Nombre de messages : 1127 Age : 67 Localisation : Val de Marne Date d'inscription : 13/11/2011
| Sujet: clicked(n) problème Jeu 2 Avr 2015 - 23:19 | |
| Bonjour à tous, Je crois avoir trouvé un bug avec la fonction clicked(n). Dans un de mes programmes, j’utilise plusieurs boucles while end_while se suivant avec la condition clicked(n) et seule la première boucle est exécutée, les autres étant ignorées. J’ai essayé le petit programme test suivant sur plusieurs versions de panoramic et le problème ne se produit qu’à partir des versions 0.9.26... La fonction clicked(1) reste à 1 définitivement et ne se remet pas à 0 dès qu’on a cliqué une fois sur le bouton. Sur les versions antérieures aux 0.9.26, il n’y a pas de problèmes, les boucles sont bien exécutées les unes après les autres et la fonction clicked(1) est bien remise à 0 après le clic sur le bouton. J’en déduis donc un bug. A Jack de confirmer. - Code:
-
' la seconde boucle while end_while n'est jamais exécutée button 1:caption 1,"Cliquez-moi !" memo 2:left 2,100 while clicked(1)=0 item_add 2,date$+" il est "+time$ end_while
' print_target_is 2:print clicked(1):end
while clicked(1)=0 item_add 2,time$+" nous sommes le "+date$ end_while | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: clicked(n) problème Ven 3 Avr 2015 - 0:54 | |
| Salut Bignono Je ne penche pas pour le bug. A mon avis, la seconde boucle WHILE ne doit pas être exécutée et c’est bien ce qui est fait. Le contraire serait un bug. En effet, la 1ère boucle WHILE s’exécute tant que le bouton n’est pas cliqué. La fonction CLICKED(1) doit valoir 0. Si on clique sur le bouton, on sort de la boucle et la fonction CLICKED(1) vaut 1 La condition de la seconde boucle WHILE est dès le départ fausse (puisqu’elle vaut 1 et non 0), la boucle est purement et simplement ignorée. Essaie ceci - Code:
-
button 1:caption 1,"Cliquez-moi !" memo 2:left 2,100 button 3 : left 3,400 : caption 3,"Click-me" while clicked(1)=0 item_add 2,date$+" il est "+time$ end_while
while clicked(3)=0 font_color 2,0,0,255 item_add 2,time$+" nous sommes le "+date$ end_while
PS La structure du code que tu as fourni est une structure séquentielle. Le code se déroule sans se soucier de la venue ou non d’un quelconque événement tel un click ou autre. Son fonctionnement est correct. Mais si on veut gérer efficacement les clicks, il est nécessaire d’opter pour la programmation événementielle, avec les ON_CLICK … C'est ma manière à moi de voir les choses | |
| | | bignono
Nombre de messages : 1127 Age : 67 Localisation : Val de Marne Date d'inscription : 13/11/2011
| Sujet: Re: clicked(n) problème Ven 3 Avr 2015 - 7:30 | |
| Bonjour Papydall, Je ne suis pas d'accord avec toi! Dans ton exemple si tu cliques d'abord sur le bouton 3 "click-me" alors que la première boucle se déroule en attendant que l'on clique sur l'autre bouton (le 1 "cliquez-moi !"), il ne se passe rien... Enfin si, une fois que l'on clique sur le premier bouton, le programme s'arrête et la seconde boucle n'est jamais exécutée! Alors que la condition pour passer à la suite du programme c'est de cliquer sur le premier bouton! La fonction clicked te renvoie soit 0 pour dire que rien n'a été cliqué, soit 1 pour dire que l'on a cliqué un objet. Si l'objet a été cliqué, la suite du programme s'exécute et la fonction doit repasser à 0 et non pas rester bloquée à 1, puisque l'objet n'est plus cliqué à ce moment là.
| |
| | | Invité Invité
| Sujet: Re: clicked(n) problème Ven 3 Avr 2015 - 8:49 | |
| Tant pis je répond, cela ne me parrait pas très clair. Le programme ne me parrait pas très clair, mais c'est juste pour montrer un problème. Je rejoins l'avis de Bignono car effectivement clicked(1) reste bloqué à 1 - Code:
-
' la seconde boucle while end_while n'est jamais exécutée button 1:caption 1,"Cliquez-moi !" memo 2:left 2,100
while clicked(1)=0 item_add 2,date$+" il est "+time$ end_while
message clicked(1) message clicked(1) message clicked(1)
' print_target_is 2:print clicked(1):end
while clicked(1)=0 item_add 2,time$+" nous sommes le "+date$ end_while
message "fin" |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: clicked(n) problème Ven 3 Avr 2015 - 8:51 | |
| Heu ! pas évident comme problème.
Une chose est certaine: le comportement du programme de Bignono n'est pas le même entre les 2 versions de Panoramic. C'est donc "un bug", mais dans quelle version ???
A+ | |
| | | Invité Invité
| Sujet: Re: clicked(n) problème Ven 3 Avr 2015 - 10:00 | |
| Voici une version qui montre bien un bug: - Code:
-
label clic
button 1:caption 1,"bouton 1" : on_click 1,clic button 2:caption 2,"bouton 2" : on_click 2,clic : top 2,30
END clic: if clicked(1) = 1 then message "1" if clicked(2) = 1 then message "2" return |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: clicked(n) problème Ven 3 Avr 2015 - 11:46 | |
| En suivant ton code Cosmos, je me suis dit qu'il fallait "décliquer" le bouton après le message pour le remettre à zéro. Mais écrire [if clicked(1) = 1 then clicked(1) = 0] n'est pas valide. Alors j'ai tenté ceci - Code:
-
label clic
button 1:caption 1,"bouton 1" : on_click 1,clic button 2:caption 2,"bouton 2" : on_click 2,clic : top 2,30
END clic: message "Bouton n°1="+str$(clicked(1))+" / Bouton n°2="+str$(clicked(2)) off_click number_click if clicked(1) = 1 then on_click 1,clic if clicked(2) = 1 then on_click 2,clic return
On s'aperçoit que OFF_CLICK N joue son rôle, mais ne change pas la valeur de CLICKED(N) Il y a bien un problème. A+ | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: clicked(n) problème Ven 3 Avr 2015 - 11:55 | |
| Autre chose: Essayez ce code avec la V09.25 et la V09.26 - Code:
-
label clic
button 1:caption 1,"bouton 1" : on_click 1,clic button 2:caption 2,"bouton 2" : on_click 2,clic : top 2,30
END clic: message "Bouton n°1="+str$(clicked(1))+" / Bouton n°2="+str$(clicked(2)) if clicked(1) = 1 then clicked(1) = 0 if clicked(2) = 1 then clicked(2) = 0 return
C'est édifiant. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: clicked(n) problème Ven 3 Avr 2015 - 13:38 | |
| Je crois que vous tous, vous confondez le sens de la fonction clicked() et la variable système NUMBER_CLICK.
En effet, la fonction clicked(n) retourne 1 si l'objet n a été cliqué. Ce qui est le cas, et reste vrai même si un autre objet a été cliqué. Par contre, la variable NUMBER_CLICK contient le numéro du dernier objet cliqué. Si l'on surveille cette variable au lieu de tester clicked(1), on peut détecter l'évènement dès qu'on clique dans la form 0. | |
| | | Invité Invité
| Sujet: Re: clicked(n) problème Ven 3 Avr 2015 - 14:32 | |
| Ok Klaus, c'est d'ailleurs pour cette raison que je dis au départ que ce n'est pas très clair.
Mais les exemples montrent qu'il y a un problème avec cette fonction, et c'est le but de cette discution.
Je préfère mettre un on_click sur chaque objet concerné pour que number_click soit actif, sinon cela ne fonctionne, et avec par exemple select number_click définir la partie programme concernée.
Maintenant Bignono montre un exemple pour parler d'un bug, mais surement dans son programme, il a une bonne raison de procéder ainsi. Si il n'y a pas de bug, tel qu'on voit le résultat, peux-tu me dire à quoi sert cette fonction : clicked(x) , si cela reste bloqué? |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: clicked(n) problème Ven 3 Avr 2015 - 14:50 | |
| La variable NUMBER_CLICK a besoin d'un vrai évènement ON_CLICK pour se remplir. Ce n'est pas le cas avec un bouton qui n'a pas de ON_CLICK. De même, le clic sur le bouton ne peut être prie en compte correctement que si l'on utilise une vraie gestion des évènements. Ces boucles WHILE sont l'exacte contre-exemple de ce qu'il faut faire en Panoramic. Mais un peut améliorer la chose en déclarant un ON_CLICK bidon (routine vide) et un DISPLAY dans la boucle: - Code:
-
' la seconde boucle while end_while n'est jamais exécutée button 1:caption 1,"Cliquez-moi !" label click1 : on_click 1,click1 memo 2:left 2,100 while clicked(1)=0 item_add 2,date$+" il est "+time$ display end_while
' print_target_is 2:print clicked(1):end
while clicked(1)=0 item_add 2,time$+" nous sommes le "+date$ end_while end click1: return
Le DISPLAY sert à permettre à Windows (et Panoramic) de gérer ses évènements. Et la routine CLICK1 fait au moins un semblant de gestion d'évènement. Ceci dit, il ne faut absolument pas programmer comme ça, encore moins dans la partie initialisation du programme, avant le END. | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: clicked(n) problème Ven 3 Avr 2015 - 15:59 | |
| - Klaus a écrit:
- Je crois que vous tous, vous confondez le sens de la fonction clicked() et la variable système NUMBER_CLICK.
Bon, je me qualifie souvent moi-même de programmeur du dimanche, mais je regarde quand même la doc. Je ne confond pas ces 2 mots clés. Ceci dit: peux-tu expliquer que l'on peut écrire if clicked(1) = 1 then clicked(1) = 0 dans une version de Panoramic et pas dans l'autre ! A+ | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: clicked(n) problème Ven 3 Avr 2015 - 16:06 | |
| - Citation :
- Ceci dit: peux-tu expliquer que l'on peut écrire if clicked(1) = 1 then clicked(1) = 0 dans une version de Panoramic et pas dans l'autre !
Si jamais ça a marché dans une version ancienne de Panoramic, alors c'était un bug, et un bug énorme ! Comment imaginer affecter une valeur à une fonction - une fonction doit retourner une valeur, pas le contraire ! Tu pourrais aussi bien vouloir faire sin(2)=0 , et espérer que la prochaine fois que tu utilises sin(2), cela te retournera 0... Non, il faut être clair. CLICKED(n) est une fonction, et en tant que telle, elle ne peut que figurer à droite du signe "=". Tu ne peux jamais affecter une valeur à une fonction, quelle qu'elle soit. | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: clicked(n) problème Ven 3 Avr 2015 - 16:38 | |
| Je te confirme qu'avec la version V09.25 le 2ème code que j'ai fournis plus haut, çà fonctionne parfaitement. On change la valeur de CLICKED par le programme. Bref, çà pose quand même un problème: Comment fait t'on pour réinitialiser la valeur de CLICKED(N) à zéro puisque OFF_CLICK N ne le fait pas On ne peut donc tester le bouton qu'une seule fois ???? Bon attendons de voir ce qu'en pense Jack. A+ | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: clicked(n) problème Ven 3 Avr 2015 - 16:59 | |
| Un truc intéressant:J'ai tenté un contournement, et voilà que j'arrive à faire des accès violations à tous les coups, puis un message "Abstract error" en cliquant tour à tour sur les boutons 1 et 2. Cette fois c'est dans les 2 versions Essayer le code suivant: - Code:
-
label clic init()
END clic: message "Bouton n°1="+str$(clicked(1))+" / Bouton n°2="+str$(clicked(2)) delete 1 : delete 2 : init() return
SUB init() button 1:caption 1,"bouton 1" : on_click 1,clic button 2:caption 2,"bouton 2" : on_click 2,clic : top 2,30 END_SUB
A+ | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: clicked(n) problème Ven 3 Avr 2015 - 17:00 | |
| Je pense que Jack pourrait clarifier le fonctionnement de la fonction CLICKED(n). La doc dit que cette fonction retourne 1 si l'objet a été cliqué, et 0 sinon. Rien n'est dit sur une éventuelle remise à zéro lors d'un clic sur un autre objet. En fait, une fois que l'objet a été cliqué, cette fonction retournera toujours 1, pour cet objet. Et je suis d'accord: ce n'est pas normal. Mais comment faire ? Le mieux serait peut-être que le fait d'appeler la fonction CLICKED(n) sur l'objet n mette à zéro l'indicateur interne, celui qui est utilisé par la fonction pour trouver la valeur à retourner. C'est à Jack de voir. Le problème est parfaitement mis en lumière ici: - Code:
-
label click1,click2 button 1 : top 1,10 : left 1,10 : caption 1,"bouton 1" : on_click 1,click1 button 2 : top 2,10 : left 2,110 : caption 2,"bouton 2" : on_click 2,click2 memo 3 : top 3,40 : left 3,10
end
click1: item_add 3,"" item_add 3,"click 1" item_add 3,"clicked(1)="+str$(clicked(1)) item_add 3,"clicked(2)="+str$(clicked(2)) return
click2: item_add 3,"" item_add 3,"click 2" item_add 3,"clicked(1)="+str$(clicked(1)) item_add 3,"clicked(2)="+str$(clicked(2)) return
| |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: clicked(n) problème Ven 3 Avr 2015 - 17:03 | |
| On s'est croisé. Ta tentative de supprimer et de recréer le bouton est vouée à l'échec également. En effet, tu fais cela dans la routine ON_CLICK du bouton que tu veux supprimer. Et lorsque l'exécution rencontre le RETURN, elle fait quoi ? Tu as coupé la branche sur laquelle tu étais assis ! | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: clicked(n) problème Ven 3 Avr 2015 - 17:05 | |
| Pourtant le N° d'objet est bien le même et il est créé avant le return A+ | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: clicked(n) problème Ven 3 Avr 2015 - 17:21 | |
| EUREKA ! - Code:
-
label clic init()
END clic: message "Bouton n°1="+str$(clicked(1))+" / Bouton n°2="+str$(clicked(2)) off_click 1 : off_click 2 : delete 1 : delete 2 init() return
SUB init() button 1:caption 1,"bouton 1" : on_click 1,clic button 2:caption 2,"bouton 2" : on_click 2,clic : top 2,30 END_SUB
Je pensais que DELETE N supprimait également le ON_CLICK N A+ | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: clicked(n) problème Ven 3 Avr 2015 - 17:32 | |
| Résultat: "Abstract error" et "access violation".
Tu peux le tourner comme tu veux, faire OFF_ERROR ou non. Tu n'as tout simplement pas le droit de supprimer un objet dans une routine qui a été lancée par cet objet. C'est clair et net, et ce n'est même pas Panoramic qui est en cause: c'est une restriction majeure de Windows. Il n'y a aucun moyen de contourner cela. Tant que tu es dans une section de code activée par un objet, tu ne peux pas supprimer cet objet.
Maintenant, je vais te donner le moyen de le faire quand-même. Définis un timer avec un délai sufisamment lmong (100 ms ou similaire). Maintenant, dans la routine ON_CLICK, immédiatement avant le RETURN, tu actives le timer. Et dans la routine du timer, tu peux supprimer le bouton initial, et le recréer.
Mais, franchement, quelle gymnastique pour contourner une limitation technique du système ? Ne serait-il pas plus judicieux de revoir l'organisation du programme ? Car, après tout, ces astuces ne sont absolument pas garanties de fonctionner dans l'avenir ! | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: clicked(n) problème Ven 3 Avr 2015 - 17:45 | |
| Tu as raison, je n'avais pratiquement plus d'accès violation, mais c'est revenu. - Citation :
- Tu n'as tout simplement pas le droit de supprimer un objet dans une routine qui a été lancée par cet objet. C'est clair et net, et ce n'est même pas Panoramic qui est en cause: c'est une restriction majeure de Windows. Il n'y a aucun moyen de contourner cela. Tant que tu es dans une section de code activée par un objet, tu ne peux pas supprimer cet objet.
Tu m'as peut-être trouvé le bug que j'ai toujours dans mon programme de compte. A+ | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: clicked(n) problème Ven 3 Avr 2015 - 17:46 | |
| | |
| | | Invité Invité
| Sujet: Re: clicked(n) problème Ven 3 Avr 2015 - 17:55 | |
| Bien revenons en arrière. L'un des tout premier programme que j'ai fait et publié, était :Jardin potager. Il se trouve à cette adresse: jardin potagerCe programme je l'ai commencé alors qu'on ne pouvait déclarer que 30 objets, et je ne sais plus 200 variables (y compris le nombre de ligne d'un tableau). Il a été débloqué sur les nombres d'objets et le reste pendant ce temps là. Ce programme utilisait clicked() pour savoir ce qui était cliqué. Number_click et beaucoup d'autre choses n'existaient pas. La commande clicked() servait justement a savoir ce qui était cliqué dans une boucle. Il était évident que la valeur revenait a 0 ensuite, sinon c'était fini, cela ne fonctionnait pas. Donc je répète: on clique sur un objet, et on peut voir si celui-ci est cliqué. Ensuite il revient à zéro, pour être de nouveau cliqué. C'est le fonctionnement normal de clicked(). Dans cette version il y a un BUG! Pour moi c'est le point final. Le seul contournement est de prendre une autre méthode pour l'instant. On a pas a essayer de réinitialiser cliqued(), cela doit-être automatique. Sur ce, je retourne au travail. |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: clicked(n) problème Ven 3 Avr 2015 - 18:01 | |
| Je suis d'accord avec Cosmos,Je rediffuse le message de Klaus qui finalement en arrive au même constat. - Klaus a écrit:
- Je pense que Jack pourrait clarifier le fonctionnement de la fonction CLICKED(n). La doc dit que cette fonction retourne 1 si l'objet a été cliqué, et 0 sinon. Rien n'est dit sur une éventuelle remise à zéro lors d'un clic sur un autre objet. En fait, une fois que l'objet a été cliqué, cette fonction retournera toujours 1, pour cet objet. Et je suis d'accord: ce n'est pas normal.
Mais comment faire ? Le mieux serait peut-être que le fait d'appeler la fonction CLICKED(n) sur l'objet n mette à zéro l'indicateur interne, celui qui est utilisé par la fonction pour trouver la valeur à retourner. C'est à Jack de voir. Le problème est parfaitement mis en lumière ici: - Code:
-
label click1,click2 button 1 : top 1,10 : left 1,10 : caption 1,"bouton 1" : on_click 1,click1 button 2 : top 2,10 : left 2,110 : caption 2,"bouton 2" : on_click 2,click2 memo 3 : top 3,40 : left 3,10
end
click1: item_add 3,"" item_add 3,"click 1" item_add 3,"clicked(1)="+str$(clicked(1)) item_add 3,"clicked(2)="+str$(clicked(2)) return
click2: item_add 3,"" item_add 3,"click 2" item_add 3,"clicked(1)="+str$(clicked(1)) item_add 3,"clicked(2)="+str$(clicked(2)) return
J'ajoute que ce même code remet CLICKED(N) à zéro sur le version V09.25 comme l'a constaté Bignono. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: clicked(n) problème Ven 3 Avr 2015 - 18:21 | |
| Entièrement d'accord avec Jean-Claude et Cosmos70. Cette version a un bug dans la fonction CLICKED(n). | |
| | | Contenu sponsorisé
| Sujet: Re: clicked(n) problème | |
| |
| | | | clicked(n) problème | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |