Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Pages: 1
Bonsoir,
Mon petit soucis va être relativement difficile à décrire, alors je vais tenter d'être aussi clair que possible.
J'ai une sheet qui contient uniquement une datawindow, destinée à afficher les comptes utilisateurs d'un produit.
Cette datawindow ressemble à un courrier postal (Nom, adresse, téléphone, etc.). Chaque row retourné par ma procédure stockée occupe donc une page.
J'utilise la molette de la souris pour passer d'un row à l'autre (et j'ai bien pris garde à ce que la molette de la souris scrolle 1 ligne à la fois, dans le panneau de configuration Windows).
Mieux encore, l'utilisateur dispose de boutons pour passer d'une page à l'autre (donc d'un row à l'autre) définis dans mon ue_scroll(integer ai_scrolltype) event de ma sheet :
long ll_row // security IF NOT IsValid(idw_datawindow) THEN RETURN // change active row CHOOSE CASE ai_scrolltype CASE guo_cst.ii_first_page ll_row = 1 idw_datawindow.ScrollToRow(ll_row) CASE guo_cst.ii_previous_page idw_datawindow.ScrollPriorPage() ll_row = idw_datawindow.GetRow() CASE guo_cst.ii_next_page idw_datawindow.ScrollNextPage() ll_row = idw_datawindow.GetRow() CASE guo_cst.ii_last_page ll_row = idw_datawindow.RowCount() idw_datawindow.ScrollToRow(ll_row) END CHOOSE // select active row idw_datawindow.SelectRow(0,FALSE) idw_datawindow.SelectRow(ll_row,TRUE)
Cet event est décrit dans mon objet ancêtre de toutes mes fenêtres : c'est mon w_base_sheet.
Jusque là, tout fonctionne parfaitement.
Maintenant ce se complique : dans ma datawindow j'affiche des informations complémentaires, à savoir la liste des produits déjà achetés par l'utilisateur.
Auparavant j'avais donc 1 utilisateur = 1 row retourné par la procédure stockée.
Maintenant j'ai donc 1 utilisateur = N rows retournés.
Je mets en place un GROUP dans ma datawindow, sur le critère du numéro d'utilisateur. Ainsi j'affiche ses informations personnelles comme auparavant, et dans la zone de groupe j'affiche la liste des produtis achetés.
Ainsi, j'ai encore et toujours 1 page affichée par utilisateur.
Ca fonctionne correctement.
Mais voilà les conséquences :
- lorsque l'utilisateur de l'application clic sur le bouton "Scroll jusqu'à la page suivante", ca scroll jusqu'à la dernière page.
- lorsque l'utilisateur scrolle directement avec sa souris, ca produit des affichages bizarres... Notemment au niveau de la liste des produits achetés.
Il semblerait qu'en fait mon scroll ne fonctionne plus correctement.
Je ne parviens pas vraiment à déterminer ce qui pose problème :
- si c'est le fait que pour 10 rows retournés on n'aie que 2-3 pages affichées (10 produtis répartis entre 2-3 utilisateurs de produit)
- ou bien si c'est que mes fonctions relative au Scroll (ScrollNextPage() et GetRow()) se mélangent les pinceaux entre le row "utilisateur" qui occupe la majeure partie de la page, et le row "produit" de la liste des produits pour cet utilisateur.
Une solution serait probablement de remplacer ma liste de produits par un vrai sous-rapport (une seconde datawindow). Malheureusement c'est ce que j'avais fait initialement, et ca me posait des problèmes similaires voire pires.
Avez-vous une idée du problème ?
Je bataille là-dessus sans en venir à bout. Bien que ne pouvant plus toucher au code pendant quelques jours, je reste à l'écoute de vos conseils et suggestions.
Merci, encore une fois, pour votre aide !
Dernière modification par Nyphel (23-06-2008 11:04:00)
Hors ligne
Salut
dans la DW page() est correcte ? row() est correcte ?
ll_page = idw_datawindow.ScrollNextPage() ll_page = Long(idw_datawindow.describe("Evaluate( 'Page()', "+ string(ll_page)+" )" ))
ll_page est bon ?
Hors ligne
Je ne pourrai pas tester le code avant lundi, mais lorsque j'affichais mon rowcount, j'avais bien un nombre qui semblait correspondre à ma liste de produits :s
Hors ligne
Bonjour,
Voici le code de mon ue_scroll event, défini dans mon ancêtre pour mes sheet :
long ll_row // security IF NOT IsValid(idw_datawindow) THEN RETURN // change active row CHOOSE CASE ai_scrolltype CASE guo_cst.ii_first_page ll_row = 1 idw_datawindow.ScrollToRow(ll_row) CASE guo_cst.ii_previous_page idw_datawindow.ScrollPriorPage() ll_row = idw_datawindow.GetRow() CASE guo_cst.ii_next_page idw_datawindow.ScrollNextPage() ll_row = idw_datawindow.GetRow() CASE guo_cst.ii_last_page ll_row = idw_datawindow.RowCount() idw_datawindow.ScrollToRow(ll_row) END CHOOSE // select active row idw_datawindow.SelectRow(0,FALSE) idw_datawindow.SelectRow(ll_row,TRUE)
Le problème, c'est que du coup ca sélectionne le row courant sur mon rapport puisqu'il hérite de cet ancêtre.
J'ai donc voulu surcharger cet event dans la sheet de mon rapport, et j'ai fait comme suit :
//override ! long ll_row // security IF NOT IsValid(idw_datawindow) THEN RETURN // change active row CHOOSE CASE ai_scrolltype CASE guo_cst.ii_first_page ll_row = 1 idw_datawindow.ScrollToRow(ll_row) CASE guo_cst.ii_previous_page idw_datawindow.ScrollPriorPage() ll_row = idw_datawindow.GetRow() CASE guo_cst.ii_next_page idw_datawindow.ScrollNextPage() ll_row = idw_datawindow.GetRow() CASE guo_cst.ii_last_page ll_row = idw_datawindow.RowCount() idw_datawindow.ScrollToRow(ll_row) END CHOOSE // select active row //idw_datawindow.SelectRow(0,FALSE) //idw_datawindow.SelectRow(ll_row,TRUE)
La conséquence, c'est que lorsque l'utilisateur clique sur un bouton pour passer à la page suivante, les deux events vont être appelés successivement. Il n'y a pas de surcharge comme je le pensais.
Dès lors, puisque mon test comporte 3 pages, j'avais l'impression que ca scrollait directement jusqu'à la dernière page.
Voici mon nouveau ue_scroll event défini dans la sheet de mon rapport :
// Unselect active row, that has been selected by ancester event idw_datawindow.SelectRow(idw_datawindow.GetSelectedRow(0),FALSE)
Voilà une bonne chose de faite.
Mais dès lors survient une question : est-il impossible de surcharger un event défini dans un ancêtre ? J'avoue que ça me perturbe.
Par contre mon second problème persiste : lorsque je scrolle directement avec ma souris, le comportement du rapport est étrange.
Si la page courante contient plusieurs produits, alors ca scrolle de produit en produit... Ou quelque chose de similaire : ca réaffiche la page, en affichant 1 produit en moins (celui en haut de la liste).
Si la page courante contient un seul produit, alors ca scrolle bien jusqu'à la page suivante.
Je ne parviens pas à trouver où se gère l'évènement correspondant.
Dernière modification par Nyphel (23-06-2008 07:18:40)
Hors ligne
Nyphel a écrit:
est-il impossible de surcharger un event défini dans un ancêtre ? J'avoue que ça me perturbe.
Lorsque tu es sur le code de ton héritier, avec un clic droit tu peux choisir d'étendre le script de l'ancêtre ou non dans le menu contextuel. Par défaut l'option "Extend ancestor Script" est cochée, mais tu peux la décocher pour ne plus prendre en compte les niveaux supérieurs de la hiérarchie de code.
Dernière modification par abdelta (23-06-2008 08:41:02)
Hors ligne
Mmmmmh d'accord !
Merci pour ce tip, j'avais cherché sans succès. J'admets que j'ai un peu de mal à trouver les menus cachés sous Pb... Je ne vous raconte pas le temps que j'ai passé avant de parvenir à afficher la Stored Procedure de mes datawindows (J'interviens sur l'évolution d'un ancien projet).
Hors ligne
J'ai trouvé une solution à mon problème : j'ai surchargé le comportement par défaut pour un scroll avec la molette de souris, ou bien avec les flèches du clavier. Il est à noter que le changement de row via les page-up/page-down du clavier fonctionnait parfaitement.
Donc j'ai créé 2 user events sur ma datawindow (et non pas sur la sheet qui contient la datawindow).
Le 1er event est mappé sur pbm_vscroll et contient le code suivant :
CHOOSE CASE scrollcode CASE 0 idw_datawindow.ScrollPriorPage() CASE 1 idw_datawindow.ScrollNextPage() END CHOOSE return 1
Le 2nd event est mappé sur pbm_dwkey et contient le code suivant :
IF KeyDown(KeyDownArrow!) THEN idw_datawindow.ScrollNextPage() ELSEIF KeyDown(KeyPageDown!) THEN idw_datawindow.ScrollNextPage() ELSEIF KeyDown(KeyUpArrow!) THEN idw_datawindow.ScrollPriorPage() ELSEIF KeyDown(KeyPageUp!) THEN idw_datawindow.ScrollPriorPage() ELSEIF KeyDown(KeyHome!) THEN idw_datawindow.ScrollToRow(1) ELSEIF KeyDown(KeyEnd!) THEN idw_datawindow.ScrollToRow(idw_datawindow.RowCount()) END IF return 1
Merci pour votre aide, une fois encore ;)
Dernière modification par Nyphel (23-06-2008 11:12:59)
Hors ligne
Et dans le cas où l'utilisateur a défini dans les propriétés de sa souris que un scroll de molette correspond à plusieurs pages, alors il risque de ne pas voir tous les utilisateurs. Ca va en 'sauter' en scrollant. En pratique on a N fois l'event mappé sur pbm_vscroll qui va être levé.
Je me base donc sur la fonction CPU() qui retourne le nombre de millisecondes écoulées depuis le lancement de l'application pour déterminer si il faut accepter la série de scrolls ou non. Si on a 3 scrolls qui surviennent à quelques millièmes de secondes près, c'est que l'utilisateur a modifié les paramètres de sa souris pour scroller par 3.
long ll_current_mousescroll, ll_elapsed_time, ll_minimal_delay ll_minimal_delay = 50 CHOOSE CASE scrollcode CASE 0 ll_current_mousescroll = CPU() ll_elapsed_time = ll_current_mousescroll - il_previous_mousescroll IF ll_elapsed_time >= ll_minimal_delay THEN il_previous_mousescroll = ll_current_mousescroll idw_datawindow.ScrollPriorPage() END IF CASE 1 ll_current_mousescroll = CPU() ll_elapsed_time = ll_current_mousescroll - il_previous_mousescroll IF ll_elapsed_time >= ll_minimal_delay THEN il_previous_mousescroll = ll_current_mousescroll idw_datawindow.ScrollNextPage() END IF END CHOOSE return 1
Hors ligne
0.000 pépites
Hors ligne
Mmmmhhh... Il y a quelque chose que je n'avais pas prévu.
Imaginons que l'on réduise la résolution de l'écran en 800x600 pixels et que l'utilisateur ne voit plus que la partie haute du rapport. Naturellement, il va vouloir scroller pour afficher la partie basse. Dans les différents rapports ca se passe ainsi : si on scrolle et qu'une partie de la page n'est pas visible, ca l'affiche. Si on est en bas de la page, alors on affiche la page suivante.
Dans mon cas je redéfini l'event scrolling, donc je ne gère plus du tout cela.
Croyez-vous qu'il soit possible de :
- détecter si on visualise uniquement une partie de la page, et qu'il reste un morceau à afficher ?
- scroller sur la page courante, comme le ferait une vertical scroll barre ?
Hors ligne
j'en profite pour faire irruption ici...et surtout sur pbm_vscroll...
a quoi correspondent les valeurs de scrollcode ?
ptet que ca va m'aider pour mon ascenceur vertical qui déconne toujours lol
Merci
Hors ligne
C'est simplement le code qui identifie ton scroll : scroll vers le haut, scroll vers le bas, etc. Il s'agit là de scroll avec la molette de la souris, pas des ascenseurs manuels.
Le mieux c'est de te faire un messagebox qui affiche le code du scroll, et tu t'amuses à scroller pour identifier le code qui t'intéresse ;)
messagebox('', 'Code du scroll = ' + string(long(scrollcode)))
Dernière modification par Nyphel (23-06-2008 15:03:53)
Hors ligne
ah ok, merci ...bon béh ca m'aide pas alors :'(
Hors ligne
Pourtant Nyphel a bien répondu à ta question
Quand on scroll avec la molette de la souris, les valeurs de scrollcode sont 2 ou 3
Hors ligne
oui mais moi j'ai un probleme avec une dw de saisie avec un groupe, où, quand on insère une ligne "en bas de page", ca saute sur la page suivante au lieu de descendre que d'une ligne
Hors ligne
Quand on scroll avec la molette de la souris, les valeurs de scrollcode sont 2 ou 3
C'est ce que j'avais lu moi aussi, mais cela ne fonctionnait pas.
Après tests, ce sont les valeurs 0 et 1 qui sont fonctionnelles sur mon poste... Etrange ! Il y a peut-être quelque chose qui m'échappe. C'est même probable :-/
J'en profite pour rappeler ce sur quoi je bloque depuis tout à l'heure, des fois qu'un lecteur passerait par là ;)
Mmmmhhh... Il y a quelque chose que je n'avais pas prévu.
Imaginons que l'on réduise la résolution de l'écran en 800x600 pixels et que l'utilisateur ne voit plus que la partie haute du rapport. Naturellement, il va vouloir scroller pour afficher la partie basse. Dans les différents rapports ca se passe ainsi : si on scrolle et qu'une partie de la page n'est pas visible, ca l'affiche. Si on est en bas de la page, alors on affiche la page suivante.
Dans mon cas je redéfini l'event scrolling, donc je ne gère plus du tout cela.
Croyez-vous qu'il soit possible de :
- détecter si on visualise uniquement une partie de la page, et qu'il reste un morceau à afficher ?
- scroller sur la page courante, comme le ferait une vertical scroll barre ?
Hors ligne
Pages: 1