Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Динамически создаваемыеTTable


Dec ©   (2003-07-27 01:17:00) 

Господа, у меня есть две небольшие проблеммы.

1: Мне приходится динамически создавать несколько TTable (10-15 экземпляров), но при этом в некоторые нужно добавить LookUp поля. Использую следующий код:

for j := 0 to myTB[i].FieldCount - 1 do
with myTB[i].Fields[j] do
begin
// проверяю необходимость добавление LookUp поля
if (FieldName[Length(FieldName)-1] = "I") and
(FieldName[Length(FieldName)] = "D") and
(Length(FieldName) > 2) then
begin
Fld := TStringField.Create(myTB[i]);
st := FieldName;
st[0] := chr(Length(st)-2);
Fld.FieldName := st;
Fld.Name := myTB[i].Name + Fld.FieldName;
Fld.Index := myTB[i].FieldCount;
Fld.FieldKind := fkLookup;
Fld.KeyFields := FieldName;
Fld.LookupDataSet := myTB[lkp];
Fld.LookupKeyFields := "ID";
Fld.LookupResultField := "Name";
myTB[i].Close;
Fld.DataSet := myTB[i];
myTB[i].FieldDefs.UpDate;
aa :=mytb[i].FieldCount;
myTB[i].Open;
end;
( оно содержит код элемента в другой таблице)

Господа, у меня есть две небольшие проблеммы.

1: Мне приходится динамически создавать несколько TTable (10-15 экземпляров), но при этом в некоторые нужно добавить LookUp поля. Использую следующий код:

for j := 0 to myTB[i].FieldCount - 1 do
with myTB[i].Fields[j] do
begin
// проверяю необходимость добавление LookUp поля
if (FieldName[Length(FieldName)-1] = "I") and
(FieldName[Length(FieldName)] = "D") and
(Length(FieldName) > 2) then
begin
Fld := TStringField.Create(myTB[i]);
st := FieldName;
st[0] := chr(Length(st)-2);
Fld.FieldName := st;
Fld.Name := myTB[i].Name + Fld.FieldName;
Fld.Index := myTB[i].FieldCount;
Fld.FieldKind := fkLookup;
Fld.KeyFields := FieldName;
Fld.LookupDataSet := myTB[lkp];
Fld.LookupKeyFields := "ID";
Fld.LookupResultField := "Name";
myTB[i].Close;
Fld.DataSet := myTB[i];
myTB[i].FieldDefs.UpDate;
aa :=mytb[i].FieldCount;
myTB[i].Open;
end;
end;


После попытки открыть таблицу выдаётся сообщение об ошибке: Project такой-то.exe raised exception class EDatabase Error with message "Table2: CityID not found". CityID - это поле, из-за которого и приходится создавать дополнительное LookUp поле (оно содержит код элемента в другой таблице). Я пологаю, дело в том, что после выполнения команды FieldDefs.UpDate выставляется свойство DefaultFields в значение False, и все исходные поля становятся невидимыми. И вот как с этим боротся, понятия не имею. Может быть создать копию свойства Fields и на основе её создать все поля в таблице, а потом добавлять LookUp поля? Дайте совет.

2: Кто-нибудь знает, как подцепить обработчик какого нибудь события (например AfterReFresh) к динамически создаваемой TTable. Помогите.


MetalFan   (2003-07-29 09:51:00) [1]

а компонет так... сам по себе чтли? и с никакой физической таблицей ваабче не связан??? )))


VAleksey   (2003-07-29 09:25:00) [2]


> MetalFan © (29.07.03 07:35)

Речь идет о компоненте, а не о физической таблице.


MetalFan   (2003-07-29 07:35:00) [3]

кааца я с этим сталкивался...
делал так (точно не помню, но словами расскажу)
1) закрываешь таблу, в кот. будешь добавлять поле)
2) удаляешь (deletetable)
3) Добавляешь поле. Что то типа
with FieldDefs.Add do begin .... end;
4) делаешь CreateTable. правда она пустая получицца...
Удачи!


Dec   (2003-07-27 22:14:00) [4]

frost, не понял смысла вопроса: если неизвестно кол-во таблиц, то что это меняет (в контексте моих вопросов)?


frost   (2003-07-27 19:34:00) [5]

А если кол-во таблиц неизвестно ?


Jean   (2003-07-27 18:38:00) [6]

я бы сделал проще. Ты ведь программу дома делаешь? Создай таблицы ручками. Напиши для них все события какие надо. а потом удали и создавай динамически. Все будет работать. Проверено


AkaSaint   (2003-07-27 16:48:00) [7]

2: NewTable.AfterRefresh := MyAfterRefreshHandler;
MyAfterRefreshHandler - процедура, точнее, метод какого-либо класса, например класса твоей формы, подходящего типа (TDataSetNotifyEvent в данном случае).


Наверх

Титульная страница Поиск, карта сайта Написать письмо