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 |
|
|
| Sortie de Sub intempestive | |
| | |
Auteur | Message |
---|
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Sortie de Sub intempestive Sam 18 Fév 2017 - 18:13 | |
| Je n'y comprends rien, c'est juste une ébauche de sub, en construction, non terminée, mais son comportement m'échappe: - Code:
-
PICTURE 10: FULL_SPACE 10
Des2Pic(10,WIDTH(0),0) Terminate ' ============================================================================== SUB Des2Pic(p%,x%,y%) ' Outil de dessin dans le picture p%, positionné en x%,y% IF LABEL("Quid") = 0 THEN LABEL Quid IF LABEL("Chco") = 0 THEN LABEL Chco IF LABEL("Desd") = 0 THEN LABEL Desd IF LABEL("Dest") = 0 THEN LABEL Dest IF LABEL("Desf") = 0 THEN LABEL Desf DIM_LOCAL f%,ff%,i,i1,j,k%,a$,co,pc,x0%,y0%,r,g,b DATA "Pal16",0,0,0,0,0,128,0,0,255,0,128,0,0,128,128,0,255,0,0,255,255,128,0,0 DATA 128,0,128,128,128,0,128,128,128,192,102,192,255,0,0,255,0,255,255,255,0,255,255,255 ff% = 0: f% = 950 FORM f%: TOP f%,y%: LEFT f%,x%: HEIGHT f%,480: BORDER_SMALL f%: WIDTH f%,100 FONT_NAME f%,"Arial": FONT_BOLD f%: COLOR f%,190,255,255 i=f%+1: ALPHA i: PARENT i,f%: TOP i,0: LEFT i,20: CAPTION i,"Ép. trait:" i=i+1: SPIN i: PARENT i,f%: TOP i,TOP(i-1)+15: LEFT i,20: WIDTH i,50 MIN i,1: MAX i,20: POSITION i,1 i=i+1: PICTURE i: PARENT i,f%: TOP i,TOP(i-1)+25:WIDTH i,WIDTH(f%)-17: pc = i HEIGHT i,50: k%=WIDTH(i)/8+1: ON_CLICK i,Chco: 2D_TARGET_IS i RESTORE: READ a$: WHILE a$<>"Pal16": READ a$: END_WHILE FOR j=0 TO 1 y% = 25*j FOR i1=0 TO 7 x% = i1*(k%-1): READ r: READ g: READ b: 2D_FILL_COLOR r,g,b 2D_RECTANGLE x%,y%,x%+k%,y%+24 NEXT i1 NEXT j i=i+1: PICTURE i: PARENT i,f%: TOP i,TOP(i-1)+HEIGHT(i-1)+3: WIDTH i,WIDTH(i-1)/2 LEFT i,20: HEIGHT i,16: COLOR i,0,0,0 i=i+1: CONTAINER_OPTION i: PARENT i,f%: TOP i,TOP(i-1)+25: WIDTH i,80: LEFT i,2 HEIGHT i,100: CAPTION i," - Figure: -": COLOR i,255,255,128: co = i i=i+1: OPTION i: PARENT i,co: TOP i,16: LEFT i,3: CAPTION i,"Point" i=i+1: OPTION i: PARENT i,co: TOP i,TOP(i-1)+16: LEFT i,LEFT(i-1): CAPTION i,"Trait" i=i+1: OPTION i: PARENT i,co: TOP i,TOP(i-1)+16: LEFT i,LEFT(i-1): CAPTION i,"Rectangle" i=i+1: OPTION i: PARENT i,co: TOP i,TOP(i-1)+16: LEFT i,LEFT(i-1): CAPTION i,"Cercle" i=i+1: OPTION i: PARENT i,co: TOP i,TOP(i-1)+16: LEFT i,LEFT(i-1): CAPTION i,"Remplir" MARK_ON co+2 i=i+1: BUTTON i: PARENT i,f%: TOP i,HEIGHT(f%)-65: LEFT i,WIDTH(f%)/2-45 CAPTION i,"Quitter": ON_CLICK i,Quid 2D_TARGET_IS p% x0% = -1: ON_MOUSE_DOWN p%,Desd r=0: g=0: b=0 WHILE ff% = 0: PAUSE 100: END_WHILE DELETE f%: EXIT_SUB ' ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Quid: ff% = 1 RETURN ' ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Chco: ' clic dans la zone x% = MOUSE_X_POSITION(pc): y% = MOUSE_Y_POSITION(pc) r=COLOR_PIXEL_RED(pc,x%,y%): g=COLOR_PIXEL_GREEN(pc,x%,y%): b=COLOR_PIXEL_BLUE(pc,x%,y%) 2D_TARGET_IS pc+1: 2D_FILL_COLOR r,g,b: 2D_RECTANGLE 0,0,WIDTH(pc+1),HEIGHT(pc+1) 2D_TARGET_IS p% RETURN ' ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Desd: ' clic dans la zone x% = MOUSE_X_POSITION(p%): y% = MOUSE_Y_POSITION(p%) IF CHECKED(co+1) = 1 2D_PEN_COLOR r,g,b: 2D_POINT x%,y% ELSE IF CHECKED(co+5) = 1: ' remplir 2D_FLOOD x%,y%,r,g,b ELSE x0% = x%: y0% = y% OFF_MOUSE_DOWN p%: ON_MOUSE_MOVE p%,Dest: ON_MOUSE_UP p%,Desf CLIPBOARD_COPY p% END_IF END_IF RETURN ' ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Dest: ' dessin intermédiaire CLIPBOARD_PASTE p% 2D_PEN_COLOR 0,0,0: 2D_PEN_DOT x% = MOUSE_X_POSITION(p%): y% = MOUSE_Y_POSITION(p%) IF CHECKED(co+2) = 1: ' trait 2D_LINE xO%,y0%,x%,y% ELSE IF CHECKED(co+3) = 1: ' rectangle 2D_RECTANGLE x0%,y0%,x%,y% ELSE IF CHECKED(co+4) = 1: ' cercle k% = (x%-x0%)/2 2D_CIRCLE x%+k%,y%+k%,k% END_IF END_IF END_IF RETURN ' ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Desf: ' dessin final OFF_MOUSE_UP p% CLIPBOARD_PASTE p% 2D_PEN_COLOR r,g,b: 2D_PEN_SOLID: 2D_PEN_WIDTH POSITION(f%+2) x% = MOUSE_X_POSITION(p%): y% = MOUSE_Y_POSITION(p%) IF CHECKED(co+2) = 1: ' trait 2D_LINE xO%,y0%,x%,y% ELSE IF CHECKED(co+3) = 1: ' rectangle 2D_RECTANGLE x0%,y0%,x%,y% ELSE IF CHECKED(co+4) = 1: ' cercle k% = (x%-x0%)/2 2D_CIRCLE x%+k%,y%+k%,k% END_IF END_IF END_IF ON_MOUSE_DOWN p%,Desd: x0% = -1 RETURN ' ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ END_SUB ' ============================================================================== Je clique dans la zone de dessin, et je suis aussitôt branché sur le début du programme appelant, avec: OBJECT ALREADY DEFINED Line 1
Dernière édition par JL35 le Sam 18 Fév 2017 - 19:53, édité 1 fois | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Sortie de Sub intempestive Sam 18 Fév 2017 - 18:28 | |
| Je vois que tu utilises TERMINATE à la place de END As-tu une raison particulière pour procéder ainsi ? Mais, ce n'est pas la cause du problème, j'ai cherché et je n'ai pas d'explication. A+ | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Sortie de Sub intempestive Sam 18 Fév 2017 - 18:47 | |
| Toujours pas trouvé le bug, mais j'ai trouvé ceci => OFF_MOUSE_DOWN et OFF_MOUSE_UP n'ont pas le numéro d'objet dans ton code et ce n'est pas signalé par Panoramic ? D'après la doc il faut écrire OFF_MOUSE_DOWN N .
A+ | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Sortie de Sub intempestive Sam 18 Fév 2017 - 19:32 | |
| Bonsoir Jean Claude, et merci à toi d'avoir regardé.
Le Terminate, c'est pour les essais, pour ne pas avoir à recliquer au retour de la sub pour fermer le Form 0.
Pour le OFF_MOUSE, je m'étais basé sur des notes que j'avais pris, incomplètes, et tu as raison, il faut ajouter le numéro d'objet concerné. Bizarre que l'éditeur ne le signale pas.
J'ai corrigé, mais le problème reste entier, pourquoi, même s'il y a des erreurs de structure (sans doute), est-ce que je suis rebranché à la ligne 1 du code ??? j'ai jamais vu ça... | |
| | | Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: Sortie de Sub intempestive Sam 18 Fév 2017 - 19:38 | |
| Salut à tous ! Sans certitude, pour moi c'est la boucle WHILE qui est fautive. Après avoir supprimé tout ce que je pouvais enlever : - Code:
-
PICTURE 10: FULL_SPACE 10
Des2Pic() Terminate ' ============================================================================== SUB Des2Pic() ' Outil de dessin dans le picture p%, positionné en x%,y%
IF LABEL("Desd") = 0 THEN LABEL Desd
DIM_LOCAL ff%
ON_MOUSE_DOWN 10,Desd
' WHILE ff% = 0: PAUSE 100: END_WHILE end Desd:
RETURN ' ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
END_SUB ' ============================================================================== Si tu remets la boucle WHILE en service, on retrouve le plantage. | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Sortie de Sub intempestive Sam 18 Fév 2017 - 19:45 | |
| Je ne vois pas bien pourquoi, c'est une structure que j'utilise couramment dans des subs pour me mettre en attente d'événement, en l'occurence le clic sur 'OK'.
Et ton 'end' au milieu de la sub, c'est bizarre... Ça termine le programme et il ne se passe plus rien, évidemment. | |
| | | Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: Sortie de Sub intempestive Sam 18 Fév 2017 - 19:47 | |
| Désolé, le END, c'était pour faire des essais.
Edit : En remplaçant le ON_MOUSE_DOWN par un ON_CLICK, je n'ai pas de plantage.
Serait-ce un bug de la fonction ON_MOUSE_DOWN Panoramic ?
Dernière édition par Marc37 le Sam 18 Fév 2017 - 19:58, édité 1 fois | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Sortie de Sub intempestive Sam 18 Fév 2017 - 19:55 | |
| J'ai corrigé 2 ou 3 bricoles là-haut, mais ça ne change rien au problème.
Intéressant, je vais regarder.
Mais l'embêtant c'est que pour cet usage ce n'est pas intéressant, le ON_CLICK ne réagit pas au click lui-même mais au relâchement du bouton... | |
| | | Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: Sortie de Sub intempestive Sam 18 Fév 2017 - 20:35 | |
| Dans mon programme de jeu des 6 palets, - Citation :
- https://panoramic.1fr1.net/t5052-le-jeu-des-6-palets
alors que la fonction ON_MOUSE_DOWN n’existait pas, j’avais utilisé dans ma boucle WHILE : - Code:
-
WHILE 0=0 G%= MOUSE_LEFT_UP(10) F%= MOUSE_LEFT_DOWN(10) IF F% = 1 THEN Zone_cliquee() END_WHILE
| |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Sortie de Sub intempestive Sam 18 Fév 2017 - 20:50 | |
| C'est intéressant, il me semble que j'ai déjà utilisé ce genre de structure (avec toutefois une pause quelque part dans la boucle, sinon ça tourne à toute vitesse). Je vais sans doute finir par faire quelque chose comme ça, mais je suis quand même intrigué par mon programme qui reboucle sur la ligne 1 ... Merci en tout cas Marc pour tes remarques et tes suggestions bienvenues | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Sortie de Sub intempestive Sam 18 Fév 2017 - 21:20 | |
| Je ne me suis pas plongé dans ce code - dès qu'il y a une boucle avec PAUSE, je deviens méfiant. J'ai fait un petit code qui permet de dessiner dans un picture, à main levée, à l'aide de la souris. Enfoncez la touche gauche et maintenez enfoncée pendant le tracé, et relâchez pour déplacer vers un autre point de départ. - Code:
-
label down, up, move dim move%, x%, y% picture 1 : full_space 1 2d_target_is 1 on_mouse_down 1,down on_mouse_up 1,up on_mouse_move 1,move end
down: move% = 1 x% = mouse_x_left_down(1) y% = mouse_y_left_down(1) caption 0,"down "+str$(x%)+","+str$(y%) 2d_poly_from x%,y% return
up: move% = 0 return
move: if move%=1 move% = 0 x% = mouse_x_position(1) y% = mouse_y_position(1) caption 0,"move "+str$(x%)+","+str$(y%) 2d_poly_to x%,y% move% = 1 end_if return
Voici l'utilisation correcte de ces évènements. | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Sortie de Sub intempestive Sam 18 Fév 2017 - 21:32 | |
| Chapeau pour la démo Klaus, ça marche impeccable ! et en si peu de lignes...
Finalement je laisse tomber mon système, trop tordu et que je ne maîtrise pas, apparemment. Je vais m'inspirer de ce que tu as fait. Merci à toi pour le partage. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Sortie de Sub intempestive Dim 19 Fév 2017 - 10:42 | |
| Tiens - cadeau ! Voici comment tracer des rectangles: cliquer sur le point de départ, puis, en gardant la touche enfoncée, tirer la souris pour obtenir le réctangle voulue. Deux combos permettent de choisir entre dession libre et rectangle: - Code:
-
label down, up, move dim move%, x%, y%, x1%, y1% picture 1 : full_space 1 : height 1,height(1)-40 : top 1,40 image 2 option 11 : top 11,10 : left 11,10 : caption 11,"Dessin libre" option 12 : top 12,10 : left 12,100 : caption 12,"Rectangle" mark_on 11 2d_target_is 1 on_mouse_down 1,down on_mouse_up 1,up on_mouse_move 1,move end
down: x% = mouse_x_left_down(1) y% = mouse_y_left_down(1) caption 0,"down "+str$(x%)+","+str$(y%) 2d_poly_from x%,y% if checked(12)=1 then 2d_image_copy 2,0,0,width(1),height(1) display move% = 1 return
up: move% = 0 return
move: if move%=1 move% = 0 x1% = mouse_x_position(1) y1% = mouse_y_position(1) caption 0,"move "+str$(x1%)+","+str$(y1%) if checked(12)=1 2d_image_paste 2,0,0 2d_poly_from x%,y% 2d_poly_to x%,y1% 2d_poly_to x1%,y1% 2d_poly_to x1%,y% 2d_poly_to x%,y% else 2d_poly_to x1%,y1% end_if move% = 1 end_if return
| |
| | | Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: Sortie de Sub intempestive Dim 19 Fév 2017 - 11:17 | |
| J'en profite ! Merci Klaus ! | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Sortie de Sub intempestive Dim 19 Fév 2017 - 11:55 | |
| Dernière amélioration: 3 modes de dessin: tracé à main libre, rectangle transparent, rectangle opaque: - Code:
-
label down, up, move dim move%, x%, y%, x1%, y1% picture 1 : full_space 1 : height 1,height(1)-40 : top 1,40 image 2 option 11 : top 11,10 : left 11,10 : caption 11,"Dessin libre" option 12 : top 12,10 : left 12,100 : caption 12,"Rectangle" option 13 : top 13,10 : left 13,190 : caption 13,"Rectangle plein" mark_on 11 2d_target_is 1 on_mouse_down 1,down on_mouse_up 1,up on_mouse_move 1,move end
down: x% = mouse_x_left_down(1) y% = mouse_y_left_down(1) caption 0,"down "+str$(x%)+","+str$(y%) 2d_poly_from x%,y% if checked(11)=0 then 2d_image_copy 2,0,0,width(1),height(1) display move% = 1 return
up: move% = 0 return
move: if move%=1 move% = 0 x1% = mouse_x_position(1) y1% = mouse_y_position(1) caption 0,"move "+str$(x1%)+","+str$(y1%) if checked(11)=1 2d_poly_to x1%,y1% end_if if checked(12)=1 2d_image_paste 2,0,0 2d_poly_from x%,y% 2d_poly_to x%,y1% 2d_poly_to x1%,y1% 2d_poly_to x1%,y% 2d_poly_to x%,y% end_if if checked(13)=1 2d_image_paste 2,0,0 2d_rectangle x%,y%,x1%,y1% end_if move% = 1 end_if return
A partir de là, il est facile d'ajouter des cercles/ellipses, couleurs et épaisseurs de tracé, couleurs de remplissage etc. Mais le principe de dessin avec la souris est bien établ. | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Sortie de Sub intempestive Dim 19 Fév 2017 - 13:24 | |
| - Mon explication:
Dans la programmation événementielle (qui s’oppose à la programmation séquentielle), le programme est défini par les réactions qu’il déclenche suite aux différents événements qui peuvent se produire. Comme événement, on peut citer : Les événements liés aux périphériques. * Clic de souris sur un bouton * Frappe au clavier * Sélection d’un item dans une liste * Entrée / sortie du curseur dans une fenêtre, * etc. …
Les événements liés aux applications et au système * Création / ouverture / chargement / fermeture / destruction de fenêtre * Validation d’une boîte de dialogue * tic d’horloge * etc. …
Le système gère en interne une boucle principale divisée en deux sections : • La première section détecte les événements ; • La seconde gère ces mêmes événements.
Le traitement d’un événement ne peut pas être interrompu par un autre, sauf dans des cas précis prédéterminés explicitement, ce qui va créer une autre boucle événementielle à l’intérieur de la première.
Les événements sont placés dans une queue (FIFO : First In First Out : premier entré premier sorti). La boucle de gestion des événements prend les événements dans la queue et les traite.
Gestion événementielle : Action de l’utilisateur dans un composant graphique : ----- > Création d’un événement. Exemples : • Fermer une fenêtre ----- > événement « fenêtre » • Cliquer sur un bouton, faire un choix dans un menu, etc. ----- > événement « action » • Bouger la souris, cliquer sur son bouton gauche, etc. ----- > événement « souris » Pour être prévenu de l’arrivée d’un événement et pouvoir y réagir, tout composant graphique (bouton, zone de texte, etc.) se déclare « à l’écoute » de l’événement. Ce composant s’appelle la source. Pour bien faire son boulot, il doit se lier à un écouteur d’événement à qui il va déléguer le traitement de l’événement. L’écouteur s’appelle la cible.
Voici comment ça se passe : Lorsqu’un événement se produit dans un composant, deux cas peuvent se présenter : 1) Le composant ne s’est pas déclaré à l’écoute de cet événement : ----- > rien ne se passe. 2) Le composant s’est déclaré à l’écoute de cet événement en s’associant à un écouteur de ce type d’événement : ----- >cet écouteur est prévenu et réagit en conséquence.
A retenir : • Les interfaces graphiques reposent sur les principes de la programmation événementielle • Un événement peut être déclenché par l’utilisateur (clic de souris, sélection, …) , mais aussi par le système (chargement ou fermeture d’une feuille, top d’horloge …). • Le système capte ces différents événements et les traite dans leur ordre d’arrivée. Le programmeur prévoit le traitement à effectuer lorsque l’événement se produit. • Les instructions à exécuter sont regroupées dans une procédure événementielle (ou gestionnaire d’événement) que l’on associe au composant concerné par l’événement.
Pour revenir sur le code de JL35.
Le code appelle une fois la procédure (sous-programme) SUB Des2Pic(p%,x%,y%) Et prévoit de se terminer ensuite par terminate lorsque la Sub se termine.
Tout semble correct, mais …. La SUB en question contient en son sein la déclaration des événements ON_CLICK et ON_MOUSE_Down Ces événements n’arrêtent pas l’exécution de la SUB et celle-ci va exécuter toutes les instructions qu’elle contient. Arrivé à END_SUB, la procédure rend la main au programme principal. La boucle principale gérée par le système qui, rappelons-le, détecte les événement et les gèrent se rend compte qu’un événement (Clic dans le Picture) vient de se produire et tente de le gérer. Or le programme n’est plus dans la SUB et tous les objets locaux créés dans la SUB sont détruits et principalement p% (paramètre de la SUB et qui désigne le PICTURE 10) Le gestionnaire d’événement se trouve perdu et il se venge par un message d’erreur !!!
Mon point de vue qui n’engage que moi : Eviter à tout prix de définir des événements et leurs gestions dans le même sous-programme. On peut définir les événements dans un sous-programme, mais leurs gestions doivent se faire en dehors de ce même sous-programme. Personne n’est obligé de suivre cette méthode, mais il faut bien se rendre à l’évidence.
| |
| | | Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| | | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Sortie de Sub intempestive Dim 19 Fév 2017 - 15:31 | |
| Merci d'abord à Klaus pour son bout de programme bien intéressant, je vais me faire un plaisir de m'en inspirer. Et merci à Papydall pour sa dissertation. Je remarque toutefois ceci: tu dis que l'exécution de la sub se poursuit jusqu'au End_Sub et sortie, et donc s'il se produit un événement ensuite le programme ne sait plus le traiter... Or, l'exécution s'arrête bien (théoriquement) à l'intérieur de la sub, dans la boucle d'attente qui teste le changement d'état de ff%, positionné par l'appui sur la touche 'Quitter'. Logiquement on ne peut sortir de cette boucle (et exécuter l'Exit_Sub) que quand cet indicateur est positionné. Je subodore un conflit entre deux attentes d'événements, ma boucle avec Pause, et les ON_MOUSE qui sont en surveillance permanente quelque part. Bon, je ne mets pas 'Résolu', mais j'abandonne ce système, je vais voir du côté de chez l'ami Klaus. PSEt finalement, en regardant un peu dans mes archives, j'avais fait quelque chose qui fonctionnait très bien avec les nouvelles fonctions ON_MOUSE: https://panoramic.1fr1.net/t5062-encore-du-dessindonc je ne vais pas réinventer l'eau chaude. Ce que j'essayais de faire, c'est de les actionner à l'intérieur d'une Sub, et jusqu'à preuve du contraire ça semble incompatible. On dirait que le ON_MOUSE, déclenché depuis une Sub, rend la main après traitement de l'événement au programme principal, et non pas à la Sub active, en court-circuitant celle-ci, du coup ça fait n'importe quoi. | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Sortie de Sub intempestive Mer 1 Mar 2017 - 16:16 | |
| @Klaus, Je remonte ce vieux (?) sujet, il me semble qu'il y a quand même quelque chose qui ne va pas avec les nouvelles fonctions ON_MOUSE. Dans ma sub à moi je pars tout de suite en erreur. Mais si je reprends ton dernier code tel quel, option 'Rectangle' Je trace des rectangles successifs, et je finis toujours par tomber dans l'erreur signalée plus haut ça arrive en général au bout d'entre 1 et 10 ou 15 rectangles successifs, et ça semble indiquer que dans ce cas le traitement d'événement par Panoramic se rebranche en tout début de programme. Je ne l'ai pas reproduit avec l'option 'Dessin libre', mais là le traitement est différent. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Sortie de Sub intempestive Mer 1 Mar 2017 - 16:42 | |
| Il y a effectivement un problème. J'ai modifié le code comme suit: - Code:
-
message "démarrage" label down, up, move dim x%, y%, x1%, y1% picture 1 : full_space 1 : height 1,height(1)-40 : top 1,40 image 2 option 11 : top 11,10 : left 11,10 : caption 11,"Dessin libre" option 12 : top 12,10 : left 12,100 : caption 12,"Rectangle" option 13 : top 13,10 : left 13,190 : caption 13,"Rectangle plein" mark_on 12 2d_target_is 1 on_mouse_down 1,down on_mouse_up 1,up end
down: x% = mouse_x_left_down(1) y% = mouse_y_left_down(1) caption 0,"down "+str$(x%)+","+str$(y%) 2d_poly_from x%,y% if checked(11)=0 then 2d_image_copy 2,0,0,width(1),height(1) display on_mouse_move 1,move return
up: off_mouse_move 1 return
move: off_mouse_move 1 x1% = mouse_x_position(1) y1% = mouse_y_position(1) caption 0,"move "+str$(x1%)+","+str$(y1%) if checked(11)=1 2d_poly_to x1%,y1% end_if if checked(12)=1 2d_image_paste 2,0,0 2d_poly_from x%,y% 2d_poly_to x%,y1% 2d_poly_to x1%,y1% 2d_poly_to x1%,y% 2d_poly_to x%,y% end_if if checked(13)=1 2d_image_paste 2,0,0 2d_rectangle x%,y%,x1%,y1% end_if display on_mouse_move 1,move return C'est plus simple et cela améliore la situation,, mais ce n'est pas une solution pour autant. Ce qui se passe, c'est que le programme repart en ligne 1, comme lors d'un démarrage initial ! C'est complètement anormal; et je pense qu'il s'agit bien d'un bug au niveau de la gestion des évènements MOUSE_MOVE et MOUSE_UP. MOUSE_DOWN n'est pas concerné. Il faudrait que Jack puisse jeter un coup d'oeil... EDIT J'ai ajouté un message qui prouve le redémarrage anormal ! | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Sortie de Sub intempestive Mer 1 Mar 2017 - 16:56 | |
| Merci Klaus d'avoir regardé, ça me rassure (si on peut dire...), il n'y a pas que moi. Et je pense effectivement à un bug dans le traitement de ces fonctions, même dans le programme principal (en non pas seulement dans une sub, comme je l'ai cru). Et ton code le met bien en évidence.
J'espère que Jack pourra y jeter un coup d'oeil, parce que ces fonctions sont vraiment intéressantes.
Merci à toi en tout cas. | |
| | | silverman
Nombre de messages : 970 Age : 52 Localisation : Picardie Date d'inscription : 18/03/2015
| Sujet: Re: Sortie de Sub intempestive Mer 1 Mar 2017 - 23:19 | |
| Voici un code qui fonctionne parfaitement; - Code:
-
message "démarrage" label down, up, move dim x%, y%, x1%, y1% picture 1 : full_space 1 : height 1,height(1)-40 : top 1,40 image 2 option 11 : top 11,10 : left 11,10 : caption 11,"Dessin libre" option 12 : top 12,10 : left 12,100 : caption 12,"Rectangle" option 13 : top 13,10 : left 13,190 : caption 13,"Rectangle plein" mark_on 12 2d_target_is 1 on_mouse_down 1,down ' on_mouse_up 1,up end
down: off_mouse_down 1 x% = mouse_x_left_down(1) y% = mouse_y_left_down(1) caption 0,"down "+str$(x%)+","+str$(y%) 2d_poly_from x%,y% if checked(11)=0 then 2d_image_copy 2,0,0,width(1),height(1) display on_mouse_move 1,move return
up: return
move: if mouse_left_up(1)=0 :' bouton gauche de la souris pas relaché off_mouse_move 1 x1% = mouse_x_position(1) y1% = mouse_y_position(1) caption 0,"move "+str$(x1%)+","+str$(y1%) if checked(11)=1 2d_poly_to x1%,y1% end_if if checked(12)=1 2d_image_paste 2,0,0 2d_poly_from x%,y% 2d_poly_to x%,y1% 2d_poly_to x1%,y1% 2d_poly_to x1%,y% 2d_poly_to x%,y% end_if if checked(13)=1 2d_image_paste 2,0,0 2d_rectangle x%,y%,x1%,y1% end_if display on_mouse_move 1,move else off_mouse_move 1 on_mouse_down 1,down end_if
return La ligne 12 et son évènement associé ne servent plus à rien, mais si on enlève le 'rem', ça crash. C'est comme si il se produisait un évènement dans l'évènement. | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Sortie de Sub intempestive Mer 1 Mar 2017 - 23:39 | |
| Merci silverman, intéressant, je vais regarder ça de près, mais peut-être pas avant demain. | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Sortie de Sub intempestive Jeu 2 Mar 2017 - 0:00 | |
| Ajouter au s/p up : … - Code:
-
Off_mouse_up 1
… et ça ne crash plus. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Sortie de Sub intempestive Jeu 2 Mar 2017 - 0:02 | |
| Parfait, Silverman ! Tu as mis le doigt sur une solution du problème. Je garde.
Ceci dit, j'aimerais bien comprendre pourquoi la solution avec ON_MOUSE_UP ne marche pas... | |
| | | Contenu sponsorisé
| Sujet: Re: Sortie de Sub intempestive | |
| |
| | | | Sortie de Sub intempestive | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |