AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Icons im Program dem DPI-Wert anpassen (TPngImageList + Collection)
Thema durchsuchen
Ansicht
Themen-Optionen

Icons im Program dem DPI-Wert anpassen (TPngImageList + Collection)

Ein Thema von Strict · begonnen am 1. Mai 2020 · letzter Beitrag vom 4. Mai 2020
Antwort Antwort
Strict

Registriert seit: 24. Mär 2020
47 Beiträge
 
#1

Icons im Program dem DPI-Wert anpassen (TPngImageList + Collection)

  Alt 1. Mai 2020, 12:09
Ein bestehendes Programm muss ich in der nächsten Zeit etwas aufhübschen. In Zeiten von 200% DPI sind die Icons in der ToolBar und an anderen Stellen wie beispielsweise eine ListBox mit selbstbezeichneten Icons einfach zu klein.

Welches ist die beste und einfachste Möglichkeit, dieses Problem zu umgehen?

Vielleicht sogar basierend auf TPngImageList / TPngImageCollection?
Gerade benutze ich sehr umständlich mehrere TPngImageList'en mit einer Funktion die mir das Icon anhand des Namens aus der Liste meiner Wahl zurückgibt. Die TPngImageCollection kann das leider nicht.

Ein record-Helper für TPngImageCollection kennt leider kein GetIcon().

Geändert von Strict ( 1. Mai 2020 um 12:32 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.009 Beiträge
 
Delphi 12 Athens
 
#2

AW: Icons im Program dem DPI-Wert anpassen (TPngImageList + Collection)

  Alt 1. Mai 2020, 12:44
Welche Delphi-Version? Neuere Versionen haben TImageCollection undTVirtualImageList für genau diesen Zweck.

Alternativ könnte ich noch im Anhang DynImageList anbieten.
Angehängte Dateien
Dateityp: zip DynImageList.zip (320,9 KB, 19x aufgerufen)
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Strict

Registriert seit: 24. Mär 2020
47 Beiträge
 
#3

AW: Icons im Program dem DPI-Wert anpassen (TPngImageList + Collection)

  Alt 1. Mai 2020, 15:48
10.3.3.
Ich werde die TImageCollection ausprobieren. Wie verwendet man die? Ich finde so gut wie nichts dazu in der Doku.

Ich dachte eigentlich in etwa so an das Icon zu kommen ImageCollection1.Images.Items[ImageCollection1.GetIndexByName(AName)] ... Es geht mir darum eine TToolBar mit Icons zu füllen und es sollen immer automatisch die richtigen je nach DPI ausgewählt werden.

Ich habe diese Anleitung abgearbeitet. Aber die Bildchen in meiner TToolBar sind bei 175% DPI trotzdem nur 16x16px klein.
Wenn ich ein Bild mit VirtualImageList1.GetIcon(Index, Image5.Picture.Icon)); in ein 96x96 TImage lade, sehe ich trotzdem nur ein 16x16 Bildchen.
https://translate.google.com/transla...mage-List.aspx

Geändert von Strict ( 1. Mai 2020 um 16:25 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.009 Beiträge
 
Delphi 12 Athens
 
#4

AW: Icons im Program dem DPI-Wert anpassen (TPngImageList + Collection)

  Alt 1. Mai 2020, 16:34
10.3.3.
Ich werde die TImageCollection ausprobieren. Wie verwendet man die? Ich finde so gut wie nichts dazu in der Doku.
Steht alles in dem verlinkten Wiki-Artikel alles drin. Eigentlich ist es gar nicht so schwierig.
  1. Platziere eine TImageCollection auf dem Form
  2. Lade alle Images in den verschiedenen Größen
  3. Platziere eine TVirtualImageList auf dem Form
  4. Verbinde diese mit der ImageCollection und selektiere alle oder alle benötigen Bilder in die VirtualImageList
  5. Verbinde die Toolbar mit der VirtualImageList

Die Toolbar-Icons werden nun automatisch an die aktuelle DPI angepasst. Kein weiterer Code nötig.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Strict

Registriert seit: 24. Mär 2020
47 Beiträge
 
#5

AW: Icons im Program dem DPI-Wert anpassen (TPngImageList + Collection)

  Alt 1. Mai 2020, 16:53
Genau das habe ich gemacht und ich sehe trotzdem nur sehr unscharfe kleine Bilder.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.009 Beiträge
 
Delphi 12 Athens
 
#6

AW: Icons im Program dem DPI-Wert anpassen (TPngImageList + Collection)

  Alt 1. Mai 2020, 18:25
Kannst du mal ein entsprechendes Beispielprojekt (mit .dproj Datei!) hier anhängen?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Strict

Registriert seit: 24. Mär 2020
47 Beiträge
 
#7

AW: Icons im Program dem DPI-Wert anpassen (TPngImageList + Collection)

  Alt 1. Mai 2020, 19:05
Problem gefunden. Die ToolBar muss direkt auf dem TForm liegen und darf vorher nicht auf einem TPanel liegen.
Ich werde bald sicher noch eine Frage zu dieser Liste zusammen mit einer ListBox haben. Mache ich dann aber in einem anderen Thema.
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.164 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Icons im Program dem DPI-Wert anpassen (TPngImageList + Collection)

  Alt 1. Mai 2020, 19:44
Evtl. ist auch das Verwenden von Vector-Icons interessant. Ich nutze die schon länger, allerdings weiß ich gar nicht ob Delphi da von Haus aus schon was hat (nutze DevExpress).
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)
  Mit Zitat antworten Zitat
Strict

Registriert seit: 24. Mär 2020
47 Beiträge
 
#9

AW: Icons im Program dem DPI-Wert anpassen (TPngImageList + Collection)

  Alt 4. Mai 2020, 19:42
Das Problem ist jetzt beseitigt. Die Toolbar darf erstens nicht auf einem Panel liegen und zweitens darf die ImageCollection sowie die VirtualImageList nicht auf einem DatenModul liegen.
Die Bilder können aus der VirtualImageList geladen und zugewiesen werden. Aber beim Wechseln des Bildschirms und somit der DPI, skalieren die Bildchen nicht. Liegen die Imagelisten auf einer normalen Form, funktioniert alles so wie gewollt. Sieht fast nach einem Bug aus.

Geändert von Strict ( 4. Mai 2020 um 19:53 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.009 Beiträge
 
Delphi 12 Athens
 
#10

AW: Icons im Program dem DPI-Wert anpassen (TPngImageList + Collection)

  Alt 4. Mai 2020, 21:00
Liegen die Imagelisten auf einer normalen Form, funktioniert alles so wie gewollt. Sieht fast nach einem Bug aus.
Nein, das ist kein Bug. Die TVirtualImageList muss ja über die DPI-Änderung für das Form informiert werden. Deswegen muss sie zwingend auf dem Form liegen. In dem besagten Artikel steht auch:
Zitat:
TVirtualImageList erbt automatisch die DPI seines Eigentümers (TCustomForm oder TCustomFrame), falls dieser skaliert ist.
Damit ist klar, daß das Form oder Frame der Owner der ImageList sein muss.

Unter Bewährtes Vorgehen steht dann auch:
Zitat:
Eine TVirtualImageList-Komponente sollte immer auf einem Formular, nicht in einem Datenmodul platziert werden. Formulare haben einen zugeordneten Monitor und eine zugeordnete Auflösung (DPI); Datenmodule nicht. TImageCollection-Komponenten können beliebig platziert werden, da sie einfach die Quelle sind und nicht von DPI-Änderungen beeinflusst werden: sie sind die Quelle und die virtuelle Bilderliste ist die Darstellung.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  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 16: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