- •Владимир Кладов, 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 с классами вместо объектов
6.16.21 Другие дополнительные визуальные элементы
К сожалению, не все созданные для KOL расширения могут быть загружены с основного Web-сайта, да и многие из перечисленных здесь архивов представлены так же всего лишь ссылкой на оригинальные авторские архивы. Большое количество дополнительных ссылок можно найти на дружественных сайтах, особенно на http://kolnmck.ru . Например, реализацию таких элементов, как cool bar, всевозможных Gauge и индикаторов, и множества других.
6.17. Всплывающие подсказки
Как известно, всплывающие подсказки, если они настроены разработчиком, показываются при наведении на некоторые визуальные элементы формы. В VCL для того, чтобы такие подсказки появлялись, достаточно было включить свойство ShowHint, и присвоить свойству Hint контрола некоторый текст.
В KOL таких свойств как Hint и ShowHint, изначально не было предусмотрено. Мы вполне обходились (по крайней мере, лично я обходился) так называемыми тултипами*, которые обеспечиваются системой для линейки управления (toolbar). На этой линейке, подсказки действительно могут оказаться полезными, по крайней мере, в режиме отображения без текстовых надписей на кнопках. Просто потому, что из пиктограммы часто не всегда можно узнать, что делается при нажатии на соответствующую кнопку линейки, особенно когда пользователь только знакомится с приложением или работает с ним редко, и не обязан помнить назначение каждой кнопки от раза к разу.
Что касается возможности организовывать вплывающие подсказки для любых элементов управления на форме, то я лично отношусь к этой идее скорее отрицательно, чем положительно. Хорошо спроектированный интерфейс не требует такого средства для постоянного напоминания, тем более что, всплывающие подсказки часто заслоняют собой элементы управления и мешают работе, даже если остаются прозрачными для клика мыши. Если пользователь постоянно работает с приложением, то такие всплытия могут даже раздражать (и поэтому неплохо бы иметь возможность отключения таких подсказок, если пользователь этого пожелает).
Кстати, всплывающим подсказкам исторически предшествует идея вывода поясняющей информации в специальное поле, например, в строку состояния. При этом, по крайней мере, такие подсказки не назойливы, и не заслоняют собой «рабочую поверхность» формы.
Тем не менее, подсказки все-таки нужны, и об этом свидетельствует и то, что на сайте представлено несколько пакетов различных авторов, реализующих подобную возможность. В конечном итоге, я согласился с требованием включить официальную поддержку всплывающих надписей в KOL, но в виде условно-компилируемого кода. Для того, чтобы подсказки стали доступны для KOL-приложения, теперь достаточно включить символ условной компиляции USE_MHTOOLTIP, и при этом автоматически становится доступным поле Hint, в частности. Разумеется, для использования в проекте механизма подсказок от Д. Жарова (a.k.a. Gandalf) нужно будет скачать и распаковать небольшой архив с дополнительно включаемым кодом (модуль KOLMHTooltips.pas).
6.18. Темы xp
|
|
Красота – страшная сила. Особенно задумайтесь над смыслом слова «страшная». |
Для подключения к приложению тем XP достаточно к нему добавить специальный ресурс, содержащий манифест, или положить файл с манифестом, названный <имя_вашего_приложения>.exe.manifest. В результате, однако, приложение не всегда работает правильно и отображается так, как следовало бы. Именно по этой причине я всегда предпочитаю второй вариант использования манифеста – с внешним файлом. Его всегда можно будет удалить, в том числе, если из-за подключения манифеста возникли проблемы у пользователя, можно в ответ на его жалобу просто посоветовать удалить этот файл – что намного быстрее, чем передавать ему вариант дистрибутива, в котором ресурс манифеста не включен в исполнимый модуль.
Не секрет, что добавлением внешнего файла манифеста можно попробовать «улучшить» внешний вид любого 32-битного приложения, даже изготовленного и выпущенного в свет еще до появления операционной системы XP. Интересно, многие ли из вас пытались таким образом улучшить интерфейс оболочки Delphi. У меня, например, получилось добиться положительного эффекта для Delphi 6, положив в его директорию \bin файл манифеста Delphi32.exe.manifest. Версия 5, правда, не смогла запуститься после такого усовершенствования. Зато этот фокус на ура прошел для Delphi 2. По крайней мере, закладки страниц редактируемых модулей стали более различимы, и теперь хорошо видно, какая именно закладка активна.
На самом деле, все не так просто, и для того, чтобы темы начали правильно работать, в коде должно кое-что быть добавлено. Как минимум, необходим вызов API-функции InitCommonControls (который выполняется сам, если вы уже задействуете в приложении «общие» контролы вроде list view или tree view, но который нужно вызвать дополнительно, если таких визуальных объектов в приложении нет).
Для корректного подключения тем к MCK-приложению XP рекомендуется использовать компонент TKOLMHXP, автор которого – Дмитрий Жаров a.k.a. Gandalf. Этот компонент обеспечит и подключение манифеста (причем, есть возможность выбрать способ подключения: как ресурс или как внешний файл), и вызов необходимых функций API. Кроме того, с его помощью можно корректно заполнить поля манифеста (который фактически является XML-документом). Хотя на функционирование манифеста значения этих полей никакого влияния не оказывают.
Внешний вид некоторых контролов может отличаться от того, который ожидалось увидеть при подключении манифеста. Например, RichEdit не желает изображаться с применением тем XP, пока вы не добавите символ условной компиляции GRAPHCTL_XPSTYLES (не забудьте пересобрать – Build – проект). Сделано это так потому, что для правильной работы с манифестом требуется дополнительный код, и этот код вовсе не нужен в случае, если вы не предполагаете использовать манифест (или внешний вид окна RichEdit с обычной рамкой вас не расстраивает, и экономия нескольких десятков байт кода важнее).
Похожие проблемы обнаруживаются и для страниц с закладками – TabControl. При его создании, я решил для каждой страницы использовать в качестве подложки обычную панель, а она никоим образом не подвержена воздействию манифеста. В итоге, внутренность страницы, выглядит несколько блекло по сравнению с красочными видами за границами страницы. Для устранения этой проблемы добавьте символ условной компиляции NEW_ALIGN (после достаточного тестирования, и возможно, очень скоро, этот вариант кода будет стандартным, тогда как прежний вариант выравнивания станет, напротив, опциональным).
Следует так же отметить, что при подключении манифеста могут возникать проблемы с прозрачностью многих видов контролов (для которых свойство Transparent = true). Некоторые из них становятся черными, некоторые отображаются неправильно. Для решения проблем с линейкой инструментов (toolbar) вообще пришлось пойти на беспрецедентные меры: его MCK-зеркалу пришлось добавить свойство FixFlatXP, по умолчанию установленное, которое управляет генерацией кода таким образом, чтобы избежать появления черной полоски вместо линейки инструментов. Что не только несколько увеличивает код, но и запрещает использование некоторых сочетаний опций.
6.19. Расширения самого MCK
6.19.1. Улучшенная настройка шрифтов
Пакет KOLFontEditor встраивает в среду Delphi редактор шрифтов типа TKOLFont, позволяющий настроить шрифт визуально в диалоге (на этапе разработки). Без этого волшебного расширения, имя шрифта придется набирать на клавиатуре. Автор пакета Александр a.k.a. Speller (Россия, Приморье).
6.19.2. Альтернативные пиктограммы компонентов
Пакет KOLmirrosGem содержит альтернативный набор пиктограмм для зеркальных компонентов MCK. Автор Роман Воробец.
7. Работа с расширениями
7.1. Установка расширений
Для установки расширений, имеющих зеркальные классы MCK, можно установить пакеты, содержащие зеркала этих (визуальных или невизуальных) объектов. Если такие пакеты не содержатся в дистрибутивном (поставляемом) архиве, или нет версии пакета, подходящей для вашей версии Delphi, то их можно создать самому, добавив в них модули, содержащие функцию Register. Именно функция Register обеспечивает регистрацию компонентов для помещения их на линейку компонентов Delphi.
Но очень важно не забывать, что вместе с каждым обновлением KOL и MCK, все пакеты, зависящие от MCK, должны быть собраны (Build) полностью. При наличии большого числа таких дополнительно установленных пакетов, немудрено забыть пересобрать какой-либо из пакетов. На этот случай я могу предложить простое решение: не устанавливайте пакет MirrorKOLPackageXX.dpk, и кучу пакетов дополнительно, а создайте свой собственный пакет MCK, куда включите все модули из главного пакета, и из всех пакетов, которые вам нужно устанавливать. В этом случае обновление версии будет сильно упрощено, так как достаточно будет пересобрать только один этот пакет.
Кроме того, расширения, даже имеющие зеркала времени конструирования, вполне возможно использовать без установки на палитру компонентов. Код для конструирования таких объектов, разумеется, следует написать самому. Или, установив такие расширения временно, скопировать (и поправить по необходимости) код, сгенерированный MCK, из inc-файла в событие OnFormCreate, после чего, удалить расширение с линейки.