Binding an object graph poses a few challenges. Namely that an object may have children including lists, and if a parent object is refreshed, the child lists may have a different number of items and each item is a different object instance.
hcOPF uses an MGM pattern supporting design-time bindings. The core component in this mechanism is the ThcUIObjectBinder. At design-time the developer populates a collection of ThcUIBindingItems that specify the MediatorClass, and the bound Control. Additional properties may be specified that are dependant on the class of the mediator, such as the attribute name if the mediator is a ThcAttributeMediator descendant.
At run-time, when the ThcUIObjectBinder has been streamed in from the DFM, it’s Loaded method gets called. The binder checks that all bindings are correct by calling the Mediator’s IsValid method. If one or more bindings are invalid, an error message will be displayed and the program terminated. This prevents scenarios like in typical Delphi apps where a field name changes and nothing shows up in the db-aware controls. No error is raised, so the developer has no idea that the form is not working as expected unless they happen to notice the absence of display item.
Immediately after the Mediator’s Loaded method, the Initialize method is called. While this method is not currently used in hcOPF I felt it might be of some valid for initializing controls using values from the database, and that is why it takes a FactoryPool argument.
The Mediator’s Bind method is then called. This method is used by ThcObjectLists and descendants who bind to their controls using a complex mechanism. Simple attribute binding is accomplished by pairing the control to the attribute in the mediator which is accomplished by the streaming system, followed by setting the mediator’s Subject and calling Mediator.Bind() which is done by the ThcUIObjectBinder.
Now that I’ve spent a great deal of time on Object Binding, EMB has introduced LiveBindings. After I get some time to evaluate that technology I might add support to hcOPF for LiveBindings. Time to listen to the CodeRage presentations…