Delphi LiveBindings TPrototypeBindSource и customFormat
Я использую бизнес-классы с TPrototypeBindSource. Я буду использовать CustomFormat для объединения 2 полей. Я иду с TBindSourceDB, но не с TPrototypBindSource.
Я использую TEdit и TLinkControlToField.
Если я использую: %s + " text" => это нормально работает. Когда я использую его с TBindSourceDB, это прекрасно работает
%s + " - " + Self.Owner.FieldByName('Enseigne').text
Но я не понимаю, как получить доступ к данным, когда я работаю с TPrototypeBindSource.
Не могли бы вы дать мне синтаксис для объединения двух полей с привязкой бизнес-классов?
1 ответ
Я подумал, что мне нужно еще раз ответить на вопрос, потому что у вас не было особого энтузиазма по поводу моего первого.
Прежде чем обратиться к вашему q, давайте попробуем небольшой эксперимент. Например, в проекте, в котором есть DataSet с постоянными полями FieldA и FieldB, установите BindSourceDB и BindingList и добавьте два TLinkControlToFields, чтобы связать эти поля с двумя TEdits, edFieldA и edFieldB.
Проверьте, что он работает должным образом, затем добавьте еще один TEdit, edOther и еще один TLinkControlToField, LinkControlToField3. Установите для его элемента управления значение edOther, DataSource - для BindSourceDB, а его FieldName - для FieldA. Установите его CustomFormat на
Name
Скомпилируйте и запустите, и вы увидите, что edOther отображает имя компонента FieldA FieldA, DataSetFieldA или подобное. Очевидно, что происходит то, что оценщик выражений LiveBinding использует компонент TField FieldA в качестве "области видимости", которую он использует для определения того, какой Name
собственность упоминается.
Теперь замени Name
от Owner.Name
и во время выполнения edOther должен отображать Form1
или аналогичные, поскольку постоянные поля принадлежат их содержащей форме или модулю данных. Таким образом, ссылка на Owner.Name расширяет область, в которой идентификаторы в Format
Выражение может быть разрешено, а их значения извлечены.
Таким образом, используя BindSourceDB в качестве источника данных ссылки, вы можете установить CustomFormat
к чему-то довольно сложному, например
LowerCase(Owner.DataSet.IndexFieldNames) + ' ' + Owner.DataSet.FieldByName('ID').Text
К сожалению, это не работает с настройкой по умолчанию PrototypeBindSource
,
Продолжая наш эксперимент, настройте проект, используя PrototypeBindSource с двумя полями FieldA и FieldB и тремя TEdits, как и раньше. Обратите внимание, что на этот раз, если вы попытаетесь установить CustomFormat
LinkControlToField3 для Name
вы получите сообщение об ошибке "Не удалось найти имя", я думаю, что механизм LB не может разрешить ссылку на имя из-за абстрактной реализации полей в TPropotypeBindSource.
Однако еще не все потеряно. Удалите LinkControlToField3 и вместо этого добавьте в BindingList формы выражение BindExpression.
Установите ControlComponent BindExpression равным edOther
, его ControlExpression для Text
и его SourceComponent для Form1
,
Сделав это, в выражении SourceExpression мы можем ссылаться на свойства Form1 и его компонентов с помощью выражения, подобного этому.
edFieldA.Text + ':' + edFieldB.Text
который прекрасно работает для меня.
Одна вещь, которую мне пока не удалось выяснить, это то, что SourceExpression не может включать в себя такие вещи, как LowerCase
, Однако это легко обойти, добавив MyLowerCase
Функция для Form1 и LB вполне доволен этим.
Итак, я думаю, что ответ на ваш вопрос о том, как объединить содержимое двух элементов управления (или полей). Лично я все же предпочел бы использовать составное свойство бизнес-объекта, но ymmv.