-
well © (07.02.11 14:47) [0]Не буду приводить весь текст программы, но суть в следующем.
Есть две таблицы. Table1 и Table2. Вторая таблица связана с первой, скажем по полю ID_Table1.
Доступ к таблицам через TADOQuery,TDataSource.
1. Делаю обратобчик события OnDataChange первой таблицы
[code]TForm1::TDataSource1DataChange(TObject *Sender, TField *Field)
{
Table1->Close();
//
//Тут выполняются некоторые действия, которые не влияют на проблему
//
Table1->Open();
}[/code]
Обработка проходит успешно, ошибок нет.
2. Добавляю элемент BDLookUpComboBox
DataSource=DataSource2
DataField=ID_Table1
ListSource=DataSource1
KeyField=ID
ListField=какое то поле
И тут при запуске программы выдаётся сообщение о переполнении стека.
Что за конфликт? И как его обойти?
Пожалуйста подскажите! -
> Делаю обратобчик события OnDataChange первой таблицыOccurs when the data in a record has changed, either due to field edits or moving the cursor to a new record.
Когда вы открываете таблицу (Table1->Open) то вызывается TDataSource1DataChange и т.д. пока не истратится весь стек. -
> И как его обойти?
Отключением этого события на время:DataSource1.OnDataChange = NULL;
try
Table1->Open;
finally
DataSource1.OnDataChange = TDataSource1DataChange; //тут не помню, нужен ли "&" в C++Builder
end; -
well © (07.02.11 15:27) [3]А если я убираю BDLookUpComboBox почему он не тратится?
-
> А если я убираю BDLookUpComboBox почему он не тратится?
Трассируйте и да узрите :)
У меня вот такой код (без DBLookUpComboBox) приводит (при нажатии на кнопку Button1) к зацикливанию:procedure TMainForm.DataSource1DataChange(Sender: TObject; Field: TField);
begin
Table1.Close;
Table1.Open;
end;
procedure TMainForm.Button1Click(Sender: TObject);
begin
Table1.Open;
end; -
Плохиш © (07.02.11 15:53) [5]
> И как его обойти?
Не сувать всякую дерьмообработку куда не попадя. Не преднозначено событие onDataChange для закрытий/открытий связанного набора данных. -
well © (07.02.11 16:39) [6]Ладно, тут ты прав. Хотел попроще сделать, а получилось как всегда :)