Проблема # 1 - Необходимость двойного нажатия клавиши Tab.
Действительно, компонент, используемый для имплантации существует сам по себе, а не является частью табличной сетки. В случае, когда DBGrid имеет фокус, то для перемещения на следующую ячейку необходимо двукратное нажатие клавиши Tab. Первое нажатие клавиши перемещает фокус из имплантированного компонента на текущую ячейку, находящуюся под этим компонентом, и только второе нажатие клавиши Tab перемещает нас в следующую ячейку. Попробуем это исправить.
Для начала в форме, содержащей табличную сетку, опишем логическую переменную WasInFloater следующим образом:
type TForm1 = class(TForm) ... ... private { Private declarations } WasInFloater : Boolean; ... ... end; |
Затем для компонента LookupCombo напишем обработчик события onEnter, где присвоим переменной WasInFloater значение True. Это позволит нам понять где в данный момент находится фокус.
procedure TForm1.DBLookupCombo1Enter(Sender: TObject); begin WasInFloater := True; end; |
И, наконец, создаем хитрый обработчик события onKeyUp, позволяющий исправить досадный недостаток.
procedure TForm1.DBGrid1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin if (Key in [VK_TAB]) and WasInFloater then begin SendMessage(DBGrid1.Handle, WM_KeyDown, Key, 0); WasInFloater := False; end; end; |
Данный код реагирует на нажатие клавиши и позволяет в случае, когда фокус передался из имплантированного элемента управления табличной сетеке, вторично эмулировать нажатие клавиши Tab (передается код нажатой клавиши, т.е. Tab). Это работает как для отдельной клавиши Tab, так и для комбинации Shift-Tab.