Блог Delphi-программиста.
Обзоры инструментов и экспертов для Delphi. Описание JCL, JVCL, cnWizards. Дженерики в Delphi. Дневник разработки Lazy Delphi Builder. Переводы.
Личное открытие: TBookmarks может не работать[1] в IBX-ах и FIB-ах, но работает в BDE.
Давно заметил, что после установки DelphiSpeedUp на Delphi 6 с кучей других экспертов, IDE начинает глючить и периодически вылетать. Терплю. Лучше глюки, чем тормоза.
Эксперты, вообще, штука небезопасная.
Toolbar 2000 - как наркотик. Начав им пользоваться, от него очень сложно отказаться.
IBX в Delphi 2009 страшно глючат при работе с юникодной базой Firebird.
Я выложил третью бету Lazy Delphi Builder-a. Она стала ещё удобнее в использовании. Все основные навороты, которые я хотел реализовать, я уже реализовал, нереализованными остались только идеи которые возможно сделают работу ещё более удобной.
Если по этой версии не будет сообщений об ошибках, то я её переименую в стабильный релиз.
История изменений: Lazy Delphi Builder 0.9.4.97(beta3):
1) На форме About изменён шрифт на Arial
2) Исправлена ошибка с прорисовкой CheckBox-ов в Exclude Masks
3) Дистрибутив LazyDelphiBuilder теперь содержит 2 версии программы:
LazyDelphiBuilder.exe - версия для консоли, которая умеет запускать сохранённые профили LazyDBP
LazyDelphiBuilderGUI.exe - версия с GUI, которая всё
4) На главную форму добавлена закладка, позволяющая просмотреть список зарегистрированных в IDE пакетов
5) В дереве найденных файлов добавлена возможность отменять удаление
6) Добавлена возможность добавлять папки для сканирования непосредственно в дерево найденных файлов
7) При компиляции, старые выходные папки не удаляются, а переименовываются в Bin.~, Bpl.~ и т.д. (можно отключить с помощью /BackupOutFolders-). А старые папки Bin.~ теперь удаляются в Корзину(отключаемо с помощью /UseRecycleBin-)
8) Подробная русская справка по адресу: http://www.lazyproject.info/support/docs-ru/
9) +что-то ещё, про что я сейчас не помню.
Я использую в своих проектах FastMM. При этом я не хочу добавлять путь до FastMM4.pas в Library Path, чтобы не мучиться при отладке. Для этого я создал фиктивный package FastMM.dpk(runonly), который включает в себя тольк Fastmm4.dpk и компилирую FastMM со всеми остальными package-ами. А проекты подключают к себе уже fastmm4.dcu. Но в Delphi 2009 эта схема перестала работать. При включении FastMM4.dcu в проект, Delphi начинает ругаться и обзывать меня обидным заморским прозвищем "[DCC Fatal Error] F2051 Unit FastMM4 was compiled with a different version of System.TObject.InstanceSize". Причём, ругается он только если я собираю проект с DebugBuild Configuration. С Release всё собирается нормально. К слову сказать, ошибка “Unit бла-бла was compiled with a different version of бла-бла-бла” – одна из моих самых нелюбимых ошибок.
Начал писать пост в совершенной растерянности, не представляя с какой стороны взяться за проблему. Пока писал, пришла в голову мысль проверить, какое именно из различий между Debug и Release создаёт эту проблему.
Выяснилось, что проблема возникает, когда проект использует $(BDS)\Lib\Debug\ вместо $(BDS)\Lib\
А LazyDelphiBuilder, с помощью которого я и пересобираю все проекты, самой первой папкой для поиска исходников файлов всегда указывает $(BDS)\Lib\
С другими package-ами эту проблему повторить не получилось.
Получается, что System.TObject.InstanceSize в $(BDS)\Lib\ и $(BDS)\Lib\Debug разные.
Версия Дельфи: CodeGear™ Delphi® 2009 Version 12.0.3170.16989
Версия FastMM: Fast Memory Manager 4.90
Думаю, то ли разработчику FastMM написать, то ли в Quality Central, то ли вообще не заморачиваться и вписать путь до Fastmm4.pas в Library Path. А может не лениться и выяснить, откуда берётся $(BDS)\Lib\ в LazyDelphiBuilder-е?.. ;)
А вы знаете, сколько стоит отдать на аутсорсинг сопровождение 20 офисных компьютеров, 5 серверов и двух рабочих мест 1C? А я знаю. Тем более что цену ИТ аутсорсинга можно легко рассчитать на калькуляторе цен прямо на сайте аутсорсера.
Мне сегодня песдетс какой-то, а не сон снился. Приснилось что две крупные армии должны были начать бои на территории Риги. Сами бои должны были вот-вот начаться. Точнее все верили что войны не будет. Но уже одна из воюющих сторон заняла свои позиции, и вот-вот должна была прибыть вторая. Интересно было наблюдать за жизнью города, который возможно, вот-вот будет разрушен. Особенно за клубами и тусовками. Несмотря на то что улицы заметно опустели, народ всё ещё шёл на тусовки, не собираясь менять свои планы из-за какой-то возможной войны, которая ещё фиг знает когда начнётся.
Но самое смешное - это воюющие стороны.
Одна армия воевала за Embarcadero, а вторая за Borland.
Читать дальше..
Сделал сайт с описанием и документацией по проекту(на русском и английском): http://sites.google.com/site/lazyproject/. Всё-таки на Google Code писать документацию очень неудобно. Wiki синтаксис накладывает массу ограничений.
Создал форум на UserVoce: http://lazydelphibuilder.uservoice.com/ Теперь, у Вас есть возможность предлагать новые фичи, и голосовать за старые. Также добавил себе в блог widget от UserVoice, где можно посмотреть результаты голосования. Довольно удобный сервис.
Сейчас активно занимаюсь созданием третьей беты:
Вчера сделал возможность отменять удаление файлов в дереве, т.е. Undo. Помучался изрядно. Респект и уважуха программистам, решившимся реализовать в программе возможность отменять изменения(Undo). Код, который получился мне не очень нравится. Самое лучшее место для реализации Undo как мне кажется при работе с VirtualTreeView – это внутренности VirtualTreeView.
Сейчас активно занимаюсь созданием консольной версии.
Забавно, что никто не сообщил о заморозке проекта в случае возникновения ошибки во время компиляции.
[1] Идея которая стоит за этим уроком: при создании очередного билда, приложение должно быть полностью перекомпилировано вместе со всеми используемыми библиотеками.
Целью проекта в том, чтобы создать инструмент для: 1) Быстрой перекомпиляции проектов с большим количеством связанных библиотек, без возни с файлами настроек. 2) Для быстрой компиляции чужих проектов и компонент без их установки в IDE. (Например, чтобы быстро собрать демки из исходников) 3) Для быстрой установки в IDE компонент из исходников, без необходимости прописывать кучу путей в Library Path. 4) Для интеграции с другими build-инструментами. (будет версия для работы в командной строке) 5) И главный плюс - это возможность жёстко указать папки для всех типов выходных файлов (exe, bpl, dcp, dcu, res). Чтобы в папках с исходниками не оставалось никакого мусора.
Да, но только ту часть want-a которая отвечает за компиляцию проектов. Я начл писать Lazy Delphi Builder именно потому что мне не нравится редактировать xml-файлы размером в несколько десятков килобайт. =) Я не планирую реализовывать остальной функционал want-a, такой как: работа с файлами, папками, архивами, ftp, http, e-mail-ами и т.п. Однако, если возникнет идея, которая функционально украсит Lazy Delphi Builder, то с удовольствием её выслушаю. ;-)
Что лучше изучать: ant, want, rake или что-то ещё.
Выбор инструмента во многом зависит от поставленных целей. Не стоит также забывать и про стандартные инструменты, доступные в каждой инсталляции Delphi: msbuild и make ;) Инструментов разных полно, и каждый со своими уникальными особенностями и ограничениями.
Для создания билда из исходников с нуля вполне достаточно Lazy Delphi Builder-a. Я планирую в скором будущем сделать версию для командной строки. Тогда Lazy Delphi Builder можно будет легко вызвать из .bat-файлов, сценариев ant-а, want-а и и.п.
А пока что, мне самому вполне достаточно иметь возможность, не напрягаясь, получить билд из исходников, с нужными мне директивами и включенной оптимизацией. И я для себя не вижу смысла в установке, например, ant-а для выполнения действий, которые легко реализуются с помощью .bat-файлов.
Кстати, я писал когда-то что FIBPlus поддерживает Delphi 2009 начиная с версии 6.9.5. Так вот, я ошибся. Меня ввела в заблуждения строка “Улучшена совместимость с Delphi 2009” в журнале изменений. Совместимость-то там может и улучшена, но только на рудиментарном уровне. Версии FIBPlus для Delphi 2009 пока нет.
Lazy Delphi Builder 0.8.3.53(beta): 1) Добавлена возможность компилировать проекты 2) Исправлено: в диалоге Build Settings для Binary Output path по умолчанию указывалась текущая папка Delphi\Bin 3) Исправлено: обработка пустых строк('') в диалоге Build Settings 4) Добавлен параметр командной строки /noAutoSave отключающий автосохранение настроек при выходе 5) Добавлена закладка для просмотра отладочной информации(Отфильтровнные по ExcludeMasks файлы; списки Package-й, проектов, include-файлов, папок с ресрусами) 6) Добавлено сохранение истории для OutFolders 7) Исправлена ошибка с прорисовкой CheckBox-ов в Exclude Masks 8) Добавлена проверка для выходных папок. Теперь не получится запустить компиляцию с пустыми выходными папками. 9) Изменилось расширение у сохранённого профиля. Теперь это: .LazyDBP 10) Изменён алгоритм очистки выходных папок. Старые папки сейчас переименовываются в ИмяПапки.bak. А предыдущие версии ИмяПапки.bak удаляются в корзину. 11) + много косметических изменений
Сначала о первой бете Lazy Delphi Builder. Там есть несколько недоработок и багов.
Неверно определяется папка по умолчанию для Binary Output Folder. В качестве папки по умолчанию берётся папка Bin текущей инсталляции Delphi. Это в корне неверное значение, и эту папку надо обязательно изменить на какую-нибудь другую.
Для того чтобы всё работало, необходимо указать выходные папки для всех типов файлов.
Появилась надобность разобраться с технологиями доступа к Oracle-у из Delphi. Вот бы почитать какие-нибудь сравнения-тесты.
Извлёк из базы скрипт создания всех хранимых процедур.
Добавил в начало каждой процедуры вызов insert в тестовую таблицу(поиск по регулярным выражениям рулит:] ).
Пересоздал эти процедуры в базе(команда Create or Alter рулит:]). И получил в результате базу в которой все процедуры стали пишущими.
Потом пришлось помучится пару часиков, чтобы приложение вообще начало запускаться. Зато потом, легко выявил все места, где Select из процедур происходит в read-only транзакции.
Пока что единственное что умеет программа – это компиляция пакетов(dpk) и их регистрация в IDE, а также очистка и создание структуры выходных папок. Поддержка dpr будет доступна в следующей версии. Небольшое описание на русском языке лежит в архиве.
Если что-то непонятно, спрашивайте здесь. Если возникнут какие-то ошибки, то пожалуйста сообщите здесь, указав: версию Windows, установленные версии Delphi/CBuilder.
Совет: при экспериментах, лучше включать галочку Do not register packages in IDE.
Внимание:
Сделайте резервные копии исходников. Если у вас включена галочка Clean output folders before compile, то папки указанные как выходные будут удалены со всем содержимым. Используйте эту опцию осторожно.
Установка 212 package-й в Delphi7 заняла меньше часа. Из него минут 55 ушло на настройку и вычистку несовместимых package-й, и 5 минут на непосредственно компиляцию и регистрацию в IDE.
Во время теста были установлены JCL, JVCL, Ehlib, DeveloperExpress, FIBPlus, FastReport и кое-что ещё. Самым неприятным было вычищать package-и других версий Дельфи. Попробовал открыть и скомпилировать в IDE демки – всё пучком. =)
Осталось причесать интерфейс, протестировать на рабочих компьютерах, и можно будет выкладывать. ;)
Обнаружилась проблема в “успешно переведённым” с BDE на FIBPlus проекте. Переводил я тогда так:
На главном Datamodule я создал 2 транзакции, trMainRead(read-only) и trMainWrite(read/write).
У всех FIBDataset-ов выставил читающей транзакцией trMainRead, а пишущей trMainWrite, а также свойства AutoStartTransaction и AutoCommit.
Не было печали, пока не выяснилось, что для отображения некоторых отчётов используются Select-ы из хранимых процедур, а процедуры эти, в свою очередь, могут сохранять промежуточные расчёты в других таблицах. И эти отчёты начинают ругаться, когда их пытаются открыть в read-only транзакции. Теперь надо как-то искать места где происходит select из процедур, и добавлять туда отдельную пишущую транзакцию.
500 хранимых процедур, 71 форма, 37 тыщ строк кода. Проект старый и чужой и большая часть кода мне незнакома.