Alterar procedures dinamicamente

Delphi

22/01/2019

Saudações à todos,

Eu sou novato no Delphi. Gostaria de saber se é possível realizar alteração em uma procedure no Delphi dinamicamente.Se alguém puder me ajudar ficaria bastante agradecido.
Cícero Santana

Cícero Santana

Curtidas 1

Melhor post

Jucélio Silva

Jucélio Silva

23/01/2019

E ae Cícero, blz cara ,

Se fala alterar o que está escrito na procedure não tem como, o que você deve fazer é criar condições onde seu código se comporte de forma diferente conforme certas situações, posta ai o motivo de modificar a procedure ou function e tentamos ver a alternativa que seria mais cabível, pois acredito que para o questionamento deve haver uma situação com a qual se deparou.

XD
GOSTEI 1

Mais Respostas

Cícero Santana

Cícero Santana

22/01/2019

E ae Cícero, blz cara ,

Se fala alterar o que está escrito na procedure não tem como, o que você deve fazer é criar condições onde seu código se comporte de forma diferente conforme certas situações, posta ai o motivo de modificar a procedure ou function e tentamos ver a alternativa que seria mais cabível, pois acredito que para o questionamento deve haver uma situação com a qual se deparou.

XD


Olá Jucélio,

Muito obrigado pela sua resposta, de fato, achava que poderia fazer dessa forma, mas terei que encontrar uma outra para trabalhar. A situação que me fez pensar nessa possibilidade é a seguinte. Estou trabalhando numa aplicação que realiza um calculo a partir de um cenário com x quantidades de objetos. Dependendo de quais objetos sejam inseridos ou quantos, o calculo será diferente, ou seja, nunca será a mesma conta. Talvez eu deva trabalhar com o conceito de herança para resolver isso.

Enfim, agradeço mais uma vez por ter me ajudado. Pelo menos agora eu sei por onde não devo ir.

Um abraço!
GOSTEI 0
Ricardo Araujo

Ricardo Araujo

22/01/2019

Ola Cícero Santana,

Neste caso, uma coisa que você poderia tenta usar (TStringList) da uma olhada nisso, acho que irá ajuda bastante no que precisa.

GOSTEI 0
Hélio Devmedia

Hélio Devmedia

22/01/2019

Cícero, tudo bem?

Existe 3 manobras que você pode fazer e escolher a melhor delas:


Uma é a herança como você mencionou... herde classes/formulário e dê um override em cada função ou procedure que você quer que mude, aí você instancia de acordo com sua necessidade, porém isso não é tão dinâmico.


Uma forma mais dinâmica é possível usar nos eventos:

Digamos que o calculo é realizado quando você clica no botão, evento onClick. Cada evento aceita uma procedure com parametros (sender: TObject), então é só você fazer várias procedures com este parâmetro e mudar dinamicamente:

procedure TForm.calculo1(sender: TObject);
begin
   //rotina do calculo 1
end;

procedure TForm.calculo2(sender: TObject);
begin
   //rotina do calculo 2
end;

procedure TForm.calculo3(sender: TObject);
begin
   //rotina do calculo 3
end;


e depois você atribui ao onClik do botão


if qtdobjetos<10 then
    btn1.onClick:=calculo1
else
   if qtdObjetos>10 then
      btn1.OnClick:=caluclo3
   else
      btn1.OnClick:=calculo2


espero que eu tenha ajudado...








GOSTEI 1
Hélio Devmedia

Hélio Devmedia

22/01/2019

Cícero, tudo bem?

Existe 3 manobras que você pode fazer e escolher a melhor delas...


Tem uma outra forma que eu não posso esquecer que é baseado no padrão de projeto Strategy:


Você cria uma classa mae, com um método de calculo e herda um objeto pra cada calculo que você fez, e dentro do sistema você troca de objeto de acordo com a necessidade:

type
   TCalculador = class
   public
      procedure calcular; dynamic; abstract;
   end;

   TCalculador1 = class(TCalculador)
   public
      procedure calcular; override; // aí em baixo você escreve o código desse método para o obojeto Calculador1;
   end;

   TCalculador2 = class(TCalculador)
   public
      procedure calcular; override;  // aí em baixo você escreve o código desse método para o obojeto Calculador2;
   end;

   TCalculador2 = class(TCalculador)
   public
      procedure calcular; override;  // aí em baixo você escreve o código desse método para o obojeto Calculador3;
   end;


e durante o algorítimo vc troca de objeto. imagine que num formulário vc dá um click no botão aí tem o código:


var
   c: TCalculador;
begin
   if qtdobjetos<10 then
       c:=TCalculador1.create;
else
   if qtdObjetos>10 then
      c:=TCalculador3.create;
   else
      c:=TCalculador2.create;

c.calcular;

end;
GOSTEI 0
Cícero Santana

Cícero Santana

22/01/2019

Nossa, obrigado, são dicas muito boas.<br />
<br />
Irei utilizar e acredito que irá sim resolver meu problema. A herança dos cálculos juntamente com o override irão me ajudar sim.<br />
<br />
Quando implementar estarei notificando aqui.<br />
<br />
Muito obrigado mais vez a vocês pelas respostas. Um abraço.
GOSTEI 0
POSTAR