Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Richtiger Umgang mit mehreren gleichen TPictures (https://www.delphipraxis.net/160859-richtiger-umgang-mit-mehreren-gleichen-tpictures.html)

Rob09 4. Jun 2011 15:55

Delphi-Version: 6

Richtiger Umgang mit mehreren gleichen TPictures
 
Hi!

Ich möchte mal um eure Hilfe bitten bei folgendem Szenario:

Ich habe mehrere TImages, die alle dasselbe Bild anzeigen sollen.

1. Wenn ich nun einfach "Image[i].Picture.Assign(Quellpicture)" benutze, wird vermutlich für jedes meiner Images das Quellpicture im Speicher kopiert, d.h. ich belege unnötig viel Speicher, oder?

2. Ist es die bessere Lösung, es per "Image[i].Picture := Quellpicture" zu realisieren? (Bisher dachte ich, das würde Speicherlecks erzeugen, aber sowohl FastMM als auch http://www.delphipraxis.net/148401-b...-loeschen.html widersprechen dem)

3. Wo liegt dann überhaupt der Unterschied von "TImage.Picture := ..." gegenüber "TImage.Picture.Assign(...)"?

Beste Grüße!
Robert

EDIT:
Klarer formuliert ;-)

sx2008 4. Jun 2011 17:39

AW: Richtiger Umgang mit mehreren gleichen TPictures
 
Zitat:

Zitat von Rob09 (Beitrag 1104590)
3. Wo liegt dann überhaupt der Unterschied von "TImage.Picture := ..." gegenüber "TImage.Picture.Assign(...)"?

Da gibt es keinen Unterschied; intern wird auch bei der direkten Zuweisung Assign() aufgerufen.
Jedes TImage trägt sein eigenes, unabhängiges TPicture in sich.
Wenn du den Resourcenverbrauch nicht möchtest, müsstest du auf mehrere TPaintboxen ausweichen.

himitsu 4. Jun 2011 17:50

AW: Richtiger Umgang mit mehreren gleichen TPictures
 
Bei Fall von TPicture gibt es keinen Unterschied, da dort
Delphi-Quellcode:
.Picture := ...;
auf
Delphi-Quellcode:
.Picture.Assign(...);
umleitet wird,
aber bei anderen Klassen sollte man aufpassen, da es doch einen Unterschied geben kann.

Rob09 4. Jun 2011 18:17

AW: Richtiger Umgang mit mehreren gleichen TPictures
 
Okay, vielen Dank schonmal für die Klarstellung und den Tip mit den TPaintboxes. Leider funktioniert das noch nicht so, wie ich mir das vorstelle. Ich mache es folgendermaßen:

Delphi-Quellcode:
{diese Prozedur wird vor Form1.Show aufgerufen}
var
  APicture: TPicture;
begin

  {FPaintbox ist private Variable vom Typ TPaintbox innerhalb TForm1}
  FPaintbox := TPaintbox.Create(Self);
  FPaintbox.Parent := Self;
  FPaintbox.Height := ...;
  FPaintbox.Width := ...;
  FPaintbox.Top := ...;
  FPaintbox.Left := ...;

  APicture := TPicture.Create;
  APicture.LoadFromFile(<Datei>.jpg);
  FPaintbox.Canvas.Draw(0, 0, APicture.Graphic);

  FreeAndNil(ATPicture);
end;
Das Problem ist, dass die Grafik trotzdem nirgends zu sehen ist... Die Delphi-Hilfe hilft mir leider auch nicht weiter. Was mache ich denn da falsch?

Rob09 4. Jun 2011 18:56

AW: Richtiger Umgang mit mehreren gleichen TPictures
 
Okay, hat sich erledigt - Delphi-Hilfe hat doch geholfen ;-)

Einfach das .Canvas.Draw(...) ins OnPaint-Event der Paintbox...

Gruß!
Robert

himitsu 4. Jun 2011 22:09

AW: Richtiger Umgang mit mehreren gleichen TPictures
 
Zitat:

Zitat von Rob09 (Beitrag 1104606)
Einfach das .Canvas.Draw(...) ins OnPaint-Event der Paintbox...

Man braucht es auch nur dort.

Delphi-Quellcode:
APicture := TPicture.Create;
ins OnCreate der Form oder wo auch immer du APicture verwalten willst.
Delphi-Quellcode:
ATPicture.Free;
dementsprechend z.B. ins OnDestroy.
Delphi-Quellcode:
FPaintBox.Canvas.Draw(0, 0, APicture.Graphic);
im OnPaint der PaintBox.
Delphi-Quellcode:
APicture.LoadFromFile('<Datei>.jpg');
könnte man einmal machen im OnCreate machen.
Und dann überall nur noch der Paintbox sagen, wenn sie bzw. ihr internes Picture neue Daten bekommen hat, daß sie sich neu szeichen soll:
Delphi-Quellcode:
APicture.LoadFromFile('<Datei>.jpg');
FPaintBox.Repaint;

FredlFesl 5. Jun 2011 06:48

AW: Richtiger Umgang mit mehreren gleichen TPictures
 
Beschäftigst Du dich mit diesen Fragen eigentlich BEVOR oder NACHDEM Du alle anderen Fehler und Macken in deiner Anwendung beseitigt hast?


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