Home

Реклама

Байты пораньше | Байты попозже

Here Comes Tiburon. Part II

  • 23 Авг, 2008 at 8:08 PM
Skiminok
Пришла мне наконец написать давно планируемый пост про один из самых знаменательных релизов Borland, CodeGear и Embarcadero. Про релиз, который, право слово, станет знаменательным. Про релиз, который приносит в нашу жизнь вагон возможностей, который ставит Делфи в один ряд с возможностями многих признанных языков и технологий... короче, харе пафоса =) Всё очень просто. Сегодня я хочу написать в блоге про Delphi & C++Builder 2009 aka Tiburon.

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

Приношу свои извинения за то, что "пост" по факту представляет собою три поста: даже у ЖЖ, как выяснилось, есть ограничения на объём записи (да что вы говорите... :-D ). Каждый пост будет оформлен в виде списка возможностей с пунктами и подпунктами. А по каждому подпункту - краткое описание плюс кучка ссылок. Ссылок много, очень много, пост будет полон ими чуть более, чем наполовину. Практически все из них - на инглише, но это дело десятое, я полагаю. Интересующемуся человеку прочесть не составит труда, угу? Итак, я начинаю.

Оглавление:
Part I: Юникод и параметризированные типы aka дженерики.
 —> Part II: Анонимные методы, IDE и VCL, разнообразное прочее.
Part III: Нововведения в С++Builder`e.


III. Anonymous methods.
По правде говоря, анонимные методы в таком виде, в котором они представлены сейчас в Делфи, представляют собою не более чем "синтаксический сахар". Им ещё далеко до великих концепций функционального программирования, которые в последнее время так распостранялись между разными, нефункциональными в том числе, языками: замыканий (closures) и лямбд (lambdas). Однако сама по себе концепция анонимной функции, даже не будучи представлена в виде лямбда-исчисления, достаточно интересна, удобна, и широко используется популярными языками, в том числе C#, Руби, Python, Perl, PHP... а теперь и Delphi. Welcome.

  1. Анонимная функция, как невероятно сложно догадаться, имени не имеет)))
    Нет, это не всё, не надейтесь) Анонимная функция примечательна тем, что определяется в том месте, где необходимо, не имеет имени, и по факту является указателем на некоторый исполняемый код. Эти указатели, как и любые указатели, - не более чем типы, переменные такого типа спокойно объявляются, присваиваются и копируются. А можно обойтись и без переменных. Пожалуй, лучше всего объяснит маленький кусок кода:
    type
      // method reference
      TProc = reference to procedure(x: Integer);              

    procedure Call(const proc: TProc);
    begin
      proc(42);
    end;

    var
      proc: TProc;
    begin
      // anonymous method
      proc := procedure(a: Integer)
              begin
                Writeln(a);
              end;              

      Call(proc);
      Readln;
    end.

    Код в высшей степени бесполезен, однако хорошо проясняет суть дела:) Мы видим новую синтаксическую конструкцию "reference to procedure". Да, переводчик вас не обманул - это указатель на процедуру. Или на функцию. И всё. Указатель на любую функцию: обычную функцию, вложенную функцию, функцию из DLL, анонимную функцию (только не на обычный метод, ибо у обычных методов нет счётчика ссылок, в отличие от анонимных)... Вот именно, поскольку TProc здесь является только лишь указателем, мы можем в обычном стиле присвоить переменной этого типа ссылку на уже объявленную функцию, а не объявлять её здесь же анонимной. А можем и поступить так, как в коде. Всё зависит только от нашего желания)

    И опять разговор про указатели. Если верить Крейгу Станцу, то из того, что "reference to procedure" - просто указатель, следует факт: мы можем изменить сигнатуру уже объявленного анонимного метода, добавив туда дополнительные параметры. А это серьёзное дополнение. Прежде, если мы не могли контролировать, как (т.е. с какими параметрами) объявлено кем-то другим то или иное событие, нам оставалось или смириться, или извращаться, наследуя класс, или добавляя в него дополнительное поле. С анонимными методами всё это становится ненужным=)

  2. Теперь поговорим про контекст. Если бы всё, что относится к анонимным методам, заканчивалось на первом пункте, тогда они превращались бы в полнейшую дребедень и бессмыслицу, допустимую только для функций навроде A+B. Но сила контекста даёт им жизнь. Итак, внимание: для анонимных методов видимы все те переменные, которые были видимы в момент их добавления.
    Это всё равно что вы объявите в процедуре вложенную подпроцедуру. (Между прочим, языки с си-подобным синтаксисом подобного не поддерживают.) Для подпроцедуры глобальны все переменные, которые для процедуры являются как глобальными, так и локальными. И она может обращаться к ним в любое время. Точно та же концепция действительна и для анонимных методов. Исходники в студию:
    type
      TFuncOfInt = reference to function(x: Integer): Integer;

    function MakeAdder(y: Integer): TFuncOfInt;
    begin
      MakeAdder := function (x: Integer): Integer;
        begin
          Result := x + y;
        end;
    end;

    var
      Adder: TFuncOfInt;

    begin
      Adder := MakeAdder(20);
      WriteLn(Adder(22));  // выведет 42
      Readln;
    end.

    Прежде чем продолжать, обращаю внимание читателей (буде таковые имеются :-D ) на специфику такой конструкции. На практике очень часто применяются функции, создающие другие функции в зависимости от параметров. Это экономит время и место, в случае, если результирующая функция готовится к частому использованию. Пригодится.

    Фактически, использование глобального контекста анонимных методов даёт программисту возможность использовать их в качестве callback`ов. В самом деле, чего нам стоит передать анонимную функцию как параметр куда-нибудь во внешний объект, дав ему возможность обращаться только к тем элементам нашего класса, которые ему требуются? Ведь теперь для этого даже не нужно заводить дополнительных переменных - смотрите!
    // some stuff

    type
      TStaticThread = class(TThread)
      // la la la
      public
        // blah blah
        class procedure Execute(executor: reference to procedure);
      end;

    //  param pam pam

    procedure TForm1.Button1Click(Sender: TObject);
    begin
      TStaticThread.Execute(
        procedure();
        var
          I: Integer;
          Fact: Int64;
        begin
          Fact := 0;
          for I := 1 to 1000000 do begin
            Inc(Fact, I);
            Caption := IntToStr(Fact);
          end;
        end;
      );
    end;

    // meow meow

    end.

    Я в этом примере малость погрешил от истины... но давайте забудем на секундочку про необходимость синхронизации для Form1.Caption, в конце концов, она прекрасно сюда добавляется, и представим себе... если бы CodeGear действительно добавила в VCL подобный статический анонимный поток, это было бы чудо... Всего лишь парой строк отправить долговыполняемый код в отдельный поток и оставить его предоставленным самому себе, не создавая при этом гору дополнительных переменных, методов и заботясь о памяти для всей этой оравы... сказка просто)

  3. Зачем нужны анонимные методы? Подробный и обстоятельный ответ дал Ларс Фосдэл в своём блоге, ссылку на него я даю в "материалах" ниже на первом месте, ну а в своём же блоге просто кратко перечислю эти улучшения:
    1. Для лямбда-выражений (подробнее см. ссылку №5 в "материалах").
    2. В тесной интеграции с дженериками. Классы произвольных типов в сочетании с передаваемыми ссылками на функции, которые манипулируют этими типами, дают программисту невиданную гибкость.
    3. Для качественной инкапсуляции.
    4. Для потоков.
    5. Для callback`ов.

    Обещанные материалы для дополнительного чтения:
    Anonymous Methods - When to use them?
    Tiburon - Anonymous Methods
    Understanding Anonymous Methods
    Tiburon - new language features for Delphi 2009
    Is it a llama? Is it a lambada? No, it's the lambda!
    Can Your Programming Language Do This?


IV. IDE и VCL.
Здесь материала становится на порядок больше, а объём каждого отдельного пункта - на тот же порядок меньше. Что логично: нововведений в IDE и VCL достаточно много, однако большую часть из них достаточно назвать и описать, а не расписывать, как в случае с тремя вышеприведёнными глобальными нововведениями. Так что перехожу в IV части на принцип "меньше слов - больше дела". Да, ещё. Материалы и ссылки здесь даются после каждого из подпунктов, так что повнимательней...

Первое, о чём стоит предупредить в этих строках. Тибурон - это два отдельных продукта: Delphi 2009 и C++Builder 2009. Будучи установленными вместе на одну машину, они объединяются в привычную нам интегрированную среду, однако ничто не мешает пользоваться ими по отдельности. Что же касается Delphi for .NET, то её поддержка ничуть не прекратилась - просто релиз будет примерно через полгода, с абсолютно ошеломляющими нововведениями. Если мы дождёмся .NET 3.5 - это будет wonderful!

  1. Для начала о мелких новых компонентах и усовершенствованиях в старых, куда же без них. В принципе, чуть менее чем полностью первый пункт может описать несколько самых обыкновенных скриншотов, приведённых по этой ссылке на Developer Network. Я же, в свою очередь, добавлю краткое текстовое описание каждого из составляющих:
    TCategoryPanel. Коллекция раздвижных панелей в стиле Outlook, занимает всю левую половину первого скриншота. Можно настраивать положение текста на заголовках панелей, цвета и градиенты заголовков, их расположение (вертикальное/горизонтальное) и др.
    TButtonedEdit. Поле ввода с двумя кнопками-рисунками по краям, видно в правом верхнем углу первого скриншота Чаще всего используется для создания поисков: правая кнопка очищает поле ввода, левая активирует поиск либо контекстное меню с параметрами поиска, а потом уже активирует. Рисунки и действия при кликах на них можно задавать. Минусы: непонятно, почему не развить идею и не сделать две коллекции кнопок по краям поля ввода.
    TLinkLabel. Обычный лэйбл, просто умеющий распознавать HTML-тэг <a> и с добавленным событием OnLinkClick. Незатейливый вид - в центре справа первого скриншота.
    TBalloonHint. Vista-like широко настраиваемая всплывающая подсказка с картинкой, на остальных ОС идентична традиционной. Эффект показа - в правом нижнем углу первого скриншота.
    Во всех визуальных компонентах теперь присутствует свойство CustomHint, которому можно назначить любого наследника TCustomHint, в том числе как и стандартный THint, так и вышеуказанный TBalloonHint. Или вообще написать собственный контрол подсказки.
    TButton обзавёлся свойством Style, которое даёт ему возможность кастомизированного поведения. Дефолтный стиль - bsNormal. Стиль bsCommandLink отсылает нас к Вистовским диалогам и сообщениям об ошибках. Отличается специфическим видом, иконкой и подсказкой с мелким текстом под основным Caption`ом. На XP и ниже идентичен bsNormal. Стиль bsSplitButton добавляет к кнопке drop-down-меню по клику на ней. Оба стиля занимаю центр и низ второго скриншота.
    Да, а ещё TButton обзавёлся картинкой. TBitBtn остаётся только для обратной совместимости. Эффект - в верхней части второго скриншота.
    У TEdit`a имеется свойство NumbersOnly, позволяющее вводить туда только цифры. Предупреждающее об ошибке сообщение - в верхней части третьего скриншота. Идиотизм, как по мне. Сложно было нормальную широкую проверку по регекспам организовать, нет, напряглись и родили огрызок?
    Ещё TEdit`у добавили свойство TextHint. Это серый текст подсказки, который отображается в поле ввода только, когда оно неактивно. Удобно во всех отношениях.
    Новый TProgressBar тоже меняет свой стиль. Он может оставаться нормальным, в таком случае на Висте к нему добавляется анимация, может быть поставлен на паузу (визуально: остановка плюс на Висте замирает анимация), может указать на ошибку выполнения (цвет бара меняется на красный), а может вообще изменить стиль на Marquee - знакомую нам бегающую из стороны в сторону полосу. Иллюстрация (поганая вообще-то) - четвёртый скриншот.
    Новое свойство TListView и TTreeView - коллекция Groups. Позволяет группировать элементы списка, давая каждой из групп заголовок, подпись и иконку, как видно из пятого скриншота.

    Материалы для дополнительного чтения:
    Tiburon Screenshot
    Sneak Peek Video - What's New in the VCL in Delphi and C++Builder 2009

  2. TImageList теперь позволяет содержать в себе любые изображения, которые поддерживаются в составе TImage. А поскольку замечательный и знаменитый проект TPNGImage пару недель назад перешёл под эгиду CodeGear, то теперь мы получаем поддержку PNG во всех частях VCL "искаропки". Вуаля.

    Материалы для дополнительного чтения:
    What happened to the TPNGImage project?

  3. Новое слово в Visual Component Library - это, конечно же, Ribbon. Да, теперь Delphi включает в себя полную поддержку для создания интерфейсов в стиле Microsoft Office 2007 - со всеми его возможностями. Более того, вместе с Делфи будет традиционно поставляться демка - в которой коджировцы, не мудрствуя лукаво, воссоздали половину 2007 Ворда :-) Причём, судя по всему, максимум за полчаса-час. Быдлокодерство, конечно... но челюсть отвисает)
    Да, ещё. Редмондовцы у нас, как всегда, своего не упускают. Для того чтобы разрабатывать приложения в Ribbon-стиле, вы обязаны получить у M$ лицензию. Нет, донт ворри, лицензия бесплатная (странно, правда? :D ). Действительно бесплатная. Просто M$ "настолько горды за разработанную собою концепцию самого удобного пользовательского интерфейса", что не могут позволить пользоваться этой идее всем без спросу. Какая реальная фишка с той лицензии, я так и не понял, честно говоря... но зайти на microsoft.com и сделать 10 кликов мышкой вроде бы невелика задача.

    Материалы для дополнительного чтения:
    Delphi 2009 (beta): Ribbon Controls

  4. А теперь про новые визарды и усовершенствования собственно IDE. Первое новое окно называется Class Explorer, оно позволяет легко передвигаться по иерархии классов в вашем проекте, переходить к объявлениям и реализациям полей, свойств и методов, находить для классов предков и потомков, а также отображает глобальные переменные тех классов, которые, собственно говоря, задействованы в Class Explorer. Кроме того, разумеется, в Class Explorer наличествуют специальные диалоги для добавления полей, свойств и методов. Чем-то мне это всё напоминает CnWizards, GExperts... в общем, всю ту гигантскую компанию коллекций экспертов от третьих лиц, которыми мы уже который год постоянно расширяем себе Делфи. Да, до их функционала CodeGear RAD Studio пока далеко. Ну и не надо. А то совсем расжиреет и вызовет нездоровый вой ненавистников. Мы же просто порадуемся старому знакомому окошечку.

    Второй эксперт - из разряда "наконец-то дождались". Это Resource Manager, позволяющий добавлять в проект Windows-ресурсы, со всей необходимой функциональностью. Теперь, по крайней мере, больше не нужно париться при сборке с res-файлами и Restorator`ом. Ничего особенного, в принципе, от Resource Manager`a, ждать не стоит: ну что от него можно ждать. Добавление ресурса, указание его типа и идентификатора. Больше нет ничего, что могло бы придти в голову... Поэтому просто ура.

    Третье нововведение в IDE носит гордое название "build configurations and options sets". Проще говоря, это позволяет создавать ваши собственные подборки параметров для сборки проекта, таких как забитые изначально известные всем Debug и Release. Теперь такие спецподборки можно создавать в неограниченном количестве, называть своим именем, а также импортировать и экспортировать в собственном формате CodeGear - "option set". Сказать по правде, бывает много случаев, когда подобное может пригодиться, особенно в специфических условиях постоянного дебага, тестирования и профилирования. Ставлю плюсик.

    Два слова про дебаггер. В Windows Vista появилась замечательная возможность под именем "Wait Chain" - "очередь ожидания". Она позволяет отслеживать иерархию потоков, в которых некоторые остановились в определённых точках и ожидают завершения других. Таким образом, когда в многопоточном приложении один поток вызывается из другого таким образом, что последний останавливается и ожидает его завершения, вы будете видеть всё дерево в дебаггере как Wait Chain. Разумеется, с указанием состояния, статуса, айди и ассемблерного кода. Согласно MSDN,
    WCT (Wait Chain Traversal) currently supports the following synchronization primitives:
    - ALPC
    - COM
    - Critical sections
    - Mutexes
    - SendMessage
    - Wait operations on processes and threads

    За это ещё один жииирный плюсик.

    Небольшой новый (вернее, хорошо забытый старый) мастер "The ActiveX Control Wizard" проводит нас сквозь процесс создания VCL-компонента из ActiveX-контролов.

    Дурацкий и неудобный "фильтр" в панели контролов заменён на нововведённый TButtonedEdit. Собственно говоря, если быть до конца откровенным, то эту строку поиска в лучших традициях Vista засунули всюду, куда она только влезла: в половину диалогов, в часть визардов... почти везде, где присутствуют какие-либо списки. Я пишу эти строки с иронией, однако нельзя сказать, что недоволен, как ни крути)
    Да, ещё. Диалоги теперь растягиваются и гораздо удобнее организованы.

    Материалы для дополнительного чтения:
    Tiburon Preview: Vista Wait Chain Traversal
    What’s new in the Delphi 2009 IDE
    Tiburón Sneak Peek: Project Options
    Tiburon Sneak Peek: Com Wizards
    Tiburón Sneak Peek: COM
    Tiburón Sneak Peek: New Component Wizard
    Tiburón Sneak Peek: Import Component Wizard
    Tiburón Sneak Peek: Registered Type Libraries
    Tiburon Sneak Peek: Tool Palette

  5. Брюс МакГи пишет, что CodeGear повысила удобство справки Делфи, в частности добавила туда отдельную классификацию для защищённых полей, событий, методов и свойств. Скриншот можно увидеть у него в блоге.

  6. И на закуску - про указанное, но не описанное. Есть ещё несколько фраз, которые были обронены Девидом Интерсаймоном в его онлайн-вебинаре, однако так и не были подробно объяснены им в его ходе. Я приведу их здесь как есть, по-английски, ибо пока что без единого официального туториала остерегаюсь переводить названия сих фич, чтобы случайно не заехать в ложную степь и какой-то двусмысленностью не обнадёжить относительно совершенно не запланированной функциональности:
    Web:
    - Complete RAD Web Application Framework
    - AJAX, Silverlight and VCL WYSIWIG designer
    - Server side event handling

    Full support for Vista themes and Windows Aero.


V. Miscellaneous.
Этот раздел - подборка всех фактов про Delphi (только про Delphi), которые вашему покорному слуге не удалось категоризировать. Соответственно они и подаются как набор отдельных фразочек, между прочим, довольно-таки интересных сведений про Тибурон по отдельности. Линки для чтения прилагаются.

  1. Инсталлятор Tiburon`a теперь не требует наличия предустановленного на компьютере Microsoft .NET SDK, ему достаточно установить для просмотра справки последнюю версию Microsoft Document Explorer. Таким образом, так называемый prerequisite-список сократился на один пункт.
    Delphi 2009 - One less prerequisite

  2. Процесс установки ускорился по меньшей мере вдое. Таким образом, если CodeGear RAD Studio 2007 Highlander требовала на среднестатистической машине от 10 до 30 минут для установки, то Девиду Интерсаймону для инсталляции Tiburon'a потребовалось приблизительно 10 минут, а Холгеру Флику вообще ровно 5.
    Delphi 2009 (beta): Installation speed has been improved a lot!
    Delphi 2009 beta: Installation improvements

  3. Колоссальный прогресс сделан также в технологии DataSnap (она же dbExpress Remoting). К сожалению, я не специалист в данной области, потому особенно не вникал в суть этих нововведений и, честно говоря, не было желания переводить. То, что могу сказать интересного по крайней мере для себя: она теперь не зависит от СОМ. Вот неполный список нововведений, взятый из вебинара Девида Интерсаймона:
    - New ServerMethods give complete control over functionality of middle tier.
    - Call procedures from server as if the cide were right on the client.
    - Continue to use familiar IAppServer interface while expanding power of application services.

    Для больших подробностей можно заглянуть по нижеприведенным ссылкам:
    Tiburon DataSnap enhancements
    Tiburon - more about DataSnap
    Tiburón yeniliklerine devam ediyoruz-3 (DataSnap) - Video

  4. TObject унаследовал три фичи от своего дотнетовского собрата. Это функции ToString(), возвращающая строковое представление объекта, удобное для чтения (для самого TObject`a реализована как возвращение ClassName, в потомках постоянно перекрывается); GetHashCode(), возвращающая хэш объекта, применяемый во многих областях (чаще всего - в словарях) и Equals(), реализующая кастомизируемую программистом проверку двух объектов на совпадение. Плюс ещё три удобных функции не из мира .NET. Вот как объявлены нововведения:
    class function MethodAddress(const Name: string): Pointer; overload;  
    function FieldAddress(const Name: string): Pointer; overload;  
    class function UnitName: string;  
    function Equals(Obj: TObject): Boolean; virtual;  
    function GetHashCode: Integer; virtual;  
    function ToString: string; virtual;  


  5. Следующая возможность действительно из разряда давно ожидаемых. Лично меня постоянно в функциях задалбывало писать две отдельные строчки для выхода из середины тела функции: сначала ты присвой значение результату, а потом выйди. Да, согласен, использование результата как отдельной неявной переменной Result - очень удачная техническая находка, она просто незаменима во многих выражениях... но всё-таки в данном конкретном случае неудобно. И вот CodeGear вводит в Делфи конструкцию, сходную с сишным оператором return. На самом-то деле они всего лишь добавили один параметр в функцию Exit(): параметр, который надо передать ей возвращаемое значение функции при немедленном выходе. Параметр этот не имеет определённого типа, тип его определяется в момент компиляции и становится равным типу результата функции, логично :-) Вот два исходника для сравнения:
    function DoSomething(aInteger: integer): string;
    begin
      if aInteger < 0 then
      begin
        Exit('Negative');
      end;
      Result := 'Positive';
    end;

    function DoSomething(aInteger: integer): string;
    begin
      if aInteger < 0 then
      begin
        Result := 'Negative';
        Exit;
      end;
      Result := 'Positive';
    end;

    Они идентичны с точки зрения компилятора.
    New Language Construct for Exit

  6. В состав Тибурона входят, в числе прочего, обновленные версии TeeChart 8.0 и RaveReports 7.6.

  7. Знаменитый Марко Кэнту в настоящее время пишет книгу, которая посвящена только и исключительно Tiburon - то есть всем нововведениям в этой версии. Учитывая, что нововведений уйма, 2009 причисляют к разряду breaking release`ов, Марко даже и не надеется успеть с книгой к выпуску. Что ж, буду надеяться, что по крайней мере через месяц этот достойный труд будет готов. Жаль только, что читать придётся на инглише - чтобы у нас перевели такую книгу раньше, чем через годика два, это надо чтобы "щось у лісі здохло".
    Busy Writing Tiburon Book

  8. Как Делфи, так и Билдер будут доступны в трёх лицензиях: привычные нам Proffessional и Enterprise, а также под лицензией Architect, включающей в поставку Embarcadero ER\Studio Developer Edition. Ничего не поделаешь, это новый владелец. Да и нет ничего плохого в принципе: очевидцы отзываются, что для людей, у которых много работы связано с базами данных, это просто незаменимый по возможностям продукт.
    Tiburon — All About Native Code

  9. Весь сентябрь коджировцы будут проводить вебинары, на которых будут подробно и обстоятельно рассказывать о новых фичах Тибурона. Один уже прошёл, между прочим, его запись (~34 Mb) можно найти здесь. Ну а по этой ссылке - расписание всех предстоящих вебинаров.


Оглавление:
Part I: Юникод и параметризированные типы aka дженерики.
 —> Part II: Анонимные методы, IDE и VCL, разнообразное прочее.
Part III: Нововведения в С++Builder`e.

