Chamada de Função a Partir de Uma String

22/09/2004

Olá pessoal!

É possível fazer uma chamada à uma função a partir de uma string?

Como por exemplo: Tenho em uma tabela qualquer o nome da função, e dentro da aplicação o sistema faz a chamada da função armazenada no registro.

D já, valeu!


Galodoido

Respostas

22/09/2004

Rafs

Será necessário que você faça a comparação do registro com o nome da função. Assim:
function PrimeiraFunction(FVariavel: TTipoVariavel): TTipoRetorno;
function SegundaFunction(FVariavel: TTipoVariavel): TTipoRetorno;
...
...
...

begin
  if TTable.FieldByName(´Funcao´).AsString = ´PrimeiraFunction´ then
    Retorno := PrimeiraFunction(variável)
  else if TTable.FieldByName(´Funcao´).AsString = ´SegundaFunction´ then
    Retorno := SegundaFunction(variável);
end;



Responder Citar

27/09/2004

Galodoido

Então...

Não é possível chamá-la diretamente pela string, sem fazer comparativos?

Ex.: retorno := Query1.fieldbyname(´funcao´).AsString;

Caso saiba d+ alguma coisa, e puder ajudar ficarei agradecido.


Responder Citar

27/09/2004

Thomaz_prg

Dá pra vc fazer o seguinte:
Colocar todas as funções que você pode usar em uma actionList e, chamar a função que vc precisa, usando as strings mesmo.

Por exemplo:
Na sua actionList vc incluiu 2 actions com os respectivos names: cadFuncionario, cadCliente.
No evento OnExcute de cadFuncionario você coloca:

procedure TForm1.cadFuncionarioExecute( Sender:TObject );
Begin;
frmFuncionario.Showmodal;
End;

Vamos supor que na tela vc tenha um edit chamado edtFuncao e um botão chamado btExecutar.
No evento onClick ne btExecutar faça:

procedure TForm1.btExecutarClick( Sender:TOBject );
var o:TObject;
begin
if edtFuncao.Text = ´´ then exit; //sai fora se nao digitou
//procura pelo componente
o:=FindComponent( edtFuncao.text );
if o = NIL then
showmessage(´Comando e/ou Funcao nao existe!´)
else
if (o is TAction) then (o as TAction).Execute;
End;

É que um Taction é tratado como um componente, então você pode fazer uma procura pelo mesmo.


Responder Citar

28/09/2004

Galodoido

Valeu Pessoal,

Vcs ajudaram bastante!... :lol:


Responder Citar

29/09/2004

Galodoido

Bom...thomaz_prg

Eu fiz os testes com funções simples, como emitir uma mensagem na tela por exemplo.

Até aí...tudo bem! Mas logo que inseri as funções verdadeiras, ou seja minhas funções de impressão ele funciona com várias chamadas e em seguida quando vou fechar o furmulário ele apresenta o erro de Violação.

Sabe o que poderia ser isto?
Vc disse que ele é como se fosse um componente, será que tenho que destruí-lo?


Responder Citar

18/12/2004

Fórum Vini

Olá,
vou ´ressuscitar´ o tópico apenas para colocar uma dica, que talvez possa ser útil para outras pessoas.
Como chamar funções pelo nome: http://jansfreeware.com/articles/delphi-call-by-name.html
Lembrando que a função deve ser published, pois só assim há RTTI gerada para ela, sendo possível chamar o método MethodAddress :wink:

T+,
Vinicius;


Responder Citar