:: Архив конференции по VFP до 2005 года
combobox и клавиатура ?
doktor
Автор

Сообщений: 269
Дата регистрации: 03.09.2002
У меня combobox встроен в грид, свойство Style=2. При хождении по гриду с помощью стрелок клавиатуры после попадания на combobox вместо перемещения вниз-вверх по таблице получается выбор елемента из списка. Как сделать чтоб такого не было?
Ratings: 0 negative/0 positive
RE: combobox и клавиатура ?
po2

Сообщений: 2864
Откуда: Иркутск
Дата регистрации: 22.12.2001
Стандартными средствами - никак. Нужно учить ComboBox, определять свое состояние "открыт-закрыт". Для того, чтобы самому определить его реакцию на нажатие навигационных клавиш.
Известный способ - выставлять флажок "открыт" в событии ComboBox.DropDown и сбрасывать его в событии InterActiveChange. Недостаток - такой метод обрабатывает не все комбинации способов раскрытия-закрытия списка.
Более сложный метод основан на идее контролировать наличие выпадающей части списка средствами API.
Объявляем нужные функции:
declare long GetWindowLong in win32api integer,integer
declare integer WindowFromPoint in win32api integer,integer
Создаем дополнительный метод ObjToDeskTop, здесь метод формы:
lPar nPosition,oObject
priv nTop,nLeft,nRight,nBottom
nTop = ObjToClient(This,1) + ObjToClient(oObject,1)
nLeft = ObjToClient(This,2) + ObjToClient(oObject,2)
nRight = nLeft+ ObjToClient(oObject,3)
nBottom = nTop+ ObjToClient(oObject,4) +;
iif(This.TitleBar=1 ,;
iif(This.HalfHeightCaption,;
SysMetric(34) ,;
SysMetric(9)) ,;
0) +;
iif(This.BorderStyle=3 ,;
SysMetric(4) ,;
iif(This.BorderStyle=0 ,;
0 ,;
SysMetric(11)))
retu iif(nPosition=1,;
nTop ,;
iif(nPosition=2,;
nLeft ,;
iif(nPosition=3,;
nRight ,;
nBottom)))
Меняем код события KeyPress ComboBox'а:
lPar nKeyCode,nShiftAltCtrl
priv nTop,nLeft,nBottom
nTop = ThisForm.ObjToDeskTop(1,This)
nLeft = ThisForm.ObjToDeskTop(2,This)
nBottom = ThisForm.ObjToDeskTop(4,This)
with ThisForm
if inli(nKeyCode, 1, 5, 6,24).and.;
nShiftAltCtrl=0 .or.;
inli(nKeyCode,49,50,55,56).and.;
nShiftAltCtrl=1
if bitt(GetWindowLong(WindowFromPoint(nLeft+5,nBottom+5),-16),31).or.;
bitt(GetWindowLong(WindowFromPoint(nLeft+5,nTop -5),-16),31)
wait wind nowa 'Раскрыт...'
else
NoDe
wait wind nowa 'Закрыт...'
endi
endi
endw
Остается вписать сразу за командой NoDefault свою реакцию на клавиши навигации, например, с использованием SKIP [n].
Ratings: 0 negative/0 positive


Извините, но у вас нет прав для того, чтобы оставлять сообщения в этом форуме.

On-line: 3 (Гостей: 3)

© 2000-2024 Fox Club 
Яндекс.Метрика