Продолжается подписка на наши издания! Вы не забыли подписаться?

Delphi7, следующая станция – Delphi.Net

В.Михайлов

Компания Borland выпустила новую, 7-ю, версию своего флагманского продукта – Delphi. Это событие прошло довольно тихо, без той помпы, с какой представлялась Delphi 6. Впрочем, ничего удивительного в этом нет. Скорее всего, маркетинг-менеджеры и пиарщики Borland копят силы для Delphi.NET. Судя по тому, что компакт-диск содержит не только Delphi 7, но и Delphi .NET Preview, выход этого продукта уже предопределен. Однако сейчас говорить всерьез о Delphi .NET преждевременно – очень многое в представленном Preview находится в стадии разработки, куча свойств и возможностей еще не оформилась окончательно, словом, до выпуска release-версии еще далеко. Поэтому правильнее будет говорить о Delphi 7, хотя в конце статьи я вкратце остановлюсь и на Delphi .NET Preview.

IDE, палитра компонентов

Среда разработки претерпела, в основном, косметические изменения (рисунок 1). Несколько изменились тулбары и иконки – теперь они выполнены в стиле Windows ХР. Стоит также отметить несколько некрупных, хотя и приятных улучшений.

Редактор кода теперь позволяет подсвечивать код на разных языках – C#, C++, HTML, и других. Эта возможность представляется довольно странной для продукта, созданного для работы с Object Pascal, но её полезность несомненна. Скорее всего, это еще один шаг Borland навстречу .NET.

Появилась возможность выбора сообщений и подсказок, выдаваемых компилятором при сборке проекта. Для этого предназначена закладка Compiler Messages окна Project Options (рисунок 2). Список сообщений можно расширить, подгружая их с сайта Borland.

Улучшилась работа Code Insight. Теперь можно редактировать и расширять автоматическое завершение кода, создавая собственных экспертов. Кстати, теперь автоматически дополняется не только Object Pascal, но и HTML (рисунок 3.).

Слегка изменился интерфейс отладчика. Например, появилась возможность группировки Watches и отображения разных групп на разных закладках.

Рисунок 1.

Изменения в компонентах пользовательского интерфейса, на мой взгляд, несущественны, что не удивительно – в этой области трудно придумать что-то принципиально новое.

 

 

Рисунок 3.

Хуже то, что и в более существенных областях новостей мало, да и те, что есть, носят, так сказать, не качественный, а количественный характер. Так, в области работы с БД практически ничего не изменилось, кроме поддержки IB 6.5 и появления драйвера Microsoft SQL Server для dbEхpress. Стоит упомянуть, что наконец-то произошло официальное отречение от BDE. Borland заявил о нежелательности использования BDE для работы с серверами баз данных. Однако в целом, если речь не идет об Internet-приложениях, причин для перехода на новую версию немного.

Разработка Internet приложений

Основные нововведения Delphi 7 связаны с Internet технологиями. Здесь действительно заметны различия новой и старой версий. Однако обо всем по порядку.

Прежде всего, стоит отметить расширение поддержки Web-сервисов. В Delphi 7 появилась поддержка UDDI (Universal Description, Discovery and Intergration), стандарта размещения и поиска Web сервисов, вложений в SOAP-сообщения, настройки отображения объекта в SOAP-представление. Это стало возможным благодаря появлению методов TRemotable.ObjectToSoap и TRemotable.SoapToObject. Есть и другие, менее значительные изменения.

О поддержке UDDI хотелось бы рассказать подробнее. UDDI – это общий формат регистрации сервисов, доступных через Web. Сейчас существует ряд открытых реестров, предоставляющих информацию о Web-сервисах. В идеале они должны содержать одну и ту же информацию. На самом деле, конечно, их содержание различается.

UDDI-реестр содержит не просто информацию о Web-сервисах. Этот формат, в принципе, позволяет описать любую область деятельности. Вхождения UDDI-реестра организованы иерархически. Дерево реестра содержит род деятельности, включающий сервисы разных типов, каждый из которых, в свою очередь, содержит детальную информацию о себе. Эта детальная информация носит имя TModel. Таким образом, Web-сервис, включающий один или несколько доступных интерфейсов, описывается одной TModel. Ветка реестра, соответствующая некоторому роду деятельности, или, скажем, какой-либо организации, может включать набор Web-сервисов и другую информацию. TModel может содержать самые разнообразные сведения, например, описание сервиса, контактную информацию и технические детали типа WSDL-документа.

