AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Zusammenhang TPicture und TGraphic

Ein Thema von Der schöne Günther · begonnen am 19. Mai 2014 · letzter Beitrag vom 19. Mai 2014
Antwort Antwort
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

Zusammenhang TPicture und TGraphic

  Alt 19. Mai 2014, 13:29
Delphi-Version: XE5
Damit ich es endlich mal verstehe:

TPicture kann man als einen "Container" für ein TGraphic sehen. TGraphic ist eine abstrakte Basisklasse für TIcon , TMetaFile , TBitmap und viele weitere...

Alles richtig soweit?

Warum ergibt folgendes ein Speicherleck?

Delphi-Quellcode:
procedure TForm2.FormCreate(Sender: TObject);
var
   myPic: TPicture;
begin
   ReportMemoryLeaksOnShutdown := True;
   myPic := TPicture.Create();
   myPic.Graphic := TBitmap.Create();
   myPic.Free();
end;
Ich verstehe das nicht- Die .Graphic -Property setzt FGraphic meines TPicture auf das TBitmap -Objekt und im Destruktor wird es wieder freigegeben.
Miniaturansicht angehängter Grafiken
unexpected_memory_leak_2014-05-19_13-23-33.png  
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Zusammenhang TPicture und TGraphic

  Alt 19. Mai 2014, 13:33
Die Zuweisung TPicture.Graphic := TBitmap.Create; veranlasst, dass der Inhalt der Bitmap-Instanz in die Graphic-Instanz kopiert (per Assign ) wird.

Die Bitmap-Instanz wird also nicht übernommen, von dir nicht freigegeben und dümpelt so bis zum Ende im Speicher rum -> Leck

(Ein Blick in den Setter-QuellCode hätte dir das auch verraten )

EDIT: Gerade gesehen, selbst die Dokumentation ist da eindeutig Delphi-Referenz durchsuchenTPicture.Graphic
Zitat:
Anmerkung: Wenn die Eigenschaft Graphic zugewiesen wird, weist TPicture die Eigenschaften eines anderen TGraphic-Objekts zu. TPicture wird nicht der Eigentümer des angegebenen Objekts.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (19. Mai 2014 um 13:37 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#3

AW: Zusammenhang TPicture und TGraphic

  Alt 19. Mai 2014, 13:34
Wenn man TPicture.Graphic einen Wert zuweist, wird intern (im Setter) eine neue Instanz erzeugt und deren Werte mit Assign aus dem Original kopiert. Somit sind beide Instanzen völlig unabhängig voneinander. Das bedeutet aber auch, dass Du für die Freigabe Deiner Bitmap selbst zu sorgen hast.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Zusammenhang TPicture und TGraphic

  Alt 19. Mai 2014, 13:37
Hoppla, stimmt.

Delphi-Quellcode:
procedure TPicture.SetGraphic(Value: TGraphic);
var
  NewGraphic: TGraphic;
begin
  NewGraphic := nil;
  if Value <> nil then
  begin
    NewGraphic := TGraphicClass(Value.ClassType).Create;
    NewGraphic.Assign(Value);
    NewGraphic.OnChange := Changed;
    NewGraphic.OnProgress := Progress;
  end;
  try
    FGraphic.Free;
    FGraphic := NewGraphic;
    Changed(Self);
  except
    NewGraphic.Free;
    raise;
  end;
end;
NewGraphic sagt eigentlich schon alles...
  Mit Zitat antworten Zitat
Antwort Antwort

 

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 14:09 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