Newsgroup: it.comp.lang.delphi
Titolo: Puntatori

Salve a tutti, ho un "piccolo" problema con i puntatori:
Ho un tipo dichiarato come segue:
type TItem = record
  FName : string;
  FImage : Pointer;
end;
Ho poi un membro privato di una classe
FFigure : TBitmap;
inizializzato come solito:
FFigure := TBitmap.Create;
FFigure.LoadFromFile('prova.bmp');
Ora, in una procedure scrivo:
procedure XXX.InitAll;
Var myPointer : ^TItem;
begin
  New(myPointer);
  myPointer.FName := 'Non so';
  myPointer.FImage := @FFigure;
  FList.Add(myPointer);  // FList è una TList membro privato della classe
opportunamente inizializzata
  ....
  ....
Ho una function cosi:
Function XXX.PopItem : Pointer;
begin
  if (FList.Count > 0) then
    begin
      result := FList.Items[0];
      Delete(0);  //Questa dovrebbe solo cancellare l'item nella lista ma
non rilasciare la memoria associata, comunque anche non
                          mettendocelo, il risultato non cambia;
    end
  else
    return := nil;
end;
Ora, quando provo a ultilizzarlo, lo faccio in questo modo:
Var myList : TList;
      myA, myB : ^TItem;
begin
  myList := TList.Create;
  XXX.InitAll;
  myA := XXX.PopItem;
  myList.Add(myA);
  myB := FList.Items[0];
  canvas.Draw(0,0,myB.FImage);  //Sulla canvas della Form principale
  ...
  ...
Lasciate stare la dubbia utilià della myList e dei myA e myB che sono usati
solo x debug! (anche se poi il programma dovrà gestire una situazione
simile).
In fase di compilazione, tutto Ok, ma quando eseguo, alla linea della Draw,
mi viene generata un'eccezione.
Non riesco a capire dov'è che sbaglio!!
Vi ringrazio tanto se mi vorreste aiutare!!
Many TNKS!

end;
scusa, perchč non mettere direttamente
type TItem = record
  FName : string;
  FImage : TBitmap;
end;
TBitmap, alla fine, č un puntatore! ;-)
cosě ti incasini meno con puntatori e forse risolvi i problemi (non ho
letto tutto)
Ciao,
Alan Solo

 wrote in message
55csO7W9sRkVDV...@4ax.com...

Si, probabilmente sarebbe la soluzione + rapida, ma devo creare una
quarantina di istanze di TItem, che fanno riferimento a sole due diverse
immagini bitmap...mi sembra un inutile spreco di memoria caricare una bitmap
20 (circa) volte quando lo posso fare una volta x tutte, non credi??

 ha scritto nel messaggio
news:zs5X6.59631$Cq5.5...@news.infostrada.it...

Scusate se mi intrometto, perň io stavo pensando che dichiarandolo come
TBitmap si puň assegmare direttamente il riferimento senza creare
'oggeto( ovviamente facendo attenzione a tutte le problematiche del caso ).
Andrea

'oggeto( ovviamente facendo attenzione a tutte le problematiche del caso ).
non ti seguo... 8)
riferimento a cosa? ..
Ciao,
Alan Solo

20 (circa) volte quando lo posso fare una volta x tutte, non credi??
gli oggetti in delphi *sono* *puntatori*, una variabile di tipo
TBitmap (o TQualcosa) è un puntatore (occupa 4 byte) 
se fai:
var b1, b2 : TBitmap;
b1 := TBitmap.Create; // viene creato in memoria un'istazna di un
oggetto TBitmap
b2 := b1; // l'oggetto bitmap b2 punta allo stesso oggetto di b1, in
pratica b2 e b1 sono la stesso oggetto, la memoria occupata non
raddoppia, l'istanza dell'oggetto è sempre una...
Ciao,
Alan Solo

 wrote in message
dxUtO8nIotGnGL...@4ax.com...

Alle volte l'evidenza è talmente banale che facciamo (faccio) fatica a
coglierla.
Adesso ho capito cosa intendevi e devo darti ragionissima! Ti ringrazio
tantissimo per avermi fatto "svegliare".
Many TNKS!

'oggeto( ovviamente facendo attenzione a tutte le problematiche del caso ).
Effettivamente basta creare 2 soli TBitmap e poi assegnare il
riferimento in ogni record ad uno dei due.
Il problema e' che cosi' e' corretto usarli a sola lettura.
--
Andrea Laforgia - walkietalkie(at)
libero.it
#exclude <windows.h>