Validando Forms com FastScript
O FastScript é um mecanismo de script multi-plataforma e multi-linguagem. Ele é útil para adicionar a capacidade de scripting a projetos. Apesar de ser um produto independente, ele também vem como um bônus do FastReport, mas não tenho visto ele ser muito explorado fora dos relatórios.
As linguagens suportadas são:
- PascalScript
- C++Script
- JScript
- BasicScript
Não vou entrar nos detalhes dos recursos do FastScript, pois há um manual de 67 páginas com todos os detalhes para download no site do projeto, que pode ser baixado aqui, só quero destacar que ele é muito pequeno, acrescentando ao executável apenas de 80-150Kb, dependendo dos módulos usados.
Criei um pequeno exemplo para mostrar algumas funcionalidades, ele tem um TForm com alguns TEdits, um TDataModule onde concentrei todas as rotinas de interação com o FastScript e um arquivo externo contendo a validação dos Campos.
A lógica que usei para criar este projeto foi:
- Para cada TForm, criei um arquivo chamado Form.fsp contendo as validações do TForm, neste exemplo as validações estão no arquivo FormUser.fsp, onde “fsp = fast script pascal”.
- Para cada TEdit, adicionei um método chamado “Validate + Component.Name“.
Exemplo do script de validação de Email:
function ValidateEditEmail(Name, Value: string): boolean;
begin
Result:= (Value <> '') and (Pos('@', Value) > 0);
if not Result then
ShowMessage(Name + ' inválido.');
end;
Para validar um TEdit, eu verifico se há código relacionado, e se sim, crio uma array com os parâmetros e chamo o método do script:
function TDataModuleValidation.ValidateControl(Control: TEdit):
boolean;
var
MethodName: string;
Params: Variant;
begin
Result:= True;
if CheckValidateMethod(Control, MethodName) then
begin
Params:= VarArrayOf([Control.Name, Control.Text]);
Result:= fsScript1.CallFunction(MethodName, Params);
end;
end;
function TDataModuleValidation.CheckValidateMethod(Control: TEdit;
var MethodName: string): boolean;
const
Prefix = 'Validate';
begin
MethodName:= Prefix + Control.Name;
Result:= Pos(' ' + MethodName, fsScript1.Lines.Text) > 0;
end;
Apesar de ser um exemplo simples, mostra alguns dos recursos do FastScript e o quanto o programador pode se beneficiar adicionando a capacidade de scripting ao projeto.
Clique aqui para fazer download do projeto completo.

6 Comments
Com esse artigo você demonstrou mais uma das 1001 utilidades que uma linguagem de script pode ter dentro de um projeto. A flexibilidade que ela traz é uma mão na roda para aquela parte do sistema que é muito mutável.
Como exemplo tenho uma folha de pagamento em que todas as fórmulas são escritas em PascalScript, permitindo que se resolva as situações mais exdrúxulas sem recompilar o exe.
É muito interessante comprovar que, depois de tantos anos, ainda existem muito recursos pouco explorados ou sumariamente ignorados no mundo Delphi.
Abraços e parabéns pelo blog.
Gilberto,
Obrigado por acompanhar o blog.
A motivação por este artigo básico, foi exatamente esta, esta semana conversando sobre Script com amigos que usam o FastReport, alguns não sabiam que o FastScript vem junto e outros não sabiam que poderia ser utilizado fora dos relatórios.
Sua solução para folha de pagamento parece bem interessante, você poderia compartilhar um pequeno exemplo para agregar algo a este assunto, mais exemplos sempre são bem vindos.
Abraço.
César,
invejo as pessoas que, como você, têm a disciplina necessária para transformar algum conhecimento num artigo didático. Inflizmente não compartilho desse dom, embora sei que tenho algumas experiências que mereciam ser disponibilizadas.
Em relação à folha de pagamento não consigo imaginar como extrair um código clean, didático e funcional sem acabar levando toda a rotina pois essa inchou muito em consequência de código legado e hacks para performance.
A grosso modo o usuário cria a verba e define uma expressão de cálculo para a mesma. Depois disso gero uma função com o mesmo nome da verba retornando a expressão do usuário. Ex:
verba = salario_base
expressão = 220 * valor_hora
função gerada
function salario_base: float;
begin
result := 220 * valor_hora;
end
Como a verba resulta numa função isso permite que ela seja usada na expressão do cálculo de outra verba, e assim por diante. Ex:
verba = contribuicao_sindical
expressão = salario_base * 0.05
No final a folha se torna um grande script com uma função definida para cada verba. Se preciso do valor de alguma delas basta fazer a chamada como no seu exemplo:
fsScript1.CallFunction(NomeDaVerba)
Obviamente a coisa é bem mais complexa que isso mas acho que dá pra ter uma noção da idéia central.
Aproveitando o assunto, embora o fastscript seja bem poderoso ele ainda exige muito trabalho manual na hora de expor métodos e propriedades. Já fiz testes com o python4delphi e nele basta registrar a classe no engine e automaticamente todas as propriedades published e todos os métodos published ou public estarão disponíveis no script.
Se alguém desejar se aprofundar em algum assunto comentado, pode entar em contato comigo.
Grande abraço
Gilberto,
Consegui entender sim, e com certeza seus comentários agregam mais para o quem esta começando a utilizar os scripts.
Minha ideia inicial de artigo nesta área era listar os “scripts engines” existente, há muitos, inclusive em outras linguagens como você comentou, em breve vou publicar, mas este vai se limitar em listar outros scripts engines e seus pontos fortes.
Abraço,
Cesar seu exemplo foi ótimo e me abriu a mente, estou criando um modulo no software que desenvolvo, e preciso usar script para dar liberdade ao usuário montar formularios com formulas
Exemplo:
edit1
edit2
edit3
edit4
Sendo que o edit3 deve receber a soma de edit1 + edit2
e o edit4 receberia o data atual
Como eu poderia fazer isso adaptando o exemplo que vc criou.
Desde agradeço a boa vontade.
Maravilhoso rpz, já estava desistindo de procurar. Parabéns Obrigado!