Теперь стало уже мрачным ритуалом упоминать в начале подобных обзорных статей о том, что Delphi поразил глубокий кризис.

CodeGear RAD Studio 2009: начало установкиФактически заветная маркетинговая надежда IDE Delphi.NET потерпела фиаско в процессе борьбы на рынке программных инструментариев. И косвенным подтверждением этому служит завидная периодичность выпуска новых версий Delphi под Win32. Начиная с Delphi 8, когда вся IDE была переработана на манер MS Visual Studio, для разработчиков такого чудо-инструмента началась полоса неудач, более всего характеризующаяся даже не метаниями в концепции продвижения линейки продуктов, а элементарной программной нестабильностью работы самой IDE Delphi. В результате версия Delphi 7 запомнилась многим как самая хорошая, но не потому, что она сильно отличалась от Delphi 6, а потому, что оказалась последним стабильным релизом перед затяжным перерывом.

И здесь можно невольно задаться вопросом: зачем покупать Delphi 2009?

Единственно стабильная вещь в последние годы, которую многие проверили на своей машине, — неприличная прожорливость Delphi в отношении оперативной памяти. Но хорошо еще, что, начиная где-то с Delphi 2006, стало возможным спокойно трудиться, привыкнув к слегка упорядоченной периодичности программных сбоев.

А теперь давайте посмотрим, на что же ушло у создателей нового чуда-продукта два года.

Итак, перед нами вариант CodeGear RAD Studio для работы в среде Win32 (о планах компании Embarcadero в отношении других платформ см. врезку), которая почти не отличается от Delphi 2007 или даже 2006.

Теперь по поводу системных требований. Рекомендуемая оперативная память — 2 Гбайт, разрешение экрана — от 1024Пh768 точек (конечно, при этом минимальном разрешении работать, мягко говоря, некомфортно). По поводу утечек памяти что-либо конкретное сказать сейчас сложно: на небольших тестовых приложениях проблемы незаметны, а быстро переделать серьезный проект в новой среде не представляется возможным. Заявленная работа в операционной системе, начиная с MS Windows 2000 Pro SP4, свидетельствует о соответствующей совместимости создаваемых приложений с этими версиями ОС.

Внешний вид нового инструментарияМинимальные требования к процессору — Pentium 1,4 ГГц. Субъективное впечатление от запуска Delphi 2009 на 1,8-ГГц Athlon таково: загружается долго, но работает потом исправно. Скорее всего, будет не слишком приятно запускать на таком оборудовании среду C++Builder, всегда считавшуюся более медлительной и при установке, и при сборке проекта.

Конечно, тема быстродействия важна только для «старого железа», но то, насколько актуален вопрос утечки памяти (как это было в прошлых версиях), можно будет понять лишь после работы с Delphi 2009 в течение определенного времени.

Печальная новость для ценителей бренда — на стартовой странице bds:/default.htm полностью исчезло упоминание о компании Borland. Зато появилась надпись Embarcadero Technologies. Честно говоря, посвященная Delphi страница с заголовком «Причины купить» сайта CodeGear не слишком впечатляет. Если под «быстрым созданием высокопроизводительных приложений» подразумевается множество убранных «глюков», то при создании маленького проекта это не ощущалось. Про «богатые пользовательские интерфейсы» речь пойдет немного позже, а вот выражение «Unicodeenabled Delphi» можно считать ключевым. Но рассмотрим все по порядку.

Поддержка Unicode

Тип данных String больше не String! Теперь под этим названием скрывается тот, что ранее именовался UnicodeString, и значит, обычный строковый тип по умолчанию поддерживает кодировку UTF-16. Разработчики, ведущие сложные, продолжительностью в несколько лет, многоверсионные проекты, по достоинству оценят такое нововведение, если, конечно, рискнут переделывать исходные тексты. Страшно подумать, сколько загадочных сюрпризов поджидает их, например, при «перекапывании» алгоритмов работы с файлами или позднее, во время тестирования.

Естественно, с историей не поспоришь. Считается, что Unicode — будущее человечества, но сложно понять, зачем делать столь революционную замену для уже устоявшейся платформы. Следовательно, «дельфисты», использующие тип String для хранения несимвольных данных, или работающие с массивами символов, вряд ли сочтут новое заклинание Unicodeenabled Delphi весомым аргументом в пользу перехода на новую версию IDE. Несомненно, кому-то придется по нраву переопределение строковых (String) идентификаторов и массивов (Set of Char) на AnsiString и AnsiChar соответственно. И действительно, если для проекта так важна многоязычность, то не проще ли сразу писать его под .NET? Любой пользователь, вспомнив историю развития Delphi, может задаться вопросом: почему, собственно, нельзя было давным-давно превратить тип String (для Win32) в полноценный, богатый всякими полезными возможностями класс наподобие тех, что существуют в Java, C# и даже JavaScript?

Шаблоны

Конечно, важнейшим новшеством оказались шаблоны. Они были документированы еще в 1990 г. для языка C++, а теперь добрались и до Delphi.

В свое время эта технология стала несомненным прорывом в области программирования масштабируемых систем. Большая часть кода в стандартной библиотеке C++ состоит из шаблонов. Разработчики на C++ убеждены, что их нельзя рекомендовать программистам-новичкам. Кстати, для Free Pascal шаблоны в виде эксперимента были добавлены ровно год назад.

Рассмотрим простой пример. Опишем собственный шаблон на базе существующего:

TMyList = class(TList)
public
//Допустим, нам надо добавить какой-то метод
procedure Sort(const AComparer: TComparison);
end;

Теперь воспользуемся им:

procedure TfrmGenTest.Button1Click(Sender: TObject);
var value:TMyClass;
List:TMyList;
begin
//Создаем список
List:=TMyList.Create;
try
//Добавляем элемент к списку
List.Add(‘Какой-то текст’);
Button1:=List.Items[0]; { — как ожидалось,
сообщение об ошибке компилятора }
finally
List.Free;
End;
end;

Уже на этапе компиляции проводится проверка типов, а до этого лишь слепой не увидит всплывающую подсказку о типе для List.Items[]. Можно по-прежнему использовать давно знакомый TStringList — выбор за разработчиком. С появлением шаблонов он уже есть. В каждом случае конкретное решение можно принять после детального рассмотрения нужного шаблона. Кроме того, данная технология только начинает проникать в мир Delphi, и все дискуссии на данную тему, скорее всего, еще впереди. Стоит упомянуть, что в стандартный набор шаблонов вошли TList, TQueue, TStack, TDictionary, TObjectList, TObjectQueue, TObjectStack и TObjectDictionary.

Анонимные методы

Перейдем к следующему фундаментальному новшеству.

Так уж повелось в программировании, что качественным считается прежде всего тот код, который человеку легко читать. Ведь наряду с правильной реализацией алгоритма важна также возможность быстрых последующих корректировок не столько другими людьми, сколько самим автором кода, причем без длительных размышлений о том, зачем нужна эта функция и почему она стоит именно здесь. Не следует забывать об одной существенной идее, заложенной в языках программирования: удобство представления алгоритма как для человека, так и для машины. И вот с этой точки зрения анонимные методы могут показаться очень спорным достижением для Delphi. Но раз сама Microsoft решила добавить аналогичный функционал в C# 2.0, то это точно кому-нибудь нужно. И теперь в Delphi появится уже целый «зоопарк» из всевозможных конструкций, введенных в разные периоды развития языка.

Для начала развлечемся, рассмотрев простой пример. Зададим два типа:

TMyProc = reference to procedure(const src:String);
TMyProc2 = procedure(const src:String);

Второй тип — привычный процедурный. Кстати, редактор кода отказался выделять жирным шрифтом ключевое слово reference.

Добавим еще три процедуры:

procedure OutMyText(const source:String);
begin
ShowMessage(source);
end;
procedure ShowText(const proc: TMyProc; const
src:String); overload;
begin
proc(‘[1]: ‘+src);
end;
procedure ShowText(const proc: TMyProc2;
const src:String); overload;
begin
proc(‘[2]: ‘+src);
end;

А теперь заставим их выполняться по нажатию кнопки на форме:

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowText(OutMyText,’Hello World, товарищи!’);
end;

Вопрос простой: если уж все это скомпилировалось, то какая из процедур будет использована? Оказалось, что выполнялась вторая. Неужели первая просто не приспособлена для подобного вызова? Проверим это, закомментировав вторую. В результате заработала первая процедура. А ведь совсем недавно характерной чертой Object Pascal была именно однозначность. Ну что же, по крайней мере опытным путем удалось выяснить приоритеты.

А теперь перейдем к делу — заменим обработчик кнопки:

procedure TForm1.Button1Click(Sender: TObject);
begin
// ShowText(OutMyText,’Полный привет!’);
ShowText(
procedure (const source:String)
begin
ShowMessage(source);
end,
‘Ура!’
);
end;

Стоит признать, что подобный функционал действительно может быть полезен, ведь появляется выбор — описывать какую-то короткую процедуру (которая может быть использована в первый и последний раз) или вписать ее прямо в аргументы. Хотя, конечно, запятая после end смотрится как-то дико.

Впрочем, это не предел, добавим новую функцию:

function ViewMyText(const src:String):TMyProc;
begin
ViewMyText:= procedure(const source:String)
begin
ShowMessage(src+source);
end;
end;

И заменим обработчик кнопки:

procedure TForm1.Button1Click(Sender: TObject);
var RSLT:TMyProc;
begin
//Вычисляем процедуру
RSLT:=ViewMyText(‘Ужас!’);
//Заставляем ее работать
RSLT(‘ — новый Delphi’);
end;

Гибкость и простота использования безымянных методов бесспорны. Остается лишь подождать и посмотреть, завершатся ли споры маститых «дельфистов» вокруг этого новшества появлением конкретных рекомендаций о том, в каких случаях лучше применять данное средство, чтобы оптимизировать текст, не нарушив его читабельности.

Новые визуальные компоненты

В новой версии Delphi добавлена страница компонентов Ribbon Controls.

Использование компонентов с новой страницы Ribbon Controls

Думаю, противникам компонента TActionManager (точнее, полным лентяям вроде автора статьи) вряд ли удастся поработать с такими новинками. Реализовать что-то серьезное с помощью Ribbon Controls (например, основное меню и панель быстрого запуска) можно только с применением TActionManager. Если случайно удалить с формы этот компонент, среда Delphi начнет злобно ругаться программными исключениями.

Демонстрационная программа с применением компонентов Ribbon Controls запущена в Linux с помощью Wine

Стоит отметить, что демонстрационное приложение с использованием Ribbon Controls из папки Demos почти без искажений запустилось под Wine на Linux.

Еще нельзя не заметить, что добавился колоритный компонент TCategoryPanelGroup в стиле MS OutLook. С каждой новой версией Delphi сторонние визуальные компоненты становятся менее нужными — мелочь, а приятно. Жаль только, что в папке Demos не удалось обнаружить пример употребления этого нового компонента.

Кроме того, добавились компоненты TButtonedEdit, TLinkLabel и TBalloonHint.

Использование нового компонента TСategoryPanelGroupКомпонент TButtonedEdit — поле ввода с возможностью отображения внутри него одной или двух кнопок. Для их обычного состояния, нажатия или подведения курсора могут быть заданы собственные индексы картинок. Реализация таких кнопок незатейливая — они не прорисовываются, видны только изображения. Следует отметить, что компонент TLinkLabel, созданный сторонними разработчиками, стал мелькать в глобальной Сети довольно давно, а значит, у кого-то появятся маленькие неожиданности при сборке под Delphi 2009 уже существующих проектов. Наверняка «родной» компонент TLinkLabel в чем-то окажется несовместим со своим тезкой.

Вообще, немногим более чем за десять лет «дельфисты» научились рисовать красивый графический интерфейс с помощью широкого набора сторонних компонентов, в том числе и бесплатных.

Первое впечатление от компонента TLinkLabel — это просто шутка разработчиков Delphi, ибо особых внешних отличий от TLabel не наблюдается. Но при более подробном изучении стало ясно, что хитрый Delphi занимается парсингом свойства TLinkLabel.Caption. К примеру, если приравнять Caption к значению Мир ПК, то на форме получится отображение: Мир ПК . Наша надпись, как и положено, отобразилась на форме в виде ссылки.

Затем усложним:

Заходите на сайт журнала ru”>Мир ПК!

На форме уже в режиме дизайна отобразится надпись:


Заходите на сайт журнала Мир ПК!

Интересный факт: если нажать мышью на саму ссылку, то последовательно сработают обработчик событий OnLinkClick, а затем OnClick. Если же нажать на обычный текст, не сработает ни одно из событий.

Узнаем, каков предел мудрости компонента TLinkLabel, изменив свойство Caption:

Сайт журнала Мир ПК

Согреем себя мыслью, что если не HTML 4, то хотя бы стандарт XHTML в его обобщенном виде на нашей стороне. По идее вся оставшаяся после тега часть текста должна быть воспринята как имя ссылки. Но нет, Delphi просто отобразит на форме Caption все введенные символы в виде статического текста в три строки.

Вывод один: TLinkLabel работает только с тегами ссылок и лишь в формате .

Результат проверки работы компонента TBalloonHintПоследний новичок среди родных для Delphi визуальных компонентов — TBalloonHint. Первая странность, сразу же бросающаяся в глаза, — большинство нужных свойств доступны исключительно из режима запуска. Понятно, что специфика компонента частично оправдывает подобное решение, однако это сделано в ущерб наглядности визуального проектирования.

Те, кто хочет удостовериться, что подобные компоненты существовали и ранее, могут посмотреть в Сети хотя бы ссылки на TLMDShapeHint или LMDMessageHint.

Кстати, поджидает еще одна неприятность: компонент зависит от тем для Windows и в стандартном виде показывает стандартную всплывающую подсказку. Кроме того, отсутствует отдельное управление шрифтами, т.е. они жестко зависимы от системы. Минус еще и в том, что при малейшем изменении настроек темы Windows запущенная система Delphi 2009 начинает выдавать сообщения об ошибках.

Перейдем к делу, напишем простой обработчик кнопки для проверки работы TBalloonHint:

procedure TForm4.Button1Click(Sender: TObject);
begin
BalloonHint1.Title:=’Привет!’;
BalloonHint1.Description:=’Проверка работы компонента ‘+
BalloonHint1.ToString;
BalloonHint1.ShowHint;
end;

Надо упомянуть, что для TBalloonHint предусмотрена возможность подключения картинки из TImageList.

О ценах

И напоследок о животрепещущем. Вот примерные расценки на новую версию продукта (согласно прайс-листу на сайте одного из интернет-дистрибьюторов):

Delphi 2009 for Win32 Enterprise Box 59 500 руб.
Delphi 2009 for Win32 Enterprise ESD — 58 700 руб.
Delphi 2009 for Win32 Professional Box — 26 800 руб.
Delphi 2009 for Win32 Professional ESD — 26 000 руб.
Delphi 2009 for Win32 Enterprise Upgrade Box — 38 700 руб.
Delphi 2009 for Win32 Enterprise Upgrade ESD — 37 900 руб.
Delphi 2009 for Win32 Professional Upgrade Box — 11 900 руб.
Delphi 2009 for Win32 Professional Upgrade ESD — 11 100 руб.

Здесь Box — вариант поставки DVD-коробки, а ESD — получение по почте регистрационного ключа. Таким образом, стоимость владения постоянно свежей средой Delphi класса Professional составляет около 500 долл. в год (с учетом возможных ежегодных выходов новых версий).

* * *

Возможно, кто-то сочтет автора консервативным, ведь в статье не поднимался вопрос использования визуальных компонентов в среде MS Vista, а также не были рассмотрены компоненты для создания современных распределенных приложений. Однако приведенный материал позволяет сделать вывод, что новый пакет Delphi 2009 for Win32 вполне способен претендовать на роль новой «любимой лошадки» для Delphi-разработчиков.

Заглянем в будущее

Российское представительство компании Embarcadero Technologies (напомним еще раз, что именно она приобрела у Borland подразделение CodeGear, занимающееся созданием средств разработки приложений) открылось совсем недавно, 1 сентября этого года. Стоит отметить, что работает в нем все та же команда специалистов, ранее трудившихся на Borland, а еще совсем недавно — на Borland CodeGear.

Руководство компании поделилось с журналистами и разработчиками своим видением стратегии ее развития и планами по выпуску новых средств разработки на ближайшие полгода.

Конечно, планы у частной американской компании Embarcadero (скромно названной просто в честь улицы в Сан-Франциско) довольно серьезные. Помимо приобретенных решений для разработки она станет активно продвигать собственные инструменты для программистов и разработчиков. При этом упор будет делаться на свободу выбора заказчика и независимость от конкретной платформы. По мнению Людовика Невью, директора по продажам в регионе EMEA, преимущество компании Embarcadero в том, что она не придерживается принятого многими стекового подхода, когда пользователю предлагается цепочка «программное решение — средство разработки — СУБД — техподдержка» только в рамках какой-то одной платформы.

Что же касается средств разработки, то все, что было сделано ранее при участии Borland или без оного, останется и в линейке продуктов Embarcadero. Кстати, линеек теперь две: CodeGear (средства разработки) и DatabaseGear (средства для работы с базами данных). Согласно представленным планам, в октябре-ноябре в продажу должна поступить версия Delphi для .NET, а вместе с ней и полный вариант CodeGear RAD Studio 2009. Правда, пока не уточняется, какая именно версия Framework.NET будет поддерживаться в новом продукте.

Примерно в эти же сроки ожидается выход следующей версии программы 3dRail, а также версии Turbo для языка Ruby. О продуктах Turbo стоит сказать отдельно. В начале следующего года намечен выход версий Turbo Pascal и Turbo C++. О них можно сказать, что это современные версии старых добрых редакторов. В них не будет ни возможности визуального проектирования, ни многочисленных компонентов, ни полноценной среды быстрой разработки, а войдет лишь минимальный набор средств: редактор кода, компилятор, отладчик и т.д. Предназначена линейка Turbo прежде всего для обучения основам языков программирования.

М. С.