Delphi XE에서는 Firefox의 "검색 할 때 검색"과 비슷한 "즉시 검색"기능을 구현하려고하지만 비슷한 기능으로 더 잘 설명됩니다. 오픈 소스 클립 보드 익스텐더, Ditto :하나의 Windows 컨트롤에서 다른 키보드 컨트롤로 키보드 이벤트 전달
일반적인 네비게이션 이벤트를 처리 항목의 목록이 있습니다. 그러나 탐색 및 편집 명령 (오른쪽/왼쪽 화살표, Shift + 화살표, 백 스페이스, 삭제 등)뿐만 아니라 영숫자 키는 목록 아래의 편집 상자로 경로가 변경되어야합니다. 입력란의 OnChange 이벤트는 목록 새로 고침을 트리거합니다.
UI의 요점은 사용자가 컨트롤 사이에서 탭이나 Shift-Tab을 사용할 필요가 없다는 것입니다. 두 개의 컨트롤 (목록 및 편집 상자)은 하나의 컨트롤 인 것처럼 '느낌'을 가져야합니다. 검색 UI의 동작은 어떤 컨트롤에 포커스가 있는지에 따라 이 아니야
내 최고의 옵션 인 것 같습니다. 편집 상자에 (내가 TcxTreeList을 사용하고 있습니다), 그리고 목록에 편집 상자에서 탐색 키의 소수를 전달리스트 컨트롤에서 앞으로 특정 키보드 이벤트이다. 어떻게 그것을 달성 할 수 있는가?
을 메모 :
TcxTreeList는 점진적 검색을 지원하지만 이것이 내가 원하는 것입니다. 검색은 SQLite 데이터베이스로 이동하여 하위 문자열 일치를 찾습니다. 목록에는 db에서 일치하는 항목 만 표시됩니다.
일부 중복이 있습니다. 두 컨트롤 모두 VK_HOME과 VK_END를 처리하지만 괜찮습니다.이 경우 키는 목록으로 이동합니다. 각 개별 키 누르기를 전달할지 또는 수신 한 컨트롤에서 처리할지 결정해야합니다. 편집에
:
type
THackEdit = class(TEdit);
procedure TMainForm.cxTreeList1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
THackEdit(edit1).KeyDown(Key, Shift);
end;
불행하게도,이 효과가 없습니다 : 한 가지 확실한 방법은과 같이, 편집 컨트롤의 각에서 KeyDown,의 keyup 키 누르기 메소드를 호출 할 듯 . TEdit은 포커스가 맞지 않는 한 주요 이벤트를 처리하지 않습니다. SendMessage (THackEdit (edit1) .Handle, WM_KEYDOWN, Key, 0)를 사용하면 효과가 없습니다.
이상하지만 TEdit의 Perform 메서드를 사용하면 아무 효과가 없습니다. 즉, 내 OP의 SendMessage 예제와 같습니다. 백 스페이스 키 (편집 컨트롤에 텍스트와 캐럿 위치가> 0 인 곳)를 보내는 것과 같은 간단한 작업도 수행합니다. edit1.Perform (WM_KEYDOWN, 8, 0); –
@mood - 백 스페이스를 위해'edit1.Perform (WM_CHAR, VK_BACK, 0);을 시도하십시오. 그래서 WM_CHAR, WM_KEYDOWN, WM_KEYUP 메시지를 샘플 프로젝트에 포함 시켰습니다. –