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
» I Love You
par papydall Aujourd'hui à 2:58

» MARK_ON déclenche un événement ON_CLICK à la place de ...
par Jean Claude Hier à 18:08

» mise a jour calculatrice
par joeeee2017 Hier à 15:57

» [solved] 3D_LINE How to ?
par Jicehel Hier à 11:01

» Convertisseur de base 10 de 2 à 36
par gigi75 Mar 17 Oct 2017 - 18:49

» calculatrice avec touches movibles
par joeeee2017 Dim 15 Oct 2017 - 1:11

» CORTANA
par gigi75 Sam 14 Oct 2017 - 16:32

» Calculatrice
par Jean Claude Sam 14 Oct 2017 - 12:30

» Compilateur FBPano
par jean_debord Jeu 12 Oct 2017 - 9:53

» KGF_dll - nouvelles versions
par Klaus Mar 10 Oct 2017 - 18:49

» à propos de Panoramic_Editor [Résolu]
par Klaus Mar 10 Oct 2017 - 3:19

» Un petit "coucou" à tous les Panoramiciens !
par Jack Ven 6 Oct 2017 - 10:24

» Pourquoi le compilateur stagne
par mindstorm Mer 4 Oct 2017 - 20:38

» Panoramic ?
par Marc37 Mer 4 Oct 2017 - 0:39

» Premiers pas avec Arduino
par Marc37 Mer 4 Oct 2017 - 0:29

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Octobre 2017
LunMarMerJeuVenSamDim
      1
2345678
9101112131415
16171819202122
23242526272829
3031     
CalendrierCalendrier

Partagez | 
 

 Un menu déroulant type "Side Bar"

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

avatar

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

MessageSujet: Un menu déroulant type "Side Bar"   Dim 7 Déc 2014 - 0:33

Sur les pages internet, on a souvent un menu vertical, représenté par une liste verticale de titres. Un clic sur un de ces titres décale les autres vers le bas et fait apparaître le détail des fonctions. Un autre clic sur ce titre replie le tout et retasse l'affichage. J'ai reproduit ce comportement en Panoramic pur, sans recourir à une DLL. Voici un exemple:
Code:
' test_menu_deroulant.bas

nouveau_menu_deroulant(100,30,30,127,127,255)
titre_menu_deroulant(actuel_menu_deroulant%,"Mon menu 1","Arial",16,1,1,0,0,0)
corps_menu_deroulant(actuel_menu_deroulant%,4,191,191,255,"Century Gothic",10,1,0,0,0,0)
ligne_menu_deroulant(actuel_menu_deroulant%,1,"Première option")
ligne_menu_deroulant(actuel_menu_deroulant%,2,"Deuxième option")
ligne_menu_deroulant(actuel_menu_deroulant%,3,"Troisième option")
ligne_menu_deroulant(actuel_menu_deroulant%,4,"Quatrième option")

nouveau_menu_deroulant(120,30,60,127,127,255)
titre_menu_deroulant(actuel_menu_deroulant%,"Mon menu 2","Arial",16,0,0,0,0,0)
corps_menu_deroulant(actuel_menu_deroulant%,7,191,191,255,"Wingdings",10,1,1,0,0,0)
ligne_menu_deroulant(actuel_menu_deroulant%,1,"Ligne 1")
ligne_menu_deroulant(actuel_menu_deroulant%,2,"Ligne 2")
ligne_menu_deroulant(actuel_menu_deroulant%,3,"Ligne 3")
ligne_menu_deroulant(actuel_menu_deroulant%,4,"Ligne 4")
ligne_menu_deroulant(actuel_menu_deroulant%,5,"Ligne 5")
ligne_menu_deroulant(actuel_menu_deroulant%,6,"Ligne 6")
ligne_menu_deroulant(actuel_menu_deroulant%,7,"Ligne 7")

nouveau_menu_deroulant(140,30,90,127,127,255)
titre_menu_deroulant(actuel_menu_deroulant%,"Mon menu 3","Arial",16,1,1,0,0,0)
corps_menu_deroulant(actuel_menu_deroulant%,4,191,191,255,"MS Serif",10,1,0,0,0,0)
ligne_menu_deroulant(actuel_menu_deroulant%,1,"1ère option")
ligne_menu_deroulant(actuel_menu_deroulant%,2,"2ème option")
ligne_menu_deroulant(actuel_menu_deroulant%,3,"3èmeoption")
ligne_menu_deroulant(actuel_menu_deroulant%,4,"4ème option")

end

' ====================================================================================
' Cette procédure crée un nouveau menu déroulant. Elle utilise 2 objets PICTURE.
' Paramètres:
'  no%  = numéro de l'objet de base à utiliser  (no% et no%+1 doivent être libres)
'  x%, y% = position du coin en haut à gauche du menu*
'  mr%,mg%, mb% = couleurs RGB du fond du menu
' ====================================================================================
sub nouveau_menu_deroulant(no%,x%,y%,mr%,mg%,mb%)
  if label("click_menu_deroulant")=0
    dim n_menus_deroulants%, table_menus_deroulants%(50), i_menus_deroulants%
    dim actuel_menu_deroulant%, actuel_menu_deroulant_y%, j_menus_deroulants%,
    label click_menu_deroulant, click_menu_deroulant_ligne
    n_menus_deroulants% = 0
  end_if
  n_menus_deroulants% = n_menus_deroulants% + 1
  table_menus_deroulants%(n_menus_deroulants%) = no%
  actuel_menu_deroulant% = no%
  picture no%
    top no%,y% : left no%,x% : width no%,200 : height no%,25
    color no%,mr%,mg%,mb%
  on_click no%,click_menu_deroulant
end_sub

' ====================================================================================
' Cette procédure écrit le titre du menu dans un menu existant.
' Paramètres:
'  no% = numéro d'objet de base du menu visé
'  titre$ = texte à afficher
'  font$ = nom de la police
'  sz% = taille de la police
'  sg%, si% = styles de la police (gras, italique): indicateurs 0/1
'  fr%, fg%, fb% = couleurs RGB de la police
' ====================================================================================
sub titre_menu_deroulant(no%,titre$,font$,sz%,sg%,si%,fr%,fg%,fb%)
  if sg%<>0 then font_bold no%
  if si%<>0 then font_italic no%
  font_size no%,sz%
  font_color no%,fr%,fg%,fb%
  print_target_is no%
  2d_target_is no%
  2d_fill_color color_pixel_red(no%,1,1),color_pixel_green(no%,1,1),color_pixel_blue(no%,1,1)
  print_locate 20,1
  print titre$
end_sub

' ====================================================================================
' Cette procédure prépare le corps du menu pour un certain nombre de lignes.
' Paramètres:
'  no% = numéro d'objet de base du menu visé
'  nlig% = nombre de lignes de détail pour ce menu
'  mr%, mg%, mb% = couleur RBG du fond du corps du menu
'  font$ = police des lignes de détail
'  sz% = taille de la police
'  sg%,si% = styles de la police (gras, italique): indicateurs 0/1
'  fr%, fg%, fb% = couleurs RGB de la police
' ====================================================================================
sub corps_menu_deroulant(no%,nlig%,mr%,mg%,mb%,font$,sz%,sg%,si%,fr%,fg%,fb%)
  dim_local no1%
  no1% = no% + 1
  picture no1% : hide no1%
    top no1%,top(no1%-1)+25 : left no1%,left(no1%-1)
    width no1%,200 : height no1%,25*nlig%
    font_name no1%,font$
    color no1%,mr%,mg%,mb%
    if sg%<>0 then font_bold no1%
    if si%<>0 then font_italic no1%
    font_size no1%,sz%
    font_color no1%,fr%,fg%,fb%
    on_click no1%,click_menu_deroulant_ligne
end_sub

' ====================================================================================
' Cette procédure écrit une ligne de détail dans le corps d'un menu
'  no% = numéro d'objet de base du menu visé
'  nlig% = numéro de la lignevisée (1,2, ...)
'  texte$ = texte à afficher
' ====================================================================================
sub ligne_menu_deroulant(no%,nlig%,texte$)
  dim_local no%
  no1% = act% + 1
  print_target_is no1%
  2d_target_is no1%
  2d_fill_color color_pixel_red(no1%,1,1),color_pixel_green(no1%,1,1),color_pixel_blue(no1%,1,1)
  print_locate 20,(nlig%-1)*25+1
  print texte$
end_sub

' ====================================================================================
' cette procédure ne dois en aucun cas être modifiée !
' ====================================================================================
click_menu_deroulant:
  for i_menus_deroulants%=1 to n_menus_deroulants%
    if table_menus_deroulants%(i_menus_deroulants%)=number_click
      if hide(number_click+1)=1
        if i_menus_deroulants%<n_menus_deroulants%
          for j_menus_deroulants%=i_menus_deroulants%+1 to n_menus_deroulants%
            top table_menus_deroulants%(j_menus_deroulants%), top(table_menus_deroulants%(j_menus_deroulants%)) + height(table_menus_deroulants%(i_menus_deroulants%)+1)
            top table_menus_deroulants%(j_menus_deroulants%)+1, top(table_menus_deroulants%(j_menus_deroulants%)+1) + height(table_menus_deroulants%(i_menus_deroulants%)+1)
          next j_menus_deroulants%
        end_if
        show number_click+1
      else
        if i_menus_deroulants%<n_menus_deroulants%
          for j_menus_deroulants%=i_menus_deroulants%+1 to n_menus_deroulants%
            top table_menus_deroulants%(j_menus_deroulants%), top(table_menus_deroulants%(j_menus_deroulants%)) - height(table_menus_deroulants%(i_menus_deroulants%)+1)
            top table_menus_deroulants%(j_menus_deroulants%)+1, top(table_menus_deroulants%(j_menus_deroulants%)+1) - height(table_menus_deroulants%(i_menus_deroulants%)+1)
          next j_menus_deroulants%
        end_if
        hide number_click+1
      end_if
      return
    end_if
  next i_menus_deroulants%
  return

' ====================================================================================
' cette routine doit être adaptée pour lancer les fonctions de l'application !
' ====================================================================================
click_menu_deroulant_ligne:
  for i_menus_deroulants%=1 to n_menus_deroulants%
    if table_menus_deroulants%(i_menus_deroulants%)=number_click-1
      actuel_menu_deroulant_y% = mouse_y_left_down(number_click)
      actuel_menu_deroulant_y% = int((actuel_menu_deroulant_y%+24)/25)
      message "Menu déroulant "+str$(i_menus_deroulants%)+"  ligne "+str$(actuel_menu_deroulant_y%)
      return
    end_if
  next i_menus_deroulants%
  return
 

Amusez-vous !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Laurent (Minibug)

avatar

Nombre de messages : 2353
Age : 51
Localisation : Vienne (86)
Date d'inscription : 10/02/2012

MessageSujet: Re: Un menu déroulant type "Side Bar"   Dim 7 Déc 2014 - 1:04

Bonsoir Klaus !

Effectivement c'est pas mal...
Mais en matière de menu, je crois que quelques PANEL pourraient faire la même chose ??

J'ai déjà testé cela, on peux faire des boutons colorés avec un texte selon nos besoins.

Et là du coup en ligne de code c'est plus simple pour peu que l'on fasse une boucle pour la création des panels
et les titres en data et quelques ligne suffisent !! Wink
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

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

MessageSujet: Re: Un menu déroulant type "Side Bar"   Dim 7 Déc 2014 - 1:33

C'est vrai. C'est juste une autre façon de faire, copiée sur le comportement des "sidebars" de certaines pages Web.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
papydall

avatar

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

MessageSujet: Re: Un menu déroulant type "Side Bar"   Dim 7 Déc 2014 - 3:04

Hello Klaus

En exécutant ton code :
Erreur : (35) Name already defined.Line : 110

En effet en ligne 110, tu déclares dim_local no% alors que no% est un paramètre de la sub.
Je pense que tu veux dire no1%.
Autre chose, la variable act% n’est déclarée nulle part.

Bon j'y retourne pour mieux voir.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://papydall-panoramic.forumarabia.com/
Klaus

avatar

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

MessageSujet: Re: Un menu déroulant type "Side Bar"   Dim 7 Déc 2014 - 3:08

Tu as raison, Papydall. Un mélange de sources lors d'une correction...

Voici le code valide:
Code:
' test_menu_deroulant.bas

nouveau_menu_deroulant(100,30,30,127,127,255)
titre_menu_deroulant(actuel_menu_deroulant%,"Mon menu 1","Arial",16,1,1,0,0,0)
corps_menu_deroulant(actuel_menu_deroulant%,4,191,191,255,"Century Gothic",10,1,0,0,0,0)
ligne_menu_deroulant(actuel_menu_deroulant%,1,"Première option")
ligne_menu_deroulant(actuel_menu_deroulant%,2,"Deuxième option")
ligne_menu_deroulant(actuel_menu_deroulant%,3,"Troisième option")
ligne_menu_deroulant(actuel_menu_deroulant%,4,"Quatrième option")

nouveau_menu_deroulant(120,30,60,127,127,255)
titre_menu_deroulant(actuel_menu_deroulant%,"Mon menu 2","Arial",16,0,0,0,0,0)
corps_menu_deroulant(actuel_menu_deroulant%,7,191,191,255,"Wingdings",10,1,1,0,0,0)
ligne_menu_deroulant(actuel_menu_deroulant%,1,"Ligne 1")
ligne_menu_deroulant(actuel_menu_deroulant%,2,"Ligne 2")
ligne_menu_deroulant(actuel_menu_deroulant%,3,"Ligne 3")
ligne_menu_deroulant(actuel_menu_deroulant%,4,"Ligne 4")
ligne_menu_deroulant(actuel_menu_deroulant%,5,"Ligne 5")
ligne_menu_deroulant(actuel_menu_deroulant%,6,"Ligne 6")
ligne_menu_deroulant(actuel_menu_deroulant%,7,"Ligne 7")

nouveau_menu_deroulant(140,30,90,127,127,255)
titre_menu_deroulant(actuel_menu_deroulant%,"Mon menu 3","Arial",16,1,1,0,0,0)
corps_menu_deroulant(actuel_menu_deroulant%,4,191,191,255,"MS Serif",10,1,0,0,0,0)
ligne_menu_deroulant(actuel_menu_deroulant%,1,"1ère option")
ligne_menu_deroulant(actuel_menu_deroulant%,2,"2ème option")
ligne_menu_deroulant(actuel_menu_deroulant%,3,"3èmeoption")
ligne_menu_deroulant(actuel_menu_deroulant%,4,"4ème option")

end

' ====================================================================================
' Cette procédure crée un nouveau menu déroulant. Elle utilise 2 objets PICTURE.
' Paramètres:
'   no%  = numéro de l'objet de base à utiliser  (no% et no%+1 doivent être libres)
'   x%, y% = position du coin en haut à gauche du menu*
'   mr%,mg%, mb% = couleurs RGB du fond du menu
' ====================================================================================
sub nouveau_menu_deroulant(no%,x%,y%,mr%,mg%,mb%)
  if label("click_menu_deroulant")=0
    if (object_exists(no%)+object_exists(no%+1))>0
      message "Les objets "str$(no%)+" et/ou "+str$(no%+1)"+" ne sont pas disponibles !'
      exit_sub
    end_if
    dim n_menus_deroulants%, table_menus_deroulants%(50), i_menus_deroulants%
    dim actuel_menu_deroulant%, actuel_menu_deroulant_y%, j_menus_deroulants%,
    label click_menu_deroulant, click_menu_deroulant_ligne
    n_menus_deroulants% = 0
  end_if
  n_menus_deroulants% = n_menus_deroulants% + 1
  table_menus_deroulants%(n_menus_deroulants%) = no%
  actuel_menu_deroulant% = no%
  picture no%
    top no%,y% : left no%,x% : width no%,200 : height no%,25
    color no%,mr%,mg%,mb%
  on_click no%,click_menu_deroulant
end_sub

' ====================================================================================
' Cette procédure écrit le titre du menu dans un menu existant.
' Paramètres:
'   no% = numéro d'objet de base du menu visé
'   titre$ = texte à afficher
'   font$ = nom de la police
'   sz% = taille de la police
'   sg%, si% = styles de la police (gras, italique): indicateurs 0/1
'   fr%, fg%, fb% = couleurs RGB de la police
' ====================================================================================
sub titre_menu_deroulant(no%,titre$,font$,sz%,sg%,si%,fr%,fg%,fb%)
  if sg%<>0 then font_bold no%
  if si%<>0 then font_italic no%
  font_size no%,sz%
  font_color no%,fr%,fg%,fb%
  print_target_is no%
  2d_target_is no%
  2d_fill_color color_pixel_red(no%,1,1),color_pixel_green(no%,1,1),color_pixel_blue(no%,1,1)
  print_locate 20,1
  print titre$
end_sub

' ====================================================================================
' Cette procédure prépare le corps du menu pour un certain nombre de lignes.
' Paramètres:
'   no% = numéro d'objet de base du menu visé
'   nlig% = nombre de lignes de détail pour ce menu
'   mr%, mg%, mb% = couleur RBG du fond du corps du menu
'   font$ = police des lignes de détail
'   sz% = taille de la police
'   sg%,si% = styles de la police (gras, italique): indicateurs 0/1
'   fr%, fg%, fb% = couleurs RGB de la police
' ====================================================================================
sub corps_menu_deroulant(no%,nlig%,mr%,mg%,mb%,font$,sz%,sg%,si%,fr%,fg%,fb%)
  dim_local no1%
  no1% = no% + 1
  picture no1% : hide no1%
    top no1%,top(no1%-1)+25 : left no1%,left(no1%-1)
    width no1%,200 : height no1%,25*nlig%
    font_name no1%,font$
    color no1%,mr%,mg%,mb%
    if sg%<>0 then font_bold no1%
    if si%<>0 then font_italic no1%
    font_size no1%,sz%
    font_color no1%,fr%,fg%,fb%
    on_click no1%,click_menu_deroulant_ligne
end_sub

' ====================================================================================
' Cette procédure écrit une ligne de détail dans le corps d'un menu
'   no% = numéro d'objet de base du menu visé
'   nlig% = numéro de la lignevisée (1,2, ...)
'   texte$ = texte à afficher
' ====================================================================================
sub ligne_menu_deroulant(no%,nlig%,texte$)
  dim_local no1%
  no1% = no% + 1
  print_target_is no1%
  2d_target_is no1%
  2d_fill_color color_pixel_red(no1%,1,1),color_pixel_green(no1%,1,1),color_pixel_blue(no1%,1,1)
  print_locate 20,(nlig%-1)*25+1
  print texte$
end_sub

' ====================================================================================
' cette procédure ne dois en aucun cas être modifiée !
' ====================================================================================
click_menu_deroulant:
  for i_menus_deroulants%=1 to n_menus_deroulants%
    if table_menus_deroulants%(i_menus_deroulants%)=number_click
      if hide(number_click+1)=1
        if i_menus_deroulants%<n_menus_deroulants%
          for j_menus_deroulants%=i_menus_deroulants%+1 to n_menus_deroulants%
            top table_menus_deroulants%(j_menus_deroulants%), top(table_menus_deroulants%(j_menus_deroulants%)) + height(table_menus_deroulants%(i_menus_deroulants%)+1)
            top table_menus_deroulants%(j_menus_deroulants%)+1, top(table_menus_deroulants%(j_menus_deroulants%)+1) + height(table_menus_deroulants%(i_menus_deroulants%)+1)
          next j_menus_deroulants%
        end_if
        show number_click+1
      else
        if i_menus_deroulants%<n_menus_deroulants%
          for j_menus_deroulants%=i_menus_deroulants%+1 to n_menus_deroulants%
            top table_menus_deroulants%(j_menus_deroulants%), top(table_menus_deroulants%(j_menus_deroulants%)) - height(table_menus_deroulants%(i_menus_deroulants%)+1)
            top table_menus_deroulants%(j_menus_deroulants%)+1, top(table_menus_deroulants%(j_menus_deroulants%)+1) - height(table_menus_deroulants%(i_menus_deroulants%)+1)
          next j_menus_deroulants%
        end_if
        hide number_click+1
      end_if
      return
    end_if
  next i_menus_deroulants%
  return

' ====================================================================================
' cette routine doit être adaptée pour lancer les fonctions de l'application !
' ====================================================================================
click_menu_deroulant_ligne:
  for i_menus_deroulants%=1 to n_menus_deroulants%
    if table_menus_deroulants%(i_menus_deroulants%)=number_click-1
      actuel_menu_deroulant_y% = mouse_y_left_down(number_click)
      actuel_menu_deroulant_y% = int((actuel_menu_deroulant_y%+24)/25)
      message "Menu déroulant "+str$(i_menus_deroulants%)+"  ligne "+str$(actuel_menu_deroulant_y%)
      return
    end_if
  next i_menus_deroulants%
  return
  


Dernière édition par Klaus le Dim 7 Déc 2014 - 11:30, édité 1 fois
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
papydall

avatar

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

MessageSujet: Re: Un menu déroulant type "Side Bar"   Dim 7 Déc 2014 - 3:10

Exécution : OK
J'y retourne pour comprendre le pourquoi du comment.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://papydall-panoramic.forumarabia.com/
Klaus

avatar

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

MessageSujet: Re: Un menu déroulant type "Side Bar"   Dim 7 Déc 2014 - 3:20

compare aussi ce que je viens de poster ici...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Yannick

avatar

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

MessageSujet: re   Dim 7 Déc 2014 - 4:51

cheers cheers cheers cheers cheers cheers cheers cheers cheers cheers cheers

Bravo klaus, le rendu est génial.
Si tu peux faire un petit tuto dessus ce serait super pour le mag .
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

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

MessageSujet: Re: Un menu déroulant type "Side Bar"   Dim 7 Déc 2014 - 11:15

D'accord.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Klaus

avatar

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

MessageSujet: Re: Un menu déroulant type "Side Bar"   Dim 7 Déc 2014 - 11:32

J'ai apporté une petite modif dans le source du premier post pour assurer que les deux numéros d'objet par menu sont bien disponibles.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Jean Claude

avatar

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

MessageSujet: Re: Un menu déroulant type "Side Bar"   Dim 7 Déc 2014 - 11:37

Beau travail,

Les SUB(s) ne sont pas bien compliquées à mettre en place, même s'il y a beaucoup de paramètres à renseigner.

Je note au passage l'astuce => if label("click_menu_deroulant")=0,
qui rend la création du menu simple (pas besoin de se préoccuper des déclarations de variables et labels).

Bravo.
A+

Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

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

MessageSujet: Re: Un menu déroulant type "Side Bar"   Lun 8 Déc 2014 - 14:07

Merci, Jean-Claude !

