В моем приложении есть компонент TQuery, в котором мне нужно что-то делать в событии AfterScroll ():
void __fastcall TFormMain::Query1AfterScroll(TDataSet *DataSet)
{
// do stuff here...
}
Проблема заключается в том, что событие AfterScroll явно запускается дважды, когда я делаю следующее:
Query1->Active = true; // first call to AfterScroll
Query1->Locate( /* some arguments here */ ); // second call
Примечание. Модификация SQL-запроса вместо Locate () НЕТ опции
Первый вызов AfterScroll - это тот, который я не хочу обрабатывать, поэтому я ищу элегантный способтолько для обработки второго.
Одной из моих первых идей было использование события AfterOpen () для подключения обработчика событий AfterScroll на лету:
__fastcall TFormMain::TFormMain(TComponent* Owner)
: TForm(Owner)
{
Query1->AfterScroll = 0;
}
void __fastcall TFormMain::Query1AfterOpen(TDataSet *DataSet)
{
Query1->AfterScroll = Query1AfterScroll;
}
Это решение выглядит хорошо,но не работает, потому что AfterScroll будет вызываться прямо в тот момент, когда AfterOpen оставлен.
Редактировать:
Я знаю, что мог бы установить некоторыефлаги для подавления кода в AfterScroll из Executing (что я и делаю сейчас (и: как это описано в первом ответе ниже)), но я думаю, что должен быть более элегантный и менее подверженный ошибкам способ.
Но после некоторого исследования я боюсь, что лучшего решения нет.
Мой вопрос сейчас:
Как правильнопоймать правильный вызов AfterScroll?(тот, который вызывается после Locate (...))