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;
.... neuebitmap:=erzeugebitmap; image.picture.assign(neuebitmap); neuebitmap.Free; .... |
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; 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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!