Differenze tra un parametro per valore e per riferimento
È possibile passare i parametri per valore o per riferimento. Ogni metodo offre vantaggi specifici.
Passaggio dei parametri per valore
Quando si passa un parametro per valore, si passa il valore di una variabile a una procedura. Questo metodo viene usato sempre come impostazione predefinita con i tipi fondamentali.
Nell'esempio successivo, la funzione MyFunction ottiene un parametro di tipo Integer, ne modifica il valore e restituisce il valore di paramA. L'istruzione Exit restituisce il valore pertinente.
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;
Il valore di myInteger rimane 23, anche dopo l'esecuzione della procedura MyFunction.
Passaggio dei parametri per riferimento
Una variabile effettua sempre l'allocazione di una certa parte della memoria del computer. Quando si passa un parametro per riferimento, non si passa il valore a una procedura ma piuttosto al riferimento, che è la sua posizione in memoria. Usando questo metodo si lavora direttamente in memoria. Di conseguenza, la modifica di tale valore ha un impatto anche sulla procedura di chiamata. Per passare un parametro per riferimento, è necessario aggiungere la parola chiave var davanti a un parametro.
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;
Come restituire tipi complessi
Ora è possibile semplificare il codice AL e restituire tipi complessi, anziché passarli nei parametri del metodo.
Ad esempio, il metodo seguente prende un nome e restituisce il primo record cliente che corrisponde al nome. Notare come la firma specifica il tipo di reso alla fine della dichiarazione della procedura e come la procedura termina restituendo il record del cliente trovato.
procedure GetCustomerByName(Name: Text): record Customer;
var
Customer: record Customer;
begin
Customer.SetFilter(Name, '@' + Name + '*');
Customer.FindFirst();
exit(Customer);
end;
È possibile usare questa nuova funzionalità per chiamare i membri direttamente sulla variabile restituita, ad esempio nelle espressioni.
Ad esempio, è possibile usare quanto sopra in un'istruzione IF:
if GetCustomerByName('SomeName')."Balance (LCY)" > 0 then.
Altri esempi su come restituire tipi complessi sono disponibili qui: