Identificar diferenças entre um parâmetro por valor e por referência

Concluído

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:

Retorno de tipo complexo