Delphi Component назначает событие на лету - PullRequest
3 голосов
/ 21 мая 2011

В моей форме есть ADOStoredProc.Это не визуально, но в коде. Обычно довольно просто обрабатывать событие, если компонент визуален. Это просто вопрос двойного щелчка по нужному событию.Но как мне сделать это с помощью кода. Я объявил процедуру:

 procedure SP_SearchAfterScroll(DataSet:TDataSet)

Теперь, как мне назначить свойство обработчика события AfterScroll SP_Search (это ADOStoredProc) для процедуры, которую я написал выше.Я уверен, что вы собираетесь ответить на него.Так что заранее спасибо.

1 Ответ

11 голосов
/ 21 мая 2011

Когда SP_Search является TAdoStoredProc и имеет свойство OnAfterScroll, все, что вам нужно сделать, это:

SP_Search.OnAfterScroll := SP_SearchAfterScroll;

Я предполагаю, что вы использовали правильную подпись для SP_SearchAfterScroll.То есть свойство OnAfterScroll имеет тип, который выглядит следующим образом:

TScrollEvent = procedure(DataSet: TDataSet) of object;

Если свойство OnAfterScroll имеет тип, отличный от этого, вам необходимо убедиться, что ваша процедура SP_SearchAfterScroll соответствует параметрам в этомtype.

Edit

В комментариях Микаил попросил

SP_Search.AfterScroll := SP_SearchAfterScroll(SPSearch)', компилятор жалуется, говоря о несовместимых типах TNotifyEvent и процедуре.Но когда я пишу SP_Search.AfterScroll := SP_SearchAfterScroll, это работает.Какая разница?

Я не успел ответить на этот вопрос, и в то же время Мики объяснил это очень хорошо, поэтому для (более простого) будущего упоминания я включаю егообъяснение здесь:

SP_Search.AfterScroll :=, что код назначает функцию для обработки события при его запуске - вы не вызываете SP_SearchAfterScroll в «назначенное время», просто присваивая значение переменной,так что вы не передаете параметр.Параметр необходим при выполнении вызова - при возникновении события вызывающая сторона назначит параметр с правильным значением.Когда вы передаете параметр, компилятор предполагает, что вы вызываете функцию, а не присваиваете ее, поэтому вы получаете ошибку несовместимых типов.Когда вы просто назначаете функцию без параметра, компилятор понимает, что вы назначаете, а не вызываете функцию.

...