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]
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
Curtir tópico
+ 0
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.´
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
Clique aqui para fazer login e interagir na Comunidade :)