Borland Delphi 2010

Много трёпа о новой версии Delphi.

Я долго готовился. Заранее следил за обновлениями, восхищался и в уме сочинял статью о том, что дельфи сейчас остаётся почти единственным развивающимся популярным компилируемым языком. Я собирался хвалить анонимные методы:

MethodDictionary.AddHandler('HelloWorldMethod', procedure begin writeln('Hello world'); end;);
MethodDictionary.Call('HelloWorldMethod');

Шаблоны:

type
  TQueue<T> = class
  protected
    procedure Push(Item: T);
    function Pop: T;
  end;

var a: TQueue<TMessage>

Атрибуты:

type
  Table = class(TCustomAttribute)
  public
    constructor Create(const DatabaseTable: string);
  end;

  Field = class(TCustomAttribute)
  public
    constructor Create(const DatabaseField: string);
  end;

  [Table('Clients')] TMyDatabaseRecord = class
  public
    [Field('Name')] property Name: string read GetDatabaseField;
    [Field('Surname')] property Surname: string read GetDatabaseField;
  end;

А также всякие приятные мелочи вроде возврата старой полоски компонентов.

Но Борланд такой Борланд! Точнее, это уже не Борланд, и даже не CodeGear, это теперь Embarcaderro. У меня на работе четыре дельфи установлены следующим образом:
Borland\Delphi 7
Borland\BDS 5
CodeGear\RAD Studio
Embarcaderro\RAD Studio 2010
(упорядочены по времени выхода, не смотрите на цифры). Кого я должен благодарить за этот идиотский расклад? С какой версии боргеркадерро поймёт, что если меняешь хозяев как перчатки – лучше класть все программы в общую папку?

Так вот, Борланд такой Борланд. Инсталлятор триальной дельфи выдал Access Violation при запуске. Потом List index out of bounds. Узнаю тебя, Россия! Инсталлятор вышедшего флагманского продукта, за который они просят 800 долбанных баксов, с первого щелчка – Access Violation! Своё, родное.
Заходим в некоторую подпапку, наугад запускаем другой exe. Этот работает. Снимаем лишние компоненты: предлагает установить всю RAD Studio в 1.4 мегабайта места. Это офигеть, Борланд! Молодцы! Хорошо ужали дельфи, с двухста мегабайт до полутора. Так на язык и просится съехидничать о проценте мусора в программе.

Так или иначе, скачивается 90 мегабайт. Попутно просят ввести имя пользователя на Borland/CodeGear/Embarcaderro Developer Network. Ввожу. Нет такого пользователя. Но вы можете попробовать ввести его емейл, может, мы найдём его по емейлу. Ввожу. Нашли.

Грузится с одной персоналией почти столько же, сколько Delphi 2007. Кстати, в новом RAD Studio включены Delphi for Win32, Delphi Prism (.NET) и Builder. Стандартный набор, но с Prism произошли забавные изменения (ещё раньше): старый Delphi for .NET, насколько я понимаю, был отправлен в утиль, а вместо того дырбыркадеро купили фирму, разрабатывавшую дельфи-совместимый .NET-компилятор для Visual Studio. Так что Delphi Prism теперь происходит в оболочке Visual Studio.

Разумеется, я сразу же полез тестировать Generics. Написал следующее:

type
  PQueueBox<T> = TQueueBox<T>;
  TQueueBox<T> = record
    Link: T;
    Next: PQueueBox<T>;
  end;

  TQueue<T> = class
  protected
    First: PQueueBox<T>;
    Next: PQueueBox<T>;
    function Box(Item: T): PQueueBox<T>;
    procedure DisposeBox(PQueueBox<T>);
  public
    procedure Push(Item: T);
    function Pop: T;
  end;

Очевидный тест, классический пример использования шаблонов. Теперь внимание, барабанная дробь –
Впрочем, никакой барабанной дроби нет, и так всё ясно: дельфи его завалила.

Оказывается, бывают generic classes, бывают generic records, но не бывает – (вот теперь уже настоящая барабанная дробь) – generic pointers. Нельзя объявить шаблон-указатель на шаблон-тип. Можно конкретизировать тип и на него сделать конкретный указатель:

type
  TGenericType<T> = record
    ...
  end;

  TSpecificType = TGenericType<integer>;
  PSpecificType = ^TSpecificType;

Причём вот так уже нельзя:

PSpecificType = ^TGenericType<integer>;

Ёлки, борланд! Эмбаркадерро! Кому нужны generic records без пойнтеров? Вы что, сдурели? Что я вам, буду блоки памяти по значению передавать?! И вообще, чего такого сложного было сделать? Как выясняется, этой проблеме уже почти год (генерики-то были ещё с дельфи 2009). У них в Quality Central висит “сделать generic pointers”. И в новой версии, блин, за год, они добавили поддержку generic interfaces (о которых вдохновенно пишет ихний гендир), но болт положили на generic pointers.

Экспериментирую дальше.

Напишите комментарий:

Если хотите, можно залогиниться.

*