![]() |
Bitmap als Zeiger - Ich versteh es nicht !
Delphi-Quellcode:
habe die oben stehende funktion geschreiben und wende sie wie folgt an:
function bitblt_encode(bild1, bild2:tbitmap):tbitmap;
var tempbild1,tempbild2:tbitmap; begin tempbild1 := tbitmap.create; tempbild2 := tbitmap.Create; tempbild1.Assign(bild1); tempbild2.Assign(bild2); //hier wird image 1 geändern wenn ide orginalrefferenze übergeben wird !!! bitblt(result.Canvas.Handle ,0,0,tempbild1.Width,tempbild1.Height,tempbild1.Canvas.Handle,0,0,srccopy); bitblt(result.Canvas.Handle ,0,0,tempbild2.Width,tempbild2.Height,tempbild2.Canvas.Handle,0,0,srcinvert); tempbild1.free; tempbild2.Free; end;
Delphi-Quellcode:
mein problem ist, dass die funktion bit2 ändert .
bit1 := tbitmap.Create;
bit2:= tbitmap.Create ; bit1.LoadFromFile('C:\bild1.bmp'); bit2.LoadFromFile('c:\bild2.bmp'); diffimage := tbitmap.Create; diffimage2 := tbitmap.Create; image1.Picture.Bitmap.Assign(bit1); image2.Picture.Bitmap.Assign(bit2); diffimage.Assign(bitblt_encode(bit1,bit2)); image1.Picture.Bitmap.Assign(bit1); image2.Picture.Bitmap.Assign(bit2); Ok, das mit den Zeiger versteh ich ja, dass ich der Funktion einen Zeiger auf das BitmapObjekt übergeben, deshalb weiße ich in der Funktion ja dem tempbild2 mit tempbild2.assign(bit2) den inhalt zu und arbeite damit weiter. warum ändert sich also trotzdem bit2 nach dem durchlauf der funktion ??? kann mir jemand erklären wie ich die funkton schreiben müsste, damit sie in keinster weise die ihr übergebenen objekte verändert ??? |
Re: Bitmap als Zeiger - Ich versteh es nicht !
Öhm, keine Ahnung, aber mal was anderes als Allgemeintip: Du solltest in der Funktion erstmal Result als Instanz von TBitmap erzeugen.
Weiterhin ist es nicht empfehlenswert, Funktionen, die eine Instanz zurückliefern, direkt zu übergeben, sondern diese erst einmal in einer Arbeitsvariablen zwischenzuspeichern, damit man diese nach Benutzung wieder freigeben kann. Das ist insofern sinnvoll, als das anderweitig ein Leak entsteht. |
Re: Bitmap als Zeiger - Ich versteh es nicht !
hab ich doch gemacht tempbild ist doch meine arbeitsvariable
|
Re: Bitmap als Zeiger - Ich versteh es nicht !
Und warum arbeitest du dann mit Result.Canvas.Handle in BitBlt? Es existiert doch garkeine Instanz von Result. Wundert mich auch, dass du keine AV kriegst.
|
Re: Bitmap als Zeiger - Ich versteh es nicht !
Zitat:
Delphi-Quellcode:
Das kann einfach nicht sein. Aber die Routine ist sowieso komplett falsch, solange du nicht wie schon gesagt Result auch instanziierst.
//hier wird image 1 geändern wenn ide orginalrefferenze übergeben wird !!!
bitblt(result.Canvas.Handle ,0,0,tempbild1.Width,tempbild1.Height,tempbild1.Canvas.Handle,0,0,srccopy); |
Re: Bitmap als Zeiger - Ich versteh es nicht !
hmm, wenn ich jetzt mit result := tbitmpa.create(); result erzeuge, wo muss ich es dann mit result.free wieder freigeben ?
|
Re: Bitmap als Zeiger - Ich versteh es nicht !
Zitat:
|
Re: Bitmap als Zeiger - Ich versteh es nicht !
wie denn ?
wenn ich mit variable.assign(funktion()); arbeite, kopiere ich ja quasi nur das result , oder ? wie weise ich denn variable die adresse von result zu ? |
Re: Bitmap als Zeiger - Ich versteh es nicht !
Delphi-Quellcode:
:wink:
BitVariable := bitblt_encode(...);
Wie gesagt, Objektvariablen sind nichts anderes als Zeiger. |
Re: Bitmap als Zeiger - Ich versteh es nicht !
hmm dann müsste ich meinem zeiger BitVariable ja eigentlich gar keine
neue instanz mit bitbariable := tbitmap.create; zuweisen oder ? weil er soll ja eigentlich nur ne adresse aufnehmend! wenn ich jetzt mit bitvariable:= bitblt_encode(...); dem zeiger bitvariable die adresse des results von bitblt_encode zuweise, wie ist es dann, wenn ich die funktion bitblt_encode wieder gebrauche ?? Die Rückgabewerte bei verschiedenen Aufrufen sollten doch dann getrennte Instanzen sein oder ? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:49 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz