Identificar diferenças entre um parâmetro por valor e por referência
Você pode transmitir esses parâmetros por valor ou referência. Cada método oferece diferentes benefícios.
Transmitir parâmetros por valor
Ao passar um parâmetro por valor, você passa o valor de uma variável para um procedimento. Esse método é sempre o caso padrão com tipos fundamentais.
No próximo exemplo, a função MyFunction obtém um parâmetro do tipo inteiro, altera o valor e retorna o valor de paramA. A instrução Exit retorna o valor.
trigger OnRun()
var
myInteger : Integer;
myResult : Integer;
begin
myInteger := 23;
myResult := MyFunction(myInteger);
Message('myInteger: %1', myInteger); // Displays 23
Message('myResult: %1', myResult); // Displays 17
end;
procedure MyFunction(paramA : Integer) : Integer
begin
paramA := 17;
Exit(paramA);
end;
O valor de myInteger permanece como 23, mesmo após a execução do procedimento MyFunction.
Transmitir parâmetros por referência
Uma variável sempre aloca uma determinada parte da memória do computador. Ao passar um parâmetro por referência, você não passa o valor para um procedimento, mas sim para a referência, que é a posição dele na memória. Usando esse método, você trabalha diretamente na memória. Como resultado, a alteração desse valor também afeta o procedimento de chamada. Para especificar um parâmetro por referência, você precisa adicionar a palavra-chave var na frente de um parâmetro.
trigger OnRun()
var
myInteger : Integer;
myResult : Integer;
begin
myInteger := 23;
myResult := MyFunction(myInteger);
Message('myInteger: %1', myInteger); // Displays 17
Message('myResult: %1', myResult); // Displays 17
end;
procedure MyFunction(var paramA : Integer) : Integer
begin
paramA := 17;
exit(paramA);
end;
Retornar tipos complexos
Agora você pode simplificar o código AL e retornar tipos complexos, em vez de especificá-los nos parâmetros do método.
Como exemplo, o método a seguir usa um nome e retorna o primeiro registro de cliente que corresponde ao nome. Observe como a assinatura especifica o tipo de retorno no final da declaração do procedimento e como o procedimento é encerrado retornando o registro de cliente encontrado.
procedure GetCustomerByName(Name: Text): record Customer;
var
Customer: record Customer;
begin
Customer.SetFilter(Name, '@' + Name + '*');
Customer.FindFirst();
exit(Customer);
end;
Você pode usar esse novo recurso para chamar os membros diretamente na variável retornada, por exemplo, em expressões.
Como exemplo, você pode usar o item acima em uma instrução IF como
if GetCustomerByName('SomeName')."Balance (LCY)" > 0 then.
Há mais exemplos de retorno de tipos complexos disponíveis aqui: