Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Bonjour,
je cherche à faire un pavé numérique virtuel, cependant je n'arrive pas à faire un useroject générique (sans avoir à spécifier le focus du champ dans lequel écrire)... avant l'appel à la fonction
keybd_event( ascii, 0, 0, 0 )
Pour que cela fonctionne, je suis obliger de passer en référence à mon pavé numérique, l'objet graphique et donc coder sur chaque objet de saisie (sle ou datawindow, dans l'évenement getfocus())
Une idée pour que l'objet soit générique (comme le clavier visuel de windows) ou cela n'est pas possible ?
Dernière modification par Ben53 (28-03-2013 08:57:07)
Hors ligne
Salut Ben53,
Perso je n'arrive pas à comprendre où se situe ton problème sur base de ton message, si tu veux essayer de décrire plus précisément l'opération que tu n'arrives pas à effectuer je pourrai peut être t'aider plus.
Hors ligne
Alors :
voici mon userobject
voici le code dans les boutons :
if isvalid(id_object) Then id_object.setfocus( ) keybd_event( al_key, 1, 0, 0 ) End If
Mon problème est que avant d'appeler la fonction
keybd_event( al_key, 1, 0, 0 )
il faut absolument spécifié le focus du champ dans lequel je veux écrire...
Pour palier au problème, j'ai déclarer une variable d'instance (id_object) et un setteur
of_set_object(dragobject au_object)
Ensuite je suis obliger de coder dans chaque datawindow ou sle dans l'évenement getfocus() l'appel suivant :
uo_clavier_virtuel.of_set_object(this)
j'aurai aimé une technique permettant de ne pas gérer de variable d'instance et rien à coder lorsque j'utilise mon clavier virtuel...
est-ce plus clair ?
Hors ligne
C'est un peu plus clair je pense (jamais sûr d'avoir bien tout compris )
par contre du coup le seul conseil/astuce que je peux te donner c'est de coder dans l'ancêtre de toutes tes DW l'event GetFocus() (car tu as bien un ancêtre commun à toutes tes DWs n'est-ce pas )
Il me semble que tu as besoin de 2 objets qui collaborent entre eux , il me parait donc assez standard de faire comme tu le fais (passer la ref d'un des objets à l'autre en var d'instance)
Y arriver sans rien coder je vois pas trop comment ça serait possible.
Hors ligne
Il me semble que j'avais fait un truc similaire il y a qq années.
Je vais regarder demain matin sur le PC concerné.
Hors ligne
Bonjour,
est si sur chaque bouton de ton clavier virtuel tu codais l'event GetFocus en faisant quelque chose comme
of_set_object( ::GetFocus( ) )
ça suffirait pas ?
Hors ligne
J'ai essayer de mettre ce code dans l'évenement getfocus() d'un des boutons, mais il ne se passe rien, il faudrait récupérer une référence du champ qui à le focus avant que l'on clique sur celui-ci...
Un autre problème, la fonction GetFocus() renvoi la référence d'un GraphicObject,mais le soucie est qu'il n'existe pas de méthode setFocus() sur cette classe.
J'ai donc déclarer le id_object en dragobject et je met le GraphicObject dans le dragobject.
L'objet retournée par
::getfocus()
est mon bouton et non la zone ou doit être inséré le caractère
Dernière modification par Ben53 (27-03-2013 07:58:00)
Hors ligne
... désolé, je m'étais basé sur la doc de GetFocus :
F1 a écrit:
GetFocus PowerScript event
Occurs just before the control receives focus (before it is selected and becomes active).
Est-ce que ton clavier virtuel est sur une fenêtre à part ?
Si c'est le cas, tu peux essayer de coller le code sur l'event activate de la fenêtre.
Pour GraphicObject => DragObject : effectivement il vaut mieux tester l’héritage avant d'affecter à ta variable d'instance sinon ça pourrait lever une exception (par exemple une window est un graphicobject mais n'est pas un dragobject).
Hors ligne
Bon j'ai regardé dans mes archives et ça ne te sera pas utile car je procédais différemment. (un bouton à coté d'un champ pour ouvrir le clavier tactile, donc le lien est clairement établi)
Hors ligne
Mon clavier virtuel est un UserObject posé sur ma fenêtre directement.
Pour tester caster le graphicObject en Dragobject il y a une syntaxe spécial ? peut être mettre un try catch autour ?
Merci
Hors ligne
Ben53 a écrit:
Mon clavier virtuel est un UserObject posé sur ma fenêtre directement.
Pour tester caster le graphicObject en Dragobject il y a une syntaxe spécial ? peut être mettre un try catch autour ?
Merci
par exemple:
if IsHeritedFrom( "dragobject", ::GetFocus() ) then of_set_object( ::GetFocus() )
IsHeritedFrom est décrite ici
Hors ligne
Merci pour cette fonction, je l'ai implémentée dans notre application.
Par contre toujours rien du côté de la récupération du focus de l'objet avant le clic sur un des boutons de mon pavé numérique visuel.
en attendant, les datawindows je code dans l'évenement getfocus() de chaque datawindows le passage de référence au pavé numérique visuel.
Merci encore pour vos réponses
Hors ligne
Alors si la saisie sur le pavé virtuel se fait à la souris
Function ULong GetRealFocus() Library 'user32.dll' Alias for "GetFocus" Function ULong SetRealFocus(ulong hwnd) Library 'user32.dll' Alias for "SetFocus"
Il te fauit une variable d'instance ulong iul_handle
Tu code la pbm_mousemove de tes boutons
ulong lul_handle lul_handle = getRealFocus() if lul_handle <> handle(this) then // enfin il faut voir les test que tu veux car celui là est un peu inutile ;) iul_handle = lul_handle end if
et enfin le clicked! des boutons
if iul_handle > 0 then setRealFocus(iul_handle) keybd_event( ta_cle, 1, 0, 0 ) end if
En gros en promenant ta souris sur tes boutons il récupère le handle du contrôle qui a le focus de saisie
J'ai juste fait un petit test hyper rapide à toi de voir si c'est adapté à ton problème.
Dernière modification par _francois_ (28-03-2013 08:14:22)
Hors ligne
Bonjour,
Merci beaucoup pour ta solution, j'ai coder le pbm_mousemove directement sur le UserObject dans lequel se trouve mes différents boutons et ça marche très bien.
Si je comprends bien, la fonction GetRealFocus() permet de récupérer le focus du champ de saisie et on enregistre sa référence au moment du survol sur le pavé numérique !
Merci, sujet résolu !
Hors ligne
http://msdn.microsoft.com/en-us/library … p/ms646294(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library … p/ms646312(v=vs.85).aspx
C'est une fonction de l'API Win32 qui récupère le handle du contrôle qui a la focus clavier (dans le cas d'un champ de saisie dans une datawindow c'est le handle du champ de saisie et non de la datawindow)
Ce handle tu vas pouvoir t'en servir avec d'autres fonction de l'API Win32 (dans ce cas précis le SetRealFocus) mais tu ne vas pas pouvoir en faire grad chose avec PB lui même à moins de parcourir tous les élements de ta fenêtre en regardant le handle de chacun et en le comparant avec le handle récupéré.
Après tu peux récupérer la classe du contrôle associé au handle pour vérifier que le focus est bien sur un contrôle qui accepte le saisies.
Hors ligne
L'objectif de ce clavier visuel est de développer une application utilisé sur tablette tactile.
Il semble y avoir un distinction entre le déclenchement du pbm_mousemouve depuis le PC (tout est OK) et depuis la tablette. En effet sa ne fonctionne pas sauf si on "glisse" expressement le cursor avant de cliquer sur le bouton....
Je ne sais pas si je suis clair....
EDIT : en fait en codant le pbm_mousemouve dans chaque bouton, ça règle le problème !
Merci
Dernière modification par Ben53 (28-03-2013 15:14:41)
Hors ligne