Компоненты Delphi страницы Standart

Компонент Delphi ComboBox




Уроки Delphi
  1.  Первая программа
  2.  Использование компонентов
  3.  События Delphi
  4.  Типы данных Delphi
  5.  Создание своих типов данных
  6.  Выражения и операторы
  7.  Работа с файлами в Delphi
  8.  Дополнительные формы
  9.  Подпрограммы в Delphi
  10. Исключительные ситуации
  11. Взаимодействие приложения с пользователем
  12. Указатели в Delphi
  13. Обзор компонентов
  14. Работа со строками
  15. Создание интерфейса
  16. Графика в Delphi
  17. Многопоточность в Delphi
  18. Динамическое создание
        компонентов
Поиск по сайту




 Это важно:
   Метод Application.ProcessMessages;

 Это полезно:
   Параметр Sender в обработчиках событий;










Бояться не надо



   Компонент Delphi ComboBox представляет собой комбинацию списка строк ListBox со строкой ввода Edit. При этом "список строк" компонента Delphi ComboBox вначале скрыт, и раскрывается при щелчке мышкой по треугольничку раскрытия, который находится справа в строке ввода:



   Таким образом, с помощью Delphi ComboBox место на Форме экономится для расмещения других элементов интерфейса программы. А при необходимости раскрытие списка строк можно вообще запретить.

   Многие свойства и возможности компонента Delphi ComboBox по работе со строками (объектами Items) такие же как и у компонента Delphi ListBox, поэтому повторно описывать их не буду. Опишу отличия и дополнительные возможности.

   Итак, за возможность раскрытия компонента ComboBox отвечает стиль - свойство Style:

Стиль компонента ComboBox1 равен
  ComboBox1.Style = csDropDown
(список может быть раскрыт, можно писать в строке ввода)

Стиль компонента ComboBox2 равен
  ComboBox1.Style = csSimple
(список не может быть раскрыт, можно писать в строке ввода)

При стиле csDropDownList компонент может быть раскрыт, но свойство Text может принимать значения только одной из строк, сохранённых в компоненте, то есть пользователь лишён возможности писать в строке ввода.

   Количество строк, видимых при раскрытии списка, равно DropDownCount. Если реальное количество сохранённых строк больше этого количества, то автоматически появляется полоса прокрутки. Программист может заставить список раскрыться в нужный момент. Для этого нужно свойству DroppedDown присвоить значение True. Для этой же цели пользователь может использовать клавиатурную комбинацию ALT+ВНИЗ.

   Максимально допустимое количество символов в текстовой строке задаётся параметром MaxLength, причём значение 0 означает отсутствие ограничений. Свойство CharCase управляет преобразованием вводимого текста к верхнему (значение CharCase = ecUpperCase) или нижнему (значение CharCase = ecLowerCase) регистру. Значение ecNormal означает, что текст вводится без преобразования.

   Основными событиями компонента Delphi ComboBox являются:

Событие Условие генерации
OnChange Изменился текст в строке ввода.
OnDropDown Список раскрывается. Это событие нужно обработать, если содержимое списка может изменяться во время работы программы. Тогда в обработчике этого события можно заново сформировать содержимое списка.


Обзор компонентов Delphi           В начало урока          Компонент Delphi ScrollBar

Уроки Delphi начинающим



Вопросы и комментарии (33)      Решение задач в Delphi

Илья, добавлено 26.12.11, 19:51:17 
как при создание ComboBox на программном уровне записать данные в этот список? (стиль csDropDownList), кликаю по нему а он не открывается... (не скомпилировал)
Автор, добавлено 27.12.11, 11:52:08 
Прочитайте про ListBox, свойства записи в них аналогичны. Ну кому я ссылку давал вверху?
Илья, добавлено 28.12.11, 10:54:10 
большое спасибо, нашел все, возник еще вопрос: как считать данные из ComboBox? то есть допусти в комбобоксе записаны числа, юзер выбрал 2, мне надо 1. считать из комбобокс то что выбрал юзер, 2. записать в x, предварительно превратив тип числа в (к примеру) integer
Автор, добавлено 28.12.11, 14:55:43 
То что выбрал пользователь выделяется цветом, и имеет номер ComboBox.ItemIndex. Содержимое этой строки:

ComboBox.Items[ComboBox.ItemIndex];

Это значение типа String. Его можно записать в переменную того же типа

var S: String;

S:=ComboBox.Items[ComboBox.ItemIndex];

Затем его можно преобразовать в Integer:

