
- •Владимир Кладов, 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 с классами вместо объектов
0.6. Kol и компилятор cBuilder
Иногда программисты, использующие для разработки среду CBuilder, задают такой вопрос: а возможно ли использовать KOL из CBuilder’а. Принципиальных препятствий к этому никаких нет. Компилятор CBuilder «понимает» код на языке Delphi. И хотя он отказывается работать с объектами в старом стиле объектного Паскаля, и согласен только на классы, это тоже не проблема: для KOL всегда можно изготовить версию с классами, достаточно запустить соответствующий командный файл из пакета GlueCut. (Вот только над командным файлом пришлось бы поработать, ибо несовместимостей между синтаксисом, воспринимаемым CBuilder’ом, и тем, что получается даже в KOL с классами, гораздо больше даже, чем при переходе на старую версию компилятора Free Pascal).
На самом деле, смущает не это, а большой размер библиотеки времени исполнения. Если ее не подключать, и делать приложение, которое можно будет переносить на любую машину, то минимальное приложение типа «Hello, World!» Занимает уже 50Кбайт, а не 16, как в Delphi.
Если же оставить включенной опцию компиляции с использованием этих библиотек, то без наличия в системе такой библиотеки размером примерно 1,5 Мегабайта приложение не сможет быть запущено. А ведь библиотека KOL тем и хороша, что приложения, построенные по принципу «все свое ношу с собой», остаются чрезвычайно небольшими, и при этом программирование остается объектно-ориентированным.
А стоит добавить KOL.pas в проект, и стартовый размер приложения типа «Привет, Мир!» немедленно вырастает до 360Кбайт, и это – при отключенной отладочной информации. Если поглядеть при этом в файл .map, созданный линковщиком, то там можно обнаружить очень большое число функций из KOL.pas, хотя еще не было обращения ни к одной из них. Либо CBuilder не поддерживает «умное связывание» (smart-linking), либо он не поддерживает его только для подключаемого исходного кода на языке Паскаль, но итог один: весь смысл от использования KOL в среде CBuilder теряется.
1. Установка kol и mck
1.1. Установка kol
Установка библиотеки KOL заключается в следующем. Сначала необходимо создать пустую папку. Например, пусть это будет «C:\KOL». И затем распаковать в нее содержимое архива KOL.zip. Никаких других действий предпринимать не нужно. KOL – это не набор компонентов для работы в VCL, а набор модулей, которые включаются в проект путем прописывания в секции uses своего модуля или проекта ссылки на используемый модуль. Нужно только не забыть прописать путь к директории, где находится задействованный модуль, в опциях проекта (Project | Options | Directories/Conditionals | Search paths… ) или в опциях среды разработки (Tools | Environment options… | Library | Library paths ).
1.2. Установка mck
Для установки MCK необходимо распаковать содержимое архива MCK.zip (лучше в ту же директорию, ответив «ДА» на все вопросы о замещении файлов – некоторые файлы в этих архивах дублируются). Затем надо из Delphi IDE открыть пакет MirrorKOLPackageXX.dpk, при этом XX должно соответствовать версии Delphi (D3 для Delphi3, D4 для Delphi 4, D6 для Delphi6, D7 для Delphi7, и только для версии Delphi5 расширение пусто, т.е. пакет носит имя MirrodKOLPackage.dpk).
Для версий Delphi, Borland Developer Studio, Turbo-Delphi, для которых пакета нет, но поддерживается работа с пакетами, вы можете создать пакет MCK самостоятельно. В пакет следует добавить три файла: mirror.pas, mckObjs.pas и mckCtrls.pas.
Затем надо нажать кнопку Install (установка) - на линейке инструментов пакета. При отсутствии линейки команда выбирается из меню (в BDS – из контекстного меню на узле с проектом). При возникновении проблем с установкой, возможно, следует в опциях пакета, или лучше – в Tools | Environment Options | Library | Library Path, добавить путь к $(DELPHI)\Source\Toolsapi. На этом установка MCK завершена (при первой установке должен показаться очень большой список установленных компонентов, все они устанавливаются в закладку KOL на линейке компонентов).
Только в версии Delphi2 открывать пакет для установки не нужно, а требуется выполнить несколько другую процедуру (см. инструкцию по установке, подменять или дублировать ее здесь я не намерен).
Обратите внимание, что при обновлении KOL и MCK до новой версии (а делать это приходится иногда довольно часто, т.к. библиотека развивается постоянно), так же требуется открыть пакет MCK, и выполнить именно Build (перестроение) пакета, но ни в коем случае не Compile (перекомпиляция). Дело в том, что при перекомпиляции, в отличие от Build, компилятор Delphi ошибочно использует версию пре-компилированного файла KOL, остающуюся после работы с текущими проектами, и не учитывает наличие в пакете существенно других опций компиляции. В результате, после такой незавершенной перекомпиляции оболочка Delphi начинает давать сбои, вплоть до постоянного краха.
И заметьте, что когда вы от работе с пакетом переходите обратно к работе с приложениями, то, по крайней мере, в первый раз следует опять выполнить построение (Build), а не компиляцию (Compile) для приложения. Иначе компилятор снова не заметит, что изменился набор символов условной компиляции, и будет пытаться использовать файл KOL.dcu, образовавшийся при сборке пакета MCK. А так как в этом случае имелись косвенные ссылки на модули VCL времени разработки, то Delphi непременно потребует найти ему файл proxies.dcu (которого просто не существует).