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
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.765 Beiträge
 
Delphi 11 Alexandria
 
#1

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

  Alt 17. Apr 2018, 14:04
Ich habe die ganz dufte CopyFromBitmap Methode entdeckt. Damit hat sich der Spuk für mich erledigt. Ich setze die Größe meines Ziels auf die Größe der Quelle und dann führe ich TBitmap.CopyFromBitmap(Source) aus und fertig. Kein Speicherleck mehr.

Wenn ich dann mal Zeit habe, schaue ich mir vielleicht an, was beim Assign falsch laufen könnte, aber jetzt bin ich glücklich. Danke Himitsu, es hilft häufig einfach nur über ein Problem zu reden.

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
 
#2

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

  Alt 17. Apr 2018, 14:58
Ein Speicherleck oder Bug ist mir an der Stelle nicht bekannt und es funktioniert so wie es soll.

Weder hier
Delphi-Quellcode:
var
  bmp: TBitmap;
begin
  bmp := TBitmap.CreateFromFile('picture.png');
  try
    Image1.Bitmap := bmp;
  finally
    bmp.Free();
  end;
end;
noch da
Delphi-Quellcode:
var
  bmp: TBitmap;
begin
  bmp := TBitmap.CreateFromFile('picture.png');
  try
    Image1.Bitmap.Assign(bmp);
  finally
    bmp.Free();
  end;
end;
passiert etwas Merkwürdiges.

Interessant wäre zu sehen, was du in deinem Code konkret veranstaltest ...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.202 Beiträge
 
Delphi 12 Athens
 
#3

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

  Alt 17. Apr 2018, 15:08
Image1.Bitmap := bmp; und Image1.Bitmap.Assign(bmp); ist das Selbe, siehe dem Setter von .Bitmap

[edit] OK, bei Startet nicht, aber glaub mir einfach, dass der Setter intern das Assign aufruft.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Der schöne Günther

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

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.765 Beiträge
 
Delphi 11 Alexandria
 
#5

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
 
#6

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.765 Beiträge
 
Delphi 11 Alexandria
 
#7

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
 
#8

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