Представьте некое ООО "Рога и копыта". Его деятельность естественно делится на отделы рогов и копыт. Отдел рогов делится на подотделы скупки рогов у населения и поставки рогов заказчикам. С каждым из этих отделов может быть сопоставлен Web-сервис, и, соответственно, для каждого из этих сервисов будет существовать TModel. То же справедливо и в отношении отдела копыт. Кроме этого, есть Web-сайт, который содержит информацию для поставщиков и заказчиков. Это не Web-сервис, но информация об этом сайте тоже будет храниться в виде TModel в ветке реестра "Рога и копыта".

В Delphi 7 для работы с UDDI предназначены UDDI-браузер и WSDL Importer. Их назначение полностью соответствует названиям – первый предназначен для поиска и просмотра UDDI-реестров, а второй – для импорта найденных с помощью браузера WSDL-файлов. По WSDL-файлу Importer генерирует скелет серверного или клиентского – в зависимости от заданных опций – кода. Это может значительно сократить время на разработку Web-приложения.

Как же выглядит теперь создание простейшего серверного приложения, реализующего Web-сервис?

Для этого нужно выбрать File|New|Other, и двойным щелчком по иконке Soap Server Application на закладке WebServices запустить SOAP Server Application wizard. Этот мастер создает новое приложение, включающее компоненты, необходимые для ответов на SOAP-запросы.

При закрытии мастер спрашивает, нужно ли определять интерфейс Web-сервиса. Тут есть два пути.

Можно ответить "да". Это приведет к запуску Add New Web Service wizard, который добавит код, объявляющий и регистрирующий вызываемый интерфейс Web-сервиса. Остается вписать собственно реализацию Web-сервиса.

Можно сказать "нет", и воспользоваться уже упомянутым WSDL Importer. Если найдется подходящий WSDL-файл, Importer сгенерирует интерфейсы, классы и код регистрации. Останется только написать тела методов – увы, этого никакой мастер не делает. Но, собственно, за это программистам и платят деньги.

В Delphi 7 появилась такая штука, как IntraWeb – новая технология создания Web-приложений от фирмы AtoZed (вообще, если так пойдет дальше, Delphi станет похожа на дистрибутив Линукса – куча приложений от разных производителей, объединенных под одной обложкой).

IntraWeb – это разработка форм Web приложений, ничем не отличающаяся от разработки обычных форм. В результате получается приложение, генерирующее обычные HTML-страницы с кодом на JavaScript. Такой подход дает определенный выигрыш в простоте и наглядности разработки, а следовательно, и в её сроках.

Рисунок 3.

Выдача результатов в HTML обеспечивает совместимость с самыми распространенными браузерами – Internet Explorer, Netscape и с наконец-то добравшейся до релиза Mozilla. IntraWeb можно использовать для расширения ранее созданных приложений WebSnap и Web Broker. IntraWeb может создавать приложения для следующих платформ (рисунок 4):

Рисунок 4.

При разработке для этих платформ IntraWeb выступает как самостоятельная технология, а при работе с WebSnap- и Web Broker-приложениями с помощью IntraWeb проектируются отдельные формы, подключаемые к основному приложению (рисунок 5).

Значительно расширен набор компонентов Indy (Internet Direct). Теперь Indy имеет версию 9 и занимает четыре закладки в палитре компонентов. Две из них – новые, Indy I/O Handlers и Indy Intersepts.

Indy Intersepts – это компоненты-перехватчики событий, например, попытки подключения или передачи данных.

Indy I/O Handlers содержит компоненты-обработчики ввода/вывода.

Подробно рассматривать отдельные компоненты нет никакой возможности – их слишком много. Возможно, самые интересные из них мы когда-нибудь опишем отдельно.

Rave Reports

В Delphi 7 появился новый генератор отчетов Rave Reports, разработка компании Nevrona. Ранее использовавшийся Quick Report по прежнему поставляется в составе Delphi, но по умолчанию устанавливается именно Rave Reports. Новый генератор отчетов – это самостоятельное приложение, однако тесно интегрированное с Delphi. Rave Reports поддерживает как VCL, так и CLX. Создавать формы отчетов можно в достаточно удобном визуальном редакторе.

Rave Reports может работать с БД через ADO, BDE и dbEхpress. Это делает его совместимым практически со всеми популярными серверами БД.

Новый генератор позволяет выполнять определяемые разработчиком действия до и после составления отчета, а также перед и после печати этого отчета с помощью отслеживания событий OnBeforePrint, OnAfterPrint, OnBeforeReport и OnAfterReport. Обработчики этих событий пишутся на встроенном в генератор языке, хотя, несомненно, большинство программистов предпочли бы очередному языку нечто знакомое, хотя бы VBA.

Сервер отчетов Rave Reports позволяет формировать и просматривать по сети через Web браузер.

Model Maker

