Componentes
Implementando fórmulas na aplicação
Agregando valor ao seu sistema através da personalização de cálculos internos
Customização é uma das palavras da vez e a cada dia mais o mercado exige que os produtos além de ter qualidade, sejam flexíveis, personalizados e tenham preços competitivos. Agora, como fazer para oferecer um sistema de qualidade, com preço competitivo e que sirva para diversos clientes com regras de negócios diferentes?
A resposta é: parametrização. Uma das maneiras de parametrizar o sistema é possibilitar que os cálculos sejam definidos através de fórmulas criadas pelos próprios clientes. E para demonstrar como utilizar fórmulas dentro de um sistema, neste artigo criaremos uma aplicação simples de compra e venda onde os cálculos do valor total do movimento e do item serão obtidos através do resultado da fórmula parametrizada.
Será usado o Evaluator da biblioteca de componentes JEDI, que é um avaliador de expressões para realizar o cálculo das fórmulas do programa, ou seja, ela decodifica e substitui expressões por seus respectivos valores numéricos.
Além disso, teremos uma tela para cadastro da fórmula digitada herdada de um formulário básico de cadastro, demonstrando assim também como utilizar herança de formulários dentro do Delphi.
Obs.: O objetivo deste artigo é demonstrar como tornar uma aplicação flexível e personalizável, não se atendo a princípios básicos, como criar um banco de dados, fazer conexão com banco, criar formulários na aplicação ou relacionamentos Master/Detail.
A classe TEvaluator
A classe TEvaluator é definida na unit JclExprEval da biblioteca JEDI e é uma classe avaliadora de expressões. Ela, assim como as outras classes de avaliadores de expressão da JCL, é descendente da classe TEasyEvaluator, também definida na mesma unit. A declaração das duas classes está descrita na Listagem 1.
Listagem 1. Declaração das classes TEasyEvaluator e TEvaluator
...
TEasyEvaluator = class(TObject)
private
FOwnContext: TExprHashContext;
FExtContextSet: TExprSetContext;
FInternalContextSet: TExprSetContext;
protected
property InternalContextSet: TExprSetContext
read FInternalContextSet;
public
constructor Create;
destructor Destroy; override;
procedure AddVar(const AName: string;
var AVar: TFloat32); overload;
procedure AddVar(const AName: string;
var AVar: TFloat64); overload;
procedure AddVar(const AName: string;
var AVar: TFloat80); overload;
procedure AddConst(const AName: string;
AConst: TFloat32); overload;
procedure AddConst(const AName: string;
AConst: TFloat64); overload;
procedure AddConst(const AName: string;
AConst: TFloat80); overload;
procedure AddFunc(const AName: string;
AFunc: TFloat32Func); overload;
procedure AddFunc(const AName: string;
AFunc: TFloat64Func); overload;
procedure AddFunc(const AName: string;
AFunc: TFloat80Func); overload;"
[...] continue lendo...