Блог Александра Божко
Архивы
Рубрики

Delphi

Сразу о двух новые книгах, посвящённых Delphi.

Первая – Delphi in Depth: FireDAC Керри Йенсена (Cary Jensen).

FireDAC_200  В свое время, когда я только начинал программировать и и, в принципе, еще не зарабатывал этим на жизнь, мне довелось сдавать допуск к экзамену по английскому. Те самые пресловутые тысячи. Выбор текста оставался за мной, и я решил совместить полезное с полезным ;). Интернета в его нынешнем виде тогда не было, но мне попалась подборка журналов Delphi Magazine. Несколько на мой взгляд наиболее интересных статей я прочел и перевел под запись. Среди них был и цикл статей, посвященных работе с наборами данных. Тогда для меня это послужило неким толчком. Фактически, я научился работать с БД.

Данная книга вполне может послужить чем-то подобным для начинающих разработчиков. Но и для тех, кто имеет опыт разработки DB-ориентированных приложений, она будет интересна. FireDAC – продукт достаточно мощный, и зачастую опыта использования других библиотек доступа к данным может быть не достаточно, что бы использовать весь спектр возможностей FireDAC. Тонкостей и нюансов хватает.

Ознакомиться с содержанием книги вы можете здесь: http://www.jensendatasystems.com/firedacbook/files/DelphiInDepth_FireDAC_CaryJensen_2017_TableOfContents.pdf.

Единственное, чего в книге не хватает, на мой взгляд – описание работы с DataSnap.

Книга относительно не дешевая. $44.99. Но на мой взгляд она стоит того, что бы ее купить.

Книга, как сейчас популярно, персонализирована. Т. е. после покупка она верстается в .pdf формате с вашими реквизитами.

Рекомендую.

 

Автор второй книги – Paweł Głowacki. Сотрудник Embarcadero, известный большим количеством технических статей, посвященных Delphi.

MasteringDelphi_200 Mastering Delphi – рабочее название. Вероятно, окончательный вариант названия будет другим. Что бы не возникало ассоциаций с книгами Marco Cantu. Выход книги ожидается в сентябре этого года.

Сейчас можно сделать предзаказ.

Акцент в книге, судя по аннотации, будет сделан на мультиплатформенную разработку.

Стоимость книги по предзаказу – $32,59.

Думаю, в качестве книги сомневаться не придётся. К слову, Павел как раз известен как автор целого ряда материалов, посвящённых DataSnap.

 

С тех пор как FireDAC стал частью RAD Studio, и в моём блоге появилось несколько постов, посвященных данному продукту, меня время от времени спрашивают как сделать с помощью FireDAC те или иные вещи. При чем, в большинстве случаев вопрошающие пытаются переложить свой опыт использования других компонентов доступа к данным (что вполне логично). К сожалению, описывать многочисленные нюансы работы с FireDAC просто не хватает времени. Да и опыт работы с FireDAC ограничен в основном созданием мобильных приложений.

Буквально вчера я наткнулся на весьма не плохой туториал от Дениса Симонова.

Создание приложений для СУБД Firebird с использованием различных компонент и драйверов: FireDac.

Рекомендую.

Небольшой пост-шпаргалка. Буду предельно краток.

Допустим, у нас есть некий перечисляемый тип. Например:

  TFieldType = (ftUnknown, ftString, ftSmallint, ftInteger, ftWord, // 0..4
ftBoolean, ftFloat, ftCurrency, ftBCD, ftDate, ftTime, ftDateTime, // 5..11
ftBytes, ftVarBytes, ftAutoInc, ftBlob, ftMemo, ftGraphic, ftFmtMemo, // 12..18
ftParadoxOle, ftDBaseOle, ftTypedBinary, ftCursor, ftFixedChar, ftWideString, // 19..24
ftLargeint, ftADT, ftArray, ftReference, ftDataSet, ftOraBlob, ftOraClob, // 25..31
ftVariant, ftInterface, ftIDispatch, ftGuid, ftTimeStamp, ftFMTBcd, // 32..37
ftFixedWideChar, ftWideMemo, ftOraTimeStamp, ftOraInterval, // 38..41
ftLongWord, ftShortint, ftByte, ftExtended, ftConnection, ftParams, ftStream, //42..48
ftTimeStampOffset, ftObject, ftSingle); //49..51

Нам необходимо каким-то образом вывести тип поля из реального набора данных. Очевидно, проще всего название типа получить в виде строки. Для этого мы можем использовать следующую конструкцию:

GetEnumName(TypeInfo(TFieldType), Ord(aDataSet.Fields[I].DataType));

На выходе получаем строку, содержащую название типа для поля aDataSet.Fields[I].

Несколько лет назад я искал менее дорогую альтернативу DevExpress’овскому гриду. Собственно, выражение «искал» здесь не вполне уместно. Уже давно в среде Delphi разработчиков известно, что едва ли не единственной альтернативой cxGrid по доступной цене является TDBGridEh. И хотя уже тогда этот грид имел некоторые уникальные «фишки» функционально он всё же уступал более маститому конкуренту. Впрочем, это воспринималось вполне спокойно, поскольку порядки цен были не сопоставимы.

