W Delphi XE, próbuję zaimplementować funkcję "natychmiastowego wyszukiwania" - taką, która przypomina nieco "wyszukiwanie w trakcie pisania" przez Firefoksa, ale jest lepiej ilustrowana podobną open source schowek Extender Ditto:Przekazywanie zdarzeń klawiatury z jednego kontrolki Windows do innego
jest to lista elementów, który obsługuje typowe zdarzenia nawigacji. Jednak dowolne klawisze alfanumeryczne, a także polecenia nawigacji i edycji (strzałki w prawo/lewo, shift + strzałki, backspace, usuwanie itp.) Powinny zostać przekierowane do pola edycji pod listą. Zdarzenie OnChange w polu edycyjnym spowoduje odświeżenie listy.
Punkt interfejsu użytkownika polega na tym, że użytkownik nie musi przechodzić między kartami ani tabulatorem zmian między elementami sterującymi. Te dwie kontrolki (lista i pole edycji) powinny "czuć" się tak, jakby były pojedynczą formantem.Otrzymanie interfejsu wyszukiwania powinno być zależne od tego, która kontrola ma fokus.
Wydaje mi się, że jest to najlepsza opcja jest naprzód pewnych zdarzeń klawiaturowych z kontrolą listy (używam TcxTreeList) do pola edycji i przekazać garść klawiszy nawigacyjnych z pola edycji do listy. w jaki sposób można to osiągnąć?
Notatki:
TcxTreeList obsługuje oczywiście wyszukiwanie przyrostowe, ale nie o to mi chodzi. Wyszukiwanie przechodzi do bazy danych SQLite i wyszukuje dopasowania podłańcuchowe. Lista wyświetla tylko pasujące elementy z bazy danych.
Występuje pewne pokrywanie się, np. obie kontrolki normalnie obsłużyłyby VK_HOME i VK_END, ale to jest w porządku - w tym przypadku klucze trafiłyby na listę. Muszę zdecydować, czy przekazać każde pojedyncze naciśnięcie klawisza, czy też obsłużyć je w sterowaniu, które je otrzymało.
Na EDIT: Jednym z oczywistych sposobów wydawało się powołać odpowiednie metody KeyDown, keyUp i naciśnięciu klawisza z kontrolą edycji, tak jak poniżej:
type
THackEdit = class(TEdit);
procedure TMainForm.cxTreeList1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
THackEdit(edit1).KeyDown(Key, Shift);
end;
Niestety, nie ma to wpływu . Zgaduję, że TEdit nie przetworzy kluczowych zdarzeń, chyba że jest skoncentrowany. Używanie SendMessage (THackEdit (edit1) .Handle, WM_KEYDOWN, Key, 0) również nie ma żadnego efektu.
Dziwne, ale użycie metody Perform modułu TEdit nadal nie ma żadnego efektu - tak jak przykład SendMessage w moim OP. Nawet próba czegoś prostego, jak zawsze wysyłanie klawisza backspace (gdzie kontrola edycji ma tekst i pozycja karetki jest> 0) nic nie robi: edit1.Perform (WM_KEYDOWN, 8, 0); –
@mood - Wypróbuj 'edit1.Perform (WM_CHAR, VK_BACK, 0);' dla backspace. Dlatego dołączono komunikaty WM_CHAR, WM_KEYDOWN, WM_KEYUP do przykładowego projektu. –