combobox и клавиатура ? | |
---|---|
doktor Автор Сообщений: 269 Дата регистрации: 03.09.2002 |
У меня combobox встроен в грид, свойство Style=2. При хождении по гриду с помощью стрелок клавиатуры после попадания на combobox вместо перемещения вниз-вверх по таблице получается выбор елемента из списка. Как сделать чтоб такого не было?
|
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]. |
© 2000-2024 Fox Club  |