FRANKI30
Nombre de messages : 28 Date d'inscription : 14/11/2010
| Sujet: definir une zone dans une image Dim 21 Nov 2010 - 19:14 | |
| label b,c picture 1 left 1,16 top 1,50 width 1,200
b: print mouse_x_position(1) print_locate 10,10 print mouse_y_position(1)
if mouse_x_position(1)>10 and mouse_x_position(1)<20 and mouse_left_down(1)=1 print "ok" goto c end_if
goto b c: terminate
veuillez excuser la prog a l'ancienne. Je souhaite definir une zone dns une image. lorsque je clique sur une zone x>10 et x<20 comme voulu ca fonctionne. Le probleme survient lorsque je supprime mes trois lignes de print qui me servaient a titre d'info. | |
|
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: definir une zone dans une image Dim 21 Nov 2010 - 19:33 | |
| J'ai la solutioin. Le problème, c'est que si tu enlèves les print, ton programme boucle uniquement en temps CPU et n'a AUCUN moyen d'interagir avec les périphériques comme la souris. Il suffit d'introduire une seule instruction DISPLAY et ton programme marche. Cette instruction a pour effet de suspendre l'exécution de Panoramic jusqu'à ce que toutes les entrées/sorties écran soient effectuées, et cela suffit. Voici le code qui marche: - Code:
-
label b,c picture 1 left 1,16 top 1,50 width 1,200
b: ' print mouse_x_position(1) ' print_locate 10,10 ' print mouse_y_position(1)
if (mouse_x_position(1)>10) and (mouse_x_position(1)<20) and (mouse_left_down(1)=1) print "ok" goto c end_if display goto b c: terminate
veuillez excuser la prog a l'ancienne. Je souhaite definir une zone dns une image. lorsque je clique sur une zone x>10 et x<20 comme voulu ca fonctionne. Le probleme survient lorsque je supprime mes trois lignes de print qui me servaient a titre d'info.
Mais rassure-toit: tu n'es pas le seul à tomber dans ce piège ! | |
|
dragonno
Nombre de messages : 341 Localisation : Près de Toulouse Date d'inscription : 22/01/2009
| Sujet: Re: definir une zone dans une image Dim 21 Nov 2010 - 22:10 | |
| Oulaaa, j'y serais tombé aussi, je savais pas ça pour panoramic, j'a jamais rencontré ce problème sur d'autres langages, bizarre.
Franky, donne des noms explicites à tes labels si tu veux avoir des habitudes de bon programmeur.
Sinon si tu as besoin de plusieurs zones clickables sur une image je t'expliquerais sinon ta solution suffit pour une zone.
| |
|
FRANKI30
Nombre de messages : 28 Date d'inscription : 14/11/2010
| Sujet: zone Dim 21 Nov 2010 - 22:27 | |
| Ok merci klaus. Je decouvre ce language que j'aime bien et qui me rappelle beaucoup le GFA Basic avec lequel j'avais l'habitude de programmer, je m'y remet doucement car panoramic est quand même different. En tout cas j'apprecis cette rapidité et solidarité, merci. | |
|
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: definir une zone dans une image Lun 22 Nov 2010 - 0:27 | |
| En fait, si tu reprends ton code initial, je te donne la clé pour comprendre ce qui se passe réellement. Quand tu dis à Panoramic de créer le picture 1, il le crée avec des dimensions par défaut, et en position (0,0). Tu le déplaces ensuite en (16,50). Mais curieusement, alors que dans ta version "avec print" ce déplacement est bien pris en compte, ce n'est plus du tout le cas dès que tu mets ces 3 lignes en commentaire. Pourquoi ? La mise à jour de l'écran, c'est-à-dire le réaffichage du picture apès déplacement prend un certain temps, certes court, mais réel. Or, ce travail est fait à une priorité nettement inférieure à tout ce qui touche l'exécution en unité centrale pure. Panoramic envoie la requête système pour le réaffichage, puis continue son traitement. Or, le traitement suivant SANS les print ne comprend plus aucune entrée/sortie et est donc hautement prioritaire sur tout le reste. Si tu avais une seule entrée/sortie dans ta boucle, même dans un fichier par exemple, tu ne te serais pas rendu compte du problème. Panoramic ne laisse tout simplement pas le temps à Windows de réafficher le picture à la nouvelle position, tout occupé qu'il est de tourner en rond dans ta boucle. Car contrairement à ce que tu peux penser, la fonction mouse_x_position n'est pas une entrée/sortie, mais retourne juste la valeur d'une propriété d'un objet windows (le picture) qui est actualisé automatiquement par windows lors du déplacement du curseur. Pourquoi ma solution marche ? Vu les explications précédentes, c'est clair: - Citation :
- la commande display gèle l'exécution du programme pendant le temps nécessaire à la mise à jour de la visualisation (l'écran). Puis, quand la visualisation est mise à jour, l'exécution du programme continue.
Voilà, il vaut mieux y penser quand on fait des boucles pour attendre. En réalité, ce qu'il aurait fallu faire, c'est ceci: - Code:
-
llabel b,c picture 1 left 1,16 top 1,50 width 1,200 timer 2 timer_interval 2,1 on_timer 2,b timer_on 2 on_click 1,b end
b: ' print mouse_x_position(1) ' print_locate 10,10 ' print mouse_y_position(1) timer_off 2 if mouse_x_position(1)>10 and mouse_x_position(1)<20 : ' and mouse_left_down(1)=1 print "ok" goto c end_if timer_on 2 return
c: terminate Comme tu peux voir, le programme crée le picture avec ses attributs, et le label b est transformé en sous-programme. Le programme crée aussi un timer qui se déclenche toutes les milli-secondes. La routine b est appelée par le timer et aussi quand un clique sur le picture. Dans les deux cas, donc, si le curseur se trouve dans la zone sensible, le programme se termine. Tu peux, soit cliquer directement dans la zone sensible, soit emmener le curseur doucement dessus, et le programme se terminera automatiquement. Il n'y a plus besoin de la commande display car après l'exécution de la commande end, Panoramic est en attente d'un évènement Windows, et toutes les mises à jours de l'écran sont faites à ce moment. Et les évènements windows qui nous intéressent ici, sont, d'une part, le clic sur le picture (par on_click b), et le déclenchement du timer (par on_timer b) d'autre part. Bel exemple de l'utilité du mode "évènement" en Panoramic ! | |
|
dragonno
Nombre de messages : 341 Localisation : Près de Toulouse Date d'inscription : 22/01/2009
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: definir une zone dans une image Lun 22 Nov 2010 - 1:40 | |
| Bien sûr, dragonno ! Mais pour la compréhension, je voulais "coller" le plus près possible du code original et juste apporter les modifs fonctionnelles nécessaires !
Il est évident que pour la lisibilité d'un programme, il est très important d'avoir des labels et des variables dont le nom exprime leur fonction. | |
|
dragonno
Nombre de messages : 341 Localisation : Près de Toulouse Date d'inscription : 22/01/2009
| Sujet: Re: definir une zone dans une image Lun 22 Nov 2010 - 1:53 | |
| Oui je m'étais douté que tu suivais le cheminement intellectuel du code exemple de Franki mais je voulais quand même préciser ma position | |
|
FRANKI30
Nombre de messages : 28 Date d'inscription : 14/11/2010
| Sujet: zone image Mar 23 Nov 2010 - 19:35 | |
| Bonjour klaus et merci, j'ai bien compris le fonctionnement. En ceux qui concerne les label pour le moment je l'ai nomme de cette facon car ce sont juste des essais, j'essaye de retrouver mes vieux reflex et prendre de nouvelles marques. En gfa Basic j'ecrivais des programmes de 8000 a 9000 lignes et la c'est sur qu'il vaut mieux tout noter mais je suis encore loin d'en arriver là. Enfin peu être un jour en tout cas merci pour les infos. | |
|
Contenu sponsorisé
| Sujet: Re: definir une zone dans une image | |
| |
|