2009-06-12 13 views
2

フォームにTComboBoxがあります。そのStyleプロパティはcsDropDownListに設定されています。ドロップダウンを開き、マウスまたはキーボードでオプションを選択してEnterキーを押すと、ドロップダウンボックスが閉じて、KeyPressイベントハンドラが起動する前にItemIndexプロパティが変更されます。 Tabキーを押した場合、KeyPressイベントハンドラが起動してフォーカスがコントロールから外れてItemIndexが更新されない限り、ドロップダウンは消えません。リストを開く前に選択されたものに戻ります。現在の位置を失うことなく、TABキーをTComboBoxで閉じるようにするにはどうすればよいですか?

ItemIndexをドロップダウンリストで現在選択されているものに更新したい場合、どのように実装すればよいですか?

+0

私は見つけるそれあなたがスティーブンはあなたの後ろに座っている、特に以来、として一般的に最も一般的な答えをスティーブンとフランソワとの質問をすることを面白いです。 –

+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

完全性のために、シフト&タブを使用して戻る場合は、シフトでssShiftを実行してから、(WM_NEXTDLGCTL、1,0)を実行します。(WM_NEXTDLGCTL、0,0)を実行します。 –

0

私はこれがデフォルトの動作だと考えています。これを変更するには、コントロール(またはクラスヘルパー)をサブクラス化し、キーストロークのウィンドウメッセージを傍受し、タブがコントロールに戻ります自分でタブを処理します。

0

KeyUpイベントの早い段階でTABをトラップするか、KeyDownの以前の段階でTABをトラップするようにしてください。

0

あなたは、インデックスの代わりにこれを使用して取得古典ComboBox-> ItemIndex

ComboBox->Items->IndexOf(ComboBox->Text) 
関連する問題