AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls TPaintbox löscht Zeichenfläche selbstständig (GDI+)
Thema durchsuchen
Ansicht
Themen-Optionen

TPaintbox löscht Zeichenfläche selbstständig (GDI+)

Ein Thema von SiLo0815 · begonnen am 23. Feb 2017 · letzter Beitrag vom 24. Feb 2017
Antwort Antwort
SiLo0815

Registriert seit: 23. Feb 2017
Ort: Essen, NRW
7 Beiträge
 
Delphi XE5 Enterprise
 
#1

TPaintbox löscht Zeichenfläche selbstständig (GDI+)

  Alt 23. Feb 2017, 23:06
Guten Abend zusammen!

Ich möchte mehrere Bilder als Thumbnails auf meine Programmoberfläche zeichnen. Dazu habe ich eine Scrollbox erstellt, welche ein Flowpanel beinhaltet.
Zu diesem Flowpanel füge ich zur Laufzeit TPaintBox-Objekte hinzu und zeichne mit der GDI+-Bibliothek (http://www.bilsen.com/gdiplus/index.shtml) die Thumbnails auf deren Zeichenflächen.

Meine Thumbnail-Klasse speichert zusätzlich den Dateinamen und sieht so aus:
Delphi-Quellcode:
type
  TThumbnail = class(TPaintBox)
    private
      FFilename: String;
    public
      property Filename: String read FFilename write FFilename;
  end;
Die Thumbnails werden (per Schleife über eine Liste von Dateinamen (f)) so erzeugt:
Delphi-Quellcode:
Image := TGPImage.Create(f);
Thumbnail := Image.GetThumbnailImage(150, 150, nil, nil);

OutputImage := TThumbnail.Create(Self);
OutputImage.AlignWithMargins := true;
OutputImage.Height := 150;
OutputImage.Width := 150;
OutputImage.Filename := f;
OutputImage.Cursor := crHandPoint;
OutputImage.OnClick := ThumbnailClick;
OutputImage.Parent := flwpnlImageView;

Graphics := TGPGraphics.Create(OutputImage.Canvas.Handle);
Graphics.DrawImage(Thumbnail, 0, 0, Thumbnail.Width, Thumbnail.Height);
Nun ist das Problem, dass mir die Bilder zwar kurz angezeigt werden, kurz darauf aber wieder verschwinden.
Ich habe die Vermutung, dass sich die Paintboxen bedingt durch die Scrollbox neu zeichnen und dann wieder leer sind.
Interessanterweise funktioniert das ganze, wenn ich TThumbnail von TImage ableite. Ich würde der Geschwindigkeit wegen aber lieber TPaintbox benutzen.
Hat vielleicht jemand eine Idee, was ich versuchen könnte, um die Bilder dauerhaft zu sehen?

Grüße
Simon

Edit2: Sorry für den halbfertigen Post zu Beginn, ich hab' versucht den Code mit TAB einzurücken und hab Enter gedrückt - zack, schon war's abgeschickt...
Simon

Geändert von SiLo0815 (23. Feb 2017 um 23:19 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

AW: TPaintbox löscht Zeichenfläche selbstständig (GDI+)

  Alt 23. Feb 2017, 23:30
Zeichne auf ein Bitmap im Speicher unf kopiere dies im OnPaint Ereignis auf den Canvas der Psintbox.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
SiLo0815

Registriert seit: 23. Feb 2017
Ort: Essen, NRW
7 Beiträge
 
Delphi XE5 Enterprise
 
#3

AW: TPaintbox löscht Zeichenfläche selbstständig (GDI+)

  Alt 23. Feb 2017, 23:36
Danke für den Tipp, Luckie!
Also liege ich mit meiner Vermutung richtig, dass das (leere) OnPaint-Ereignis der Paintbox aufgerufen und die Zeichenfläche dadurch wieder geleert wird?
Warum funktioniert das ganze dann beim TImage? Schützt TImage seine Zeichenfläche irgendwie vor einem Repaint?
Bitmaps in den Speicher zu legen wäre eine Alternative, ich mache mir nur Gedanken wegen des Speicherverbrauchs.
Simon
  Mit Zitat antworten Zitat
SiLo0815

Registriert seit: 23. Feb 2017
Ort: Essen, NRW
7 Beiträge
 
Delphi XE5 Enterprise
 
#4

AW: TPaintbox löscht Zeichenfläche selbstständig (GDI+)

  Alt 24. Feb 2017, 00:01
Ich habe den Tipp mit dem Bitmap mal umgesetzt:

Delphi-Quellcode:
type
  TThumbnail = class(TPaintbox)
    private
      FFilename: String;
      FPicture: TBitmap;
    protected
      procedure Paint; override;
    public
      property Filename: String read FFilename write FFilename;
      property Picture: TBitmap read FPicture write FPicture;
  end;

procedure TThumbnail.Paint;
begin
  inherited;
  if Assigned(Picture) then begin
    Self.Canvas.Draw(0, 0, Picture);
  end;
end;
Erzeugung:
Delphi-Quellcode:
Image := TGPImage.Create(f);
Thumbnail := Image.GetThumbnailImage(150, 150, nil, nil);
Bitmap := TBitmap.Create;
Bitmap.Height := 150;
Bitmap.Width := 150;
Graphics := TGPGraphics.Create(Bitmap.Canvas.Handle);
Graphics.DrawImage(Thumbnail, 0, 0, Thumbnail.Width, Thumbnail.Height);

OutputImage := TThumbnail.Create(Self);
OutputImage.AlignWithMargins := true;
OutputImage.Height := 150;
OutputImage.Width := 150;
OutputImage.Filename := f;
OutputImage.Cursor := crHandPoint;
OutputImage.OnClick := ThumbnailClick;
OutputImage.Picture := Bitmap;
OutputImage.Parent := flwpnlImageView;
Soweit ich sehen kann, funktioniert es! Ist das jetzt die beste Lösung?
Simon
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.345 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: TPaintbox löscht Zeichenfläche selbstständig (GDI+)

  Alt 24. Feb 2017, 03:37
Das ist die einzige korrekte Lösung. Eine TPaintBox hat keinen eigenen Zwischenspeicher. Kommt also vom Betriebssystem ein WM_PAINT, sprich die Aufforderung das Control neu zu zeichnen, kann die PaintBox alleine dem nicht nachkommen und reicht das daher an das OnPaint weiter.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.908 Beiträge
 
Delphi 12 Athens
 
#6

AW: TPaintbox löscht Zeichenfläche selbstständig (GDI+)

  Alt 24. Feb 2017, 10:24
Die Paintbox ist wohl zum "selberzeichnen" gedacht.
So wie oben würde ich es auch machen, aber du könntest z.B. auch Linien, Rechtecke oder sonstige Objekte auf den Canvas zeichnen.
Du musst dann aber Alles immer im OnPaint neuzeichnen.

Ist die Frage was im Einzelfall weniger Ressourcen/Performance braucht.
In deinem Fall sind die ShadowBitmaps schon OK würde ich sagen.

Rollo
  Mit Zitat antworten Zitat
SiLo0815

Registriert seit: 23. Feb 2017
Ort: Essen, NRW
7 Beiträge
 
Delphi XE5 Enterprise
 
#7

AW: TPaintbox löscht Zeichenfläche selbstständig (GDI+)

  Alt 24. Feb 2017, 18:51
Vielen Dank für eure Anmerkungen, ich lasse es jetzt so.
Simon
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8

AW: TPaintbox löscht Zeichenfläche selbstständig (GDI+)

  Alt 24. Feb 2017, 19:25
Vergess aber nicht die Ressourcen wieder freizugeben, wenn du sie nicht mehr brauchst, sonst läuft dir der Speicher voll.
Michael
Ein Teil meines Codes würde euch verunsichern.
  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 10:47 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