Voici une nouvelle version, encore améliorée. Il y a maintenant une barre verticale optionnelle, très étroite, avec le signe "<" comme libellé. Un clic sur cette barre va faire complètement disparaître le menu (à l'exception de cette barre), et décaler tous les objets de la page vers la gauche. Le libellé de la barre passe à ">". Un nouveau clic sur cette barre remet tout en place:
Code:
' test_menu_deroulant.bas

alpha 1 : top 1,40 : left 1,250 : caption 1,"Un mémo:"
memo 2 : top 2,60 : left 2,250 : width 2,300 : height 2,200

barre_menu_deroulant(50,5,30,height(0)-100,255,127,127)

nouveau_menu_deroulant(100,30,30,127,127,255)
titre_menu_deroulant(actuel_menu_deroulant%,"Mon menu 1","Arial",16,1,1,0,0,0)
corps_menu_deroulant(actuel_menu_deroulant%,4,191,191,255,"Century Gothic",10,1,0,0,0,0)
ligne_menu_deroulant(actuel_menu_deroulant%,1,"Première option")
ligne_menu_deroulant(actuel_menu_deroulant%,2,"Deuxième option")
ligne_menu_deroulant(actuel_menu_deroulant%,3,"Troisième option")
ligne_menu_deroulant(actuel_menu_deroulant%,4,"Quatrième option")

nouveau_menu_deroulant(120,30,60,127,127,255)
titre_menu_deroulant(actuel_menu_deroulant%,"Mon menu 2","Arial",16,0,0,0,0,0)
corps_menu_deroulant(actuel_menu_deroulant%,7,191,191,255,"Times New Roman",10,1,1,0,0,0)
ligne_menu_deroulant(actuel_menu_deroulant%,1,"Ligne 1")
ligne_menu_deroulant(actuel_menu_deroulant%,2,"Ligne 2")
ligne_menu_deroulant(actuel_menu_deroulant%,3,"Ligne 3")
ligne_menu_deroulant(actuel_menu_deroulant%,4,"Ligne 4")
ligne_menu_deroulant(actuel_menu_deroulant%,5,"Ligne 5")
ligne_menu_deroulant(actuel_menu_deroulant%,6,"Ligne 6")
ligne_menu_deroulant(actuel_menu_deroulant%,7,"Ligne 7")

nouveau_menu_deroulant(140,30,90,127,127,255)
titre_menu_deroulant(actuel_menu_deroulant%,"Mon menu 3","Arial",16,1,1,0,0,0)
corps_menu_deroulant(actuel_menu_deroulant%,4,191,191,255,"MS Serif",10,1,0,0,0,0)
ligne_menu_deroulant(actuel_menu_deroulant%,1,"1ère option")
ligne_menu_deroulant(actuel_menu_deroulant%,2,"2ème option")
ligne_menu_deroulant(actuel_menu_deroulant%,3,"3èmeoption")
ligne_menu_deroulant(actuel_menu_deroulant%,4,"4ème option")

end

' ====================================================================================
' Cette procédure crée la barre verticale qui permet de montrer/cacher le menu entier
' Paramètres:

' ====================================================================================
sub barre_menu_deroulant(no%,x%,y%,h%,mr%,mg%,mb%)
  if label("click_menu_deroulant")=0
    if object_exists(no%)>0
      message "L'objets "str$(no%)+" n'est pas disponible !'
      exit_sub
    end_if
    dim barre_menu_deroulant%, k_menus_deroulants%, f_menus_deroulants%
    dim n_menus_deroulants%, table_menus_deroulants%(50), i_menus_deroulants%
    dim actuel_menu_deroulant%, actuel_menu_deroulant_y%, j_menus_deroulants%
    label click_barre_menu_deroulant
    label click_menu_deroulant, click_menu_deroulant_ligne
    n_menus_deroulants% = 0
  end_if
  barre_menu_deroulant% = no%
  picture no%
    top no%,y% : left no%,x% : width no%,10 : height no%,h%
    color no%,mr%,mg%,mb%
  on_click no%,click_barre_menu_deroulant

  font_bold no%
  font_size no%,10
  print_target_is no%
  2d_target_is no%
  2d_fill_color color_pixel_red(no%,1,1),color_pixel_green(no%,1,1),color_pixel_blue(no%,1,1)
  print_locate 1,h%/2
  print "<"
end_sub

' ====================================================================================
' Cette procédure crée un nouveau menu déroulant. Elle utilise 2 objets PICTURE.
' Paramètres:
'   no%  = numéro de l'objet de base à utiliser  (no% et no%+1 doivent être libres)
'   x%, y% = position du coin en haut à gauche du menu*
'   mr%,mg%, mb% = couleurs RGB du fond du menu
' ====================================================================================
sub nouveau_menu_deroulant(no%,x%,y%,mr%,mg%,mb%)
  if label("click_menu_deroulant")=0
    if (object_exists(no%)+object_exists(no%+1))>0
      message "Les objets "str$(no%)+" et/ou "+str$(no%+1)"+" ne sont pas disponibles !'
      exit_sub
    end_if
    dim barre_menu_deroulant%, k_menus_deroulants%, f_menus_deroulants%
    dim n_menus_deroulants%, table_menus_deroulants%(50), i_menus_deroulants%
    dim actuel_menu_deroulant%, actuel_menu_deroulant_y%, j_menus_deroulants%
    label click_barre_menu_deroulant
    label click_menu_deroulant, click_menu_deroulant_ligne
    n_menus_deroulants% = 0
  end_if
  n_menus_deroulants% = n_menus_deroulants% + 1
  table_menus_deroulants%(n_menus_deroulants%) = no%
  actuel_menu_deroulant% = no%
  picture no%
    top no%,y% : left no%,x% : width no%,200 : height no%,25
    color no%,mr%,mg%,mb%
  on_click no%,click_menu_deroulant
end_sub

' ====================================================================================
' Cette procédure écrit le titre du menu dans un menu existant.
' Paramètres:
'   no% = numéro d'objet de base du menu visé
'   titre$ = texte à afficher
'   font$ = nom de la police
'   sz% = taille de la police
'   sg%, si% = styles de la police (gras, italique): indicateurs 0/1
'   fr%, fg%, fb% = couleurs RGB de la police
' ====================================================================================
sub titre_menu_deroulant(no%,titre$,font$,sz%,sg%,si%,fr%,fg%,fb%)
  if sg%<>0 then font_bold no%
  if si%<>0 then font_italic no%
  font_size no%,sz%
  font_color no%,fr%,fg%,fb%
  print_target_is no%
  2d_target_is no%
  2d_fill_color color_pixel_red(no%,1,1),color_pixel_green(no%,1,1),color_pixel_blue(no%,1,1)
  print_locate 20,1
  print titre$
end_sub

' ====================================================================================
' Cette procédure prépare le corps du menu pour un certain nombre de lignes.
' Paramètres:
'   no% = numéro d'objet de base du menu visé
'   nlig% = nombre de lignes de détail pour ce menu
'   mr%, mg%, mb% = couleur RBG du fond du corps du menu
'   font$ = police des lignes de détail
'   sz% = taille de la police
'   sg%,si% = styles de la police (gras, italique): indicateurs 0/1
'   fr%, fg%, fb% = couleurs RGB de la police
' ====================================================================================
sub corps_menu_deroulant(no%,nlig%,mr%,mg%,mb%,font$,sz%,sg%,si%,fr%,fg%,fb%)
  dim_local no1%
  no1% = no% + 1
  picture no1% : hide no1%
    top no1%,top(no1%-1)+25 : left no1%,left(no1%-1) + 10
    width no1%,200 : height no1%,25*nlig%
    font_name no1%,font$
    color no1%,mr%,mg%,mb%
    if sg%<>0 then font_bold no1%
    if si%<>0 then font_italic no1%
    font_size no1%,sz%
    font_color no1%,fr%,fg%,fb%
    on_click no1%,click_menu_deroulant_ligne
end_sub

' ====================================================================================
' Cette procédure écrit une ligne de détail dans le corps d'un menu
'   no% = numéro d'objet de base du menu visé
'   nlig% = numéro de la lignevisée (1,2, ...)
'   texte$ = texte à afficher
' ====================================================================================
sub ligne_menu_deroulant(no%,nlig%,texte$)
  dim_local no1%
  no1% = no% + 1
  print_target_is no1%
  2d_target_is no1%
  2d_fill_color color_pixel_red(no1%,1,1),color_pixel_green(no1%,1,1),color_pixel_blue(no1%,1,1)
  print_locate 20,(nlig%-1)*25+1
  print texte$
end_sub

' ====================================================================================
' cette procédure ne dois en aucun cas être modifiée !
' ====================================================================================
click_menu_deroulant:
  for i_menus_deroulants%=1 to n_menus_deroulants%
    if table_menus_deroulants%(i_menus_deroulants%)=number_click
      if hide(number_click+1)=1
        if i_menus_deroulants%<n_menus_deroulants%
          for j_menus_deroulants%=i_menus_deroulants%+1 to n_menus_deroulants%
            top table_menus_deroulants%(j_menus_deroulants%), top(table_menus_deroulants%(j_menus_deroulants%)) + height(table_menus_deroulants%(i_menus_deroulants%)+1)
            top table_menus_deroulants%(j_menus_deroulants%)+1, top(table_menus_deroulants%(j_menus_deroulants%)+1) + height(table_menus_deroulants%(i_menus_deroulants%)+1)
          next j_menus_deroulants%
        end_if
        show number_click+1
      else
        if i_menus_deroulants%<n_menus_deroulants%
          for j_menus_deroulants%=i_menus_deroulants%+1 to n_menus_deroulants%
            top table_menus_deroulants%(j_menus_deroulants%), top(table_menus_deroulants%(j_menus_deroulants%)) - height(table_menus_deroulants%(i_menus_deroulants%)+1)
            top table_menus_deroulants%(j_menus_deroulants%)+1, top(table_menus_deroulants%(j_menus_deroulants%)+1) - height(table_menus_deroulants%(i_menus_deroulants%)+1)
          next j_menus_deroulants%
        end_if
        hide number_click+1
      end_if
      return
    end_if
  next i_menus_deroulants%
  return

' ====================================================================================
' ====================================================================================
click_barre_menu_deroulant:
  if n_menus_deroulants%>0
    j_menus_deroulants% = 2000
    k_menus_deroulants% = 200
    if left(table_menus_deroulants%(1))>0 then j_menus_deroulants% = 0 - 2000
    if left(table_menus_deroulants%(1))>0 then k_menus_deroulants% = 0 - 200
    for i_menus_deroulants%=1 to n_menus_deroulants%
      left table_menus_deroulants%(i_menus_deroulants%), left(table_menus_deroulants%(i_menus_deroulants%)) + j_menus_deroulants%
      left table_menus_deroulants%(i_menus_deroulants%)+1, left(table_menus_deroulants%(i_menus_deroulants%)+1) + j_menus_deroulants%
    next i_menus_deroulants%
    print_target_is number_click
    print_locate 1,height(number_click)/2
    if j_menus_deroulants%>0
      print "<"
    else
      print ">"
    end_if
    for i_menus_deroulants%=1 to 200 : ' 32000 : ' limite théorique, mais c'est lent !
      if object_exists(i_menus_deroulants%)=1
        f_menus_deroulants% = 1
        if i_menus_deroulants%=barre_menu_deroulant%
          f_menus_deroulants% = 0
        else
          for j_menus_deroulants%=1 to n_menus_deroulants%
            if table_menus_deroulants%(j_menus_deroulants%)=i_menus_deroulants% then f_menus_deroulants% = 0
            if (table_menus_deroulants%(j_menus_deroulants%)+1)=i_menus_deroulants% then f_menus_deroulants% = 0
          next j_menus_deroulants%
        end_if
        if f_menus_deroulants%>0 then left i_menus_deroulants%,left(i_menus_deroulants%) + k_menus_deroulants%
      end_if
    next i_menus_deroulants%
  end_if
  return
  
' ====================================================================================
' cette routine doit être adaptée pour lancer les fonctions de l'application !
' ====================================================================================
click_menu_deroulant_ligne:
  for i_menus_deroulants%=1 to n_menus_deroulants%
    if table_menus_deroulants%(i_menus_deroulants%)=number_click-1
      actuel_menu_deroulant_y% = mouse_y_left_down(number_click)
      actuel_menu_deroulant_y% = int((actuel_menu_deroulant_y%+24)/25)
      message "Menu déroulant "+str$(i_menus_deroulants%)+"  ligne "+str$(actuel_menu_deroulant_y%)
      return
    end_if
  next i_menus_deroulants%
  return
  

EDIT

La présence de la barre latérale est parfaitement optionnelle. Si l'on ne la souhaite pas, il suffit de ne pas faire appel à la procédure barre_menu_deroulant, tout simplement.

EDIT

J'ai décalé légèrement le sous-menu pour un meilleur visuel. Le code est à jour dans ce post.


Dernière édition par Klaus le Lun 8 Déc 2014 - 15:18, édité 1 fois
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Jicehel

avatar

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

MessageSujet: Re: Un menu déroulant type "Side Bar"   Lun 8 Déc 2014 - 14:20

Merci Klaus
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

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

MessageSujet: Re: Un menu déroulant type "Side Bar"   Lun 8 Déc 2014 - 17:08

Nouvelle version. Elle n'apporte rien visuellement, mais une sécurité supplémentaire. Car, dans le cas de la barre de droite qui fait disparaître le menu, tous les objets visibles sont décalés vers la gauche, et inversement. Or, il ne faut toucher, ni les objets invisibles, ni ceux qui ont un parent différent de celuidu menu. Voici la version sécurisée:
Code:
' test_menu_deroulant.bas

alpha 1 : top 1,40 : left 1,250 : caption 1,"Un mémo:"
memo 2 : top 2,60 : left 2,250 : width 2,300 : height 2,200

panel 3 : top 3,300 : left 3,270
edit 4 : parent 4,3 : top 4,10 : left 4,10

barre_menu_deroulant(50,5,30,height(0)-100,255,127,127)

nouveau_menu_deroulant(100,30,30,127,127,255)
titre_menu_deroulant(actuel_menu_deroulant%,"Mon menu 1","Arial",16,1,1,0,0,0)
corps_menu_deroulant(actuel_menu_deroulant%,4,191,191,255,"Century Gothic",10,1,0,0,0,0)
ligne_menu_deroulant(actuel_menu_deroulant%,1,"Première option")
ligne_menu_deroulant(actuel_menu_deroulant%,2,"Deuxième option")
ligne_menu_deroulant(actuel_menu_deroulant%,3,"Troisième option")
ligne_menu_deroulant(actuel_menu_deroulant%,4,"Quatrième option")

nouveau_menu_deroulant(120,30,60,127,127,255)
titre_menu_deroulant(actuel_menu_deroulant%,"Mon menu 2","Arial",16,0,0,0,0,0)
corps_menu_deroulant(actuel_menu_deroulant%,7,191,191,255,"Times New Roman",10,1,1,0,0,0)
ligne_menu_deroulant(actuel_menu_deroulant%,1,"Ligne 1")
ligne_menu_deroulant(actuel_menu_deroulant%,2,"Ligne 2")
ligne_menu_deroulant(actuel_menu_deroulant%,3,"Ligne 3")
ligne_menu_deroulant(actuel_menu_deroulant%,4,"Ligne 4")
ligne_menu_deroulant(actuel_menu_deroulant%,5,"Ligne 5")
ligne_menu_deroulant(actuel_menu_deroulant%,6,"Ligne 6")
ligne_menu_deroulant(actuel_menu_deroulant%,7,"Ligne 7")

nouveau_menu_deroulant(140,30,90,127,127,255)
titre_menu_deroulant(actuel_menu_deroulant%,"Mon menu 3","Arial",16,1,1,0,0,0)
corps_menu_deroulant(actuel_menu_deroulant%,4,191,191,255,"MS Serif",10,1,0,0,0,0)
ligne_menu_deroulant(actuel_menu_deroulant%,1,"1ère option")
ligne_menu_deroulant(actuel_menu_deroulant%,2,"2ème option")
ligne_menu_deroulant(actuel_menu_deroulant%,3,"3èmeoption")
ligne_menu_deroulant(actuel_menu_deroulant%,4,"4ème option")

end

' ====================================================================================
' Cette procédure crée la barre verticale qui permet de montrer/cacher le menu entier
' Paramètres:

' ====================================================================================
sub barre_menu_deroulant(no%,x%,y%,h%,mr%,mg%,mb%)
  if label("click_menu_deroulant")=0
    if object_exists(no%)>0
      message "L'objets "str$(no%)+" n'est pas disponible !'
      exit_sub
    end_if
    dim barre_menu_deroulant%, k_menus_deroulants%, f_menus_deroulants%
    dim n_menus_deroulants%, table_menus_deroulants%(50), i_menus_deroulants%
    dim actuel_menu_deroulant%, actuel_menu_deroulant_y%, j_menus_deroulants%
    label click_barre_menu_deroulant
    label click_menu_deroulant, click_menu_deroulant_ligne
    n_menus_deroulants% = 0
  end_if
  barre_menu_deroulant% = no%
  picture no%
    top no%,y% : left no%,x% : width no%,10 : height no%,h%
    color no%,mr%,mg%,mb%
  on_click no%,click_barre_menu_deroulant

  font_bold no%
  font_size no%,10
  print_target_is no%
  2d_target_is no%
  2d_fill_color color_pixel_red(no%,1,1),color_pixel_green(no%,1,1),color_pixel_blue(no%,1,1)
  print_locate 1,h%/2
  print "<"
end_sub

' ====================================================================================
' Cette procédure crée un nouveau menu déroulant. Elle utilise 2 objets PICTURE.
' Paramètres:
'  no%  = numéro de l'objet de base à utiliser  (no% et no%+1 doivent être libres)
'  x%, y% = position du coin en haut à gauche du menu*
'  mr%,mg%, mb% = couleurs RGB du fond du menu
' ====================================================================================
sub nouveau_menu_deroulant(no%,x%,y%,mr%,mg%,mb%)
  if label("click_menu_deroulant")=0
    if (object_exists(no%)+object_exists(no%+1))>0
      message "Les objets "str$(no%)+" et/ou "+str$(no%+1)"+" ne sont pas disponibles !'
      exit_sub
    end_if
    dim barre_menu_deroulant%, k_menus_deroulants%, f_menus_deroulants%
    dim n_menus_deroulants%, table_menus_deroulants%(50), i_menus_deroulants%
    dim actuel_menu_deroulant%, actuel_menu_deroulant_y%, j_menus_deroulants%
    label click_barre_menu_deroulant
    label click_menu_deroulant, click_menu_deroulant_ligne
    n_menus_deroulants% = 0
  end_if
  n_menus_deroulants% = n_menus_deroulants% + 1
  table_menus_deroulants%(n_menus_deroulants%) = no%
  actuel_menu_deroulant% = no%
  picture no%
    top no%,y% : left no%,x% : width no%,200 : height no%,25
    color no%,mr%,mg%,mb%
  on_click no%,click_menu_deroulant
end_sub

' ====================================================================================
' Cette procédure écrit le titre du menu dans un menu existant.
' Paramètres:
'  no% = numéro d'objet de base du menu visé
'  titre$ = texte à afficher
'  font$ = nom de la police
'  sz% = taille de la police
'  sg%, si% = styles de la police (gras, italique): indicateurs 0/1
'  fr%, fg%, fb% = couleurs RGB de la police
' ====================================================================================
sub titre_menu_deroulant(no%,titre$,font$,sz%,sg%,si%,fr%,fg%,fb%)
  if sg%<>0 then font_bold no%
  if si%<>0 then font_italic no%
  font_size no%,sz%
  font_color no%,fr%,fg%,fb%
  print_target_is no%
  2d_target_is no%
  2d_fill_color color_pixel_red(no%,1,1),color_pixel_green(no%,1,1),color_pixel_blue(no%,1,1)
  print_locate 20,1
  print titre$
end_sub

' ====================================================================================
' Cette procédure prépare le corps du menu pour un certain nombre de lignes.
' Paramètres:
'  no% = numéro d'objet de base du menu visé
'  nlig% = nombre de lignes de détail pour ce menu
'  mr%, mg%, mb% = couleur RBG du fond du corps du menu
'  font$ = police des lignes de détail
'  sz% = taille de la police
'  sg%,si% = styles de la police (gras, italique): indicateurs 0/1
'  fr%, fg%, fb% = couleurs RGB de la police
' ====================================================================================
sub corps_menu_deroulant(no%,nlig%,mr%,mg%,mb%,font$,sz%,sg%,si%,fr%,fg%,fb%)
  dim_local no1%
  no1% = no% + 1
  picture no1% : hide no1%
    top no1%,top(no1%-1)+25 : left no1%,left(no1%-1)+10
    width no1%,200 : height no1%,25*nlig%
    font_name no1%,font$
    color no1%,mr%,mg%,mb%
    if sg%<>0 then font_bold no1%
    if si%<>0 then font_italic no1%
    font_size no1%,sz%
    font_color no1%,fr%,fg%,fb%
    on_click no1%,click_menu_deroulant_ligne
end_sub

' ====================================================================================
' Cette procédure écrit une ligne de détail dans le corps d'un menu
'  no% = numéro d'objet de base du menu visé
'  nlig% = numéro de la lignevisée (1,2, ...)
'  texte$ = texte à afficher
' ====================================================================================
sub ligne_menu_deroulant(no%,nlig%,texte$)
  dim_local no1%
  no1% = no% + 1
  print_target_is no1%
  2d_target_is no1%
  2d_fill_color color_pixel_red(no1%,1,1),color_pixel_green(no1%,1,1),color_pixel_blue(no1%,1,1)
  print_locate 20,(nlig%-1)*25+1
  print texte$
end_sub

' ====================================================================================
' cette procédure ne dois en aucun cas être modifiée !
' ====================================================================================
click_menu_deroulant:
  for i_menus_deroulants%=1 to n_menus_deroulants%
    if table_menus_deroulants%(i_menus_deroulants%)=number_click
      if hide(number_click+1)=1
        if i_menus_deroulants%<n_menus_deroulants%
          for j_menus_deroulants%=i_menus_deroulants%+1 to n_menus_deroulants%
            top table_menus_deroulants%(j_menus_deroulants%), top(table_menus_deroulants%(j_menus_deroulants%)) + height(table_menus_deroulants%(i_menus_deroulants%)+1)
            top table_menus_deroulants%(j_menus_deroulants%)+1, top(table_menus_deroulants%(j_menus_deroulants%)+1) + height(table_menus_deroulants%(i_menus_deroulants%)+1)
          next j_menus_deroulants%
        end_if
        show number_click+1
      else
        if i_menus_deroulants%<n_menus_deroulants%
          for j_menus_deroulants%=i_menus_deroulants%+1 to n_menus_deroulants%
            top table_menus_deroulants%(j_menus_deroulants%), top(table_menus_deroulants%(j_menus_deroulants%)) - height(table_menus_deroulants%(i_menus_deroulants%)+1)
            top table_menus_deroulants%(j_menus_deroulants%)+1, top(table_menus_deroulants%(j_menus_deroulants%)+1) - height(table_menus_deroulants%(i_menus_deroulants%)+1)
          next j_menus_deroulants%
        end_if
        hide number_click+1
      end_if
      return
    end_if
  next i_menus_deroulants%
  return

' ====================================================================================
' ====================================================================================
click_barre_menu_deroulant:
  if n_menus_deroulants%>0
    j_menus_deroulants% = 2000
    k_menus_deroulants% = 200
    if left(table_menus_deroulants%(1))>0 then j_menus_deroulants% = 0 - 2000
    if left(table_menus_deroulants%(1))>0 then k_menus_deroulants% = 0 - 200
    for i_menus_deroulants%=1 to n_menus_deroulants%
      left table_menus_deroulants%(i_menus_deroulants%), left(table_menus_deroulants%(i_menus_deroulants%)) + j_menus_deroulants%
      left table_menus_deroulants%(i_menus_deroulants%)+1, left(table_menus_deroulants%(i_menus_deroulants%)+1) + j_menus_deroulants%
    next i_menus_deroulants%
    print_target_is number_click
    print_locate 1,height(number_click)/2
    if j_menus_deroulants%>0
      print "<"
    else
      print ">"
    end_if
    for i_menus_deroulants%=1 to 200 : ' 32000 : ' limite théorique, mais c'est lent !
      if object_exists(i_menus_deroulants%)=1
        f_menus_deroulants% = 1
        if i_menus_deroulants%=barre_menu_deroulant%
          f_menus_deroulants% = 0
        else
          for j_menus_deroulants%=1 to n_menus_deroulants%
            if table_menus_deroulants%(j_menus_deroulants%)=i_menus_deroulants% then f_menus_deroulants% = 0
            if (table_menus_deroulants%(j_menus_deroulants%)+1)=i_menus_deroulants% then f_menus_deroulants% = 0
          next j_menus_deroulants%
        end_if
        if object_parent(i_menus_deroulants%)<>object_parent(table_menus_deroulants%(1)) then f_menus_deroulants% = 0
        j_menus_deroulants% = object_type(i_menus_deroulants%)
        if j_menus_deroulants%=7  then f_menus_deroulants% = 0
        if j_menus_deroulants%=12 then f_menus_deroulants% = 0
        if j_menus_deroulants%=13 then f_menus_deroulants% = 0
        if j_menus_deroulants%=14 then f_menus_deroulants% = 0
        if j_menus_deroulants%=17 then f_menus_deroulants% = 0
        if j_menus_deroulants%=18 then f_menus_deroulants% = 0
        if j_menus_deroulants%=26 then f_menus_deroulants% = 0
        if j_menus_deroulants%=28 then f_menus_deroulants% = 0
        if j_menus_deroulants%=41 then f_menus_deroulants% = 0
        if f_menus_deroulants%>0 then left i_menus_deroulants%,left(i_menus_deroulants%) + k_menus_deroulants%
      end_if
    next i_menus_deroulants%
  end_if
  return
 
' ====================================================================================
' cette routine doit être adaptée pour lancer les fonctions de l'application !
' ====================================================================================
click_menu_deroulant_ligne:
  for i_menus_deroulants%=1 to n_menus_deroulants%
    if table_menus_deroulants%(i_menus_deroulants%)=number_click-1
      actuel_menu_deroulant_y% = mouse_y_left_down(number_click)
      actuel_menu_deroulant_y% = int((actuel_menu_deroulant_y%+24)/25)
      message "Menu déroulant "+str$(i_menus_deroulants%)+"  ligne "+str$(actuel_menu_deroulant_y%)
      return
    end_if
  next i_menus_deroulants%
  return
 
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Yannick

avatar

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

MessageSujet: re   Lun 8 Déc 2014 - 18:04

Pour un meilleur rendu, il serait bien que la barre avec le > ou < soit placée à droite du menu lorsqu'il est déplié (ou étiré comme vous voulez).
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

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

MessageSujet: Re: Un menu déroulant type "Side Bar"   Lun 8 Déc 2014 - 19:45

Je vais voir ça.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Klaus

avatar

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

MessageSujet: Re: Un menu déroulant type "Side Bar"   Lun 8 Déc 2014 - 19:49

Comme ça ?

Code:
' test_menu_deroulant.bas

alpha 1 : top 1,40 : left 1,250 : caption 1,"Un mémo:"
memo 2 : top 2,60 : left 2,250 : width 2,300 : height 2,200

panel 3 : top 3,300 : left 3,270
edit 4 : parent 4,3 : top 4,10 : left 4,10

barre_menu_deroulant(50,220,30,height(0)-100,255,127,127)

nouveau_menu_deroulant(100,5,30,127,127,255)
titre_menu_deroulant(actuel_menu_deroulant%,"Mon menu 1","Arial",16,1,1,0,0,0)
corps_menu_deroulant(actuel_menu_deroulant%,4,191,191,255,"Century Gothic",10,1,0,0,0,0)
ligne_menu_deroulant(actuel_menu_deroulant%,1,"Première option")
ligne_menu_deroulant(actuel_menu_deroulant%,2,"Deuxième option")
ligne_menu_deroulant(actuel_menu_deroulant%,3,"Troisième option")
ligne_menu_deroulant(actuel_menu_deroulant%,4,"Quatrième option")

nouveau_menu_deroulant(120,5,60,127,127,255)
titre_menu_deroulant(actuel_menu_deroulant%,"Mon menu 2","Arial",16,0,0,0,0,0)
corps_menu_deroulant(actuel_menu_deroulant%,7,191,191,255,"Times New Roman",10,1,1,0,0,0)
ligne_menu_deroulant(actuel_menu_deroulant%,1,"Ligne 1")
ligne_menu_deroulant(actuel_menu_deroulant%,2,"Ligne 2")
ligne_menu_deroulant(actuel_menu_deroulant%,3,"Ligne 3")
ligne_menu_deroulant(actuel_menu_deroulant%,4,"Ligne 4")
ligne_menu_deroulant(actuel_menu_deroulant%,5,"Ligne 5")
ligne_menu_deroulant(actuel_menu_deroulant%,6,"Ligne 6")
ligne_menu_deroulant(actuel_menu_deroulant%,7,"Ligne 7")

nouveau_menu_deroulant(140,5,90,127,127,255)
titre_menu_deroulant(actuel_menu_deroulant%,"Mon menu 3","Arial",16,1,1,0,0,0)
corps_menu_deroulant(actuel_menu_deroulant%,4,191,191,255,"MS Serif",10,1,0,0,0,0)
ligne_menu_deroulant(actuel_menu_deroulant%,1,"1ère option")
ligne_menu_deroulant(actuel_menu_deroulant%,2,"2ème option")
ligne_menu_deroulant(actuel_menu_deroulant%,3,"3èmeoption")
ligne_menu_deroulant(actuel_menu_deroulant%,4,"4ème option")

end

' ====================================================================================
' Cette procédure crée la barre verticale qui permet de montrer/cacher le menu entier
' Paramètres:

' ====================================================================================
sub barre_menu_deroulant(no%,x%,y%,h%,mr%,mg%,mb%)
  if label("click_menu_deroulant")=0
    if object_exists(no%)>0
      message "L'objets "str$(no%)+" n'est pas disponible !'
      exit_sub
    end_if
    dim barre_menu_deroulant%, k_menus_deroulants%, f_menus_deroulants%
    dim n_menus_deroulants%, table_menus_deroulants%(50), i_menus_deroulants%
    dim actuel_menu_deroulant%, actuel_menu_deroulant_y%, j_menus_deroulants%
    label click_barre_menu_deroulant
    label click_menu_deroulant, click_menu_deroulant_ligne
    n_menus_deroulants% = 0
  end_if
  barre_menu_deroulant% = no%
  picture no%
    top no%,y% : left no%,x% : width no%,10 : height no%,h%
    color no%,mr%,mg%,mb%
  on_click no%,click_barre_menu_deroulant

  font_bold no%
  font_size no%,10
  print_target_is no%
  2d_target_is no%
  2d_fill_color color_pixel_red(no%,1,1),color_pixel_green(no%,1,1),color_pixel_blue(no%,1,1)
  print_locate 1,h%/2
  print "<"
end_sub

' ====================================================================================
' Cette procédure crée un nouveau menu déroulant. Elle utilise 2 objets PICTURE.
' Paramètres:
'  no%  = numéro de l'objet de base à utiliser  (no% et no%+1 doivent être libres)
'  x%, y% = position du coin en haut à gauche du menu*
'  mr%,mg%, mb% = couleurs RGB du fond du menu
' ====================================================================================
sub nouveau_menu_deroulant(no%,x%,y%,mr%,mg%,mb%)
  if label("click_menu_deroulant")=0
    if (object_exists(no%)+object_exists(no%+1))>0
      message "Les objets "str$(no%)+" et/ou "+str$(no%+1)"+" ne sont pas disponibles !'
      exit_sub
    end_if
    dim barre_menu_deroulant%, k_menus_deroulants%, f_menus_deroulants%
    dim n_menus_deroulants%, table_menus_deroulants%(50), i_menus_deroulants%
    dim actuel_menu_deroulant%, actuel_menu_deroulant_y%, j_menus_deroulants%
    label click_barre_menu_deroulant
    label click_menu_deroulant, click_menu_deroulant_ligne
    n_menus_deroulants% = 0
  end_if
  n_menus_deroulants% = n_menus_deroulants% + 1
  table_menus_deroulants%(n_menus_deroulants%) = no%
  actuel_menu_deroulant% = no%
  picture no%
    top no%,y% : left no%,x% : width no%,200 : height no%,25
    color no%,mr%,mg%,mb%
  on_click no%,click_menu_deroulant
end_sub

' ====================================================================================
' Cette procédure écrit le titre du menu dans un menu existant.
' Paramètres:
'  no% = numéro d'objet de base du menu visé
'  titre$ = texte à afficher
'  font$ = nom de la police
'  sz% = taille de la police
'  sg%, si% = styles de la police (gras, italique): indicateurs 0/1
'  fr%, fg%, fb% = couleurs RGB de la police
' ====================================================================================
sub titre_menu_deroulant(no%,titre$,font$,sz%,sg%,si%,fr%,fg%,fb%)
  if sg%<>0 then font_bold no%
  if si%<>0 then font_italic no%
  font_size no%,sz%
  font_color no%,fr%,fg%,fb%
  print_target_is no%
  2d_target_is no%
  2d_fill_color color_pixel_red(no%,1,1),color_pixel_green(no%,1,1),color_pixel_blue(no%,1,1)
  print_locate 20,1
  print titre$
end_sub

' ====================================================================================
' Cette procédure prépare le corps du menu pour un certain nombre de lignes.
' Paramètres:
'  no% = numéro d'objet de base du menu visé
'  nlig% = nombre de lignes de détail pour ce menu
'  mr%, mg%, mb% = couleur RBG du fond du corps du menu
'  font$ = police des lignes de détail
'  sz% = taille de la police
'  sg%,si% = styles de la police (gras, italique): indicateurs 0/1
'  fr%, fg%, fb% = couleurs RGB de la police
' ====================================================================================
sub corps_menu_deroulant(no%,nlig%,mr%,mg%,mb%,font$,sz%,sg%,si%,fr%,fg%,fb%)
  dim_local no1%
  no1% = no% + 1
  picture no1% : hide no1%
    top no1%,top(no1%-1)+25 : left no1%,left(no1%-1)+10
    width no1%,200 : height no1%,25*nlig%
    font_name no1%,font$
    color no1%,mr%,mg%,mb%
    if sg%<>0 then font_bold no1%
    if si%<>0 then font_italic no1%
    font_size no1%,sz%
    font_color no1%,fr%,fg%,fb%
    on_click no1%,click_menu_deroulant_ligne
end_sub

' ====================================================================================
' Cette procédure écrit une ligne de détail dans le corps d'un menu
'  no% = numéro d'objet de base du menu visé
'  nlig% = numéro de la lignevisée (1,2, ...)
'  texte$ = texte à afficher
' ====================================================================================
sub ligne_menu_deroulant(no%,nlig%,texte$)
  dim_local no1%
  no1% = no% + 1
  print_target_is no1%
  2d_target_is no1%
  2d_fill_color color_pixel_red(no1%,1,1),color_pixel_green(no1%,1,1),color_pixel_blue(no1%,1,1)
  print_locate 20,(nlig%-1)*25+1
  print texte$
end_sub

' ====================================================================================
' cette procédure ne dois en aucun cas être modifiée !
' ====================================================================================
click_menu_deroulant:
  for i_menus_deroulants%=1 to n_menus_deroulants%
    if table_menus_deroulants%(i_menus_deroulants%)=number_click
      if hide(number_click+1)=1
        if i_menus_deroulants%<n_menus_deroulants%
          for j_menus_deroulants%=i_menus_deroulants%+1 to n_menus_deroulants%
            top table_menus_deroulants%(j_menus_deroulants%), top(table_menus_deroulants%(j_menus_deroulants%)) + height(table_menus_deroulants%(i_menus_deroulants%)+1)
            top table_menus_deroulants%(j_menus_deroulants%)+1, top(table_menus_deroulants%(j_menus_deroulants%)+1) + height(table_menus_deroulants%(i_menus_deroulants%)+1)
          next j_menus_deroulants%
        end_if
        show number_click+1
      else
        if i_menus_deroulants%<n_menus_deroulants%
          for j_menus_deroulants%=i_menus_deroulants%+1 to n_menus_deroulants%
            top table_menus_deroulants%(j_menus_deroulants%), top(table_menus_deroulants%(j_menus_deroulants%)) - height(table_menus_deroulants%(i_menus_deroulants%)+1)
            top table_menus_deroulants%(j_menus_deroulants%)+1, top(table_menus_deroulants%(j_menus_deroulants%)+1) - height(table_menus_deroulants%(i_menus_deroulants%)+1)
          next j_menus_deroulants%
        end_if
        hide number_click+1
      end_if
      return
    end_if
  next i_menus_deroulants%
  return

' ====================================================================================
' ====================================================================================
click_barre_menu_deroulant:
  if n_menus_deroulants%>0
    j_menus_deroulants% = 2000
    k_menus_deroulants% = 200
    if left(table_menus_deroulants%(1))>0 then j_menus_deroulants% = 0 - 2000
    if left(table_menus_deroulants%(1))>0 then k_menus_deroulants% = 0 - 200
    for i_menus_deroulants%=1 to n_menus_deroulants%
      left table_menus_deroulants%(i_menus_deroulants%), left(table_menus_deroulants%(i_menus_deroulants%)) + j_menus_deroulants%
      left table_menus_deroulants%(i_menus_deroulants%)+1, left(table_menus_deroulants%(i_menus_deroulants%)+1) + j_menus_deroulants%
    next i_menus_deroulants%
    print_target_is number_click
    print_locate 1,height(number_click)/2
    if j_menus_deroulants%>0
      print "<"
    else
      print ">"
    end_if
    for i_menus_deroulants%=1 to 200 : ' 32000 : ' limite théorique, mais c'est lent !
      if object_exists(i_menus_deroulants%)=1
        f_menus_deroulants% = 1
        if i_menus_deroulants%<>barre_menu_deroulant%
          for j_menus_deroulants%=1 to n_menus_deroulants%
            if table_menus_deroulants%(j_menus_deroulants%)=i_menus_deroulants% then f_menus_deroulants% = 0
            if (table_menus_deroulants%(j_menus_deroulants%)+1)=i_menus_deroulants% then f_menus_deroulants% = 0
          next j_menus_deroulants%
        end_if
        if object_parent(i_menus_deroulants%)<>object_parent(table_menus_deroulants%(1)) then f_menus_deroulants% = 0
        j_menus_deroulants% = object_type(i_menus_deroulants%)
        if j_menus_deroulants%=7  then f_menus_deroulants% = 0
        if j_menus_deroulants%=12 then f_menus_deroulants% = 0
        if j_menus_deroulants%=13 then f_menus_deroulants% = 0
        if j_menus_deroulants%=14 then f_menus_deroulants% = 0
        if j_menus_deroulants%=17 then f_menus_deroulants% = 0
        if j_menus_deroulants%=18 then f_menus_deroulants% = 0
        if j_menus_deroulants%=26 then f_menus_deroulants% = 0
        if j_menus_deroulants%=28 then f_menus_deroulants% = 0
        if j_menus_deroulants%=41 then f_menus_deroulants% = 0
        if f_menus_deroulants%>0 then left i_menus_deroulants%,left(i_menus_deroulants%) + k_menus_deroulants%
      end_if
    next i_menus_deroulants%
  end_if
  return
 
' ====================================================================================
' cette routine doit être adaptée pour lancer les fonctions de l'application !
' ====================================================================================
click_menu_deroulant_ligne:
  for i_menus_deroulants%=1 to n_menus_deroulants%
    if table_menus_deroulants%(i_menus_deroulants%)=number_click-1
      actuel_menu_deroulant_y% = mouse_y_left_down(number_click)
      actuel_menu_deroulant_y% = int((actuel_menu_deroulant_y%+24)/25)
      message "Menu déroulant "+str$(i_menus_deroulants%)+"  ligne "+str$(actuel_menu_deroulant_y%)
      return
    end_if
  next i_menus_deroulants%
  return
 
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Klaus

avatar

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

MessageSujet: Re: Un menu déroulant type "Side Bar"   Mar 9 Déc 2014 - 2:41

Et nouvelle version: j'ai déplacé les paramètres de police, taille, attributs et couleur pour le corps d'un menu de la procédure de création du corps vers la procédure d'écriture d'une ligne. Du coup, on peut avoir des lignes aux graphismes et couleurs différentes, dans le même sous-menu:
Code:
' test_menu_deroulant.bas

alpha 1 : top 1,40 : left 1,250 : caption 1,"Un mémo:"
memo 2 : top 2,60 : left 2,250 : width 2,300 : height 2,200

panel 3 : top 3,300 : left 3,270
edit 4 : parent 4,3 : top 4,10 : left 4,10

barre_menu_deroulant(50,220,30,height(0)-100,255,127,127)

nouveau_menu_deroulant(100,5,30,127,127,255)
titre_menu_deroulant(actuel_menu_deroulant%,"Mon menu 1","Arial",16,1,1,0,0,0)
corps_menu_deroulant(actuel_menu_deroulant%,4,191,191,255)
ligne_menu_deroulant(actuel_menu_deroulant%,1,"Première option","Century Gothic",10,1,0,0,0,0)
ligne_menu_deroulant(actuel_menu_deroulant%,2,"Deuxième option","Century Gothic",10,1,0,0,0,0)
ligne_menu_deroulant(actuel_menu_deroulant%,3,"Troisième option","Century Gothic",10,1,0,0,0,0)
ligne_menu_deroulant(actuel_menu_deroulant%,4,"Quatrième option","Century Gothic",10,1,0,0,0,0)

nouveau_menu_deroulant(120,5,60,127,127,255)
titre_menu_deroulant(actuel_menu_deroulant%,"Mon menu 2","Arial",16,0,0,0,0,0)
corps_menu_deroulant(actuel_menu_deroulant%,7,191,191,255)
ligne_menu_deroulant(actuel_menu_deroulant%,1,"Ligne 1","Century Gothic",10,1,1,0,0,0)
ligne_menu_deroulant(actuel_menu_deroulant%,2,"Ligne 2","Arial",10,1,0,0,0,0)
ligne_menu_deroulant(actuel_menu_deroulant%,3,"Ligne 3","MS Serif",10,0,1,0,0,0)
ligne_menu_deroulant(actuel_menu_deroulant%,4,"Ligne 4","Times New Roman",10,0,0,0,0,0)
ligne_menu_deroulant(actuel_menu_deroulant%,5,"Ligne 5","Times New Roman",10,1,1,255,0,0)
ligne_menu_deroulant(actuel_menu_deroulant%,6,"Ligne 6","Times New Roman",10,1,1,0,255,0)
ligne_menu_deroulant(actuel_menu_deroulant%,7,"Ligne 7","Times New Roman",10,1,1,0,0,255)

nouveau_menu_deroulant(140,5,90,127,127,255)
titre_menu_deroulant(actuel_menu_deroulant%,"Mon menu 3","Arial",16,1,1,0,0,0)
corps_menu_deroulant(actuel_menu_deroulant%,4,191,191,255)
ligne_menu_deroulant(actuel_menu_deroulant%,1,"1ère option","MS Serif",10,1,0,0,0,0)
ligne_menu_deroulant(actuel_menu_deroulant%,2,"2ème option","MS Serif",10,1,0,0,0,0)
ligne_menu_deroulant(actuel_menu_deroulant%,3,"3èmeoption","MS Serif",10,1,0,0,0,0)
ligne_menu_deroulant(actuel_menu_deroulant%,4,"4ème option","MS Serif",10,1,0,0,0,0)

' activer cette ligne si le menu doit être invisible au départ !
' gosub click_barre_menu_deroulant

end

' ====================================================================================
' Cette procédure crée la barre verticale qui permet de montrer/cacher le menu entier
' Paramètres:

' ====================================================================================
sub barre_menu_deroulant(no%,x%,y%,h%,mr%,mg%,mb%)
  if label("click_menu_deroulant")=0 : ' est-ce que l'environnement doit être initialisé ?
    if object_exists(no%)>0          : ' est-ce que le numéro d'objet est libre ?
      message "L'objets "str$(no%)+" n'est pas disponible !'
      exit_sub
    end_if
    dim barre_menu_deroulant%        : ' numéro d'objet de la barre verticale
    dim n_menus_deroulants%          : ' nombre de lignes définies de niveau 1
    dim table_menus_deroulants%(50)  : ' liste des numéros d'objets de niveau 1
    dim actuel_menu_deroulant%       : ' dernier numéro d'objet créé de ligne de niveau 1
    dim i_menus_deroulants%          : ' variable d'usage interne
    dim j_menus_deroulants%          : ' variable d'usage interne
    dim k_menus_deroulants%          : ' variable d'usage interne
    dim f_menus_deroulants%          : ' variable d'usage interne
    label click_barre_menu_deroulant : ' clic sur la barre verticale
    label click_menu_deroulant       : ' clic sur une ligne de niveau 1
    label click_menu_deroulant_ligne : ' clic sur une ligne de niveau 2
    n_menus_deroulants% = 0
  end_if
  if barre_menu_deroulant%>0         : ' est-ce que la barre verticale est déjà créée ?
    message "La barre verticale est déjà définie !"
    return
  end_if
  barre_menu_deroulant% = no%        : ' mémoriser le numéro d'objet de la barre verticale
  picture no%                        : ' créer le PICTURE
    top no%,y% : left no%,x%         : ' positionner selon les besoins
    width no%,10 : height no%,h%     : ' et dimensionner sous forme de barre étroite
    color no%,mr%,mg%,mb%            : ' donner la couleur de fon
  on_click no%,click_barre_menu_deroulant : ' et lier au traitement du clic gauche

  font_bold no%                      : ' passer en gras
  font_size no%,10                   : ' et en taille 12
  print_target_is no%                : ' cibler le PICTURE pour PRINT
  2d_target_is no%                   : ' et pour les commandes 2D
  ' la ligne suivante utilise la couleur du PICTURE comme couleur de fond pour PRINT
  2d_fill_color color_pixel_red(no%,1,1),color_pixel_green(no%,1,1),color_pixel_blue(no%,1,1)
  print_locate 1,h%/2                : ' positionner au milieu de la barre
  print "<"                          : ' et créer le libellé "réduire"
end_sub

' ====================================================================================
' Cette procédure crée un nouveau menu déroulant. Elle utilise 2 objets PICTURE.
' Paramètres:
'   no%  = numéro de l'objet de base à utiliser  (no% et no%+1 doivent être libres)
'   x%, y% = position du coin en haut à gauche du menu*
'   mr%,mg%, mb% = couleurs RGB du fond du menu
' ====================================================================================
sub nouveau_menu_deroulant(no%,x%,y%,mr%,mg%,mb%)
  if label("click_menu_deroulant")=0 : ' est-ce que l'environnement doit être initialisé ?
    if (object_exists(no%)+object_exists(no%+1))>0  : ' est-ce que les numéros d'objet sont libres ?
      message "Les objets "str$(no%)+" et/ou "+str$(no%+1)"+" ne sont pas disponibles !'
      exit_sub
    end_if
    dim barre_menu_deroulant%        : ' numéro d'objet de la barre verticale
    dim n_menus_deroulants%          : ' nombre de lignes définies de niveau 1
    dim table_menus_deroulants%(50)  : ' liste des numéros d'objets de niveau 1
    dim actuel_menu_deroulant%       : ' dernier numéro d'objet créé de ligne de niveau 1
    dim i_menus_deroulants%          : ' variable d'usage interne
    dim j_menus_deroulants%          : ' variable d'usage interne
    dim k_menus_deroulants%          : ' variable d'usage interne
    dim f_menus_deroulants%          : ' variable d'usage interne
    label click_barre_menu_deroulant : ' clic sur la barre verticale
    label click_menu_deroulant       : ' clic sur une ligne de niveau 1
    label click_menu_deroulant_ligne : ' clic sur une ligne de niveau 2
    n_menus_deroulants% = 0
  end_if
  n_menus_deroulants% = n_menus_deroulants% + 1        : ' compter cette ligne de niveau 1
  table_menus_deroulants%(n_menus_deroulants%) = no%   : ' mémoriser le numéro d'objet
  actuel_menu_deroulant% = no%                         : ' mémoriser ce numéro pour le niveau 2 à suivre
  picture no%                                          : ' créer le PICTURE
    top no%,y% : left no%,x% : width no%,200 : height no%,25    : ' position et dimensions
    color no%,mr%,mg%,mb%                              : ' donner la couleur de fond
  on_click no%,click_menu_deroulant                    : ' et lier au traitement du clic gauche
end_sub

' ====================================================================================
' Cette procédure écrit le titre du menu dans un menu existant.
' Paramètres:
'   no% = numéro d'objet de base du menu visé
'   titre$ = texte à afficher
'   font$ = nom de la police
'   sz% = taille de la police
'   sg%, si% = styles de la police (gras, italique): indicateurs 0/1
'   fr%, fg%, fb% = couleurs RGB de la police
' ====================================================================================
sub titre_menu_deroulant(no%,titre$,font$,sz%,sg%,si%,fr%,fg%,fb%)
  font_name no%,font$                  : ' choisir la police
  if sg%<>0 then font_bold no%         : ' passer en gras si demandé
  if si%<>0 then font_italic no%       : ' passer en italique si demandé
  font_size no%,sz%                    : ' installer la taille de la police
  font_color no%,fr%,fg%,fb%           : ' et la couleur de l'écriture
  print_target_is no%                  : ' cibler le PICTURE pour la commande PRINT
  2d_target_is no%                     : ' ainsi que pour les commandes 2D
  ' la ligne suivante utilise la couleur du PICTURE comme couleur de fond pour PRINT
  2d_fill_color color_pixel_red(no%,1,1),color_pixel_green(no%,1,1),color_pixel_blue(no%,1,1)
  print_locate 20,1                    : ' positionner le point de départ
  print titre$                         : ' écrire le titre
end_sub

' ====================================================================================
' Cette procédure prépare le corps du menu pour un certain nombre de lignes.
' Paramètres:
'   no% = numéro d'objet de base du menu visé
'   nlig% = nombre de lignes de détail pour ce menu
'   mr%, mg%, mb% = couleur RBG du fond du corps du menu
' ====================================================================================
sub corps_menu_deroulant(no%,nlig%,mr%,mg%,mb%)
  dim_local no1%                     : ' variable interne pour le PICTURE du sous-menu
  no1% = no% + 1                     : ' son numéro suit celui du PICTURE de niveau 1
  picture no1% : hide no1%           : ' créer le PICTURE et le chacher tout de suite
    top no1%,top(no1%-1)+25          : ' positionner juste en-dessous du niveau 1
    left no1%,left(no1%-1)+10        : ' et légèrement à droite (meilleure visibilité)
    width no1%,200 : height no1%,25*nlig%  : ' dimensions en fonction du nombre de lignes
    color no1%,mr%,mg%,mb%           : ' installer la couleur du fond
    on_click no1%,click_menu_deroulant_ligne : ' et lier au traitement du clic gauche
end_sub

' ====================================================================================
' Cette procédure écrit une ligne de détail dans le corps d'un menu
'   no% = numéro d'objet de base du menu visé
'   nlig% = numéro de la lignevisée (1,2, ...)
'   texte$ = texte à afficher
'   font$ = police des lignes de détail
'   sz% = taille de la police
'   sg%,si% = styles de la police (gras, italique): indicateurs 0/1
'   fr%, fg%, fb% = couleurs RGB de la police
' ====================================================================================
sub ligne_menu_deroulant(no%,nlig%,texte$,font$,sz%,sg%,si%,fr%,fg%,fb%)
  dim_local no1%                     : ' variable interne pour le PICTURE du sous-menu
  no1% = no% + 1                     : ' son numéro suit celui du PICTURE de niveau 1
  print_target_is no1%               : ' cibler ce PICTURE pour PRINT
  2d_target_is no1%                  : ' ainsi que pour les commandes 2D
  ' la ligne suivante utilise la couleur du PICTURE comme couleur de fond pour PRINT
  2d_fill_color color_pixel_red(no1%,1,1),color_pixel_green(no1%,1,1),color_pixel_blue(no1%,1,1)
  print_locate 20,(nlig%-1)*25+1     : ' positionner en fonction du numéro de ligne
  font_name no1%,font$               : ' choisir la police
  if sg%<>0 then font_bold no1%      : ' passer en gras si demandé
  if si%<>0 then font_italic no1%    : ' passer en italique si demandé
  font_size no1%,sz%                 : ' installer la taille de la police
  font_color no1%,fr%,fg%,fb%        : ' ainsi que la couleur de l'écriture
  print texte$                       : ' imprimer la ligne
end_sub

' ====================================================================================
' cette procédure ne dois en aucun cas être modifiée !
' ====================================================================================
click_menu_deroulant:
  for i_menus_deroulants%=1 to n_menus_deroulants% : ' boucle sur les menus niveau 1
    if table_menus_deroulants%(i_menus_deroulants%)=number_click : ' trouvé ?
      if hide(number_click+1)=1                    : ' actuellement caché ?
        if i_menus_deroulants%<n_menus_deroulants% : ' pas le dernier niveau 1
          ' décaler tous les menus suivants vers le bas
          for j_menus_deroulants%=i_menus_deroulants%+1 to n_menus_deroulants%
            top table_menus_deroulants%(j_menus_deroulants%), top(table_menus_deroulants%(j_menus_deroulants%)) + height(table_menus_deroulants%(i_menus_deroulants%)+1)
            top table_menus_deroulants%(j_menus_deroulants%)+1, top(table_menus_deroulants%(j_menus_deroulants%)+1) + height(table_menus_deroulants%(i_menus_deroulants%)+1)
          next j_menus_deroulants%
        end_if
        show number_click+1                        : ' montrer le sous-menu
      else                                         : ' actuellement visible !
        if i_menus_deroulants%<n_menus_deroulants% : ' pas le dernier niveau 1
          ' décaler tous les menus suivants vers le haut
          for j_menus_deroulants%=i_menus_deroulants%+1 to n_menus_deroulants%
            top table_menus_deroulants%(j_menus_deroulants%), top(table_menus_deroulants%(j_menus_deroulants%)) - height(table_menus_deroulants%(i_menus_deroulants%)+1)
            top table_menus_deroulants%(j_menus_deroulants%)+1, top(table_menus_deroulants%(j_menus_deroulants%)+1) - height(table_menus_deroulants%(i_menus_deroulants%)+1)
          next j_menus_deroulants%
        end_if
        hide number_click+1                        : ' cacher le sous-menu
      end_if
      return
    end_if
  next i_menus_deroulants%
  return

' ====================================================================================
' Cette routine est appelée lors d'un clic gauche sur la barre verticale
' ====================================================================================
click_barre_menu_deroulant:
  if n_menus_deroulants%>0       : ' est-ce qu'il y a des menus de niveau 1 ?
    j_menus_deroulants% = 2000   : ' décalage pour faire apparaître le menu vertical
    k_menus_deroulants% = 200    : ' décalage pour tous les autres objets visibles
    ' les deux lignes suiva,tes gèrent le décalage s'il faut faire disparaître le menu
    if left(table_menus_deroulants%(1))>0 then j_menus_deroulants% = 0 - 2000
    if left(table_menus_deroulants%(1))>0 then k_menus_deroulants% = 0 - 200
    for i_menus_deroulants%=1 to n_menus_deroulants%  : ' boucle sur les menus de niveau 1
      ' décaler le menu de niveau 1
      left table_menus_deroulants%(i_menus_deroulants%), left(table_menus_deroulants%(i_menus_deroulants%)) + j_menus_deroulants%
      ' décaler aussi sons sous-menu associé
      left table_menus_deroulants%(i_menus_deroulants%)+1, left(table_menus_deroulants%(i_menus_deroulants%)+1) + j_menus_deroulants%
    next i_menus_deroulants%
    print_target_is barre_menu_deroulant%  : ' cibler la barre verticale pour PRINT
    print_locate 1,height(barre_menu_deroulant%)/2  : ' positionner au milieu de la barre
    if j_menus_deroulants%>0               : ' est-ce que le menu est visible ?
      print "<"                            : ' alors installer la marque "cacher"
    else                                   : ' sinon
      print ">"                            : ' installer la marque "montrer"
    end_if
    for i_menus_deroulants%=1 to 200 : ' 32000 : ' limite théorique, mais c'est lent !
      if object_exists(i_menus_deroulants%)=1  : ' est-ce qu'on a un objet existant ?
        f_menus_deroulants% = 1                : ' indiquer "il fait décaler l'objet"
        if i_menus_deroulants%<>barre_menu_deroulant%  : ' exclure tous les objets du menu vertical
          for j_menus_deroulants%=1 to n_menus_deroulants%
            if table_menus_deroulants%(j_menus_deroulants%)=i_menus_deroulants% then f_menus_deroulants% = 0
            if (table_menus_deroulants%(j_menus_deroulants%)+1)=i_menus_deroulants% then f_menus_deroulants% = 0
          next j_menus_deroulants%
        end_if
        if object_parent(i_menus_deroulants%)<>object_parent(table_menus_deroulants%(1)) then f_menus_deroulants% = 0
        j_menus_deroulants% = object_type(i_menus_deroulants%)
        if j_menus_deroulants%=7  then f_menus_deroulants% = 0 : ' FORM
        if j_menus_deroulants%=12 then f_menus_deroulants% = 0 : ' MAIN_MENU
        if j_menus_deroulants%=13 then f_menus_deroulants% = 0 : ' SUB_MENU
        if j_menus_deroulants%=14 then f_menus_deroulants% = 0 : ' SOUND
        if j_menus_deroulants%=17 then f_menus_deroulants% = 0 : ' OPEN_DIALOG
        if j_menus_deroulants%=18 then f_menus_deroulants% = 0 : ' SAVE_DIALOG
        if j_menus_deroulants%=26 then f_menus_deroulants% = 0 : ' DLIST
        if j_menus_deroulants%=28 then f_menus_deroulants% = 0 : ' TIMER
        if j_menus_deroulants%=41 then f_menus_deroulants% = 0 : ' IMAGE
        ' décaler l'objet si nécesssaire
        if f_menus_deroulants%>0 then left i_menus_deroulants%,left(i_menus_deroulants%) + k_menus_deroulants%
      end_if
    next i_menus_deroulants%
  end_if
  return
  
' ====================================================================================
' cette routine doit être adaptée pour lancer les fonctions de l'application !
' ====================================================================================
click_menu_deroulant_ligne:
  for i_menus_deroulants%=1 to n_menus_deroulants%  : ' boucle sur les menus de niveau 1
    if table_menus_deroulants%(i_menus_deroulants%)=number_click-1 : ' est-ce le menu choisi ?
      actuel_menu_deroulant_y% = mouse_y_left_down(number_click)   : ' récuperer la coordonnée verticale du clic
      actuel_menu_deroulant_y% = int((actuel_menu_deroulant_y%+24)/25) : ' en déduire le numéro de ligne
      ' lancer ici le traitement spécifique à cette ligne pour ce menu
      message "Menu déroulant "+str$(i_menus_deroulants%)+"  ligne "+str$(actuel_menu_deroulant_y%)
      return
    end_if
  next i_menus_deroulants%
  return
  

EDIT

J'ai ajouté une petite ligne au début, juste avant le END du programme principal. Si l'on active cette ligne, le menu vertical sera caché au démarrage, seule la barre verticale sera collée sur le bord gauche.


Dernière édition par Klaus le Mar 9 Déc 2014 - 15:23, édité 2 fois
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Yannick

avatar

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

MessageSujet: re   Mar 9 Déc 2014 - 5:24

cheers Superbe Klaus !

Il y a un truc qui rendrait aussi bien qu' un objet query
c' est qu' au lieu de décaler les objets vers la droite, cela passe par dessus les objets du form
avec un fond qui pourrait être une image en forme d' onglet.
Le menu prenant la main lors de son affichage.

mais bon, je crois que je deviens gourmand... Laughing

Edit : Si on pousse le vice, on pourrait même avoir plusieurs onglets.
Bon, ca va, j' ai compris, je sors... Laughing
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

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

MessageSujet: Re: Un menu déroulant type "Side Bar"   Mar 9 Déc 2014 - 12:20

Je crois que les onglets, ça sort du contexte du menu vertical. Et d'ailleurs, j'ai déjà un pseudo-objet TAB écrit en pur Panoramic, disponible sur mon site. On peut faire des objets TAB à plusieurs onglets, on peut placer un objet TAB sur un onglet d'un autre objet TAB, on peut gérer séparément leurs attributs graphiques... - là encore, c'est fait avec des PICTURE.

Par contre, l'autre idée "passer par-dessus les autres objets" m'aurait bien plu, mais Panoramic ne sait pas faire. Certains objets sont toujours par-dessus un PICTURE, quelque soit l'ordre de création. Et cela fait l'objet d'un signalement de bug que j'ai fait hier. J'ai donc fait le décalage des objets, ce qui est amusant aussi.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Jicehel

avatar

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

MessageSujet: Re: Un menu déroulant type "Side Bar"   Mar 9 Déc 2014 - 12:54

Après on peut se faire une procédure pour créer automatiquement des menus avec des styles prédéfinis qui appelle les procédure "basiques", mais bon c'est un peu du luxe...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

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

MessageSujet: Re: Un menu déroulant type "Side Bar"   Mar 9 Déc 2014 - 15:25

J'ai fait une petite modif dans le source ci-dessus, pour montrer comment on peut faire de sorte que le menu soit caché au démarrage, avec seule la barre verticale visible, collée sur le bord gauche. Pour observer cela, il suffit d'activer la ligne qui précède la commande END.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Yannick

avatar

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

MessageSujet: re   Mar 9 Déc 2014 - 15:28

L' effet d' ouverture par dessus les éléments du form
peut être obtenu par un objet panel :
Code:
dim no%,Obj_alpha%,Obj_Memo%,Obj_Pan%,Obj_Edit%,Pan%,Obj_alpha1%
dim x%,t%
label clic

height 0,550 : width 0,700
font_name 0,"arial"

no%=no%+1 : Obj_alpha%=no%
alpha no% : top no%,10 : left no%,15 : caption no%,"Un Mémo :"

no%=no%+1 : Obj_Memo%=no%
Memo no%  : top no%,25 : left no%,15 : height no%,250 : width no%,width(0)-36

no%=no%+1  : Obj_Pan%=no%
Panel no% : top no%,300 : left no%,15 : height no%,150 : width no%,300

no%=no%+1 : Obj_Edit%=no%
Edit no% : parent no%,Obj_Pan% : top no%,5 : left no%,5


no%=no%+1 : Pan%=no%
Panel no% : height no%,height(0)-38 : width no%,200 : top no%,0 :left no%,-190
color no%,200,200,200


no%=no%+1 : Obj_alpha1%=no%
Alpha no% : parent no%,Pan% : top no%,height(Pan%)/2 : left no%,width(pan%)-10 :caption no%,">"
font_size no%,12 :font_bold no% : font_color no%,255,0,0 :cursor_point no% :on_click no%,clic

end

clic:
  if t%=0
      t%=1
      for x%=1 to 190
        left Pan%,left(Pan%)+1
      next x%
      caption Obj_alpha1%,"<"
  else
      t%=0
      for x%=1 to 190
        left Pan%,left(Pan%)-1
      next x%
      caption Obj_alpha1%,">"
  end_if
return
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

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

MessageSujet: Re: Un menu déroulant type "Side Bar"   Mar 9 Déc 2014 - 16:15

Très intéressant, Ygeronimi ! Je vais voir comment combiner cela avec mon menu...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Yannick

avatar

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

MessageSujet: re   Mar 9 Déc 2014 - 16:18

Style onglet :

Code:
dim no%,Obj_Memo%,Obj_Pan%,Obj_Edit%,Pan%(10),Obj_alpha%(10)
dim clck%,x%,t%
label clic

height 0,540 : width 0,700
font_name 0,"arial"

no%=no%+1 : Obj_alpha%(0)=no%
alpha no% : top no%,10 : left no%,15 : caption no%,"Un Mémo :"

no%=no%+1 : Obj_Memo%=no%
Memo no%  : top no%,25 : left no%,15 : height no%,250 : width no%,width(0)-36

no%=no%+1  : Obj_Pan%=no%
Panel no% : top no%,300 : left no%,15 : height no%,150 : width no%,300

no%=no%+1 : Obj_Edit%=no%
Edit no% : parent no%,Obj_Pan% : top no%,5 : left no%,5

no%=no%+1 : Pan%(1)=no%
Panel no% : height no%,100 : width no%,200 : top no%,0 :left no%,-190
color no%,200,200,200
no%=no%+1 : Obj_alpha%(1)=no%
Alpha no% : parent no%,Pan%(1) : top no%,(height(Pan%(1))/2)-10 : left no%,width(pan%(1))-10 :caption no%,">"
font_size no%,12 :font_bold no% : font_color no%,255,0,0 :cursor_point no% :on_click no%,clic

no%=no%+1 : Pan%(2)=no%
Panel no% : height no%,100 : width no%,200 : top no%,100 :left no%,-190
color no%,250,200,200
no%=no%+1 : Obj_alpha%(2)=no%
Alpha no% : parent no%,Pan%(2) : top no%,(height(Pan%(2))/2)-10 : left no%,width(pan%(2))-10 :caption no%,">"
font_size no%,12 :font_bold no% : font_color no%,255,0,0 :cursor_point no% :on_click no%,clic

no%=no%+1 : Pan%(3)=no%
Panel no% : height no%,100 : width no%,200 : top no%,200 :left no%,-190
color no%,200,250,200
no%=no%+1 : Obj_alpha%(3)=no%
Alpha no% : parent no%,Pan%(3) : top no%,(height(Pan%(2))/2)-10 : left no%,width(pan%(2))-10 :caption no%,">"
font_size no%,12 :font_bold no% : font_color no%,255,0,0 :cursor_point no% :on_click no%,clic

no%=no%+1 : Pan%(4)=no%
Panel no% : height no%,100 : width no%,200 : top no%,300 :left no%,-190
color no%,200,200,250
no%=no%+1 : Obj_alpha%(4)=no%
Alpha no% : parent no%,Pan%(4) : top no%,(height(Pan%(2))/2)-10 : left no%,width(pan%(2))-10 :caption no%,">"
font_size no%,12 :font_bold no% : font_color no%,255,0,0 :cursor_point no% :on_click no%,clic

no%=no%+1 : Pan%(5)=no%
Panel no% : height no%,100 : width no%,200 : top no%,400 :left no%,-190
color no%,250,250,200
no%=no%+1 : Obj_alpha%(5)=no%
Alpha no% : parent no%,Pan%(5) : top no%,(height(Pan%(2))/2)-10 : left no%,width(pan%(2))-10 :caption no%,">"
font_size no%,12 :font_bold no% : font_color no%,255,0,0 :cursor_point no% :on_click no%,clic
end

clic:
  clck%=number_click
  if clck%=Obj_alpha%(1) :Show_slide_bar_menu(1,100,5):end_if
  if clck%=Obj_alpha%(2) :Show_slide_bar_menu(2,100,5):end_if
  if clck%=Obj_alpha%(3) :Show_slide_bar_menu(3,100,5):end_if
  if clck%=Obj_alpha%(4) :Show_slide_bar_menu(4,100,5):end_if
  if clck%=Obj_alpha%(5) :Show_slide_bar_menu(5,100,5):end_if
return

Sub Show_slide_bar_menu(p%,e%,n%)
  dim_local i%
  if t%=0
      t%=1
      if p%>1
        for i%=1 to (p%-1) : hide Pan%(i%) : next i%
      end_if
      if p%<n%
        for i%=p%+1 to n% : hide pan%(i%) : next i%
      end_if
      height Pan%(p%),height(0)-39
      top Pan%(p%),0
      for x%=1 to 190
        left Pan%(p%),left(Pan%(p%))+1
      next x%
      top Obj_alpha%(p%),(height(Pan%(p%))/2)-10
      caption Obj_alpha%(p%),"<"
  else
      t%=0
      for x%=1 to 190
        left Pan%(p%),left(Pan%(p%))-1
      next x%
      caption Obj_alpha%(p%),">"
      top Pan%(p%),e%*(p%-1)
      height Pan%(p%),100
      top Obj_alpha%(p%),(height(Pan%(p%))/2)-10
      for i%=1 to n% : show Pan%(i%) : next i%
  end_if
End_sub


Notez que ce sont des essais et qu' il faut mettre un peu d' ordre pour une utilisation pratique.


Dernière édition par ygeronimi le Mar 9 Déc 2014 - 20:43, édité 2 fois (Raison : Amelioration)
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Contenu sponsorisé




MessageSujet: Re: Un menu déroulant type "Side Bar"   

Revenir en haut Aller en bas
 
Un menu déroulant type "Side Bar"
Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 1 sur 2Aller à la page : 1, 2  Suivant
 Sujets similaires
-
» menu déroulant et opacité
» [résolu]Problème menu déroulant avec Chrome
» Menu déroulant avec un bouton
» Procédure d'utilisation des sound dans TC ™ Gold 7.0 E1
» Comment écrire juste en dessous un menu déroulant???

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