Компонент TDBGrid теперь может отображать вложенные таблицы. Для иллюстрации этой возможности воспольуемся таблицами customer.db, orders.db и items.db, поставляемыми вместе с Delphi. Поместим на форму три компонента TTable, три компонента TDataSourse, один компонент TClientDataSet и один компонент TProvider. Установим следующие свойства этих компонентов:
КомпонентСвойствоЗначениеDBGrid1 | DataSource | DataSource3 |
DBNavigator1 | DataSource | DataSource3 |
Table1 | DatabaseName | 'DBDEMOS' |
TableName | 'customer.db' | |
Active | True | |
DataSource1 | DataSet | Table1 |
Table2 | DatabaseName | 'DBDEMOS' |
TableName | 'orders.db' | |
IndexFieldNames | 'CustNo' | |
MasterFields | 'CustNo' | |
MasterSource | DataSource1 | |
Active | True | |
DataSource2 | DataSet | Table2 |
Table3 | DatabaseName | 'DBDEMOS' |
TableName | 'items.db' | |
IndexFieldNames | 'OrderNo' | |
MasterFields | 'OrderNo' | |
MasterSource | DataSource2 | |
Active | True | |
Provider1 | DataSet | Table1 |
ClientDataSet1 | ProviderName | 'Provider1' |
Active | True | |
DataSource3 | DataSet | ClientDataSet1 |
Рис. 15 Главная форма приложения, использующего вложенные таблицы.
Сами таблицы формата Paradox, естественно, не поддерживают поля, содержащие вложенные таблицы, но такие поля поддерживает компонент TClientDataSet со страницы MIDAS палитры компонентов. Связав его с компонентом Table1 посредством компонента Provider1, мы получим набор данных, содержащий поле Table2 типа TDataSetField, а внутри вложенной таблицы - поле Table3 того же типа:
Рис. 16 Вложенные таблицы на этапе выполнения.
Такое представление данных даже в случае использования настольных СУБД весьма удобно просто потому, что оно решает общеизвестную проблему нехватки места на форме при наличии нескольких связанных таблиц. Единственное, о чем при этом следует позаботиться, это вызов метода ApplyUpdates компонента TClientDataSet (например, в обработчике события, связанного с выбором какого-либо пункта меню или с нажатием на кнопку): ClientDataSet1.ApplyUpdates(-1);
Если не использовать этот метод, данные будут сохраняться только в кэше, которым фактически и является компонент TClientDataSet, а не в самих таблицах.