TImageList "Details" bei HighDPI

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Nimral
Beiträge: 390
Registriert: Mi 10. Jun 2015, 11:33

TImageList "Details" bei HighDPI

Beitrag von Nimral »

Hi,

heute belästige ich euch mit den "Details" zur TImageList

Ich denke, ich habe das Meiste verstanden. Außer folgenden Details:

* was macht die Property "Scaled" von TImageList genau? Ich schalte sie ein, ich schalte sie aus, sehe aber keinen Unterschied. Ich dachte eine Weile, dass sie das Berechnen von Zwischengrößen ein- und ausschaltet ... ist sie an, wird ein Zwischenbild berechnet, ist sie aus, wird aus der Bilderliste das nächstliegende genommen. Stimmt das? Irgendwie ist es mir nicht gelungen, das Verhalten durch Probieren festzunageln, und die Doku, na ja, das alte, leidige Thema ...

* Innerhalb der ImageList gibt es rechts noch EInstellmöglichkeiten für "Adjustments" und "Transparent Color". Sie sind bei meinen Imagelisten mit uneinheitlichen Defaults belegt (Transparent Color ist einmal "clDefault" und ein andermal "clFuchsia", Adjustment ist stets "none" - wobei ich mich nicht erinnern kann jemals das Eine oder das Andere eingestellt zu haben, und das wäre auch schwierig, denn die Controls sind stets gesperrt (ausgegraut), also kann ich hier nichts einstellen. Was genau hat es mit diesen beiden Einstellmöglichkeiten auf sich?

HG, Armin.
Dateianhänge
2021-06-24 13_45_42-Lazarus IDE v2.3.0 r65297 - PatientConceptID.png
2021-06-24 13_45_42-Lazarus IDE v2.3.0 r65297 - PatientConceptID.png (24.14 KiB) 849 mal betrachtet

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: TImageList "Details" bei HighDPI

Beitrag von wp_xyz »

Nimral hat geschrieben:
Do 24. Jun 2021, 13:42
* was macht die Property "Scaled" von TImageList genau? Ich schalte sie ein, ich schalte sie aus, sehe aber keinen Unterschied.
Den Unterschied merkt man nur, wenn sich auf dem Monitor die PPI ändern. Wenn Scaled=false ist, werden die Bilder in der Größe verwendet, die in der ImageList als Width und Height angegeben sind. Wenn Scaled=true ist, wird basierend auf den aktuellen PPI von den vordefinierten Bildgrößen die am besten passende ausgewählt. In dem beigefügten Beispielprojekt werden zwei gleiche Toolbars angezeigt, wobei die obere mit einer ImageList mit Scaled=true, die untere mit einer ImageList mit Scaled=false verbunden ist (die beiden ImageLists enthalten ansonsten dieselben Bilder). Auf 96ppi sind beide ImageLists gleich, auf 144 ppi ist die obere größer.
Nimral hat geschrieben:
Do 24. Jun 2021, 13:42
* Innerhalb der ImageList gibt es rechts noch EInstellmöglichkeiten für "Adjustments" und "Transparent Color". Sie sind bei meinen Imagelisten mit uneinheitlichen Defaults belegt (Transparent Color ist einmal "clDefault" und ein andermal "clFuchsia", Adjustment ist stets "none" - wobei ich mich nicht erinnern kann jemals das Eine oder das Andere eingestellt zu haben, und das wäre auch schwierig, denn die Controls sind stets gesperrt (ausgegraut), also kann ich hier nichts einstellen. Was genau hat es mit diesen beiden Einstellmöglichkeiten auf sich?
Das habe ich noch nie verwendet (genauso wenig wie die anderen Properties im Object Inspector). In der Hilfe von Delphi steht:

Wenn Sie der Bilderliste ein Bild hinzufügen (mit der Schaltfläche Hinzufügen), können Sie im aktuell geöffneten Bilderlisten-Editor Eigenschaften des ausgewählten Bildes mit den Steuerelementen Transparente Farbe, Füllfarbe und Optionen ändern. Nachdem der Bilderlisten-Editor geschlossen wurde, sind diese Eigenschaften fest. Wenn Sie dieses Bild im erneut geöffneten Bilderlisten-Editor auswählen, sind die Steuerelemente Transparente Farbe, Füllfarbe und Optionen abgedunkelt, und Sie können keine Eigenschaften mehr ändern.

"Transparent Color" stammt mit großer Wahrscheinlichkeit aus den Urzeiten als man mit Hilfe einer sonst nicht verwendeten Farbe ein bmp-Bitmap transparent machen wollte - das ist heute hinfällig, weil man auch das png-Format in eine ImageList reinladen kann, und dieses unterstützt "echte" Alpha-Kanal-Transparenz.
"Adjustments" wird m.M.n. wichtig, wenn die Größe eines Bildes nicht der durch Width/Height definierten Vorgabe entspricht, und dann machen die Einstellmöglichkeiten genau das, wonach sie benannt sind.
Dateianhänge
imagelist_scaled_unscaled.zip
(2.98 KiB) 41-mal heruntergeladen

Nimral
Beiträge: 390
Registriert: Mi 10. Jun 2015, 11:33

Re: TImageList "Details" bei HighDPI

Beitrag von Nimral »

Danke für die Infos! Schaut gut aus, Du hast mal wieder die Lücken gefüllt.

Kann man eigentlich auch ein TImage (oder ein vergleichbares Control das Bilder anzeigen kann) zur Design-Time mit einer TImageList verbinden um den High.DPI Service auch für andere Bilder zu verwenden?

Für Runtime fand ich glaub ich eine Lösung:

Code: Alles auswählen

ImageList1.GetBitmap(cboIcon.ItemIndex, Image1.Picture.Bitmap);
babs noch nicht ausgetestet, aber es schaut so aus als ob es gehen könnte :-)

HG, Armin

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: TImageList "Details" bei HighDPI

Beitrag von wp_xyz »

Nimral hat geschrieben:
Do 24. Jun 2021, 23:01
Kann man eigentlich auch ein TImage (oder ein vergleichbares Control das Bilder anzeigen kann) zur Design-Time mit einer TImageList verbinden um den High.DPI Service auch für andere Bilder zu verwenden?

Für Runtime fand ich glaub ich eine Lösung:

Code: Alles auswählen

ImageList1.GetBitmap(cboIcon.ItemIndex, Image1.Picture.Bitmap);
Ich wüsste nicht, wie man ein TImage zur Designzeit mit einer TImageList verbinden könnte. Zur Laufzeit würde ich es vom Prinzip her genauso machen wie du, allerdings bezweifle ich, dass ImageList.GetBitmap die richtige Auflösung verwendet. Ich meine, du müsstest den Umweg über die Resolution*[] Property gehen:

Code: Alles auswählen

var
  imgres: TImageListResolution;
 ...
   imgres := ImageList1.ResolutionForPPI[BildGroesse, Form1.PixelsPerInch, GetCanvasScalefactor]:
   imgres.GetBitmap(cboIcon.ItemIndex, Image1.Picture.Bitmap);
Bin allerdings momentan nicht sicher ob BildGroesse die gewünschte oder die Basis-Bildgröße (bei 96ppi) ist.

Antworten