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

Продолжаем знакомиться с новыми возможностями в Delphi XE2. С FireMonkey немного познакомились — в дальнейшем, думаю, мы ещё вернемся к этому вопросу. А пока на повестке дня небольшой обзор ещё одного нововведения — LiveBinding.

LiveBinding — это новый механизм связывания различных типов данных. С помощью LiveBinding мы можем связывать различные свойства компонентов, поля баз данных со свойствами компонентов, свойстсво компонента типа Integer, со свойством другого компонента типа String без явного преобразования типов данных и т.д. и т.п.

Кроме того, LiveBinding позволяет создавать новые приложения с минимальными затратами времени на написание исходного кода.

Но это все пока только слова. Давайте рассмотрим работу механизма LiveBinding на примерах, ну а вывод о том использовать или не использовать LiveBinding в своих приложениях — останется за Вами ;). С выходом Delphi XE2 у компонентов как в VCL так и в FireMonkey появилось ещё одно свойство — LiveBindings. Собственно, именно через это свойство мы и будем связывать данные. И начнем с простенького примерчика связывания двух метод — Label. К примеру, нам необходимо, чтобы при изменении текста в первой метке автоматически изменялся текст и во второй. Понятно, что такое реализовать и в Delphi 1 элементарно, но это самый простой пример, который пришел в голову по части работы с LiveBinding.

Итак, запускаем Delphi XE2, создаем новый проект «VCL Application» и бросаем на главную форму две метки TLabel и одну кнопку TButton клик по которой будет менять текст в одной из меток. Вид главной формы будет примерно такой:

Теперь выбираем первую метку (Label1), в Object Inspector ищем свойство LiveBindings и в выпадающем списке выбираем пункт «New LiveBinding…«:

Это действие приведет к тому, что на форме появится новый компонент — TBindingsList, в котором будут храниться все сведения о связывании данных, а также откроется окно выбора типа связывания — нам необходимо выбрать значение TBingExpression :

Жмем «Ok» и снова переходим к Object Inspector. Теперь в свойстве LiveBindings появился новый элемент — BindExpressionLabel1 свойства которого необходимо изменить:

Устанавливаем следующие свойства:

  • AutoActivate = true — указывает на то, что выражение для связывания данных активируется автоматически во время выполнения программы.
  • ControlExpression = ‘Caption’ — свойство компонента, которое будет использоваться в выражении для связывания данных. Менять будем Caption метки.
  • SourceComponent = ‘Label2’ — определяет компонент, который будет использоваться в качестве источника данных для текущего компонента. Т.е. мы указываем, что данные для свойства Caption метки Label1 будут браться из компонента Label2.
  • SourceExpression = ‘Caption’ — выражение для компонента-исходника данных, которое будет использоваться в выражении связывания данных.
  • Direction = dirSourceToControl — направление связывания. В данном случае данные из источника с помощью связывающего выражения будут передаваться в компонент.
Теперь напишем пару строчек кода для кнопки:
procedure TForm12.Button1Click(Sender: TObject);
begin
Label2.Caption:='Test';//изменяем текст у источника
BindingsList1.Notify(Label2,'');//сообщаем об изменение
end;

Во второй строке мы уведомляем компонент TBindingsList о том, что какое-то свойство у Label2 было изменено и необходимо произвести изменения. Теперь все готово для запуска программы. Жмем F9 и в запущенном приложении нажимаем кнопку. Вы увидите, что при изменении Cation у второй метке автоматически изменяется и текст в первой — вот такой простой пример LiveBinding в действии.
Теперь ещё пару слов об этом примере. Что касается метода Notify у TBindingsList, то мы могли бы сразу казать списку какое именно свойство у компонента Label2 было изменено и написать так:

procedure TForm12.Button1Click(Sender: TObject);
begin
Label2.Caption:='Test';
BindingsList1.Notify(Label2,'Caption');
end;

В этом случае была бы проведена только одна проверка свойства, указанного во втором параметре метода.

Теперь более «сложный» пример — связывание свойств различных типов. На самом деле все настройки компонентов останутся практически идентичными. Итак, бросаем на форму ещё один компонент — TTrackBar.   Пусть теперь свойство Position: Integer у TrackBar отражается всегда в метке Label1.

Снова выбираем Label1 и в Object Inspector добавляем новое выражение для связывания данных, на этот раз указав такие свойства нового выражения:

  • AutoActivate = true — указывает на то, что выражение для связывания данных активируется автоматически во время выполнения программы.
  • ControlExpression = ‘Caption’ — свойство компонента, которое будет использоваться в выражении для связывания данных. Менять будем Caption метки.
  • SourceComponent = ‘TrackBar1‘ — определяет компонент, который будет использоваться в качестве источника данных для текущего компонента. Т.е. мы указываем, что данные для свойства Caption метки Label1 будут браться из компонента Label2.
  • SourceExpression = ‘Position — выражение для компонента-исходника данных, которое будет использоваться в выражении связывания данных.
  • Direction = dirSourceToControl — направление связывания. В данном случае данные из источника с помощью связывающего выражения будут передаваться в компонент.

У TrackBar пишем обработчик свойства OnChange:

procedure TForm12.TrackBar1Change(Sender: TObject);
begin
  BindingsList1.Notify(TrackBar1,'Position');
end;

Всё. Можете запустить приложение и убедиться, что не смотря на то, что свойства Caption метки и Position у TrackBar относятся к разным типам данных, никаких исключений в работающей программе не возникает. Все преобразования проводятся для нас неявно механизмом LiveBinding. Как управлять преобразованиями в LiveBinding мы ещё посмотрим, однако факт на лицо — связывание различных типов данных сработало.

Подобным образом Вы можете производить любое количество связываний данных любых компонентов. Однако приведенный выше примеры — это довольно простые вещи, которые можно сделать без особого труда и без LiveBinding. Вполне возможно, что, используя LiveBinding Вам придется связывать не только Integer и String, но и более сложные типы данных. Как связать свойства класса с компонентом на форме мы рассмотрим чуть ниже, а пока рассмотрим по-ближе компонент TBindingsList.

Компонент TBindingsList служит менеджером различных типов связываний и управления данными. По-мимо этого, с помощью редакторов этого компонента мы также можем редактировать наши выражения и проводить их проверку. Например, на данный момент в нашей программе определено два выражения:

  • Для связывания двух меток
  • Для связывания свойств метки и TrackBar’а
Делаем двойной клик по компоненту BindingsList1 и перед нами откроется список выражений:
Для удобства все выражения разбиты по категориям в зависимости от того какой тип связывания мы применяем и эти категории вы можете создавать на свое усмотрение. Чтобы открыть редактор выражения сделайте на нем двойной клик:
Редактор позволяет изменять выражения связывания, а также проводить их проверку. Для того, чтобы изменить выражение для источника (Source) необходимо ввести новое выражение в самую нижнюю строку редактора и нажать кнопку «Post» (галочку). Например, я изменил выражение следующим образом:
В редакторе мы можем сразу же определиться с тем сработает ли такое связывание или нет. Вначале проверяем выражение для компонента — для этого жмем первую кнопку «Eval Control» — откроется окно в котором мы можем посмотреть результат проверки:
Если данные просматриваются как в виде типа данных (Type) так и в виде строки (String), то аналогичным образом можно проверить источник данных (кнопка «Eval Source»):
Как видите, здесь уже наш тип данных не просматривается как строка, следовательно — данные могут не связаться. Чтобы убедиться в этом, жмем последнюю доступную кнопку «Assign To Control» и видим, что результат преобразования равен nil т.е. во время преобразования данных произошла кака-то ошибка, результат которой будет показан после закрытия окна проверки:
Т.е. нам сообщают, что имеющихся средств LiveBinding не хватило для того чтобы привести тип TFontPitch к TCaption или применить подходящий конвертер.Да, собственно и не зачем нам такое преобразование. Просто небольшой пример того, что всё-таки не всегда удается легко «сложить тёплое и мягкое».
В этой статье я рассмотрел опять же, как и в случае с FireMonkey, только то, что «лежит на поверхности» — запустил, накидал за 5 минут примерчик, посмотрел, отписался. Естественно, что возможности LiveBinding ограничиваются не только передачей данных от одного визуального компонента к другому. В качестве более сложной иллюстрации работы LiveBinding в Help’e RAD Studio XE2 приводится пример создания программы, работающей с базой данных через механизм LiveBinding. Можете посмотреть этот пример, чтобы более детально разобраться с нововведением Delphi XE2. Я же пока решил максимально широко рассмотреть новинки Delphi XE2 и определиться с тем, что из новинок буду рассматривать более детально в блоги и активно использовать в своей работе.
0 0 голоса
Рейтинг статьи
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Подписаться
Уведомить о
10 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии
Всеволод Леонов

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

Ник
Ник
01/12/2011 19:49

хм, а возможно ли чтобы при запуске в лэйбле изначально отображался не первый элемент (первая строка) из БД, а сразу та которая мне нужна именно в этом лэйбле? Ну грубо говоря, допустим, у меня есть лэйблы в которых отображаются цены, я их связал с полем ЦЕНА из БД, и мне нужна чтобы в каждом лэйбле отображалось именно та строчка из поля ЦЕНА которая мне нужна? Возможно ли такое вообще и какое свойство использовать? Можете чем-нить помочь? =)

Алексей
Алексей
07/12/2011 23:04

Классный блог. Спасибо.
 

r3code
08/12/2011 12:41

Милейший автор, прошу вас добавить к этой статье тег LiveBindings.
Очень приятно будет читать серию этих статей.

trackback

[…] видео-ролик, освещающий какую-либо новую возможность: LiveBindings, Firemonkey, VCL Styles и т.д.   Следуя условиям видео0-марафона, […]

trackback

[…] связывания данных, который ранее назывался просто LiveBindings, обзавелся теперь визуальными редакторами, которые […]

Дмитрий
Дмитрий
02/11/2012 13:54

Я не понял. Всегда нужно вызывать Notify что-бы привязка сработала?
Нету автоматического способа, типа как интерфейс INotifyPropertyChanged в дотнете?

Ta2i4
28/08/2013 16:19

Статья интересная. Прямо открытие для себя сделал. Но… Как в XE2 Livebindings работать с TStatusBar.Panels, если не рассматривать вариант TStatusBar.SimpleText?