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

Delphi

Одним из новшеств FireMonkey в XE7 стал компонент TMultiView. По сути это некая панель, которая может вести себя по разному, в зависимости от устройства, на котором запускается приложение. Она может “всплывать, “выпадать”, оставаться закрепленной и т.д. В мобильных приложениях такие панели практически повсеместно используются для организации представления Master-Details, поэтому такой компонент был, что называется, необходим. До выхода XE7 я видел как минимум три реализации чего-то подобного, хотя и менее универсального.

Вчера в процессе перевода своего рабочего приложения на XE7, я попытался разобраться с этим компонентом. Для того, что бы понять как он работает лучше всего создать новое Multi-Device приложение и использовать шаблон Master-Detail.

NewMultiDeviceApplication

В XE7 данный шаблон уже содержит предварительно настроенный экземпляр данного компонента, расположенный слева на форме. TMultiView имеет несколько ключевых свойств, определяющих его поведение. Прежде всего, это свойство Mode.

    property Mode: TMultiViewMode read FMode write SetMode default TMultiViewMode.PlatformBehaviour;

 Именно это свойство определяет поведение компонента – будет ли это обычная панель, либо она будет выезжающей или выпадающей. Свойство может принимать следующие значения:

TMultiViewMode = (PlatformBehaviour, Panel, Popover, Drawer, Custom);

По умолчанию значение PlatformBehaviour, т. е. его поведение определяется платформой. Что бы понять как будет вести себя компонент при изменении значения этого свойства, вы можете сделать небольшой эксперимент. Поместите на форму компонент TComboBox (я предварительно удалил в шаблонном приложении все контролы, предназначенные для отображения данных). Свойство Items определите следующим образом:

PlatformBehaviour

Panel

Popover

Drawer

Custom

Задайте следующий обработчик события OnChange:

MultiView1.Mode:= TMultiViewMode(cbMode.ItemIndex);

Теперь при выборе элемента выпадающего списка будет меняться значение свойства Mode. Под Windows компонент может выглядеть так:

MultiViewProper

Или так (панель “выезжает”):

MultiViewDrawer

Свойство компонента MasterButton указывает на тот компонент, который будет инициировать появление или скрытие панели. Вы можете так же указать значение свойства TargetControl. Это может быть панель или другой компонент контейнер. Так или иначе, состояние MultiView будет отражаться на свойствах компонента, выбранного в качестве TargetControl. На приведенных ниже рисунках видно как изменяется TargetControl при выпадании панели компонента MultiView. За изменение цвета отвечает свойство ShadowOptions.

MultiViewTargetControl2

MultiViewTargetControl1

Собственно, ничего особо сложного в использовании компонента нет. К тому же, в комплекте Delphi XE7 поставляется демонстрационный пример.

 

Листаю свежекупленную книгу Даниеля Тети (Daniele Teti) Delphi Cookbook. По нашим временам, любая книга по Delphi, уже событие. Если же она не переписана с ранее издававшихся, то это вообще шикарно. А в данном случае ко всему этому добавляется то, что по сути, книга посвящена новинкам Delphi. То есть, большая часть кода, приведенного в книге не заработает не то, что на Delphi 7, но и на Delphi XE. Хотя речь идет не только о FireMonkey, которая появилась в XE2, но и новинках языка. Судя по эволюции обложек, автор начал работу над книгой, когда актуальной версией Delphi была ещеXE5. Конечно, сейчас писать книгу  о FireMonkey – задача не для слабых духом. Платформа существенно обновляется не только с каждым новым релизом, но даже при выпуске апдейтов. Понятно, что новинки XE7 в книгу не попали. Тем не менее, интересного в книге хватает.

Содержание вы можете посмотреть в блоге автора.

К книге, естественно, прилагается архив с примерами.

