Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Управление выпадаюшим списком ComboBox-а [D5]


alex-ran ©   (2002-04-26 17:47:00) 

Уважаемые Мастера Делфи. Обращаюсь к Вам как к последней инстанции :)) Проблема в принципе проста (наверное) но реализовать ее не могу. Необходимо чтобы ComboBox по нажатию Enter разворачивался и далее после выбора необходимого элемента сворачивался. Если Stile ComboBox-а установлен в csDropDown то никаких проблем. Но если csDropDownList то развернуть получается, а свернуть - ну никак. Вместо этого происходит передвижение выбранного элемента вверх или вниз выпавшего списка.
Реализую все это так:


procedure TForm1.ComboBox1KeyPress(Sender: TObject; var Key: Char);
begin
if Key=#13 and (Sender as TComboBox).DroppedDown=False Then
begin
Key:=0;
(Sender as TComboBox).DroppedDown:=True;
Exit
end;
if Key=#13 and (Sender as TComboBox).DroppedDown=True Then
begin
Key:=0;
(Sender as TComboBox).DroppedDown:=False;
end;
end;


Что я не так делаю? И еще, я почему то при выпавшем списке считываю (Sender as TComboBox).DroppedDown и получаю False !!??

С уважением, Александр.


Lord Warlock   (2002-04-29 14:05:00) [1]

> Lusha ©

Совершенно верно!


Lusha   (2002-04-29 11:55:00) [2]

Я так понял у меня не полдучалось из-за того что я его отслеживал в KeyPress.

Вы поняли неправильно... Дело не в обработчике, а в том что клавиша VK_RETURN явным образом обрабатывется в процедуре WndProc еще до вызова какого либо обработчика...


alex-ran   (2002-04-29 11:38:00) [3]

Огромное всем спасибо. Заработало!!!
Lord Warlock - Заработало!!!
В заключение - не могли бы Вы объяснить почему состояние DroppedDown необходимо отслеживать именно в KeyDown?
Я так понял у меня не полдучалось из-за того что я его отслеживал в KeyPress.
С уважением, Александр.


Lord Warlock   (2002-04-29 09:06:00) [4]

Если не еще не сделал, слухай сюды:


procedure TForm1.ComboBox1KeyPress(Sender: TObject; var Key: Char);
begin
if Key=#13 then
ComboBox1.DroppedDown:=not IsOpen;
Key:=#0;
end;


и


procedure TForm1.ComboBox1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
IsOpen:=ComboBox1.DroppedDown;
end;


Здесь IsOpen - Приватная в классе формы или глобальная, как хочешь, начальное значение - FALSE

Пользуйся


Lusha   (2002-04-27 10:32:00) [5]

Изврат, конечно, но работать будет... :)

procedure TForm1.ComboBox1KeyPress(Sender: TObject; var Key: Char);
begin
if Key = #13 then
begin
TComboBox(Sender).Tag := TComboBox(Sender).Tag xor 1;
if not boolean(TComboBox(Sender).Tag) then
TComboBox(Sender).DroppedDown := not TComboBox(Sender).DroppedDown;
Key := #0;
end;
end;


Andrey007   (2002-04-27 09:13:00) [6]

По-моему надо так:

procedure TForm1.ComboBox1KeyPress(Sender: TObject; var Key: Char);
begin
if Key=#13 and (Sender as TComboBox).DroppedDown=False Then
begin
Key:=0;
(Sender as TComboBox).DroppedDown:=True
end
else if Key=#13 and (Sender as TComboBox).DroppedDown Then
begin
Key:=0;
(Sender as TComboBox).DroppedDown:=False
end
end;

А вообще-то, сам я делаю так:
procedure TForm1.ComboBox1KeyPress(Sender: TObject; var Key: Char);
begin
(Sender as TComboBox).DroppedDown:=(key<>#27) and (key<>#13)
end


Vovchik   (2002-04-26 22:26:00) [7]

> alex-ran
Ты же сказал, что csDroppedDown работает. Вот и юзай его. А почему он работает так как у тебя - это надо конкретно смотреть. Пришли свой исходник, посмотрю.


pj   (2002-04-26 21:04:00) [8]

все ясно с ним при Key = 13 у тебя в обработчик приходит
DroppedDown = False и поэтому при любом нажатии на Enter
он закрывается и опять открывается...
Вот и не закрыть тебе его...


alex-ran   (2002-04-26 18:47:00) [9]

Спасибо за проявленное участие, но:

для Vovchik - в том то и дело что необходим стиль именно csDroppedDown, дабы оградить юзера от неправильного ввода. А писать процедуру на проверку введенного значения по моему нецелесообразно, раз есть такое свойство которое не допускает произвольный ввод, это все изврат.
Я поставленную проблему мог бы решить по другому, но хотелось бы разобраться в поведении компонента поглубже.

для Игорь Шевченко:
я понимаю что Вам не до меня, но Вы попробуйте - увидите что получится :) А то что по Энтеру он сворачивается - я понял, но к сожалению второе условие моей программы вообще никогда не реализуется из-за того что DroppedDown=False даже при развернутом списке. Почему? Не знаю. Потому и спрашиваю.

С уважением, Александр


Vovchik   (2002-04-26 17:58:00) [10]

> И еще, я почему то при выпавшем списке считываю (Sender as
> TComboBox).DroppedDown и получаю False !!??

Скорее всего, событие в котором ты проверяешь это свойство вызывается до разворачивания списка.

А чем не нравится csDropDown, если с ним всё работает?


Игорь Шевченко   (2002-04-26 17:52:00) [11]

День добрый,

Я бы рекомендовал обрабатывать событие OnKeyDown.

А по Enter ComboBox вообще-то сам сворачивается :-)))

С уважением,


Наверх

Титульная страница Поиск, карта сайта Написать письмо