В новой версии в состав Delphi вошло CASE-средство Model Maker, что само по себе очень хорошо. Model Maker – это отдельное приложение, позволяющее создать модель, в дальнейшем автоматически конвертируемую в код Delphi. Справедливо и обратное – код может быть импортирован в Model Maker, и на его основании будут сгенерирована диаграмма классов. Существует возможность построения Use case диаграмм, диаграмм активности (Activity diagramm), диаграмм последовательности (Sequence diagramm), диаграммы состояний (State diagramm), диаграмм взаимодействия (Collaboration diagramm). Model Maker понимает UML, включает в себя специализированные редакторы для классов, UML-диаграмм, исходного кода, а также средства, облегчающие документирование разработки. Увы, последние, как встарь, ориентируются на устаревший формат WinHelp.

К сожалению, Model Maker входит только в Enterprise edition, пользователям Delphi Professional его только покажут в виде 30-дневной trial-версии.

Delphi for .NET Preview

С тех пор, как Microsoft выдумал очередное магическое слово (то есть .NET), у многих фирм-разработчиков ПО возник непреодолимый творческий зуд. Появилось уже несметное количество продуктов, программок, языков и язычков с именами в формате *.NET. Те же, кто еще не выпустил ничего подобного, уже клятвенно пообещали сделать это в ближайшем будущем. Единственным исключением стала, конечно, Sun – но ей сам бог велел держаться от этого подальше.

А вот в отношении Borland все как раз наоборот – Delphi, точнее, Object Pascal окажется совсем не лишним в семье .Net-языков. И разговоры о поддержке технологии .NET ведутся среди Delphi-фанов уже давно. Выход Delphi for .NET preview подтвердил реальность ожиданий.

Пока под громким именем Delphi for .NET скрывается одинокий компилятор, работающий в командной строке. Ни среды, ни набора компонентов пока нет. Документации не густо – 8 небольших HTML-файлов на тему "я знаю – город будет...". Впрочем, эти файлы очень полезны для понимания того, как видит Borland интеграцию Delphi в .Net. Уже само появление такого продукта свидетельствует о серьезности намерений. Вопрос, нужен ли еще один язык программирования для .NET, излишен – больше всего такой язык нужен самому Borland, хотя бы для того, чтобы не потерять имеющихся пользователей.

Чтобы посмотреть на Delphi.Net поближе, нужно установить .NET Framework и собственно Delphi for .NET Preview. Традиционное приложение "Hello, World" в данном случае выглядит так:

Program HelloWorld;

{$APPTYPE CONSOLE}
begin
  Writeln('Hello, World!');
end.

Не правда ли, исходный код ничем не отличается от аналогичного кода для обычного Delphi приложения? Сохраним этот код в файле HelloWord.dpr. Теперь вызовем консоль и введем в командной строке:

dccil –V HelloWord.dpr.

Результатом выполнения вышеприведенной команды будет файл HelloWorld.exe, консольное приложение, выдающее одинокую надпись "Hello, World!". dccil – это компилятор Delphi for .Net. Ключ –V заставляет компилятор включить в результирующую сборку отладочную информацию, что позволяет производить отладку в отладчике из Microsoft.NET Framework SDK.

dccil позволяет скомпилировать и GUI-приложение:

Program HelloWorld;
// импорт пространства имен CLR
uses System.Windows.Forms;
begin
  MessageBox.Show('Hello World!', 'Пример приложения для Delphi.Net');
end.

Таблица 1.
Соответствие типов
данных
Object Pascal и .Net.

Тип Delphi

Тип .NET Framework

ShortInt System.SByte
Byte System.Byte
SmallInt System.Int16
Word System.UInt16
Integer System.Int32
Cardinal/LongWord System.UInt32
Int64 System.Int64
UInt64 System.UInt64
Char/WideChar System.Char
Single System.Single
Double/Extended System.Double
Boolean System.Boolean
WideString/string System.String

Здесь куда лучше видны отличия от обычного Delphi-приложения. Уже в третьей строке (System.Windows.Forms;) появляется название пространства имен – понятия, не встречавшегося в прежних версиях Delphi. В Delphi базовой единицей хранения информации о типах и их реализации был юнит, а в .NET для хранения описаний типов служат пространства имен, что и заставляет использовать полное имя модуля. Строка System.Windows.Forms указывает, где лежит описание класса MessageBox. Каждое приложение Delphi for .Net неявно определяет свое пространство имен, совпадающее с именем проекта, и именно в нем находятся все модули проекта.

Названия юнитов теперь также включают полные наименования пространств имен. Например, в исходных текстах Delphi for .NET preview можно увидеть файл Borland.Delphi.System.pas.

