Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi FMX: TBitmap.Assign Methode erscheint mir nicht korrekt (https://www.delphipraxis.net/196034-fmx-tbitmap-assign-methode-erscheint-mir-nicht-korrekt.html)

Sherlock 18. Apr 2018 12:08

AW: FMX: TBitmap.Assign Methode erscheint mir nicht korrekt
 
Ja, ungefähr. Wenn "komplexe" Classmember vorhanden sind, werden die dann über deren Assign geklont.

Sherlock

Schokohase 18. Apr 2018 12:38

AW: FMX: TBitmap.Assign Methode erscheint mir nicht korrekt
 
Ja, dachte ich mir ... darum habe ich extra ein string gewählt, denn dort wird beim Zuweisen nicht der Inhalt kopiert, sondern nur die Referenz (mit Erhöhung des Referenz-Zählers).

Es passiert dort also hinter den Kulissen exakt das Gleiche, was bei
Delphi-Quellcode:
TBitmap
mit dem Wert in
Delphi-Quellcode:
FImage
passiert (nur eben explizit).

Der tiefere Sinn dahinter: Ein und dasselbe Bild braucht nur einmal im Speicher liegen auch wenn man es an n Stellen anzeigen möchte.
Delphi-Quellcode:
var
  bitmaps: TObjectList<TBitmap>;
  b, bmp: TBitmap;
begin
  ...
  // Variante 1 - langsam, viel Spiecher verbraten
  for i := 1 to 100 do
  begin
    bitmaps.Add( TBitmap.CreateFromFile( 'test.png' ) );
  end;

  // Variante 2 - langsamer, viel Speicher verbraten
  bmp := TBitmap.CreateFromFile( 'test.png' );
  try
    for i := 1 to 100 do
    begin
      b := TBitmap.Create();
      b.SetSize( bmp.Size );
      b.CopyFromBitmap( bmp );
      bitmaps.Add( b );
    end;
  finally
    bmp.Free();
  end;

  // Variante 3 - sehr schnell, sehr wenig Speicher
  bmp := TBitmap.CreateFromFile( 'test.png' );
  try
    for i := 1 to 100 do
    begin
      b := TBitmap.Create();
      b.Assign( bmp );
      bitmaps.Add( b );
    end;
  finally
    bmp.Free();
  end;
  ...
end;
Keine dieser Varianten erzeugt allerdings ein Speicherleck und die
Delphi-Quellcode:
Assign
-Methode von
Delphi-Quellcode:
TBitmap
ist völlig korrekt, auch wenn diese noch so ungewöhnlich aussieht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:38 Uhr.
Seite 2 von 2     12   

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