Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Pages: 1
Bonjour,
Dans notre application, je suis en train de mettre en place une sorte de favoris pour que les utilisateurs retrouvent plus facilement les programmes qu'ils utilisent le plus souvent.
Notre application comprend une centaine de fonctionnalités différentes et il n'est pas rare qu'on nous appelle pour nous demander "c'est où ça ?".
Le principe est simple : sur les entrées menu du m_frame (menu principal), j'ajoute un appel de fonction qui permet d'insérer dans une table FAVORIS (CODE_UTILISATEUR, CLASS_MENU, LIBELLE_MENU), pour l'utilisateur, le nom de l'entrée menu qu'il utilise (j'en stocke maximum 10 par utilisateur).
Ensuite, il a un raccourci pour ouvri son menu "Favoris", qui affiche les liens vers ses programmes.
1) pour faire le lien entre le menu du m_frame et la ligne du menu affichée (qui est une donnée de type string stockée dans ma BDD, référençant le ClassName() de l'entrée menu), j'ai une fonction récursive :
Sur dw_1.Clicked :
ClassDefinition lcd_menu
lcd_menu = FindClassDefinition("m_frame")
wf_get_menu(lcd_menu, row)
Fonction wf_get_menu
Long i For i = 1 To UpperBound(acd_menu.NestedClassList) If Trim(dw_1.getItemString(al_row, "cv_class")) = Trim(Mid(acd_menu.NestedClassList[i].Name, 9)) Then // EXECUTION DU CODE DU MENU Return True End If wf_get_menu(acd_menu.NestedClassList[i], al_row) Next Return False
Et c'est là que le bât blesse : j'avais déjà codé le truc, mais j'ai perdu mon code (ça arrive, parfois ). Comment faire pour appeler l'évènement Clicked du menu correspondant ? J'ai essayé acd_menu.NestedClassList[i].TriggerEvent("clicked"), voire m_frame.TriggerEvent(acd_menu.NestedClassList[i].Name + ".clicked")
mais ça ne marche pas... Une main secourable serait la bienvenue !!
Hors ligne
tu as perdu ton script ?
tu ne l'as pas en pbd ?
Hors ligne
Et bien c'est à dire que je préparais dans mon coin mes tests, et cela fonctionnait, mais il n'était pas prévu de le développer dans l'immédiat, donc, relégué dans un coin, et puis nettoyage de printemps du HDD, et perdage de code... des fois, je vous jure...
Hors ligne
nous, on utilise comme ca...
on enregistre les 5 derniers favoris...ou derniers ecrans visités par le user...
tous ces ecrans , ou nom de classe sont enregistrés ensuite un fichier ini... le fichier login utilisateur.ini
à chaque utilisateur, son fichier ini.
je regarde si j'arrive à trouver le script...
Hors ligne
Bonjour sbouvetJD ,
Tu récupère la "classdefinition" du menu, mais pour pouvoir l'utiliser, il faut que l'objet menu ait été créé en mémoire.
En d'autre termes, il ne faut pas confondre le plan de la maison (ClassDefinition ) et la maison (menu)
m_frame lm_frame lm_frame = Create using "m_frame"
Hors ligne
en fait, on utilise le systeme de favoris de telle sorte...
le fichier ini...
avec
[MENU] dernier=5 donnee=w_feuille_compte_client_granu|w_feuille_compte_client_granu-231516|231516,|w_ouverture_compte_client_granu|&|w_feuille_compte_client_granu|w_feuille_compte_client_granu-231058|231058,|w_ouverture_compte_client_granu|&|w_feuille_compte_client_granu|w_feuille_compte_client_granu-312840|312840,|w_ouverture_compte_client_granu|&|w_feuille_compte_client_granu|w_feuille_compte_client_granu-261534|261534,|w_ouverture_compte_client_granu|&|w_feuille_compte_client_granu|w_feuille_compte_client_granu-261247|261247,|w_ouverture_compte_client_granu|&|w_feuille_compte_client_granu|w_feuille_compte_client_granu-261072|261072,|w_ouverture_compte_client_granu|&|w_feuille_compte_client_granu|w_feuille_compte_client_granu-236734|236734,|w_ouverture_compte_client_granu|&|w_feuille_compte_client_granu|w_feuille_compte_client_granu-235342|235342,|w_ouverture_compte_client_granu|&|w_feuille_compte_client_granu|w_feuille_compte_client_granu-234750|234750,|w_ouverture_compte_client_granu|&| titre=Compte client 231516 totolitoto.|Compte client 231058 C D E C|Compte client 312840 Pick Ouic|Compte client 261534 PbAdonf FRANCE|Compte client 261247 Pbexpert SA|Compte client 261072 SOS.|Compte client 236734 TINTIN|Compte client 235342 TINOIS|Compte client 234750 Hamburger|
comme tu peux le voir, il y a le nom de l'objet, et le titre du raccourci...
avec tout ca, on peut ouvrir l'objet, avec les retrieve...
ce n'est pas plus simple comme ca ?
Hors ligne
Ben c'est moins souple... Si quelqu'un bidouille le fichier .ini il peut s'en passer des choses... (Enfin, c'est mon avis !)
Hors ligne
au lieu de le mettre dans le fichier ini
tu le mets dans la base.... t'as quoi à repondre la ?
Hors ligne
Avec le code suivant, on peut récupérer le code de l'évènement CLICKED. Je me dis que je peux peut-être l'affecter à un objet "menu" ?
ScriptDefinition lsd_menu ClassDefinition lcd_menu String ls_source [...] For j = 1 To Upperbound(lcd_menu.NestedClassList[i].ScriptList) lsd_menu = lcd_menu.NestedClassList[i].ScriptList[j] If lsd_menu.Name = "clicked" Then ls_source = lsd_menu.Source End If Next
Hors ligne
sbouvetJD a écrit:
Avec le code suivant, on peut récupérer le code de l'évènement CLICKED. Je me dis que je peux peut-être l'affecter à un objet "menu" ?
Code: pb
ScriptDefinition lsd_menu ClassDefinition lcd_menu String ls_source [...] For j = 1 To Upperbound(lcd_menu.NestedClassList[i].ScriptList) lsd_menu = lcd_menu.NestedClassList[i].ScriptList[j] If lsd_menu.Name = "clicked" Then ls_source = lsd_menu.Source End If Next
tu as verifié si cela marche en mode EXEcutable ?
il me semble que...enfin, je ne suis pas sure...
Hors ligne
//Message de régulation
Merci d'utiliser le mod code=pb pour des questions de lisibilité
Je corrige en attendant
//fin message de régulation
Hors ligne
Judicieuse remarque ; effectivement en EXE, on n'a pas accès à la propriété "source". Mille gaufrettes, comment ai-je pu me débrouiller la dernière fois ?!
(Et désolé pour le manque de lisibilité, je tâcherai de m'appliquer )
Dernière modification par sbouvetJD (03-05-2007 15:49:51)
Hors ligne
shahin a écrit:
Bonjour sbouvetJD ,
Tu récupère la "classdefinition" du menu, mais pour pouvoir l'utiliser, il faut que l'objet menu ait été créé en mémoire.
En d'autre termes, il ne faut pas confondre le plan de la maison (ClassDefinition ) et la maison (menu)Code: pb
m_frame lm_frame lm_frame = Create using "m_frame"
Bonsoir, en effet c'est de cette façon que j'ai fait qq manipulations sur les menus (comme par exemple les menus dynamiques)
<HS>
On en apprend tous les jours avec PB ! Je ne connaissais pas les objets ScriptDefinition et ClassDefinition
PB doit se prendre des bonnes hallus avec des noms de variables comme ça :
sbouvetJD a écrit:
Code: pb
ScriptDefinition lsd_menu
</HS>
Hors ligne
Comme disait Archimède : EUREKA ! Voilà la solution au problème (fonction appelée sur dw_1.Clicked, dw_1 contenant la donnée CV_CLASS correspondant au nom du menu sélectionné)
// Event dw_1.Clicked If dwo.Name = "lv_menu" Then If wf_get_menu(m_frame, row) Then Close(Parent) End If // Function wf_get_menu(menu amnu_menu, long al_row) Long i ClassDefinition lcd_menu Boolean lb_ret For i = 1 To UpperBound(amnu_menu.Item) lcd_menu = amnu_menu.Item[i].ClassDefinition If Trim(dw_1.getItemString(al_row, "cv_class")) = Trim(Mid(lcd_menu.Name, 9)) Then // ON TRONQUE LES 9 PREMIERS CARACTERES (m_frame`) amnu_menu.Item[i].TriggerEvent("clicked") Return True End If lb_ret = wf_get_menu(amnu_menu.Item[i], al_row) If lb_ret Then Exit Next Return lb_ret
Et je confirme que ça marche AUSSI en compilé
La solution préconisée (nom de la window à ouvrir dans le tag) ne pouvait satisfaire à notre besoin car l'ouverture d'un écran peut être conditionnée (donc passage de paramètres, +eurs lignes de code sur l'évènement clicked du menu, etc.). Cependant, je retiens pour de futures applications plus simples !
PS: Comment vous faites pour mettre les keywords en couleur ?
Hors ligne
Au fait, ton problème de favoris est-il résolu?
<HS>
Un petit rappel pour ceux qui ne savent pas ce qu'est un troll
</HS>
Hors ligne
Oups, désolé, nos réponses se sont croisées...
sbouvetJD a écrit:
PS: Comment vous faites pour mettre les keywords en couleur ?
Il suffit de mettre code=pb comme indiqué ici
Hors ligne
1) Structure de ma table :
CC_STE (société de l'utilisateur)
CI_MATRIC (matricule de l'utilisateur)
CV_CLASS (nom du menu)
LV_MENU (libellé associé)
2) fonction d'instanciation de la table :
// function gf_set_favoris UO_DSAncetre lds_favori Long ll_row lds_favori = Create UO_DSAncetre lds_favori.DataObject = "d_favoris" lds_favori.setTransObject(SQLCA) lds_favori.Retrieve(gSoc, gMatric) If lds_favori.Find("cv_class = ~"" + as_class + "~"", 1, lds_favori.RowCount()) = 0 Then If lds_favori.RowCount() < 10 Then ll_row = lds_favori.InsertRow(0) lds_favori.setItem(ll_row, "cc_ste", gSoc) lds_favori.setItem(ll_row, "ci_matric", gMatric) lds_favori.setItem(ll_row, "cv_class", as_class) lds_favori.setItem(ll_row, "lv_menu", as_menu) If lds_favori.Update(True, False) = 1 Then COMMIT USING SQLCA; lds_Favori.ResetUpdate() Else ROLLBACK USING SQLCA; End If End If End If Destroy lds_favori Return True
Appel de cette fonction sur chacune de mes entrées menu :
maFenetre lw Parametres la la.lng[1] = 2 SetPointer(HOURGLASS!) iEntryClassName =This.ClassName() OpenSheetWithParm(lw, la, parentwindow, 0, Original!) gf_set_favori("Libellé", iEntryClassName)
Sur dw_1.Clicked de ma w_dlg_favoris
m_frame lmnu_main lmnu_main = Create Using "m_frame" If dwo.Name = "lv_menu" Then If wf_get_menu(lmnu_main, row) Then Close(Parent) End If Destroy lmnu_main
Fonction wf_get_menu
Long i ClassDefinition lcd_menu Boolean lb_ret For i = 1 To UpperBound(amnu_menu.Item) lcd_menu = amnu_menu.Item[i].ClassDefinition /* ON TRONQUE LE LIBELLE DU MENU (m_frame`nom_menu) */ If Trim(dw_1.getItemString(al_row, "cv_class")) = Trim(Mid(lcd_menu.Name, 9)) Then amnu_menu.Item[i].TriggerEvent("clicked") Return True End If lb_ret = wf_get_menu(amnu_menu.Item[i], al_row) If lb_ret Then Exit Next Return lb_ret
Hors ligne
pour ta solution
je passe le topic à [RESOLU]
Hors ligne
sbouvetJD a écrit:
<HS>Ma grand-mère habite à Massy aussi ! </HS>
chouette, j'irais boire le thé chez elle alors
Hors ligne
Pages: 1