Motto

В тихом саду здравомыслия
Пусть на вас постоянно падают
кокосовые орехи пробужденности.
Чогьям Трунгпа РИНПОЧЕ


Версия для мобильного


среда, 31 декабря 2008 г.

Создание wizarda в Delphi с помощью JVCL. Описание закладки JvWizard.

Компоненты Jv WIzard в Дельфи 2009В бесплатной библиотеке компонентов JVCL есть  контролы, позволяющие быстро соорудить свой интерфейс a la Wizard.

Это 4 компонента: TjvWizard – собственно сам wizard и TjvWizardRouteMapSteps, TJvWizardRouteMapNodes, TjvWizardRouteMapList предназначенные для отображения “карты” wizarda.

Компонент TjvWizard является базой для построения “волшебника”. По структуре TjvWizard очень похож на TPageControl. Он содержит список страниц wizarda(наследников от TJvWizardCustomPage) и общие настройки wizard-a: размеры панели с кнопками, размеры кнопок, заголовки(Caption) кнопок(Next, Back), картинки(glyph), ModalResult кнопок(актуально для кнопок Cancel и Finish), обработчики событий. TJvWizard содержит 7 предопределённых кнопки: Back, Next, To first page, To last page, Cancel, Finish и Help. Можно добавлять и свои.


Читать дальше..

воскресенье, 28 декабря 2008 г.

Введение в JCL(JEDI Code Library) и JVCL(JEDI Visual Component Library)

Введение

JCL – это сокращение от JEDI Code Library. JCL - это библиотека для Delphi с открытым исходным кодом. JEDI Code Library неспроста называется именно библиотекой кода, она содержит только процедуры, функции, классы, интерфейсы и ни одного компонента. JCL составлена из кода, пожертвованного разными разработчиками. Из пожертвованных компонент была составлена библиотека JVCL – JEDI Visual Component Library. Для установки JVCL понадобится уже было установленная JCL. О некоторых компонентах JVCL можно почитать в моём блоге в категории JVCL.

JCL доступна по двум лицензиям: Mozilla Public License(MPL) 1.1 и LGPL. Лицензия MPL позволяет использовать библиотеку в коммерческих проектах с закрытым кодом, а LGPL не знаю зачем нужна(возможно, чтобы дать возможность использовать код сторонникам GNU GPL). Поправьте, если я неправ. А если кто-нибудь может объяснить лучше, сделайте это.

Почему я об этом пишу

Потому что на русском языке практически нет информации об этих библиотеках. Некоторые разработчики предпочитают использовать взломанные версии коммерческих библиотек, нарушая закон, хотя вполне может быть, что для достижения целей им хватило бы и бесплатных JCL и/или JVCL. Многие разработчики изобретают велосипеды, решая классические задачи(что хорошо) и допуская классические ошибки(что плохо, но даёт опыт) и выкладывая решения с ошибками в интернет(что не очень хорошо), а то и публикуя ошибки в книгах(что ужасно). Я надеюсь, что популяризация этих библиотек поможет привлечь новых пользователей, а может даже и разработчиков. =)

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


Читать дальше..

пятница, 26 декабря 2008 г.

Невизуальные компоненты JVCL. Описание закладки JvSystem.

image

Визуальные контролы

JvClipboardViewer: TJvClipboardViewer

Единственный визуальный контрол на вкладке JvSystem. Является наследником TScrollBox. Отображает содержимое буфера обмена. Следит за буфером обмена и автоматически обновляется при изменении. Поддерживает показ следующих данных: Empty, Unknown, Text, Bitmap, Metafile, Palette, OemText, Picture, Component, Icon.

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

JvClipboardMonitor: TJvClipboardMonitor

TJvClipboardMonitor следит за буфером обмена(Clipboard) генерирует событие OnChange каждый раз, когда содержимое изменяется. Имеет 2 свойства: Enable и OnChange.

Помимо компонента JvClipboardMonitor.pas содержит две функции по работе с буфером обмена. Одна сохраняет содержимое буфера обмена в поток(TStream), а другая помещает содержимое потока(TStream) в буфер обмена.

procedure SaveClipboardToStream(Format: Word; Stream: TStream);
function LoadClipboardFromStream(Stream: TStream): Word;

JvAppCommand: TJvAppCommand

Компонент вешает хук на оконную процедуру формы и перехватывает сообщения WM_APPCOMMAND. Для каждого сообщения вызывается событие OnAppCommand.

JvHidDeviceController: TJvHidDeviceController

Обеспечивает поддержку устройств с HID (Human Interface Device), таких как мышки, джойстики, клавиатуры и прочие. Имеет события: OnArrival, OnDeviceChange, OnDeviceData, OnDeviceDataError, OnDeviceUnplug, OnEnumerate, OnRemoval. Помимо компонента, модуль содержит классы TJvHidDevice, TJvHidDeviceReadThread, TJvHidPnpInfo.

Читать дальше..

четверг, 25 декабря 2008 г.

Описание диалогов в JVCL. JvDialogs. Часть 2.

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

Палитра компонентов JVCL JvDialogs

Диалоги, построенные на Delphi


TJvDesktopAlert и TJvDesktopAlertStack

Компоненты для показа всплывающих окошек.(Popup hint window).

