PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2025 → Menu contextuel ou Popup ?
Menu contextuel ou Popup ?
Débuté par daniel.hollaar, 10 déc. 2004 12:35 - 7 réponses
Posté le 10 décembre 2004 - 12:35
Bonjour,

voilà, je souhaite utiliser un menu contextuel sur une table dont les options sont définies selon la case de la table et le contenu d'un fichier HF. Apparemment, il n'est malheureusement pas possible de rajouter par programmation des options à un menu contextuel (on peut le faire seulement depuis l'éditeur, quel dommage).
J'ai donc pensé pouvoir résoudre mon problème avec une fenêtre popup, qui marche bien, excepté le fait que je n'arrive pas à la positionner comme je veux : en effet, ma table prenant la quasi-totalité de la fenêtre, le positionnement automatique à droite, à gauche ou autre ne me satisfait pas, la fenêtre popup se trouvant alors loin de la case appelante.

Quelqu'un parmi vous aurait-il trouvé une solution pour ouvrir une fenêtre popup à côté d'une case précise (voire d'une colonne, je suis pas difficile) ?
Posté le 10 décembre 2004 - 12:56
Tout simplement, tu peux récupérer la position de ta souris lors du clic
droit avec SourisPosX et SourisPosY puis l'appliquer a l'ouverture de ta
fenêtre pop up avec les propriétés ..X et ..Y
La fenêtre apparaîtra alors en bas à droite de ta souris, comme pour un menu
contextuel.

--
Bon dév'
Hervé
"Daniel Hollaar" <daniel.hollaar@agriware.com> a écrit dans le message de
news: 41b971dc@news.pcsoft.fr...

Bonjour,

voilà, je souhaite utiliser un menu contextuel sur une table dont les
options sont définies selon la case de la table et le contenu d'un fichier
HF. Apparemment, il n'est malheureusement pas possible de rajouter par
programmation des options à un menu contextuel (on peut le faire seulement
depuis l'éditeur, quel dommage).
J'ai donc pensé pouvoir résoudre mon problème avec une fenêtre popup, qui
marche bien, excepté le fait que je n'arrive pas à la positionner comme je
veux : en effet, ma table prenant la quasi-totalité de la fenêtre, le
positionnement automatique à droite, à gauche ou autre ne me satisfait pas,
la fenêtre popup se trouvant alors loin de la case appelante.

Quelqu'un parmi vous aurait-il trouvé une solution pour ouvrir une fenêtre
popup à côté d'une case précise (voire d'une colonne, je suis pas difficile)
?
Posté le 10 décembre 2004 - 13:06
Bonjour,

Si ta pop op doit s'afficher après un clic sur une case de ta table, il te suffit de récupérer la position de ton curseur de ta souris. (PosX et PosY).
En espérant t'avoir aider.

Ocin.
Posté le 10 décembre 2004 - 13:37
Dans la popup on a une option soit un bouton soit un champ de saisie.
Pour la table je pense quand indiquant la case avec son indice cela devrait marche, peut etre meme les coordonnees)
Posté le 10 décembre 2004 - 16:43
Merci, ça marche, j'y avais pas pensé ... vivement le week-end ;-)
Posté le 10 décembre 2004 - 16:59
Précision : ça marche avec une fenête normale, mais pas avec les popup (apparemment très récalcitrants pour être repositionné. J'ai donc utilisé une fenêtre normale dont j'ai adapté le style pour ressembler à une popup. Défaut : il n'y a pas de fermeture automatique pour tout clic à côté (j'ai essayé dans le code de perte de focus, mais ça ne arche pas car je l'ouvre avec la Ouvre() et non pas OuvreSoeur()
Posté le 10 décembre 2004 - 17:52
Daniel Hollaar a pensé très fort :
Bonjour,

voilà, je souhaite utiliser un menu contextuel sur une table dont les options sont définies selon la case de la table et le contenu d'un fichier HF. Apparemment, il
n'est malheureusement pas possible de rajouter par programmation des options à un menu contextuel (on peut le faire seulement depuis l'éditeur, quel dommage). J'ai
donc pensé pouvoir résoudre mon problème avec une fenêtre popup, qui marche bien, excepté le fait que je n'arrive pas à la positionner comme je veux : en effet, ma
table prenant la quasi-totalité de la fenêtre, le positionnement automatique à droite, à gauche ou autre ne me satisfait pas, la fenêtre popup se trouvant alors loin
de la case appelante.

Quelqu'un parmi vous aurait-il trouvé une solution pour ouvrir une fenêtre popup à côté d'une case précise (voire d'une colonne, je suis pas difficile) ?


Bonsoir,
J'ai eu cette problématique.
Le ST m'a donné un numéro car c'est un bug.
Voici le contournement qui m'a été proposé:
Nous avons bien reproduit le problème décrit. Effectivement OuvrePopupPosition semble "perturbé" quand le champ colonne a été déplacé.
Nous avons immédiatement enregistré et transmis vos éléments à notre équipe Développement et à notre équipe Qualité.

L'incident a été enregistré avec la référence 41414. Merci d'utiliser cette référence si vous contactez le Support Technique Gratuit sur le même sujet.

Nous vous proposons le contournement suivant que nous avons testé avec succés :

- définir un champ image transparent et très petit, par exemple 5par18 (ce champ va servir de repère à la fonction OuvrePopupPosition .

- modifier votre code ainsi (on déplace l'image puis on ouvre la Popup sur l'image).

SI _EVE.wParam=0x73 ET (ChampEnCours()=MoiMême OU {gcNomChamp}..Type=typDate) ALORS // le camp en cours est la table si simulation depuis le menu contextuel
eInt est un entier=IndiceEnCours()
Image1..X = {gcNomChamp}..X
Image1..Y = eInt*MoiMême..HauteurLigne+MoiMême..Y+11
{gcNomChamp}[eInt]..Valeur=OuvrePopupPosition(calendrier,poBas+poDroite+poSelonChamp,"image1",{gcNomChamp}[eInt]..Valeur)
FIN

--
Pascal
Posté le 13 décembre 2004 - 11:32
J'ai pour ma part défini un menu contextuel standard dans toutes mes fenêtres, menu contenant 20 Options, suffisant pour la plupart des utilisations. J'associe dynamiquement ce menu à ma table, et je personnalise les options, en fonction du contexte. Le code de chaque bouton correspond à l'exécution du traitement d'un bouton.
Je me suis imposé des contraintes de nom de boutons et de nom d'options, mais celà peut être modifié.

Voici l'exemple du code correspondant à la génération du menu contextuel :

// Active et désactive les options de menu contextuel dans une fenêtre
// met à jour l'image et le libellé du menu en fonction de ceux du bouton
// en fonction d'une liste donnée
// Paramètres
// Nom du menu contextuel
// Noms des boutons séparés par des virgules (B_espace pour un séparateur)
// Action à faire : vrai pour activer, faux pour désactiver
// Modification (dans ce cas on ne modifie pas les autres options du menu)
// Image si on veut ajouter l'image au menu
PROCEDURE GLOBALE BoutonMenu(P_NomMenu,P_ListeBoutons,P_Activation,P_Modif=Faux,P_Image=Vrai)
L_NomMenu est chaîne=P_NomMenu
L_ListeBoutons est chaîne=Majuscule(P_ListeBoutons)
L_ListeMenu est chaîne // contient la liste actuelle du menu avec état
L_Activation est entier=P_Activation
L_Ibouton, L_Imenu sont entier
L_i, L_k, L_IEspace sont des entiers
L_PositionDebut, L_PositionFin sont entier
L_Listetravail est chaîne
L_NomChamp est chaîne
L_NomBouton est chaîne
L_NomBoutonFenetre est chaîne
L_NomOption est chaîne
L_Action est entier
L_Espace est booléen=Faux
L_Couleur est entier

// On charge la liste des options actuelles du menu et on les efface
// =================================================================
L_Imenu=1
L_i=1
L_NomChamp=EnumèreMenu(L_NomMenu,L_i)
TANTQUE L_NomChamp<>""
L_NomOption=FenEnExécution()+"."+L_NomMenu+".M_Op"+NumériqueVersChaine(L_i,"02d")
SI {L_NomOption}..Visible=Vrai ALORS
SI P_Modif ALORS
L_NomBouton=Majuscule({L_NomOption}..Message)
L_ListeMenu+=L_NomBouton+TAB+{L_NomOption}..Etat+","
FIN
MenuInvisible({L_NomOption})
L_i++
L_NomChamp=EnumèreMenu(L_NomMenu,L_i)
SINON
L_NomChamp=""
FIN
FIN
// on fusionne les deux listes pour modif
// ======================================
L_i=1
L_NomChamp=SansEspace(ExtraitChaîne(L_ListeBoutons,L_i,","))
L_NomBouton=ExtraitChaîne(L_NomChamp,1,TAB)
TANTQUE L_NomBouton<>"" ET L_NomBouton<>EOT
L_PositionDebut=Position(L_ListeMenu,L_NomBouton,1)
SI L_PositionDebut<=0 OU L_NomBouton="B_ESPACE" ALORS
L_ListeMenu+=L_NomBouton+TAB+L_Activation+","
SINON
L_PositionFin=Position(L_ListeMenu,",",L_PositionDebut)
L_Listetravail=L_ListeMenu[[1 A L_PositionDebut-1]]+L_NomBouton+TAB+L_Activation+L_ListeMenu[[L_PositionFin A]]
L_ListeMenu=L_Listetravail
FIN
L_i++
L_NomChamp=SansEspace(ExtraitChaîne(L_ListeBoutons,L_i,","))
L_NomBouton=ExtraitChaîne(L_NomChamp,1,TAB)
FIN
// Le traitement suivant n'est à faire que pour l'activation des options
// =====================================================================
L_i=1
L_NomChamp=SansEspace(ExtraitChaîne(L_ListeMenu,L_i,","))
L_NomBouton=ExtraitChaîne(L_NomChamp,1,TAB)
L_Action=ExtraitChaîne(L_NomChamp,2,TAB)
L_NomOption=FenEnExécution()+"."+L_NomMenu+".M_Op"+NumériqueVersChaine(L_Imenu,"02d")
L_NomBoutonFenetre=FenEnExécution()+"."+L_NomBouton
TANTQUE L_NomBouton<>"" ET L_NomBouton<>EOT
SI L_Action=Actif OU L_Action=Grisé ALORS
SI L_NomBouton="B_ESPACE" ALORS
SI PAS L_Espace
{L_NomOption}..Libellé="__________________"
{L_NomOption}..Message=L_NomBouton
{L_NomOption}..Image=""
MenuSelectMoins({L_NomOption})
L_Imenu++
L_Espace=Vrai
FIN
SINON
SI ChampExiste(L_NomBoutonFenetre) ALORS
SI P_Image ALORS
{L_NomOption}..Image={L_NomBoutonFenetre}..Image
FIN
{L_NomOption}..Message=L_NomBouton
SI SansEspace({L_NomBoutonFenetre}..Libellé)<>"" ALORS
{L_NomOption}..Libellé={L_NomBoutonFenetre}..Libellé
SINON
SI SansEspace({L_NomBoutonFenetre}..Bulle)<>"" ALORS
{L_NomOption}..Libellé={L_NomBoutonFenetre}..Bulle
FIN
FIN
SI L_Action=Actif ALORS
MenuSelectPlus({L_NomOption})
SINON
MenuSelectMoins({L_NomOption})
FIN
L_Espace=Faux
L_Imenu++
FIN
FIN
FIN
L_i++
L_NomChamp=SansEspace(ExtraitChaîne(L_ListeMenu,L_i,","))
L_NomBouton=ExtraitChaîne(L_NomChamp,1,TAB)
L_Action=ExtraitChaîne(L_NomChamp,2,TAB)
L_NomOption=FenEnExécution()+"."+L_NomMenu+".M_Op"+NumériqueVersChaine(L_Imenu,"02d")
L_NomBoutonFenetre=FenEnExécution()+"."+L_NomBouton
FIN