AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Bitmap als Zeiger - Ich versteh es nicht !
Thema durchsuchen
Ansicht
Themen-Optionen

Bitmap als Zeiger - Ich versteh es nicht !

Ein Thema von meisteralex · begonnen am 20. Dez 2005 · letzter Beitrag vom 22. Dez 2005
Antwort Antwort
Seite 1 von 2  1 2      
meisteralex

Registriert seit: 22. Nov 2005
173 Beiträge
 
#1

Bitmap als Zeiger - Ich versteh es nicht !

  Alt 20. Dez 2005, 17:36
Delphi-Quellcode:
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;
habe die oben stehende funktion geschreiben und wende sie wie folgt an:

Delphi-Quellcode:
  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);
mein problem ist, dass die funktion bit2 ändert .
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 ???
  Mit Zitat antworten Zitat
Nuclear-Ping
(Gast)

n/a Beiträge
 
#2

Re: Bitmap als Zeiger - Ich versteh es nicht !

  Alt 20. Dez 2005, 17:42
Ö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.
  Mit Zitat antworten Zitat
meisteralex

Registriert seit: 22. Nov 2005
173 Beiträge
 
#3

Re: Bitmap als Zeiger - Ich versteh es nicht !

  Alt 20. Dez 2005, 17:58
hab ich doch gemacht tempbild ist doch meine arbeitsvariable
  Mit Zitat antworten Zitat
Nuclear-Ping
(Gast)

n/a Beiträge
 
#4

Re: Bitmap als Zeiger - Ich versteh es nicht !

  Alt 20. Dez 2005, 18:05
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.
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#5

Re: Bitmap als Zeiger - Ich versteh es nicht !

  Alt 20. Dez 2005, 18:06
Zitat von meisteralex:
hab ich doch gemacht tempbild ist doch meine arbeitsvariable
Das steht so aber nicht im obigen Code.
Delphi-Quellcode:
//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);
Das kann einfach nicht sein. Aber die Routine ist sowieso komplett falsch, solange du nicht wie schon gesagt Result auch instanziierst.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
meisteralex

Registriert seit: 22. Nov 2005
173 Beiträge
 
#6

Re: Bitmap als Zeiger - Ich versteh es nicht !

  Alt 20. Dez 2005, 20:30
hmm, wenn ich jetzt mit result := tbitmpa.create(); result erzeuge, wo muss ich es dann mit result.free wieder freigeben ?
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#7

Re: Bitmap als Zeiger - Ich versteh es nicht !

  Alt 20. Dez 2005, 20:34
Zitat von meisteralex:
hmm, wenn ich jetzt mit result := tbitmpa.create(); result erzeuge, wo muss ich es dann mit result.free wieder freigeben ?
Gar nicht. Da du die Referenz ja nach außen weitergibst, muss sie auch dort und nicht in der Prozedur freigegeben werden. Genau deshalb solltest du eben das Ergebnis in einer Variablen speichern.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
meisteralex

Registriert seit: 22. Nov 2005
173 Beiträge
 
#8

Re: Bitmap als Zeiger - Ich versteh es nicht !

  Alt 20. Dez 2005, 20:52
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 ?
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#9

Re: Bitmap als Zeiger - Ich versteh es nicht !

  Alt 20. Dez 2005, 21:02
BitVariable := bitblt_encode(...);
Wie gesagt, Objektvariablen sind nichts anderes als Zeiger.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
meisteralex

Registriert seit: 22. Nov 2005
173 Beiträge
 
#10

Re: Bitmap als Zeiger - Ich versteh es nicht !

  Alt 21. Dez 2005, 07:48
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 ?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:51 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz