PB à toute heure et à tout moment. (à parcourir avec modération)

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-05-2011 13:27:48

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

[RESOLU] Singlelineedit kidnappe le focus

Bonjour,
j'utilise l'API windows SHAutoComplete sur un sle histoire de faciliter la saisie d'un fichier, cela fonctionne bien à l'exception que la touche TAB ne permet plus de changer de contrôle, elle modifie l’élément sélectionnée dans les suggestions d'autocompletion.
Cela serait normale si j'appelais cette api avec le paramètre SHACF_USETAB, or je ne l'emploi pas.
voici le code que j'utilise : (registerautocompletion.srf)

Code: pb

global type registerautocompletion from function_object
end type

type prototypes
FUNCTION long SHAutoComplete(ulong hwnd_edit, ulong dwflags) LIBRARY "shlwapi.dll"
end prototypes

forward prototypes
global function boolean registerautocompletion (singlelineedit asle_obj)
end prototypes

global function boolean registerautocompletion (singlelineedit asle_obj);/* SRC = http://msdn.microsoft.com/en-us/library/bb759862(VS.85).aspx */
long ll_res 
ulong flag 
constant ulong SHACF_DEFAULT =           0        // = SHACF_FILESYSTEM | SHACF_URLALL 
constant ulong SHACF_FILESYSTEM =         1
constant ulong SHACF_URLHISTORY =         2
constant ulong SHACF_URLMRU =           4
constant ulong SHACF_USETAB =           8
constant ulong SHACF_FILESYS_ONLY =       16        //0x10
constant ulong SHACF_FILESYS_DIRS =       32        //0x20
constant ulong SHACF_VIRTUAL_NAMESPACE =     64        //0x40
constant ulong SHACF_URLALL =           SHACF_URLHISTORY + SHACF_URLMRU
constant ulong SHACF_AUTOSUGGEST_FORCE_ON =  268435456  //0x10000000
constant ulong SHACF_AUTOSUGGEST_FORCE_OFF = 536870912  //0x20000000
constant ulong SHACF_AUTOAPPEND_FORCE_ON =  1073741824  //0x40000000
constant ulong SHACF_AUTOAPPEND_FORCE_OFF =  2147483648  //0x80000000
flag = SHACF_FILESYSTEM 
ll_res = SHAutoComplete(Handle(asle_obj ), flag)
return true
end function



J'ai fais une petite app en C++ et là la touche TAB sur l'edit avec autocompletion permet bien de change de contrôle. Pour info j'utilise pb 11.5 (vu sur tout les builds que l'on a déjà installé).

une idée pour forcer le changement de focus vers le prochain sans hard-codé le nom du contrôle (ex: cb_1.setFocus() ) ?

Dernière modification par xlat (27-05-2011 14:21:54)


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

www.ngs.ma

Hors ligne

 

#2 27-05-2011 14:21:33

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] Singlelineedit kidnappe le focus

J'ai tenté de passer par le message windows WM_NEXTDLGCTL qui fonctionne uniquement pour des dialogues (ex mfc, win32) mais pas avec les windowclass de powerbuilder.
Ensuite avec les API GetNextWindow et SetFocus(HWND); toujours, infructueux.
Je me suis donc résolut à scanner les objets pour recherchers les TABORDER et rechercher le plus proche...
voici le code si ca peut aider quelqu'un d'autre:

Code: pb

function dragobject getnextdragobject (graphicobject ago_obj, boolean ab_forward);dragobject ldo_curr, ldo_childs
windowobject lwo_controls[]
long i, c
integer li_curr_taborder, li_nearest_taborder=0
powerobject lpow_parent
//return the next dragobject (or previous if ab_forward = false; typically called with "NOT KeyDown(KeyShift!)" )
if isnull(ago_obj) or not isvalid(ago_obj) then return ldo_curr
if NOT isheritedfrom( "dragobject", ago_obj ) then return ldo_curr
ldo_curr = ago_obj
lpow_parent = ldo_curr.GetParent()
li_curr_taborder = ldo_curr.taborder
choose case typeof( lpow_parent )
  case tab!
    tab ltab_parent
    ltab_parent = lpow_parent
    lwo_controls[] = ltab_parent.control[]
  case userobject!
    userobject luo_parent
    luo_parent = lpow_parent
    lwo_controls[] = luo_parent.control[]
  case window!
    window lw_parent
    lw_parent = lpow_parent
    lwo_controls[] = lw_parent.control[]
//  case else
//    debug_message(classname(), "Unhandled datatype for " + lpow_parent.classname() )
end choose
c = upperbound(lwo_controls[])
if ab_forward then
  li_nearest_taborder = 32000
else
  li_nearest_taborder = 0
end if
for i = 1 to c
  if isHeritedFrom( "dragobject", lwo_controls[i]) = FALSE then continue
  ldo_childs = lwo_controls[i]
  if ldo_childs.taborder = 0 or ldo_childs.visible=false then continue
  //nécessite pbnicw voir prochainement sur http://sebastien.kirche.free.fr/powerbuilder
  //if CWGetField(ldo_childs,"enabled")=false then continue
  if ab_forward then
    if ldo_childs.taborder > li_curr_taborder and ldo_childs.taborder<li_nearest_taborder then
      li_nearest_taborder = ldo_childs.taborder
      ldo_curr = ldo_childs
    end if
  elseif ldo_childs.taborder < li_curr_taborder and ldo_childs.taborder> li_nearest_taborder then
      li_nearest_taborder = ldo_childs.taborder
      ldo_curr = ldo_childs
  end if
next
if ldo_curr = ago_obj or isnull(ldo_curr) or not isvalid(ldo_curr) then
  return GetNextDragObject( lpow_parent, ab_forward)
end if
(taborder="+string(li_curr_taborder)+")"+","+string(ab_forward)+")" , "found " + ldo_curr.classname( ) + " (taborder="+string(li_nearest_taborder)+")" )
return ldo_curr


Et ça marche en mettant l'appel sur l'event pbm_KeyUp de mon objet.

Dernière modification par xlat (27-05-2011 14:26:24)


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

www.ngs.ma

Hors ligne

 

#3 19-01-2015 13:05:35

_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] Singlelineedit kidnappe le focus

je viens de découvrir cette fonctionnalité
j'ai le même soucis que toi pour le hijack de la touche tab (pb 12.5.2)
mais j'ai un autre comportement bizarre
si je choisi un élement dans la liste d'autocomplétion PB me lance l'event qui est normalement déclenché par le touche Entrée (un commandbutton en default)
je me demandais si tu avais constaté le même comportement.

bon après je n'ai pas besoin de cette fonctionnalité j'ai déjà mes filepicker mais ça faisait joli, c'est dommage.

Hors ligne

 

#4 19-01-2015 13:20:45

seki  
0x73656B69
Award: bf
Lieu: Laquenexy & Luxembourg
Date d'inscription: 20-11-2008
Messages: 1118
Pépites: 4,296,080,204
Banque: 9,223,372,036,854,776,000
Site web

Re: [RESOLU] Singlelineedit kidnappe le focus

_francois_ a écrit:

je me demandais si tu avais constaté le même comportement.

oui, quand on choisit un item de completion, suivant la fenêtre, cela déclenche le traitement associé avec le bouton de validation est c'est bien casse nouilles
Il faudrait que je vérifie si ça le fait dans toutes les fenêtres.


The best programs are the ones written when the programmer is supposed to be working on something else. - Melinda Varian

Mes réponses PB sur StackOverflow
http://stackoverflow.com/users/flair/317266.png

Hors ligne

 

Pied de page des forums

Propulsé par FluxBB 1.2.22