Répétez apres moi :J'aime PBAdonf. J'aime PBAdonf. J'aime PBAdonf.

Le forum (ô combien francophone) des utilisateurs de Powerbuilder.

Recherche rapide

Annonce

Certaines rubriques, dont des cours, sont uniquement visibles par les membres du forum ^^.
Dans la rubrique Liens & Références, vous avez accès à un sommaire de téléchargement, profitez-en !
Il existe maintenant un nouveau TOPIC "Votre CV en Ligne" accessible uniquement par demande.

#1 26-03-2013 15:13:18

Ben53  
Membre Geek
Date d'inscription: 18-02-2010
Messages: 46
Pépites: 184
Banque: 0

[RESOLU] Pavé numérique virtuel

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

Code:

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

 

#2 26-03-2013 15:48:46

rincevent  
Modérateur
Award: bf
Lieu: Belgique
Date d'inscription: 06-02-2007
Messages: 722
Pépites: 100,002,023
Banque: 0

Re: [RESOLU] Pavé numérique virtuel

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.


http://img114.imageshack.us/img114/8519/userbar175801nb.gif
Pourquoi ne puis-je vivre comme n'importe quel être humain ? Pourquoi mon destin est-il de ne pouvoir cesser de me battre ?

Hors ligne

 

#3 26-03-2013 15:59:29

Ben53  
Membre Geek
Date d'inscription: 18-02-2010
Messages: 46
Pépites: 184
Banque: 0

Re: [RESOLU] Pavé numérique virtuel

Alors :

voici mon userobject http://image.noelshack.com/fichiers/2013/13/1364313186-image-2.jpg

voici le code dans les boutons :

Code:

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

Code:

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

Code:

of_set_object(dragobject au_object)

Ensuite je suis obliger de coder dans chaque datawindow ou sle dans l'évenement getfocus() l'appel suivant :

Code:

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

 

#4 26-03-2013 16:12:56

rincevent  
Modérateur
Award: bf
Lieu: Belgique
Date d'inscription: 06-02-2007
Messages: 722
Pépites: 100,002,023
Banque: 0

Re: [RESOLU] Pavé numérique virtuel

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.


http://img114.imageshack.us/img114/8519/userbar175801nb.gif
Pourquoi ne puis-je vivre comme n'importe quel être humain ? Pourquoi mon destin est-il de ne pouvoir cesser de me battre ?

Hors ligne

 

#5 26-03-2013 16:26:04

erasorz  
Admin
Lieu: Babylone
Date d'inscription: 23-11-2006
Messages: 5121
Pépites: 97,197
Banque: 2,147,483,647

Re: [RESOLU] Pavé numérique virtuel

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é.


N'envoyez jamais un humain faire le travail d'un programme.

Hors ligne

 

#6 27-03-2013 06:41:27

xlat  
0xc0000005
Award: bf
Lieu: Tanger (طنج)
Date d'inscription: 04-12-2010
Messages: 720
Pépites: 11,343
Banque: 100,221,387,868,884,300
Site web

Re: [RESOLU] Pavé numérique virtuel

Bonjour,

est si sur  chaque bouton de ton clavier virtuel tu codais l'event GetFocus en faisant quelque chose comme

Code: pb

of_set_object( ::GetFocus( ) )


ça suffirait pas ?


https://lut.im/eJINqa9o/vAtyxD0h "Don't believe everything you read on the Internet"
    -- Abraham Lincoln

www.ngs.ma

Hors ligne

 

#7 27-03-2013 07:38:33

Ben53  
Membre Geek
Date d'inscription: 18-02-2010
Messages: 46
Pépites: 184
Banque: 0

Re: [RESOLU] Pavé numérique virtuel

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

Code:

::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

 

#8 27-03-2013 08:55:06

xlat  
0xc0000005
Award: bf
Lieu: Tanger (طنج)
Date d'inscription: 04-12-2010
Messages: 720
Pépites: 11,343
Banque: 100,221,387,868,884,300
Site web

Re: [RESOLU] Pavé numérique virtuel

... 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).


https://lut.im/eJINqa9o/vAtyxD0h "Don't believe everything you read on the Internet"
    -- Abraham Lincoln

www.ngs.ma

Hors ligne

 

#9 27-03-2013 09:25:13

erasorz  
Admin
Lieu: Babylone
Date d'inscription: 23-11-2006
Messages: 5121
Pépites: 97,197
Banque: 2,147,483,647

Re: [RESOLU] Pavé numérique virtuel

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)


N'envoyez jamais un humain faire le travail d'un programme.

Hors ligne

 

#10 27-03-2013 10:32:06

Ben53  
Membre Geek
Date d'inscription: 18-02-2010
Messages: 46
Pépites: 184
Banque: 0

Re: [RESOLU] Pavé numérique virtuel

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

 

#11 27-03-2013 12:10:17

xlat  
0xc0000005
Award: bf
Lieu: Tanger (طنج)
Date d'inscription: 04-12-2010
Messages: 720
Pépites: 11,343
Banque: 100,221,387,868,884,300
Site web

Re: [RESOLU] Pavé numérique virtuel

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:

Code: pb

if IsHeritedFrom( "dragobject", ::GetFocus() ) then of_set_object( ::GetFocus() )


IsHeritedFrom est décrite ici


https://lut.im/eJINqa9o/vAtyxD0h "Don't believe everything you read on the Internet"
    -- Abraham Lincoln

www.ngs.ma

Hors ligne

 

#12 27-03-2013 12:56:13

Ben53  
Membre Geek
Date d'inscription: 18-02-2010
Messages: 46
Pépites: 184
Banque: 0

Re: [RESOLU] Pavé numérique virtuel

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

 

#13 27-03-2013 16:35:47

_francois_  
Bienfaiteur du site
Lieu: TOULOUSE
Date d'inscription: 25-03-2010
Messages: 151
Pépites: 178,983,268,111
Banque: 9,223,372,036,854,776,000

Re: [RESOLU] Pavé numérique virtuel

Alors si la saisie sur le pavé virtuel se fait à la souris

Code: pb

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

Code: pb

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

Code: pb

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

 

#14 28-03-2013 08:54:01

Ben53  
Membre Geek
Date d'inscription: 18-02-2010
Messages: 46
Pépites: 184
Banque: 0

Re: [RESOLU] Pavé numérique virtuel

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

 

#15 28-03-2013 09:50:53

_francois_  
Bienfaiteur du site
Lieu: TOULOUSE
Date d'inscription: 25-03-2010
Messages: 151
Pépites: 178,983,268,111
Banque: 9,223,372,036,854,776,000

Re: [RESOLU] Pavé numérique virtuel

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

 

#16 28-03-2013 15:09:19

Ben53  
Membre Geek
Date d'inscription: 18-02-2010
Messages: 46
Pépites: 184
Banque: 0

Re: [RESOLU] Pavé numérique virtuel

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

 

Pied de page des forums

Propulsé par FluxBB 1.2.22