«Embarcadero Technologies Россия, СНГ 129343 Россия, Москва, проезд Серебрякова, 6; т. +7(495) 708-43-93 ТЕХНИЧЕСКАЯ СПРАВКА Преимущества перехода на Delphi XE Содержание Содержание ТЕХНИЧЕСКАЯ СПРАВКА Преимущества ...»
Преимущества перехода на Delphi XE
Что нового по сравнению с Delphi 7
Андреано Лануш (Andreano Lanusse)
Ноябрь 2010 г.
Embarcadero Technologies Россия, СНГ
129343 Россия, Москва, проезд Серебрякова, 6; т. +7(495) 708-43-93
ТЕХНИЧЕСКАЯ СПРАВКА Преимущества перехода на Delphi XE
Содержание
Содержание
ТЕХНИЧЕСКАЯ СПРАВКА Преимущества перехода на Delphi XE Новые и расширенные компоненты VCL
Generics
ТЕХНИЧЕСКАЯ СПРАВКА Преимущества перехода на Delphi XE Передача и получение объектов DataSnap
Редакции Delphi XE – Professional, Enterprise и Architect…
ТЕХНИЧЕСКАЯ СПРАВКА Преимущества перехода на Delphi XE
ВВЕДЕНИЕ
Многие пользователи Delphi хотят знать основные преимущества перехода на Delphi XE. Это – большое число новых возможностей, обеспечивающих небывалый рост производительности при создании высококлассных приложений. В этой статье представлено обсуждение основных причин перехода на версию XE благодаря новым возможностям, появившимся в Delphi, начиная с версии 7.Далее приводится краткая справка по самым важным новым функциям с разбивкой по релизам продукта после Delphi 7. А затем в основной части статьи проводится углубленный технический анализ перечисленных, а также других новых возможностей.
Delphi • Пространства имен для нескольких модулей, цикл for... in... do, директива inline для функций и другие возможности оптимизаций кода.
• Доступ к гетерогенным базам данных, многозвенная архитектура приложений • Рефакторинг, History view для исходного кода • Модульное тестирование Delphi • Code block completion/Surround (сервисы обрамления/завершения кода), Editor Change Bars • Live Code Templates (автоматизированные шаблоны кода) • UML-моделирование, аудиты, метрики, генератор документации • Шаблоны проектирования Delphi • MSBuild, Build Configurations • VCL - AJAX, совместимость с Vista • темы Vista и XP для приложений • новый dbExpress framework, delegate drivers («драйверы-делегаты»), поддержка баз данных в формате Unicode Delphi • Сквозная поддержка Unicode на уровне языка, библиотеки и среды разработки • Generics и анонимные методы Embarcadero Technologies ТЕХНИЧЕСКАЯ СПРАВКА Преимущества перехода на Delphi XE • Редактор ресурсов (Resource Editor), обозреватель классов (Class Explorer) • многозвенная архитектура DataSnap • новые компоненты VCL (Custom Hints, Ribbon Controls и т.д.) • локализация: встроенные и внешние сервисы для управления переводом Delphi • Поддержка Windows 7, множественного сенсорного ввода и ввода при помощи жестов, Direct-2D • IDE Insight, Source Code Formatter (сервис форматирования исходного кода), Search task bar • Фоновая компиляция • Расширенная RTTI • Точки останова в потоках, «заморозка/разморозка» потоков • DataSnap: поддержка протокола HTTP Delphi XE • DataSnap: поддержка HTTPS, JavaScript, REST • Интеграция с Subversion • Библиотека регулярных выражений • AQTime, CodeSite, Beyond Compare, Final Builder • Возможности взаимодействия с облачными сервисами и размещение в облачной инфраструктуре Очевидно, что миграция проектов на новые версии средств разработки требует времени, которое не всегда есть у разработчика.
Одной из основных причин миграции на Delphi XE, C++ Builder XE или RAD Studio XE является то, что при приобретении последних версий появляется возможность получить предыдущие без дополнительной платы.
Например, при покупке Delphi XE пользователь получает Delphi 7, Delphi 2007, Delphi 2009 и Delphi 2010.
Что нового в IDE
ИНТЕГРАЦИЯ С SUBVERSION – VERSION INSIGHT
Вместе с Delphi XE появляется возможность использовать популярную систему контроля версий Subversion для управления ревизиями исходного кода, как на уровне индивидуального разработчика, так и при групповой разработке.Данная возможность включает:
• Интеграция в Project Manager и History Manager • Поддержка основных команд для управления версиями, такими как import, update, commit и show log.
• Сервис отображения различий и выполнения слияний (difference and merge viewer) • Исходный код для поддержки функции интеграции с использованием Open Tools API в виде проекта с открытым исходным кодом Указанный проект доступен в исходном коде на сервисе SourceForge:
http://sourceforge.net/projects/radstudioverins/.
Но есть более простой путь получить доступ к нему, если версия XE уже приобретена. В поставку продукта входит исходный код в директорию с примерами RAD Studio (RAD Studio samples): «C:\Users\Public\Documents\RAD Studio\8.0\Samples)» (естественно, путь может быть другим).
Project Manager Новый Project Manager содержит много новых возможностей, которые помогут значительно повысить производительность:
• Сортировка содержимого в Project Manager: новая кнопка на инструментальной панели Sort By дает возможность упорядочивать элементы по имени, дате/времени, директории или типу файла. Также можно задать опцию Auto Sort, которая означает, что новые добавления в проект или в группу проектов будет производиться с учетом заданного параметра сортировки.
Рассмотрим еще некоторые функции Project Manager.
o Compile All From Here (компилировать всё с данного места) и Build All From Here (выполнить сборку всего с данного места): новое контекстное меню в Project Manager содержит новую команду, которая позволяет выполнять следующее:
o Compile All From Here (компилировать всё с данного места) o Build All From Here (выполнить сборку всего с данного места) o Clean All From Here (очистить всё с данного места) эти три команды запускают компиляцию, сборку или операцию очистки, которые начинаются, естественно, с текущего выделенного узла в проекте. Эти команды описаны в контекстном меню проекта.
• Compile All, Build All и Clean All: Эти новые команды контекстного меню доступны для групп проектов, которые содержат более одного проекта.
• Контекстное меню проекта содержит новую команду Install|Uninstall которая позволяет инсталлировать или удалять пакеты design-time.
Галерея (GALLERY) Галерея была расширена возможностью поиска для повышения производительности. Все элементы галереи появляются, но те, которые раньше были невидимыми, теперь просто отображаются серым цветом. Эта возможность реально поможет пользователям, которые переводят свои проекты с Delphi 7, где все мастера COM отображались, но нужно было знать, в каком порядке пользоваться ими. Теперь можно запускать любые мастера, которые доступны, а остальные также отображаются в недоступном виде. Соответственно, вопрос «куда делись остальные мастера» больше не возникает.
Фигура 1. Новая галерея проектов (Project Gallery) со встроенным поиском Новые опции проекта (PROJECT OPTIONS) В интегрированную среду разработки было внесено множество изменений, чтобы упростить и повысить скорость разработки. Теперь опции компиляции проекта отображаются в колонках и группируются по категориям в более наглядном виде. Также стало гораздо проще сохранять параметры конфигурации проекта или опции сборки, как показано на Фигуре 2.
Фигура 2. Параметры конфигурации сборки Параметры конфигурации сборки
(BUILD CONFIGURATIONS)
Компиляция и отладка проектов являются типовыми задачами для разработчиков. Однако опции проекта, которые используются для построения финальной версии (релиза) не всегда совпадают с опциями проекта, используемыми при отладке. На постоянную смену опций проекта приходится тратить много времени. Теперь этого можно избежать при использовании нового менеджера проектов (Project Manager). В Delphi XE функции управления параметрами конфигурации сборки встроены непосредственно в него.Кроме того, параметры конфигурации проекта могут быть сохранены в OPSET-файлах формата XML. Это позволяет многократно использовать именованные опции предыдущего проекта.
IDE INSIGHT
Новый сервис IDE Insight дает возможность вводить какое-либо название и затем выбирать из списка подходящих вариантов опцию проекта или параметр среды разработки. Поле ввода IDE Insight содержит множество категорий, таких как Commands, Files, Components, Project Options и т.д.При вводе строки поиска сервис IDE Insight выполняет инкрементный поиск: IDE Insight отображает только категории, в которых находятся найденные варианты вместе с наиболее точно совпадающим вариантом в каждой из них. Также можно нажать комбинацию кнопок Alt+A или кнопку в диалоговом окне IDE Insight для переключения между показанными категориями (с одним наилучшим совпадением на каждую категорию) или всеми совпадениями (что может потребовать прокручивание списка для выбора нужного элемента).
Фигура 3. IDE Insight При двойном клике на элементе в окне IDE Insight система автоматически вызывает или выполняет ассоциированное действие. Например, если введено слово «open», то в списке показаны все доступные элементы, название которых содержит подстроку «open». Если дважды кликнуть на название, соответствующее определенному диалогу, то он появится на экране. Если два раза кликнуть на названии компонента, содержащем слово «open»
(например, TOpenDialog), то компонент автоматически добавится на активную форму.
Мастер создания компонентов
(COMPONENT CREATION WIZARD)
Дизайн мастера создания и импорта компонентов был модифицирован для включения библиотеки типов, элементов управления ActiveX и сборок. Оба мастера могут производить инсталляцию в существующий или новый пакет (package).Как показано на Фигуре 4, добавлено новое поле ввода для фильтрации компонентов, что облегчает поиск класса компонента, выбранного в качестве базового.
Фигура 4. Выбор компонента-предка COM Мастера COM и библиотеки типов полностью изменены. Действительно, дизайн мастеров создания COM-объектов полностью изменился.
Рассмотрим, что появилось нового. В архитектуру COM был добавлен новый типа файлов – RIDL (Restricted Interface Definition Language). RIDL-файлы работают как «записывающие устройства» для сохранения библиотек типов проекта. Следовательно, бинарный файл библиотеки типов (.TLB) становится промежуточным, таким как.DCU,.RES,.OBJ и т.д. Это означает, что разработчики получили возможность перекомпилировать tlb-файлы из командной строки и даже редактировать tlb-файлы с использованием текстового редактора, отслеживая его версии.
Теперь библиотека типов использует текстовой файл (файл RIDL), а не TLB. Это – очень полезно:
Нет необходимости перегенерировать tlb-файлы. Теперь они автоматически генерируются на основе последней версии RIDL-файла.
Различные разработчики могут работать с одной и той же библиотекой типов. Это возможно, т.к. текстовые файлы можно «сливать» (merge), что было невозможно в случае с бинарными файлами, используемыми ранее.
RIDL-формат для библиотеки типов позволяет использовать более гибкий редактор.
Можно легко сравнивать разные RIDL-файлы.
Новый менеджер ресурсов (NEW RESOURCE MANAGER) Компилятор ресурсов позволяет выбрать между методом компиляции при помощи BRCC32.exe или RC.exe (компилятор ресурсов Microsoft Platform SDK). Компилятор ресурсов поддерживает символы Unicode в файлах ресурсов и именах файлов. Также он поддерживает новые типы ресурсов для Windows Vista (например, иконки и альфа-канал). Если используется компилятор ресурсов, нужно явно указать #include как для Delphi, так и C++.
Новый менеджер ресурсов позволяет добавлять множество файлов ресурсов (растровые изображения, иконки, шрифты…) в любой проект.
Фигура 5. Редактор ресурсов Управление опцией меню REOPEN FILES Теперь есть возможность управлять количеством файлов и проектов, которые отображаются в меню FileReopen menu. Можно задать количество проектов и файлов, которые будут появляться в списке, а также очистить этот список в случае необходимости.
USE UNIT – INTERFACE/HEADER
До выхода Delphi 2009 опция Use Unit декларировала модуль в разделе Implementation.Теперь можно выбирать, где декларация будет располагаться, Interface или Implementation для кода Delphi.
Кроме того, проекты могут включать десятки, сотни или даже тысячи модулей, то их декларирование через опцию Use Unit становится сложно. В этом случае появилась возможность использовать маски для фильтрации модулей и облегчения поиска, как показано на Фигуре 6.
Фигура 6. Новое окно Use Unit Обозреватель классов (CLASS EXPLORER) Обозреватель классов является очень мощным инструментом, который позволяет визуализировать иерархию классов и интерфейсов в рамках проекта, также как и добавлять свойства, методы и переменные в них. Эти операции можно выполнить посредством UML с помощью моделей классов. Возможности UML стали неотъемлемой частью Delphi, наряду с многими другими сервисами.
Фигура 7. Обозреватель классов (Class Explorer) Поиск компонентов в палитре В Delphi 2006 можно было фильтровать компоненты при вводе первых нескольких символов из названия в палитре компонентов. В Delphi 2007 эта возможность была расширена, и можно было вводить любую часть названия компонента. В Delphi XE используется поле ввода для достижения подобного результата, но более простым и ясным способом.
Пользователи, которые предпочитают использовать модель интерфейса как в Delphi 7 (т.е.
компоненты отображаются в верхней части среды разработки), будут рады узнать, что Delphi XE может выглядеть также как и Delphi 7.
Однако, перед переключением режима интерфейса к устаревшему виду Delphi 7, следует попробовать новую палитру инструментов в действии. Наглядное расположение компонентов, упорядоченное размещение по категориям и т.д. обеспечивают более высокую производительность.
Фигура 8. Поиск компонентов Классическая панель компонентов Многие разработчики предпочитают использовать классический вариант панели компонентов как в Delphi 7, что являлось причиной отказа от новых релизов. В Delphi 2010 (и, естественно, последующих версиях) можно пользоваться как классической, так и новой панелью компонентов.
Для активации панели компонентов нужно просто щелкнуть правой кнопкой мыши на главной панели и выбрать Component. После этого можно кликнуть правой кнопкой на инструментальную панель, чтобы получить список всех доступных категорий или просмотреть и выбрать конкретную.
Конфигурации палитры компонентов и панели компонентов независимы, поэтому можно реорганизовать категории. Это также касается поля для поиска компонентов на панели компонентов.
Фигура 9. Современная Delphi в стиле Delphi
РЕДАКТОР КОДА (CODE EDITOR)
Новая возможность в виде механизма Live Templates появилась в Delphi 2006 и позволяла создавать пользовательские шаблоны. Они сохраняются в виде XML-файлов и помогают уменьшать объем кода, вводимого вручную. Block completion автоматически вставляет begin и end. Даже такой простой сервис помогает значительно сэкономить время.Представим ситуацию: необходимо изменить имя всех переменных в выделенной части исходного кода. Команда Find..Replace не совсем удобна в этой ситуации. Она не гарантирует изменение только имен переменных. Начиная с Delhi 8 можно использовать инструмент Sync Edit для редактирования различных фрагментов кода одновременно, воздействуя на один и тот же идентификатор. В качестве примере рассмотрим код внизу, где выбирается блок кода, активируется сервис Sync Edit, а затем изменяется переменная «Comm» только один.
Фигура 10. Live Templates, Sync Edit, свёртка кода и другие возможности редактора кода Сбоку от блока кода можно видеть желтые и зелёные полоски. Жёлтые показывают участки, которые были измененные с последнего сохранения. Зелёные полоски, в свою очередь, показывают строчки, которые недавно были измененные и сохранены.
Также можно заметить «умную» нумерацию строк кода. Кроме того, есть функция сворачивания и разворачивания метода или класса непосредственно внутри блока.
Например, есть модуль, в котором представлены десятки методов. Оптимальным является выбрать время и привести код в порядок, однако это достаточно сложно. Код на картинке выше имеет область, обозначенную как «Metodos para habilitar e desabilitar o usuario». Эта область имеет два метода, объединенных общим смыслом. Методы невидимы, пока область не раскрыта. В ряде случаев эта возможность является полезной.
Вызов справки непосредственно из кода (Help Insight): нужно нажать F1 для просмотра документации по методу, типу, классу и т.д. Как можно видеть, на рисунке выше отображается информация из справочной системе по методу CreateCommand. То же самое срабатывает для любого метода, типа или класса, если для него имеется описание.
Как работает поиск ссылок на методы, классы, переменные или другие идентификаторы?
Например, в коде проекта есть класс, названный TCGC, который нужно переименовать в TCNPJ. Как определить, где в рамках проекта есть ссылки на данный класс TCGC? Find..Replace не будет работать в этом случае. Вместо этого нужно нажать Shitf + CTRL + Enter в классе TCGC.
Среда разработки найдет все ссылки в коде проекта, как показано ниже.
Фигура 11. Поиск ссылок Если теперь возникает необходимость переименовать все ссылки на TCNPJ, то эта возможность описана в разделе, посвященном рефакторингу.
Другая полезная возможность называется Surround («обрамление»). Она позволяет «обрамлять» блок кода конструкциями типа begin/end, if/begin/end, try/finally, try/except и т.д.
Форматирования исходного кода
(SOURCE CODE FORMATTER)
Среда Delphi дает возможность форматировать код в рамках шаблона по-умолчанию. Многие разработчики пользуются этим средством, однако многие предпочитают свой собственный стиль форматирования, что порождает большие дискуссии. Однако теперь это перестало быть проблемой.Теперь среда разработки обеспечивает полностью настраиваемый сервис форматирования кода, который активируется при нажатии CTRL + D. Это позволяет отформатировать модуль в соответствии с заданными настройками. Более того, можно использовать Project Manager для форматирования всех модулей, входящих в состав проекта.
Сервис IDE Insight Formatter (Фигура 12) позволяет задавать пользовательские опции для отступов, переходов на новую строку и изменение букв на заглавные, тогда исходный код будет отформатирован соответствующим образом.
Фигура 12. Окно задания опций сервиса форматирования Также реализована поддержка профилей, что позволяет переключаться между различными наборами параметров форматирования. Опции форматирования хранятся в конфигурационных файлах. Выбором профиля загружаются опции профиля, хранящиеся в соответствующем файле.
Для создания конфигурационного файла нужно использовать кнопку Save As. По-умолчанию конфигурационный файл имеет расширение.config.
Профили представляют собой особый вид конфигурационного файла. Профили имеют следующие дополнительные свойства:
Профили должны соответствовать маске Formatter_*.config (маска профиля).
Профили должны быть расположены в рабочей директории RAD Studio. По-умолчанию это папка «%APPDATA%\Embarcadero\RAD Studio\VersionNumber».
Поиск в редакторе кода Сервис поиска в редакторе кода был усовершенствован и теперь представляет собой вариант современную популярную реализацию (как, например, в Firefox и Internet Explorer). Теперь можно нажать CTRL + F и вводить слово для поиска, а результаты будут отображаться так, как показано на Фигуре 13. Первое вхождение слово от положения курсора подсвечивается черным, а все остальные вхождения – оранжевым.
Фигура 13. Поиск по слову «function» дает такие результаты Поиск в файле Поиск какого-либо содержимого в файлах является обычной задачей, которая требует значительного времени, тем более что не всегда поиск производится в нужных папках, которые имеют отношение к текущему проекту.
Начиная с Delphi 2010, была добавлена возможность поиска в выбранных директориях для операции «Find in Files» боле удобным способом. Можно сохранить список выбранных директорий, которые затем будут использоваться вместе с «Find in Files» на регулярной основе (см. Фигура 14).
Фигура 14. Окно поиска в файлах История изменений (CHANGE HISTORY) По мере изменения локальных файлов происходит сохранение их версий даже в отсутствии специализированной системы. Пользователь всегда имеет возможность сравнивать различные версии файла.
Фигура 15. История изменений (Change History) Если проект находится под управлением Subversion, то сервис истории изменений также отобразит различия между двумя ревизиями выбранного файла.
Рефакторинг (REFACTORING) Пользователям Delphi 7 однозначно понравится данная возможность. Рефакторинг – это технология для реструктуризации и модификации существующего кода при сохранении его функциональности. Рефакторинг позволяет убыстрить, упростить и улучшить и производительность, и читабельность кода приложения.
Delphi включает в себя сервис рефакторинга, который анализирует и выполняет операции реструктуризации.
Сервис также отображает изменения в режиме предварительного просмотра, которые появятся на панели рефакторинга в нижней части редактора кода.
Потенциальные операции рефакторинга отобразятся в узлах дерева, которые можно открыть, чтобы просмотреть дополнительные элементы, подверженные рефакторингу.
Предупреждения и ошибки также отобразятся на этой панели. К сервису рефакторинга можно получить доступ из главного, а также контекстно-зависимого меню.
Модульное тестирование (UNIT TESTING) Delphi включает в себя фреймворк DUnit для тестирования с открытым исходным кодом, позволяющий создавать и запускать автоматизированные тесты. Этот фреймворк упрощает процесс создания тестов для классов и методов приложения. Используя данную возможность в комбинации с рефакторингом, можно значительно повысить стабильность приложения.
Частое выполнение набора тестов по мере внесения изменения в исходный код проекта позволяет выявлять и исправлять ошибки на ранних стадиях процесса разработки.
Обозреватель данных (DATA EXPLORER) Теперь связь с базами данных для получения данных на этапе разработки стала гораздо проще. С использованием обозревателя данных с функцией «перетаскивания» можно получать доступ к таблицам, просмотрам и другим элементам в базе данных. Кроме этого, можно обрабатывать данные с использованием SQL. Соединения осуществляются посредством библиотеки dbExpress. Это означает, что обозреватель данных поддерживает все те платформы баз данных, которые поддерживает dbExpress.
Каждое соединение получает свой псевдоним, который сохраняется в файле dbxconnections.ini (конфигурационный файл для dbExpress). Информация о псевдонимах является доступной для всех подключений через данную библиотеку, поэтому обозреватель данных очень удобен в использовании.
Фигура 16. Обозреватель данных (Data Explorer) Окно SQL – построитель запросов
(SQL WINDOW - QUERY BUILDER)
Обозреватель данных позволяет строить сложные SQL-запросы с использованием интуитивно-понятного визуального интерфейса.Фигура 17. Окно SQL Фоновая компиляция (BACKGROUND COMPILATION) Начиная с Delphi 2010 можно осуществлять фоновую компиляцию. Таким образом, можно начать процесс компиляции в отдельном или параллельном потоке и продолжить работать в интегрированной среде, в то время как проект будет компилироваться.
Можно продолжить работу в интегрированной среде в течение компиляции проекта.
Например, можно редактировать конкретный файл даже в процессе его компиляции, а также задавать и модифицировать точки останова.
Фигура 18. Полупрозрачное диалоговое окно с фоновой компиляцией Отладчик Теперь отладчик имеет опцию «Thread View and Wait Chain Traversal» («просмотр потоков и отслеживание цепочек ожиданий»), которая имеет смысл только для Windows Vista и Windows 7. Эта возможность позволяет выявлять взаимные блокировки и конфликты между потоками.
В течение процесса отладки бывает полезным визуализировать значения переменных. Для этого очень хорошо подходит Watch List (список просмотра), но чем больше значений добавлено, тем более запутанной становится визуализация. Теперь разработчики могут группировать переменные в Watch List по именам. Пользовательские группы отображаются закладками в Watch List.
После того как отладка завершена, все модули, которые открыты в процессе, автоматически закрываются; только тем модули остаются открытыми, которые были таковыми перед запуском процесса отладки.
Появилось множество улучшений с точки зрения эргономики в окне визуализации локальных переменных, в окне call stack (стек вызовов) и др. Также появилось новое дерево просмотров содержимого отлаживаемых объектов, как показано на Фигуре 19:
Фигура 19. Отладчик Начиная с Delphi 2010, стало гораздо проще отлаживать многопоточные приложения. Новые возможности в отладчике позволяют выполнять пошаговую отладку в потоках, также как «замораживать» и «размораживать» потоки. Это позволяет изолировать потоки, которые нужно отладить, временно «замораживая» ненужные. Теперь есть опции в «Thread Status View», такие как «Freeze» («заморозить»), «Freeze All Other Threads» («заморозить все другие потоки»), «Thaw» («разморозить») и «Thaw All Threads» («разморозить все потоки»). Также теперь есть возможность задавать точки останова (breakpoint) для приостановки отдельного потока.
Визуализаторы в отладчике значительно упрощают отладку. Достаточно часто приходится визуализировать данные типа TDate, TTime и TDateTime. Среда разработки отображает значения этих типов в удобочитаемом формате – привычное отображение даты и времени вместо значений с плавающей точкой. То же самое справедливо для TStringList – список строк показывается в виде обычного текста.
Более того, можно добавлять свои собственные визуализаторы в отладчике для пользовательских типов данных.
Фигура 20. Визуализатор для типа данных TStringList Что нового в VCL и RTL Начиная с Delphi 7, библиотеки VCL и RTL постоянно расширяются. Помимо полной поддержки Windows XP, 200, Vista, Windows 7 и Unicode, были добавлены новые и расширены существующие компоненты за счет добавления новой функциональности.
Все эти нововведения повышают возможности компонентов в плане эргономики, облегчают процесс создания расширенных интерфейсов и позволяют использовать новую функциональность Windows Vista и Windows 7, также как и обеспечивают поддержку управления и ввода при помощи касаний и жестикуляции. В этом разделе рассматриваются нововведения в существующих компонентах и изменения в классах библиотеке RTL.
VCL Direct2D и Windows В Microsoft Windows 7 появилась возможность использовать Direct2D: API для 2-D графического вывода с аппаратным ускорением, что обеспечивает повышенную производительность при отображении двухмерных объектов, растровых изображений и текста. Программный интерфейс Direct2D API предназначен для взаимодействия с GDI, GDI+ и Direct3D. Direct2D перенаправляет все операции рисования в GPU (Graphic Processing Unit) вместо CPU, а это дает больше ресурсов приложению. Эта часть посвящена обсуждению того, как получить максимум преимущества от поддержки Direct2D в Delphi.
Direct2D поддерживается только в Windows 7 для проектов, сделанных в Delphi 2010 (или более поздней версии). Такие приложения на 100% совместимы с Windows 7 и используют все возможности этой новой операционной системы Microsoft, такие как Direct2D. Чтобы обеспечить поддержку Direct2D в разрабатываемом приложении, нужно включить следующие модули:
Direct2D, который экспонирует классы-оболочки в виде TDirect2DCanvas VCL D2D1, который содержит трансляцию заголовочных файлов в Microsoft Direct2D API Следующий пример демонстрирует, как переопределяется метод Paint формы с использованием класса TDirect2Canvas.
procedure T2D2Form.FormPaint(Sender: TObject);
LCanvas: TDirect2DCanvas;
begin LCanvas := TDirect2DCanvas.Create(Canvas, ClientRect);
LCanvas.BeginDraw;
LCanvas.Brush.Color := clRed;
LCanvas.Pen.Color := clBlue;
LCanvas.Rectangle(100, 100, 200, 200);
end;
Direct2D является естественной заменой Canvas, разница в качестве графического отображения очень велико, что и показано на Фигуре 21.
Фигура 21. Графика с использованием Direct2D Касания и жестикуляция (Touch and Gestures) Рынок разработки программных продуктов отличается от ситуации 2009 года. Теперь стали появляться приложения для камер, телефонов, приборов на основе GPS с использованием сенсорного ввода и управления на основе касаний и жестикуляции. Windows 7 ввела поддержку множественного сенсорного ввода (multi-touch), когда пользователи могут взаимодействовать с экранными приложениями двумя и более пальцами.
Перед тем, как начать разрабатывать приложение с сенсорным вводом, важно правильно классифицировать предполагаемый тип сенсорного ввода:
Базовый сенсорный ввод (Basic Touch) уже применяется в коммерческих приложениях, когда пальцы заменяют правую кнопку мыши, например, платежные Множественный сенсорный ввод элементы интерфейса приложения обеспечивают интенсивный ввод посредством касаний, например, iPhone и эпизод в фильме «Особое мнение» («Minority Report»). Данная возможность поддерживается только в Windows 7 и на новом аппаратном обеспечении.
Ввод и управление при помощи жестов перемещения пальцев или «мыши»
генерируют события.
Delphi обладает архитектурой, которая дает возможность пользователю подключить механизм интерпретации жестов. Данный механизм будет работать во всех поддерживаемых версиях Windows, а не только в Windows 7. Он поддерживает обратную совместимость с существующим аппаратным обеспечением и дает возможность пользователям эмулировать движение «мыши» или касание.
Библиотека VCL поддерживает интерпретацию более 30 стандартных заранее определенных жестов, также как и редактор для их создания, тестирования, хранения и последующего распознавания в виде элементов GESTURE. Кроме этого, Delphi включает компонент для эмуляции виртуальной клавиатуры (TTouchKeyboard).
Все визуальные компоненты имеют свойство Touch, который имеет вложенное свойство под названием Gesture Manager («менеджер жестов») для связи с соответствующим компонентом. Компонент Gesture Manager инкапсулирует в себе механизм управления при помощи жестов для всего приложения, он активирует действия для каждого жеста при помощи Action Manager. Это требует лишь простого связывания компонента Gesture Manager с компонентом Action Manager.
Фигура 22 демонстрирует окно Gesture Designer, которое позволяет записывать, воспроизводить и тестировать движения для создания жеста. Записанный жест потом может быть использован в компонентах VCL для активации соответствующего действия. Редактор также позволяет также изменять жест и варьировать чувствительностью при его восприятии.
Фигура 22. Gesture Designer позволяет записывать и редактировать жесты Ленточные элементы управления (RIBBON CONTROLS) «Ленточные» интерфейсы стали широко известны благодаря Office 2007. Такой тип интерфейса отлично комбинирует главное меню и инструментальную панель приложения.
Теперь библиотека VCL содержит группу «ленточных элементов управления» (Ribbon Controls) для создания интерфейсов Delphi-приложений в стиле Ribbon.
Архитектура в основе Ribbon Controls очень проста. На компонент Ribbon можно добавить закладку (Tab), которая содержит группы. Каждая группа содержит кнопки с управляемым внешним видом. Кроме того, компонент Ribbon включает Quick Access Toolbar и Application Menu. Фигура 23 демонстрирует пример приложения с Ribbon Controls.
Фигура 23. Ribbon Controls Поддержка WINDOWS VISTA и WINDOWS Библиотека VCL была обновлена для поддержки новых характеристик операционных систем Windows Vista и Windows 7, поэтому в её состав вошли новые компоненты TFileOpenDialog, TFileSaveDialog и TTastDialog.
Также были добавлены новые классы, например:
TFavoriteLinkItemsEnumerator TTaskDialogRadioButtonItem TFileTypeItem Компоненты типа Dialog отображаются в стиле Vista. Возможно, возникает вопрос, а что будет, если запустить приложение под управлением Windows XP. Здесь причин для беспокойства нет. Компоненты VCL распознают версию ОС, используют её особенности и формируют соответствующий вид.
Добавлена функция TaskMessageDlg для поддержки Windows Vista. Она обладает такой же функциональностью, что и MessageDlg, но также содержит особенности, характерные для Windows Vista. Когда приложение запускается под управлением Windows XP, автоматически выполняется MessageDlg. VCL берет на себя ответственность за решение данной проблемы.
Глобальная переменная UseLatestCommonDialogs определяет, что все компоненты типа Dialog (TOpenDialog, TSaveDialog, TOpenPictureDialog и TSavePictureDialog) должны отображаться в стиле Vista, как только она получает значение TRUE.
Например, ниже показано, как диалоги Open и Save выглядят в Windows Vista и Windows 7:
Фигура 24. Open Dialog в Windows Vista Фигура 25. Save Dialog в Windows Vista Перечисленные ниже модули были расширены для поддержки API новых версий Windows.
UxThemes – новый DwnApi – новый ActiveX – обновлен Windows – обновлен Messages – обновлен CommCtrl – обновлен Новые и расширенные компоненты VCL TActionManager Новые свойства – DisabledImages, LargeImages и LargeDisabledImages – позволяют задавать большие и неактивные изображения на основе компонента TImageList.
PNG Support Компонент Image поддерживает формат PNG.
TBitMap Компонент поддерживает 32-битные растровые изображения с альфа-каналом, а также дополнительное свойство AlphaFormat.
TButtonGroup Данный компонент позволяет группировать различные кнопки на панели.
TButtonEdit Новый компонент TButtonEdit дает возможность добавлять изображения к полю ввода Edit.
Изображения могут размещаться как справа, так и слева. Также можно управлять событиями изображений: onLeftClick и onRightClick.
TLinkLabel LinkLabel позволяет использовать тэги HTML, что изменяет внешний вид компонента.
TPopupActionBar Теперь поддерживает стили ActionBar.
THeaderControl и THeaderSection Поддержка нового checkbox.
TButton Windows Vista теперь определяет два новых стиля кнопки, которые оба поддерживаются в Delphi в классе TButton.
ComandLink имеет другой, более дружественный дизайн. Можно использовать его для добавления более тонкой настройки к функциональности кнопки.
SplitButton предлагает список опций при клике на нем. Список представлен как всплывающее меню. К пунктам меню можно добавить изображения.
Фигура 26. Новые стили кнопок TListView и TTreeView TListView теперь позволяет определять основную и дополнительную группы. Дополнительная группа поддерживает более глубокую настройку (для Vista), позволяя задавать изображения для каждой из них. TTreeVeiw позволяет включать/выключать узлы и изображения для раскрываемых элементов.
Фигура 27. TListView TBalloonHints «Подсказки» (hints) теперь имеют вид Windows Vista и позволяют добавлять заголовки, описания и изображения, которые делают пользовательские уведомления более дружественными.
Фигура 28. Balloon Hints TCategoryPanelGroup Этот новый компонент очень полезен. Он работает как панель Outlook, к которой можно добавить много других различных панелей. Каждая из этих панелей может содержать любые компоненты VCL. Можно задавать заголовок, изображение, выравнивание и иконку для каждой из панели, а потом разворачивать и сворачивать их.
Фигура 29. Panel Group Новые панели Традиционные панели являются визуальным контейнерами для других компонентов. Внутри панели можно размещать визуальные элементы управления в любом порядке и количестве.
Другими словами, он работает по принципу абсолютного позиционирования (координаты Top и Left конкретного элемента управления задают положение относительно верхнего левого угла панели).
По аналогии с концепцией, принятой в средствах разработки для Java (а именно, «менеджер расположения» - Layout Manager), которая предопределяет, как элементы управления размещаются внутри контейнера, теперь в Delphi есть три типа менеджеров расположения:
TPanel : абсолютная расположение или XY. Компоненты размещаются в фиксированных, точных позициях.
TFlowPanel : компоненты размещаются последовательно в соответствии с определенным порядком (наподобие страницы HTML, но без таблиц или каскадных таблиц стилей CSS).
o Размещение определяется свойством FlowStyle, которое может принимать различные значения, указанные ниже. В порядке понимания соглашения об именах, следует понимать, что компоненты располагаются в соответствии с направлением, заданным первой парой (например, LeftRight). Когда на панели больше нет места, направление переопределяется второй парой (например, fsLeftRightTopBottom: слева направо, сверху вниз (по-умолчанию) fsRightLeftTopBottom: справа налево, сверху вниз fsLeftRightBottomTop: слева направо, снизу вверх fsRightLeftBottomTop: справ налево, снизу вверх fsTopBottomLeftRight: сверху вниз, слева направо fsBottomTopLeftRight: снизу вверх, слева направо fsTopBottomRightLeft: сверху вниз, справа налево fsBottomTopRightLeft: снизу вверх, справа налево o Еще одно полезное свойство – AutoWrap. Когда его значение true, это означает, что размещение будет «перенаправлено» на другое направление, если панель не умещается в отведенное ей пространство. Когда его значение false, компоненты на панели, которые выходят за границы, будут невидимыми.
o Можно использовать эту панель для автоматической генерации форм, когда поля будут задаваться динамически либо из базы данных, либо из файла. В этом случае не надо беспокоиться о позиционировании каждого из полей.
Фигура 30. Автоматическая генерация формы TGridPanel : эта панель разделена на участки по вертикали и горизонтали (строками и колонками). Каждая образованная ячейка может содержать компонент (подобно o Компоненты размещаются в соответствии с положением их ячеек (сверху вниз) o Количество строк задается свойством RowCollection, которое может содержать различные объекты класса TRowItem. Каждый элемент имеет два свойства:
SizeStyle: определяет стандарт, по которому высота строки задается Value: значение задает высоту в соответствии со значением свойства o Подобно вышеизложенному, число колонок задается свойством ColumnCollection, которое содержит объекты класса TColumnItem. TColumnItem имеет такие же свойства, что и TRowItem, отличающиеся только тем, что они относятся к ширине колонки, а не высоте строки.
o Свойство ExpandStyle задает действие, которое происходит, когда происходит попытка добавить новый компонент на панель, а свободных ячеек уже нет.
emAddRows: добавляется новая строка к панели для размещения нового emAddColumns: новая колонка добавляется для размещения нового emFixedSize: возникает исключение, когда больше нет места для ТЕХНИЧЕСКАЯ СПРАВКА Преимущества перехода на Delphi XE Фигура 31. Expand Property Style TCategoryButtons Этот компонент позволяет создавать кнопки и группировать их по категориям, подобно тому, как это происходит на панели Outlook. Это позволяет добиться более высокого уровня эргономичности дизайна интерфейсов приложений.
Фигура 32. TCategoryButtons TDrawGrid, TStringGrid, TDBGrid Поддержка «тем» и стилей градиента введена в «сеточные» компоненты.
TTrayIcon Этот компонент служит для создания интерактивных иконок в области «Windows tray». Теперь можно использовать эту возможность для обычных приложений гораздо более простым способом. Для этого нужно всего лишь разместить компонент TTrayIcon (закладка Win32) на главную форму. Далее нужно задать небольшое количество свойств:
Icon: предназначено для хранения иконки, которая будет отображаться в области tray.
Можно использовать иконку приложения или любую другую для описания статуса или ситуации. Эта иконка может быть изменена в любое время.
Icons: содержит ссылку на TImageList, содержащий несколько растровых изображений или иконок, которые будут использованы в анимации.
Animate: когда значение этого свойства True, то происходит автоматическая ротация иконок в списке Icons. Индекс иконки, которая отображается в текущий момент, может быть как получен, так и задан при использовании свойства IconIndex.
AnimateInterval: интервал в миллисекундах, определяющий процесс ротации иконок.
Событие OnAnimate генерируется после каждой итерации, позволяя управлять выполняемым действием.
BaloonTitle и BaloonHint: заголовок и текст подсказки в стиле «balloon», отображаемой методом ShowBalloonHint. Данная подсказка может быть закрыта простым «кликом»
(как в любом месте подсказки, так и на кнопке [х]). Однако подсказка будет скрыта автоматически по прошествии интервала времени, заданного свойством BalloonTimeout (в миллисекундах).
PoupMenu: служит для добавления контекстного меню к иконке для ускорения пользовательского доступа к наиболее часто используемым командам. Единственное, что нужно сделать, это ассоциировать уже имеющееся контекстное меню с этим свойствам. Для доступа к этому меню нужно «кликнуть» левую кнопку «мыши» на Можно скрыть главную форму (с использованием метода Hide или свойства Visible := False) без остановки приложения. В этом случае важно обеспечить иконку tray контекстным меню или определить событие (например, OnMouseClick), чтобы снова передать управление главной форме приложения.
Фигура 33. Tray Icon VCL – границы и выравнивание Помимо улучшений существующих и добавления новы компонентов в VCL, также появились три новых класса:
TCustomeTransparentControl Теперь в класс TConrol добавлены дополнительные свойства (Margins, класс TMargins).
TMargins используется в свойстве Margins класса TConrol и его потомках. TMargins помогает задавать относительное взаиморасположение между компонентами на форме и границами формы и компонентами. Например, если установить левое поле (margin) для компонента как 10 пикселей, никакой из компонентов не сможет расположиться ближе, чем на 10 пикселей к границе контейнера или другого компонента по левой границе. Количество пикселей, которые разделяют два компонента, есть сумма пикселей полей этих компонентов.
Компонентам класса TWinControl добавлено новое свойство – Padding, класс TPadding, потомок TMargins.
Padding добавляет пространство вдоль границы элемента управления. Дочерние компоненты выравниваются относительно родительского внутри последнего в соответствии с этим свойством. Свойство Padding не воздействует на дочерние элементы управления, которые не выровнены (aligned) относительно родительского компонента, а также размер ClientArea.
Свойство Padding по своей сути противоположно Margins. Margins воздействует на расположение элементов управления внутри родительского, тогда как Padding определяет выравнивание дочерних элементов управления относительно родительского.
Прозрачные элементы управления (Transparent Controls) Новый класс TCustomTransparentControl может быть использован для компонентов, которые нужно временно скрыть. Хорошей метафорой здесь является стеклянная дверь или окно.
Такие компоненты будут присутствовать, но визуально определить их наличие будет нельзя.
Чтобы почувствовать разницу нужно выполнить следующий тест: создайте новое VCLприложение (File | New | VCL Forms Application – Delphi for Win32). Разместите две кнопки TButton и две метки TLabel на форме.
Фигура 34. Прозрачные элементы управления Обеим кнопкам установите свойство Top как 40; для свойства Left компонента Button 1 и Button 2 как 30 и 210, соответственно. Далее нужно ввести код, как показано ниже. Заметьте, что форма реализует события OnCreate, OnDestroy и OnClick, а обе кнопки имеют одинаковое событие OnClick.
Здесь созданы: потомок TCustomTransparentControl – TtransparentControl и потомок TCustomControl – TOpaqueControl. Они создаются динамически в событии OnCreate формы и располагаются над существующими элементами управления. Также добавлено событие OnClick для демонстрации их поведения. Результат показан на Фигуре 35.
Фигура 35. Пример прозрачного элемента управления (Transparent Control) type TTransparentControl = class(TCustomTransparentControl) protected procedure Paint; override;
end;
TOpaqueControl = class(TCustomControl) protected procedure Paint; override;
end;
TfCustomTransparentControl = class(TForm) procedure Button1Click(Sender: TObject);
procedure FormClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
InvCon : TTransparentControl;
VisCon : TOpaqueControl;
procedure ControlClick(Sender: TObject);
end;
fCustomTransparentControl: TfCustomTransparentControl;
implementation {$R *.dfm} { TTransparentControl } procedure TTransparentControl.Paint;
const txt = 'Transparent';
begin Canvas.Ellipse(0,0,Width,Height);
Canvas.TextOut((Width - Canvas.TextWidth(txt)) div 2, Height div 2, txt);
end;
{ TOpaqueControl } procedure TOpaqueControl.Paint;
const begin Canvas.Ellipse(0,0,Width,Height);
Canvas.TextOut((Width - Canvas.TextWidth(txt)) div 2, Height div 2, txt);
end;
procedure TfCustomTransparentControl.FormCreate(Sender: TObject);
begin InvCon := TTransparentControl.Create(Self);
InvCon.Parent := Self;
InvCon.SetBounds(10,10,100,100);
InvCon.OnClick := ControlClick;
VisCon := TOpaqueControl.Create(Self);
VisCon.Parent := Self;
VisCon.SetBounds(200,10,100,100);
VisCon.OnClick := ControlClick;
end;
procedure TfCustomTransparentControl.FormDestroy(Sender: TObject);
begin InvCon.Free;
VisCon.Free;
end;
procedure TfCustomTransparentControl.Button1Click(Sender: TObject);
begin ShowMessage('You have clicked on ' + (Sender as TButton).Caption);
end;
procedure TfCustomTransparentControl.ControlClick(Sender: TObject);
begin ShowMessage('You have clicked on control ' + (Sender as TControl).ClassName);
end;
procedure TfCustomTransparentControl.FormClick(Sender: TObject);
begin ShowMessage('Form clicked!');
end;
Пользовательское сообщение CM_INPUTLANGCHANGE было добавлено в компоненты VCL для уведомления, когда изменяется язык в операционной системе, так что это может быть учтено в приложении без перезапуска операционной системы.
Иконки (icons) могут теперь быть ассоциированными с растровыми изображениями (bitmaps), а TImage поддерживает TIFF.
Новый выпадающий список в Month Calendar для задания свойства типа «дата» в Инспекторе объектов (Object Inspector) помогает задавать значения соответствующих свойств, также как новый редактор свойство для значений типа Boolean.
Другие новые возможности, реализованные в Delphi: изменение имен компонентов TCategoryBottons, метод CheckAll(cbUnchecked, True, True) для TCheckListBox, функция PtInCircle в модуле “Types” (подобная “PtInRect”), свойство ActiveLineNo, которое возвращает правильную позицию курсора в компоненте TRichEdit и новый модуль IOUtils.pas, реализующий 3 новых статических класса TDirectory, TPath и TFile, которые содержат много полезных статических методов для ввода/вывода.
Кроме того, есть еще десятки улучшений в VCL, которые здесь не описаны, но информацию о которых можно получить посредством использования справочной системы.
В завершение этого раздела следует сказать, что некоторые методы VCL стали inlineметодами и, следовательно, их производительность возросла, что также благоприятно сказалось на быстродействии всей библиотеки VCL.
Поддержка INTELLIMOUSE IntelliMouse – так теперь называется поддержка прокрутки при помощи колеса «мыши» в разрабатываемых приложениях. Эта технология была впервые введена в VCL версии Delphi 2006. Для ее использования нужно задекларировать модуль IMOUSE в коде приложения.
TOBJECT
«Прородитель» всех компонентов в Delphi также был расширен:o Class function UnitName: string o Function Equals(Obj : TObject) : Boolean; virtual o Function GetHashcode : Integer; virtual o Function ToString; virtual Несколько дополнительных перегрузок следующих методов Тип возвращающих значений функций, представленных ниже, изменен с ShortString на String для поддержки Unicode Другие компоненты – TPanel, TProgressBar, TTrayIcon, TScreen и TRadioGroup также содержат множество улучшений.
Новый менеджер памяти и новые функции RTL Многие функции RTL были улучшены для повышения производительности. Использование FASTMM является одним из ключевых этих улучшений. Новый менеджер памяти FASTMM для приложений Win32 дает возможность приложениям показывать более высокую производительность, начиная с Delphi 2006, и идентифицирует утечки памяти простой декларацией ReportMemoryLikeonShudown := True в любой части кода программы.
Естественно, рекомендуется добавлять данную строчку в разделе initialization.
Сложно переоценить факт того, что в Delphi 2006 и более поздних выпусках приложения работают существенно быстрее в дополнение к возможности определять утечки памяти.
Поддержка клиентов SOAP 1. В Delphi 2010 введена поддержка клиентов SOAP 1.2 при помощи компонента THTTPRIO. В Delphi XE компонент THTTPRIO экспонирует новые свойства, что позволяет разработчику выбирать Client Certificate в design-time.
Регулярные выражения (Regular Expression) В Delphi XE введена поддержка регулярных выражений (модуль RegularExpressions).
Регулярные выражения обеспечивают прямые и гибкие средства проверки соответствия строк текста, такие как частичные совпадения символов, слов или шаблонов символов.
Следующий пример показывает, как использовать регулярные выражения для проверки корректности IP-адресов.
program RegExpIP;
{$APPTYPE CONSOLE} uses SysUtils, RegularExpressions;
ipRegExp : String;
begin ipRegExp := '\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.’ + ‘(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25’ + ‘[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]’ + ‘|2[0-4][0-9]|[01]?[0-9][0-9]?)\b';
if TRegEx.IsMatch(paramstr(1), ipRegExp) then Writeln('Text DOES match the regular expression') Writeln('Text DOES NOT match the regular expression');
Writeln(E.ClassName, ': ', E.Message);
end;
Если передать параметр 200.100.2.21 (корректный IP), то результатом будет:
Text DOES match the regular expression Классы для объектно-ориентированного ввода/вывода в файлы и директории В Delphi 2010 появился новый модуль IOUtils, содержащий три статических класса: TDirectory, TPath и TFile. Эти классы экспонируют ряд статических методов, полезных для задач ввода/вывода. Большинство методов по функциональности и сигнатуре совместимо с классами.NET: System.IO.Directory, System.IO.Path и System.IO.File.
Следующий код демонстрирует, как следует выполнять чтение всех файлов в папке.
procedure TForm2.Button2Click(Sender: TObject);
begin if not TDirectory.Exists(edtPath.Text) then Caption := edtPath.Text;
ListBox1.Clear;
for Path in TDirectory.GetFiles(edtPath.Text, ‘*.*’) do Listbox1.Items.Add(Format('Name = %s', [Path]));
end;
100% Unicode Одной из наиболее амбициозных задач перед командой разработчиков Delphi оказалась поддержка Unicode на уровне языка, VCL, RTL и IDE, а также всей экосистемы сообщества разработчиков, партнеров и пользователей.
При подготовке процесса перехода на Unicode было проведено множество встреч с программистами, преподавателями, консультантами и технологическими партнерами.
Основной целью данных рабочих встреч было подготовить наших технологических партнеров к тому, что их разработки должны были полностью соответствовать Unicode-версиям Delphi, а программистам показать, как они смогут работать с Unicode.
Unicode представляет собой стандарт, позволяющий получить компьютерное представление и работать с любой системой записи.
- The Unicode Standard: Version 5.0. 5. ed. Addison-Wesley Professional, 2006. 1472 p Многие наборы символов, такие как китайский, японский и русский, наряду с другими азиатскими вариантами, представимы при помощи Unicode. Наиболее часто употребимые кодировки – UTF (Unicode Transform Format) и UCS (Universal Character Set). Чтобы получить подробную информацию по Unicode, следует обратиться по адресу:
http://en.wikipedia.org/wiki/Unicode.
Результатом всего этого явилось то, что теперь Delphi поддерживает Unicode на 100%.
Возникает вопрос, а на сколько проста миграция? Миграция достаточно проста, а VCL и компилятор хорошо обрабатывают сложные ситуации. В случае необходимости получить исчерпывающую информацию по проблеме перехода на Unicode, рекомендуется проработать технический документ под названием “Delphi Unicode Migration for Mere Mortals”, которая доступна по адресу http://edn.embarcadero.com/article/40307.
Одним из главных изменений в современных версиях Delphi является то, что теперь строковые типы основаны на UNICODE. AnsiString и WideString на основе стандарта ANSI продолжают работать как и ранее с учетом размера строк в байтах.
Краткий список изменений для поддержки Unicode:
String теперь означает UnicodeString, а не AnsiString Char теперь означает WideChar (2 байта, а не 1), представляющий собой символ UTF- PChar означает PWideChar AnsiString означает “старый” тип String Изменения не коснулись:
AnsiChar, PAnsiChar Short string содержит элементы AnsiChar Неявное преобразование продолжает работать.
Активная кодовая страница управляет режимом (ANSI или Unicode), так что строки ANSI попрежнему поддерживаются.
Операции, которые не зависят размера символа:
Конкатенация строк Стандартные функции для работы со строками. Например, Length, Copy, Pos и т.д.
Операторы. Например,, CompareStr(), CompareText(), etc.
Операции, которые подразумевают использование размера символа в байтах, могут потребовать изменений. Никаких особых сложностей нет, но главным советом является следующее: уделяйте особое внимание коду, который:
1. Подразумевает, что Sizeof(Char) возвращает 1.
2. Подразумевает, что размер строки равен числу байтов в строке.
3. Прямое обращение String или PChar 4. Сохранение или чтение строки из/в файл.
Пункт 1 и 2 не будут работать в Unicode, т.к. Sizeof(Char) есть 2 байта, а размер строки в байтах в два раза больше ее длины. Кроме того, программный код, который выполняет сохранение и чтение из файлов, должен оперировать правильным числом байтов для выполнения операции, т.к. символ больше не представляется 1 байтом.
Миграция не представляет особых проблем в большинстве случаев. Основным преимуществом от поддержки Unicode является то, что разработчики могу распространять свои приложения по всему миру. Бразилия представляет собой одну из самых больших территорий, где производится создание программного обеспечения для глобального рынка.
Многие бразильские компании распространяют свои приложения и/или обмениваются информацией с Китаем, Японией, Россией и другими странами, где поддержка Unicode является критической.
В 2007 году правительство России приобрело 1 миллион лицензий Delphi для использования в обучении в начальных и высших школах программированию на Delphi. Следовательно, поддержка Unicode жизненно необходима в этой стране.
Новые языковые возможности и ресурсы компилятора Расширенная RTTI Система динамической идентификации типов данных RTTI обеспечивает информацию об объектах, таким образом, позволяя взаимодействовать объектам в приложении. Сама IDE в Delphi является одним большим примером использования RTTI, когда мы используем инспектор объектов, редактор кода, средства моделирования и другие ресурсы.
Эволюция и развитие других языков программирования изменили методы и способы кодирования. Приложения, созданные при помощи Java и.NET, хорошо иллюстрируют эти нововведения, когда современный язык программирования предоставляет новый уровень динамического взаимодействия. Вместе с расширенной поддержкой RTTI в Delphi 2010, Delphi for Win32 в данный момент обладает всей мощью.NET и Java. Новая система RTTI (RTTI.pas) является полностью объектно-ориентированной и позволяет создавать и обеспечивать взаимодействие между объектами более динамичным способом.
Атрибуты (Attributes) Как известно, техника применения пользовательских атрибутов широко применяется программистами Java и.NET. Пользовательские атрибуты представляют собой очень интересную возможность, которая успешно применяется в различных фреймворках, таких как Hibernate,.NET и Java.
Атрибуты позволяют определять классы и особые свойства для их элементов. Есть несколько примеров того, как могут быть полезны атрибуты. Самый лучший пример использования атрибутов – создание фреймфворка “объектно-реляционного отображения” (O/R Mapping).
Атрибуты определяются обязательным образом в классах. Классы атрибутов наследуют TCustomAttribute. Приемер: TableAttribute – есть класс, который будет использован для отображения классов приложения на базу данных, а свойство TableName задает название таблицы.
Зададим таблицу отображения атрибутов и будем использовать ее в своих классах.
Например: класс TClient реализует отображение на таблицу CUSTOMER (CLIENTE) базы данных.
В этом примере мы используем атрибуты для отображения только класса, но мы также можем отобразить переменные, свойства, параметры методов и т.д.
Атрибуты пользователя были добавлены в Delphi 2010 и помогли выйти языку программирования на новый уровень, открыв перспективу дальнейшего развития. Уже сейчас можно использовать всю мощь, предоставляемую атрибутами.
Функция Exit Функция Exit теперь может принимать параметр, означающий результат. Параметр функции System.Exit должен быть такого же типа, что и возвращаемое результирующее значение.
function doValidate( I : Integer) : boolean;
begin end;
Директива Inline Компилятор Delphi позволяет маркировать процедуры и функции директивной inline, наличие которой повышает быстродействие. Если процедура или функция удовлетворяет определенным критериям, то компилятор вставляет код непосредственно в точку вызова, а не генерирует обычный вызов. Метод “подстановки в строку” (inlining) позволяет оптимизировать производительность, что порождает более быстрый код, однако за счет увеличение его размера. Бинарный файл, генерируемый компилятором, в этом случае будет больше по размеру. Директива inline используется при декларировании и определении функций или процедур, как любая другая директива.
program InlineDemo;
{$APPTYPE CONSOLE} uses MMSystem;
function Max(const X,Y,Z: Integer): Integer;inline begin end;
const Times = 10000000; // 10 million A,B,C,D: Integer;
Start: LongInt;
i: Integer;
begin A := Random(4242);
B := Random(4242);
C := Random(4242);
Start := TimeGetTime;
for i:=1 to Times do Start := TimeGetTime-Start;
writeln(A,', ',B,', ',C,': ',D);
writeln('Calling Max ',Times,' times took ',Start,' milliseconds.');
end.
Когда выполняется код, представленный выше, метод Max вызывается 10 миллионов раз.
Показанные ниже цифры могут варьироваться в зависимости от конкретного компьютера.
При использовании Pentium M 1.8 ГГц с оперативной памятью 2 Гб, получены следующие результаты:
Директива inline носит рекомендательный характер для компилятора. Не существует абсолютных гарантий того, что компилятор сделает iniline-подстановку для конкретной функции, т.к. есть ряд обстоятельств, когда строчная подстановка не может быть осуществлена. Следующий список показывает условия, когда inline-подстановка не будет выполнена:
Подстановка в строку не будет осуществлена в любом случае метода позднего связывания: virtual, dynamic или message.
Процедуры или функции, содержащие ассемблерный код, никогда не будут подставлены в строку.
Конструкторы и деструкторы никогда не будут подставлены в строку.
Основной программный блок, раздел initialization и раздел finalization не могут быть подставлены в строку.
Процедуры или функции, которые не объявлены заранее, не могут быть подставлены в Процедуры или функции, которые принимают параметры open array, не могут быть подставлены в строку.
Код внутри пакета (package) может быть подставлен в строку, однако действие данной директивы не преодолевает границы пакетов (packages).
Подстановка в строку невозможна, если модули связаны кольцевой зависимостью. Это также включает непрямые кольцевые ссылки, например, модуль A использует модуль B, а модуль B использует модуль C, который, в свою очередь, использует модуль A. В этом примере, при компиляции модуля A, никакой код ни из модуля B, ни из модуля C, не будет подставлен в строку в модуле A.
Компилятор может выполнять подстановку в строку, когда модуль связан кольцевой зависимостью, если код, подлежащий подстановке, берется из не вовлеченного в зависимость модуля. В примере, представленном выше, если модуль A использует модуль D, код из модуля D может быть подставлен в модуль A, т.к. он не вовлечен в кольцевую зависимость.
Если процедура или функция определена в секции interface и осуществляет доступ к чему-либо, определенному в разделе implementation, эта процедура или функция не может быть подставлена в строку.
Если процедура или функция обозначена как inline и использует что-то из другого модуля, все эти модули должны быть перечислены в разделе uses, иначе процедура или функция не может быть подставлена в строку.
Процедура или функция, в которой используется условные выражения в операторах while-do и repeat-until, не могут быть подставлены в строку.
Внутри модуля тело inline-функции должно быть определено перед ее вызовом. В противном случае, тело функции, которое не известно компилятору в момент обработки точки вызова, не будет подставлено inline.
Если производится модификация реализации inline-процедуры или функции, то это приведет к перекомпиляции всех модулей. Это несколько отличается от традиционной практики перестроения всего проекта, когда перестройка вызвана изменением только интерфейсной части модуля.
Перегрузка операторов Delphi позволяет перегружать определенные функции или “операторы” в рамках декларации записей (records). Название функции оператора соответствует символьному представлению исходном коде. Например, оператор Add соответствует символу +. Компилятор генерирует вызов перегруженного варианта, соответствующему данному контексту (например, типу возвращаемого значения, типу параметров, используемых в вызове) с точки зрения сигнатуры операторной функции.
Ниже представлен пример работы с операторами складывания, вычитания, а также операторами явного и неявного преобразования:
TMyClass = record class operator Add(a, b: TMyClass): TMyClass; // Addition class operator Subtract(a, b: TMyClass): TMyClass; // Subtraction class operator Implicit(a: Integer): TMyClass; // integer to TMyClass class operator Implicit(a: TMyClass): Integer; // TMyClass to integer class operator Explicit(a: Double): TMyClass; // Double to TMyClass end;
// Method implementation example. Add class operator TMyClass.Add(a, b: TMyClass): TMyClass;
begin end;
x, y: TMyClass;
begin x := 12; // Implicit conversion of Integer, executes Implicit method y := x + x; // Executes TMyClass.Add(a, b: TMyClass): TMyClass b := b + 100; // Executes TMyClass.Add(b, TMyClass.Implicit(100)) end;
Никакие другие операторы помимо тех, что перечислены в таблице, не могут быть определены в записи.
Перегруженные методы операторов не могут быть вызваны по имени в исходном коде. Для доступа к специфическому операторному методу специфического класса или записи, нужно выполнить явное преобразование типов над операндами. Идентификаторы операторов не включаются в список методов записи. Нельзя делать никаких предположений относительно дистрибутивных или коммутативных свойств операции. Для бинарных операций, первый параметр всегда есть левый операнд, а второй параметр – всегда правый операнд.
Ассоциации подразумеваются «слева направо» в отсутствии явных скобок.
Разрешение операторных методов делается по совокупности доступных операторных типов, используемых в операции (заметим, что это включает унаследованные операторы). Для операций, подразумевающих два различных типа A и B, если тип A имеет неявное преобразование в тип B, а тип B имеет явное преобразование в A, то возникнет неоднозначность (ambiguity). Неявное преобразование нужно реализовывать только в случае абсолютной необходимости и стараться избегать рефлексивности. Самое лучше, это разрешить неявное преобразования типа B в тип A, а тип A не должен ничего знать о типе B (или наоборот).
Главным правилом является следующее: операторы не должны изменять операнды. Вместо этого, они должны возвращать новое значение, созданное в процессе выполнения операции над параметрами. Перегруженные операторы чаще всего используются в записях (т.е. value types).
“Помощники” классов (Class Helpers) “Помощник” класса представляет собой тип, который, будучи ассоциированным с другим классом, вводит дополнительные методы и свойства. Эти методы и свойства могут быть использованы в контексте ассоциированного класса (или его потомков). Помощники класса представляют собой способ расширить класс без наследования. Помощник класса просто вводит более широкую область для компилятора при разрешении имен идентификаторов.
Когда происходит декларация помощника класса, нужно указать имя помощника, а также имя класса, который будет расширен при помощи помощника. Можно использовать помощника класса в любом месте, где можно сделать расширение класса классическим способом. При разрешении область включает в себя базовый класс, а также помощника класса.
Помощники классов обеспечивают еще один способ расширить класс, но их нельзя рассматривать в качестве средства проектирования, которое следует использовать при разработке объектно-ориентированного кода. Их следует использовать только по прямому назначению, т.е. для связи языковой и платформенной RTL. Ниже представлен наглядный пример.
type TMyClass = class procedure MyProc;
function MyFunc: Integer;
end;
procedure TMyClass.MyProc;
X: Integer;
begin end;
function TMyClass.MyFunc: Integer;
begin end;
type TMyClassHelper = class helper for TMyClass procedure HelloWorld;
function MyFunc: Integer;
end;
procedure TMyClassHelper.HelloWorld;
begin Writeln(Self.ClassName); // Self refers to TMyClass, not TMyClassHelper end;
function TMyClassHelper.MyFunc: Integer;
begin end;
X: TMyClass;
begin X := TMyClass.Create;
X.MyProc; // Executes TMyClass.MyProc X.HelloWorld; // Executes TMyClassHelper.HelloWorld X.MyFunc; // Executes TMyClassHelper.MyFunc end.
Обратим внимание, что ссылка всегда указывает на TMyClass. Компилятор сам понимает, когда следует вызов из TMyClassHelper.
Strict Private и Strict Protected В Delphi есть две опции, которые определяют видимость атрибутов класса: strict private и strict protected.
Strict private: атрибуты класса являются видимыми только внутри класса, в котором они декларированы. Эти атрибуты не видны из методов, декларированных в том же модуле, или тех, которые не являются частью класса.
Strict protected: определяет, что атрибуты класса доступны в потомках.
Записи поддерживают методы Тип данных “запись” (record) в Delphi представляет собой смесь или набор элементов.
Каждый элемент называется “полем” (field), и в декларации типа “запись” должны содержаться название и тип каждого поля.
Начиная с Delphi 2006, записи получили новые возможности, которые раньше были доступны только в классах. Здесь представлен список новых возможностей записей в Delphi 2006:
Перегрузка операторов Декларация невиртуальных методов Статические методы и свойства Следующий пример показывает использование записи с новыми возможностями:
type Class Property pBlue : TColorType Read Blue Write Blue;
Constructor TMyRecord.Create(Val: Integer);
Procedure TMyRecord.printRed;
Теперь записи могут пользоваться функциональностью, ранее считавшейся эксклюзивной привилегией классов.
Однако записи всё-таки не классы, поэтому сохраняются некоторые различия:
Записи не поддерживают наследование Записи могут иметь вариабельные части; классы – нет.
Записи являются типом данных, поэтому их можно копировать; классы – нельзя.
У записей не может быть деструкторов.
Записи не поддерживают виртуальные методы.
Class Abstract, Class Sealed, Class Const, Class Type, Class Var, Class Property Существует много способов декларации классов, типов, переменных и свойств.
Class
Abstract
означает абстрактный класс Class sealed классы не могут расширяться за счет наследования – такие классы нельзя использовать в качестве базовых для других (производных) Class const означает, что константа является «классовой», т.е. к ней можно получить доступ без создания экземпляра Class type означает, что к классовому типу можно получить доступ без создания Class var означает, что в области класса к переменной можно получить доступ без создания экземпляра Class property дает доступ к свойству без необходимости создавать экземпляр Вложенные классы Вложенные типы используются повсеместно в объектно-ориентированном программировании. Они позволяют хранить концептуально связанные типы вместе и, таким образом, избегать коллизий имен. Именно такой синтаксис можно использовать и в Delphi.
Пример такого класса представлен ниже:
type TOuterClass = class // This is how the method is implemented:
procedure TOuterClass.TInnerClass.innerProc;
begin end;
Следующий пример иллюстрирует доступ к методу вложенного класса:
x: TOuterClass;
y: TOuterClass.TInnerClass;
begin x := TOuterClass.Create;
x.outerProc;
y := TOuterClass.TInnerClass.Create;
Методы final Компилятор Delphi также поддерживает концепцию «финальных» виртуальных методов (final virtual methods). Когда виртуальный метод маркируется ключевым словом final, в производных классах данный метод не может быть переопределен. Использование ключевого слова final является важным решением с точки зрения проектирования, что является прямым указанием о назначении класса. Кроме того, это является подсказкой компилятору для оптимизации генерируемого кода.
Методы Static Class Когда классы помечены как Static, для их использования не нужно создавать экземпляр.
For … In Начиная с Delphi 2007 была введена поддержка с новым стилем кодирования для итерации вида «элемент-в-коллекции» при использовании контейнеров.
Пример: итерации на массиве IArray1: array[0..9] of Integer = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
begin for I in IArray1 do begin // do something here...
end;
Пример: итерация на строке OS1, OS2: ShortString;
begin S1 := ’New resources in Delphi 2009';
WriteLn('SUCCESS #1');
OS1 := 'Migrating from Delphi 7 to Delphi 2009...';
WriteLn('SUCCESS #2');
end.
Generics Поддержка generics была введена, начиная с Delphi 2009.
«Generics» - это термин для обозначения родовых типов. Он подразумевает использование языковой конструкции для предварительного указания типа данных в массиве, коллекции или другом каком-либо контейнере. С использованием generics можно написать обобщенный код, который будет работать конкретным типом данных – классами или классовыми методами. Также возможно задавать типы во время исполнения.
При использовании generics чаще всего приходится иметь дело с Collections. Delphi RTL обеспечивает ряд уже готовых коллекций (определенных в модуле “Generics.Collections”), включающих:
TObjectDictionary TThreadedQueue Если связь элемента коллекции с классом добавляемого элемента происходит по TObject, то контейнер будет работать только на объектах одного типа, что также требует приведения типов для каждого элемента. Это дает дополнительную нагрузку на структуру кода приложения, скорость компиляции и качество приложения. Значительная часть такого кода может быть переработана на использование generics. Ниже приводится пример класса, когда его свойство Key является строкой, а свойство Value – целочисленной переменной. В данном случае generics не используются.
type procedure SetKey(Key: String);
function GetValue: Integer;
procedure SetValue(Value: Integer);
property Key: TKey read GetKey write SetKey;
property Value: TValue read GetValue write SetValue;
С использованием generics можно задать свойства Key и Value как свойства любого типа.
type TPair= class // declares the TPair type with 2 parameters private FValue: TValue;
type TPair= class // declares the TPair type with 2 parameters private FValue: TValue;
Теперь можно использовать данный класс различными способами:
type TSIPair = TPair; // declares it with types String TSSPair = TPair; // declares it with other types Generics находят массу полезных применений, а показанные выше примеры лишь иллюстрируют принцип их применения ограниченным образом.
Анонимные методы Как следует из названия, анонимные методы представляют собой процедуры или функции, которые не имеют ассоциированного имени. Анонимный метод есть блок кода, который может быть ассоциирован с переменной или быть использован в качестве параметра для другого метода. Кроме того, анонимные методы могут использовать переменные из контекста, где определен метод. Объявление и использование анонимных методов не требует сложного синтаксиса. Их синтаксис аналогичен конструкции замыканий (closures), характерных для других языков программирования.
Пример:
function MakeAdder(y: Integer): TFuncOfInt;
begin Result := { START anonymous method } function(x: Integer) end; { END anonymous method } end;
Функция MakeAdder возвращает безымянную функцию, т.е. анонимный метод. Тип анонимного метода декларируется как ссылка на метод.
Пример: выполнение функции MakeAdder adder: TFuncOfInt;
begin adder := MakeAdder(20);
Writeln(adder(22)); // prints end.
type TFuncOfInt = reference to function(x: Integer): Integer;
Показанная выше конструкция означает, «анонимный метод»:
представляет собой функцию получает целочисленное значение возвращает целочисленное значение В качестве анонимных методов могу выступать и процедуры, и функции.
type TSimpleProcedure = reference to procedure;
TSimpleFunction = reference to function(x: string): Integer;
Перехват виртуальных методов (Virtual Method Interception) Delphi XE определяет новый тип в Rtti.pas, названный TVirtualMethodInterceptor. Он динамически во время исполнения создает производный метакласс, который переопределяет любой виртуальный метод в «предке» за счет создания новой таблицы виртуальных методов и распространения её с заглушками. Эта таблица перехватывает вызовы и аргументы. Когда ссылка на метакласс для любого экземпляра «предка»
заменяется этим новым метаклассом, пользователь может перехватить вызов виртуальных функций, изменять аргументы «на лету», изменять возвращаемое значение, перехватывать и подавлять исключения или возбуждать новые исключения, а также полностью заменять вызов основных методов. Концептуально это похоже на динамические «прокси» в.NET или Java. Это сродни наследованию класса во время исполнения, переопределение методов (но не добавление новых полей) и, таким образом, изменение типа экземпляра во время исполнения до нового производного класса.
Рассмотрим случай, когда данный подход может оказаться полезным. Тут следует запомнить две очевидные вещи: тестирование и удаленный доступ. «Объекты-заглушки» (mock objects) эффективно используются при тестировании в других языках. При перехвате вызовов методов можно более легким способом проверить, что конкретная подсистема вызывает правильные методы с корректными аргументами в правильной последовательности;
подобным же образом подсистема осуществляет возврат значений после вызова этих методов без необходимости обращения к базе данных, сетевым ресурсам и т.д., для чего и служат техники модульного тестирования. Удаленный доступ на основе вызова методов не всегда эффективен, особенно когда сетевой доступ ненадежен или перегружен защитой, но это не единственный вариант использования. Логика перехвата виртуальных методов была изначально реализована для использования как часть механизма аутентификации в технологии DataSnap, так что вызов, исходящий из сети, можно проверить, т.к. поток выполнения кода распределен по графу объектов.
В любом случае, здесь для начала приводится простой пример:
uses SysUtils, Rtti;
{$apptype console} type // Frob doubles x and returns the new x + function Frob(var x: Integer): Integer; virtual;
function TFoo.Frob(var x: Integer): Integer;
begin end;
procedure WorkWithFoo(Foo: TFoo);
a, b: Integer;
begin Writeln(' before: a = ', a);
Writeln(' Exception: ', e.ClassName);
end;
procedure P;
vmi: TVirtualMethodInterceptor;
begin foo := TFoo.Create;
Writeln('Before hackery:');
WorkWithFoo(foo);
vmi := TVirtualMethodInterceptor.Create(foo.ClassType);
vmi.OnBefore := procedure(Instance: TObject; Method: TRttiMethod;
const Args: TArray; out DoInvoke: Boolean; out Result:
Write('[before] Calling ', Method.Name, ' with args: ');
// Change foo's metaclass pointer to our new dynamically derived // and intercepted descendant Writeln('After interception:');
WorkWithFoo(foo);
end;
begin end.
Ниже представлен вывод на экран:
Before hackery:
After interception:
[before] Calling Frob with args: [before] Calling BeforeDestruction with args:
[before] Calling FreeInstance with args:
Примечание: в данном примере идет перехват всех виртуальных методов, включая тех, которые вызываются при разрушении объекта, а не только те, которые были задекларированы. (Сам деструктор не включен).
Новая директива $POINTERMATH {ON - OFF} Директива $POINTERMATH делает возможным математические операции с указателями.
Новые предупреждения Когда происходит компиляция приложения в Delphi XE, то могут появиться новые предупреждения в окне «message» IDE. Эти предупреждения связаны с использованием нового типа UnicodeString. Эти новые предупреждения включают:
1057 Implicit string cast from ‘%s’ to ‘%s’ (неявное преобразование строк) 1058 Implicit string cast with potential data loss from ‘%s’ to ‘%s’ (неявное преобразование строк с возможной потерей данных) 1059 Explicit string cast from ‘%s’ to ‘%s’ (явное преобразование строк) 1060 Explicit string cast with potential data loss from ‘%s’ to ‘%s’ (явное преобразование строк с возможной потерей данных) dbExpress Фреймворк Одним из наиболее значительны улучшений в Delphi 2007 явилось то, что архитектура dbExpress была переделана и теперь может считаться фреймворком, который полностью разработан на Delphi. Были проведены тесты для моделирования различных ситуаций на множестве платформ баз данных. Результаты некоторых тестов показали повышение производительности на 100%.
DbExpress 4 также является краеугольным камнем для приложений, созданных в Delphi и предназначенных для работы с базами данных. Новая архитектура была разработана для поддержки и Win32, и.NET, позволяя использовать те же самые драйвера для обеих платформ, например, драйвер dbExpress DataSnap может быть использован и для Win32, и для.NET. Это позволяет создавать клиентские приложения и в Delphi Win32, и в Delphi Prism (.NET).
Фигура 36. Архитектура dbExpress Обратите внимание, что приложения, созданные в более ранней версии Delphi, являются на 100% совместимыми с Delphi XE в этой части.
Фреймворк dbExpress содержит в себе новую группу классов, которые обслуживают задачу доступа и работы с базами данных. Теперь можно найти информацию о работе с базами данных внутри данного фреймворка. Ранее можно было вместо этого только использовать компоненты SQLConnection, SQLDataSet, SQLQuery и другие.
Следующий пример демонстрирует консольное приложение, которое использует ресурсы соединения с базой данных, выполняет чтение параметров соединения, посылает запрос и отображает его результаты – всё это в рамках одной транзакции.
program DBX4Example;
{$APPTYPE CONSOLE} uses DBXDynalink, aConnName: string;
aDBXConn: TDBXConnection;
aDBXTrans : TDBXTransaction;
aCmnd: TDBXCommand;
aReader: TDBXReader;
i, aColCount: integer;
begin aDBXConn := TDBXConnectionFactory.GetConnectionFactory.GetConnection( 'EMPLOYEE', 'sysdba','masterkey');
// Write the all connection parameters Writeln( '================= Connection Properties ============' );
WriteLn( aDBXConn.ConnectionProperties.Properties.Text);
Writeln( '====================================================' );
aCmnd := aDBXConn.CreateCommand;
aDBXConn.BeginTransaction(TDBXIsolations.ReadCommitted);
// Prepare and execute the SQL Statement aCmnd.Text := 'SELECT * FROM Country';
aReader := aCmnd.ExecuteQuery;
aColCount := aReader.ColumnCount;
Writeln( 'Results from Query: ' + aCmnd.Text );
Writeln( 'Number of Columns: ' + IntToStr(aColCount) );
Writeln( aReader.Value['Country'].GetAnsiString );
Writeln( '====================================================' );
// Commit transaction aDBXConn.CommitFreeAndNil(aDBXTrans);
aReader.Free;
aDbxConn.Free;
end.
Метаданные в dbExpress Новая поддержка метаданных широко используется сервисом Data Explorer в IDE Delphi, однако она также может быть использована в любом приложении. Кратко, можно не только просматривать структуру базы данных, но также использовать классы и объекты для её модификации вместо того, чтобы полностью полагаться на использование прямых SQLкоманд для решения подобных задач. В этом случае код не только становится более объектно-ориентированным, но можно использовать один и тот же исходный текст для разных платформ база данных, т.к. dbExpress абстрагирует функции работы с метаданными для каждого сервера.
Модуль DBXMetaDataNames служит для чтения метаданных. Класс TDBXMetaDataCommands из dbExpress содержит набор констант для чтения различных типов метаданных.
Для выполнения этой операции нужно установить свойство TDBXCommand.CommandType в значение DBXCommandTypes.DBXMetadata а также TDBXCommand.Text в значение одной из констант в TDBXMetaDataCommands, чтобы получить нужные нужных метаданные, а TDBXCommand.ExecuteQuery вернет TDBXReader для доступа к метаданным. Новые классы в DBXMetaDataNames описывают и дают доступ к нужным колонкам метаданных. Ниже представлен список метаданных, которые можно получить с использованием dbExpress:
Колонки (для таблиц, просмотров и т.д.) Хранимые процедуры Параметры хранимых процедур Список пользователей Исходный код хранимых процедур Упакованные хранимые процедуры Исходный код упакованных хранимых процедур Параметры упакованных хранимых процедур Зарезервированные слова Data Explorer включает поддержку создания SQL запросов, чувствительных к диалекту, для CREATE, ALTER и DROP. DbExpress также экспонирует класс DbxMetaDataProvider, который обеспечивает легкий доступ к данной функциональности из приложений. Это несколько увеличивает размер приложения, т.к. должны быть включены объекты для чтения метаданных. Возможность генерировать таблицы родственным образом является полезной для многих приложений. Интерфейс позволяет описывать, что собой представляет таблица и ее колонки, и передавать это описание в метод TdbxMetaDataProvider.CreateTable.
Следующий пример показывает, как нужно создавать таблицы, первичные ключи, внешние ключи и индексы с использованием классов фреймворка dbExpress.
Provider: TDBXDataExpressMetaDataProvider;
Country, State: TDBXMetaDataTable;
IdCountryField, IdField: TDBXInt32Column;
StrField : TDBXUnicodeVarCharColumn;
begin Provider := DBXGetMetaProvider(conn.DBXConnection);
Writeln('Creating Table - Country
Country := TDBXMetaDataTable.Create;
Country.TableName := 'COUNTRY';
IdCountryField := TDBXInt32Column.Create('COUNTRYID');
IdCountryField.Nullable := false;
IdCountryField.AutoIncrement := true;
Country.AddColumn(IdCountryField);
StrField := TDBXUnicodeVarCharColumn.Create('COUNTRYNAME', 50);
StrField.Nullable := False;
Country.AddColumn(StrField);
Provider.CreateTable(Country);
end;
// Defines COUNTRYID as Primary Key AddPrimaryKey(Provider, Country.TableName, IdCountryField.ColumnName);
// Defines Unique Index as COUNTRYNAME AddUniqueIndex(Provider, Country.TableName, StrField.ColumnName);
Writeln('Creating Table - State
State := TDBXMetaDataTable.Create;
State.TableName := 'STATE';
IdField := TDBXInt32Column.Create('STATEID');
IdField.Nullable := false;
IdField.AutoIncrement := true;
State.AddColumn(IdField);
StrField := TDBXUnicodeVarCharColumn.Create('SHORTNAME', 2);
StrField.Nullable := False;
State.AddColumn(StrField);
StrField := TDBXUnicodeVarCharColumn.Create('STATENAME', 50);
StrField.Nullable := False;
State.AddColumn(StrField);
State.AddColumn(IdCountryField);
Provider.CreateTable(State);
// Defines STATEID as Primary Key AddPrimaryKey(Provider, State.TableName, idField.ColumnName);
// Defines Unique Index as STATENAME AddUniqueIndex(Provider, State.TableName, StrField.ColumnName);
AddForeignKey(Provider, State.TableName, IdCountryField.ColumnName, Country.TableName, IdCountryField.ColumnName);
FreeAndNil(Provider);
Исходный код данного примера доступен по адресу http://cc.embarcadero.com/Item/26210.
Драйверы dbExpress Поддержка последних версий баз данных: InterBase 2009, MySQL 5.1, Oracle 10g/11g, новый драйвер dbExpress для SQL Server 2008 включает поддержку нового типа данных datetime offset. Драйверы для Oracle, InterBase и MySQL теперь поставляются с поддержкой Unicode.
В Delphi 2010 введена поддержка драйвера dbExpress для Firebird, который на тот момент был самым востребованным для разработчиков. Драйвер dbExpress для Firebird поддерживает Firebird версий 1.5 и 2.x, но не только поддерживает, но и является полностью совместимым с Firebird, так что можно создавать таблицы, первичные ключи, внешние ключи, индексы и многое другое при работе с использованием данного фреймворка. Data Explorer также полностью поддерживает Firebird.
Поля BIGINT поддерживаются на 100% и отображаются как TLargeIntField в VCL, а тип BLOB отображается как TBlobField.
Введена новая концепция, названная “Delegate Driver” и “Pools Connections”, которая требует лишь упрощенная конфигурация параметров.
Можно расширить фреймворк dbExpress за счет написания «делегирующих драйверов»
(delegation drivers), которые обеспечивают еще один промежуточный слой между приложением и реальным драйвером. Делегирующие драйвера полезны для создания пула соединений (connection pooling), профилирования драйверов, трассировки, а агент аудита DBXTrace представляет собой делегирующий драйвер для трассировки.
Ниже представлен журнал для отображения результатов, полученных от делегата в Delphi. Его легко читать, понять, что там представлено, и еще раз выполнить операции в нем.
Конфигурация трассировки (trace configuration). Следующий пример записывает события в соответствии с параметром TraceFlags в файл журнала c:\dbxtrace.txt. Соединение dbExpress обладает параметром для индикации конфигурации трассировки; например, DelegateConnection=DBXTraceConnection [DBXTraceConnection] DriverName=DBXTrace TraceFlags=EXECUTE;COMMAND;CONNECT TraceDriver=true TraceFile=c:\dbxtrace.txt Результаты в сгенерированном журнале:
Log Opened ========================================== {CONNECT } ConnectionC1.Open;
{COMMAND } CommandC1_1 := ConnectionC1.CreateCommand;
{COMMAND } CommandC1_1.CommandType := 'Dbx.SQL';
{COMMAND } CommandC1_1.CommandType := 'Dbx.SQL';
{COMMAND } CommandC1_1.Text := 'select * from employee';
{PREPARE } CommandC1_1.Prepare;
{COMMAND } ReaderC1_1_1 := CommandC1_1.ExecuteQuery;
{COMMAND } CommandC1_2 := ConnectionC1.CreateCommand;
{COMMAND } CommandC1_2.CommandType := 'Dbx.MetaData';
{COMMAND } CommandC1_2.Text := 'GetIndexes "localhost:C:\ database\employee.ib"."sysdba"."employee" ';
{COMMAND } ReaderC1_2_1 := CommandC1_2.ExecuteQuery;
{READER } { ReaderC1_2_1 closed. 6 row(s) read } {READER } FreeAndNil(ReaderC1_2_1);
{COMMAND } FreeAndNil(CommandC1_2);
Также можно использовать пулы соединений через dbExpress напрямую. Ниже представлен alias (Pool_DelegateDemo), передающий DBXPoolConnection контроль над пулом соединений (где задается максимальное число соединений).
[DBXPoolConnection] DriverName=DBXPool MaxConnections= MinConnections= ConnectTimeout= [Pool_DelegateDemo] DelegateConnection=DBXPoolConnection DriverName=Interbase DriverUnit=DBXDynalink DriverPackageLoader=TDBXDynalinkDriverLoader DriverPackage=DBXCommonDriver110.bpl DriverAssemblyLoader=Borland.Data.TDBXDynalinkDriverLoader DriverAssembly=Borland.Data.DbxCommonDriver,Version=11.0.5000.0,Culture=ne utral,PublicKeyToken=a91a7c5705831a4f Database=localhost:C:\database\employee.ib RoleName=RoleName User_Name=sysdba Password=masterkey ServerCharSet= SQLDialect= BlobSize=- CommitRetain=False WaitOnLocks=True ErrorResourceFile= Interbase TransIsolation=ReadCommited Trim Char=False Облачные вычисления (Cloud Computing) Microsoft Windows Azure Вместе с Delphi XE поставляются компоненты для работы с учетными записями Windows Azure. Windows Azure (не путайте с SQL Azure) позволяет хранить и работать с Blobs, очередями сообщений (Queues of messages) и таблицами данных в облаке Azure. Если создана соответствующая учетная запись, то можно использовать компоненты в разделе Microsoft Azure с палитры компонентов. Доступны следующие компоненты для работы с Azure:
TAzureTableManagement таблицы Windows Azure; они обеспечивают масштабируемое структурированное хранение. Тип таблиц NOSQL подразумевает, что каждая хранимая единица в таблице может иметь различный набор свойств различного типа, таких как string или int.
TAzureQueueManagement в отличии от blobs и tables, которые используются для хранения данных, очереди (queues) служат другим целям: хранение асинхронных сообщений, где каждое сообщение может быть длинной до 8 кб.
TAzureBlobManagement хранилище больших бинарных объектов (blob) Windows Azure; blob-хранилище представляет собой неструктурированное хранилище, т.к.
используется для хранения больших порций данных, таких как изображения, видео, документы и т.д. внутри заданного контейнера.
Также есть компонент, называемый TAzureConnectionString, который работает с информацией, необходимой для соединения с учетной записью Windows Azure. Все эти компоненты используют Windows Azure REST API для доступа ко всем возможностям, которые предоставляют эти сервисы.
Компоненты для работы с Azure полезны для разработчиков, которые хотят обеспечить взаимодействия между своими приложениями и учетной записью Windows Azure.
Amazon EC Delphi XE содержит в себе мастер для удобного размещения файлов на удаленной машине.
Эта удаленная машина может быть частью инфраструктуры Amazon EC2. Следует иметь в виду, что поддерживается экземпляры только EC2 и Windows. Для этого Delphi XE предлагает простой трехступенчатый процесс для удобного размещения в облачной инфраструктуре.
DataSnap Интеграция между DataSnap и dbExpress является одной из наиболее значимых новых возможностей, появившихся в Delphi 2009. В последующих релизах были добавлены также еще более мощные возможности. На основании отзывов, полученных от разработчиков, был создан принципиально новый DataSnap. В Delphi создание многозвенных приложений всегда было достаточно простой задачей. Однако практика реализации различных проектов показала, что есть направления дальнейшего улучшения данной технологии. В этом разделе мы познакомимся с основными концепциями, которые помогут создать современные многозвенные приложения с использованием DataSnap.
Сегодня DataSnap является ключевой технологией при создании многозвенных приложений, а в релизе XE платформа DataSnap представляет открытую архитектуру для других технологий, использующих вызов серверных методов (в которых бизнес-логика реализуется на стороны сервера). Эти дополнительные поддерживаемы технологии: C++Builder,.NET (Delphi, C#, VB.NET и т.д.), PHP и JavaScript.
Фигура 37. Ключевая технология DataSnap в реализации многозвенных Delphi-приложений Основные концепции Новый механизм интеграции между DataSnap и dbExpress, который многие называют «dbExpress для удаленного использования», дает значительную гибкость при создании многозвенных приложений. До его реализации удаленные функции были чем-то, что требовало использовании библиотеки типов (Type Library), а это означало зависимость от COM (как основа для Remote Data Module). Разработчики потребовали исключить зависимость от COM, что и явилось основным атрибутом новой DataSnap: она никаким образом не зависит от технологии COM. Однако данная технология поддерживает совместимость с предыдущим вариантом, которую можно использовать по необходимости.