В .Net-приложениях, разумеется, можно использовать только типы данных, поддерживаемые .NET (таблица 1).

Расширение .Net Framework-
helper-классы.

Цель Borland отнюдь не в том, чтобы сделать Object Pascal. Net. Нужно еще и добиться переносимости старых приложений, для чего нужна поддержка VCL, а не объектной библиотеки .NET. Для этого Borland предлагает использовать механизм helper-классов.

Очевидно, что разработчики, переходящие на новую версию Delphi, независимо от её номера и суффиксов, не захотят терять имеющихся наработок. Однако значительная часть функциональности, доступной Delphi-разработчикам, уже реализована в виде .Net-COMпонентов, а простой перенос VCL-компонентов в .Net является очень трудоемким и избыточным решением.

Helper-класс – это класс, содержащий дополнительные методы, расширяющие функциональность основного класса. Использование helper-класса – это не форма наследования, а способ обеспечения расширения функциональности базового класса. Синтаксис объявления helper-класса таков:

ClassHelper = class helper [(ancestor list)] for type-id
end;

Обычно перед helper-классом идет объявление типа:

type
TMyClass = Some.VerySimilar.Class;

А за ним уже собственно объявление класса

// Вводим helper-класс и объявляем функцию, ожидаемую
// существующим Delphi-кодом.
TMyClassHelper = class helper for TMyClass
  function ExistingDelphiFunc : Integer;
end;

Теперь существующий Delphi-код, ожидающий наличия у типа TMyClass функции ExistingDelphiFunc, будет работать как ни в чем не бывало.

Хорошим примером может служить класс System.Object, являющийся предком для всех .NET классов. В Delphi ему соответствует класс TObject. В Delphi for .Net TObject не наследуется от System.Object. Вместо этого он объявлен helper-классом для System.Object. Это позволяет использовать такие отсутствующие в System.Object методы, как ClassName и ClassType. Компилятор, не найдя реализаций ClassName и ClassType в классе System.Object, обратится к helper-классу и возьмет их оттуда. Таким образом, helper-классы позволяют использовать в .Net возможности, реализованные в VCL.

Изменения в языке

Перенос Delphi на .Net – это не просто портирование на очередную платформу. Создание .Net-версии потребовало от Borland создания новых кодогенератора, линкера, runtime-библиотеки, и, разумеется, изменений в синтаксисе языка. Чтобы полностью вписаться в рамки CLR, некоторые свойства языка пришлось выкинуть, а другие – переработать.

Уже сейчас можно понять, как в итоге будет выглядеть .Net-версия языка. Это будет старый добрый Паскаль, ужасно напоминающий по возможностям C#. Однако некоторые возможности сейчас находятся в разработке, и детали их реализации постоянно изменяются. Поэтому я просто коротко перечислю их, не вдаваясь в подробности:

Возможности, более не поддерживаемые языком, перечислены в таблице 2.

Таблица 2. Возможности Object Pascal,
не поддерживаемые в Delphi for .Net.

Возможность языка Комментарий
Real48 6-байтовый тип с плавающей точкой
GetMem(), FreeMem() и
ReallocMem()
Используйте динамические массивы или автоматическую реализацию паттерна dispose.
BlockRead(), BlockWrite()  
Директивы Absolute , Addr, и @  
TVarData, Variant Семантика Variant будет поддерживаться, но не как TVarData.
File of <type> Такая конструкция не может быть реализована в .Net.
Нетипизированные параметры var и out Нетипизированные параметры const поддерживаются, как и раньше.
PChar В грядущем релизе будут поддерживаться указатели (unsafe managed-код).
Директивы automated и dispid  
Выражение asm – вставки ассемблера  
TInterfacedObject AddRef, QueryInterface и Release удалены. В preview-версии TInterfacedObject – это алиас для TObject.
Динамическая агрегация Динамическая агрегация интерфейсов не поддерживается CLR, поскольку не может быть статически верифицирована.
ExitProc  

Заключение

Delphi 7 производит достаточно странное впечатление. С одной стороны, ощущается, что разработчикам не до новой версии, у них есть дела поважнее – подготовка .Net-версии. Большая часть основных дополнений и нововведений разработана сторонними разработчиками. Кардинальные улучшения практически отсутствуют. Перейти на новую версию разработчиков традиционных приложений могут вынудить только причины, не связанные с возможностями и достоинствами продукта – например, необходимость покупки новых лицензий на Delphi или переход к разработке Internet-приложений.

Однако это же заставляет надеяться, что в недалеком будущем нас ожидает интереснейший продукт – полноценное средство разработки .Net-приложений, выпущенное давним соперником Microsoft на рынке средств разработки.


Copyright © 1994-2016 ООО "К-Пресс"