Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Zusammenhang TPicture und TGraphic (https://www.delphipraxis.net/180419-zusammenhang-tpicture-und-tgraphic.html)

Der schöne Günther 19. Mai 2014 12:29

Delphi-Version: XE5

Zusammenhang TPicture und TGraphic
 
Liste der Anhänge anzeigen (Anzahl: 1)
Damit ich es endlich mal verstehe:

Delphi-Quellcode:
TPicture
kann man als einen "Container" für ein
Delphi-Quellcode:
TGraphic
sehen.
Delphi-Quellcode:
TGraphic
ist eine abstrakte Basisklasse für
Delphi-Quellcode:
TIcon
,
Delphi-Quellcode:
TMetaFile
,
Delphi-Quellcode:
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
Delphi-Quellcode:
.Graphic
-Property setzt
Delphi-Quellcode:
FGraphic
meines
Delphi-Quellcode:
TPicture
auf das
Delphi-Quellcode:
TBitmap
-Objekt und im Destruktor wird es wieder freigegeben.

Sir Rufo 19. Mai 2014 12:33

AW: Zusammenhang TPicture und TGraphic
 
Die Zuweisung
Delphi-Quellcode:
TPicture.Graphic := TBitmap.Create;
veranlasst, dass der Inhalt der Bitmap-Instanz in die Graphic-Instanz kopiert (per
Delphi-Quellcode:
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.

DeddyH 19. Mai 2014 12:34

AW: Zusammenhang TPicture und TGraphic
 
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.

Der schöne Günther 19. Mai 2014 12:37

AW: Zusammenhang TPicture und TGraphic
 
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... :oops:


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:00 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