Всплывающие из трея прозрачные окошки на Delphi 
Можно настраивать любые параметры, окошки появляются на заданное время и тают по истечении. При наведении мышки, они перестают пропадать. Есть возможность перетаскивать их мышкой, обрабатывать клики на разных областях, присваивать Popup menu для стрелочки. TJvDesktopAlert отвечает за прорисовку окошка. TJvDesktopAlertStack отвечает за список активных окошек. Единственный минус с которым я столкнулся при использовании этого компонента – это то, что всё работает хорошо до тех пор пока мы не попытаемся уместить на нём больше текста. Советую посмотреть демку: JVCL\examples\JvDesktopAlert.

TJvDSADialog

Компонент для создания собственных диалогов(MessageDlg) с галочкой "Не показывать больше это окно"(Don’t Show Again), а также диалогов закрывающихся по таймеру. Прежде чем его использовать обратите внимание на готовые функции предоставленные в модуле JvDSADialogs.pas. Там полно функций, позволяющих показывать диалог с заданными параметрами. Также там есть функции заменяющие стандартные ShowMessage, MessageDlg, MessageDlgEx.Диалог сделанный на Delphi с галочкой "Больше не показывать" и обратным отсчётом
Этот компонент подробно описан в JVCL Help-е. Также советую посмотреть демку JVCL\Examples\JvDSADialogs\MessageDlgEditor.dpr.


Читать дальше..

Описание диалогов в JVCL. JvDialogs. Часть 1. Системные диалоги.

Бесплатная библиотека компонентов JVCL содержит огромное количество как полезных вещей так и разного хлама. Некоторую часть этих компонентов я опишу у себя в блоге, чтобы дать представление о том, что можно там найти. Да в JVCL не всё гладко, не всё работает как хотелось бы, кое-что глючит, кое-что вообще не работает, но тем не менее, это библиотека с открытым кодом, и найденную ошибку всегда можно отследить в исходниках и исправить, либо просто взять нужный код и написать свой вариант. Чужие исходники это просто кладезь информации для программиста.

Системные диалоги Windows


Читать дальше..

пятница, 19 декабря 2008 г.

Описание DB Grid-ов в JVCL или чем JvUltimateDbGrid лучше стандартного DbGrid.

В бесплатной библиотеке компонентов JVCL присутствуют 4 DbGrida. TJvgDbGrid, TJvDbGrid, TJvDBUltimGrid и TJvgVertDbSGrid. Я сравнил доступные гриды. Самым лучшим оказался TJvDBUltimGrid(хотя Ehlib даже версии 3.6 ему не переплюнуть).

TJvgDbGrid – DbGrid из библиотеки Globus. TJvgVertDBSGrid – грид отображающий список полей вертикально, отображает только одну запись.

Также в JVCL присутствует несколько компонентов, облегчающих работу с гридом.

  • Компоненты для экспорта содержимого DBGrid в файл, вместе с форматированием:
    • TJvDbGridCSVExport, TJvDbGridXMLExport, TJvDbGridHTMLExport – экспорт в CSV, XML и HTML(посмотрел только экспорт в HTML)
    • TJvDBGridExcelExport, TJvDbGridWordExport – требуют установленных Excel, Word.
  • TJvDbGridFooter – дополнительный Footer для DbGrid.
  • TJvgGridHeaderControl – дополнительный header для грида.(не смотрел)

Я опишу в этом посте большинство свойств TJvDBUltimGrid, отсутствующих в стандартном TDbGrid-e. Кстати, большая их часть присутствует и в TJvDbGrid.

Список вкусностей под катом..


Читать дальше..

четверг, 18 декабря 2008 г.

Мысли навеянные Delphi-кодингом 2. JCL+JVCL.

Недавно мне нужно было написать по учёбе пару программок.

С одной домашней работой меня очень выручила библиотека JCL, в частности класс JclExprEval.TExpressionCompiler, позволяющий парсить и вычислять значения математических функций. Хотя, если бы этого парсера не было, я бы просто зашил некоторое количество функций прямо в программу. В конце концов, это же просто очередная программка для университета. Но благодаря JCL, в программку можно ввести любую одномерную функции и получить её график.

Кстати, тот же Lazy Delphi Builder не состоялся бы без JCL. 

А у TJvDbGrid есть вкусное свойство, позволяющее назначать каждой колонке свой редактор.

Это о плюсах свободных библиотек.

А теперь о минусах.


Читать дальше..

понедельник, 15 декабря 2008 г.

Нужны советы по работе с Oracle-ом из Delphi

В универ нужно написать курсовую на тему работы с Oracle-ом из Дельфей. Точнее, сравнить пару-тройку технологий доступа к Oracle. Что-нибудь стандартное(ADO/dbGo, dbExpress), что-нибудь платное(ODAC или DOA) и что-нибудь с открытым кодом(ZeosLib или DelphiOci).

С Oracle-ом я как-то особо не сталкивался, всё больше Interbase и Firebird. В связи с этим у меня несколько вопросов:

  1. Какие преимущества от работы с Ораклом посредством стандартных технологий Delphi(dbGO/ADO, BDE, dbExpress) можно получить, по сравнению с работой с Firebird c теми же стандартными средствами(Nested tables, object fields, server-side cursors, e.t.c)?
  2. Кто-нибудь пробовал работать с Oracle-ом через ZeosLib?
  3. Что лучше Direct Oracle Access от AllRoundAutomation или Oracle Data Access Components(ODAC) от Devart(ex-CrLab)?
  4. Можно как-нибудь получить из программы доступ к объектным полям Oracle стандартными средствами Delphi(dbGO/ADO, BDE, dbExpress)?
  5. а с помощью сторонних компонент? 

Пока что я сам толком не понимаю как всё это работает и что мне нужно как красиво сформулировать вопросы.

Но буду рад любым советам, комментариям, ссылкам на статьи по теме.

п.с. если интересно, то опубликую работу здесь. (не раньше февраля - когда совладаю с сессией)

п.п.с. Интересно, а кто-нибудь из читателей понимает латышский? ;)


Читать дальше..

четверг, 4 декабря 2008 г.

Ссылки на хорошие ИТ-блоги о Delphi(и не только)

Хочу поделиться ссылками на малоизвестные качественные русскоязычные блоги о Дельфи.

Отдельным пунктом хочу упомянуть удивительнейший портал посвящённый Delphi -Королевство Delphi

Помимо огромного количества разнообразнейшего материала(иногда мне кажется что там есть ответы на ВСЕ возможные вопросы по Дельфи), портал удивителен ещё и своеобразной навигацией. К своему, стыду я до сих пор не разобрался что и где там найти. Поэтому, хочу отдельно упомянуть разделы со статьями: Подземелье Магов и Сокровищница

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


Читать дальше..

среда, 3 декабря 2008 г.

Текучка 7: dcc32 и dpk c полным путём

image

Экспериментировал с относительными путями в LazyDelphiBuilder и столкнулся с тем, что dcc32 умеет компилировать только package-и, которые находятся в текущей папке.

К примеру, попытка выполнить команду из d:\

d:\> "C:\Program Files\CodeGear\RAD Studio\6.0\bin\dcc32.exe" "D:\Work\D2009\VCL\TB2K\Packages\tb2k_d12.dpk" -U"c:\PROGRA~1\codegear\RADSTU~1\6.0\lib";"d:\Work\D2009\VCL\TB2K\Source" -LN"d:\test\dcp" -LE"d:\test\bpl" -N"d:\test\dcu" -DRELEASE -N0"d:\test\dcu"

приводит к появлению сообщения об ошибке “Fatal: file not found первый файл в dpk”. Такая же ерунда происходит при компиляции VirtualTreeView.

А если перед выполнением команды сменить текущую папку на D:\Work\D2009\VCL\TB2K\Packages\ – то всё отработает как надо.

Столкнулся с этим почти месяц назад, но только сейчас, начав писать  пост до меня наконец дошло, что причина не в dcc32 а в том, что в tb2k_d12.dpk указаны относительные пути до исходников.


contains
TB2Version in '..\Source\TB2Version.pas',
TB2Toolbar in '..\Source\TB2Toolbar.pas',

В VirtualTreeView тоже самое.

p.s. Давно заметил, что хорошие идеи приходят при обсуждении. Даже если собеседник не успел вставить ни слова. =)


Читать дальше..

суббота, 29 ноября 2008 г.

Вышла RAD Studio с Delphi Prism

Скачать можно здесь: http://cc.codegear.com/free/radstudio Trial-ный ключик на 14 дней можно получить на сайте Codegear(при скачивании), для активации понадобится аккаунт в Codegear Developer Network.

За Prism я слежу с момента объявления. Меня очень заинтересовала анонсированная возможность создавать приложения для Windows(.NET), MacOs(Cocoa) и Linux(Mono). Так что сегодня я скачал и установил trial чтобы посмотреть, как это реализовано.


Читать дальше..

среда, 26 ноября 2008 г.

on E:EDatabaseError do not raise E! Ключ - просто raise

Только что пытался реализовать в Delphi 6 конструкцию:
procedure _ExecuteQuery(aQuery:TpFIBQuery; aExceptionText:string='');
begin
  try
    aQuery.ExecQuery;
  except
    on E:EDatabaseError do
    begin
      E.Message := aExceptionText + E.Message;
      raise E;
    end;
  end; // я так понимаю, E.destroy происходит здесь?
end;
И ничего хорошего не получилось. Общий обработчик Application.OnException начал получать пустое исключение с E.Message = ‘’. Начал писать вопрос на Vingrad Forum. Пока писал, вспомнил, что для перевозбуждения последнего исключения не обязательно явно указывать это исключение. Попробовал вместо “raise E;” вызвать просто “raise;” - всё заработало.

Я так понимаю что деструктор исключения вызывается в конце блока except .. end.

Ссылка по теме:
Читать дальше..

пятница, 21 ноября 2008 г.

Кто-нибудь использует Lazy Delphi Builder? Does anybody use Lazy Delphi Builder?

Я тут подумываю о косметических изменениях формата .LazyDBP. В результате чего, старые LazyDBP-профили перестанут загружаться. В связи с этим у меня вопрос к читателям:

Кто-нибудь уже использует Lazy Delphi Builder для сборки реальных проектов?

  

I’m thinking about cosmetic changes to .LazyDBP file format. Which may result in compatibility loss. That’s why I’d like to ask readers the following question:

Does anybody use Lazy Delphi Builder for compiling projects?


Читать дальше..

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

Как вручную установить JCL-help в Delphi 2009

Установщик JCL для Delphi 2009 имеет опцию для установки справки JCL в систему помощи Delphi. Но включение этой опции у меня вызывает ошибку “RegHelper raised an error while executing RegHelp command: Error executing command PlugNameSpace”. Думаю, что причина в том, что Мастер установки Jedi Code Library(JCL)текущий “стабильный” релиз(1.103 Tesing Build 3110) делался в спешке, чтобы успеть войти в состав Partner DVD. В следующем стабильном выпуске, эти недочеты будут исправлены.

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

Читать дальше..

четверг, 13 ноября 2008 г.

Lazy Delphi Builder 0.9.4.100 beta4 + текучка

Lazy Delphi Builder 0.9.4.100 beta4

1) Добавлена галочка включающая/отключающая копирование файлов ресурсов при компиляции
2) Добавлен параметр командной строки /CopyResources+-
3) Исправлена ошибка с добавлением пустых папок для сканирования
4) Fixed: Cannot terminate an externally created thread.
5) Добавлена возможность компилировать Debug версию DCU-шек. Это исправило "ошибку" с глюками с CodeCompletion - для нормальной работы Code Completion, как оказалось, нуждается в DebugDCU. Debug Dcu компилируются с отключенной оптимизацией(-$O-) и включенной Debug Information(-$D+)
6) При загрузке и сохранении профилей, курсор ставится в HourGlass
7) При компиляции используются короткие версии путей(8 символов)

Скачать Lazy delphi Builder

Странный баг с Delphi 2009 и FastMM4.9 выявлен и исправлен. В новостной группе Дельфи сказали, что это из-за того, что я не скомпилировал Debug версию FastMM.dcu. Так что в LazyDelphiBuilder теперь добавлена фича создания Debug dcu. Исправлены ошибки в интерфейсе. Последний 7-й пункт я даже толком не оттестировал.

Идеи на будущее:

  1. мультиселект в listbox-ах (pseud)
  2. возможность сохранения профиля и использование его с относительными путями(CTapMex)

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


Читать дальше..

суббота, 8 ноября 2008 г.

Настройка папок для выходных файлов в Delphi

Обещанный пост о настройке выходных папок в Delphi.

По умолчанию Delphi 7 помещает выходные файлы в C:\Program Files\Borland\Delphi7\Projects\, а Delphi 2009 в C:\Users\Public\Documents\RAD Studio\6.0\. Это что касается bpl и dcp-файлов. Dcu-шки и exe создаются в папке с исходниками. Такая организация мне не нравится, поэтому я перенастраиваю всё под себя.

Краткое содержание:

  1. Добавить переменную окружения содержащую путь до рабочей папки
  2. Добавить в Path путь до новой папки с BPL-ками
  3. Добавить относительные пути до BPL, DCP, RES, DCU папок в Delphi в Library Path
  4. В Default Project Options указать в качестве выходных папок относительные пути до BIN, BPL, DCP, RES, DCU папок.

Подробная инструкция с картинками под катом. =)



Читать дальше..

пятница, 31 октября 2008 г.

Мысли навеянные Delphi-кодингом 1

  1. JVCL – зло. Там слишком много компонентов.
  2. Личное открытие: TBookmarks может не работать[1] в IBX-ах и FIB-ах, но работает в BDE.
  3. Давно заметил, что после установки DelphiSpeedUp на Delphi 6 с кучей других экспертов, IDE начинает глючить и периодически вылетать. Терплю. Лучше глюки, чем тормоза.
  4. Эксперты, вообще, штука небезопасная.
  5. Toolbar 2000 - как наркотик. Начав им пользоваться, от него очень сложно отказаться.
  6. IBX в Delphi 2009 страшно глючат при работе с юникодной базой Firebird.
  7. Накодить можно всё что угодно. Вопрос в цене.

Читать дальше..

четверг, 30 октября 2008 г.

Lazy Delphi Builder. Beta3. RC1.

Я выложил третью бету 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) +что-то ещё, про что я сейчас не помню.


Читать дальше..

вторник, 28 октября 2008 г.

Текучка 6. Delphi 2009 + FastMM4.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". Причём, ругается он только если я собираю проект с Debug Build 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-е?.. ;)

Update: Решил проблему созданием отдельных dcu файлов с отладочной информацией..



  • А вы знаете, сколько стоит отдать на аутсорсинг сопровождение 20 офисных компьютеров, 5 серверов и двух рабочих мест 1C? А я знаю. Тем более что цену ИТ аутсорсинга можно легко рассчитать на калькуляторе цен прямо на сайте аутсорсера.

Читать дальше..

понедельник, 27 октября 2008 г.

Сон. Embarcadero vs Borland

Мне сегодня песдетс какой-то, а не сон снился. Приснилось что две крупные армии должны были начать бои на территории Риги. Сами бои должны были вот-вот начаться. Точнее все верили что войны не будет. Но уже одна из воюющих сторон заняла свои позиции, и вот-вот должна была прибыть вторая.
Интересно было наблюдать за жизнью города, который возможно, вот-вот будет разрушен. Особенно за клубами и тусовками. Несмотря на то что улицы заметно опустели, народ всё ещё шёл на тусовки, не собираясь менять свои планы из-за какой-то возможной войны, которая ещё фиг знает когда начнётся.

Но самое смешное - это воюющие стороны.

Одна армия воевала за Embarcadero, а вторая за Borland.
Читать дальше..

воскресенье, 26 октября 2008 г.

Текучка 5

  1. Записал видео урок о настройке Lazy Delphi Builder для создания build-a приложения[1]. Видеоурок на английском.
  2. Сделал сайт с описанием и документацией по проекту(на русском и английском): http://sites.google.com/site/lazyproject/. Всё-таки на Google Code писать документацию очень неудобно. Wiki синтаксис накладывает массу ограничений.
  3. Создал форум на UserVoce: http://lazydelphibuilder.uservoice.com/ Теперь, у Вас есть возможность предлагать новые фичи, и голосовать за старые. Также добавил себе в блог widget от UserVoice, где можно посмотреть результаты голосования. Довольно удобный сервис.
  4. Сейчас активно занимаюсь созданием третьей беты:
    1. Вчера сделал возможность отменять удаление файлов в дереве, т.е. Undo.  Помучался изрядно. Респект и уважуха программистам, решившимся реализовать в программе возможность отменять изменения(Undo). Код, который получился мне не очень нравится. Самое лучшее место для реализации Undo как мне кажется при работе с VirtualTreeView – это внутренности VirtualTreeView.
    2. Сейчас активно занимаюсь созданием консольной версии.
    3. Забавно, что никто не сообщил о заморозке проекта в случае возникновения ошибки во время компиляции.

[1] Идея которая стоит за этим уроком: при создании очередного билда, приложение должно быть полностью перекомпилировано вместе со всеми используемыми библиотеками.


Читать дальше..

вторник, 21 октября 2008 г.

Цель проекта: Lazy Delphi Builder. И небольшой FAQ по теме.

Целью проекта в том, чтобы создать инструмент для:
1) Быстрой перекомпиляции проектов с большим количеством связанных библиотек, без возни с файлами настроек.
2) Для быстрой компиляции чужих проектов и компонент без их установки в IDE. (Например, чтобы быстро собрать демки из исходников)
3) Для быстрой установки в IDE компонент из исходников, без необходимости прописывать кучу путей в Library Path.
4) Для интеграции с другими build-инструментами. (будет версия для работы в командной строке)
5) И главный плюс - это возможность жёстко указать папки для всех типов выходных файлов (exe, bpl, dcp, dcu, res). Чтобы в папках с исходниками не оставалось никакого мусора.

Может ли Lazy Delphi Builder заменить want ?

Да, но только ту часть 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-файлов.

=)

Ещё можно почитать по теме


Читать дальше..

Появились неофициальные версии Ehlib и RxLib для Delphi 2009

В один день на просторах интернета появились неофициальные версии для Delphi 2009 двух, наверное, самых популярных библиотек^ RxLib и Ehlib.

Версию Ehlib для Delphi 2009 с некоторыми дополнениями выложил на Vingradе пользователь Alex. Скачать обновления для Ehlib 4.1 для D2009. Потому что сам автор Ehlib-a судя по всему забросил проект.

При желании Ehlib для D2009 можно было найти уже месяц назад на том же самом dumpz.ru. Также неофициальную.

А RxLib был выложен на форуме dumpz.ru пользователем psa1974. Скачать RxLib 2.7.7 для Delphi 2009(c rapidshare-ы)

Кстати, я писал когда-то что FIBPlus поддерживает Delphi 2009 начиная с версии 6.9.5. Так вот, я ошибся. Меня ввела в заблуждения строка “Улучшена совместимость с Delphi 2009” в журнале изменений. Совместимость-то там может и улучшена, но только на рудиментарном уровне. Версии FIBPlus для Delphi 2009 пока нет.


Читать дальше..

Выложил 2-ю бету Lazy Delphi Builder (0.8.3.53)

Страница быстрого установщика компонент - Lazy Delphi Builder.

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) + много косметических изменений


Читать дальше..

понедельник, 20 октября 2008 г.

Текучка 4

Сначала о первой бете Lazy Delphi Builder. Там есть несколько недоработок и багов.

  1. Неверно определяется папка по умолчанию для Binary Output Folder. В качестве папки по умолчанию берётся папка Bin текущей инсталляции Delphi. Это в корне неверное значение, и эту папку надо обязательно изменить на какую-нибудь другую.
  2. Для того чтобы всё работало, необходимо указать выходные папки для всех типов файлов.

Появилась надобность разобраться с технологиями доступа к Oracle-у из Delphi. Вот бы почитать какие-нибудь сравнения-тесты.

Предыдущую проблему с автоматизацией выявления пишущих select-ов в программе решил примерно так:

  1. Извлёк из базы скрипт создания всех хранимых процедур.
  2. Добавил в начало каждой процедуры вызов insert в тестовую таблицу(поиск по регулярным выражениям рулит:] ).
  3. Пересоздал эти процедуры в базе(команда Create or Alter рулит:]). И получил в результате базу в которой все процедуры стали пишущими.
  4. Потом пришлось помучится пару часиков, чтобы приложение вообще начало запускаться. Зато потом, легко выявил все места, где Select из процедур происходит в read-only транзакции.

Читать дальше..

пятница, 17 октября 2008 г.

Доступна для тестирования первая бета Lazy Delphi Builder

Та-дам! Lazy Delphi Builder.

Пока что единственное что умеет программа – это компиляция пакетов(dpk) и их регистрация в IDE, а также очистка и создание структуры выходных папок. Поддержка dpr будет доступна в следующей версии. Небольшое описание на русском языке лежит в архиве.

Если что-то непонятно, спрашивайте здесь. Если возникнут какие-то ошибки, то пожалуйста сообщите здесь, указав: версию Windows, установленные версии Delphi/CBuilder.

Совет: при экспериментах, лучше включать галочку Do not register packages in IDE.

Внимание:

Сделайте резервные копии исходников. Если у вас включена галочка Clean output folders before compile, то папки указанные как выходные будут удалены со всем содержимым. Используйте эту опцию осторожно.


Читать дальше..

понедельник, 13 октября 2008 г.

Текучка 3. Псевдо стресс тест для установщика пройден.

Установка 212 package-й в Delphi7 заняла меньше часа. Из него минут 55 ушло на настройку и вычистку несовместимых package-й, и 5 минут на непосредственно компиляцию и регистрацию в IDE.

Во время теста были установлены JCL, JVCL, Ehlib, DeveloperExpress, FIBPlus, FastReport и кое-что ещё. Самым неприятным было вычищать package-и других версий Дельфи. Попробовал открыть и скомпилировать в IDE демки – всё пучком. =)

Осталось причесать интерфейс, протестировать на рабочих компьютерах, и можно будет выкладывать. ;)


Читать дальше..

среда, 8 октября 2008 г.

текучка 2. Бывают Select-ы, которые нужно выполнять в рамках пишущей транзакции.

Обнаружилась проблема в “успешно переведённым” с BDE на FIBPlus проекте. Переводил я тогда так:

  1. На главном Datamodule я создал 2 транзакции, trMainRead(read-only) и trMainWrite(read/write).
  2. У всех FIBDataset-ов выставил читающей транзакцией trMainRead, а пишущей trMainWrite, а также свойства AutoStartTransaction и AutoCommit.

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

500 хранимых процедур, 71 форма, 37 тыщ строк кода. Проект старый и чужой и большая часть кода мне незнакома.

Вот бы как-нибудь, этот процесс автоматизировать.

p.s. Решение проблемы с Select-ами.


Читать дальше..

пятница, 3 октября 2008 г.

Как улучшить help в Delphi. Пошаговая инструкция по внедрению DRKB в систему помощи Delphi.

 Drkb и Jedi Help в MsHelp 2.0

После двух вечеров, возни с Ms-help 2.0, у меня, наконец, получилось интегрировать Delphi Russian Knowledge Base в систему помощи Дельфей.

Инструкция прилагается…


Читать дальше..

воскресенье, 28 сентября 2008 г.

Delphi 2009. Ряды компонент и экспертов пополняются.

Delphi 2009 уже вышел, а я всё медлю на работе с переходом. Причины в том, что некоторые производителей  сторонних компонент ещё не выпустили совместимых версий. Но с каждым днём ситуация улучшается.

Позавчера Jordan Russell выпустил версию Toolbar 2000 для Delphi 2009. Вчера Robert Lee выпустил новую версию SpTbxLib, поддерживающую 2009. На прошлой неделе, DevExpress разослали своим подписчикам мейлы о том что готова бета-версия для Delphi 2009. Релизы JCL и JVCL появились практически одновременно с официальным выходом Delphi 2009.
У ребят из modelmakertools готова свежая версия Modelmaker Code Explorer.
Авторы cnWizards сообщают что их ночные билды поддерживают новую IDE. Andreas Hausladen вчера выпустил юникодную версию DDevExtensions.

Fast Report готовы к 2009-й версии.


Devrace FIBPlus пока НЕ поддерживают новую IDE.

Единственные, от кого я жду обновления – это от команды gExperts и автора Ehlib. gExperts заявлены в списке поддерживающих D2009, но на оффсайте, никаких новостей нет. А Ehlib я, чувствую, придётся конвертировать самому, что впрочем должно быть несложным.


Читать дальше..

Обзор средств для автоматической компиляции и установки библиотек в Delphi

На работе у меня установлена 6я версия Delphi, и для перекомпиляции всех библиотек и проектов использую первую версию want. Дома же у меня стоит BDS 2007, и при попытке воспользоваться want-ом, выяснилось, что эту версию Delphi want просто не видит.

Я подумал: ага! появился повод взглянуть на продвигаемый Codegear-ом MsBuild. Но, немного поизучав документацию и справку в Дельфи на эту тему, решил, что с MsBuild-ом для меня всё не так просто. Точнее, всё довольно просто когда в комплекте с .dpk файлами поставляются и .dproj файлы, но во многих библиотеках их просто нет. Единственный способ создать .dproj файл - это открыть .dpk-файл в IDE. Но подобное вмешательство в файлы чужих библиотек меня не устраивало.

Следующим инструментом был Silverpoint MultiInstaller. MultiInstaller умеет распаковывать исходники из .zip файла, компилировать и регистрировать в Delphi. Настраивается через ini файл, в котором должны быть прописаны названия zip-файлов с исходниками, можно также задать пути для поиска нужных файлов. Для каждой версии Дельфи можно задать свои пути. К сожалению MultiInstaller не умеет просто перекомпилировать исходники в указанных папках.


Читать дальше..

четверг, 25 сентября 2008 г.

Мечты об идеальной билд-машине

Вот было бы здорово, чтобы для перекомпиляции всех установленных библиотек и проектов для Delphi, достаточно было указать входную папку, директивы компилятора, указать выходные папки для Bpl, Dcu и нажав на большую кнопку Go! получить результат в лучшем виде. Да так, чтобы в папках с исходниками не осталось никакого мусора типа .dcu и .res файлов. А все Bpl и Dcu попали именно туда куда надо, а не по тому адресу что вписан в свойствах проекта.

В принципе, такие мысли появились у меня только после работы в N, где к первому проекту, который мне достался, прилагался скрипт для WANT(A Pascal-Friendly Build Tool). Не чудо ли, набираешь в командной строке "want all" и получаешь полностью скомпилированный проект, в котором все файлы разложены по своим местам. Тогда мне это показалось чудом, особенно после предыдущей работы в Б, где по словам одного из коллег, для поднятия рабочего места с нуля требовалось больше 2х-дней, большая часть из которых уходила на установку в нужном порядке всех необходимых компонент. Вероятно, коллега малость преувеличивал, но тем не менее, рядом с его столом стояли 3 системных блока, на каждом из которых хранились исходники своей версии проекта.


Читать дальше..

вторник, 9 сентября 2008 г.

TortoiseMerge 1.5.3 втихаря конвертирует текст в UTF-8 w/o BOM

Сегодня выяснил, как получилось что .dfm-файлы сохранились в UTF-8 вместо ANSI. Виноватой оказалась TortoiseSVN 1.5.3, точнее баг в TortoiseMerge. Оказалось что строки изменили кодировку после использования пункта меню Use This Text Block.

В результате получилось, что и слева и справа, один и тот же текст, но в левой панели он в ANSI, а в правой в UTF-8 w/o BOM. При этом эти строки подсвечиваются как разные, но с символом "=". А я ещё помню, что удивлялся этому "=", когда Commit делал.



Вчера искал какую-нибудь программку, которая смогла бы пройтись по всем файлам проекта, и выдала список файлов сохранённых в UTF-8, но так и не смог ничего найти. Казалось бы, очевидная функция, ан нигде её нет. Поставил пару бесплатных блокнотов - все умеют определять кодировку, но только при открытии файла в редакторе. А вручную открывать 30 000 файлов с исходниками совсем не хочется. К счастью нашлась одна бесплатная библиотечка умеющая определять кодировку файла, с её помощью быстренько был получен список. Нарушители было сконвертированы назад в ANSI и закоммичены в репозиторий.

Сообщил об ошибке куда следует. Буду ждать ответа.

p.s. всё-таки не стоит спешить с установкой свежих версий, если устраивают старые.

Update: исправили.
Читать дальше..

Как обработать все resourcestrings в программе. Код.

Последнее время был занят занимался созданием механизмов для перевода наших приложений. Требования были такими:

  1. перевод должен работать по словарю
  2. словарь должен храниться в БД
  3. должны переводиться все Caption-ы у контролов, resourcestring'и и текст из БД

Основной класс, переводящий в runtime созданные формы, и подменяющий resourcestring'и был сделан за пару дней. Большая же часть времени ушла на составление словаря используемых фраз. Пару дней я потратил пытаясь разобраться как получить список всех resourcestring'ов в программе. Этот вопрос неоднократно поднимался на разных форумах, но полное решение нигде не приводилось. В общем решение нашлось, и в довольно неожиданном для меня месте. В Program Files\Borland\Delphi6\Demos\ResXplor. =)

Я собрал все необходимые классы в одном модуле. Модуль экспортирует одну функцию scCollectResourceStrings:

procedure scCollectResourceStrings( aExeFilename: string; aPerformForEveryFoundString: TscOnGetResString);

у этой функции два параметра:
1) aExeFilename: string - путь до файла с ресурсами
2) aPerformForEveryFoundString: TscOnGetResString - callback фунция, вызываемая для каждого найденного ресурса строкового типа.

TscOnGetResString = procedure (aText, aData: string) of object;

У callback функции[1] два параметра:
aText - resourcestring
aData - представляет из себя строку формата: "ID ресурса = текст ресурса".

aText и aData формируются в процедуре TStringResource.ForEveryString. Так что их формат данных можно легко изменить, подправив пару строк кода.

Скачать модуль можно здесь: http://sites.google.com/site/lazyproject/downloads

Прямая ссылка

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

 

[1] О Callback-функциях можно почитать в соответствующей главе статьи Основы работы с Windows API.


Читать дальше..

понедельник, 8 сентября 2008 г.

формы(.dfm) сохранились в UTF8 вместо ANSI, а TortoiseSVN не показал различий.

В последнее время тестеры стали жаловаться что на некоторых формах, на месте каждой латышской буквы стали появляться два совершенно нелатышских символа. Стал проверять эти формы, и выяснил, что они вместо ANSI кодировки, сохранились почему-то в UTF8 Without BOM. И в таком виде были закоммичены в репозиторий. Как выяснилось, TortoiseSVN-овский Diff-Tool нагло игнорирует кодировки файлов, преспокойно раскодируя и сравнивая только содержимое. Т.е. если сравнить два одинаковых файла с латышскими буквами(šžīā..), один из которых в будет сохранён в ANSI а другой в UTF8, то в обеих половинах Diff-Viewer-a будет отображаться одинаковый текст.

Теперь осталось выяснить как могло случиться что файлы вдруг поменяли кодировку. Я всё-таки, всё ещё в Delphi 6 работаю.
Читать дальше..

среда, 20 августа 2008 г.

Организация структуры папок при работе в Delphi

структура директорий при работе с Delphi

Когда я только пришёл работать в N два года назад, мне достался довольно старый проект на Дельфи 6, с которым до меня успели проработать программиста три. Мне очень понравилась идея организации структуры папок проекта. Работая с несколькими большими проектами я успел оценить по достоинству преимущества такого подхода. И именно о структуре папок я и хочу сегодня поговорить.

Все проекты у меня хранятся в одной папке C:\Work. Сюда извлекаются копии проектов из SVN-хранилища.

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

c:\Work\Organizer - большой рабочий проект из первого репозитория
c:\Work\BigApplication - большой рабочий проект из второго репозитория
c:\Work\LazyProject - мой личный проект из репозитория code.google.com

Некоторые проекты довольно велики, и для компиляции требуют установки многих сторонних библиотек, причём строго определённых версий. На примере проекта Organizer я покажу внутреннюю структуру папок:

c:\Work\Organizer\Build - это каталог для скомпилированных файлов
c:\Work\Organizer\Components - это каталог с исходниками компонент необходимых для компиляции Organizer-a
c:\Work\Organizer\Organizer_src - каталог с исходниками самого проекта
c:\Work\Organizer\Docs - каталог для документации проекта
c:\Work\Organizer\Pictures - каталог с иконками и картинками для этого проекта

Подробнее о папке c:\Work\Organizer\Build.

Это единственная папка, которая не связана с SVN-хранилищем. Она создаётся перед первой компиляцией проекта. И именно в ней хранятся все генерируемые компилятором данные. Она имеет следующую структуру:

c:\Work\Organizer\Build\Bin - папка для .exe файлов
c:\Work\Organizer\Build\Bpl - папка для .bpl файлов
c:\Work\Organizer\Build\Dcp - папка для .dcp файлов
c:\Work\Organizer\Build\Dcu - папка для .dcu файлов
c:\Work\Organizer\Build\Res - папка для .res файлов

Для автоматической сборки проекта на работе я использую want. Именно want создаёт папку Build со всей вложенной структурой, компилирует все библиотеки и связанные проекты, складывает .dcu, .bpl, .dcp и .exe в соответствующие папки. И он же копирует .res и .dfm файлы в папку Res. Delphi к сожалению такие задания выполнять не умеет. Использованию want я как-нибудь посвящу отдельный пост.

 

А теперь собственно о преимуществах:

1) Я знаю где находятся все, абсолютно все файлы проекта.
2) Я легко могу перекомпилировать любой из проектов, включая все необходимые ему библиотеки с нужными директивами(спасибо want'у). Причём в любой из версий(спасибо SVN'у).
3) Больше не возникает ситуаций, когда в путях попадаются дублирующиеся .dcu или .bpl файлы.
4) Благодаря продуманной структуре рабочих папок, переключение между проектами(версиями одного проекта), использующими разные(чаще даже несовместимые) версии компонент, занимает несколько минут.
5) Подготовка нового рабочего места для работы с любым из проектов(компиляция и установка всех компонент) занимает где-то час, причём большая часть времени уйдёт на извлечение исходников из репозитория.
6) я легко могу хвастаться удобством своего рабочего места. =)


Читать дальше..

вторник, 19 августа 2008 г.

Решилась проблема с pFibDataset.Locate

Проблема с Locate в pFibDatasetе разрешилась путём перекомпиляции FibPlus без директивы FAST_LOCATE. Проблема с невалидными букмарками указывающими на незафетченную запись была обойдена путём использования стандарного метода ReOpenLocate(точно уже не помню?). После устранения проблем Фибы стали радовать стабильной работой.

Я полностью закончил переводить Финансовый модуль с BDE на Fib Plus(не прошло и полгода:>). Ответственные за тестирование лица удивлённо разводят руками и говорят что ошибок пока найти не могут. Жду когда модуль Финансов официально получит статус стабильного, а также премию и процент с первых продаж. =)

Не за горами портирование с BDE на FibPlus'ы модуля Документов.

Портировать на FibPlus-ы получилось не в пример приятнее чем могло бы быть с ibx-ами. Наличие отдельных транзакций для чтения и записи существенно упростило переход, а также наличие у FIB-ов флага AutoCommit. А возможность динамически генерировать SQL-ы по имени таблицы и первичному ключу избавила от необходимости проверять запросы у огромного количества Dataset-ов.

А пока что продумываю возможности безболезненного перевода приложений. И по всем параметрам получается, что до появления Юникодной версии Delphi, без извращений ничего стопроцентно-путного сделать не получится.


Читать дальше..

вторник, 22 июля 2008 г.

бьюсь с pFIBDataset.Locate а он всё глючит

Третий день бьюсь с непонятным глюком FIBPlus Dataset-a. Locate то срабатывает, то нет. Никакой закономерности выявить не могу. Тот же код прекрасно работает на IBX-ах, а с FIBPlus - через раз.

Нормально отладить не получается, ибо код реализующий Locate вынесен Сергеем в include-файл, а Delphi 6 в include файлах breakpoint-ы ставить отказывается.

Только что обнаружил, что поведение Dataseta зависит от свойства CacheModel. Наличие исходников и времени на их изучение очень помогает в работе. =)

Это уже второй баг, найденный в Devrace FIB Plus компонентах, и я ещё даже не начинал извращаться с ними. =(


Читать дальше..

воскресенье, 6 июля 2008 г.

Здравствуй мир =)

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

Этот блог я планирую посвятить своей работе. Здесь я буду писать про Delphi, делиться впечатлениями от библиотек, программок и сервисах, которые мне понравились, и описывать трудности с которыми довелось столкнулся в работе.


Читать дальше..

Постоянные читатели