Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.05.13;
Скачать: CL | DM;

Вниз

Управление выпадаюшим списком ComboBox-а   Найти похожие ветки 

 
alex-ran ©   (2002-04-26 17:47) [0]

Уважаемые Мастера Делфи. Обращаюсь к Вам как к последней инстанции :)) Проблема в принципе проста (наверное) но реализовать ее не могу. Необходимо чтобы 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 !!??

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


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

День добрый,

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

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

С уважением,


 
Vovchik ©   (2002-04-26 17:58) [2]

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

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

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



 
alex-ran ©   (2002-04-26 18:47) [3]

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

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

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

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


 
pj ©   (2002-04-26 21:04) [4]

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


 
Vovchik ©   (2002-04-26 22:26) [5]

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


 
Andrey007   (2002-04-27 09:13) [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


 
Lusha ©   (2002-04-27 10:32) [7]

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

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;


 
Lord Warlock ©   (2002-04-29 09:06) [8]

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


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

Пользуйся


 
alex-ran ©   (2002-04-29 11:38) [9]

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


 
Lusha ©   (2002-04-29 11:55) [10]

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

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


 
Lord Warlock ©   (2002-04-29 14:05) [11]

> Lusha ©

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



Страницы: 1 вся ветка

Текущий архив: 2002.05.13;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.008 c
1-39786
SB.John
2002-04-29 08:06
2002.05.13
Динамическое создание/удаление объектов в DLL. Проблемы.


1-39736
MaGG
2002-04-27 12:48
2002.05.13
Как в программе выполнить копирование файла?


1-39800
Samvel
2002-04-29 10:48
2002.05.13
Form


1-39723
f0rm
2002-04-27 12:33
2002.05.13
tstringlist in inifile


7-39868
Konsul
2002-02-15 12:31
2002.05.13
Пуск-Программы