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
» Logiciel de soutien scolaire en langues.
par Pedro Alvarez Aujourd'hui à 16:52

» KGF_dll - nouvelles versions
par Klaus Aujourd'hui à 14:16

» Compilateur FBPano
par Ouf_ca_passe Aujourd'hui à 12:25

» mise a jour calculatrice
par papydall Aujourd'hui à 2:01

» double guillemets "" dans un EDIT
par Marc Hier à 23:43

» Documentation de KGF
par Klaus Lun 20 Nov 2017 - 22:52

» Zoom sur une portion d'écran
par JL35 Lun 20 Nov 2017 - 21:51

» Recherche d'une expression dans un source
par Marc Lun 20 Nov 2017 - 13:08

» Tracer une grille n'importe où sur l'écran
par JL35 Dim 19 Nov 2017 - 22:14

» TourD Version 2
par Klaus Sam 18 Nov 2017 - 23:58

» La métamatière et le peuple
par JL35 Ven 17 Nov 2017 - 21:18

» Capture d'une zone de l'écran total
par JL35 Ven 17 Nov 2017 - 18:41

» qui peut résoudre mon prb
par pascal10000 Jeu 16 Nov 2017 - 17:30

» évènements et objets système : listage automatique
par Jean Claude Jeu 16 Nov 2017 - 11:15

» Panoramic et la reconnaissance vocale.
par papydall Jeu 16 Nov 2017 - 3:45

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Novembre 2017
LunMarMerJeuVenSamDim
  12345
6789101112
13141516171819
20212223242526
27282930   
CalendrierCalendrier

Partagez | 
 

 Menu contextuel

Voir le sujet précédent Voir le sujet suivant Aller en bas 
Aller à la page : 1, 2  Suivant
AuteurMessage
Nardo26

avatar

Nombre de messages : 2294
Age : 49
Localisation : Valence
Date d'inscription : 02/07/2010

MessageSujet: Menu contextuel   Jeu 6 Déc 2012 - 19:52

Bonsoir,
A défaut de jeu (qui ont tendance à capoter à chaque fois...je sais par pourquoi... )
cela vous dis de réfléchir sur un projet commun : la création par exemple d'un système de menu contextuel ?
Bignono as déjà plus ou moins proposé quelque chose mais cela peut certainement s’améliorer...

Je vous donne mon idée :
Un menu contextuel doit TOUJOURS se trouver au-dessus de tout autres objets... donc exit les PICTURES en direct.
il faut passer peut être par un form (sans bordure) qui contiendrai un PICTURE...
Le truc c'est de pouvoir aussi avoir la possibilité de rajouter des sous-menu...

Ça permettrai aux novices de voir comment aborder un problème, de voir toute la démarche nécessaire AVANT d'écrire une ligne de code, etc...
et pourquoi pas, de participer aussi ?...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://nardo26.lescigales.org
Klaus

avatar

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

MessageSujet: Re: Menu contextuel   Jeu 6 Déc 2012 - 20:02

En faisant abstraction des sous-menus, tu pourrais choisir un LIST. Créé en dernier, il sera toujours au-dessus de tout. Il y a le ON_CLICK qui donne le numéro de ligne cliquée par ITEM_INDEX(numero_de_list).
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Nardo26

avatar

Nombre de messages : 2294
Age : 49
Localisation : Valence
Date d'inscription : 02/07/2010

MessageSujet: Re: Menu contextuel   Jeu 6 Déc 2012 - 20:07

Oui pourquoi pas le LIST...
mais cela oblige d'avoir le menu contextuel DANS le formulaire. Tu me diras, c'est pas bien grave... Wink
Faut quand même que je vérifie que le LIST se retrouvera systématiquement au-dessus de tout autre objet...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://nardo26.lescigales.org
Invité
Invité



MessageSujet: Re: Menu contextuel   Jeu 6 Déc 2012 - 20:18

J'ai déjà fait cela, mais c'est à revoir.
http://panoramic.free-boards.net/t986-menu-pop_up
Revenir en haut Aller en bas
Klaus

avatar

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

MessageSujet: Re: Menu contextuel   Jeu 6 Déc 2012 - 20:43

Rien n'empêche de placer le LIST dans une FORM avec BORDER_SMALL (pour qu'on puisse la déplacer ou fermer). Le LIST, c'est juste pour faciliter la reconnaissance de l'option choisie.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Jean Claude