По своей структуре книга является сборником рецептов, о чем, собственно, и свидетельствует ее название. 50 отдельных примеров объедены по тематике в 7 глав. К слову, мне подобный формат книг нравится. Хорошо описанные примеры. пожалуй самое эффективно средство в освоении новшеств, на отсутствие которых пользователям Delphi жаловаться в последнее время не приходится.

Еще один плюс, по крайней мере для меня, это не сложный английский. Автор книги, судя по всему, итальянец, и английский для него не родной язык. А следовательно, ломать голову над словесными изысками не нужно.

Цена pdf версии более чем демократична – $10. Даже по меркам местных магазинов, в частности ЛитРез, цена вполне демократичная. Моё мнение – книга вполне достойна того, что бы занять место на книжной полке где-нибудь в папке Actual Books.

Купить книгу вы можете здесь.

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

Технология App Tethering появилась еще в прошлой версии Delphi. И рассказать о ней я собирался еще после выхода XE6, однако, как это часто бывает “не дошли руки”. Этот механизм предназначен для взаимодействия приложений на разных устройствах. Примечательно, что он поддерживается как в VCL, так и в FireMonkey. В XE7 в App Tethering были добавлены новые возможности, что для меня стало очередным поводом разобраться и сделать пару примеров. Обдумывать идеи для тестового приложения долго не пришлось. Так получилось, что сейчас у меня на рабочем столе  стоит два ПК и, время от времени появляется планшет и смартфон (оба под управлением Android). Работаю я с этими устройствами практически одинаково интенсивно и, соответственно, возникает необходимость оперативно обмениваться не только файлами, но и текстовыми фрагментами, ссылками и т. д.. Конечно, существуют сотни программ, решающих это задачу, но коль скоро у нас имеется инструмент, то грех не написать собственное приложение, реализующее данный функционал.

В идеале мне бы хотелось бы создать некоторое приложение, работающее как под Windows, так и под Android, которое позволяло бы:

  • осуществлять обмен файлами между устройствами;
  • осуществлять обмен содержимым буфера обмена.

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

Поскольку изобилия русскоязычных материалов по App Tethering пока не наблюдается, я буду перемежать рассказ о процессе разработки приложения  выдержками из документации.

Разработку начнем с реализации простейшего функцонала – обмена файлами между ПК. Для того, что бы упростить понимание принципов работы App Tethering создадим два приложения – приложение, передающее файлы (“передатчик”) и приложение, принимающее файлы (“приемник”). Во избежание путанницы я сознательно не стану использовать термины “клиент”, “сервер” и т.д. “Передатчик” реализуем на VCL, а “приемник” – на FireMonkey. Опять же все это из соображений наглядности. В идеале это должно быть одно мультиплатформенное приложение, совмещающее в себе функции приема и передачи файлов. К этому вопросу, надеюсь, мы вернемся чуть позже.

Итак создадим два приложения,VCL и FireMonkey(Multi-device application), назовем их PrjSender и PrjReceiver и объеденим их в одной группе проектов. Механизм App Tethering в Delphi реализуют всего два компонента TTetheringManager и TTetheringAppProfile  (менеджер и профиль). Размещаем их на главной (и пока единственной) форме обоих приложений. В обоих случаях для TetheringAppProfile устанавливаем значение свойства TetheringManager – TetheringManager1, таким образом связываем менеджер с профилем.

Для чего нужны эти компоненты? Документация гласит следующее:

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

  • Менеджер использует адаптеры, для поиска других менеджеров. Например, менеджер использует сетевой адаптер для подключения к другим менеджерам по сети;
  • Менеджер устанавливает связь с удаленными менеджерами (сопряжение);
  • Два парных менеджера позволяют своим профилям узнать о профилях других менеджеров, таким образом профили могут обмениваться данными друг с другом;
  • Менеджер предоставляет информацию от своих адаптеров протоколам своих профилей таким образом, что бы эти профили могли обмениваться данными друг с другом, используя собственные протоколы.

