O comando Formula está disponível desde 4D v17 R3. Até agora, pode ter pensado em atribuir uma fórmula como método a um objecto ou construir objectos inteligentes que possam calcular valores ou fazer tudo o que precisar. Isso é realmente fantástico, e há mais do que se pode imaginar!
Tive uma grande demonstração de Vincent de Lachaux – Desenvolvedor e perito 4D – sobre como ele usa este comando. Para este post no blog, compilei diferentes cenários a partir dessa demonstração para vos dar uma visão sobre uma dimensão diferente deste comando.
Exemplo 1 – Para simplificar um comando existente
Alguns comandos 4D são utilizados centenas de milhares de vezes no código.Passamosfrequentemente os mesmos parâmetros, excepto um.
Tomemos o exemplo simples do comando OBJECT get pointer. Quero inicializar os valores das minhas caixas de verificação, por isso escrevo:
(OBJECT get pointer(Object named; "checkbox"))->:=0
Ou, escrevo uma fórmula que toma o nome do meu objecto como parâmetro:
interface.ponteiro:=Formula(OBJECT Get pointer(Object named;$1))
Quando quero atribuir ou recuperar o valor da minha caixa de verificação, escrevo simplesmente:
(interface.pointer("checkbox"))->:=0
(interface.pointer("checkbox2"))->:=0
Ou, se precisar de definir milhares de caixas de verificação, posso criar uma fórmula para tornar as coisas simples:
interface.setCheckbox:=Formula((OBJECT Get pointer(Object named;$1))->:=$2)
Para definir uma série de caixas de verificação, posso simplesmente escrever:
interface.setCheckbox("checkbox1";0)
interface .setCheckbox("checkbox2";1)
interface .setCheckbox("checkbox3";0)
interface .setCheckbox("checkbox4";1)
Mais fácil de ler – e muito mais fácil de escrever, uma vez que não preciso de contar parênteses…
Exemplo 2 – Com um parâmetro de base de dados
No seu código, defina o mesmo parâmetro de base de dados várias vezes com valores diferentes. Tomemos um exemplo concreto com dicas de controlo de atrasos. Pode querer exibir as dicas sem demora em algumas partes dos seus formulários, e esperar 1s em outras partes. Cada vez que utilizar o parâmetro da base de dados, deve lembrar-se do valor ou procurá-lo noutra peça de código.
Porque não criar uma fórmula?
interface.tipsNoDelay:=Formula(SET DATABASE PARAMETER(Tips delay;1)))
interface .tips1sDelay.Formula:= (SET DATABASE PARAMETER(Tips delay;60)))
Depois, quando se quer alterar o valor, basta chamar a fórmula:
interface.tips1sDelay()
// or
interface .
tipsNoDelay()
Exemplo 3 – Utilizar fórmula como variante
Pode criar uma fórmula que utiliza os valores passados como parâmetros de um método(isto é, $1, $2) mas, no método em que cria a sua fórmula, não precisa de escrever $1 e $2. As variáveis são digitadas quando a fórmula é executada. Pode escrever métodos genéricos ou fórmulas.
Aqui está um exemplo simples que mostra que o tipo é definido na execução.
$obj:=New object("adição";Formula($1+$2))
$number :=$obj.addition(1;2) // devolve 3
$text :=$obj.addition("olá"; "mundo") // devolve olá mundo
Exemplo 4 – Testar uma série de condições
Se fizer uma sequência de condições, tais como If (() & ()), 4D avalia sempre todas as condições. Não pára e continua a avaliar as condições seguintes. Se algumas condições só podem ser avaliadas se a mais esquerda for verdadeira, é forçado a fazer uma lista profunda de se condições, para verificar se o objecto é válido antes de testar o atributo. É assim que funciona:
If (Not(Undefined($o))
If ($o.value. #Null)
If ($o.value<5)
// to do
End if
End if
End if
Neste exemplo, tínhamos “apenas” 3 condições, mas pode facilmente reparar que se torna cada vez mais complexo. E que tal escrever tudo numa única condição? Porque não escrever um método que execute as suas fórmulas uma após a outra? Se o resultado for Verdadeiro, avalia a seguinte fórmula, se o resultado for falso, pára e devolve Falso.
If (_AND (\
Formula (Not(Undefined($o))));\
Formula ($o.value#Null);\
Formula ($o.value<5)\
))
// to do
End if
Para o método _AND, código muito usual e simples:
$0:=True
For ($i;1;Count parameters;1)
$0 :=${$i}.call()
If (Not($0))
$i :=MAXLONG-1 // Stop if the condition fails
End if
End for
Espero que estes exemplos lhe dêem uma visão sobre outras formas de utilizar este comando. Sinta-se à vontade para partilhar as suas fórmulas no fórum 4D… Tenho a certeza de que têm muitas ideias!