quarta-feira, 10 de setembro de 2008

Função Callback

Um callback é um modo de enviar uma função como um parâmetro dentro de uma outra função. Quando a função de callback completa, o controle é passado de volta à função original. Nós nunca chamamos uma função de callback diretamente; a função da biblioteca chama ela por nós.


unit ExemploUnit;

interface


uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type

TMeuForm = class(TForm)

OKBtn: TButton;

NomeEdit: TEdit;

procedure OKBtnClick(Sender: TObject);

private

procedure MinhaFuncaoLocal; end;

var

MeuForm: TMeuForm;


implementation

{$R *.dfm}
// primeiro passo é DENTRO DA BIBLIOTECA, precisamos declarar um tipo para passar ele como

// parâmetro para nossa função. Neste exemplo criamos um tipo chamado TRotinaCallback:
type TRotinaCallBack = procedure of object;
// esta aqui é a função que está na nossa biblioteca (neste exemplo é a rotina InformaAbort

// note que o ultimo parâmetro (opcional) é do tipo TRotinaCallBack
procedure InformaAbort(const Condicao: Boolean; const Texto: string; Foco: TWinControl = nil; Rotina: TRotinaCallBack = nil);begin

// se a condição for falsa já cai fora if not Condicao then Exit;
// mostra um alerta ShowMessage(Texto);
// chama nossa rotina de callback (se estiver associada) if Assigned(Rotina) then Rotina;
// manda o foco para o componente TWinControl(Foco).SetFocus;
// manda um abort SysUtils.Abort;end;
// para usar esta 8ª maravilha da programação, é bem simples, basta no seu projeto declarar uma função
// igual a do tipo TRotinaCallBack (neste exemplo a nossa NÃO POSSUI parametros):
procedure TMeuForm.MinhaFuncaoLocal;
begin
// passa a cor do form para vermelho Color := clRed;end;

// aqui no clique do botão, chamamos a função da mLib InformaAbort, sendo que passamos nossa função local
// como parâmetro para ela, a InformaAbort irá de dentro da lib chamar nossa função que se encontra
// no form. Entendeu?
procedure TMeuForm.OKBtnClick(Sender: TObject);
begin
InformaAbort(True, 'Deu erro', NomeEdit, MinhaFuncaoLocal);
end;
end.

  © Blogger template 'Perfection' by Ourblogtemplates.com 2008

Back to TOP