- •Владимир Кладов, 2006-2007 /e-mail: vk@kolmck.Net /
- •Содержание
- •0. Введение: происхождение kol
- •0.1. Начало kol
- •0.1.1. Анализ причин громоздкого размера приложений. Архитектурные концепции kol
- •0.1.2. Дальнейшее развитие kol. Уменьшаем все, что можно. Замена System.Pas и других системных модулей
- •0.2. Первые выводы. Необходимость уменьшения кода: кому это нужно?
- •0.2.1. Экономия расходов памяти
- •0.3. Визуальная разработка gui-приложений в kol: Mirror Classes Kit
- •0.4. Работа в kol. Поиск информации.
- •0.5. Проблемы совместимости и конвертирования существующих vcl-проектов
- •0.6. Kol и компилятор cBuilder
- •1. Установка kol и mck
- •1.1. Установка kol
- •1.2. Установка mck
- •1.3. Символы условной компиляции
- •2. Программирование в kol
- •2.1. Функции работы со строками
- •2.2. Работа с длинными целыми числами (i64 против Int64)
- •2.3. Преобразования чисел с плавающей запятой. Математика с числами с плавающей запятой
- •2.4. Работа с датой и временем в kol
- •2.5. Низкоуровневая работа с файлами и папками в kol
- •2.6. Работа с реестром в kol
- •2.7. Служебные функции для работы с окнами в kol
- •2.8. Сортировка данных
- •2.9. Иерархия объектных типов в kol
- •2.9.1. Объекты _tObj и tObj.
- •2.9.2. Наследование объектов от tObj
- •2.9.3. Обработчики событий
- •2.10. Объект tList (универсальный список)
- •2.11. Потоки данных в kol (tStream)
- •2.12. Списки строк в kol (tStrList, tStrListEx и другие)
- •2.13. Список файлов и директорий (tDirList)
- •2.14. Отслеживание изменений на диске (tDirChange)
- •2.16. Массив битовых флажков (tBits)
- •2.17. Дерево в памяти (tTree)
- •2.18. Элементы графики. Графические инструменты (tGraphicTool) и канва для рисования (tCanvas)
- •2.19. Изображение в памяти (tBitmap)
- •2.19.1. Дескриптор и формат пикселей (tBitmap)
- •2.19.2. Размеры (tBitmap)
- •2.19.3. Загрузка и сохранение (tBitmap)
- •2.19.4. Рисование изображения на ином контексте (tBitmap)
- •2.19.5. Канва и модификация собственного изображения через нее (tBitmap)
- •2.19.6. Прямой доступ к пикселям и модификация изображения без канвы (tBitmap)
- •2.19.7. Параметры dib-изображений (tBitmap)
- •2.20. Пиктограмма (tIcon)
- •2.21. Список изображений (tImageList)
- •2.21.1. Дескриптор и параметры (tImageList)
- •2.21.2. Манипуляции с изображениями: добавление, удаление, загрузка (tImageList)
- •2.21.3. Доступ к изображениям (tImageList)
- •2.21.4. Рисование (tImageList)
- •2.22. Перед тем, как приступить к визуальным объектам
- •2.23. Общие свойства и методы оконных объектов
- •2.23.1. Дескриптор окна
- •2.23.2. Родительские и дочерние контролы
- •2.23.3. Доступность и видимость
- •2.23.4. Позиция и размеры
- •2.23.5. Рисование
- •2.23.6. Текст окна и шрифт для окна
- •2.23.7. Цвет окна и рамка окна
- •2.23.8. Сообщения (все оконные объекты)
- •2.23.9. Диспетчеризация сообщений в kol
- •2.23.10. Клавиатура и табулирование между контролами
- •2.23.11. Мышь и курсор мыши
- •2.23.12. Меню и справка
- •2.23.13. Свойства, методы и события формы и апплета
- •2.23.14. Внешний вид (форма, апплет)
- •2.23.15. Модальные диалоги
- •2.23.15. Сообщения (форма, апплет)
- •2.23.16. Событие OnFormClick (для формы)
- •2.23.17. Справочная система
- •2.24. Программирование в kol (без mck). Создание формы и запуск цикла обработки сообщений.
- •2.25.1. Создание mck-проекта
- •2.25.2. Настройка формы
- •2.25.3. Написание кода
- •2.26 Графические ресурсы приложения
- •2.27 Графические ресурсы и mck
- •3. Оконные объекты
- •3.1 Простые оконные объекты
- •3 .1.1. Метки (label, label effect)
- •3 . 2. Панели (panel, gradient panel, group box)
- •3 .3. Ящик для рисования (paint box)
- •3 .4. Разделитель (splitter)
- •3 .5. Линейка прокрутки (scroll bar)
- •3.6. Линейка прогресса (progress bar)
- •3 .7. Контейнер прокрутки (scroll box)
- •3 .8. Кнопки (button, bitbtn)
- •3 .9. Переключатели (check box, radio box)
- •3.10. Визуальные объекты со списком элементов
- •3 .11. Поля ввода текста (edit box, memo, rich edit)
- •3.11.1. Конструкторы полей ввода текста (edit)
- •3.11.2. Особенности применения общих свойств (edit)
- •3.11.3. Опции полей ввода (edit)
- •3.11.4. Общие свойства полей ввода (edit)
- •3.11.5. Расширение возможностей: прямое обращение к api (edit)
- •3.11.6. Особенности Rich Edit
- •3.11.7. Зеркальные классы полей ввода (edit)
- •3 .12. Список строк (list box).
- •3 .13. Комбинированный список (combo box)
- •3.14. Общий список (list view)
- •3.14.1. Списки изображений (list view)
- •3.14.2. Управление колонками (list view в режимах отображения lvsDetail, lvsDetailNoHeader)
- •3.14.3. Работа с элементами и выделением (list view)
- •3.14.4. Добавление и удаление элементов (list view)
- •3.14.5. Значения элементов и их изменение (list view)
- •3.14.6. Местоположение элементов (list view)
- •3.14.7. Внешний вид (list view)
- •3.14.8. Сортировка и поиск (list view)
- •3 .15. Просмотр дерева (tree view)
- •3.15.1. Свойства всего дерева
- •3.15.2. Добавление и удаление узлов (tree view)
- •3.15.3. Свойства родительских узлов (tree view)
- •3.15.4. Свойства дочерних узлов (tree view)
- •3.15.5. Атрибуты узлов: текст, пиктограммы, состояния (tree view)
- •3.15.6. Геометрия узлов и перетаскивание (tree view)
- •3.15.7. Редактирование текста (tree view)
- •3 .16. Линейка инструментов (tool bar)
- •3.16.1. Общие свойства, методы, события (toolbar)
- •3.16.2. Настройка линейки (toolbar)
- •3.16.3. Свойства кнопок (toolbar)
- •3.16.4. Некоторые особенности работы с инструментальной линейкой (toolbar)
- •3.17. Панели с закладками (tab control)
- •3 .18. Фреймы (tkolFrame)
- •3 .19. Модуль данных (tkolDataModule)
- •3 .20. Форма
- •3.20. «Чужая» панель
- •4. Графические (не оконные) визуальные элементы
- •4.1 Графическая метка
- •4.2. Графическое полотно для рисования
- •4.3. Графическая кнопка
- •4.4 Графические флажки
- •4.5 Графическое поле ввода
- •4.6 Темы xp для графических контролов и не только
- •5. Невизуальные объекты kol и mck
- •5 .1. Меню (tMenu)
- •5.1.1. События для всего меню или его дочерних пунктов
- •5.1.2. События, методы, свойства отдельного пункта меню как объекта
- •5.1.3. Доступ к свойствам подчиненных элементов меню (по индексу или числовому идентификатору)
- •5.1.4. Главное меню
- •5.1.5. Всплывающее меню
- •5.1.6. Ускорители
- •5.1.7. Меню в mck
- •5 .2. Значок в трее (tTrayIcon)
- •5 .3. Диалог выбора файла (tOpenSaveDialog)
- •5.4. Диалог выбора директории (tOpenDirDialog)
- •5.5. Альтернативный диалог выбора директории (tOpenDirDialogEx)
- •5.6. Диалог выбора цвета (tColorDialog)
- •5.7. Часы (tTimer)
- •5.8. Мультимедийный таймер (tmmTimer)
- •5 .9. Нить, или поток команд (tThread)
- •5.10. Псевдо-потоки
- •6. Расширения kol
- •6.1. Обработка исключений
- •6.2. Математика с плавающей запятой
- •6.3. Комплексные числа
- •6.4. Диалоги
- •6.4.1. Выбор шрифта
- •6.4.2. Диалог поиска и замены
- •6.4.3. Системный диалог «о программе»
- •6.5. Печать и подготовка отчетов
- •6.5.1. Диалоги выбора принтера и настройки печати. Печать
- •6.5.2. Печать отчетов
- •6.6. Работа с базами данных
- •6.6.5. Работа с файлами dbf и другими бд
- •6.7. Расширения графики
- •6.7.1. Метафайлы wmf, emf
- •6.7.2. Изображения jpeg
- •6.7.3. Изображения gif, gifShow, AniShow
- •6.7.3.3. Основной объект (tGif).
- •6.7.3.4. Визуальная анимация Gif-изображения в окне (tGifShow).
- •6.7.4. Изображения png
- •6.7.5. Библиотека kolGraphic
- •6.7.7. Прочие форматы изображений
- •6.7.8. Дополнительные утилиты для работы с графикой
- •6.7.9. Open gl: модули kologl12 и OpenGlContext
- •6.8. Звук и видео
- •6.8.4. Прочие средства для работы со звуком
- •6.9. Работа с архивами
- •6.10. Криптография.
- •6.13. Сеть
- •6.13.2. Работа с портами
- •6.14. Системные утилиты.
- •6.14.1 Сервисы nt
- •6.14.2. Апплет панели управления (cpl)
- •6.15.6. Виртуальная машина Collapse
- •6.15.7. Свойство FormCompact
- •6.16. Дополнительные визуальные объекты
- •6.16.1 Линейка прогресса
- •6.16.2 Трак-бар (маркированная линейка-указатель)
- •6.16.3 Заголовок (таблицы)
- •6.16.4 Выбора шрифта
- •6.16.10 Ввод ip
- •6.16.11 Календарь и выбор даты и/или времени
- •6.16.21 Другие дополнительные визуальные элементы
- •6.17. Всплывающие подсказки
- •6.18. Темы xp
- •7.2. Использование расширений
- •7.3. Разработка собственных расширений
- •7.3.1. Разработка невизуальных расширений
- •7.3.2. Разработка визуальных расширений (контролов)
- •Приложение а. Ошибки программистов, начинающих изучать kol
- •А.1. Назначение обработчика события, используя функцию MakeMethod и приведение типа к tOnSomeEvent. («Почему мой обработчик не реагирует на событие?»)
- •А.2. «Не могу установить mck», «откомпилировать mck приложение», спрашивает какой-то файл designintf, proxies», и тому подобное
- •А.3. Проект kol, содержащий две или более форм, работает как-то не так
- •Приложение б. Инструменты разработчика
- •Приложение в. Демонстрационные примеры
- •Приложение г. Kol с классами вместо объектов
3.14. Общий список (list view)
Начиная с Windows 95 и NT 3.51, в операционных системах фирмы Microsoft к основному набору оконных классов добавились так называемые common controls ("общие" оконные управляющие элементы, или контролы). Среди них находится и окно для просмотра списков произвольных элементов, текстов и изображений - list view. В библиотеке KOL все "общие" контролы так же реализованы внутри объектного типа TControl. Более того, во многих случаях сохранен полиморфизм методов, свойств и событий, так что по внешнему интерфейсу для программиста "общие" контролы практически не отличаются от изначальных оконных объектов (так называемых GUI-окон, GUI - Graphic User Interface, или графический пользовательский интерфейс).
Конструктор общего списка:
NewListView( Parent, style, options, IL_normal, IL_small, IL_state );
В конструкторе сразу задается стиль (lvsIcon - пиктограммы, lvsSmallIcons - маленькие пиктограммы, lvsList - список, lvsDetail - детализированный, lvsDetailNoHeader - детализированный без заголовка), списки изображений (IL_normal - для стиля "пиктограммы", IL_small - для всех прочих стилей отображения, IL_state - для хранения пиктограмм "состояния", изображаемых в отдельной колонке в стилях lvsDetail и lvsDetailNoHeader; на месте любых списков может быть передан nil, если список не используется), а так же опции:
lvoIconLeft - в режимах lvsIcon, lvsSmallIcon размещать пиктограмму слева от текста (а не выше текста, как по умолчанию);
lvoAutoArrange - автоматическое упорядочивание элементов в режимах просмотра lvsIcon и lvsSmallIcon;
lvoButton - пиктограммы изображаются в виде кнопок (для режима просмотра lvsIcon);
lvoEditLabel - разрешается редактирование текста меток (первая колонка элемента);
lvoNoLabelWrap – текст изображается всегда в одну строку (для режима просмотра lvsIcon);
lvoNoScroll - никакой прокрутки в окне;
lvoNoSortHeader - не пытаться сортировать элементы при щелчке на кнопку заголовка колонки;
lvoHideSel - скрывать выделение, когда окно не в фокусе ввода;
lvoMultiselect - разрешает множественное выделение;
lvoSortAscending - сортировка по возрастанию;
lvoSortDescending - сортировка по убыванию (если не задана ни сортировка по возрастанию, ни по убыванию, то автоматическая сортировка не производится);
lvoGridLines - сетка линеек между колонками и строками;
lvoSubItemImages - колонки могут содержать собственные пиктограммы;
lvoCheckBoxes - в качестве изображений используются системные переключатели;
lvoTrackSelect - отслеживание курсора мыши, и дополнительные визуальные эффекты при пересечении курсором элементов;
lvoHeaderDragDrop - разрешается брать и перетаскивать заголовки колонок (режим lvsDetail), меняя порядок отображения
колонок;
lvoRowSelect - строка выделяется целиком, со всеми колонками;
lvoOneClickActivate - одиночный щелчок мыши активизирует элемент;
lvoTwoClickActivate - двойной клик мыши активизирует элемент;
lvoFlatsb - плоские линейки прокрутки;
lvoRegional - особый режим "прозрачности", при котором все клиентское пространство, кроме самих элементов и их пиктограмм, исключается из региона окна;
lvoInfoTip - автоматически создавать и изображать окошко, в котором отражается весь текст колонки под курсором мыши, если этот текст не виден полностью в самой колонке;
lvoUnderlineHot - подчеркивание активных элементов (под курсором мыши);
lvoMultiWorkares - использовать несколько рабочих областей в окне (для просмотра и автоматического упорядочивания в режиме lvsIcon);
lvoOwnerData - список является виртуальным, т.е. изначально не хранит сам никакие данные, а в обработчике события OnLVData получает их пользовательского кода;
lvoOwnerDrawFixed - список элементов одинаковой высоты, изображается пользовательским обработчиком OnDrawItem (этот стиль не следует использовать, если используется событие OnLVCustomDraw).
Во время исполнения стиль просмотра может быть изменен (или получен) свойством LVStyle. Более того, имеется возможность изменить любые опции общего списка динамически, используя свойства LVOptions.
По поводу стилей просмотра lvsDetail и lvsDetailNoHeader, следует заметить, что текст и изображение элементов списка в этих режимах отображается в колонках. Но колонки необходимо создать своим кодом (или на этапе разработке использовать редактор колонок). Если это не будет сделано, окно списка останется пустым, даже при наличии в нем элементов!
Для общего списка, в том числе с множественным выделением, в том числе для случая, когда выделенные элементы не являются соседними, продолжает работать свойство SelLength - оно возвращает количество выделенных элементов. Но в коде лучше использовать свойство LVSelCount.
Как обычно, для списковых контролов, работает и свойство Count (для него есть синоним - свойство LVCount), но для виртуального списка это свойство можно устанавливать, сообщая окну объекта, сколько элементов имеется (показывается) в списке.
П
Событие OnMeasureItem (см. метод Set_LVItemHeight) может использоваться при наличии стиля lvoOwnerDrawFixed для того, чтобы программно задать высоту элемента, если высота, устанавливаемая системой по умолчанию, не устраивает. Лично я чаще использую другой способ: назначаю объекту список изображений (в соответствии с режимом просмотра - список для больших или маленьких пиктограмм, в зависимости от используемых режимов просмотров). Размер (высота) пиктограммы в таком списке изображений однозначно определяет и высоту элементов, лишь бы он был больше, чем высота используемого шрифта (если шрифт больше, то высота элемента устанавливается системой так, чтобы текст полностью входил по высоте). Если сам список изображений не используется, его необязательно заполнять чем-нибудь. Достаточно пустого списка, чтобы задать требуемую высоту элемента.
Как и для других списочных контролов, продолжают работать метод Clear (пожалуй, самый полиморфный метод для всех разновидностей оконных объектов).
Для общего списка характерно свойство
SetUnicode( b ) - переводит окно объекта в режим обработки Unicode-строк. Для обеспечения возможности работы с Unicode-строками в элементах списка, в опции проекта необходимо так же добавить символ условной компиляции UNICODE_CTRLS*;