Страницы

пятница, 21 сентября 2012 г.

Revised Object Inspector для Delphi 2010-XE3 от Uwe Schuster. Обзор.

Этот пост является укороченным переводом описания первой версии Продвинутого Инспектора Объектов из блога Uwe.


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

На данный момент Revised Object Inspector поддерживает Delphi 2010, Delphi XE, XE2 и XE3. На 21 сентября 2012 года последней версией является Beta 6.

Автор эксперта: Uwe Schuster. Uwe также является активным разработчиком Version Insight Plus, Modal Search Dialog expert, Platforms Expert, IDE Compiler Utils, а также Jedi Version Control System.

См. также:

Вот так выглядит Revised Object Inspector. Отличия в закладке Favorites и строке фильтрации.

 Продвинутый Object Inspector

воскресенье, 16 сентября 2012 г.

Головокружительные возможности Dependency Injection и Delphi Spring. Часть 8. Разное.

Это перевод публикации Ника Ходжеса от 5 ноября 2011 года: Getting Giddy with Dependency Injection and Delphi Spring #8 – Miscellanea. (перевод сделан с разрешения автора).


Все переводы по Spring


Как обычно, Delphi Spring Framework можно скачать с GoogleCode.

На данный момент мы познакомились со значительной частью основ внедрения зависимости. И это далеко не всё, нам ещё много чего предстоит узнать, но именно в этой статье я хочу остановиться и обсудить пару вещей, о которые стоит поговорить подробнее. Так что лишних церемоний, вот они в виде списка:

  • Как вы наверно заметили, я призываю вас использовать интерфейсы при кодировании и регистрировать классы, реализующие эти интерфейсы в фреймворке. О чём я забыл упомянуть явно, это о том, что все интерфейсы, зарегистрированные в фреймворке Spring должны иметь GUID. GUID легко добавить, нажав CTRL+SHIFT+G в редакторе кода Delphi. А если же вы попробуете использовать интерфейс, у которого нет GUID-а, то получите ошибку: “Project <НазваниеПроекта>.exe raised exception class ERegistrationException with message 'Non-Guid Interface Services are not supported.” («Интерфейсы без Guid не поддерживаются»).
     
  • Если внимательно посмотреть на код в демонстрационных проектах, то можно заметить, что прежде чем что-либо делать с контейнером Spring, необходимо вызвать GlobalContainer.Build. Этот метод должен быть вызван до того, как что-либо может быть получено из ServiceLocator. Метод Build это код, который собирает воедино все зарегистрированные классы, создаёт экземпляры классов или подготавливает их к созданию по запросу, с учётом указанного времени жизни. Если при запуске приложения вы получаете ошибку 'LifetimeTypeManager was expected.', то это с большой вероятностью означает, что вам необходимо вызвать Build для вашего контейнера. И в самом деле, метод Build является основой вашего контейнера Внедрения Зависимостей. Вы должны один раз вызвать метод Build в корне вашего приложения. Для Delphi разработчиков это означает, что он должен быть вызван одной из первых строчек в вашем DPR-файле. Это также означает, что классы лучше регистрировать как можно раньше.
     
  • Вы не обязаны использовать Global Container и Service Locator предоставляемые вам фреймворком. Создание своих собственных вариантов более чем приветствуется. У нас в Gateway Ticketing мы сделали следующее: мы объявили интерфейс, являющийся полной абстракцией понятия Контейнер DI (DI Container = Контейнер Обращения Зависимостей), а затем реализовали этот интерфейс самостоятельно, используя наследника от Tcontainer из фреймворка Delphi Spring. Таким образом, если в фреймворке что-то изменяется (а он действительно меняется с тех самых пор, как мы начали его использовать) или, если мы решим использовать другой контейнер, наш код полностью отделён от какой-либо конкретной реализации. Ещё один хороший пример следования правилу «Пиши код для абстракций, а не реализации». :)
     
  • Я вынужден отметить, что некоторые считают концепцию Service Locator анти-паттерном . Сам я пока что ещё не пришёл к твёрдому заключению по этому вопросу. Да, Service Locator почти всегда является Одиночкой, но я лично и не рассматриваю одиночек только для чтения как что-то плохое, в отличие от некоторых. (Одиночка для чтения и для записи, по сути, является глобальной переменной, и я думаю, что все согласятся с тем, что глобальные переменные являются Порождением Сатаны.) Однако существуют некоторые разногласия в том, является ли использование контейнера реализацией Service Locator. Кроме того, если все зависимости определены до того, как результат выполнения станет доступным пользователю, то можно ли вообще считать контейнер переменной? Это остается предметом дискуссий. В конечном счете, для меня ценность и польза от Service Locator с лихвой перевешивает все возможные недостатки.
     
  • Существует один недостаток, возвращающий нас к предыдущему пункту, который заключается в том, что когда вещи настолько отделены друг от друга и позднее связывание настолько ярко выражено, то становится возможным успешно собрать программу и до самого её запуска так и не узнать о том, что мы забыли зарегистрировать необходимый реализующий класс. В сложной системе, может пройти немало времени, прежде чем кто-либо заметит, что отсутствует реализующий класс для какого-нибудь редко используемого интерфейса. Если вы следуете предложенному мной образцу регистрации реализации в initialization секции модуля, то вы обязаны использовать этот модуль где-нибудь в программе (примечание переводчика: включить в uses), чтобы регистрация сработала. Как уже говорилось, если вы забыли его добавить, и не включили этот модуль в свою программу, то компилятор вам ничего не скажет, и узнаете вы об этом только во время работы программы. Это слабое место, и вам следует быть очень внимательным, чтобы не попасться в эту ловушку. В качестве стратегии можно рассматривать выделение всех регистраций в единый модуль, или использовать что-то типа статического анализа кода, который проверит, что для каждого вызова GetService есть соответствующий вызов RegisterService (или как там эти методы у вас называются). Просто, чтобы вы были в курсе.