avatar

Nombre de messages : 5062
Age : 63
Localisation : 83 Var
Date d'inscription : 07/05/2009

MessageSujet: Re: Menu contextuel   Jeu 6 Déc 2012 - 21:29

Bonne idée Nardo,

Oui le LIST dans un FORM que l'on place en premier plan avec TO_FOREGROUND

A+
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Nardo26

avatar

Nombre de messages : 2294
Age : 49
Localisation : Valence
Date d'inscription : 02/07/2010

MessageSujet: Re: Menu contextuel   Ven 7 Déc 2012 - 2:45

C'est vrai que le LIST parait bien mais tant que l'on a pas cliqué dessus, l'élément survolé n'est pas sélectionné/surligné (hover en css).
Une autre solution serait peut etre de mettre un picture dans un FORM et de gérer le survol/selection comme pour une GLIST (en plus simple bien sur)
Cosmos apparemment a également fait son popup à partir d'un picture dans un FORM
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://nardo26.lescigales.org
Klaus

avatar

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

MessageSujet: Re: Menu contextuel   Ven 7 Déc 2012 - 3:25

Quelque soit l'objet en Panoramic, tu ne peux gérer le survol que grâce à un timer, ce qui alourdit considérablement.

J'ai fait une petite maquette, avec un menu contextuel par F1, sur la form 0 et sur le EDIT 1. La structure est préparée pour le MEMO 2 _ à compléter:
Code:
label key0, key1, key2, sel0, sel1, sel2

on_key_up 0,key0

edit 1 : top 1,10 : left 1,10
  on_key_up 1,key1
 
memo 2 : top 2,40 : left 2,10
  on_key_up 2,key2
 
end

key0:
  if scancode=112 then menu0()
  return

key1:
  if scancode=112 then menu1()
  return

key2:
  if scancode=112 then menu2()
  return

sub menu0()
  if object_exists(10)=1 then delete 10
  form 10 : border_small 10 : height 10,60 : width 10,80
  list 11 : parent 11,10 : full_space 11
  item_add 11,"Sortir"
  item_add 11,"Full_space"
  on_click 11,sel0
end_sub

sub menu1()
  if object_exists(10)=1 then delete 10
  form 10 : border_small 10 : height 10,60 : width 10,120
    top 10,top(1)+15 : left 10,left(1)+width(1)
  list 11 : parent 11,10 : full_space 11
  item_add 11,"Mettre en secret"
  item_add 11,"Mettre en normal"
  on_click 11,sel1
end_sub

sub menu2()
end_sub

sel0:
  if item_index(11)=1 then terminate
  if item_index(11)=2 then full_space 0
  return

sel1:
  if item_index(11)=1 then secret_on 1
  if item_index(11)=2 then secret_off 1
  return
 
sel2:
  return
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Nardo26

avatar

Nombre de messages : 2294
Age : 49
Localisation : Valence
Date d'inscription : 02/07/2010

MessageSujet: Re: Menu contextuel   Ven 7 Déc 2012 - 10:00

Bonjour,

Klaus, pourquoi tu dis qu'un timer alourdi considérablement ? scratch

Si celui-ci est actif uniquement que quand le menu est affiché (c'est l'évènement du click droit qui active le timer), il n'y a pas véritablement de charge.

Normalement lorsque l'on demande l'affichage d'un tel menu, il n'y a pas d'autres "taches" en cours....
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://nardo26.lescigales.org
Klaus

avatar

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

MessageSujet: Re: Menu contextuel   Ven 7 Déc 2012 - 11:27

Pourqoui ? C'est parce qu'on n'a pas d'évènement ON_RIGHT_CLICK, justement. ET il faudrait un timer pour tester en permanence si MOUSE_RIGHT_DOWN(x)=1 de tous les objets possibles pour savoir si on a fait un clic droit, et cela ne peut se faire qu'avec un timer. Tu imagines ? Toutes les 100 milli-secondes, faire ce test pour tous les objets ?

Non, c'est trop lourd. Tant qu'on n'a pas de vrai évènement ON_RIGHT_CLICK, il faut utiliser ON_KEY_UP et choisir une touche quelconque (comme F1 dans mon exemple), pour l'affichage d'un menu contextuel.

