wennerer hat geschrieben: So 30. Mai 2021, 18:12
Ich muss jetzt mal kräftig nachdenken wie ich das am besten angehe.
Ich glaube, das geht relativ einfach:
- TMultiButton.Create darf die Imagelist nicht erzeugen (kommentiere FMessageButton.FImageList := TImageList.Create und FImageList := TImageList.Create aus)
- Das Zerstören der selbsterzeugten ImageListen darf auch nicht sein, aber weil du als Owner "self" angegeben hast, musst du dich darum nicht kümmern.
- TMultibutton.SetImageList darf nicht die Bilder kopieren, sondern muss einfach die als AValue angegebene an die interne Variable (FImagelist) zuweisen. Die Imagelisten sind ja wie alle Objekte Pointer, d.h. wenn TMultiButton eine externe ImageList als Variable verwendet, dann hat sie Zugriff auf die dort gespeicherten Bilder, ohne diese kopieren zu müssen.
- Die Property-Editor für ImageList und ImageIndex sind nicht mehr nötig. ImageIndex solltest du aber als TImageIndex deklarieren (statt als Integer), denn dann wird automatisch der vorhandene ImageList-PropertyEditor verwendet.
- Die intern verwendete ImageList würde ich als TCustomImageList deklarieren, statt als TImageList. Das hätte den Vorteil, dass du, wenn jemand einmal z.B. eine TSvgImageList von TCustomImageList ableiten würde, du diese direkt verwenden könntest.
wennerer hat geschrieben: So 30. Mai 2021, 18:12
Über so was wie Speicherverbrauch habe ich noch gar nicht wirklich richtig nachgedacht. Eventuell sollte ich den mal Messen und mit anderen Controlls vergleichen.
Naja, das ist unschön, aber eher nebensächlich. Wichtiger ist, dass man die Bilder in jeden Button neu eintragen muss.
Nimm dir einfach einmal ein Control der LCL, das eine ImageList verwendet, als "Spick"-Quelle. Leider ist das wegen der Widgetset-Infrastruktur nicht immer klar zu erkennen. Probier's mal mit TCustomGrid und seiner FTitleImageList.