Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Книга о KOL.doc
Скачиваний:
29
Добавлен:
30.04.2019
Размер:
1.77 Mб
Скачать

3 .13. Комбинированный список (combo box)

Этот оконный объект объединяет в себе две сущности воедино: однострочное поле для ввода текста, и вышеописанный список строк. Очень часто этот визуальный элемент называют еще "выпадающим списком", но это неправильно. Сейчас этот объект редко используется в режиме, когда комбинированный список является именно комбинированным списком, и поле ввода со списком элементом отображаются одновременно (т.е. список как бы навсегда "выпавший" и не скрывается).

Чаще всего, комбинированные списки делают все-таки выпадающими (из-за экономии места на форме, наверное). Но режим "простого" комбинированного списка, когда список изображен всегда, существует до сих пор, и может использоваться в приложениях.

Само собой разумеется, что в комбинированном списке выделен в каждый момент времени может быть только один элемент. При выделении (выборе) элемента из списка, его текст копируется в поле ввода. Для добавления новых элементов необходимо в своем коде вызывать методы Add и Insert (сами элементы в список автоматически никогда не попадают, в том числе при вводе их в поле ввода, когда его можно редактировать).

О

дна маленькая (но немаловажная) деталь. Объект этого типа (когда он является именно выпадающим списком) не стоит пытаться "выравнивать" (Align) так, чтобы его высота пыталась автоматически подстраиваться по высоте родителя (или оставшейся на родительском окне высоты). Т.е., нежелательными являются стили caLeft, caRight и caClient. Проблема может заключаться в том, что возникнет конфликт между системой и кодом, отвечающем за выравнивание. В худшем случае приложение зависнет, пытаясь выровнять объект, который отказывается изменить свою высоту, в лучшем же случае изменение высоты будет просто отвергнуто. Известные мне способы изменить высоту поля ввода для комби-списка, это изменить в нем шрифт, или использовать событие OnMeasureItem и стиль coOwnerDrawVariable (см. ниже).

С

ледует знать кое-что еще о комбинированном списке. В отличие от подавляющего большинства других оконных объектов, комбинированный список не позволяет динамически поменять своего родителя (т.е. окно, на котором он лежит). Нельзя так просто взять и присвоить в качестве Parent другой объект. Комбинированный список получает родителя один раз, и уйти от него к другому уже не сможет до самой своей смерти. (Вообще говоря, изменять родителя для контрола динамически часто востребованной возможностью назвать трудно, но мало ли какие случаи бывают).

Конструктор:

NewComboBox( Parent, Options ); опции комби-списка в значительной степени коррелируют с опциями простого списка, но есть и особенные:

coReadOnly - только чтение, относится к полю ввода, запрещает вводить здесь текст (элемент может быть только выбран из имеющегося списка);

coNoHScroll - запрещается горизонтальная прокрутка, опция относится к списку элементов (если есть элементы со слишком широким текстом, то текст будет обрезан, и прочитать его до конца уже не удастся никогда, если у пользователя нет возможности в динамике увеличить ширину списка);

coAlwaysVScroll - всегда показывать линейку вертикальной прокрутки (даже если число элементов достаточно мало, чтобы показать их все, не используя прокрутку);

coLowerCase - текст и в поле ввода, и в списке отображается в нижнем регистре;

coNoIntegralHeight - аналогично loNoIntegralHeight для объекта простого списка, относится к списку;

coOemConvert - для OEM-текста (т.е. для текста в кодировке DOS) выполняется конверсия в код ANSI;

coSort - список всегда сортированный;

coUpperCase - текст отображается и вводится в верхнем регистре;

coOwnerDrawFixed и coOwnerDrawVariable - аналогично соответствующим опциям для простого списка, сообщают системе, что будет выполняться рисование содержимого списка с помощью назначенной дополнительно процедуры (событие OnDrawItem);

coSimple - стиль "простого" списка, при котором список не является выпадающим, а постоянно лежит на форме непосредственно под полем ввода, образуя с ним единое целое.

Свойства и методы SelStart, SelLength, CurIndex, Count, Items[ ], IndexOf, SearchFor, ItemSelected[ ], ItemData[ ] - относятся именно к списковой части комбинированного контрола. Для поля ввода имеется свойство Text (то же что и Caption). При необходимости работать с выделением текста в поле ввода, следует использовать метод Perform с соответствующими оконными сообщениями CB_XXXX.

Свойства, присущие всему комбинированному списку:

OnDropDown - данное событие срабатывает перед тем, как выпадает список по нажатию кнопки F4, сочетанию клавиш Alt+<стрелка вниз>, или по щелчку мыши на кнопке с треугольником справа от поля ввода, - для выпадающего комбинированного списка. В обработчике данного событии возможно, в том числе, даже организовать изменение содержимого списка - поскольку он еще не изображен на экране, но делать так не стоит - из тех соображений, что это может потребовать некоторого времени, а пользователя лучше не заставлять ждать подолгу, после каждого щелчка мышью или нажатия клавиши;

OnCloseUp - это событие срабатывает, когда выпадающий список закрывается - по любой причине (выбран элемент, окно потеряло фокус, нажата клавиша <Escape>, и т.д.);

DroppedWidth - относится к выпадающему списку, позволяет установить для него другую ширину, чем для всего окна (в пикселях);

OnSelChange - то же самое событие, что и для простого списка, фиксирует изменение выделенного элемента (с тем отличием, что комбинированный список не допускает множественного выделения, и выделенным может быть только один элемент - тот, что в данный момент отражается в поле ввода текста);

OnChange - событие изменения текста в поле ввода, в том числе срабатывает, когда текст изменился в результате выбора другого элемента в списковой части комби-контрола;

AddDirList( s, attrs ) - так же, как и для list box-списка, позволяет добавить список файлов и поддиректорий указанной директории.

В MCK комбинированный список представлен зеркальным компонентом TKOLComboBox. Аналогично TKOLListBox, в зеркале для комбинированного списка так же присутствует свойство времени разработки Items, позволяющее отредактировать список строк для инициализации контрола.