![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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); |
|
#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.
|
|
#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; |
|
#6
|
|||
|
|||
|
Все, нашел как убрать пиканье, нужно добавить процедуру
Код:
procedure TForm1.OnKeyPressCombobox1(Sender: TObject; var Key: Char); begin if ((UpCase(Key) < 'A') or (UpCase(Key) > 'Z')) then Key := #0; end; |