Fórum executar uma função #153356

09/04/2003

0

Bom dia...
Estou com o seguinte problema:
Eu fiz uma procedure, que voce passa por parâmetro um apontador para uma outra função, e um texto qualquer. A procedure está assim:

procedure montaGrafico( funcao: Pointer; texto: string);
begin
frmPri.chGrafico.Foot.Text.Text := ´Gerando gráfico. Por favor aguarde.´;
if assigned(Funcao) then
[b:f8a95edc94]// O problema está aqui ![/b:f8a95edc94]
frmPri.chGrafico.Foot.Text.Text := texto;
end;

E esta procedure é chamada assim:
montaGrafico(@Button1Click, ´Movimento diario´);

Pronto, até aqui tudo legal. Agora meu problema é esse: Eu já verifico se a função que ele passou como parâmetro realmente existe ´if assigned(Funcao)´. Agora eu precisava [b:f8a95edc94]Executar[/b:f8a95edc94] a função que ele passou como parâmetro. Entenderam ? Como eu faço isso ??
Obrigado.[/b]


Nildo

Nildo

Responder

Posts

10/04/2003

Anonymous

A resposta para a sua questão é bem simples.

você deve criar um Type para a sua função, isto é, imagine que a função que será chamada não tem argumentos. Declara o type assim:

Type
TFuncaoSemArgumentos = function: integer; // função sem argumentos que retorna inteiro

TFuncaoComUmArgumento = function(const Nome: string): integer // função com argumento constante string e que retorna um inteiro

Você também pode fazer o mesmo com procedures
Ex:
TproceduresemArgumentos = procedure;
TProcedureComUmArgumento = procedure(const Nome: string);

Sacou?

Na sua função você pode deixar a entrada como está, e lançar cast para o tipo apropriado ou mudar o tipo de argumento:

Ex
Type
TProcedureComUmArgumento = procedure(const Nome: string);

procedure MinhaFuncao(const MeuTexto: string; MinhaProcedure: TProcedureComUmArgumento)
begin
// faço algo com a string

// chamando o procedimento passado
Minhaprocedure(MeuTexto); // viu como é fácil?
// se você passa o argumento como pointer como está em sua função, então o seu código fica assim.
TProcedureComUmArgumento(Minhaprocedure)(MeuTexto);
end;

´Ninguém sabe tão pouco que não possa ensinar. Ninguém sabe tanto que não possa aprender.´


Responder

Gostei + 0

10/04/2003

Anonymous

Valew pela dica, mas eu jah fiz uma gambiarra em Assembler hehe

procedure montaGrafico( funcao: Pointer; texto: string); 
begin 
   frmPri.chGrafico.Foot.Text.Text := ´Gerando gráfico. Por favor aguarde.´; 
   if assigned(Funcao) then 
   begin
      asm
         call funcao
      end;
   end;
   frmPri.chGrafico.Foot.Text.Text := texto; 
end; 



Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar