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

Delphi

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

Разрабатывать мы будем именно таймер, в англоязычном понимании этого термина. Т. е. на экране будет отображаться циферблат и четыре кнопки – “Пуск”, “Пауза”, “Стоп” и “Отмена”. Отсчет будет производиться в прямом направлении (т. е. время будет увеличиваться). Вариант, при котором задается время и идет обратный отсчет в англоязычной терминологии называется Stop Watch, возможно я попробую реализовать его позже.  То, приложение, которым займемся мы, по функциональности ближе к секундомеру.

Delphi XE7, позволяет значительно упростить процесс разработки, за счет того, что теперь мы можем создать и отладить реальное приложение для Win32, а затем просто добавить представления форм для необходимых мобильных устройств и, немного подкорректировав их, получить рабочее мобильное приложение. Звучит слишком красиво, что бы быть правдой? Возможно. Но проверить данное утверждение я и хочу, реализовав поставленную задачу. Читать далее

Одним из самых значимых и интересных новшеств в XE7, безусловно, стал новый дизайнер форм FireUI Multi-Device Designer. Для того, что бы понять зачем он нужен и в чем заключается его ценность, нужно просто написать хотя бы одно Android приложение в XE5 или XE6, а затем запустить его на устройстве с другим формфактором. Вы сразу же поймете, что по сути, вы не сделали ничего и вам нужно “работать над интерфейсом”. В подобную ситуацию я попал, создавая свое первое рабочее Android приложение. Отлаживал я его на планшете 7″, а демонстрировал на телефоне. Соответственно, и у меня и у приложения был весьма блеклый вид. А “работа над интерфейсом” вылилась не только в перетаскивание контролов, изменение их размеров и свойств. Пришлось писать код, высчитывать нужное положение и размеры элементов управления, в зависимости от размеров формы. Занятие трудоемкое. К тому же тестировать результаты приходилось на эмуляторе, что тоже добавляло сложностей.

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

FireUI

Давайте посмотрим, как же это выглядит на практике. Я не стану изобретать какие-то демонстрационные примеры, а попытаюсь показать все на примере рабочего (точнее разрабатываемого) приложения. Итак у нас есть некоторая форма. Изначально у нас выбрано представление Main. Читать далее

Одним из новшеств 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.

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

Читать далее

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



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