Será que é possivel fazer isto no Delphi?
Será que é possivel fazer isto no Delphi?
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;
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
Curtidas 0
Respostas
Rodrigo Coutinho
29/09/2003
procedure teste(men: String);
begin
showmessage(men);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Teste(´teste demenssagem´);
end;
Assim vc chama a funcao e passa parametros.
begin
showmessage(men);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Teste(´teste demenssagem´);
end;
Assim vc chama a funcao e passa parametros.
GOSTEI 0
Delphiman
29/09/2003
tente associar as funções a algum objeto por exemplo: ao formulário
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+
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
Rfpsatin
29/09/2003
Vc ta querendo passar parametros p/ ela ou acrescentar a ela o bloco de código?
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.
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
Delphiz
29/09/2003
- Rodrigo Coutinho:
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;
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
Rfpsatin
29/09/2003
Então parece q vc vai precisar criar um tipo procedure. Da uma olhada na Bíblia do Delphi q tem, to sem nenhuma (das 3 q temos) aqui p/ te passar o código
GOSTEI 0
Delphiz
29/09/2003
Acho q sei o q vc esta querendo me dizer. O que estou querendo fazer é como se fosse um CallBack.
vc quer dizer isto ne:
type
TFuncao = function (texto: String);
....
vc quer dizer isto ne:
type
TFuncao = function (texto: String);
....
GOSTEI 0
Marcelo Saviski
29/09/2003
ChamaFn : TProcedure;
...
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
...
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
Delphiz
29/09/2003
Marcelo, pela logica eu esperava que funcionasse este codigo, mas nao funcionou. Talvez eu tenha feito alguma coisa errada. Mas mesmo que funcionasse nao me serveria. Pq vc declarou as 3 sendo do mesmo tipo (TProcedure, ou seja, sem parametros). Isto nao funcionaria se eu tivesse uma procedure com parametros (e os parametros podem variar em qtde e tipo).
GOSTEI 0
Marcelo Saviski
29/09/2003
então declare um tipo só seu
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
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
Renatosilva
29/09/2003
o que você quer é que a variável do tipo procedimental possa receber como valor uma rotina de qualquer estrutura de parâmetros/ retorno, né?
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...
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
Delphiz
29/09/2003
Marcelo, agradeço a sua ajuda, mas era como eu tinha falado: nao posso fazer desta forma pq ai eu estou definindo um tipo (fixo) e teria que todas as funções serem deste mesmo tipo.
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.
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
Marcelo Saviski
29/09/2003
Dava para tentar usar o ´array of const´ citado acima
ficaria + ou - assim:
e:
Devem ter alguns errinhos ai, em casa dou uma olhada melhor no Livro e posto amanhã como seria o correto
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
Delphiz
29/09/2003
Marcelo, vlw :) . Creio que isto deva funcionar. No momento nao to pondendo testar.
Se vc puder + tarde colocar o codigo q restou, agradeço tb.
Se vc puder + tarde colocar o codigo q restou, agradeço tb.
GOSTEI 0
Marcelo Saviski
29/09/2003
Olhe essa página: http://www2.fundao.pro.br/articles.asp?cod=53
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
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
Rafaelgm
29/09/2003
Caro Delphiz,
Não sei se entendi bem o que você quer fazer, mas tente fazer isso:
Abraços,
Rafael Monteiro
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
Cebikyn
29/09/2003
Faz muito tempo que este tópico já foi abandonado, mas eu estava pesquisando e achei uma forma muito mais legal de se passar parâmetros em qualquer quantidade (ou tipo) para uma função, do que o Array of Const, então resolvi postá-lo...
Desta forma os parâmetros são realmente em qualquer quantidade e tipo, e não apenas um único parâmetro (Array) que contém os ´parâmetros´...
Vale resaltar também que a construção a cima contém 2 parâmetros obrigatórios (os dois primeiros, claro), mas pode-se reduzir a apenas um.
type
VA_FN = function(const par1, par2{, ...}: Pointer): Boolean;
cdecl varargs;
{ .... }
function fn(const par1, par2{, ...}: Pointer): Boolean; cdecl;
var
// Absolute faz com que o endereço de uma
// variável seja o mesmo de outra:
last_arg: Pointer absolute par2;
ptr_args: array[0..MAXLONG shr 2] of Pointer absolute last_arg;
dw_args: array[0..MAXLONG shr 2] of Cardinal absolute last_arg;
s_args: array[0..MAXLONG shr 2] of PChar absolute last_arg;
w_args: array[0..MAXLONG shr 2] of WideString absolute last_arg;
begin
// note que 1 é o primeiro parâmetro opcional
// Zero é o par2, que é obrigatório
Result := (ptr_args[1] = Pointer(1)) and
(dw_args[2] = 2) and
(string(ptr_args[3]) = ´CHAR´) and
(w_args[4] = ´WCHAR´);
end;
procedure test_fn;
begin
VA_FN(@fn)(nil, nil, Pointer(1), 2, ´CHAR´,
WideString(´WCHAR´));
end;Desta forma os parâmetros são realmente em qualquer quantidade e tipo, e não apenas um único parâmetro (Array) que contém os ´parâmetros´...
Vale resaltar também que a construção a cima contém 2 parâmetros obrigatórios (os dois primeiros, claro), mas pode-se reduzir a apenas um.
GOSTEI 0