Недавно я вновь столкнулся с подобной проблемой, мне нужен был «продвинутый» грид, совместимый с Delphi 10.1 Berlin. И я снова не стал даже использовать Google. Выбор был очевиден. Всё тот же EhLib Components Pack.

На этот раз актуальной версией оказалась девятая. Единственный технический вопрос, который меня интересовал на момент приобретения продукта – поддерживает ли этот грид родные стили. И тут же не удержусь от комплимента в отношении техподдержки. Практически сразу я получил ответы как на технические вопросы, так и на вопросы относительно возобновления лицензии.

Что же из себя представляет последняя версия продукта? Вероятно, воспринимать её в контексте DevExpress уже не уместно. Даже если вы бегло посмотрите на скриншоты, то поймёте, что GridEh реализует практически всё, что можно сделать в cxGrid. Читать далее

Одним из главных преимуществ Berlin‘а, является визуальный редактор ListView Item. За три месяца с момента выпуска продукта о нём не написал только ленивый. И он действительно удобен. Он экономит “массу времени, сил и духовной энергии…” (с). Но есть одна проблема, с которой столкнулся я, и судя по записям в многочисленных форумах, не я один. Как только свойство Item Appearance принимает значение DynamicAppearance, при работе с представлениями формы начинается чехарда.

ItemApp Читать далее

К сожалению, времени на всё запланированное банально не хватает. Смена хостера, обновление движка Delphifeeds и многое другое. Тем не менее, начал писать подробный мануал по созданию полноценного мобильного приложения и даже собрал команду болельщиков в этом начинании. Но быстро сказка сказывается, да не быстро дело делается. А пока решил сделать несколько постов в новую рубрику. Как следует из названия, здесь будут публиковаться “зарубки на память”, небольшие лайфхаки и прочие материалы, которые назвать оригинальными можно с натяжкой, но под рукой иметь полезно. Для начала маленький лайфхак для начинающих разработчиков.

Представьте, что в режиме проектирования вам нужно клонировать на форме какой-то сложный объект, например, DataSet. Казалось бы всё просто. Выделяете объект и копируете его в буфер обмена (Ctrl+C). Затем вставляете его на форму и переименовываете новый объект. Но здесь есть один не совсем приятный момент. Если мы откроем редактор полей, то обнаружим, что поля вновь созданного объекта не имеют осмысленных названий, а называются примерно так, как показано на рисунке.

Кроме типа поля из названия смысловой информации мы не получим. Конечно, в данном случае есть простое решение. Удаляем все поля, затем копируем все поля из исходного DataSet’а и вставляем в новый DataSet. Все поля приобретут осмысленные названия. которые мы сможем использовать в коде.

Но что делать, если копирование полей не поддерживается, как, например в TdxMemData от DevExpress? Конечно, можно создать заново все поля вручную, но значительно проще отредактировать код формы. Для этого я использую Notepad++. В принципе подойдёт любой редактор, с поддержкой глобальной замены текста. Всё просто. В Delphi IDE мы выбираем текстовое представление формы. Копируем и переносим код интересующего нас объекта вместе с вложенными объектами в редактор и производим замену по шаблону. После этого вставляем код нового объекта в исходный код формы. Что бы не возиться с описаниями объекта в pas-модуле, просто вырежьте и снова вставьте его на форму.

Минитест на знание VCL

Я решил отнести данный пост к рубрике Редизайн Интерфейса, как наглядный пример того, что заменяя один компонент на другой, пусть и очень похожий функционально, не всегда получается “машинально” обновлять код, используя различные варианты автозамены и прочие ухищрения. Иногда приходится осуществлять полноценный рефакторинг.

Вчера попался мне примерно такой код (я его немного упростил):

procedure TfTest.Button2Click(Sender: TObject);
var
  i: integer;
begin
  i := 0;
  while PageControl1.PageCount > 1 do
  begin
    if PageControl1.ActivePageIndex = i then
    begin
      Inc(i);
      Continue;
    end;

    PageControl1.Pages[i].Free;
  end;
end;

Задача вполне тривиальная. Необходимо удалить все страницы PageControl’а кроме активной. Понятно, что реализация не самая элегантная, но на первый взгляд код вполне рабочий. Найдёте ошибку не заглядывая под кат?

Читать далее

БезымянныйНа фоне последних событий а мире Delphi незамеченной осталась книжная новинка. Обучение мобильной разработке на Delphi. Автор книги, наверняка, хорошо  вам знаком. Это Всеволод Леонов. Да, да. Тот самый Всеволод Леонов, который ещё пару лет назад работал в Enbarcadero, проводил вебинары и колесил по всему СНГ, представляя новые продукты компании. Иными словами, компетентность автора сомнений не вызывает. Но отличительной чертой книги, помимо её бесплатности, является то, что она рассчитана на начинающих. Именно то, чего долгое не хватало новичкам для “быстрого старта”. Изначально книга задумывалась, как книга для школьников. Однако, я не скажу, что она совсем уж детская. Студентам и просто начинающим программистам, вероятно, она будет вполне интересна. У меня даже возникла ассоциация с книгами Архангельского.

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

- Сев, привет. Книгу написал?
– Да, Саш, есть такое. Сам от себя не ожидал, но сложились обстоятельства.

– Какие обстоятельства?
– Прежде всего с переходом в Samsung программирование перестало быть постоянным занятием. Образовался вакуум, который нельзя заполнить ничем, кроме как опять программированием. Такая была гигантская тоска по тому, чем занимался со школьной скамьи.

– Не обязательно было писать книгу. Писал бы блог.
– Порывался. Но потом мы в Samsung совместно с Embarcadero сделали такой “кейс” для школьников. Ежегодно в Москве проводится конкурс “Школа реальных дел”, где команды получают “задание” от вендоров. Мы вместе в прошлом году курировали проекты команд на тему “разработка электронного учебника на Delphi”. Работал я, Сергей Терлецкий и Денис Васильев. Екатерина Макарова тоже помогала. Наш “кейс” стал “образцово-показательным” в масштабах Москвы. Но без книг было трудно.

– Почему? Можно было сделать вебинары…
– Да, мы их и делали. Я вёл “проектную” часть вместе с Сергеем, Денис – чисто “дельфовую”. Но нужна была именно книга в виде “методички”, т.е. сборка пошаговых инструкций с объяснениями по созданию приложения. Читать далее

Сегодня партнеры и клиенты компании Embarcadero получили письмо от Ренди Якобса, CEO компании IDERA, Inc. Я, посчитал, что русскоязычный вариант этого письмо следует выложить в блог, как это сделал из один из наших англоязычных коллег. А заодно выскажу свои соображения по данному поводу.

Я тоже читал, обсуждения в форумах (хотя и не встревал в дискуссии), общался с коллегами и, конечно, переживал за судьбу продукта, который кормит меня на протяжении практически всей моей профессиональной карьеры. Лично меня беспокоило два вопроса. Во-первых то, что  IDERA, образно говоря, DB-шная компания, и далеко не факт, что у них найдется желание и ресурсы для развития нового направления. Я имею введу средства разработки. Во-вторых, интересовало, как IDERA будет выстраивать отношение с Delphi сообществом, и будет ли компания вообще заниматься этим.

В принципе сейчас, мои ожидания можно охарактеризовать как умеренно оптимистичные. Мы получили определенные ответы на означенные выше вопросы. И, по крайней мере, стало понятно, что IDERA  планирует не просто развивать средства разработки Embarcadero (пока я называю эту группу продуктов так), но и имеет определенное виденье этого развития. И, очевидно, скоро мы увидим внятный Road Map.

Ну, а сам факт письма является подтверждением намерений IDERA выстраивать отношения с коммюнити. Так, что надеюсь, для Delphi сообщества, в том числе и русскоязычного, всё сложится наилучшим образом. Поэтому книги по Java и C# отвожу обратно в гараж и привожу полный текст письма Ренди Якобса.

Читать далее

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

Цитирую Ярослава Бровина:

Главные отличия TListView от TListBox в:

  1. TListBoxItem - контрол, TListViewItem - нет
  2. В TListBoxItem можно добавлять любые контролы, используя Parent. В TListVIewItem - нет.
  3. TListVIewItem хранит только данные для отображения
  4. TListVIewItem сам выполняет отрисовку хранимых данных через метод Render
  5. За счет собственно ручной отрисовки в TListVIewItem достигается прирост скорости и малое потребление памяти (хранение только актуальных данных)
  6. Чтобы создать свой вариант TListViewItem, нужно создать свой класс итема, в нем реализовать требуемые данные (например время) и создать in-place редактор для редактирования времени, зарегистрировать его и т. д.

 

Сам по себе факт повышения производительности и уменьшения потребления памяти – веский аргумент в пользу использования TListView. Но есть и еще кое что.

Во многих Android приложениях мне приходилось наблюдать следующую реализацию списков. При нажатии на элемент списка (Item, если придерживаться выбранной терминологии), производится определенное действие. Обычно вызывается новая форма для редактирования данных. Но при нажатии с удерживанием (Long Tap) производится совершенно другое действие. И эти события не пересекаются. Иными словами Android приложения умеют четко различать “длинное нажатие” от “обычного”. Более того, ни одно из этих событий не срабатывает при скроллинге списка. Наглядный пример – список писем в Яндекс Почта.

При попытке реализовать подобный функционал с помощью TListBox, я получил чехарду из накладывающихся друг на друга событий. Главной проблемой оказалось отделение скроллинга от обычного нажатия. В TListView, как оказалось, с этим проблем нет. Но правильно определить события – тоже задача довольно интересная. Дабы сэкономить время своим читателям, я поделюсь здесь результатами своих экспериментов. Читать далее

Продукты DevArt
Купить онлайн:



Читай русскоязычные Delphi блоги
Каталог блогов Blogdir.ru
Яндекс.Метрика