Non esiste un "valore dell'oggetto", a meno che non si tratti di un value type (ad esempio, interi, booleani, tipi enumerativi, oppure record).Originariamente inviato da Whitecrowsrain
non capisco perché si ottiene il riferimento all'oggetto e non il valore dell'oggetto, io non gli passo un puntatore, ma faccio una assegnazione.
Quando si parla di oggetto, qualsiasi assegnazione tra variabili che hanno la sua classe come tipo è l'assegnazione di un riferimento all'oggetto.
Ogni volta che chiami Create, crei un'istanza della classe, vale a dire un oggetto, e ne memorizzi tramite l'assegnazione un riferimento alla variabile che appartiene al tipo della classe.Originariamente inviato da Whitecrowsrain
Di conseguenza mi aspettavo che a formato1 venisse copiato il valore dell'oggetto risultato della funzione e non che invece venisse assegnato il riferimento all'oggetto stesso.
E' ovvio che in quest'ottica diventa superfluo creare gli oggetti formato1 e formato2..
Ogni volta che assegni tale variabile a un array, lo passi a una lista, lo passi a un'altra variabile e così via, tu stai sempre e solo copiando un riferimento allo stesso oggetto.
Non solo è superfluo creare l'instanza di TFormato come hai fatto, ma è anche sbagliato poiché causa un "memory leak": il riferimento all'oggetto che hai creato viene sostituito subito dopo con il riferimento al formato presente nella lista, pertanto il riferimento al primo oggetto viene perduto, rendendo impossibile accedervi nuovamente e, allo stesso modo, lasciandolo in memoria senza che venga distrutto.
Se ipotizzi di avere un timer che esegue quell'evento ripetutamente, la memoria occupa dall'applicazione aumenterà progressivamente, senza possibilità di recuperarla (fino a quando l'applicazione non verrà chiusa, ovviamente).
Sì. Non so bene perché ti serva creare oggetti in cui memorizzi dati che hai a tranquillamente a disposizione (invece di utilizzare direttamente tali oggetti, senza copiarne i valori), però quanto hai scritto rispecchia maggiormente le intenzioni di cui parlavi.Per ottenere il risultato da me sperato dovevo fare una cosa del genere:
[...]
ed avrei raggiunto il risultato sperato, giusto?
Suggerisco un corso accelerato di programmazione a oggetti, perché ciò con cui ti stai scontrando può essere considerato l'ABC di questo paradigma e una formazione essenziale per poter utilizzare Delphi correttamente.![]()
Ciao!![]()

Rispondi quotando
