Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Bonjour à tous,
J'ai un change request un peu particulier de la part d'un client.
Il voudrait, pour certains champs, avoir la possibilité de faire un choix dans une window.
Les champs en question sont en général des varchar ou long varchar. La solution drop down n'a
pas été retenue.
La window serait donc automatiquement ouverte lors de l'itemfocuschanged. les conditions
pour ouvrir la window ou les données n'ont pas d'intérêt... ici.
Mon problème consiste à ouvrir la window à proximité de du champ, je dirais même de manière
"juxtaposée" par rapport au champ, soit à droite, soit à gauche si nécessaire. Pas question ici
de positionner la window par rapport au pointeur de la souris... ce serait trop facile, mais bien
par rapport à un champ.
Quelqu'un a-t-il déjà fait ce genre de truc ?
Merci pour vos idées
Hors ligne
Salut,
tu peux facilement récupérer la postion et la dimension de ton champ :
dw_control.Object.controlname.X dw_control.Object.controlname.Y dw_control.Object.controlname.Width dw_control.Object.controlname.Height
ensuite grâce à ces valeurs tu devrais être en mesure de positionner ta fenêtre .
Hors ligne
Bien sur... heu, et merci.
C'est une bonne piste, mais on obtient ainsi les coordonnées du champ dans la datawindow.
La window, par contre est positionnée par rapport au workspace.
Y aurait-il une possibilité de trouver les coordonnées de la dw facilement sachant qu'elle peut
être dans un tabpage qui est dans un tab qui est dans un tabpage qui est .....
Hors ligne
tu ne peux pas faire le meme systeme que le popmenu ?
tu sais quand on clique sur le bouton droite de la souris, tu vois apparaitre le popmenu juste à l'endroit...
juste une piste...
Hors ligne
Oui, j'y avais pensé aussi.
Tout est d'ailleurs codé, par exemple dans l'event rbuttonup de l'objet pfc_u_dw.
Mais, le but étant un encodage rapide en se passant le plus possible de la souris,
çà ne m'arrange pas. Ca m'énerve... Je ne vois pas à priori le moyen de trouver
les coordonnées d'un contrôle dans une window frame.
Sauf alors, remonter dans tous les "conteneurs" du contrôle et récupérer toutes les
coordonnées, mais çà me semble fastidiueux.
Y a pas des API pour çà ?
Hors ligne
Marcus a écrit:
Sauf alors, remonter dans tous les "conteneurs" du contrôle et récupérer toutes les
coordonnées, mais çà me semble fastidiueux.
je ne connais pas de méthode plus directe
mais c'est pas si fastidieux que ça par récursivité et controle du type de l'objet
(x,y) du controle dans la dw
(x,y) de la dw dans son parent (tabpage,page)
ainsi de suite par récursivité sur le parent jusqu'à la fenêtre ?
Hors ligne
--------------------------------------------------------------------
Bonjour, peut-on considérer que le problème est Résolu ?
--------------------------------------------------------------------
Hors ligne
Effectivement, c'était pas très compliqué. C'est même assez simple.
Il s'agit donc de trouver la position d'une datawindow dans une window,
sachant que la datawindow peut être placée directement dans la window ou dans un tabpage
qui est dans un tab qui est dans un tabpage qui est ....
Le code se trouve dans une fonction qui a 2 arguments al_x et al_y passés par référence:
powerobject lpo_parent tab ltab_tab userobject luo_uo w_ancestor lw_window // Get positions in the parent object al_x = This.X al_y = This.Y lpo_parent = This.GetParent() // Loop getting the parent of the object until it is of type window! Do while IsValid (lpo_parent) If lpo_parent.TypeOf () <> Window! Then Choose Case TypeOf (lpo_parent) Case Tab! ltab_tab = lpo_parent al_x = al_x + ltab_tab.X al_y = al_y + ltab_tab.Y Case UserObject! luo_uo = lpo_parent al_x = al_x + luo_uo.X al_y = al_y + luo_uo.Y End Choose lpo_parent = lpo_parent.GetParent() Else lw_window = lpo_parent al_x = al_x + lw_window.WorkSpaceX () al_y = al_y + lw_window.WorkSpaceY () Exit End if Loop Return 1
Hors ligne
encore merci pour ce script
Hors ligne
bravo et !
Hors ligne