2016-10-11 6 views
3

У нас есть определенная форма поиска на работе, которая была обновлена ​​в последнее время. Его функциональность - это стандартная форма поиска: введите несколько критериев в некоторые поля вверху, нажмите кнопку «Поиск» и отобразите результаты в сетке ниже. Но он был уродливым и очень ограниченным по функциональности, поэтому один из моих коллег перестроил его ... прямо перед отъездом на новую работу. Теперь я пытаюсь выполнить последние несколько деталей.Как сделать нажатие клавиши TVirtualStringTree с более высоким приоритетом?

Одним из изменений стала замена старой сетки TListBox гораздо более мощным TVirtualStringTree. Но в этом процессе, похоже, что-то сломалось: раньше, если вы щелкнули по строке в сетке (указав сетку в фокусе фокуса) и нажав Введите, соответствующий обработчик событий будет запускать и обрабатывать ваш ввод, открытие подробное представление выбранного элемента. В этой сетке, однако, нажатие Введите вызывает TButton на форме с Default = true собственности, чтобы запустить его OnClick вместо.

Как я могу сделать TVirtualStringTree иметь преимущество, когда он имеет фокус ввода, так что он будет реагировать на то, что пользователь будет нажимать клавишу Enter перед (и предпочтительно вместо), отправляя ее в форму?

ответ

5

Обращайтесь с сообщением WM_GETDLGCODE и включите DLGC_WANTALLKEYS в возвращаемое значение. Например:

procedure WMGetDlgCode(var Message: TWMGetDlgCode); message WM_GETDLGCODE; 

.... 

procedure TMyControl.WMGetDlgCode(var Message: TWMGetDlgCode); 
begin 
    inherited; 
    Message.Result := DLGC_WANTALLKEYS; 
end; 

В зависимости от того, или нет уже обрабатывает элемент управления это сообщение и возвращает нечто иное, чем 0 вам, возможно, придется использовать:

Message.Result := Message.Result or DLGC_WANTALLKEYS; 

Если вы не хотите, чтобы изменить код для этого класса, затем используйте интерполятор или установите свойство WindowProc элемента управления для перехвата его оконной процедуры.

+0

Хм ... это, вероятно, будет работать, но есть ли решение, которое не требует изменения кода стороннего компонента? –

+0

Добро пожаловать. Вам не нужно изменять код. Вы можете использовать посредник, или вы можете перехватить оконную процедуру, присвоив свойству «WindowProc» элемента управления. Если вы не обрабатываете 'WM_GETDLGCODE', тогда кнопка по умолчанию получит сообщение. Который вы не хотите. –

+1

Ничего себе. На самом деле я не знал, что свойство «WindowProc» - вещь. Это оказалось именно тем, что мне нужно было исправить. Благодаря! –