Это всего лишь несколько вещей, на которые стоит обратить внимание, при использовании Dependency Injection в вашем коде. Я говорил это раньше, я скажу это снова: Если вы не используете Dependency Injection, значит, вы работаете неправильно.


Ссылки по теме

пятница, 14 сентября 2012 г.

Lazy Delphi Builder 1.7.5.232 от 13-09-2012 для Delphi XE3

Lazy Delphi Builder XE3 Logo

Что нового (вкратце):

  • LazyDBP файлы сохранялись в Ansi кодировке. Теперь будут в UTF8.
  • Исправлен "бесконечный" List index out of bounds(-1) на 4й закладке.
  • Отправка мейла вместе со всеми логами и файлами прямо из программы
  • В дереве с файлами новый фильтр: показать только ошибочные пакеты и проекты.
  • Для консольной версии тихий режим /quiet
  • Много мелких улучшений в GUI и консольной версии (подробный список под катом, и в архиве с программой).

Скачивать на домашней странице: http://www.lazyproject.info/downloads/ или здесь

среда, 5 сентября 2012 г.

Lazy Delphi Builder 1.7.3.217 от 05-09-2012 для Delphi XE3

Что нового

  • Добавлена поддержка Delphi XE3.
  • Drag and drop. Теперь можно просто перетаскивать файлы и папки прямо в дерево из проводника.
  • Поддержка NameSpaces. В предыдущих версиях, при компиляции для Delphi XE2 можно было получить ошибку компилятора Fatal: F1026 File not found: 'Windows.dcu'" (мог быть и другой модуль). Чтобы эту ошибку обойти, нужно было добавить в dcc params строчку -NSSystem;System.Win;WinAPI;Vcl;Vcl.Imaging;Data. Теперь в диалог сборки добавлен отдельный редактор для NameSpaces.
  • Сборка проектов в отдельном потоке
  • Исправлены ошибки связанные с удалением файлов из дерева.

Скачивать на домашней странице: http://www.lazyproject.info/downloads/ или здесь

четверг, 26 июля 2012 г.

Головокружительные возможности Dependency Injection и Delphi Spring. Часть 7. Контроль над созданием.

Это перевод публикации Ника Ходжеса от 08 октября 2011 года: Getting Giddy with Dependency Injection and Delphi Spring #7 – Controlling Construction.


Все переводы по Spring


Как обычно, Delphi Spring Framework можно скачать с GoogleCode.

К настоящему времени вы получили представление о внедрении зависимостей ­и о том, как его использовать для разрывания связей в коде и создания объектов. Надеюсь, вы понимаете преимущества от написания кода ориентированного на интерфейсы, а не на реализацию. И если дела идут действительно хорошо, то вы уже с легкостью пишете модульные тесты, ведь ваш код теперь так легко тестировать.

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

Вы правы на этот счёт – там действительно много всего происходит. Delphi Spring Framework делает за вас кучу работы – в основном за счёт создания экземпляров классов используя RTTI (информацию о типах времени выполнения).­ Spring контролирует создание, но при этом, оставляет программисту возможность управлять жизненным циклом объектов.

Я также держу пари, что не все из вас готовы положиться на магию. Несмотря на то, что передача управления хорошо работает во многих случаях, вы можете захотеть не отдавать контроль над созданием объектов во всех случаях.

Хорошая новость здесь в том, что вам и не придётся. Фреймворк, при желании, позволяет управлять созданием объектов. В большинстве случаев если классы хорошо спроектированы, то их конструкторы просты, и в них не происходит ничего, кроме присвоения значений. Но иногда возникает нужда сделать при создании объекта что-то особенное. Иногда, классу требуется динамический параметр – объект, чьё состояние будет известно только при выполнении. (Примечание переводчика: мне очень не нравится слово динамический в этом контексте и примеры Ника, но я не придумал лучшего объяснения. Есть идеи, читатель? Пиши в комментарии!) Например, у нас может быть класс Клиент, и у этого Клиента могут быть Счета. И у нас есть класс, который мы хотим передать этому клиенту, но при этом мы не хотим связывать эти классы. Наш Клиент динамический – мы можем запускать запрос и выполнять эту операцию на каждом клиенте в нашей базе данных. Или Клиент может что-то делать на нашем сайте, и таким образом наш объект Клиента будет относиться именно к этому конкретному клиенту. В любом случае, данные нашего Клиента динамичны во время выполнения, и поэтому мы не можем загнать создание объекта в жёсткие рамки. Он должен быть уникальным, каждый раз, когда нам нужен экземпляр объекта, который выполняет действие над данным клиентом.

понедельник, 25 июня 2012 г.

Головокружительные возможности Dependency Injection и Delphi Spring. Часть 6. Обойдёмся без конструктора.

Это перевод публикации Ника Ходжеса от 24-09-2011: Getting Giddy with Dependency Injection and Delphi Spring #6 – Don’t even have a constructor.


Все переводы по Spring


Вступление

В четвёртой статье этой серии я озвучил пару правил, одним из которых было “Делайте Конструкторы Простыми”.(примечание переводчика: я не переводил части 1-4.) В последней статье мы узнали, как использовать контейнер Spring для хранения интерфейсов и реализаций и как запросить у контейнера Spring готовую реализацию интерфейса, вместо создания объекта вручную с помощью конструктора.

В этой статье мы продвинемся ещё на один шаг и посмотрим, как Delphi Spring Framework умеет самостоятельно создавать объекты и автоматически вставлять реализацию в нужных местах, и нам для этого не придется даже вызывать конструктор.

пятница, 18 мая 2012 г.

Lazy Delphi Builder 1.6.2.200 от 18-05-2012

Lazy Delphi Builder logo

  1. Изменено: В .LazyDbp файле всегда сохранять списки файлов в одном и том же порядке - упорядоченными по алфавиту. Чтобы было проще сравнивать 2 версии сохранённых профилей LazyDbp. (Tortoise Diff всё-равно показывает каждую строку изменившейся из-за того, что меняются номера строк. Зато, Beyond Compare сравнивает файлы корректно.)
  2. Горячие клавиши в Installation Log: Ctrl+Вверх и Ctrl+Вниз позволяют быстро перемещаться между сообщениями о начале компиляции ("Compiling ...").
  3. Добавлена возможность останавливать процесс сборки пока удаляются файлы.
  4. Встроен JCL диалог отлова исключений.
  5. Добавлено: Закладка Installed Packages: Теперь можно удалять и отключать пакеты из выбранной версии Delphi.
  6. Исправлено: Иногда профиль не компилировался без перезагрузки.
  7. Закладка "Select files to compile":
    1. Добавлено: Устанавливать фокус на добавленную папку.
    2. Несколько исправлений в работе "Substitute path"
  8. Изменено: Создание резервных копий файлов и их удаление теперь происходит в отдельном потоке.
  9. Исправлено: Программа не работала с сетевыми путями.
  10. Исправлена ошибка "List index out of bounds (-1)" на закладке "Library paths" формы "Environment Variables" (см. http://www.hostedredmine.com/issues/53575).
  11. Исправлено: !Не запускать CnDebugViewer при поиске!
  12. Много небольших исправлений и улучшений в Installation Log.
  13. Много исправлений и улучшений в GUI (около 20 разных мелочей).

Об ошибках можно писать в комментариях, на мейл (см. окно About) или в баг-трекер по адресу: http://www.hostedredmine.com/projects/lazy

Скачивать на домашней странице: http://www.lazyproject.info/downloads/ или здесь

Что возможно будет в следующем билде:

  • Drag’n’drop файлов в дерево пакетов (точно будет)
  • “Check wizard” для быстрой отметки проектов для конкретной версии Delphi
  • Вместо удаления файлов в Recycle Bin, перемещать их. Иначе слишком долго работает
  • Сборка проектов в отдельном потоке

Release notes in english.

понедельник, 2 апреля 2012 г.

Самое интересное в Delphi блогах за 2011 год

Подборка лучших материалов по Delphi на русском языке за 2011. В сравнении с прошлым годом, появилось намного больше качественных публикаций. Смотрите также: Самые интересные публикации 2009 года и Самое интересное в Delphi-блогах за 2010 год.

Особенно рекомендую почитать переводы статей Hallvard-а Vassbotn-а, и обратить внимание на раздел “Инструменты для Delphi”.

Оглавление

воскресенье, 5 февраля 2012 г.

Планы на 2012 год. Голосуем в комментариях.

 

mnx personal today todo list

Голосуем в комментариях за самые интересные темы. =)

  • Сделать подборку лучших постов о Delphi за 2011 год. Будет обязательно.
  • Инструкция для Lazy Delphi Builder
  • Lazy Delphi Builder: улучшение работы, исправление ошибок, хранение профилей в SVN.
  • Lazy Delphi Builder: Генерация .bat файлов.
  • Выявление возможных проблем при установке компонентов. В виде готовой программки или как часть Лэйзи билдера.
  • Продолжение перевода серии про Dependency Injection и Delphi Spring.
  • Статья: Компиляция сторонних библиотек. Подводные камни. И почему этот процесс нельзя унифицировать.
  • Статья: Переход из HelpMaker в Help & Manual. И их сравнение.
  • Продолжение заметки о процессе ведения проектов в Delphi на примере использования Redmine. Тут если подумать всё тривиально и кроме прописных истин мне и сказать особо нечего. Разве что только дать несколько советов о хранении Delphi кода в системах контроля версий.
  • Описание CnWizards в одном файле.
  • Написать программку для извлечения метаданных и данных БД Firebird для удобного хранения в системе контроля версий. Из серии, запустились по расписанию, автоматом извлекли всё что надо и отправили в систему контроля версий. А помимо метаданных извлекать планируется некоторые БЛОБы (например в виде DFM-ок или XML-файлов). Хочу такую для себя написать. Может ещё кому надо/интересно?
  • Статья: пишем простенький ORM с помощью Delphi RTTI.
  • Продолжение серии постов о переходе на юникод:
    • Замена Dream VCL на TMS Scripter Pro.
    • Переход с RxLib на JVCL: Как это было на деле.
    • Грабли при переходе. На что обратить внимание.
  • Поверхностный обзор скриптовых движков и дизайнеров форм для Delphi. Ищем замену Dream VCL.
  • Статический анализ Delphi кода – мой опыт. Я пробовал Code Healer и Peganza Pascal Analyzer + ещё какую-то программку для поиска повторяющихся фрагментов кода (Copy Paste). Инструмент от Peganza мне очень помог. Могу попробовать вкратце рассказать.
  • Firemonkey – ищем/пишем замену DbGird-у.
  • Обзоры JVCL. Стоит ли продолжать?
  • Закрыть блог и больше ничего не писать. Может быть это сделает кого-то счастливым?

p.s. не обещаю что напишу, но обещаю взять на заметку.

2011 год. Подведение итогов.


Пришла пора подвести итоги прошедшего года и набросать планы на следующий.

Checklist

2011-й год был очень загруженным. К концу лета навалилось очень много работы и времени стало катастрофически не хватать. Ни на ведение своего блога ни на чтение чужих. Не следил за новостями ни читал обзоры долгожданной Delphi XE2.

Мир Delphi

В этом году случилось много всего. В первую очередь Delphi XE2 (долгожданная поддержка 64-бит, кроссплатформенность, новая библиотека для создания кроссплатформенных приложений FireMonkey, скины в VCL (обзор в блоге Влада), Live Bindings, Fast Report в комплекте с Delphi и многое другое). Я успел немного поиграться с одной из бета-версий, а со стабильной даже и не работал – не было времени. 50% времени работал в Delphi 6, 50% в Delphi 2010 и оставшиеся 46% в Delphi XE. Переход на XE2 тормозился отсутствием нужных библиотек. Но первое впечатление от Firemonkey  – вау, это обалденно!

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

Интересные Delphi проекты 2011 года

  • Вышел проект DORM, the Delphi ORM (Open Source Apache License 2.0). Описание.
  • В конце года вышла третья версия OmniThreadLibrary (BSD лицензия)
  • В 2011 году был анонсирован (пока доступен только тестерам) интересный проект Object Pascal 4 JavaScript (ныне называется Smart Mobile Studio) позволяющий создавать HTML5 приложения на Object Pascal. Пока неясно, но скорее всего продукт будет коммерческим.
  • В ленте DelphiFeeds.ru появилось несколько новых блогов. Спасибо авторам за труд. =) Меня очень радует, что в ленте постов продолжают появляться публикации официального представителя Embarcadero – Всеволода Леонова. Причём в сравнении с прошлым годом, эти публикации потеряли формально-официальный тон (от чего только приобрели), и стали более живыми, а также обросли техническими подробностями и великолепным стилем изложения. Не знаю как у остальных, а у меня образ Embarcadero из безликой огромной компании превратился в обаятельный образ Севы.
  • Разработка проекта DeHL была официально заморожена. Причина – отсутствие явного интереса от Delphi-сообщества. Исходный код проекта доступен по BSD-лицензии. Автор готов передать проект в хорошие руки. Второй аналогичный проект того же автора – Delphi Collections пока ещё жив. Делайте выводы и пишите посты о хороших продуктах письма с благодарностями авторам используемых вами библиотек.
  • В этом году испортился (точнее, сменил направленность с Delphi на SEO) умер хороший сайт: http://delphiplus.org/

Мои проекты