Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.05.13;
Скачать: [xml.tar.bz2];

Вниз

Управление выпадаюшим списком 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.004 c
1-39759
PaRL
2002-04-27 20:00
2002.05.13
Chart


6-39820
Piriken
2002-02-22 18:14
2002.05.13
Правка HTML-документа


14-39847
aaaaa
2002-04-04 14:49
2002.05.13
База данных


3-39676
борисыч
2002-04-18 07:50
2002.05.13
Есть подозрение, что многопоточность BDE, IBX - миф.


14-39838
Condor
2002-04-04 10:46
2002.05.13
Copy DB





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский