2009-06-12 6 views
2

폼에 TComboBox가 있습니다. Style 속성은 csDropDownList로 설정됩니다. 드롭 다운을 열고 내 마우스 또는 키보드로 옵션을 선택하고 Enter 키를 누르면 KeyPress 이벤트 처리기가 시작되기 전에 드롭 다운 상자가 닫히고 ItemIndex 속성이 변경됩니다. Tab 키를 누르면 KeyPress 이벤트 핸들러가 실행되고 포커스가 컨트롤에서 벗어나 ItemIndex가 업데이트되지 않을 때까지 드롭 다운이 사라지지 않습니다. 목록을 열기 전에 선택한 항목으로 되돌아갑니다.어떻게하면 현재 위치를 잃지 않고 TComboBox를 닫을 수 있습니까?

Tab 키를 사용하여 ItemIndex를 현재 드롭 다운 목록에서 선택된 항목으로 업데이트하려면 어떻게 구현합니까?

+0

I 찾으 당신이 스티븐 당신 뒤에 앉아, 특히 이후와 같이 일반적으로 가장 일반적인 답변을 스티븐 프랑소와와 질문을한다는 재미있는 . –

+1

키보드를 사용하여 콤보 상자에서 값을 선택하는 경우 키보드 만 사용하고 콤보 상자를 열지 마십시오. 위쪽 및 아래쪽 화살표를 누르면 선택한 항목 (및 ItemIndex 속성 값)을 직접 변경할 수 있으며 탭도 정상적으로 작동합니다. 동의합니다. 드롭 다운의 항목 목록에 대한 감독은 없지만 많은 항목이있는 경우 인터페이스 설계자는 콤보 상자가 작업에 적합한 컨트롤인지 궁금해해야합니다. –

+1

Stijn 및 skamradt와 동의하고 이러한 주석에 따라 공통 인터페이스 요소의 기본 동작을 변경하는 데 상당한주의를 기울여야합니다 (기본 동작이 명백하게 비표준 인 경우를 제외하고). – Argalatyr

답변

3

양식의 KeyPreview 속성을 True로 설정하십시오. 콤보에 onKeyDown 이벤트에

는 :

procedure TForm1.ComboBox1KeyDown(Sender: TObject; var Key: Word; 
    Shift: TShiftState); 
begin 
    if (Key = VK_TAB) then 
    begin 
    Key := VK_RETURN; 
    Perform(WM_NEXTDLGCTL,0,0); 
    end; 
end; 

이 리턴 키를 에뮬레이트하고 이동 다음 컨트롤로 초점을 맞 춥니 다.

+0

완전성을 위해 Shift와 Tab을 사용하여 뒤로 이동하려는 경우 : ssShift가 shift이면 Perform (WM_NEXTDLGCTL, 1,0) else Perform (WM_NEXTDLGCTL, 0,0); –

0

나는 이것이 기본 동작이라고 생각하고 그것을 변경하려면 컨트롤 (또는 클래스 도우미)을 서브 클래스 화해야하고 키 입력에 대한 윈도우 메시지를 차단 한 다음 탭이 컨트롤에 반환을 보내면 탭을 직접 처리하십시오.

0

KeyUp 이벤트에서 이전에 TAB을 잡아 두거나 KeyDown에서 이전에 Tab 키를 눌러야합니다.

0

당신이 당신의 인덱스가 대신 이것을 사용 검색 고전 ComboBox-> itemIndex라는

ComboBox->Items->IndexOf(ComboBox->Text) 
관련 문제