Teoria - funcoes de callback |
Top Previous Next |
|
"Funções de callback" é uma das várias maneiras de notificação de eventos que temos. São diversas as utilidades delas, mas seu uso mais comum é para notificar o andamento de um processo anteriormente solicitado ou delegar uma tarefa a uma outra rotina de código. Veja um exemplo de cada situação acima:
1) Existe uma API do windows chamada "EnumWindows" que serve para enumerar as janelas atualmente gerenciadas pelo windows. Observe que em sua assinatura consta um parâmetro que deve ser um ponteiro para uma função local de sua aplicação que será chamada a cada janela encontrada, dentro dessa função você pode ler informações da janela assim como decidir pelo continuação ou parada do processo de enumeração.
BOOL EnumWindows( WNDENUMPROC lpEnumFunc, // pointer to callback function LPARAM lParam // application-defined value );
2) A procedure "Sort" presente na classe TList tem apenas um parâmetro onde deve ser passada uma função de callback, com formato informado, que será chamada a cada interação com os item da lista. Ou seja, como o TList armazena ponteiros, a classe não tem como saber exatamente o que está sendo guardado por ela. Naturalmente podemos guardar uma lista de TQuery ou TButtons, ou como é mais comum, uma lista de objetos de uma classe definidas por nós mesmos. Então, para ordenar, a VCL vai chamar essa função de callback passando dois items da lista, onde a própria função de callback deve retornar quem deve vir primeiro, visto que ela deve saber que tipos de objetos estão sendo representados pelos ponteiros armazenados.
type TListSortCompare = function (Item1, Item2: Pointer): Integer; procedure Sort(Compare: TListSortCompare);
O conceito é mais ou menos esse e os exemplos estão aí, embora a primeira vista possa parecer um pouco complicado vale a pena tentar entender, pois trata-se de um recurso muito interessante. Existem frameworks cujos eventos são todos baseados em funções de callback, outras usam mensagens (Win32), outras Signals+Slots(QT), outras implementação de classes abstratas e/ou reimplemtação de métodos virtuais e etc...
Atenciosamente, FernandoVM !! ------------------------------ www.fernandovm.hpg.com.br www.tdsexpress.hpg.com.br |