Fórum Será que é possivel fazer isto no Delphi? #184939
29/09/2003
0
Queria preencher em tempo de execucao (RUN TIME) uma procedure/funcao com um codigo ou procedure/funcao.
Segue-se um exemplo bobo abaixo, só para explicar o que eu quero fazer:
procedure teste;
begin
showmessage(´teste´);
end;
procedure chamafn;
begin
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
//AQUI ESTA O PROBLEMA
//AQUI EU QUERIA DEFINIR O QUE A FUNCAO chamafn FARIA
//chamafn:= teste; <= EU SEI QUE ISTO ESTA ERRADO
//MAIS TARDE EU CHAMARIA A FUNCAO
chamafn;
end;
Delphiz
Curtir tópico
+ 0Posts
29/09/2003
Rodrigo Coutinho
begin
showmessage(men);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Teste(´teste demenssagem´);
end;
Assim vc chama a funcao e passa parametros.
Gostei + 0
29/09/2003
Delphiman
type
Tform1 = class(TForm)
...
private
procedure teste;
procedure ChamaFn;
end;//fim do type
procedure Tform1.teste;
begin
showmessage(´teste´);
end;
procedure Tform1.chamafn;
begin
end;
...
chamafn:= teste;
...
T+
Gostei + 0
29/09/2003
Rfpsatin
tipo
procedure proc01;
begin
...
end
em um determinado momento fazer ela ter algo como um loop ou coisa <>?
se for isto, deê uma olhada no que o Object Pascal chama de tipo Procedural, um tipo novo q vc cria que é do tipo procedure. + não é bem q q vc precisa.
Gostei + 0
29/09/2003
Delphiz
Vc nao entendeu o que eu disse.
- delphiman:
O que vc falou nao entendi.
Vc fez em seu código: ´chamafn:= teste;´
Isto nao esta certo.
- rfpsatin:
Na verdade eu queria que a procedure/funcao chamasse outra procedure/funcao.
Eu queria que como se fizesse um link, algo parecido assim.
Ex:
//Isto aqui nao esta certo. Mas seria alguma coisa parecida, em que qdo chamasse a funcao ´chamafn´ a unica coisa em q ele faria era executar a funcao ´teste´. Eu queria que o ´chamafn´ executasse qq tipo de procedure com ou sem parametros.
Chamafn:= teste;
Gostei + 0
29/09/2003
Rfpsatin
Gostei + 0
29/09/2003
Delphiz
vc quer dizer isto ne:
type
TFuncao = function (texto: String);
....
Gostei + 0
29/09/2003
Marcelo Saviski
...
procedure Teste;
begin
showmessage(´teste´);
end;
procedure Teste2;
begin
showmessage(´teste2´);
end;
..
ChamaFn := Teste;
...
ChamaFn; //Exibe uma mensagem : ´teste´
...
ChamaFn := Teste2;
...
ChamaFn Exibe uma mensagem: ´teste2´
e assim vai
Gostei + 0
29/09/2003
Delphiz
Gostei + 0
29/09/2003
Marcelo Saviski
type
TMyFunction : function(Parametros : TipoTal) : TipodoResultado;
var
ChamaEvento : TMyFunction;
..
function Funcao1(Parametros : TipoTal) : TipodoResultado;
begin
//Faz alguma coisa
end;
function Funcao2(Parametros : TipoTal) : TipodoResultado;
begin
//Faz outra coisa
end;
..
ChamaEvento := Funcao1;
ChamaEvento(Parametros);
ChamaEvento := Funcao2;
ChamaEvento(Parametros);
mas agora se isso acima não funcionar, tenta:
type
PMyFunction: ^TMyFunction;
TMyFunction : function(Parametros : TipoTal) : TipodoResultado;
var
ChamaEvento : PMyFunction;
..
function Funcao1(Parametros : TipoTal) : TipodoResultado;
begin
//Faz alguma coisa
end;
function Funcao2(Parametros : TipoTal) : TipodoResultado;
begin
//Faz outra coisa
end;
..
ChamaEvento := @Funcao1;
ChamaEvento(Parametros);
ChamaEvento := @Funcao2;
ChamaEvento(Parametros);
talvez para dar certo tivesse que ser: VarRetorno := ChamaEvento(Parametros)^; :?: :?:
Estou sem o Delphi para poder testar como já deve ter notado
Gostei + 0
29/09/2003
Renatosilva
Mas isso não é possível, o valor deve ser compatível com o tipo da variável procedimental. A idéia que eu te dou é criar um tipo que aceite como argumento um array de strings. Então você cria diversas funções com essa estrutura que percorrem o array captando os argumentos como lhes convém. Acho que o mais ideal é declarar um argumento do tipo ´array of const´, mas eu não sei direito como é porque não testei...
Gostei + 0
30/09/2003
Delphiz
Por exemplo, se eu declarar:
type
TMyFunction : function(texto : String) : boolean;
...
function faz_isso1(texto: String) : boolean;
begin
...
end;
function faz_isso2(num: inteiro; texto: string) : boolean;
begin
...
end;
function faz_isso3(Estrutura1: TEstrutura) : boolean;
begin
...
end;
Eu tenho 3 funções com parametros totalmente diferentes e uma funcao com 2 parametros. So uma funcao coincide com o ´TMyFunction´.
O Renato disse que isto o que eu quero fazer não é possível :cry: . E eu estou começando a achar tb... Se alguem souber ou descobrir ficaria :D .
Só existe esta forma de se fazer isto? Esta forma é muito limitada.
Não tem uma forma de ´linkar´? Como se eu estivesse definindo uma ação para um evento, alguma coisa parecida.
Gostei + 0
30/09/2003
Marcelo Saviski
ficaria + ou - assim:
type TMYFuntionType = function(Parametros : array of const) : variant; var MinhaFuncao : TMYFunctionType; function faz_isso1(Parametros : array of const) : boolean; begin Case Parametos[0].VType of VTString : ShowMessage(Parametros[0].VAnsiString^); VTWideString : ShowMessage(Parametors[0].VWideString); else raise EXeption.CreateFmt(´Tipo não suportado VType=¬d´, [Parametros[0].VType); end; end; function faz_isso2(Parametros : array of const) : boolean; var num : integer; begin Case Parametros[0].VType of VTInteger: Num := Parametros[0].VInteger; end; if Parametros[1].VType = VTString then ShowMessage(Format(´O texto é: ¬s, e o Numero é: ¬d´, [Parametros[1].VAnsiString^, num])); end; function faz_isso3(Estrutura1: TEstrutura) : boolean; begin //não me lembro como é esse , em casa dou uma lhada no livro aonde vi isso e corrijo os erros amanhã end;
e:
MinhaFuncao := faz_isso1; MinhaFuncao([´texto qualquer´]); mostra um showmessage com "texto qualquer" MinhaFuncao := faz_isso2; retorno := MinhaFuncao([10, ´TEXTO´]);exibe um showmessage com "´O texto é: TEXTO, e o Numero é: 10"
Devem ter alguns errinhos ai, em casa dou uma olhada melhor no Livro e posto amanhã como seria o correto
Gostei + 0
01/10/2003
Delphiz
Se vc puder + tarde colocar o codigo q restou, agradeço tb.
Gostei + 0
02/10/2003
Marcelo Saviski
Esqueci o livro, mas ai explica bem como usar o [b:dcd829aca9]array of const[/b:dcd829aca9]
na página, procure por: [color=blue:dcd829aca9][i:dcd829aca9]Parâmetros Open Array [/i:dcd829aca9][/color:dcd829aca9]
é isso, flw
Gostei + 0
03/10/2003
Rafaelgm
Não sei se entendi bem o que você quer fazer, mas tente fazer isso:
--------------------------------------- var chamafn: procedure; procedure teste; begin Showmessage(´teste´); end; procedure TForm1.Button1Click(Sender: TObject); begin @chamafn := @teste; chamafn; end; ---------------------------------------
Abraços,
Rafael Monteiro
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)