var N: Integer;

N:=StrToInt(S);

или сразу:

N:=StrToInt(ComboBox.Items[ComboBox.ItemIndex]);

А чтобы два раза не писать ComboBox пользуемся оператором присоединения with, в зоне действия которого имя компонента можно не указывать, а сразу свойство:

with ComboBox do
 begin //Между begin и end ComboBox можно не писать. Но если оператор там всего один, то begin/end необязательны.
  N:=StrToInt(Items[ItemIndex]);
 end;

Михаил, добавлено 28.07.12, 12:46:38 
Здравствуйте, можете подсказать решение проблемы с dbcombobox( пишу суда, т.к. это самый близкий раздел к теме вопроса).
У меня есть табличная база данных с 2мя разделами: name и prise. dbcombobox заполнен значениями name. Так же на форме есть и dbedit в котором должны высвечиваться значения prise. При запуске программы в dbcombobox высвечивается последнее значение базы данных, в dbedit высвечивается соответствующее значение prise, но при выборе другого значения в dbcombobox значение dbedit не менятся. можно ли как-то это исправить?
Автор, добавлено 28.07.12, 13:26:37 
Терпеть ненавижу БД. Долго пытался забыть как с ними работать. Наконец, получилось. И вспоминать не хочу. Хотя когда-нибудь и придётся. Но не сейчас...
Аноним, добавлено 20.10.12, 20:44:33 
1
Артем, добавлено 5.06.13, 07:01:03 
что означает s[i]
Автор, добавлено 5.06.13, 07:27:12 
Если S это переменная типа String, то S[i] означает символ, стоящий на i-м месте в переменной S. Отсчитывается от 1 (не от нуля).
Артём, добавлено 5.07.13, 19:33:40 
Здравствуйте, у меня вопрос,подскажите пожалуйста, как мне объединить combobox.text и combobox.items.text , есть FPath который добавляет пути файлов в combobox.items.append(FPath) и есть combobox.text:= FPath. Мне надо, чтобы при выделении текстового поля и его удаления combobox.text:= FPath , автоматически удалялась строка ComboBox1.Items.Delete(ComboBox1.ItemIndex).
Евгений, добавлено 25.09.13, 17:32:07 
Здравствуйте подскажите пожалуйста я хочу чтобы по выбору индекса в ComboBox'е
показывались или скрывались мемо, но они только скрываются вот код
 begin
  If ComboBox1.ItemIndex = 0 Then
  begin
  Label11.Visible:=True;
  Memo3.Visible:=True;
  end
  else
  begin
  Label11.Visible:=False;
  Memo3.Visible:=False;
  end;
 end;
 begin
  If ComboBox1.ItemIndex = 1 Then
  begin
  Label11.Visible:=True;
  Memo3.Visible:=True;
  end
  else
  begin
  Label11.Visible:=False;
  Memo3.Visible:=False;
  end;
 end;
Евгений, добавлено 25.09.13, 17:36:12 
В первой процедуре
 If ComboBox1.ItemIndex = 0 Then
  begin
  Label9.Visible:=True;
  Memo1.Visible:=True;
  end
  else
  begin
  Label9.Visible:=False;
  Memo1.Visible:=False;
  end;
 end;
Евгений, добавлено 25.09.13, 18:03:44 
Да только если я добавляю и на другие индексы такой код и мемо не 1, а 2 или 3, то тогда при выборе 1-го индекса мено1 скрывается и прочие тоже
У меня 9 индексов код длинный и поэтому я не стал писать его весь.
ставлю на событие OnChange в ComboBox'е
Автор, добавлено 25.09.13, 18:03:56 
Зря не указали в каком событии выполняете данную процедуру. У меня в OnCloseUp всё работает правильно.
Автор, добавлено 25.09.13, 18:07:38 
Ну вот, теперь всё понятно. В OnChange неправильно работает, так как в этом событии значение ItemIndex не тот, который сейчас выбрали, а предыдущий.
Евгений, добавлено 25.09.13, 18:10:49 
Но перед 0 ничего нет! как тогда написать?
Автор, добавлено 25.09.13, 18:18:20

procedure TForm1.ComboBox1CloseUp(Sender: TObject);
begin
If ComboBox1.ItemIndex = 0 Then
  begin
  Memo1.Visible:=True;
  end
  else
  begin
  Memo1.Visible:=False;
  end;
end;


А если вас беспокоит, что ItemIndex в первый момент не определён, присвойте ему нужное значение, в OnCreate.
Евгений, добавлено 25.09.13, 18:30:29 
А потом начинать сразу с If ComboBox1.ItemIndex = 2?
Автор, добавлено 25.09.13, 18:32:15 
Ну да. Событие OnCloseUp Вернёт правильное значение ItemIndex.
Евгений, добавлено 25.09.13, 20:04:29 
Пришлось для каждого индекса своё мемо ставить и на OnChange так всё работает по другому не получилось! спасибо за помощь.
Евгений, добавлено 30.11.13, 18:54:46 
Здравствуйте. Подскажите пожалуйста как скрыть в ComboBoxe некоторое количество элементов например если в ComboBox1 выбран элемент 0 тогда в ComboBox2 показывать элементы с 0 10, а если в ComboBox1 выбран элемент 1 тогда в ComboBox2 показывать элементы с 11 20, а если нет выбранных в ComboBox1 тогда скрыть всё.
Автор, добавлено 30.11.13, 19:23:04 
Нужно не скрывать, а добавлять в пустой combobox те элементы, которые нужно показать. Делается это по событию OnChange первого бокса. Вначале очищаем второй бокс, а затем добавляем только то что нужно.
Евгений, добавлено 30.11.13, 19:30:43 
А скрыть можно?
Автор, добавлено 30.11.13, 20:58:57 
Нельзя.
Евгений Александрович, добавлено 22.01.14, 11:16:16 
Здравствуйте. На форме ComboBox1 со строками:
1
2
3
и ComboBox2 со строками:
3
1
1

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
ComboBox2.ItemIndex:=ComboBox1.ItemIndex;
end;

При выборе из ComboBox1 3-го значения, в ComboBox2 выбирается 2-е. Почему не работает? Причём, если б в ComboBox2 2-е и 3-е значения были бы разные, то работало бы...
Автор, добавлено 22.01.14, 12:35:01 
У меня работает. Именно с вашими строчками. Может, вы не учитываете, что Index отсчитывается от 0? Поэтому, выбирая вторую строку, ItemIndex равен 1.
Евгений Александрович, добавлено 22.01.14, 14:44:40 
Нет, учитываю. Но при выборе 3-ей строки ComboBox1 (ItemIndex=4), в ComboBox2 тоже ведь должна выбраться строка №3? Ан нет, выбирается вторая. Если добавить ещё подобных строк, то можно заметить, что в ComboBox2 будет выбираться первая сверху строка, значение которой равно значению, той строки, которая должна быть выбрана. Допустим, если в моём примере добавить ещё n строк в ComboBox1 и столько же единичек в ComboBox2, будет всё равно выбираться строка №2, потому что в ней единица встречается первый раз... Delphi у меня седьмая
Автор, добавлено 22.01.14, 14:51:53 
При выборе 3-й строки ItemIndex=2 а не 4. Сами вот убедитесь:

ComboBox2.ItemIndex:=ComboBox1.ItemIndex;
Caption:=IntToStr(ComboBox2.ItemIndex);

Евгений Александрович, добавлено 22.01.14, 15:10:03 
Ой. Да ItemIndex=2. А про всё остальное? Почему строка ComboBox1 не равна строке ComboBox2?
Автор, добавлено 22.01.14, 15:19:42 
Да почему не равны??? Равны. Ну сравните ItemIndex'ы. Вы щёлкаете по последней (3-й) строке, в заголовке высвечивается 2, в тексте 2-го бокса - 1. 1 - это же содержимое 3-й (последней) строки 2-го бокса, или нет?
Евгений Александрович, добавлено 22.01.14, 16:25:00 
Да. Но это также содержимое и 2-й строки и когда я открываю список 2-го бокса, видно, что выделена именно 2-я строка, а не 3-я.
Автор, добавлено 22.01.14, 17:11:28 
Я понял. Вы говорите о выделении цветом, а не об изменении ItemIndex. ItemIndex'ы совпадают, а вот почему цветом выделяется другая строка... Возможно, таков алгоритм выделения цветом строки - находит первую строку, где значение совпадает с искомым, и выделяет её. Я пробовал и на 4 строках, похоже так.
Автор, добавлено 22.01.14, 17:15:32 
Если взять 4 строки

4
1
3
1

и поставить кнопку и написать

ComboBox2.ItemIndex:=3;//последняя строка
 
то цветом будет выделена 2 строка - там значение совпадает с 4 строкой.
Оставить комментарий:

Имя  

Текст комментария