Array
(
)

Chamada de Função a Partir de Uma String

Galodoido
   - 22 set 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!


Rafs
   - 22 set 2004

Será necessário que você faça a comparação do registro com o nome da função. Assim:
#Código


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;



Galodoido
   - 27 set 2004

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.


Thomaz_prg
   - 27 set 2004

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.


Galodoido
   - 28 set 2004

Valeu Pessoal,

Vcs ajudaram bastante!... :lol:


Galodoido
   - 29 set 2004

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?


Fórum Vini
   - 18 dez 2004

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;