Salve a tutti!
Ho creato un mio oggetto per esempio TCane così definito in una Unit separata.
TCane = class(TObject) // Classe di prova
private
FNome:string;
public
Constructor Create(Nome:String);
destructor Destroy; override;
Property Nome:string read Fnome write Fnome;
end;
constructor TCane.Create(Nome:String);
begin
inherited Create;
FNome:=Nome;
end;
destructor Tcane.Destroy;
begin
inherited Destroy;
end;
Questa classe è banale, ma solo per capire! Ora in una form figlia della applicazione uso il mio oggetto:
Se verifico cane se è assegnato mi dice ovviamente che cane=nil
Se faccio questa operazione:
cane:=TCane.Create('Pippo');
Vado a verificare di nuovo e mi dice ovviamente che cane e diverso da nli (è stato assegnato).
Se poi faccio:
E verifico di nuovo mi dice ancora che cane<>nil! Perchè? Non ho liberato memoria?
Se poi faccio nuovamente:
Il programma mi da errore, mentre se lo faccio prima del Create non ci sono problemi! Perche questo comportamento, come viene gestita la memoria?
Se io distruggo la form (form figlie) dove viene usata l'istanza di TCane, la memoria allocata viene liberata al momento della chiusura della form figlia? Oppure solo al momento della chisura della applicazione?
Un salutone a tutti e buon fresco :'(
... che punta a fuffa in memoria.
Che vuoi dire?
Poi vorrei capire un'altra cosa!
Se io ho una form che non viene autocreata da lazarus, ma la gestisco io a runtime con un codice tipo:
try
Form2:=TForm2.Create(self); // creo la form
form2.ShowModal; // mostra la form
finally
Form2.Free;
end;
Se dento questa form c'è un oggetto che ho istanziato e usato, dopo la chiamata a Form2.Free questo oggetto è ancora disponibile nella Form1?
Ora un'altro chiarimento quando si usa :=!
Se ad esempio in una form uso una sintassi di questo tipo:
Type
Primo,Secondo:TMyObject
E poi nel codice uso
Da quello che intuisco viene effettuato un reindirizzamento della memoria di secondo su primo!
E quindi posso utilizzare Primo al posto di secondo conservando tutti i metodi e le variabili interne a Secondo
Se è così posso poi fare
E' lecito? Oppure se faccio
Elimino sia primo che secondo?
Grazie per i chiarimenti!
Andrea