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