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 |
|
|
| Message 'passant' | |
| | Auteur | Message |
---|
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Message 'passant' Dim 29 Juin 2014 - 18:18 | |
| La directive MESSAGE (et ses différentes variantes) affiche une information à l'écran, et met le programme en attente d'une confirmation de lecture de l'utilisateur. Le programme principal est donc interrompu et ne prend plus aucune autre commande. Et en particulier, s'il y a un Timer en cours, les 'interruptions' timer vont s'accumuler en attente d'exécution, et on risque très fortement le plantage par saturation (Runtime error ou autres joyeusetés). Il est possible d'afficher un message d'information ou d'alerte non bloquant, que l'utilisateur pourra acquitter quand il voudra sans perturber le fonctionnement du programme principal. Il faut pour ça créer un petit exécutable autonome, indépendant, qui gérera l'affichage du message et son 'acquittement'. Ce programme pourra être lancé par une petite sub depuis le programme principal, avec en paramètres la chaîne à afficher (plusieurs lignes éventuelles séparées par des rc/al), et sa position x,y dans l'écran. La sub d'appel devra connaître le chemin de cet exécutable, et également transformer la chaîne à afficher, en remplaçant ses caractères 'espace' par des '%' (par exemple) et ses retours chariot/interlignes par des '<' (par exemple), pour ne pas perturber le passage de paramètres, la chaîne étant reconstituée par l'exécutable d'affichage. D'abord l'exécutable autonome (que j'ai appelé finement Info.exe ): - Code:
-
' Affichage d'un message d'info: chaîne a$, en x,y de l'écran ' Appel: Info.exe "chaîne à afficher" 100 200 ' (dans la chaîne, les espaces et rcal sont remplacés par des caractères convenus) LABEL Quit DIM ce$,cr$,i%,a$,b$,x%,y%,lt%,ht%,wt% ce$ = "%": ' caractère de remplacement des espaces cr$ = "<": ' caractère de remplacement des rcal
IF PARAM_NUMBER < 3 THEN TERMINATE a$ = PARAM_VALUE$(1): x% = VAL(PARAM_VALUE$(2)): y% = VAL(PARAM_VALUE$(3)) BORDER_SMALL 0: TOP 0,y%: LEFT 0,x%: CAPTION 0," - INFO -" COLOR 0,180,200,230: ON_CLOSE 0,Quit LIST 1: FONT_NAME 1,"Arial": FONT_SIZE 1,10: COLOR 1,255,255,0 ht% = TEXT_HEIGHT(a$,1) FOR i% = 1 TO LEN(a$) IF MID$(a$,i%,1) = ce$ THEN a$ = LEFT$(a$,i%-1)+" "+MID$(a$,i%+1,500) NEXT i% wt% = 0 i% = INSTR(a$,cr$) WHILE i% > 0 b$ = LEFT$(a$,i%-1): IF TEXT_WIDTH(b$,1)>wt% THEN wt%=TEXT_WIDTH(b$,1) ITEM_ADD 1,b$: a$ = MID$(a$,i%+1,500) i% = INSTR(a$,cr$) END_WHILE IF TEXT_WIDTH(a$,1)>wt% THEN wt%=TEXT_WIDTH(a$,1) ITEM_ADD 1,a$ HEIGHT 1,(2+COUNT(1))*ht%+2: WIDTH 1,wt%*1.2+30 WIDTH 0,WIDTH(1)+16: HEIGHT 0,HEIGHT(1)+60 BUTTON 2: TOP 2,HEIGHT(0)-59: WIDTH 2,60: LEFT 2,WIDTH(0)/2-35: CAPTION 2,"OK": ON_CLICK 2,Quit END Quit: TERMINATE Puis la sub d'appel (Sub Info()...), avec un exemple d'utilisation: - Code:
-
DIM info$,a$ a$ = "Message d'information" a$=a$+CHR$(13)+CHR$(10)+"pour voir si ça marche"+CHR$(13)+CHR$(10)+"et voilà !" Info(a$,200,100) END
SUB Info(a$,x%,y%) ' Affichage d'une information 'passante': n'interrompt pas le programme appelant DIM_LOCAL info$,i%,rc$,ce$,cr$ info$ = "C:\PANORAMIC\Info.exe ": ' <======= chemin de l'exécutable rc$ = CHR$(13)+CHR$(10) ce$ = "%": ' caractère de remplacement des espaces cr$ = "<": ' caractère de remplacement des rcal FOR i% = 1 TO LEN(a$): ' remplacement des espaces IF MID$(a$,i%,1) = " " THEN a$ = LEFT$(a$,i%-1) + ce$ + MID$(a$,i%+1,500) NEXT i% i%=INSTR(a$,rc$): ' remplacement des rcal (cr$) WHILE i%>0: a$=LEFT$(a$,i%-1)+cr$+MID$(a$,i%+2,500): i%=INSTR(a$,rc$): END_WHILE EXECUTE info$ + chr$(34)+a$+ " " + STR$(x%)+" "+STR$(y%)+chr$(34): ' <========== END_SUB | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Message 'passant' Dim 29 Juin 2014 - 20:17 | |
| En effet c'est intéressant de travailler l'interaction entre 2 programmes Dans certains cas ça peut être pratique. Par exemple, un programme "serveur" de jeu qui enverrai des événements donnés à des clients sur le réseau, mais ce n'est qu'une idée parmi d'autres et les échanges peuvent être bi-directionnels | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Message 'passant' Dim 29 Juin 2014 - 21:39 | |
| On peut sans doute imaginer d'autres applications, mais mon idée a priori c'était de pouvoir afficher un message, ou des conseils, ou des directives pour une situation donnée sans bloquer le programme. Par exemple un utilisateur pourrait vouloir garder des directives (règles du jeu éventuellement) sous les yeux tout en exécutant une partie de programme et les libérer à son bon vouloir. (et je pensais surtout à ce timer bien utile mais de manipulation bien délicate...)
Dans mon cas il n'y a pas deux programmes mais un seul, le programme d'affichage bien qu'il soit indépendant n'étant en l'occurence qu'un outil du programme principal. | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Message 'passant' Dim 29 Juin 2014 - 21:45 | |
| Absolument, mais l'idée est applicable de manière bien plus large. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Message 'passant' Dim 29 Juin 2014 - 23:21 | |
| Une idée très simple pour afficher un message non bloquant: 1. crée une form cachée (par HIDE), mais positionnée l'endroit prévu 2. place un alpha ou un mémo sur cette form 3. pour afficher le message, mets le texte dans l'alpha ou le mémo, puis montre la form par SHOW
Rien n'est bloqué. Pas besoin de timer ou de programme externe. Simplement, lorsque tu veux effacer le message, ferme-le simplement par la croix rouge. A la limite, tu peux aussi y mettre un bouton "Fermer", dont la routine évènement fait simplement HIDE de la form.
Et lorsque tu veux afficher un autre message, remplace simplement le texte dans l'alpha ou le mémo et refais SHOW dfe la form. En effet, la croix rouge a pour seul effet de faire HIDE de la form, mais ne la supprime pas !
Et voilà - le tour est joué. | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Message 'passant' Dim 29 Juin 2014 - 23:29 | |
| Effectivement Klaus, ton système est beaucoup plus astucieux que le mien ! pas besoin de créer un exécutable particulier. Mais ce n'est pas forcément facile à mettre dans une sub. | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Message 'passant' Lun 30 Juin 2014 - 11:39 | |
| PS: Désolé, je viens de mieux regarder le code cette nuit et j'avais carrément répondu à côté de la plaque en regardant le principe de fonctionnement... Comme quoi, quand on lit trop vite on ferait mieux de se taire ... désolé ... | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Lun 30 Juin 2014 - 12:12 | |
| @ JL35, - Code:
-
Dim no%,FM%,Mes%
Form_message("Ceci est un message !") wait 2000 hide FM%
end
Sub Form_message(T$) if FM%>0 show FM% caption Mes%,T$ else no%=no%+1 : FM%=no% form FM% command_target_is 0 height FM%,150 width FM%,350 top FM%,(screen_y-height(FM%))/2 left FM%,(screen_x-width(FM%))/2 no%=no%+1 : Mes%=no% Alpha Mes% Parent Mes%,FM% Top Mes%,20 left Mes%,20 font_name Mes%,"arial" font_size Mes%,14 caption Mes%,T$ end_if end_sub Là, je ne passe que le texte en paramètres mais rien ne t' empêche de passer la couleur, les dimensions, etc.... | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Message 'passant' Lun 30 Juin 2014 - 14:06 | |
| En suivant les suggestions judicieuses de Klaus, j'ai fait quelque chose de bien plus simple, pas besoin d'exécutable externe, tout est embarqué dans la sub: - Code:
-
SUB Info(it$,xi%,yi%) ' Affichage d'un message 'passant' it$ en xi%,yi% de l'écran IF LABEL("Cs_nf")=0 LABEL Cs_nf: DIM Fs_nf Fs_nf=850: WHILE OBJECT_EXISTS(Fs_nf) = 1: Fs_nf=Fs_nf+1: END_WHILE FORM Fs_nf: BORDER_SMALL Fs_nf CAPTION Fs_nf," - INFO -" FONT_NAME Fs_nf,"Arial": FONT_SIZE Fs_nf,10: ON_CLOSE Fs_nf,Cs_nf MEMO Fs_nf+1: PARENT Fs_nf+1,Fs_nf: FULL_SPACE Fs_nf+1: COLOR Fs_nf+1,255,255,128 END_IF CLEAR Fs_nf+1: ITEM_ADD Fs_nf+1,it$: HEIGHT Fs_nf,15*COUNT(Fs_nf+1)+60 TOP Fs_nf,yi%: LEFT Fs_nf,xi% SHOW Fs_nf EXIT_SUB Cs_nf: HIDE Fs_nf RETURN END_SUB La Form d'affichage est créée une fois pour toutes, et réutilisée à chaque nouvel affichage (nouveau message). @ygeronimi je voulais un message qui reste à l'écran aussi longtemps que l'utilisateur le désire (mode d'emploi, directives, règles du jeu, liste quelconque, etc.), sans que ça bloque le fonctionnement normal du programme principal. C'est donc l'utilisateur qui doit décider de la fermeture. Dans ton exemple tu as de fortes chances d'avoir des conflits de numéros d'objets avec le programme (no% ?). Le message à afficher peut être long (plusieurs lignes), il faut donc chaque fois recalculer les dimensions de la fenêtre d'affichage. | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Message 'passant' Lun 30 Juin 2014 - 15:14 | |
| Merci pour celui qui, le premier, a eu l'idée d'un message non bloquant : j'ai nommé JL35. Merci pour celui qui a proposé une idée géniale pour le faire : j'ai nommé Klaus. Merci encore pour JL35 qui a mis l'idée de Klaus en SUB. Et moi, je participe par .... un exemple d'utilisation - Code:
-
label compte dim i,tex$ timer 100 : timer_interval 100,10 : timer_on 100 : on_timer 100,compte font_bold 0 : font_size 0,14 tex$ = " ***** Ce message ne bloque pas le TIMER.*****" tex$ = tex$ + " ********** Merci Klaus et JL35 ********** " tex$= tex$ + " Fermez cette fenêtre quand vouc voulez !!!!!" info(tex$,200,200) end compte: i = i + 1 : print_locate 100,100 : print "Compte : " + str$(i) return
rem ============================================================================ SUB Info(it$,xi%,yi%) ' Affichage d'un message 'passant' it$ en xi%,yi% de l'écran IF LABEL("Cs_nf")=0 LABEL Cs_nf: DIM Fs_nf Fs_nf=850: WHILE OBJECT_EXISTS(Fs_nf) = 1: Fs_nf=Fs_nf+1: END_WHILE FORM Fs_nf: BORDER_SMALL Fs_nf CAPTION Fs_nf," - INFO -" FONT_NAME Fs_nf,"Arial": FONT_SIZE Fs_nf,10: ON_CLOSE Fs_nf,Cs_nf MEMO Fs_nf+1: PARENT Fs_nf+1,Fs_nf: FULL_SPACE Fs_nf+1: COLOR Fs_nf+1,255,255,128 END_IF CLEAR Fs_nf+1: ITEM_ADD Fs_nf+1,it$: HEIGHT Fs_nf,15*COUNT(Fs_nf+1)+60 TOP Fs_nf,yi%: LEFT Fs_nf,xi% SHOW Fs_nf EXIT_SUB Cs_nf: HIDE Fs_nf RETURN END_SUB rem ============================================================================
| |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Message 'passant' Lun 30 Juin 2014 - 15:21 | |
| Voilà, tout est dit papydall, c'est exactement l'esprit de ce que je voulais faire.
Une petite remarque qui n'a rien à voir, mais qui concerne le timer: il semble que le timer soit le timer est actif dès sa déclaration, pas besoin de timer_on (qui n'est utile que pour relancer après un timer_off). Ce n'est pas précisé dans la doc, mais à savoir (remarque, le timer_on ne nuit pas, c'est juste qu'il faut savoir que le timer est tout de suite actif). De même, comme l'a fait remarquer Klaus, le clic sur la croix d'un (une ?) Form le cache mais ne le supprime pas, contrairement à la même chose sur le Form 0. | |
| | | mindstorm
Nombre de messages : 685 Age : 55 Localisation : charente Date d'inscription : 13/02/2013
| Sujet: Re: Message 'passant' Mer 2 Juil 2014 - 18:55 | |
| merci a tous c'est par de petite chose comme celle là que j’apprends le mieux. continuez
| |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Message 'passant' Mer 2 Juil 2014 - 19:26 | |
| - JL35 a écrit:
- De même, comme l'a fait remarquer Klaus, le clic sur la croix d'un (une ?) Form le cache mais ne le supprime pas, contrairement à la même chose sur le Form 0.
Personnellement j'opte pour UN FORM qui veut dire FORMulaire et non FORMe. Pour les autres objets (LIST, SCENE, OPTION, IMAGE, etc.) bien qu'ils soient du genre féminin, je pense (avis personnel! ) qu'il faille mieux les appeler au masculin! On dit bien UN objet LIST, UN objet IMAGE, UN objet SCENE, etc. En omettant le mot objet, on voit pourquoi je dit UN LIST. | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Message 'passant' Mer 2 Juil 2014 - 20:37 | |
| Tout à fait d'accord papydall pour le masculin générique des objets (on ne va pas se lancer dans des polémiques sur le genre, hein ? ). Merci pour ta remarque mindstorm, ça fait plaisir. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Message 'passant' Jeu 3 Juil 2014 - 2:12 | |
| Un tel message "non bloquant" affiché par une form peut aussi devenir "bloquant" quant aux accès aux objets de la form principale, tout en restant "non bloquant" pour les traitements qui continuent à s'exécuter en traitement de fond. Dans l'exemple ci-dessous, il y a deux boutons: "bloquant" et "non bloquant". Le bouton "non bloquant" lance un message comme celui dont on parle dans ce fil de discussion. La form 0 reste accessible. La preuve: en cliquant sur la croix rouge de la form 0, le programme s'arrête. Mais le bouton "bloquant" est différent. Il affiche toujours un message, mais cette fois, la form 0 est inaccessible tant que me message n'est pas fermé par la croix rouge. Cependant, le traitement de fon (l'affichage de l'heure, seconde par seconde, dans le titre de la form de message, continue sans être bloqué. Le tout est d'agir sur active/inactive de la form 0. C'est aussi simple que ça. Et on peut utiliser cette technique, non seulement pour afficher des messages, mais également pour afficher des fenêtres de saisie avec plusieurs champs à renseigner, avant de continuer le traitement normal. Bien sûr, dans ce cas, il faut aussi ajouter un bouton de validation à la form de saisie. Voici ma démo: - Code:
-
label close111, non_bloquant, bloquant, tick
form 111 : hide 111 : top 111,400 : left 111,400 memo 112 : parent 112,111 : full_space 112 : bar_both 112 on_close 111,close111
button 1 : top 1,10 : left 1,10 : width 1,200 caption 1,"Message non bloquant" on_click 1,non_bloquant
button 2 : top 2,40 : left 2,10 : width 2,200 caption 2,"Message bloquant" on_click 2,bloquant
timer 3 : timer_off 3 : timer_interval 3,1000 : on_timer 3,tick
end
close111: active 0 timer_off 3 return
non_bloquant: clear 112 item_add 112,"Ce message est non bloquant." show 111 timer_on 3 return bloquant: clear 112 item_add 112,"Ce message est bloquant." item_add 112,"Cependant, les traitements continuent." show 111 inactive 0 timer_on 3 return tick: timer_off 3 caption 111,time$ timer_on 3 return | |
| | | Contenu sponsorisé
| Sujet: Re: Message 'passant' | |
| |
| | | | Message 'passant' | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |