24 окт. 2015 г.

Изучайте используемый инструментарий!

   Вчера начал разбираться с чужим проектом на Delphi 7. Система весьма сложная – несколько взаимосвязанных АРМов по 20-50 форм (а может и больше, точно не считал). Усложняет все то, что она разрабатывается уже давно и пережила смену нескольких команд разработчиков. Каждая команда приносила в проект свои инновации. Например, одна из них перевела доступ к БД Oracle с BDE на ADO. При этом все старые объекты для работы с базами через BDE (TDatabase, TTable, TQuery и TStoredProc) продолжают лежать на формах рядом с их копиями для работы через ADO (TADOConnection, TADOTable, TADOQuery и TADOStoredProc). Они даже клонировали объекты TDataSource для ADODataSet'ов. Все замеченные беглым взглядом "интересные" моменты перечислять не буду, а вернусь к заголовку этой заметки. Одна из команд добавила в проект DBGridEh из EhLib 6.0 в компанию к стандартному DBGrid'у. Хороший выбор grid'а, одобряю ;-) Хочу поделится с вами их реализацией сортировки по клику на заготовке колонки. К каждому DBGridEh'у, подчеркиваю - к каждому DBGridEh'у, был написан обработчик OnSortMarkingChanged:
...
dsXYZ: TDataSource;
gridXYZ: TDBGridEh;
...
procedure TfmMain.gridXYZSortMarkingChanged(Sender: TObject);
var
  i: Integer;
  s: String;
  b: TBookmark;
begin
  Screen.Cursor := crHourGlass;
  b := dsXYZ.DataSet.GetBookmark;
  s := '';
  for i := 0 to gridXYZ.SortMarkedColumns.Count - 1 do
    begin
     s := s + gridXYZ.SortMarkedColumns[i].FieldName;
     if (gridXYZ.SortMarkedColumns[i].Title.SortMarker = smDownEh) then
        s := s + ' DESC';
     s := s + ';';
    end;
  TADODataSet(dsXYZ.DataSet).IndexFieldNames := s;
  dsXYZ.DataSet.GotoBookmark( b );
  Screen.Cursor := crDefault;
end;
   В одном из АРМ'ов только на главной форме больше 20 DBGridEh'ов лежащих на страницах TNotebook. И на каждый был написан свой обработчик! Если говорить о Delphi, или о объектно-ориентированном программировании в целом, то почему бы все эти десятки одинаковых обработчиков не заменить на один, где вместо gridXYZ использовать TDBGridEh(Sender) (или (Sender as TDBGridEh)), а вместо dsXYZ.DataSet использовать TDBGridEh(Sender).DataSet? Но самое интересное, что для сортировки в DBGridEh и такого обработчика писать не надо. EhLib для автоматической сортировки данных в DataSet'е имеет набор специальных объектов и от программиста требуется только добавить в раздел "uses" любого модуля в проекте один из модулей EhLibXXX (EhLibBDE, EhLibADO, EhLibCDS... в зависимости от подключенного к grid'у DataSet'а). Таким образом, вместо написания и копипаста десятков обработчиков OnSortMarkingChanged нужно было всего лишь подключить к проекту небольшую юниту EhLibADO.

   Еще, как зануда, отмечу, что вещи в стиле
Screen.Cursor := crHourGlass;
... 
Screen.Cursor := crDefault;
необходимо использовать совместно с конструкцией Try...Finally...End, т.к. если между этими строчками во время выполнения программы произойдет ошибка, то курсор не будет восстановлен. Т.е. нужно было написать так:
Screen.Cursor := crHourGlass;
Try
 ...
Finally
 Screen.Cursor := crDefault;
End
   А еще к восстановлению курсора в блок Finally...End было бы неплохо, для высвобождения памяти распределенной при вызове GetBookmark, добавить DataSet.FreeBookmark(b). Это же элементарно – для всех изменяемых или создаваемых ресурсов, на случай ошибки, нужно гарантировать возвращение их к исходному состоянию или высвобождению занимаемой ими памяти.

   Так, что господа, те кто считает себя программистом, дружите с Try...Finally...End и главное - ИЗУЧАЙТЕ ИСПОЛЬЗУЕМЫЙ ИНСТРУМЕНТАРИЙ!!!

8 окт. 2015 г.

Idera Inc покупает Embarcadero Technologies

   Слухи о том, что компания Idera, Inc покупает компанию Embarcadero Technologies, которые появились на форумах и в блогах в середине сентября подтвердились. Вчера инвестиционная компания Thoma Bravo, LLC опубликовала об этом событии свой пресс-релиз. А немного позже был опубликован и официальный пресс-релиз "Idera Announces Intent to Acquire Embarcadero, Expands Position in Database Management and Developer Tools Markets".
   Вот и закончился семилетний период жизни нашего любимого Delphi в компании Embarcadero Technologies. За это время было сделано 11 релизов Delphi:
  • Delphi 2009 (25 августа 2008) - полная поддержка unicode; новые элементы языков программирования (например, Generics); обновление VCL...
  • Delphi 2010 (25 августа 2009) - повышение производительности; поддержка Windows 7 API, Direct2D и мультисенсорного ввода; IDE Insight; расширение RTTI...
  • Delphi XE (30 августа 2010) – новые возможности VCL, RTL и Open Tools API; доработки в редакторе кода; обновление DataSnap...
  • Delphi XE2 (1 сентября 2011) – поддержка Windows 64, Mac OS X и iOS; кросс-платформенная библиотека FireMonkey; библиотека LiveBindings; улучшения в технологии DataSnap...
  • Delphi XE3 (3 сентября 2012) – поддержка Windows 8; улучшенная поддержка Apple Mac OS X; Firemonkey 2/FM²; удалена поддержка iOS...
  • Delphi XE4 (22 апреля 2013 ) – вернулась поддержка iOS; функционал для разработки мобильных приложений (iPhone и iPad); улучшено взаимодействие с базами данных...
  • Delphi XE5 (11 сентября 2013) - поддержка разработки ПО для устройств с архитектурой ARM, работающих под управлением Android...
  • Delphi XE6 (15 апреля 2014) - исправлены сотни ошибок; новые компоненты (Application Tethering Components, Taskbar component, компоненты для работы с датчиками (акселерометр, GPS и гироскоп)...), взаимодействие с сервисами в облаках (BaaS); возможность создания приложений для Google Glass; новые иконки в IDE...
  • Delphi XE7 (2 сентября 2014) – изменения в RTL и FireMonkey, удалены компоненты для работы с BDE...
  • Delphi XE8 (7 апреля 2015) - поддержка iOS 64; в IDE интегрирована новая система контроля версий Mercurial Version Control System; добавлены два новых независящих от платформы типа данных (FixedInt и FixedUInt)...
  • Delphi 10 Seattle (31 августа 2015) - поддержка Windows 10, iOS 8.4, Android 5.1.1, API WinRT, DirectX 12; новые компоненты...
Как видите, программисты компании Embarcadero трудились над развитием Delphi в стиле "ни дня без строчки", т.е. "ни года без релиза". Для сравнения компания Borland за 13 лет (с 1995-го по 2008-й), если не считать "мертворожденных" Kylix и Delphi 8.NET, были сделаны всего 10 резов Delphi. Хотя авторство Delphi 2009 спорно, т.к. эта версия была выпущена Embarcadero всего через несколько месяцев после покупки компании Borland. По большому счету, не важно, какая компания разрабатывает Delphi (скорбим только о Borland). Важно то, чтобы команда разработчиков Delphi дружной толпой, не снижая набранного темпа, продолжила работу над своим проектом под крышей Idera, а компания Idera уделяла больше внимания и средств на дальнейшее развитие и продвижение Delphi.