Ciao a tutti,
mi è appena crollata una delle poche certezze che avevo sul Pascal. Guardate questo codice:
procedure TForm1.Button1Click(Sender: TObject);
var WrkLista:TStringList;
Pippo:Integer;
procedure Prova(Lista1:TStringList; Pippo2:Integer);
begin
Lista1.Add('4');
Lista1.Add('5');
Pippo2:=2;
end;
begin
WrkLista:=TStringList.Create;
try
//Inizializzo le variabili
WrkLista.Add('1');
WrkLista.Add('2');
WrkLista.Add('3');
Pippo:=1;
//Chiamo la procedura passando entrambe le variabili
Prova(WrkLista, Pippo);
ShowMessage(IntToStr(WrkLista.Count) +
LineEnding +
IntToStr(Pippo));
finally
WrkLista.Free;
end;
end;
Il risultato del codice qui sopra è che alla fine WrkLista contiene 5 elementi, ed il valore di Pippo è 1.
La variabile "Pippo" si comporta come mi aspettavo: al ritorno dalla procedura "Prova" ha ancora il suo valore originale.
Quello che non capisco è il comportamento della variabile "WrkLista". Anche lei viene passata alla stessa maniera, e la variabile "Lista1" dichiarata dalla procedura non ha la clausola "Var". Allora perché le modifiche fatte all'interno della procedura "Prova" si ripercuotono anche al suo esterno?
Grazie in anticipo, Mario
Scusami, ma a dire la verità non ho capito ...
A me a scuola, nel millennio scorso :'(, avevano insegnato che, se dichiari una procedura ed i suoi parametri li dichiari senza mettere il "var" davanti, come qui
procedure Prova(Lista1:TStringList; Pippo2:Integer);
tutte le modifiche che fai a quelle variabili all'interno della procedura, quando ne esci vengono perse.
Perché con le TStringList non è la stessa cosa? Da quello che ho capito, se metto o non metto il "var" nella procedura non cambia nulla.
Ciao, Mario
Vediamo se con un esempio mi spiego meglio :D
procedure pippo(var istanza : TStrings)
begin
istanza := TStringList.Create; // <- Creo l'itanza ex novo, ignorando quella precedente
end;
var
istanza : TStrings;
begin
istanza := nil;
pippo(istanza);
istanza.clear;
end;
procedure pippo(istanza : TStrings)
begin
istanza := TStringList.Create; // <- Creo l'itanza ex novo, ignorando quella precedente
end;
var
istanza : TStrings;
begin
istanza := nil;
pippo(istanza);
istanza.clear; // <- NIL = ERRORE!
end;