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

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

DBLookUpComboBox конфликт


well ©   (2011-02-07 14:47:00) 

Не буду приводить весь текст программы, но суть в следующем.
Есть две таблицы. 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=какое то поле

И тут при запуске программы выдаётся сообщение о переполнении стека.

Что за конфликт? И как его обойти?
Пожалуйста подскажите!


well   (2011-02-07 16:39:00) [1]

Ладно, тут ты прав. Хотел попроще сделать, а получилось как всегда :)


Плохиш   (2011-02-07 15:53:00) [2]


> И как его обойти?

Не сувать всякую дерьмообработку куда не попадя. Не преднозначено событие onDataChange для закрытий/открытий связанного набора данных.


И. Павел   (2011-02-07 15:33:00) [3]

> А если я убираю 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;


well   (2011-02-07 15:27:00) [4]

А если я убираю BDLookUpComboBox почему он не тратится?


И. Павел   (2011-02-07 15:26:00) [5]

> И как его обойти?


Отключением этого события на время:

DataSource1.OnDataChange = NULL;
try
 Table1->Open;
finally
 DataSource1.OnDataChange = TDataSource1DataChange;  //тут не помню, нужен ли "&" в C++Builder
end;


И. Павел   (2011-02-07 15:20:00) [6]

> Делаю обратобчик события 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 и т.д. пока не истратится весь стек.


Наверх

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