Hallo,
Zitat von
Martin K:
Hmm...
Und was ist in der Praxis besser ?
das kommt immer darauf an. Beide Befehle machen im Grunde das Selbe. Der einzige Unterschied ist, dass die Objektvariable bei FreeAndNil auf nil gesetzt wird, während sie bei .Free weiterhin auf den (nun nicht mehr benutzten) Speicher zeigt. Wenn Du also über eine Objektreferenz entscheiden willst, ob sich dahinter auch wirklich ein gültiges Objekt verbirgt, ist FreeAndNil die richtige Wahl.
Hier mal ein Beispiel:
Delphi-Quellcode:
Bitmap := TBitmap.Create;
Bitmap.Free;
if Assigned(Bitmap) then // Assigned sagt True, weil Bitmap <> nil
Bitmap.Width := 10; // Hier kracht's
Delphi-Quellcode:
Bitmap := TBitmap.Create;
FreeAndNil(Bitmap);
if Assigned(Bitmap) then // Assigned sagt False, weil Bitmap = nil
Bitmap.Width := 10; // Wird nie ausgeführt
Aber jetzt mal zurück zum Thema:
TBitmap.FreeImage macht genau das, was auch in der Hilfe steht: Es gibt Speicher frei, was sich auf das Bitmap auswirken
kann. Ein solcher Aufruf löscht nicht das Bitmap.
Wenn ich ein Bitmap löschen möchte, gehe ich immer so vor:
Delphi-Quellcode:
OldHeight := Bitmap.Height;
Bitmap.Height := 0;
Bitmap.Height := OldHeight;
Damit sage ich dem TBitmap, dass es bitte ein neues Bitmap (Windows-Objekt, nicht Delphi-Objekt) anlegen soll. Leider gibt es keine fertige Funktion, die sowas macht.
Gruß
xaromz