Peut-on insérer des sous-menus dans des sous-menus ?
Wam a écrit:
J'ai découvert un nouveau bogue très bizarre dans mon programme.
Voici un extrait de mon code que vous pouvez exécuter :
[php]
globale
// Fenêtre principale
Fenêtre_principale :: formulaire, titre vaut "Editeur de cartes", hauteur vaut 800, largeur vaut 1400
popup :: popup
// Toile
fond :: toile, x vaut 0, y vaut 35, hauteur vaut 740, largeur vaut 1400, couleur vaut "blanc", pointeur vaut "flèche"
xtoile :: xtoile, x vaut 0, y vaut 35
bordure_gauche :: rectangle, x vaut 0, y vaut 0, position vaut 1, hauteur vaut hauteur de fond, largeur vaut 150, plein vaut "oui", couleur vaut "blanc"
// Menus
menu1 :: menu, texte vaut "Carte"
menu1s1 :: sousmenu, texte vaut "Nouveau quadrillage"
menu2 :: menu, texte vaut "Edition"
menu2s1 :: sousmenu, texte vaut "Activer/désactiver la grille"
// Barre d'outils
barre1 :: barre, hauteur vaut 40, largeur vaut largeur de Fenêtre_principale, x vaut 0, y vaut 5
bouton1 :: bouton, icône vaut "Icônes\table_borders_16x16.gif", texte vaut "", infobulle vaut "Activer/désactiver la grille"
// Fenêtre nouveau quadrillage
Fenêtre_nouveau_quadrillage :: formulaire, hauteur vaut 140, largeur vaut 300, titre vaut "Nouveau quadrillage", visible vaut "non", x vaut 450, y vaut 255
txt_Fnq1 :: étiquette, texte vaut "Nombre de cases en largeur :", x vaut 10, y vaut 12
txt_Fnq2 :: étiquette, texte vaut "Nombre de cases en hauteur :", x vaut 10, y vaut 32
txt_Fnq3 :: étiquette, texte vaut "Largeur des cases :", x vaut 10, y vaut 52
txt_Fnq4 :: étiquette, texte vaut "Hauteur des cases :", x vaut 10, y vaut 72
choix_case_largeur :: champ, x vaut 200, y vaut 10, taille vaut 3
choix_case_hauteur :: champ, x vaut 200, y vaut 30, taille vaut 3
choix_taille_largeur_case :: champ, x vaut 200, y vaut 50, taille vaut 3
choix_taille_hauteur_case :: champ, x vaut 200, y vaut 70, taille vaut 3
bouton_valider_Fnq :: bouton, texte vaut "Valider", x vaut 70, y vaut 110
bouton_annuler_Fnq :: bouton, texte vaut "Annuler", x vaut 160, y vaut 110
// Quadrillage
taille_largeur_case :: nombre
taille_hauteur_case :: nombre
nombre_case_largeur :: nombre
nombre_case_hauteur :: nombre
nombre_case_largeur_effectif :: nombre
nombre_case_hauteur_effectif :: nombre
nombre_case :: nombre
nombre_case_total :: nombre
copie_index_carte :: nombre
grille4 :: casier de rectangle
grille5 :: casier de rectangle
grille_off :: drapeau
Fenêtre_principale :
début
// Construction des fenêtres
Ajoute txt_Fnq1 & txt_Fnq2 & txt_Fnq3 & txt_Fnq4 & choix_case_largeur & choix_case_hauteur & choix_taille_largeur_case & choix_taille_hauteur_case & bouton_valider_Fnq & bouton_annuler_Fnq dans Fenêtre_nouveau_quadrillage
Fais réagir Fenêtre_nouveau_quadrillage à "clic souris" pour Fermer_fenêtre_nouveau_quadrillage
Fais réagir bouton_annuler_Fnq à "clic souris" pour Fermer_fenêtre_nouveau_quadrillage
Fais réagir bouton_valider_Fnq à "clic souris" pour Générer_quadrillage
// Début du programme
Ajoute xtoile dans Fenêtre_principale
visible de Fenêtre_principale vaut "oui"
Ajoute menu1 dans Fenêtre_principale
Ajoute menu1s1 dans menu1
Ajoute menu2 dans Fenêtre_principale
Ajoute menu2s1 dans menu2
Fais réagir Fenêtre_principale à "clic souris" pour Fermer_fenêtre_principale
Fais réagir menu1s1 à "clic souris" pour Fenêtre_nouveau_quadrillage
Fais réagir menu2s1 à "clic souris" pour Désactiver_grille
Ajoute barre1 dans Fenêtre_principale
Ajoute bouton1 dans barre1
Fais réagir bouton1 à "clic souris" pour Désactiver_grille
Tant que 1 != 2, lis
Temporise
ferme
Fermer_fenêtre_principale :
*f :: formulaire
début
Efface toile
Termine
Fenêtre_nouveau_quadrillage :
début
visible de Fenêtre_nouveau_quadrillage vaut "oui"
Reviens
Fermer_fenêtre_nouveau_quadrillage :
début
visible de Fenêtre_nouveau_quadrillage vaut "non"
Reviens
Générer_quadrillage :
valeur1 & valeur2 & valeur3 & valeur4 :: texte
début
Essaie lis
valeur1 = texte de choix_case_largeur
Convertis valeur1 en nombre_case_largeur
valeur2 = texte de choix_case_hauteur
Convertis valeur2 en nombre_case_hauteur
valeur3 = texte de choix_taille_largeur_case
Convertis valeur3 en taille_largeur_case
valeur4 = texte de choix_taille_hauteur_case
Convertis valeur4 en taille_hauteur_case
// on calcule le nombre de cases à afficher en fonction des dimensions de la fenêtre de scrolling
nombre_case_largeur_effectif = entier (largeur de fond / taille_largeur_case)
nombre_case_hauteur_effectif = entier (hauteur de fond / taille_hauteur_case)
Si nombre_case_largeur_effectif >
nombre_case_largeur, nombre_case_largeur_effectif = nombre_case_largeur
Si nombre_case_hauteur_effectif >
nombre_case_hauteur, nombre_case_hauteur_effectif = nombre_case_hauteur
nombre_case = nombre_case_hauteur_effectif*nombre_case_largeur_effectif
nombre_case_total = nombre_case_hauteur*nombre_case_largeur
ferme
// on vérifie que les données des champs sont valides
Si nombre_case_total == 0, évoque popup.message("Le nombre et/ou la taille des cases ne sont pas valides.")
Sinon lis
visible de Fenêtre_nouveau_quadrillage vaut "non"
Parcours Création_quadrillage
ferme
Reviens
Création_quadrillage :
case :: rectangle, couleur vaut "blanc", hauteur vaut taille_hauteur_case, largeur vaut taille_largeur_case, position vaut 1, plein vaut "oui"
contour_case :: rectangle, couleur vaut "noir", hauteur vaut taille_hauteur_case, largeur vaut taille_largeur_case, position vaut 100, plein vaut "non"
xx :: nombre <
- (((largeur de fond - largeur de bordure_gauche) - (nombre_case_largeur_effectif * taille_largeur_case))/2) + largeur de bordure_gauche
yy :: nombre <
- (hauteur de fond - (nombre_case_hauteur_effectif * taille_hauteur_case))/2
début
// ici on dessine des cases pleines
pour chaque nombre_case, lis
ajoute #case dans grille4
déplace grille4{joker} vers xx et yy
projette grille4{joker}
xx = xx + taille_largeur_case
si xx >
(largeur de bordure_gauche + (nombre_case_largeur_effectif * taille_largeur_case) + (((largeur de fond - largeur de bordure_gauche) - (nombre_case_largeur_effectif * taille_largeur_case))/2) - taille_largeur_case), lis
xx = (((largeur de fond - largeur de bordure_gauche) - (nombre_case_largeur_effectif * taille_largeur_case))/2) + largeur de bordure_gauche
yy = yy + taille_hauteur_case
ferme
ferme
xx = (((largeur de fond - largeur de bordure_gauche) - (nombre_case_largeur_effectif * taille_largeur_case))/2) + largeur de bordure_gauche
yy = (hauteur de fond - (nombre_case_hauteur_effectif * taille_hauteur_case))/2
// ici on dessine le contour des cases
pour chaque nombre_case, lis
ajoute #contour_case dans grille5
déplace grille5{joker} vers xx et yy
Projette grille5{joker}
xx = xx + taille_largeur_case
si xx >
(largeur de bordure_gauche + (nombre_case_largeur_effectif * taille_largeur_case) + (((largeur de fond - largeur de bordure_gauche) - (nombre_case_largeur_effectif * taille_largeur_case))/2) - taille_largeur_case), lis
xx = (((largeur de fond - largeur de bordure_gauche) - (nombre_case_largeur_effectif * taille_largeur_case))/2) + largeur de bordure_gauche
yy = yy + taille_hauteur_case
ferme
ferme
Reviens
Désactiver_grille :
indice est un nombre
début
Mesure grille5 dans indice
Si indice != 0, lis
Si grille_off == faux, lis
grille_off = vrai
Pour chaque indice, efface grille5{joker}
ferme
Sinon lis
grille_off = faux
Pour chaque indice, projette grille5{joker}
ferme
ferme
Reviens
[/php]
Dans ce code, je créer un quadrillage.
Le menu "Activer/Désactiver la grille" sert à effacer le quadrillage de la toile.
Le bouton1 est un raccourci de ce menu et fait donc la même chose.
Bien que ce code fonctionne correctement, j'ai exactement la même chose dans le code de mon programme.
Or, dans ce dernier, seul le bouton1 fonctionne.
Le menu "Activer/Désactiver la grille" ne fonctionne pas.
Pourtant tous les autres menus, disposant également de raccourcis dans la barre d'outils de mon programme, fonctionnent correctement.
Wam a écrit:
J'ai encore un autre problème lié aux IHM dans mon programme.
Voici un exemple :
[php]
globale
// Fenêtre principale
Fenêtre_principale :: formulaire, titre vaut "Editeur de cartes", hauteur vaut 800, largeur vaut 1400
popup :: popup
// Toile
fond :: toile, x vaut 0, y vaut 35, hauteur vaut 740, largeur vaut 1400, couleur vaut "blanc", pointeur vaut "flèche"
xtoile :: xtoile, x vaut 0, y vaut 35
bordure_gauche :: rectangle, x vaut 0, y vaut 0, position vaut 1, hauteur vaut hauteur de fond, largeur vaut 150, plein vaut "oui", couleur vaut "blanc"
// Menus
menu1 :: menu, texte vaut "Carte"
menu1s1 :: sousmenu, texte vaut "Nouveau quadrillage"
// Fenêtre nouveau quadrillage
Fenêtre_nouveau_quadrillage :: formulaire, hauteur vaut 140, largeur vaut 300, titre vaut "Nouveau quadrillage", visible vaut "non", x vaut 450, y vaut 255
txt_Fnq1 :: étiquette, texte vaut "Nombre de cases en largeur :", x vaut 10, y vaut 12
txt_Fnq2 :: étiquette, texte vaut "Nombre de cases en hauteur :", x vaut 10, y vaut 32
txt_Fnq3 :: étiquette, texte vaut "Largeur des cases :", x vaut 10, y vaut 52
txt_Fnq4 :: étiquette, texte vaut "Hauteur des cases :", x vaut 10, y vaut 72
choix_case_largeur :: champ, x vaut 200, y vaut 10, taille vaut 3
choix_case_hauteur :: champ, x vaut 200, y vaut 30, taille vaut 3
choix_taille_largeur_case :: champ, x vaut 200, y vaut 50, taille vaut 3
choix_taille_hauteur_case :: champ, x vaut 200, y vaut 70, taille vaut 3
bouton_valider_Fnq :: bouton, texte vaut "Valider", x vaut 70, y vaut 110
bouton_annuler_Fnq :: bouton, texte vaut "Annuler", x vaut 160, y vaut 110
// Quadrillage
taille_largeur_case :: nombre
taille_hauteur_case :: nombre
nombre_case_largeur :: nombre
nombre_case_hauteur :: nombre
nombre_case_largeur_effectif :: nombre
nombre_case_hauteur_effectif :: nombre
nombre_case :: nombre
nombre_case_total :: nombre
copie_index_carte :: nombre
grille4 :: casier de rectangle
grille5 :: casier de rectangle
grille_off :: drapeau
Fenêtre_principale :
début
// Construction des fenêtres
Ajoute txt_Fnq1 & txt_Fnq2 & txt_Fnq3 & txt_Fnq4 & choix_case_largeur & choix_case_hauteur & choix_taille_largeur_case & choix_taille_hauteur_case & bouton_valider_Fnq & bouton_annuler_Fnq dans Fenêtre_nouveau_quadrillage
Fais réagir Fenêtre_nouveau_quadrillage à "clic souris" pour Fermer_fenêtre_nouveau_quadrillage
Fais réagir bouton_annuler_Fnq à "clic souris" pour Fermer_fenêtre_nouveau_quadrillage
Fais réagir bouton_valider_Fnq à "clic souris" pour Générer_quadrillage
// Début du programme
Ajoute xtoile dans Fenêtre_principale
visible de Fenêtre_principale vaut "oui"
Ajoute menu1 dans Fenêtre_principale
Ajoute menu1s1 dans menu1
Fais réagir Fenêtre_principale à "clic souris" pour Fermer_fenêtre_principale
Fais réagir menu1s1 à "clic souris" pour Fenêtre_nouveau_quadrillage
Tant que 1 != 2, lis
Temporise
ferme
Fermer_fenêtre_principale :
*f :: formulaire
début
Efface toile
Termine
Fenêtre_nouveau_quadrillage :
début
visible de Fenêtre_nouveau_quadrillage vaut "oui"
Reviens
Fermer_fenêtre_nouveau_quadrillage :
début
visible de Fenêtre_nouveau_quadrillage vaut "non"
Reviens
Générer_quadrillage :
valeur1 & valeur2 & valeur3 & valeur4 :: texte
début
Essaie lis
valeur1 = texte de choix_case_largeur
Convertis valeur1 en nombre_case_largeur
valeur2 = texte de choix_case_hauteur
Convertis valeur2 en nombre_case_hauteur
valeur3 = texte de choix_taille_largeur_case
Convertis valeur3 en taille_largeur_case
valeur4 = texte de choix_taille_hauteur_case
Convertis valeur4 en taille_hauteur_case
// on calcule le nombre de cases à afficher en fonction des dimensions de la fenêtre de scrolling
nombre_case_largeur_effectif = entier (largeur de fond / taille_largeur_case)
nombre_case_hauteur_effectif = entier (hauteur de fond / taille_hauteur_case)
Si nombre_case_largeur_effectif >
nombre_case_largeur, nombre_case_largeur_effectif = nombre_case_largeur
Si nombre_case_hauteur_effectif >
nombre_case_hauteur, nombre_case_hauteur_effectif = nombre_case_hauteur
nombre_case = nombre_case_hauteur_effectif*nombre_case_largeur_effectif
nombre_case_total = nombre_case_hauteur*nombre_case_largeur
ferme
Sinon lis
évoque popup.message("Le nombre et/ou la taille des cases ne sont pas valides.")
Reviens
ferme
Si nombre_case_total == 0, lis
évoque popup.message("Erreur : veuillez recommencer.")
ferme
Sinon lis
visible de Fenêtre_nouveau_quadrillage vaut "non"
Parcours Création_quadrillage
ferme
Reviens
Création_quadrillage :
case :: rectangle, couleur vaut "blanc", hauteur vaut taille_hauteur_case, largeur vaut taille_largeur_case, position vaut 1, plein vaut "oui"
contour_case :: rectangle, couleur vaut "noir", hauteur vaut taille_hauteur_case, largeur vaut taille_largeur_case, position vaut 100, plein vaut "non"
xx :: nombre <
- (((largeur de fond - largeur de bordure_gauche) - (nombre_case_largeur_effectif * taille_largeur_case))/2) + largeur de bordure_gauche
yy :: nombre <
- (hauteur de fond - (nombre_case_hauteur_effectif * taille_hauteur_case))/2
début
// ici on dessine des cases pleines
pour chaque nombre_case, lis
ajoute #case dans grille4
déplace grille4{joker} vers xx et yy
projette grille4{joker}
xx = xx + taille_largeur_case
si xx >
(largeur de bordure_gauche + (nombre_case_largeur_effectif * taille_largeur_case) + (((largeur de fond - largeur de bordure_gauche) - (nombre_case_largeur_effectif * taille_largeur_case))/2) - taille_largeur_case), lis
xx = (((largeur de fond - largeur de bordure_gauche) - (nombre_case_largeur_effectif * taille_largeur_case))/2) + largeur de bordure_gauche
yy = yy + taille_hauteur_case
ferme
ferme
xx = (((largeur de fond - largeur de bordure_gauche) - (nombre_case_largeur_effectif * taille_largeur_case))/2) + largeur de bordure_gauche
yy = (hauteur de fond - (nombre_case_hauteur_effectif * taille_hauteur_case))/2
// ici on dessine le contour des cases
pour chaque nombre_case, lis
ajoute #contour_case dans grille5
déplace grille5{joker} vers xx et yy
Projette grille5{joker}
xx = xx + taille_largeur_case
si xx >
(largeur de bordure_gauche + (nombre_case_largeur_effectif * taille_largeur_case) + (((largeur de fond - largeur de bordure_gauche) - (nombre_case_largeur_effectif * taille_largeur_case))/2) - taille_largeur_case), lis
xx = (((largeur de fond - largeur de bordure_gauche) - (nombre_case_largeur_effectif * taille_largeur_case))/2) + largeur de bordure_gauche
yy = yy + taille_hauteur_case
ferme
ferme
Reviens
[/php]
Dans ma fonction Générer_quadrillage, j'essaie tout d'abord de récupérer et de convertir les valeurs de mes champs.
Si sa ne fonctionne pas, l'utilisateur ayant indiquer des lettres par exemple, j'affiche ce message d'erreur :
"Le nombre et/ou la taille des cases ne sont pas valides."
Mais j'ai dû ajouter un autre message d'erreur à mon code :
En effet, parfois les valeurs de mes deux premiers champs ne sont pas récupérées.
Du coup, nombre_case_total est à 0 et j'affiche l'erreur suivante :
"Erreur : veuillez recommencer."
Bien entendu, dans cet exemple simple, cette erreur ne se produit jamais.
En revanche, elle est très fréquente dans mon programme, comme pour le bogue de mon menu "Activer/Désactiver le quadrillage".
Et pourtant, rien ne change sur la xtoile !