Par contre, on peut alors, une fois que le menu est affiché, utiliser un timer pour l'effacer, car il ne sera utilisé qu'une seule fois, puis désactivé. Voici le programme posté cette nuit, avec un timer qui fait disparaître le menu contextuel sur le EDIT, dès qu'on a cliqué sur une des options:
Code:
label key0, key1, key2, sel0, sel1, sel2, tmr

timer 100 : timer_off 100 : timer_interval 100,100
on_timer 100,tmr
on_key_up 0,key0

edit 1 : top 1,10 : left 1,10
  on_key_up 1,key1

memo 2 : top 2,40 : left 2,10
  on_key_up 2,key2

end

tmr:
  timer_off 100
  if object_exists(10)=1 then delete 10
  return

key0:
  if scancode=112 then menu0()
  return

key1:
  if scancode=112 then menu1()
  return

key2:
  if scancode=112 then menu2()
  return

sub menu0()
  if object_exists(10)=1 then delete 10
  form 10 : border_small 10 : height 10,60 : width 10,80
  list 11 : parent 11,10 : full_space 11
  item_add 11,"Sortir"
  item_add 11,"Full_space"
  on_click 11,sel0
end_sub

sub menu1()
  if object_exists(10)=1 then delete 10
  form 10 : border_small 10 : height 10,60 : width 10,120
    top 10,top(1)+15 : left 10,left(1)+width(1)
  list 11 : parent 11,10 : full_space 11
  item_add 11,"Mettre en secret"
  item_add 11,"Mettre en normal"
  on_click 11,sel1
end_sub

sub menu2()
end_sub

sel0:
  select item_index(11)
    case 1: terminate
    case 2
      full_space 0
      timer_on 100
  end_select
  return

sel1:
  select item_index(11)
    case 1: secret_on 1
    case 2: secret_off 1
  end_select
  timer_on 100
  return

sel2:
  return
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Nardo26

avatar

Nombre de messages : 2294
Age : 49
Localisation : Valence
Date d'inscription : 02/07/2010

MessageSujet: Re: Menu contextuel   Ven 7 Déc 2012 - 12:31

Ok Klaus, je comprend...
dommage qu'il n'existe pas le ON_RIGHT_CLICK...

Puisque l'on est dans la proposition de code, j'ai pensé à ceci, en partant d'un evenement clavier : Wink

Code:
LABEL TestKey
InitConst()

LEFT 0,SCREEN_X/2 : TOP 0,SCREEN_Y/2

edit 1 : top 1,10 : left 1,10
on_key_up 1,TestKey

memo 2 : top 2,40 : left 2,10
on_key_up 2,TestKey


FORM 200:BORDER_HIDE 200: HIDE 200 :WIDTH 200,102:HEIGHT 200,Hauteur+2
PICTURE 201:PARENT 201,200:WIDTH 201,105:HEIGHT 201,Hauteur
2D_TARGET_IS 201
2D_PEN_COLOR 128,128,128
2D_LINE 100,5,100,Hauteur+1:2D_LINE 100,Hauteur+1,5,Hauteur+1
2D_PEN_COLOR 200,200,200 : 2D_RECTANGLE 0,0,100,Hauteur
LABEL Test,pTime
DIM x,y: ' ,x1,y1
DIM actif:actif=0
DIM s:s=0
DIM NumItem
TIMER 202:TIMER_INTERVAL 202,100:ON_TIMER 202,pTime:TIMER_OFF 202

END

SUB InitConst()
  DIM_LOCAL w,h
  DIM CAPTION_HEIGHT%, BORDER_WIDTH%
  w=WIDTH(0):h=HEIGHT(0)
  HIDE 0:HEIGHT 0,0: CAPTION_HEIGHT% = height(0)
