- •Владимир Кладов, 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.5. Печать и подготовка отчетов
Печать документов в Windows – это не столь тривиальная задача, как может показаться на первый взгляд. Для этого необходимо, как минимум, обеспечить в своем приложении возможность для пользователя выбрать устройство печати (принтер), настроить его (выбрать размер и ориентацию бумаги, качество печати, другие опции, характерные для этого принтера, например – цветную или черно-белую печать). Кроме того, приложение должно уметь печатать документ независимо от таких технических характеристик устройства, как разрешение, например.
Все это выглядит не очень просто для программирования, если использовать напрямую только вызовы API. Не говоря уже о том, что при программировании чего-либо, завязанного на аппаратуру всегда лучше использовать код хорошо протестированный (в разных условиях и на различном оборудовании), нежели свой собственный, хорошо проверенный только для одной-двух конфигураций, с которыми вы лично сталкивались. Как сейчас помню, у моих программ несколько раз возникали проблемы именно с печатью на невиданном доселе печатающем оборудовании – только из-за того, что в свое время, при написании кода я не мог предусмотреть некоторых отклонений в параметрах устройства, таких, каких у меня не было под боком для тестирования момент написания кода.
6.5.1. Диалоги выбора принтера и настройки печати. Печать
Первую часть задачи вам помогут выполнить диалоги выбора принтера TPrintDlg и настройки принтера TPageSetupDialog от Богуслава Брандыса. Саму же печать можно выполнять с большим удобством, чем напрямую через API, если вы воспользуетесь объектом TPrinter того же автора, или TMHPrinter – от Дмитрия Жарова. Оба эти объекта для печати предоставляют канву для рисования и некоторый набор свойств и методов, удобный для организации процесса печати.
6.5.2. Печать отчетов
Еще более удобный интерфейс печати предоставляет пакет печати отчетов KOLReport (это моя разработка, использующая один из вышеуказанных модулей – по выбору – для выполнения низкоуровневой печати). На самом деле, этот модуль портирован из набора компонентов NormalReport, разработанного мною же для VCL.
Основное отличие этого пакета от всевозможных XXXXXReport, обычно использующихся программистами Delphi – в его минимальной визуальности. Для программиста, сталкивающегося с печатью раз от раза (то есть, крайне редко, как я), доскональное изучение любой системы подготовки отчетов, в которой визуальность доведена до убийственного совершенства, представляет определенные затруднения. Каждый раз, когда потребуется подготовить отчет, приходится вспоминать, где какие свойства и как поменять, чтобы все стало так, как тебе надо – задача не для слабонервных. Особенно это раздражает, если печатью приходится заниматься действительно редко, раз в пару месяцев или раз в полгода.
Поэтому я пошел по иному пути, чем обеспечивать полностью визуальный интерфейс времени разработки. Кроме того, какой бы сверх-навороченный этот интерфейс ни был, он все равно будет иметь какие-либо ограничения. А потом пойди, докажи пользователю, что его заказ с размещением логотипа вот в этом месте листа невыполним, или что такой вот способ переноса ячеек на другую строку не поддерживается компонентом печати, и он должен с этим смириться.
То, что в итоге получилось, на самом деле более удобно для программистов, которые прекрасно умеют писать код. Для программиста гораздо проще написать циклы и использовать однозначно понятные инструкции языка для проверки всех нужных условий, чем настроить сложный визуальный компонент, в котором еще и разобраться предварительно надо.
Итак, работа с KOLReport строится следующим образом. Сначала вы на форме (для этого можно выделить отдельную форму, или несколько отдельных форм) «рисуются» ячейки и строки ячеек отчета. Вообще, в качестве ячейки может сгодиться любой визуальный контрол, например, метка или панель. Но для того, чтобы ячейки имели белый фон и могли иметь настраиваемые рамки без дополнительного усложнения существования, в том же пакете реализованы конструкторы ячеек типа TReportLabel и TBand. Разумеется, они имеют MCK-зеркала, чтобы проектировать отчет можно было полу-визуально, используя среду MCK.
Те ячейки, которые используются для размещения фиксированной информации (текст и изображения), могут быть настроены на этапе разработки. Прочие ячейки будут получать свое значение непосредственно перед выполнением печати. Разумеется, достаточно «нарисовать» одну типовую линейку, заполнить ее непосредственно перед выдачей в отчет, а после отправки ее переиспользовать повторно, создавая столько линий в таблице, сколько необходимо. Процессом вывода линеек и отдельных ячеек, а так же сменой страниц занимается ваш код, размещаемый в обработчике события OnPrint. В вашем распоряжении имеется широкий набор методов для вывода ячеек, их форматирования, управления группировкой информации на листе и т.п. Но самым главным инструментом остается язык программирования.
С помощью такой системы подготовки отчетов совсем несложно выполнить самые невероятные требования пользователя. И, самое главное, такой код легко модифицировать в дальнейшем и совсем не сложно сопровождать (как я уже имел возможность убедиться на своем опыте). Для программистов, разрабатывающих проекты с использованием KOL, не лишним будет аргумент компактности получившегося приложения. Например, демонстрационное приложение занимает в скомпилированном виде не более 40Кбайт.