Все это звучит немного сумбурно, но попробуем разобраться во всем на практике. Прежде всего, нам нужно обеспечить соединение между двумя приложениями. В верхней части главной формы приложения-приемника разместим компонент ListBox (lbSenders) и кнопку (btnGetAvailableSenders). По нажатию на кнопку отобразим список доступных удаленных менеджеров. Для этого определим обработчик события OnEndManagersDiscovery следующим образом:

procedure TfRecMain.TetheringManager1EndManagersDiscovery(const Sender: TObject;
  const ARemoteManagers: TTetheringManagerInfoList);
var
  I: Integer;
begin
 lbSenders.Clear;

 for I := 0 to aRemoteManagers.Count - 1 do
 begin
  lbSenders.Items.Add(ARemoteManagers[i].ManagerText);
 end;

end;

А по нажатию на кнопку вызовем метод DiscoverManagers компонента TetheringManager.

procedure TfRecMain.btnGetavailableSendersClick(Sender: TObject);
var
i: integer;
begin
  for I := TetheringManager1.PairedManagers.Count - 1 downto 0 do
    TetheringManager1.UnPairManager(TetheringManager1.PairedManagers[I]);

  lbSenders.Clear;
  TetheringManager1.DiscoverManagers;

end;

Предварительно здесь мы очищаем список и разрываем все связи (метод UnPairManager). Читать далее

В одном из постов, если не ошибаюсь в блоге у Всеволода Леонова, довелось мне прочесть про забавный кейс. В программе было предусмотренно ограничение длины поля ввода пароля. При том, ограничивалось оно тихо, просто “съедая” лишние символы. Естественно, что после этого с паролями возникла неразбериха. В принципе, вопрос ограничения длины поля ввода сам по себе является философским, а возможно даже теологическим, но просто взять и “откусить хвост” вводимому тексту, на мой взгляд – не совсем правильно. Однако, в большинстве случаев, если задать свойство MaxLength для контрола, отвечающего за ввод текста, именно так и произойдет.

Компонент TcxTextEdit и другие компоненты из набора DevExpress  могут красиво решать данную проблему благодаря событию OnValidate.

Код, который я использую выглядит примерно так:

procedure TfrmEditBenefit.txtBenefitNamePropertiesValidate(Sender: TObject;
  var DisplayValue: Variant; var ErrorText: TCaption; var Error: Boolean);
begin
 if Length(txtBenefitName.Text)>125 then
 begin
   ErrorText:= 'Benefit name value is too long.';
   Error:= True;
 end;
end;

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

 

txtBenefitName.Properties.ValidationOptions:= [evoRaiseException, evoShowErrorIcon];

Выглядеть это будет примерно так:

TextValueIsTooLong

Ошибка генерируется если текст длиннее допустимого значения при попытке передать фокус другому контролу. При этом пользователь зразу видит что и где не так. По-моему очень удобно и наглядно.

Другие статьи серии:

DevExpress. TIPS & TRICKS #0
DevExpress. TIPS & TRICKS #1
DevExpress. TIPS & TRICKS #2
DevExpress. TIPS & TRICKS #3
DevExpress. TIPS & TRICKS #4
DevExpress. TIPS & TRICKS #5
DevExpress. TIPS & TRICKS #5.5
DevExpress. TIPS & TRICKS #6

Пост шпаргалка. Если вы обладатель Delphi XE6 или Delphi XE7, вам не нужно делать каких-то хитрых телодвижений, для того, создания кнопок на панели, соответствующей приложению в TaskBar‘е. Вы можете воспользоваться компонентом TTaskBar и, таким образом, решить все проблемы. Но, что делать, пользователям Delphi предыдущих версий (попутно напомню,  что при покупке последней версии Delphi вы получаете ключи ко всем предыдущим версиям, начиная с Delphi 7)?

У Боба Сворта есть довольно подробный солюшн, но я нашел в нем некоторые неточности. Ниже приведу свою, немного модифицированную версию данного решения.