Tags:

Comments

[info]ve_runka wrote:
26 Авг, 2008 12:13 (UTC)
Какой ужас! Случайно заглянула. Моему мозгу это не подсилу. Его уже от одних терминов крутит в разные стороны. Как будто на китайском написано. От слова delfi, С++ - ещё в институте в институте в дрожь бросало.
(Анонимно) wrote:
2 Сент, 2008 14:40 (UTC)
Re: Here Comes Tiburon
Отличный пост!

BTW,
>>> Всего лишь парой строк отправить долговыполняемый код в отдельный поток и оставить его предоставленным самому себе, не создавая при этом гору дополнительных переменных, методов и заботясь о памяти для всей этой оравы... сказка просто)

Не совсем это, но любопытно:
http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=1355

;)
(Анонимно) wrote:
15 Окт, 2008 08:40 (UTC)
А разве их не было?
По поводу анонимных методов, разве их ранше не было?
К примеру для подключения DLL я использую

[code]type
TPlgInit = procedure(var PlgInfo : TPlgInfo); stdcall;[/code]
[info]skiminog wrote:
15 Окт, 2008 18:20 (UTC)
Re: А разве их не было?
В такое традиционное объявление процедуры нельзя подставить вложенную подпроцедуру. Нельзя подставить метод. Нельзя подставить код, написанный прямо по месту (собственно анонимный метод). То есть новый синтаксис есть расширение старых возможностей. И на внутреннем уровне это разные вещи.
(Анонимно) wrote:
10 Ноя, 2008 04:23 (UTC)
А у меня вот работает:
type R=reference to procedure;

TStaticThread = class(TThread)
public
FProc:R;
class procedure Run(MyProc: R);
procedure Execute;override;
end;

class procedure TStaticThread.Run(MyProc: R);
begin
TStaticThread.Create(False).FProc:=MyProc;
end;

procedure TStaticThread.Execute;
begin
FProc;
end;

Наверное возьму на вооружение :-)
[info]skiminog wrote:
10 Ноя, 2008 06:55 (UTC)
Эмс, а где вы полученный объект-поток уничтожать собираетесь?
Это ж какая утечка памяти получилась...

Profile

Skiminok
[info]skiminog
Александр

Latest Month

Июль 2009
Вс Пн Вт Ср Чт Пт Сб
   1234
567891011
12131415161718
19202122232425
262728293031 

Page Summary

Разработано LiveJournal.com
Designed by Lilia Ahner