Компонент 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, причём значение означает отсутствие ограничений. Свойство CharCase управляет преобразованием вводимого текста к верхнему (значение ) или нижнему (значение ) регистру. Значение ecNormal означает, что текст вводится без преобразования.
Основными событиями компонента Delphi ComboBox являются:
Событие | Условие генерации |
OnChange | Изменился текст в строке ввода. |
OnDropDown | Список раскрывается. Это событие нужно обработать, если содержимое списка может изменяться во время работы программы. Тогда в обработчике этого события можно заново сформировать содержимое списка. |
Обзор компонентов Delphi В начало урока Компонент Delphi ScrollBar
Илья, добавлено 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. Содержимое этой строки:
Это значение типа String. Его можно записать в переменную того же типа
var S: String;
S:=ComboBox.Items[ComboBox.ItemIndex];
Затем его можно преобразовать в Integer:
var N: Integer;
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 строки
и поставить кнопку и написать
то цветом будет выделена 2 строка — там значение совпадает с 4 строкой.
Компоненты выбора из списков — ListBox, CheckListBox и ComboBox
- размер шрифта уменьшить размер шрифта
увеличить размер шрифта
- Печать
Компоненты выбора из списков — ListBox, CheckListBox и ComboBox
Пример компонентов, рассмотренных в данном разделе и обеспечивающих выбор из списка, приведен на рисунке ниже:
Пример компонентов выбора из списков
Компоненты ListBox и ComboBox отображают списки строк. Они отличаются друг от друга прежде всего тем, что ListBox только отображает данные и позволяет пользователю выбрать из них то, что ему надо, a ComboBox позволяет также редактировать данные. Кроме того различается форма отображения списков. ListBox отображает список в раскрытом виде и автоматически добавляет в список полосы прокрутки, если все строки не помещаются в окне компонента. ComboBox позволяет отображать список как в развернутом виде, так и в виде выпадающего списка, что обычно удобнее, так как экономит площадь окна приложения .
Основное свойство обоих компонентов, содержащее список строк, — Items, имеющее рассмотренный ранее тип TStrings. Заполнить его во время проектирования можно, нажав кнопку с многоточием около этого свойства в окне Инспектора Объектов. Во время выполнения работать с этим свойством можно, пользуясь свойствами и методами класса TStrings — Clear, Add и другими.
В компоненте ListBox имеется свойство MultiSelect, разрешающее пользователю множественный выбор в списке (на рисунке это свойство установлено в true в среднем верхнем списке). Если MultiSelect = false (значение по умолчанию), то пользователь может выбрать только один элемент списка. В этом случае можно узнать индекс выбранной строки из свойства ItemIndex, доступного только во время выполнения. Если ни одна строка не выбрана, то ItemIndex = -1. Начальное значение ItemIndex невозможно задать во время проектирования. По умолчанию ItemIndex = -1. Это означает, что ни один элемент списка не выбран. Если вы хотите задать этому свойству какое-то другое значение, т.е. установить выбор по умолчанию, который будет показан в момент начала работы приложения, то сделать это можно, например, в обработчике события OnCreate формы, введя в него оператор вида
Если допускается множественный выбор (MultiSelect = true), то значение ItemIndex соответствует тому элементу списка, который находится в фокусе. При множественном выборе проверить, выбран ли данный элемент, можно проверив свойство Selected[Index: Integer] типа Boolean.
На способ множественного выбора при MultiSelect = true влияет еще свойство ExtendedSelect. Если ExtendedSelect = true, то пользователь может выделить интервал элементов, выделив один из них, затем нажав клавишу Shift и переведя курсор к другому элементу. Выделить не прилегающие друг к другу элементы пользователь может, если будет удерживать во время выбора нажатой клавишу Ctrl. Если же ExtendedSelect = false, то клавиши Shift и Ctrl при выборе не работают.
Свойство Columns определяет число столбцов, в которых будет отображаться список, если он не помещается целиком в окне компонента ListBox (в среднем верхнем списке на рис. свойство Columns равно 2).
Свойство Sorted позволяет упорядочить список по алфавиту. При Sorted = true новые строки в список добавляются не в конец, а по алфавиту.
Свойство Style, установленное в lbStandard (значение по умолчанию) соответствует списку строк. Другие значения Style позволяют отображать в списке не только текст, но и изображения.
Имеется еще один компонент, очень похожий на ListBox — это список с индикаторами CheckListBox. Выглядит он так же, как ListBox (средний нижний список на рис.), но около каждой строки имеется индикатор, который пользователь может переключать. Индикаторы можно переключать и программно, если список используется для вывода данных и необходимо в нем отметить какую-то характеристику каждого объекта, например, наличие товара данного наименования на складе.
Все свойства, характеризующие компонент CheckListBox как список, аналогичны ListBox, за исключением свойств, определяющих множественный выбор. Эти свойства компоненту CheckListBox не нужны, поскольку в нем множественный выбор можно осуществлять установкой индикаторов.
Рассмотрим теперь компонент ComboBox. Стиль изображения этого компонента определяется свойством Style, которое может принимать следующие основные значения:
csDropDown
Выпадающий список со строками одинаковой высоты и с окном редактирования, позволяющим пользователю вводить или редактировать текст (правый список на рис.).
csSimple
Развернутый список со строками одинаковой высоты и с окном редактирования, позволяющим пользователю вводить или редактировать текст (левый нижний список на рис.).
csDropDownList
Выпадающий список со строками одинаковой высоты, не содержащий окна редактирования.
Выбор пользователя или введенный им текст можно определить по значению свойства Text. Если же надо определить индекс выбранного пользователем элемента списка, то можно воспользоваться обсуждавшимся в компоненте ListBox свойством ItemIndex. Все сказанное выше об ItemIndex и о задании его значения по умолчанию справедливо и для компонента ComboBox. Причем для ComboBox задание начального значения ItemIndex еще актуальнее, чем для ListBox. Если начальное значение не задано, то в момент запуска приложения пользователь не увидит в окне компонента одно из возможных значений списка и, вероятнее всего, не очень поймет, что с этим окном надо делать.
Если в окне проводилось редактирование данных, то ItemIndex = -1. По этому признаку можно определить, что редактирование проводилось.
Свойство MaxLength определяет максимальное число символов, которые пользователь может ввести в окно редактирования.
Если MaxLength = 0, то число вводимых символов не ограничено.
Как и в компоненте ListBox, свойство Sorted позволяет упорядочить список по алфавиту. При Sorted = true новые строки в список добавляются не в конец, а по алфавиту.
Это не работает
1 ответ 1
"Это" работает при n в пределах длины массива, если массив строковый, только цикл ни к чему.
Если массив динамический, и выбранный элемент надо добавить, то
В свежих дельфях
Всё ещё ищете ответ? Посмотрите другие вопросы с метками delphi pascal или задайте свой вопрос.
Похожие
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
дизайн сайта / логотип © 2020 Stack Exchange Inc; пользовательское содержимое попадает под действие лицензии cc by-sa 4.0 с указанием ссылки на источник. rev 2020.1.10.35756