'  WIDTH 0, 100:  BORDER_WIDTH% = (width(0)-100)/2 : ' ca marche plus... :(
  BORDER_WIDTH% = 8 : ' valeur empirique (valable sous XP)
  WIDTH 0,w:HEIGHT 0,h
  SHOW 0
  DIM NB_ITEM:NB_ITEM = 7
  ' Hauteur de notre menu : 3px de marge haute + 3 px de marge basse
  DIM MargeH:MargeH=3
  DIM MargeB:MargeB=3
  DIM Hauteur : Hauteur = (NB_ITEM * 16)+MargeH+MargeB
  DIM NumObj
END_SUB

TestKey:
  if scancode=112
    NumObj=NUMBER_KEY_UP
    TIMER_ON 202
  end_if
return

pTime:
  IF actif = 0
    x= MOUSE_X_POSITION(NumObj) : y= MOUSE_Y_POSITION(NumObj)
    actif = 1:ShowMenu(1)
    NumItem=0
  ELSE
    ' Le menu est actif : on vérifie que l'on est toujours dedans
    IF MOUSE_X_POSITION(NumObj)<>x OR MOUSE_Y_POSITION(NumObj)<>y
      actif=0:ShowMenu(0)
      NumItem=0
      TIMER_OFF 202
    ELSE
    ' on redessine seulement le menu si l'item pointé n'est plus le même
    IF MOUSE_Y_POSITION(201)> (NumItem*16)+MargeH THEN DrawMenu()
    IF MOUSE_Y_POSITION(201)< ((NumItem-1)*16)+MargeH THEN DrawMenu()
    TIMER_ON 202
    END_IF
  END_IF
  CAPTION 0,STR$(NumItem)
RETURN

Test:
 CreateMenu()
RETURN

SUB ShowMenu(s)
  LEFT 200,LEFT(0)+LEFT(NumObj)+x-10
  TOP 200,TOP(0)+TOP(NumObj)+y+CAPTION_HEIGHT%-BORDER_WIDTH%
  IF s=1
    SHOW 200
  ELSE
    HIDE 200
  END_IF
END_SUB


SUB DrawMenu()
  DIM_LOCAL i,y
  PRINT_TARGET_IS 201
  FOR i=1 TO NB_ITEM
    y=((i-1)*16)+MargeH
    PRINT_LOCATE 15,y
    IF MOUSE_Y_POSITION(201)>=y AND MOUSE_Y_POSITION(201)<y+16
      NumItem=i
      2d_fill_color 49,106,197 : 2d_pen_color 49,106,197
      font_color 201,255,255,255
    ELSE
      2d_fill_color 255,255,255 : 2d_pen_color 255,255,255
      font_color 201,0,0,0
    END_IF
    2d_rectangle 3,y,100-3,y+16
    PRINT " Item ";i
  NEXT i
  PRINT_TARGET_IS 0
END_SUB
Ce que je n'aime pas dans le code ci-dessus, c'est le bidouillage pour faire disparaitre le menu.
J'ai regardé les différentes tentative à ce sujet, et rien ne m'a vraiment convaincu : il reste toujours un form planqué derrière un autre...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://nardo26.lescigales.org
Klaus

avatar

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

MessageSujet: Re: Menu contextuel   Ven 7 Déc 2012 - 13:11

Regarde le source que j'ai posté ci-dessus. La form ne reste pas.

Le problème, c'est qu'on ne peut pas supprimer une form dans une routine d'évènement appartenant à cette même form. C'est pourquoi je déclenche un timer qui s'en charge, indépendamment de la routine évènement appelée lors du clic. Et ça marche.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Nardo26

avatar

Nombre de messages : 2294
Age : 49
Localisation : Valence
Date d'inscription : 02/07/2010

MessageSujet: Re: Menu contextuel   Ven 7 Déc 2012 - 13:45

Oui j'ai vu ton code :
pour fermer le menu, tu dois être obligé de cliquer sur un item ou de fermer "manuellement" le FORM.
Mais ce n'est pas tout à fait le comportement d'un menu contextuel...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://nardo26.lescigales.org
Klaus

avatar

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

MessageSujet: Re: Menu contextuel   Ven 7 Déc 2012 - 13:57

Alors là, c'est simple :
Code:
label key0, key1, key2, sel0, sel1, sel2, tmr, tmr1

timer 100 : timer_off 100 : timer_interval 100,100
on_timer 100,tmr
timer 101 : timer_off 101 : timer_interval 101,2500
on_timer 101,tmr1
on_key_up 0,key0

edit 1 : top 1,10 : left 1,10
  on_key_up 1,key1

memo 2 : top 2,40 : left 2,10
  on_key_up 2,key2

end

tmr:
  timer_off 100
  if object_exists(10)=1 then delete 10
  return

tmr1:
  timer_off 101
  if object_exists(10)=1 then delete 10
  return

key0:
  if scancode=112 then menu0()
  return

key1:
  if scancode=112 then menu1()
  return

key2:
  if scancode=112 then menu2()
  return

sub menu0()
  if object_exists(10)=1 then delete 10
  form 10 : border_small 10 : height 10,60 : width 10,80
  list 11 : parent 11,10 : full_space 11
  item_add 11,"Sortir"
  item_add 11,"Full_space"
  on_click 11,sel0
  timer_on 101
end_sub

sub menu1()
  if object_exists(10)=1 then delete 10
  form 10 : border_small 10 : height 10,60 : width 10,120
    top 10,top(1)+15 : left 10,left(1)+width(1)
  list 11 : parent 11,10 : full_space 11
  item_add 11,"Mettre en secret"
  item_add 11,"Mettre en normal"
  on_click 11,sel1
  timer_on 101
end_sub

sub menu2()
end_sub

sel0:
  select item_index(11)
    case 1: terminate
    case 2
      full_space 0
      timer_on 100
  end_select
  return

sel1:
  select item_index(11)
    case 1: secret_on 1
    case 2: secret_off 1
  end_select
  timer_on 100
  return

sel2:
  return
Le menu se referme tout seul, s'il n'est pas utilisé !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Jean Claude

avatar

Nombre de messages : 5062
Age : 63
Localisation : 83 Var
Date d'inscription : 07/05/2009

MessageSujet: Re: Menu contextuel   Ven 7 Déc 2012 - 14:57

Laisse tomber Nardo, il a réponse à tout ce Klaus..... Very Happy Wink

lol!
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Nardo26

avatar

Nombre de messages : 2294
Age : 49
Localisation : Valence
Date d'inscription : 02/07/2010

MessageSujet: Re: Menu contextuel   Ven 7 Déc 2012 - 15:03

Je laisse pas tombé Jean-Claude Wink
Je ne contredit Klaus pour le plaisir de le contredire... (et j'espère qu'il ne le voit pas comme cela)

Quand il y a des arguments convaincants, je suis tout à fait prêt de les accepter. Smile

C'est ce qui fait progresser les choses et apporte des éléments de discussion intéressants...
Sachant que pour un problème donné, il existe plusieurs solutions; débattre sur le bien fondé de telle ou telle solution est toujours enrichissant.
J'aimerai que d'autres personnes apportent leur avis/leurs idées également, c'est un peu le but de ce topic... Wink

PS: J'ai pas encore regardé ton code Klaus... Wink
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://nardo26.lescigales.org
Jean Claude

avatar

Nombre de messages : 5062
Age : 63
Localisation : 83 Var
Date d'inscription : 07/05/2009

MessageSujet: Re: Menu contextuel   Ven 7 Déc 2012 - 15:11

Bien sur je suis d'accord, il ne faut pas laisser tomber. C'était juste une plaisanterie pour souligner la rapidité et l’efficacité des réponses de Klaus.

Je reste attentif pour la suite car une routine de "menu contextuel" sera une grande chose pour nous tous.

A+
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Nardo26

avatar

Nombre de messages : 2294
Age : 49
Localisation : Valence
Date d'inscription : 02/07/2010

MessageSujet: Re: Menu contextuel   Ven 7 Déc 2012 - 15:46

ah ah, cette ruse de sioux !
A ta solution Klaus, je rajouterai bien un réarmement du timer 101 lorsque l'on bouge la souris sur la list 11...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://nardo26.lescigales.org
Klaus

avatar

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

MessageSujet: Re: Menu contextuel   Ven 7 Déc 2012 - 15:59

Ah, ça serait super ! Malheureusement, on n'a pas d'évènements ON_MOUSE_MOVE, ON_MOUSE_IN ou ON_MOUSE_OUT. En en revient au problème initial: pour faire cela, il faudrait un timer permanent dont l'évènement scrute la position de la souris pour éventuellement déclencher une action ! Avec tous les conflits que cela peut apporter avec d'autres timers au niveau d'une application, etc.

C'est pourquoi mon timer 101, dimensionné à 2,5 secondes, est un compromis, et en fonction des besoins, on peut faire varier ce délai. Et lorsqu'on clique sur une ligne, le timer 100 est activé qui supprime le menu de toutes façons.

D'ailleurs, pourquoi ne par faire une ligne "Abandon", comme dans cet exemple:
Code:
label key0, key1, key2, sel0, sel1, sel2, tmr, tmr1

timer 100 : timer_off 100 : timer_interval 100,100
on_timer 100,tmr
timer 101 : timer_off 101 : timer_interval 101,2500
on_timer 101,tmr1
on_key_up 0,key0

edit 1 : top 1,10 : left 1,10
  on_key_up 1,key1

memo 2 : top 2,40 : left 2,10
  on_key_up 2,key2

end

tmr:
  timer_off 100
  if object_exists(10)=1 then delete 10
  return

tmr1:
  timer_off 101
  if object_exists(10)=1 then delete 10
  return

key0:
  if scancode=112 then menu0()
  return

key1:
  if scancode=112 then menu1()
  return

key2:
  if scancode=112 then menu2()
  return

sub menu0()
  if object_exists(10)=1 then delete 10
  form 10 : border_small 10 : height 10,80 : width 10,80
  list 11 : parent 11,10 : full_space 11
  item_add 11,"Sortir"
  item_add 11,"Full_space"
  item_add 11,"Abandon"
  on_click 11,sel0
  timer_on 101
end_sub

sub menu1()
  if object_exists(10)=1 then delete 10
  form 10 : border_small 10 : height 10,80 : width 10,120
    top 10,top(1)+15 : left 10,left(1)+width(1)
  list 11 : parent 11,10 : full_space 11
  item_add 11,"Mettre en secret"
  item_add 11,"Mettre en normal"
  item_add 11,"Abandon"
  on_click 11,sel1
  timer_on 101
end_sub

sub menu2()
end_sub

sel0:
  select item_index(11)
    case 1: terminate
    case 2
      full_space 0
      timer_on 100
  end_select
  timer_on 100
  return

sel1:
  select item_index(11)
    case 1: secret_on 1
    case 2: secret_off 1
  end_select
  timer_on 100
  return

sel2:
  return
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Nardo26

avatar

Nombre de messages : 2294
Age : 49
Localisation : Valence
Date d'inscription : 02/07/2010

MessageSujet: Re: Menu contextuel   Ven 7 Déc 2012 - 17:16


Je comprend ta réticence vis à vis des timers mais je doute que l'on puisse s'en passer pour ce genre de chose.
Tu utilises actuellement 2 timers:
1 pour fermer le FORM après une action
1 pour fermer le FORM après timeout.
Les 2 font la même chose, seule la base de temps change.
Je pense que dans ce que tu proposes, on peut s'en passer au moins d'un... (il faut juste redéfinir le TIMER_INTERVAL)


Dans la version ci-dessous :
j'utilise 2 timers:
1 Pour gérer l'affichage de l'item sélectionné
1 pour fermer le FORM sur time-out
En réfléchissant un peu, je dois également pouvoir en utiliser qu'un seul.
-> Ajouter un cpt dans le 1er timer (celui avec la bdt à 100ms) pour générer le timeout...

Code:
LABEL TestKey
InitConst()

LEFT 0,SCREEN_X/2 : TOP 0,SCREEN_Y/2

edit 1 : top 1,10 : left 1,10
on_key_up 1,TestKey
memo 2 : top 2,40 : left 2,10
on_key_up 2,TestKey

ALPHA 3:CAPTION 3," Sélectionnez un objet puis cliquez sur F1":TOP 3,TOP(2)+HEIGHT(2)+10


FORM 200:BORDER_HIDE 200: HIDE 200 :WIDTH 200,102:HEIGHT 200,Hauteur+2
PICTURE 201:PARENT 201,200:WIDTH 201,105:HEIGHT 201,Hauteur
2D_TARGET_IS 201
2D_PEN_COLOR 128,128,128
2D_LINE 100,5,100,Hauteur+1:2D_LINE 100,Hauteur+1,5,Hauteur+1
2D_PEN_COLOR 200,200,200 : 2D_RECTANGLE 0,0,100,Hauteur
LABEL pTime,pTime2,MenuClick
DIM x,y,NumItem

TIMER 202:TIMER_INTERVAL 202,100:ON_TIMER 202,pTime:TIMER_OFF 202
TIMER 203:TIMER_INTERVAL 203,2000:ON_TIMER 203,pTime2:TIMER_OFF 203
ON_CLICK 201,MenuClick
END

' ------------------------------------------------------------------------------
' ------------------------------------------------------------------------------
SUB InitConst()
  DIM_LOCAL w,h
  DIM CAPTION_HEIGHT%, BORDER_WIDTH%
  w=WIDTH(0):h=HEIGHT(0)
  HIDE 0:HEIGHT 0,0: CAPTION_HEIGHT% = height(0)
  BORDER_WIDTH% = 8 : ' valeur empirique (valable sous XP)
  WIDTH 0,w:HEIGHT 0,h
  SHOW 0
  ' Hauteur de notre menu : 3px de marge haute + 3 px de marge basse
  DIM MargeH:MargeH=3
  DIM MargeB:MargeB=3
  DIM NB_ITEM:NB_ITEM = 7
  DIM Hauteur : Hauteur = (NB_ITEM * 16)+MargeH+MargeB
  DIM NumObj
END_SUB

TestKey:
  if scancode=112
    NumObj=NUMBER_KEY_UP
    TIMER_ON 202
  end_if
return


MenuClick:
  ShowMenu(0)
  MESSAGE "Objet :"+STR$(NumObj)+" Click sur item "+STR$(NumItem)
  NumItem=0
RETURN

pTime:
  IF NumItem=0
    x= MOUSE_X_POSITION(NumObj) : y= MOUSE_Y_POSITION(NumObj)
    ShowMenu(1)
    NumItem=0-1
  ELSE
    ' Le menu est actif : on vérifie que l'on est toujours dedans
    IF x < 0
      ShowMenu(0)
      NumItem=0
      TIMER_OFF 202:TIMER_OFF 203
    ELSE
      ' on redessine seulement le menu si l'item pointé n'est plus le même
      IF x> ((NumItem*16)+MargeH) AND x<(NB_ITEM*16)+MargeH THEN DrawMenu()
      IF x< (((NumItem-1)*16)+MargeH) AND x> MargeH THEN DrawMenu()
      x=MOUSE_Y_POSITION(201)
      TIMER_ON 202
    END_IF
  END_IF
RETURN

pTime2:
  x=0-1
RETURN

SUB ShowMenu(s)
  LEFT 200,LEFT(0)+LEFT(NumObj)+x-10
  TOP 200,TOP(0)+TOP(NumObj)+y+CAPTION_HEIGHT%-BORDER_WIDTH%
  IF s=1
    SHOW 200
  ELSE
    HIDE 200:TIMER_OFF 202:TIMER_OFF 203
  END_IF
END_SUB

SUB DrawMenu()
  DIM_LOCAL i,y
  TIMER_OFF 203
  PRINT_TARGET_IS 201
  FOR i=1 TO NB_ITEM
    y=((i-1)*16)+MargeH
    PRINT_LOCATE 15,y
    IF MOUSE_Y_POSITION(201)>=y AND MOUSE_Y_POSITION(201)<y+16
      NumItem=i
      2d_fill_color 49,106,197 : 2d_pen_color 49,106,197
      font_color 201,255,255,255
    ELSE
      2d_fill_color 255,255,255 : 2d_pen_color 255,255,255
      font_color 201,0,0,0
    END_IF
    2d_rectangle 3,y,100-3,y+16
    PRINT " Item ";i
  NEXT i
  PRINT_TARGET_IS 0
  TIMER_ON 203
END_SUB
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://nardo26.lescigales.org
Jicehel

avatar

Nombre de messages : 5860
Age : 45
Localisation : 77500
Date d'inscription : 19/04/2011

MessageSujet: Re: Menu contextuel   Ven 7 Déc 2012 - 17:45

Je regarde ça de très loin depuis le boulot par ce que je ne peux pas trop analyser, mais je pense que l'on s'approche à grand pas de la solution ...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

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

MessageSujet: Re: Menu contextuel   Ven 7 Déc 2012 - 19:08

Très joli, Nardo26 ! Ce sera difficile de trouver mieux !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Nardo26

avatar

Nombre de messages : 2294
Age : 49
Localisation : Valence
Date d'inscription : 02/07/2010

MessageSujet: Re: Menu contextuel   Ven 7 Déc 2012 - 19:58

Merci Klaus, mais c'est encore pas très convaincant comme système : C'est saccadé et loin d'être fluide....

il y a bien une solution mais cela risque de devenir une usine à gaz:
Prévoir non pas 1 image mais 3: Dessiner à l'avance le item-1 et le item+1 dans des images tampon
sans compter que je ne suis pas sûr que le résultat sera flagrant...

Puis il reste à faire en sorte que ces menus soient faciles à mettre en place... Wink

Je vais regarder ta méthode pour voir si on peut simplifier le code...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://nardo26.lescigales.org
bignono

avatar

Nombre de messages : 1098
Age : 60
Localisation : Val de Marne
Date d'inscription : 13/11/2011

MessageSujet: Re: Menu contextuel   Sam 8 Déc 2012 - 1:55

Bonsoir à tous, Smile
Merci à Jean-Claude qui a ressorti mon code du menu contextuel dans un autre post.
Et merci d'avoir ouvert un sujet sur le menu contextuel.
Dans mon code, j'utilise un timer avec les évènements boutons gauche et droit de la souris pour savoir si on a cliqué sur le bouton droit de la souris. Et j'utilise un list dans lequel sont les choix possibles.
Comme disait Nardo, Il est difficile voir impossible de se passer de timer pour ce genre de code.
Le code de Nardo est très séduisant et je l'aime bien.
J'ai donc essayé de faire un autre code pour faire un menu contextuel.
Bien entendu, j'utilise toujours un timer, mais au lieu de scruter les boutons gauche et droit de la souris, j'utilise scancode pour savoir si le bouton droit de la souris a été actionné. Et au lieu d'utiliser un list, j'ai pris un grid réduit à une colone! Rien d'extraordinaire, mais ça fonctionne bien chez moi. Alors, je vous le donne:
Code:
dim t
label clicdroit,menu,fin
main_menu 1
sub_menu 2:parent 2,1:caption 2,"Menu"
sub_menu 3:parent 3,2:caption 3,"Ouvrir":on_click 3,menu
sub_menu 4:parent 4,2:caption 4,"Sauver":on_click 4,menu
sub_menu 5:parent 5,2:caption 5,"Quitter":on_click 5,menu
sub_menu 6:parent 6,1:caption 6,"Edition"
sub_menu 7:parent 7,6:caption 7,"Chercher":on_click 7,menu
sub_menu 8:parent 8,6:caption 8,"Remplacer":on_click 8,menu

grid 10:hide 10:width 10,124:height 10,155:bar_none 10
grid_column 10,1:grid_one_column_width 10,1,120
grid_row 10,7:grid_one_row_height 10,1,0.1
grid_write 10,2,1,"MENU CONTEXTUEL"
grid_write 10,3,1,"Ouvrir":grid_write 10,4,1,"Sauver":grid_write 10,5,1,"Chercher"
grid_write 10,6,1,"Remplacer":grid_write 10,7,1,"Fermer"

timer 100:timer_interval 100,1:on_timer 100,clicdroit
end

menu:
timer_off 100
if clicked(3)=1 then ouvrir()
if clicked(4)=1 then sauver()
if clicked(5)=1 then goto fin
if clicked(7)=1 then chercher()
if clicked(8)=1 then remplacer()
timer_on 100
return

clicdroit:
if scancode<>2 then return
left 10,mouse_x_position(0):top 10,mouse_y_position(0)
timer_off 100
  show 10
while clicked(10)=0
end_while
  t=grid_y_to_row(10,mouse_y_position(10)):menu(t):fermer()
timer_on 100
return

sub menu(t)
  select t
      case 3:ouvrir()
      case 4:sauver()
      case 5:chercher()
      case 6:remplacer()
      case 7:fermer()
  end_select
end_sub

sub ouvrir()
message "ouverture du fichier"
end_sub

sub sauver()
message "enregistrement du fichier"
end_sub

sub chercher()
message "mot à chercher"
end_sub

sub remplacer()
message "remplacer un mot"
end_sub

sub fermer()
hide 10
end_sub

fin:
timer_off_all:terminate
A+ Wink Wink Wink
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

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

MessageSujet: Re: Menu contextuel   Sam 8 Déc 2012 - 2:07

Effectivement, ça marche bien.

Mais dans l'état actuel de Panoramic, impossible de se passer d'un timer (ici, timer 100), pour tester si le clic droit a été fait. Le timer est désactivé le temps du traitement d'un menu, pis réactivé après. Simple et efficace.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Contenu sponsorisé




MessageSujet: Re: Menu contextuel   

Revenir en haut Aller en bas
 
Menu contextuel
Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 1 sur 2Aller à la page : 1, 2  Suivant
 Sujets similaires
-
» Récupérer nom fichier sur clic droit menu contextuel Windows
» [PHPBB2] Désactiver le menu contextuel des images des messages
» probleme avec outlook express ou internet exploreur ?
» commande menu "Enregistrer"
» [resolu]mettre fichier dans le menu bar

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: Grands projets réalisés avec Panoramic :: Idées générales sur des projets en commun-
Sauter vers: