reparar as alteracoes sofridas dentro do metodoCalculaImposto refletiram na variavel Total (Magia negra?), isso ocorre porquequanto declaramos uma variavel isso nada mas e do que uma identificacao"bonitinha" para uma endereco de memoria, logo quando passamos uma variavelpor var (Ponteiro), estamos passando na realidade o mesmo endereco de memoriada variavel original, logo se o endereco e o mesmo,qualquer alteracao de memoria dentro de qualquer procedimento ira alterar ovalor de nossa variavel externa.Repare uma coisa importante, quando utilizamos var, somosobrigados a passar uma variavel declarada, valores passados de forma constantenao sao aceitos neste caso pois estamos lidando com enderecos de memorias,exemplo abaixo.metodo CalculaImposto(varATotal: Currency);chamada (Errada) CalculaImposto(100); // Este tipo de chamada nao e permitidachamada (Correta)var Total:Currency;begin Total:= 100; CalculaImposto(Total);end;Cuidados com o varA diretiva var e uma mao na roda, mas devemos tomar algunscuidados. Apesar dela diminuir o tempo de execucao do codigo pois nao existe ocusto de copia, ela e uma das diretivas mais perigosas de se usar, issoacontece pois como as alteracao sao refletidas externamente, qualquer alteracaoque a variavel sofra mesmo que para otimizar a rotina ou tornar mais legivel ascoisas, podem literalmente destruir o resto da execucao do seu codigo (Meio dificilenxergar um exemplo real?). Vou exemplificar aqui um caso muito comum que acontece,passamos como var uma variavel do tipo lista (TStringList ou TList por exemplo)ou string, e para facilitar a multipla pesquisa de valores dentro da string oulista, ordenamos seus valores de forma crescente, pois bem, se a continuacao desua rotina fora do procedimento nao entender esta ordenacao ou necessitar daposicao original dos valores, o resto da rotina esta comprometida.ConstComo o proprio nome sugere e como ja e utilizado dentro do proprioDelphi, const serve para determinar que a variavel passada por parametro naosofrera alteracoes dentro da rotina, isso parece meio sem logica de inicio, masna realidade e uma otima ferramenta, pois protege voce de si mesmo, e de outrosprogramadores. A diretiva const garante que qualquer que seja o local em que euacesse a variavel do parametro eu tenha certeza que o valor dela nao sofreunenhuma alteracao, a sintaxe de utilizacao do const e assim: procedure CalculaImposto(const AValorTotal: Currency);OutMuito semelhante a var, a unica diferenca da diretiva out, eque o valor inicial passado como parametro e ignorado, mas afinal para que euvou querer isso? A principal funcionalidade do out e a possibilidade de seretornar mais de um valor por funcao, afinal, voce pode passar quantas variaveisquiser utilizando out, alias, o var tambem serve para a mesma coisa, mas quandoutilizamos out ja sinalizamos que a funcao ou procedimento independente do valorpassado naquele parametro nao ira utiliza-lo (Logo podemos passar lixo dememoria, sem se preocupar com a inicializacao de variaveis ou se isso podeafetar nossa rotina), e que na realidade o que importa e o valor de retorno,isso evita confusoes quanto a passagem de parametro, utilize out sempre que fornecessario que uma funcao retorne mais de um valor.A sintaxe de utilizacao do out e essa: procedure CalculaImposto(out AValorTotal: Currency);Como eu falei anteriormente, o valor inicial e descartado,logo mesmo se eu fizer isto:var Total: Currency;begin Total := 200; CalculaImposto(Total);end;Dentro do procedimento calcula imposto o valor