Ваш вопрос уже ставит вас впереди меня с навыками программирования, поэтому я просто добавлю, как я мог бы подойти к этому:
Если бы я попытался написать что-то подобное, я бы, вероятно, начал с TListдля каждого поля в вашем TBusinessObject.Этот список будет использоваться для указания того, что необходимо обновить, когда вам нужно было вытолкнуть изменение.
Поэтому, когда TEdit создан, он добавит себя в список, который был связан с частью данных в вашемTBusinessObject.Когда TBusinessObject обновит этот фрагмент данных, он будет проходить по списку прикрепленных объектов.Он увидит TEdit и, зная, что это TEdit, запустит код для обновления .Text.Если бы я прикрепил TCaption, то код обновил бы .Caption.
TEdit, как вы указали, должен будет сообщить TBusinessObject, когда его значение было обновлено.Я полагаю, это сложная ситуация - вы можете создать новый TEdit и добавить в TList, чтобы поддерживать, кому он должен сообщать, когда он изменяется.Если вы использовали .Tag для указания номера поля в TBusinessObject, тогда OnChange (или любое другое событие) может затем вызвать что-то вроде TBusinessObject.FieldUpdate [TEdit.Tag, NewValue], что затем активирует вашу бизнес-логику.Это, в свою очередь, может заставить TBusinessObject обновлять другие поля, которые могут иметь свои собственные списки TList для полей для обновления.
Для предотвращения циклического обновления потребуется наличие способа обновления элемента управления без инициирования событий.Для одной программы, которую я написал, у меня было два метода для обновления элемента управления: SetValue и ChangeValue.SetValue отключил любые события (OnChange, OnValidate), обновил значение элемента управления и затем снова включил события.ChangeValue просто изменил значение и позволил любому из событий элемента управления запускаться по мере необходимости.
Возможно, есть более изящные способы сделать это, но, надеюсь, это даст вам пищу для размышлений.