Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TJumpList Icon-Index oder: Wie verändere ich eine Komponente am besten? (https://www.delphipraxis.net/200379-tjumplist-icon-index-oder-wie-veraendere-ich-eine-komponente-am-besten.html)

CodeX 15. Apr 2019 11:42

TJumpList Icon-Index oder: Wie verändere ich eine Komponente am besten?
 
Ich würde bei der TJumpList Komponente gerne ein Icon für einen Eintrag angeben. Das geht von Haus aus nur über einen Pfad zu einer Datei, die das Icon enthält. Leider kann man jedoch kein Icon-Index angeben. Es wird automatisch der erste Icon der Datei verwendet.

Diese Einschränkung ist völlig unnötig, da das Icon intern per SetIconLocation festgelegt wird und Embarcadero sich unsinnigerweise dazu entschlossen hat, den Index fix auf 0 zu setzen statt einen variablen Parameter zu verwenden:
Delphi-Quellcode:
//Vcl.Jumplist
function TJumpListItem.GetAsIShellLink: IShellLink;
begin
  [...]
    if FIcon <> '' then
      CheckError(Result.SetIconLocation(PWideChar(FIcon), 0), SJumplistsItemErrorSettingicon)
    else // use the current executable Icon
      CheckError(Result.SetIconLocation(PWideChar(Paramstr(0)), 0), SJumplistsItemErrorSettingicon);
end;
Ich will natürlich nicht den Original-Code verändern, weiß leider aber auch nicht, wie ich in so einem Fall eine eigene Komponente korrekt ableiten muss. Eine TMyJumpList ableiten und Änderungen daran vornehmen, ist kein Problem. Aber hier betrifft es ja TJumpListItem bzw. übergeordnet dann TCustomJumpList, TJumpCategories, TJumpCategoryItem und TJumpListCollection (wo GetAsIShellLink aufgerufen wird).

Muss ich all diese Klassen ebenfalls ableiten und alle Funktionen überschreiben, wo GetAsIShellLink irgendwie involviert ist? Oder wie kann man in so einem verschachtelten Fall möglichst geschickt Änderungen vornehmen?

Uwe Raabe 15. Apr 2019 13:21

AW: TJumpList Icon-Index oder: Wie verändere ich eine Komponente am besten?
 
Zitat:

Zitat von CodeX (Beitrag 1430331)
Ich will natürlich nicht den Original-Code verändern

Ich würde hier aber genau das tun!

Die ganze Klassenarchitektur von TJumpList ist nicht auf Vererbung ausgelegt. Nahezu alle Methoden der beteiligten Klassen sind nicht virtuell, weswegen du die Implementation in deinen eigenen Klassen fast komplett nachbilden musstest.

Legt doch einfach eine Kopie der Unit Vcl.JumpList in deinem Projektverzeichnis an und ändere den Code in GetAsShellLink nach deinen Bedürfnissen.

Da du so ja nicht einfach ein zusätzliches Property IconIndex in TJumpListItem einführen kannst, könnte man den Index ja z.B. an den FileName in dem Icon-Property codieren (z.B. als "MyIconFile#5") und in GetAsShellLink beides auseinanderdröseln.

CodeX 15. Apr 2019 20:57

AW: TJumpList Icon-Index oder: Wie verändere ich eine Komponente am besten?
 
Herzlichen Dank für Deine Einschätzung!

Schade, dass es nicht besser geht. Ich dachte, ich kenne mich beim Ableiten von Komponenten einfach zu wenig aus und es gibt doch eine Lösung, damit ich bei möglichen Updates nicht erneut die ganze Unit kopieren und anpassen muss. Aber nun gut, wenn es nicht anders geht, kopiere ich sie eben doch.


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