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 |
|
|
| clic droit sans DLL(simuler ON_RIGHT_CLICK) | |
| | Auteur | Message |
---|
silverman
Nombre de messages : 970 Age : 52 Localisation : Picardie Date d'inscription : 18/03/2015
| Sujet: clic droit sans DLL(simuler ON_RIGHT_CLICK) Ven 10 Avr 2015 - 17:31 | |
| Bonjour à tous, je sais que Klaus à ajouté cette possibilité dans sa DLL, mais je voulais en faire une version sans DLL(la Nième, sans doute ), histoire de m'entraîner en langage Panoramic. A tester sans modération - Code:
-
' Panoramic 0.9.25 ' ' ' Emuler ON_CLICK_RIGHT sans DLL ' ' ' Le numéro de l'objet cliqué est contenu dans la variable OBJECT_CLICKED ' sauf pour: OPEN_DIALOG/SAVE_DIALOG/MAIN_MENU/SUB_MENU/SOUND (retourne -1) ' ' ' V1.0 ' ' Silverman, avril 2015
' Variables/label nécessaire à la routine dim scankey,oldscankey,check_object,OBJECT_CLICKED,type_object,maxobj,right_clic ' Attention de ne pas oublier d'ajouter des "case V" dans ' la routine CHECK_RIGHT_CLICK label CHECK_RIGHT_CLICK ' Tester le clic droit 20 fois par seconde timer 1 : timer_interval 1,50 : on_timer 1,CHECK_RIGHT_CLICK
' Le code:
' ' Des objets... ' label incompatible,objet,numero,autre
main_menu 11 : ' Erreur(traité) sub_menu 12 : ' Erreur(traité) parent 12,11 caption 12,"Fichier"
alpha 100 top 100,200 : left 100,0 caption 100,"Scene2d (alpha)"
button 101 top 101,20 : left 101,0 caption 101,"Bouton"
check 102 top 102,60 : left 102,0 caption 102,"Check"
container 103 top 103,90 : left 103,0 caption 103,"Container"
container_option 104 : ' Numéro non détecté pour ce type d'objet top 104,90 : left 104,190 caption 104,"Container Options" option 105 : parent 105,104 top 105,24 : left 105,12 : caption 105,"OptionA" option 106 : parent 106,104 top 106,48 : left 106,12 : caption 106,"OptionB"
combo 107 : ' Numéro non détecté pour ce type d'objet top 107,23 : left 107,90 text 107,"Combo"
' dlist : ' objet invisible
edit 108 top 108,23 : left 108,250 text 108,"Edit"
' SECOND FORM : DEBUT form 208 width 208,640 : height 208,480 top 208,280 : left 208,450
command_target_is 208
grid 209 grid_write 209,1,1,"Grid" hint 209,"Ceci est un HINT"
hviewer 210 : ' Numéro non détecté pour ce type d'objet top 210,30 : left 210,380 alpha 211 top 211,10 : left 211,380 caption 211,"Hviewer"
' image 320 : ' objet invisible ' 2d_image_copy 320,0,0,100,100
list 212 top 212,140 : left 212,130 item_add 212,"Liste"
memo 213 top 213,140 : left 213,280 item_add 213,"Memo"
movie 214 : ' Numéro non détecté pour ce type d'objet color 214,255,255,255 top 214,280 : left 214,0 alpha 215 top 215,260 : left 215,0 caption 215,"Movie"
' open dialog : ' Erreur(traité)
option 216 top 216,150 : left 216,500 caption 216,"Option"
panel 217 top 217,250 : left 217,130 caption 217,"Panel"
picture 218 top 218,140 : left 218,0 print_target_is 218 print "picture" print_target_is 0
progress_bar 219 top 219,290 : left 219,350 alpha 220 top 220,270 : left 220,350 caption 220,"Progress bar"
' SECOND FORM : FIN command_target_is 0
' save dialog : ' Erreur(traité)
scene2d 315 top 315,220 : left 315,0
scene3d 316 top 316,10 : left 316,380 ' print_target_is 316 ' print "Scene3d" 3d_text 316,"Scene3d" cam_z_position 10 ' print_target_is 0
scroll_bar 317 : ' Numéro non détecté pour ce type d'objet top 317,240 : left 317,240
' sound : ' Erreur(traité)
spin 318 top 318,300 : left 318,240
' sprite 319 : ' L'objet ne répond pas au clic droit ' sprite_image_load 319,320
track_bar 321 : ' Numéro non détecté pour ce type d'objet top 321,360 : left 321,240
' alpha 322 top 322,220 : left 322,240 caption 322,"Scroll bar (alpha)" ' alpha 323 top 323,280 : left 323,240 caption 323,"Spin (alpha)" ' alpha 324 top 324,340 : left 324,240 caption 324,"Track bar (alpha)"
END
CHECK_RIGHT_CLICK: timer_off 1 ' On boucle jusqu'au numéro d'objet le plus élevé, donc faire attention ' a ne pas utiliser des numéro trop grand. L'ideal si le nombre d'objet ' ne varie pas, serait de les lister dans un tableau pour pouvoir les ' scanner encore plus rapidement. ' Non traité : lorsque l'on clique droit sur un objet d'un FORM et que ' l'on déclique sur l'autre FORM, le numéro renvoyé n'est pas toujours ' correct. Le code n'est pas conçu pour cette éventualité. ' (A voir avec avec mouse_x_right_down()). ' ' ' Pour un maximum de rapidité, on entre dans le IF si et seulement si le ' bouton droit de la souris viens juste d'être relâché. ' Du coup, le timer ne ralenti pas le code, peu importe le nombre d'objet. ' oldscankey=scankey : scankey=scancode ' Clic droit ? if scankey=0 and oldscankey=2 check_object=-1 maxobj=-1 OBJECT_CLICKED=-1 repeat ' Début du scan check_object=check_object+1 if object_exists(check_object)=1 ' Comptage du nb d'objet maxobj=maxobj+1 type_object=object_type(check_object) ' MOUSE_RIGHT_UP = erreur si objets de type 12,13,14,17,18 if type_object>11 and type_object<19 if type_object>14 and type_object<17 ' bin_or pour éviter les "pertes" de clics right_clic=bin_or(mouse_right_up(check_object),mouse_right_down(check_object)) if right_clic>0 then OBJECT_CLICKED=check_object end_if else if type_object<>-1 ' bin_or pour éviter les "pertes" de clics right_clic=bin_or(mouse_right_up(check_object),mouse_right_down(check_object)) if right_clic>0 then OBJECT_CLICKED=check_object end_if end_if end_if ' Arret du scan dès qu'un clic droit est détecté ou tous les objets scannés until right_clic>0 or maxobj=number_objects
' ' ' Traitement du clic ' ON_RIGHT_CLICK simulé, maintenant il faut choisir le sous-programme en ' fonction de l'objet cliqué.(Seulement 3 sous-programmes pour cette démo) select OBJECT_CLICKED case -1 : gosub incompatible case 0 : gosub objet case 1 : gosub objet case 2 : gosub objet case 100 : gosub objet case 101 : gosub objet case 102 : gosub objet case 103 : gosub objet case 104 : gosub objet case 105 : gosub objet case 106 : gosub objet case 107 : gosub objet case 108 : gosub objet case 208 : gosub autre case 209 : gosub autre case 210 : gosub autre case 211 : gosub autre case 212 : gosub autre case 213 : gosub autre case 214 : gosub autre case 215 : gosub autre case 216 : gosub autre case 217 : gosub autre case 218 : gosub autre case 219 : gosub autre case 220 : gosub autre case 315 : gosub numero case 316 : gosub numero case 317 : gosub numero case 318 : gosub numero case 319 : gosub numero case 320 : gosub numero case 321 : gosub numero case 322 : gosub numero case 323 : gosub numero case 324 : gosub numero end_select end_if timer_on 1 return
' Exemple incompatible: ' Affichage cls print "Le numéro de ce type d'objet n'est pas détecté!" return
objet: ' Affichage cls print "Sous programme 1 : Numéro Objet = ";OBJECT_CLICKED return
numero: ' Affichage cls print "Sous programme 2 : Numéro Objet = ";OBJECT_CLICKED return
autre: ' Affichage cls print "Sous programme 3 : Numéro Objet = ";OBJECT_CLICKED return
EDIT : Oups, c'est ON_RIGHT_CLICK que j'ai voulu simuler, corrigé le titre du sujet
Dernière édition par silverman le Sam 11 Avr 2015 - 11:43, édité 2 fois | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: clic droit sans DLL(simuler ON_RIGHT_CLICK) Sam 11 Avr 2015 - 1:35 | |
| - silverman a écrit:
- A tester sans modération
Donc, je teste sans savoir ce à quoi je m’attendrais ! Le résultat est un bon plantage, on ne peut plus total ! Après, je veux savoir le pourquoi du comment. Et voici mon diagnostic : Ligne 141 - Code:
-
print_target_is 316 L’objet 316 est un scene3d. Or la commande PRINT_TARGET_IS ne s’applique qu’à EDIT, MEMO, COMBO, FORM, LIST, PICTUREd'où l'erreur : Characters are too large or too many. Unable to create font texture. | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: clic droit sans DLL(simuler ON_RIGHT_CLICK) Sam 11 Avr 2015 - 3:01 | |
| Bon, j’ai compris enfin le but du programme. Maintenant, analysons ensemble : - Code:
-
objet: ' Affichage cls print "Objet = ";OBJECT_CLICKED return
numero: ' Affichage cls print "Objet = ";OBJECT_CLICKED return
autre: ' Affichage cls print "Objet = ";OBJECT_CLICKED return
Ces trois sous-programmes sont absolument identiques, alors on peut les réduire à un seul ! Et même s'en passer carrément. - Code:
-
select OBJECT_CLICKED case -1 : gosub incompatible case 0 : gosub objet case 1 : gosub objet case 2 : gosub objet case 100 : gosub objet case 101 : gosub objet case 102 : gosub objet case 103 : gosub objet case 104 : gosub objet case 105 : gosub objet case 106 : gosub objet case 107 : gosub objet case 108 : gosub objet case 208 : gosub autre case 209 : gosub autre case 210 : gosub autre case 211 : gosub autre case 212 : gosub autre case 213 : gosub autre case 214 : gosub autre case 215 : gosub autre case 216 : gosub autre case 217 : gosub autre case 218 : gosub autre case 219 : gosub autre case 220 : gosub autre case 315 : gosub numero case 316 : gosub numero case 317 : gosub numero case 318 : gosub numero case 319 : gosub numero case 320 : gosub numero case 321 : gosub numero case 322 : gosub numero case 323 : gosub numero case 324 : gosub numero end_select
Ici, on énumère tous les objets, et quelque soit l’objet, on se branche à l’un des trois sous-programmes qui sont (rappelons-le) identiques. On peut s’en passer carrément de cette série de CASE. Personnellement je n’aime pas trop la commande PRINT (et moins encore les LABEL , l’affreuse commande GOTO et un peu moins GOSUB) à quelques cas particuliers près !. D’ailleurs tous ces PRINT ne seront pas visibles parce que ce qu’elles sont censées afficher sera caché par les différents objets définis dans le programme. D’une manière générale, au lieu de PRINT, j’utilise personnellement ALPHA et aussi MESSAGE ; mais chacun est bien sûr, libre de coder comme bon lui semble ! Voici mon résultat final de simplification du code. Tu peux l'adopter ou non : ce n'est qu'une autre façon de raisonner. - Code:
-
' Panoramic 0.9.25 ' ' ' Emuler ON_CLICK_RIGHT sans DLL ' ' ' Le numéro de l'objet cliqué est contenu dans la variable OBJECT_CLICKED ' sauf pour: OPEN_DIALOG/SAVE_DIALOG/MAIN_MENU/SUB_MENU/SOUND (retourne -1) ' ' ' V1.0 ' ' Silverman, avril 2015
' Variables/label nécessaire à la routine dim scankey,oldscankey,check_object,OBJECT_CLICKED,type_object,maxobj,right_clic ' Attention de ne pas oublier d'ajouter des "case V" dans ' la routine CHECK_RIGHT_CLICK label CHECK_RIGHT_CLICK ' Tester le clic droit 20 fois par seconde timer 1 : timer_interval 1,50 : on_timer 1,CHECK_RIGHT_CLICK
' Le code:
' ' Des objets... '
main_menu 11 : ' Erreur(traité) sub_menu 12 : ' Erreur(traité) parent 12,11 caption 12,"Fichier"
alpha 100 top 100,200 : left 100,0 caption 100,"Scene2d (alpha)"
button 101 top 101,20 : left 101,0 caption 101,"Bouton"
check 102 top 102,60 : left 102,0 caption 102,"Check"
container 103 top 103,90 : left 103,0 caption 103,"Container"
container_option 104 : ' Numéro non détecté pour ce type d'objet top 104,90 : left 104,190 caption 104,"Container Options" option 105 : parent 105,104 top 105,24 : left 105,12 : caption 105,"OptionA" option 106 : parent 106,104 top 106,48 : left 106,12 : caption 106,"OptionB"
combo 107 : ' Numéro non détecté pour ce type d'objet top 107,23 : left 107,90 text 107,"Combo"
' dlist : ' objet invisible
edit 108 top 108,23 : left 108,250 text 108,"Edit"
' SECOND FORM : DEBUT form 208 width 208,640 : height 208,480 top 208,280 : left 208,450
command_target_is 208
grid 209 grid_write 209,1,1,"Grid" hint 209,"Ceci est un HINT"
hviewer 210 : ' Numéro non détecté pour ce type d'objet top 210,30 : left 210,380 alpha 211 top 211,10 : left 211,380 caption 211,"Hviewer"
' image 320 : ' objet invisible ' 2d_image_copy 320,0,0,100,100
list 212 top 212,140 : left 212,130 item_add 212,"Liste"
memo 213 top 213,140 : left 213,280 item_add 213,"Memo"
movie 214 : ' Numéro non détecté pour ce type d'objet color 214,255,255,255 top 214,280 : left 214,0 alpha 215 top 215,260 : left 215,0 caption 215,"Movie"
' open dialog : ' Erreur(traité)
option 216 top 216,150 : left 216,500 caption 216,"Option"
panel 217 top 217,250 : left 217,130 caption 217,"Panel"
picture 218 top 218,140 : left 218,0 ' print_target_is 218 ' print "picture" print_target_is 0
progress_bar 219 top 219,290 : left 219,350 alpha 220 top 220,270 : left 220,350 caption 220,"Progress bar"
' SECOND FORM : FIN command_target_is 0
' save dialog : ' Erreur(traité)
scene2d 315 : hint 315,"Scene2D" top 315,220 : left 315,0
scene3d 316 top 316,10 : left 316,380 : hint 316,"Scene3D" ' print_target_is 316 print "Scene3d" print_target_is 0
scroll_bar 317 : ' Numéro non détecté pour ce type d'objet top 317,240 : left 317,240
' sound : ' Erreur(traité)
spin 318 top 318,300 : left 318,240
' sprite 319 : ' L'objet ne répond pas au clic droit ' sprite_image_load 319,320
track_bar 321 : ' Numéro non détecté pour ce type d'objet top 321,360 : left 321,240
' alpha 322 top 322,220 : left 322,240 caption 322,"Scroll bar (alpha)" ' alpha 323 top 323,280 : left 323,240 caption 323,"Spin (alpha)" ' alpha 324 top 324,340 : left 324,240 caption 324,"Track bar (alpha)"
END
CHECK_RIGHT_CLICK:
timer_off 1 ' On boucle jusqu'au numéro d'objet le plus élevé, donc faire attention ' a ne pas utiliser des numéro trop grand. L'ideal si le nombre d'objet ' ne varie pas, serait de les lister dans un tableau pour pouvoir les ' scanner encore plus rapidement. ' Non traité : lorsque l'on clique droit sur un objet d'un FORM et que ' l'on déclique sur l'autre FORM, le numéro renvoyé n'est pas toujours ' correct. Le code n'est pas conçu pour cette éventualité. ' (A voir avec avec mouse_x_right_down()). ' ' ' Pour un maximum de rapidité, on entre dans le IF si et seulement si le ' bouton droit de la souris viens juste d'être relâché. ' Du coup, le timer ne ralenti pas le code, peu importe le nombre d'objet. ' oldscankey=scankey : scankey=scancode ' Clic droit ? if scankey=0 and oldscankey=2 check_object=-1 maxobj=-1 OBJECT_CLICKED=-1 repeat ' Début du scan check_object=check_object+1 if object_exists(check_object)=1 ' Comptage du nb d'objet maxobj=maxobj+1 type_object=object_type(check_object) ' MOUSE_RIGHT_UP = erreur si objets de type 12,13,14,17,18 if type_object>11 and type_object<19 if type_object>14 and type_object<17 ' bin_or pour éviter les "pertes" de clics right_clic=bin_or(mouse_right_up(check_object),mouse_right_down(check_object)) if right_clic>0 then OBJECT_CLICKED=check_object end_if else if type_object<>-1 ' bin_or pour éviter les "pertes" de clics right_clic=bin_or(mouse_right_up(check_object),mouse_right_down(check_object)) if right_clic>0 then OBJECT_CLICKED=check_object end_if end_if end_if ' Arret du scan dès qu'un clic droit est détecté ou tous les objets scannés until right_clic>0 or maxobj=number_objects
' ' ' Traitement du clic message "Objet = " + str$(OBJECT_CLICKED)
end_if timer_on 1 return
Pour conclure : Ton code comme tu l'as écrit est très bien pour quelqu'un qui vient de découvrir PANORAMIC depuis peu. Les remarques que j'ai faites c'est pour te montrer une autre façon de programmer et d'échanger nos points de vue. Bonne programmation avec Panoramic! | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: clic droit sans DLL(simuler ON_RIGHT_CLICK) Sam 11 Avr 2015 - 7:59 | |
| J'ai eu droit au même plantage, mais je n'ai pas cherché. J'ai pas le temps actuellement. Je vois que Silverman, commence à goûter la programmation avec Panoramic Au début, tu vas devoir t'entêter un peu, mais çà viendra. Les remarques de Papydall sont justes, sauf: - Papydall a écrit:
- Personnellement je n’aime pas trop la commande PRINT (et moins encore les LABEL , l’affreuse commande GOTO et un peu moins GOSUB) à quelques cas particuliers près !.
Je ne suis pas d'accord pour LABEL. Ou alors, explique comment tu gères les événements ON_CLICK, ON_CHANGE, et j'en passe, sans utiliser les LABEL(s). A+ | |
| | | silverman
Nombre de messages : 970 Age : 52 Localisation : Picardie Date d'inscription : 18/03/2015
| Sujet: Re: clic droit sans DLL(simuler ON_RIGHT_CLICK) Sam 11 Avr 2015 - 11:42 | |
| Le titre du sujet n'étant pas très clair, j'ai corrigé @papydall Le but du programme est écrit en ligne 4 - Citation :
Ligne 141
Code: print_target_is 316
L’objet 316 est un scene3d.
C'est étrange, ça fonctionne parfaitement sur mon PC, même avec la version 0.9.26i5(je suis sous windows XP, ce serait donc un pb d'OS? ). Et le print "Scene3d" s'affiche correctement. J'aurais dû utiliser 3d_text, je vais corriger ça. La série de case est volontaire(puisqu'on simule ON_RIGHT_CLICK), au départ il n'y avait que 3 objets(c'est pour ça qu'il y a 3 sous-programmes), puis j'en ai ajouté d'autre pour découvrir, et encore d'autre... @Jean Claude - Citation :
Je vois que Silverman, commence à goûter la programmation avec Panoramic Au début, tu vas devoir t'entêter un peu, mais çà viendra.
Je confirme, mais si Panoramic réagit différemment en fonction de l'OS, je n'ai pas fini de m'entêter @tous Code édité dans mon premir post, avec ajout de commentaires et suppression de la commande qui créé le plantage. | |
| | | Contenu sponsorisé
| Sujet: Re: clic droit sans DLL(simuler ON_RIGHT_CLICK) | |
| |
| | | | clic droit sans DLL(simuler ON_RIGHT_CLICK) | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |