Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - TImage.Picture.Bitmap bei Neuzuweisung vorher freigeben?


Hidden - Mi 12.03.08 20:40
Titel: TImage.Picture.Bitmap bei Neuzuweisung vorher freigeben?
Hi ich bins nochmal :? ,

Ich habe die o.ä. einfache Frage, weiß aber beim besten Willen nicht, welches Suchwort ich benutzen soll. Die VCL-Komponenten werden ja automatisch freigegeben; wenn ich aber das Bitmap eines TImage auf z.B. den Rückgabewert einer Funktion(konkret: bitmapDrehen) setzen will, muss ich dann das Ursprüngliche Bitmap erst mit Image1.Picture.Bitmap.Destroy freigeben, bevor ich es auf Image1.Picture.Bitmap := myFunction setzen kann?

mfG,


Hidden - Do 13.03.08 18:12

Hi,

Ich habe noch einmal in der Delphi-Implementation nachgesehen und gesehen, dass .bitmap das Picture nur in Bitmap umwandelt. Insofern würde Image1.Picture.Destroy/free (k.A.) ausreichen.
Die grundliegende Fragestellung besteht aber immernoch: ich würde sagen zwischendurch erst freigeben, dann zuweisen, oder?

mfG,


Agawain - Do 13.03.08 21:11

Ne

das wäre nicht gut.
Mit create reservierst Du Speicher.
Mit Destroy wird er wieder freigegeben, soweit so gut.
Aber für die Zuweisung brauchste ja wieder Speicher, müßtest also erneut createn und das passiert mit größter Wagescheihnlichkeit nicht an der Stelle, wo Dein Objekt vorher war.

Mach das ein paar mal und Dein Speicher ist löchrig wie ein Schweizer Käse.
Ein Bekannter hat das mal gemacht, das Prog hat in regelmäßigen Abständen ein webcam-Bild geholt und dann hat er sich gewundert, warum sein Prog nach einem Tag aufgrund fehlender Ressourcen den Rechner abstürzen ließ. :tongue:


Logikmensch - Fr 14.03.08 07:03

Zitat:
Die VCL-Komponenten werden ja automatisch freigegeben; wenn ich aber das Bitmap eines TImage auf z.B. den Rückgabewert einer Funktion(konkret: bitmapDrehen) setzen will, muss ich dann das Ursprüngliche Bitmap erst mit Image1.Picture.Bitmap.Destroy freigeben, bevor ich es auf Image1.Picture.Bitmap := myFunction setzen kann?


Also zunächst einmal: Wir Destroy-en nicht, wir Free-en.
Davon mal abgesehen kannst Du über Image.Picture.Assign(neuebitmap) bzw. Image.Picture.Bitmap.Assign(neuebitmap) den Bild-Inhalt einer Bitmap dem Image zuweisen, ohne dass Du da irgendwas zuweisen musst. Assign kopiert die Bitmap-Daten direkt, kümmert sich also selber um das Freigeben des bestehenden und hinzufügen des neuen Bildes.

Wenn Du aber über eine Funktion eine Bitmap zurücklieferst, und innerhalb der Funktion die Bitmap Createst, dann musst Du diese nach ihrer Verwendung (z.B. wie oben erwähnt nach dem Assign) mit Free wieder freigeben. Also z.B. so:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
function erzeugebitmap:TBitmap;
begin
  result:=TBitmap.Create;
  with result do begin
    width:=100;
    height:=100;
    with Canvas do begin
      brush.color:=clYellow;
      brush.style:=bsSolid;
      fillrect(rect(0,0,100,100));
    end;
  end;
end;

//Hauptroutine

....
neuebitmap:=erzeugebitmap; //<- Ab hier liegt eine neue Bitmap im Speicher
image.picture.assign(neuebitmap); //<- Kopieren der Bitmap in das Image
neuebitmap.Free; //<- Freigeben der nicht mehr benötigten Bitmap
....


Sowas wie das hier sollte man nicht machen - Du greifst da zu tief in das Geschehen der Image-Kompo ein. Ich weiß gar nicht, ob das überhaupt geht. Wenn es geht, dann müsste neuebitmap anschließend aber NICHT mehr freigegeben werden, weil das Image es ja weiter verwendet.

Delphi-Quelltext
1:
2:
3:
4:
....
Image.Picture.bitmap.Free; //<- Nicht Destroy!!!
Image.Picture.bitmap:=neuebitmap;
....


Hidden - Fr 14.03.08 17:40

Okay, danke.

Edit: [OT] Ganz kurz: was ist der Unterschied zwischen free und destroy? Gut, was free macht ist klar... gibt den Speicher frei. aber was macht destroy mehr? [/OT]

mfG,


artelogic - Fr 14.03.08 20:08

Free ruft im wesentlich nur Destroy auf. Guckt aber vorher noch, ob Self nicht auf Nil steht. Deswegen Free´ste am besten (von Ausnahmen abgesehen) mit FreeAndNil(DeinObject);

Insofern macht Destroy nicht mehr sondern weniger. Free macht mehr! ;)


Logikmensch - Sa 15.03.08 19:18

Also, warum Free und nicht Destroy...

Nun, Borland empfiehlt dies schon seit den Anfängen von Delphi. Es gehört eben zum guten Programmierstil.