Создание TaskbarList‘а ничем особо не отличается. Этот код будет работать и в Windows 7 и в Windows 8:

 

  procedure CreateTaskBarList();
  begin
      TaskbarList := CreateComObject(CLSID_TaskbarList) as ITaskbarList;
      TaskbarList.HrInit;
      Supports(TaskbarList, IID_ITaskbarList2, TaskbarList2);
      Supports(TaskbarList, IID_ITaskbarList3, TaskbarList3);
      Supports(TaskbarList, IID_ITaskbarList4, TaskbarList4);

    if not Application.MainFormOnTaskBar then
      FormHandle := Application.Handle
    else FormHandle := Application.MainForm.Handle;

      TaskbarList3.ThumbBarSetImageList(FormHandle, FMain.ImageList2.Handle);
  end;

Естественно, предварительно нужно проверить версию Windows (она должна быть не ниже 7). Я делаю это так же как и Dr. Bob:

  NeedCreateTBwButtons:= ((Win32MajorVersion=6) and (Win32MinorVersion>0)) or (Win32MajorVersion>6);

В надежде на то, что в последующих версиях Windows этот функционал никуда не денется. Ниже приведены значения переменных для существующих версий системы.

Win32MajorVersion Win32MinorVersion
6
  • Windows 8 (version 6.2)
  • Windows 7 (version 6.1)
  • Windows Vista (version 6.0)
5
  • Windows XP (version 5.1)
  • Windows 2000 (version 5.0)

А вот с кнопками на панели все не так просто. То, что показано в исходном примере работать будет. Но только для случая с одной кнопкой. Если внимательно почитать документацию, то в качестве параметра для метода ThumbBarAddButtons передается ссылка на массив THUMBBUTTON, а не на отдельную кнопку. Максимальное количество элементов в массиве – 7. Массив должен быть статическим.

Я описал его так:

ThbButtons: array [0..3] of TThumbButton;

Соответственно, кнопки я создаю следующим образом:

    ThbButtons[0].iId := 42;
    ThbButtons[0].iBitmap := 0;
    ThbButtons[0].dwMask := THB_FLAGS or THB_BITMAP or THB_TOOLTIP;
    ThbButtons[0].dwFlags :=  THBF_ENABLED;

    StrCopy(ThbButtons[0].szTip, PChar('Start Timer'));

    ThbButtons[1].iId := 43;
    ThbButtons[1].iBitmap := 1;

    ThbButtons[1].dwMask := THB_FLAGS or THB_BITMAP or THB_TOOLTIP;
    ThbButtons[1].dwFlags :=  THBF_ENABLED;

    StrCopy(ThbButtons[1].szTip, PChar('Pause Timer'));

    ThbButtons[2].iId := 44;
    ThbButtons[2].iBitmap := 2;

    ThbButtons[2].dwMask := THB_FLAGS or THB_BITMAP or THB_TOOLTIP;
    ThbButtons[2].dwFlags :=  THBF_ENABLED ;

    StrCopy(ThbButtons[2].szTip, PChar('Stop Timer'));

    ThbButtons[3].iId := 45;
    ThbButtons[3].iBitmap := 3;

    ThbButtons[3].dwMask := THB_FLAGS or THB_BITMAP or THB_TOOLTIP;
    ThbButtons[3].dwFlags :=  THBF_ENABLED;

    StrCopy(ThbButtons[3].szTip, PChar('Cancel'));

    TaskbarList3.ThumbBarAddButtons(FormHandle, 4, @ThbButtons);

Значения флагов, что называется “dwFlags”, не буду здесь их перечислять, для этого есть документация.

Как вы, наверное, уже догадались, здесь я реализовал кнопки  таймера. Обработчик события нажатия кнопок можно реализовать так. как и в базовом примере (отловить сообщение WM_COMMAND). В демонстрационном примере он у меня сработал, а вот в реальном приложении, – почему-то нет. Вероятно, где-то что-то перекрывается. Я не слишком огорчился сему факту, и использовал событие OnMessage компонента ApplicationEvents.

Получилось примерно так: Читать далее

2-го сентября компания Embarcadero Technologies объявила о выпуске RAD Studio XE7. На сегодняшний день RAD Studio это набор средств разработки, включающий в себя Delphi, C++ Builder, HTML Builder, а также лицензия для разработчика на базу данных InterBase. Соответственно, в новую версии «студии» вошли обновленные Delphi XE7 и C++ Builder XE7. Delphi XE7

Сразу оговорюсь, что если раньше C++ Builder был в роли «догоняющего», то в последних двух релизах по функционалу он полностью соответствует Delphi. Поэтому в рамках данного обзора основное внимание я уделю Delphi.

Читателям, которые не особо следят за эволюцией Delphi (хотя откуда у меня в блоге такие?), напомню, что современные версии Delphi позволяют создавать нативные мультиплатформенные приложения, которые могут работать не только в Windows, но и в MacOS, iOS и Android. Наряду с библиотекой классов VCL (которая по-прежнему продолжает развиваться) в Delphi поколения XE (XE2-XE7) появилась новая платформа разработки бизнес приложений  FireMonkey (альтернативное название FM- framework). Именно благодаря  этой платформе появилась т. н. «мультиплатформенность». Концепция FireMonkey предполагала единую кодовую базу, которая используется в разных приложениях. Т. е. для каждой ОС необходимо создать свое приложение, но при этом основной объем кода остается одинаковым. Такой подход можно эффективно использовать и недавно был небольшой рассказ о реальном коммерческом приложении, созданном с помощью FireMonkey (для тех, кому интересно, мое интервью с разработчиками).

Конечно, FireMonkey далеко не единственное новшество в Delphi со времен легендарной Delphi 7, но, наверняка, одно из самых знаковых, определившее дальнейшее развитие продукта.

Что же нового появилось в XE7?

Если в предыдущей версий продукта был сделан акцент на повышении качества, то XE7 получилась довольно богатой на новшества. По словам представителей компании, акцент был сделан на существующих пользователей.

Наиболее концептуальным изменением стал новый дизайнер форм FireMonkey, который по заверениям разработчиков реально позволяет строить единый пользовательский интерфейс для различных (как в смысле форм фактора, так и в смысле поддерживаемой операционной системы) устройств. При этом сохраняется возможность настроить внешний вид формы в зависимости от конкретного устройства. Появились предустановленные визуальные представления для наиболее популярных форм факторов и платформ. В случае необходимости чего-то уникального есть возможностью создать собственное такое представление. Таким образом, изменилась концепция построения мультиплатформенных приложений.

Соответственно, в XE7 появилась новая служба FireMonkey Behavior service, позволяющая платформе и разработчикам получать информацию об устройстве, на  котором работает приложение с помощью специального API. В зависимости от типа устройства корректируются расположение и размеры элементов пользовательского интерфейса. Читать далее

В последнее время, в приватных беседах коллеги меня часто спрашивают,  реально-ли на текущий момент вести разработку мобильных приложений с помощью FM, или все-же это скорее прототип, нежели рабочее решение? Думаю, сегодня я смогу убедить даже самых отъявленных скептиков.

Sphere Live. Desktop Settings Video

Desktop Chat Incoming message

Мой старинный друг и коллега Тагир Юмагузин, уже давно рассказывал о проекте в котором он участвует.  Сейчас же, когда проект вышел на предрелизную стадию, мы решили, что рассказ об этой разработке будет интересен Delphi сообществу. По сути, это реальный большой проект, реализованный на FM. Речь идет о Sphere Live. Небольшая статья, посвященная Sphere недавно была на Хабре. Чуть подробнее, с учетом читательской аудитории моего блога, рассказать о данном продукте согласился руководитель отдела разработки ООО “Сфера Системс”- Алексей Глызин.

А. Б. Алексей, в двух, чем является Ваш проект?

А. Г. Идея проекта возникла не сразу.

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

Понимая, что данное направление весьма перспективно,  и мир движется в направлении увеличения трафика за счет передачи аудио/видео в режиме реального времени, но при этом явно не хватает определенных инструментов, мы решили создать свое ПО.

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

В процессе разработки архитектуры и самого приложения, мы решили оптимизировать его и под “дистанционное образование”.

Уточним, если возникают вопросы о том, что подобных систем уже “море”. Мы предлагаем пользователям нашего ПО уникальные функции. Это, в первую очередь, касается всех “платных” режимов. Пользователи могут давать платные консультации, организовывать платные конференции, лекции и т.д. Ограничений практически нет, за исключением, конечно, аппаратных возможностей.

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

Desktop LoginMobile Login Читать далее

Небольшая зарубка на память, касающаяся FireDAC в актуальной версии Delphi XE6. Но прежде, пару слов о том, где искать ответы на вопросы, касающиеся FireMonkey. Русскоязычные пользователи здесь оказались в привилегированном положении.

Fire-monkey.ru – русскоязычный форум, посвященный FireMonkey, администрируемый и модерируемый Ярославом Бровиным. Так что здесь вы сможете получить ответы, что называется, “из первых рук”. Еще один ресурс давно и хорошо известен – форум SQL.RU и тема, посвященная FireDAC. Здесь вы сможете получить ответы от Дмитрия Арефьева, автора данной библиотеки. И еще хочу порекомендовать блог Андрея Ефимова, в котором собраны ответы на наиболее популярные вопросы, касающиеся FireMonkey.

Собственно, теперь сама заметка.

Для соединения с БД используем FireDAC. База, похоже, значения не имеет. Тестировал на MSAccess и на SQLite. С помощью LiveBinding в XE6 подключаем ListBox. При перемещении по списку перемещение по DataSet’у не происходит. В XE5, однако, все работает нормально. Подключение с помощью dbGo, тоже работает.

Для разрешения данной проблемы следует установить значение FetchOptions.LiveWindowParanoic в True.

Узнать больше:

Читать далее

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

Обнаружение неподдерживаемых устройств

Вы наверняка знаете, что платформа поддерживает подавляющее большинство Android устройств. Но есть и устройства с архитектурой, не поддерживаемой FireMonkey. В частности таких:

  • ARMv6
  • Intel x86
  • MIPS

Естественно, мой шеф является счастливым обладателем одного из подобных аппаратов. После запуска приложения, собранного в XE5 на Motorola Atrix mb860 попросту появляется черный экран, без всяких дополнительных оповещений. В XE6 появились три небольших библиотеки, которые по умолчанию добавляются в проект. Благодаря им теперь, при попытке запустить приложение на неподдерживаемом устройстве теперь выводится сообщение

Application not supported by this device

Если нет необходимости использовать эти библиотеки (например, когда приложения будет запускаться на каком-то конкретном устройстве) их можно отключить в Deployment manager‘е.

delpoyment_manager

Однако, в том случае, если приложение будет распространяться в GooglePlay, эти библиотеки точно следует отключить, поскольку данный сервис сам определяет совместимость приложения с устройствами.

Компоненты для продажи цифрового контента и показа рекламы

В отличии от iOS приложений, монетизация Android приложений не всегда возможна путем продажи непосредственно приложения. Здесь и сами приложения дешевле и конкуренция выше. Поэтому для Android приложений часто используют схемы продажи цифрового контента или рекламы в приложениях.

В XE6 теперь появились компоненты TBannerAdd и TInAppPurchase, предназначенные для показа рекламы и продажи цифрового контента, соответственно. Компоненты можно использовать как в Android (для работы с GooglePlay и AdMob), так и в iOS приложениях (для работы с iTunes и iAd).

Новый FireMonkey стиль для Google Glass

Собственно, для того, что бы о чем-то здесь говорить нужно как минимум иметь очки Google. Тем не менее, понятно, что данное устройство поддерживается, а следовательно принцип “в ногу со временем” воплощается жизнь.

FMX.Grid

Изменения произошли в гриде. Вопрос этот довольно актуальный. Все-таки велико искушение перенести идеологию VCL приложений в FireMonkey. И если для мобильных приложений от использования грида  лучше отказаться, то для десктопных приложений он просто необходим. Качественных сторонних решений уровня гридов от DevExpress нет. А для серьезных приложений, работающих с данными нужна сетка отображения данных с серьезным функционалом.

В XE6 был расширен базовый класс TCustomGrid. В нем появились события OnDrawColumnCell и OnDrawColumnHeader и несколько новых свойств TCustomGrid.Options.

В новой версии TGrid появились обновленные редакторы для столбцов типа TTimeColumn и TDateColumn. А также были добавлены четыре новых события OnHeaderClick, OnSelectCell, OnColumnMoved и OnCreateCustomEditor.

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

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

 Новые контролы для отображения даты и времени

Вместо TCalendarEdit в XE6 появились TDateEdit и TTimeEdit. Сразу же “прикрутил” их в свое приложение. Реализация понравилась. Реагируют на разрешение устройства и в зависимости от него показывают календарь в развернутом либо урезанном виде.

FireMonkey DateEdit

FireMonkey DateEdit

Прочее

На самом деле небольших изменений в FireMonkey было сделано достаточно много. В основном они связаны с модификацией типов данных и добавлением новых методов и событий в некоторые классы (в частности обновился TWebBrowser).

Между тем, при переходе с XE5 особых проблем с совместимостью у меня не возникло. Я не буду здесь перечислять все изменения, они детально описаны в справке в разделе What’s New in Delphi and C++Builder XE6.

Отдельная тема, на мой взгляд, достойная обсуждения – FireDAC. Но об обновлениях в этой библиотеке доступа к данным мы поговорим не сегодня.

Субъективные впечатления

Безусловно сама среда при разработке мобильных приложений стала работать стабильнее. За пару недель плотной работы практически не было “вылетов” и “критических сбоев” в работе IDE. Дизайнер формы наконец-то стал работать с буфером обмена.

К сожалению, редактор Visual Binding при большом количестве объектов на форме по-прежнему притормаживает, поэтому “лишние” (не используемые) объекты лучше сразу делать невидимыми.

Но, повторюсь, что в целом, впечатление весьма благоприятное.

Не пропустите:

 

Сегодня новые продукты поколения XE6 появились в продаже у официальных реселлеров:

 Delphi XE6 от 38238,21 руб.

C++ Builder XE6 от 38238.21 руб.

RAD Studio XE6 от 69152,65 руб.

Я же тем временем, как и обещал, начинаю публиковать небольшой обзор. Так уж получилось, что тестировать новую версию Delphi/RAD Studio мне пришлось на абсолютно новом ПК. Более того, вместо привычной Windows 7, теперь придется работать на 8.1, да еще и 64-битной. Использование современных операционок от Microsoft привносит неповторимые ощущения в процесс мобильной разработки. Но это  отдельная тема, которую я, безусловно, затрону.

Главное, что ожидалось от нового релиза RAD Studio, это повышение качества и надежности продукта. Чего греха таить, нарекания на качество продукта были. Были нарекания и на скорость работы. Забегая вперед скажу, список исправленных багов более чем внушителен. Но кроме этого были добавлены и новые возможности, в том числе и для VCL приложений.

И, конечно, гвоздь программы — поддержка разработки под Android  в  C++ Builder.

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

Для установки я использовал iso-образ. Размер дистрибутива оказался немного больше, чем у Rad Studio XE5. Никаких неожиданностей при установке не возникло. Обратил на себя внимание лишь обновленный дизайн установщика. Как и для предыдущей версии, отдельные дополнительные компоненты и инструменты доустанавливаются отдельно. На момент написания материала для зарегистрированных пользователей доступны:

Читать далее

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



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