How to use TDataSet.DisableControls with Master/Detail datasets?
Pregunta
Calling TDataSet.DisableControls
disables the link between master/detail datasets. Is there another way to disable updating data-aware controls without affecting the master/detail relationship? I know I can set individual component's DataSource
to nil
, but this isn't the practical way for me.
Solución
This solution presumes you use separate TDataSource
instances for linking UI controls and for Master-Detail relations which - from a design perspective - is a good idea anyway.
The drawback of this solution: this cause some flickering in your UI.
You could:
- Enumerate all
TDataSource
instances that point to yourTDataSet
instances but are not involved in Master-Detail relations. - For each of those instances, save the
Enabled
property. - For each of those instances, set the
Enabled
property toFalse
- Run your logic
- For each of those instances, restore the
Enabled
property.
Otros consejos
Nowadays you have a perfect option to achieve this. As the Delphi Help states:
If the dataset is the master of a master/detail relationship, calling DisableControls also disables the master/detail relationship. Setting BlockReadSize instead of calling DisableControls updates the detail datasets as you scroll through the dataset, but does not update data-aware controls.