AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi FMX: TBitmap.Assign Methode erscheint mir nicht korrekt
Thema durchsuchen
Ansicht
Themen-Optionen

FMX: TBitmap.Assign Methode erscheint mir nicht korrekt

Ein Thema von Sherlock · begonnen am 17. Apr 2018 · letzter Beitrag vom 18. Apr 2018
Antwort Antwort
Der schöne Günther
Online

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

AW: FMX: TBitmap.Assign Methode erscheint mir nicht korrekt

  Alt 17. Apr 2018, 15:09
Vor allem wäre die Plattform interessant (also mit ARC oder ohne).
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.814 Beiträge
 
Delphi 12 Athens
 
#2

AW: FMX: TBitmap.Assign Methode erscheint mir nicht korrekt

  Alt 18. Apr 2018, 07:18
Tja, mein Code reicht durch mehrere Ebenen und in mehrere Listen. Ich war überzeugt, alles wird gut aufgeräumt. Und dadurch, daß ich nicht mehr Assign sondern CopyFromBitmap verwende werden mir auch keine Leaks mehr gemeldet. Eventuell habe ich auch einfach nur den Überblick verloren... Dennoch sehen meine eigenen Assign-Methoden anders aus, als das da. Für mich besteht ein Assign darin, zwei vollständig unabhängige Objekte gleichen Inhalts zu erzeugen...Klonen sozusagen. Und das passiert da IMHO nicht. Und den Inhalt eines Objekts zu setzen, daß in der nächsten Zeile durch ein anderes ersetzt wird, finde ich auch komisch.

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#3

AW: FMX: TBitmap.Assign Methode erscheint mir nicht korrekt

  Alt 18. Apr 2018, 07:37
Du meinst dein Assign sieht ungefähr so aus?
Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.Classes,
  System.SysUtils;

type
  TMyClass = class( TPersistent )
  private
    FData: string;
  public
    procedure Assign( Source: TPersistent ); override;
  public
    property Data: string read FData write FData;
  end;

procedure TMyClass.Assign( Source: TPersistent );
begin
  if ( Source is TMyClass ) then
  begin
    FData := TMyClass( Source ).FData;
  end
  else
    inherited;
end;

var
  a, b: TMyClass;

begin
  try
    a := nil;
    b := nil;
    try
      a := TMyClass.Create();
      b := TMyClass.Create();

      a.Data := 'Foo';
      b.Assign(a);
      WriteLn(b.Data);

    finally
      a.Free;
      b.Free;
    end;
  except
    on E: Exception do
      Writeln( E.ClassName, ': ', E.Message );
  end;
end.
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.814 Beiträge
 
Delphi 12 Athens
 
#4

AW: FMX: TBitmap.Assign Methode erscheint mir nicht korrekt

  Alt 18. Apr 2018, 12:08
Ja, ungefähr. Wenn "komplexe" Classmember vorhanden sind, werden die dann über deren Assign geklont.

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#5

AW: FMX: TBitmap.Assign Methode erscheint mir nicht korrekt

  Alt 18. Apr 2018, 12:38
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 TBitmap mit dem Wert in 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 Assign -Methode von TBitmap ist völlig korrekt, auch wenn diese noch so ungewöhnlich aussieht.
  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 20:31 Uhr.
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