FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  GroupesGroupes  Connexion  
Derniers sujets
» Synedit Parameters
par Yannick Aujourd'hui à 0:27

» Code à vérifier SVP (Oups ! résolu)
par Jean Claude Hier à 21:16

» Compilateur FBPano
par jean_debord Hier à 9:56

» Bienvenue à Virtualalan !
par UltraVox Hier à 9:18

» Concours de Morpions
par jjn4 Hier à 0:04

» ShortName$(F) [Cloturé]
par papydall Mer 21 Juin 2017 - 16:19

» Remplacer espace par tiret dans noms des dossiers / fichiers
par papydall Mer 21 Juin 2017 - 15:27

» Menu personalisé avec icones et menu contextuel
par Laurent (Minibug) Mer 21 Juin 2017 - 12:44

» La liste des choses à faire ...
par Jack Mar 20 Juin 2017 - 22:49

» Quoi de neuf à propos de Goric 3D ? (@Jack)
par UltraVox Mar 20 Juin 2017 - 21:06

» Nom court et anti fenetre dos
par silverman Mar 20 Juin 2017 - 18:31

» Ludothèque Panoramic
par jjn4 Mar 20 Juin 2017 - 18:09

» Proposition à la communauté
par Yannick Mar 20 Juin 2017 - 15:02

» >199
par maelilou Mar 20 Juin 2017 - 14:13

» NUMBER_FOCUS
par Yannick Lun 19 Juin 2017 - 15:25

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Juin 2017
LunMarMerJeuVenSamDim
   1234
567891011
12131415161718
19202122232425
2627282930  
CalendrierCalendrier

Partagez | 
 

 Message 'passant'

Voir le sujet précédent Voir le sujet suivant Aller en bas 
AuteurMessage
JL35



Nombre de messages : 5882
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Message 'passant'   Dim 29 Juin 2014 - 19: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  Very Happy ):
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
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Jicehel

avatar

Nombre de messages : 5837
Age : 44
Localisation : 77500
Date d'inscription : 19/04/2011

MessageSujet: Re: Message 'passant'   Dim 29 Juin 2014 - 21: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
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
JL35



Nombre de messages : 5882
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: Message 'passant'   Dim 29 Juin 2014 - 22: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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Jicehel

avatar

Nombre de messages : 5837
Age : 44
Localisation : 77500
Date d'inscription : 19/04/2011

MessageSujet: Re: Message 'passant'   Dim 29 Juin 2014 - 22:45

Absolument, mais l'idée est applicable de manière bien plus large.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 9964
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Message 'passant'   Lun 30 Juin 2014 - 0: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é.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
JL35



Nombre de messages : 5882
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: Message 'passant'   Lun 30 Juin 2014 - 0: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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Jicehel

avatar

Nombre de messages : 5837
Age : 44
Localisation : 77500
Date d'inscription : 19/04/2011

MessageSujet: Re: Message 'passant'   Lun 30 Juin 2014 - 12: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é ...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Yannick

avatar

Nombre de messages : 7809
Age : 46
Localisation : Bretagne
Date d'inscription : 15/02/2010

MessageSujet: re   Lun 30 Juin 2014 - 13: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....
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
JL35



Nombre de messages : 5882
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: Message 'passant'   Lun 30 Juin 2014 - 15: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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
papydall

avatar

Nombre de messages : 5384
Age : 66
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

MessageSujet: Re: Message 'passant'   Lun 30 Juin 2014 - 16:14

Merci pour celui qui, le premier, a eu l'idée d'un message non bloquant : j'ai nommé JL35.Laughing 
Merci pour celui qui a proposé une idée géniale pour le faire : j'ai nommé Klaus.Laughing 
Merci encore pour JL35 qui a mis l'idée de Klaus en SUB.Laughing 

Et moi, je participe par .... un exemple d'utilisation  Embarassed

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 ============================================================================
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://papydall-panoramic.forumarabia.com/
JL35



Nombre de messages : 5882
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: Message 'passant'   Lun 30 Juin 2014 - 16: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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
mindstorm

avatar

Nombre de messages : 530
Age : 48
Localisation : charente
Date d'inscription : 13/02/2013

MessageSujet: Re: Message 'passant'   Mer 2 Juil 2014 - 19:55

merci a tous
c'est par de petite chose comme celle là que j’apprends le mieux.
continuez
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
papydall

avatar

Nombre de messages : 5384
Age : 66
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

MessageSujet: Re: Message 'passant'   Mer 2 Juil 2014 - 20: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!  Wink ) 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.  Laughing
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://papydall-panoramic.forumarabia.com/
JL35



Nombre de messages : 5882
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: Message 'passant'   Mer 2 Juil 2014 - 21: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 ?  Very Happy ).

Merci pour ta remarque mindstorm, ça fait plaisir.  Smile 
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 9964
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Message 'passant'   Jeu 3 Juil 2014 - 3: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
 
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Contenu sponsorisé




MessageSujet: Re: Message 'passant'   

Revenir en haut Aller en bas
 
Message 'passant'
Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» [Résolu]peux t'on modifier un message déjà envoyé
» [Résolu] Outlook Express : impossible de supprimer le message
» Un icône de nouveau message plus voyant
» Message d'erreur pas de vitesse
» [Résolu] OE6 : message bizarre

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: PANORAMIC 32 bits :: Vos sources, vos utilitaires à partager-
Sauter vers: