Autor Beitrag
Hidden
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: Mi 12.03.08 20:40 
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,

_________________
Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
Hidden Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: 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,

_________________
Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
Agawain
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 460

win xp
D5, MySQL, devxpress
BeitragVerfasst: 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:

_________________
Gruß Aga
Logikmensch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 390

Win XP
Delphi 2007 Prof., XE2, XE5
BeitragVerfasst: 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:

ausblenden 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.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
....
Image.Picture.bitmap.Free; //<- Nicht Destroy!!!
Image.Picture.bitmap:=neuebitmap;
....

_________________
Es gibt keine Probleme - nur Lösungen!
Hidden Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: 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,

_________________
Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
artelogic
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 390

Win XP
Delphi 2007 Prof., XE2, XE5
BeitragVerfasst: 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.

_________________
Es gibt keine Probleme - nur Lösungen!