![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() На форме имеется 2 combobox(-а). При фокусировке на comobox(-е) должен автоматически раскрываться список. Как сделать переход к следующему элементу по нажатию клавиши Tab, если combobox раскрыт.
Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) ComboBox1: TComboBox; ComboBox2: TComboBox; procedure OnEnterCombobox1(Sender: TObject); procedure OnEnterCombobox2(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.OnEnterCombobox1(Sender: TObject); begin combobox1.DroppedDown:=true; end; procedure TForm1.OnEnterCombobox2(Sender: TObject); begin combobox2.DroppedDown:=true; end; end. |
#2
|
||||
|
||||
![]() Ну так и пиши
Код:
combobox1.DroppedDown:=False; Код:
PostMessage(ComboBox1.Handle, WM_COMMAND, CBN_CLOSEUP, ComboBox1.Handle); Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#3
|
|||
|
|||
![]() Если сделать проверку на нажатие клавиши Tab, то все равно сначала выполняется стандартное действие - переход к следующему элементу, а с раскрытым combobox(-ом) это не возможно и только после этого он выполняет действие которое мы задаем. Т.е. в результате просто закрывается combobox без перехода к следующему элементу, со звуком ошибки.
Код:
procedure TForm1.OnKeyDownCombobox1(Sender: TObject; var Key: Word; Shift: TShiftState); begin if ( key = VK_TAB ) then begin combobox1.DroppedDown:=False; end; end; |
#4
|
||||
|
||||
![]() Ты не там ловишь, нужно в оконной процедуре формы. И ловить нужно не Tab, а WM_NEXTDLGCTL.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#5
|
||||
|
||||
![]() Данный код работает, только пиканье остаётся:
Код:
procedure TForm2.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if (Key = VK_TAB) and ComboBox1.DroppedDown then begin Key := 0; ComboBox1.DroppedDown := False; Perform(WM_NEXTDLGCTL, 0, 0); end; end; Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#6
|
|||
|
|||
![]() Все, нашел как убрать пиканье, нужно добавить процедуру
Код:
procedure TForm1.OnKeyPressCombobox1(Sender: TObject; var Key: Char); begin if ((UpCase(Key) < 'A') or (UpCase(Key) > 'Z')) then Key := #0; end; |