Шаг 64.
Visual Prolog.
Списки

    На этом шаге мы рассмотрим списки.

    Список - это элемент управления, содержащий набор пунктов, которые может выбрать пользователь. Если список содержит больше элементов, чем может быть отображено в окне, и установлен флаг wsf_Vscroll, то автоматически появится вертикальная полоса прокрутки. Пользователь может перемещаться по списку вверх и вниз для изменения текущего значения или дважды щелкнуть на выбранном элементе списка.

    Существуют специальные виды списков, такие как раскрывающиеся списки и редактируемые списки. Установкой соответствующих флагов вы можете позволить множественный выбор в списке или создать многоколоночный список (создание нескольких колонок в списке реализовано не на всех платформах).

    Списки обычно содержат строки, но, используя стиль wsf_OwnerDraw, можно создавать списки с произвольным типом данных.

Предикаты для работы со списками

    В VPI есть несколько предикатов для работы со списками. Все они имеют префикс lbох_. Эти предикаты требуют идентификатор списка, который может быть получен вызовом предиката win_GetCtlHandle, дескриптор родительского окна и ресурсный идентификатор списка. Индекс 0 определяет первый элемент списка, 1 - второй и т. д. Значение индекса - 1 используется для добавления элемента в конец списка.

    Предикаты для работы со списками:

   dlg_choose_your_favorite_language_eh(_Window,e_Create(_),0):-!,
      LB=win_getCtlHandle(_Window,idc_choose_your_favorite_language), 
      lbox_setColumnWidth(LB,20),
      !.


Рис.1. Диалоговое окно Multicol

    Предикат lbox_SetTabstops(WINDOW, ILIST TabList) вы можете использовать для создания списка с флагом wsf_UseTabstops, чтобы установить позиции табуляции определения "видимых колонок". Текстовая информация, представленная в каждой строке списка, - это один элемент. Заметьте, что это не противоречит многоколоночным спискам. Если списки имеют символы табуляции, то символы, следующие за ними, будут выровнены в соответствии с установленным списком позиций . Позиции табуляции даны в диалоговых базовых единицах.

    Если шрифт диалогового окна пропорциональный, этот метод применяется для вытаскивания колонок, как показано на рис. 2.

    Заметьте, что каждая строка остается одной сущностью.


Рис.2. Диалоговое окно со списком с выровненными колонками

    В качестве примера вызова предиката показана инициализация позиций табуляции:

   dlg_select_employee_eh(_Window,e_Create(_),0):-!,
      List=win_getCtlHandle(_Window,idc_select_employee_l), 
      lbox_setTabstops(List,[17,18,19,20]),
      !.

    Действительные значения позиций табуляции получены вычитанием значения диалоговых базовых единиц левой координаты окна списка из левой координаты каждого заголовка.

    События уведомления от списков:

   % При выборе элемента в списке
   ehandler(Window,e_Control(CtrlID,CtrlType,CtrlWindow,selchanged),0):-
   % При двойном щелчке в окне списка
   ehandler(Window,e_Control(CtrlID,CtrlType,CtrlWindow,activated),0):-
   % При получении списком фокуса ввода
   ehandler(Window,e_Control(CtrlID,CtrlType,CtrlWindow,getfocus),0):-
   % При потере списком фокуса ввода
   ehandler(Window, e_Control(CtrlID,CtrlType,CtrlWindow,losefocus),0):-

    Предикат:

   lbox_SetTopIndex(window Window,integer Index)

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

    На следующем шаге мы рассмотрим раскрывающиеся списки.




Предыдущий шаг Содержание Следующий шаг