Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
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)
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)
Hors ligne
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:
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)
Hors ligne
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
_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.
Hors ligne