Как сделать так, чтобы клавиша TAB закрывала TComboBox без потери текущей позиции? - PullRequest
2 голосов
/ 13 июня 2009

У меня есть TComboBox на форме. Его свойство Style установлено в csDropDownList. Если я открываю раскрывающийся список и выбираю параметр с помощью мыши или клавиатуры и нажимаю клавишу ВВОД, раскрывающийся список закрывается и свойство ItemIndex изменяется до запуска обработчика события KeyPress. Если я нажму TAB, раскрывающийся список не исчезнет до тех пор, пока не сработает обработчик события KeyPress и фокус не сместится с элемента управления, а ItemIndex не обновится; он возвращается к тому, что было выбрано до того, как я открыл список.

Если я хочу, чтобы TAB обновил ItemIndex в соответствии с тем, что в данный момент выбрано в раскрывающемся списке, как мне это реализовать?

Ответы [ 4 ]

3 голосов
/ 23 октября 2009

Установите для свойства KeyPreview формы значение True.

В событии ComboBox 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 голосов
/ 24 июня 2014

Когда вы получаете свой индекс, используйте его вместо классического ComboBox-> ItemIndex

ComboBox->Items->IndexOf(ComboBox->Text)
0 голосов
/ 13 июня 2009

Вы должны попытаться перехватить TAB раньше в событии KeyUp или, возможно, даже раньше в KeyDown.

0 голосов
/ 13 июня 2009

Я полагаю, что это поведение по умолчанию, и чтобы изменить его, вам может понадобиться создать подкласс для элемента управления (или даже помощника по классу), перехватить сообщение Windows для нажатия клавиши, а затем, если его вкладка отправит возврат к элементу управления и возьмитесь за вкладку самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...