Autor Beitrag
mats
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36



BeitragVerfasst: Mi 09.01.19 12:37 
Hallo,

am Titel seht ihr schon worum es geht. Wie kann ich eine ImageList zur Laufzeit wechseln? Welche die aktuelle Liste ist, für den nächsten Start, würde ich in der Registry speichern.

Danke für die Ideen...

mats
ub60
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 690
Erhaltene Danke: 91



BeitragVerfasst: Mi 09.01.19 14:29 
Meinst Du so etwas (nur mal auf die Schnelle probiert)?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
procedure TForm1.BitBtn1Click(Sender: TObject);
var ImageList: TImageList;
begin
  ImageList:=TImageList.Create(Form1);
  ImageList.Height:=32;
  ImageList.Width:=32;

  ImageList:=ImageList1;
  ImageList.GetBitmap(0, MySpeedButton1.Glyph);
  ImageList.GetBitmap(1, MySpeedButton2.Glyph);
  ImageList.GetBitmap(0, Image1.Picture.Bitmap);
  ShowMessage('Weiter!');

  MySpeedButton1.Glyph:=NIL;
  MySpeedButton2.Glyph:=NIL;
  Image1.Picture.Bitmap:=NIL;
  ImageList:=ImageList2;
  ImageList.GetBitmap(0, MySpeedButton1.Glyph);
  ImageList.GetBitmap(1, MySpeedButton2.Glyph);
  ImageList.GetBitmap(0, Image1.Picture.Bitmap);
  ImageList.Free;
end;


Ohne das Löschen mit NIL werden die Bilder nicht gewechselt.

ub60
mats Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36



BeitragVerfasst: Do 10.01.19 09:30 
Hallo ub60,

im Prinzip Ja. Doch es wird wohl etwas aufwendiger. In meinem Programm habe ich eine ImageList (16x16px) für Menüs und Fenstericons. Ca. 20 Bilder. Und dann habe ich noch Liste Nr. 2, (40x40px) auch ca. 20 Bilder für ToolButtons in den ToolBars. Machen will ich eigentlich folgendes: Für den User, das er wechseln kann z.B. zwischen einem klassischen Iconssets und einem modernen Iconset.

Zu kompliziert? Vielleicht später...

Danke erst mal

mats
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8387
Erhaltene Danke: 416

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.2 CE
BeitragVerfasst: Do 10.01.19 13:59 
Hier mal ein Ausschnitt aus dem Code meines Players, bei dem der User unter anderem auch die Menu-Icons ändern kann.

Die Icons (38 an der Zahl) werden bei mir in der richtigen Reihenfolge in einer Datei gespeichert (wird vorher in ListenCompletebmp geladen), und dann werden die einzelnen 16x16-Icons in die ImageList geladen, die zum Schluss den Menüs zugeordnet wird.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
ButtonTmp := TBitmap.Create;
try
  Buttontmp.PixelFormat := pf32bit;
  ButtonTmp.Width := 16;
  Buttontmp.Height := 16;
  Nemp_MainForm.MenuSkinImageList.Clear;
  for i := 0 to 37 do
  begin
    ButtonTmp.Canvas.CopyRect(
      rect(0,0,16,16), ListenCompletebmp.Canvas,
      rect(i*16,0,i*16+16, ButtonTmp.Height));
    Nemp_MainForm.MenuSkinImageList.AddMasked(ButtonTmp,Buttontmp.Canvas.Pixels[0,0]);
  end;
  Nemp_MainForm.Nemp_MainMenu      .Images := Nemp_MainForm.MenuSkinImageList;
  Nemp_MainForm.Medialist_PopupMenu.Images := Nemp_MainForm.MenuSkinImageList;
  Nemp_MainForm.PlayListPOPUP      .Images := Nemp_MainForm.MenuSkinImageList;
  Nemp_MainForm.Player_PopupMenu   .Images := Nemp_MainForm.MenuSkinImageList;
finally
  ButtonTmp.Free;
end;


Bei Toolbuttons sollte das ganz ähnlich funktionieren, ggf. ist da aber auch der Zwischenschritt mit der NIL-Zuweisung nötig, damit das korrekt aktualisiert wird.

_________________
Oel ngati kameie.
ub60
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 690
Erhaltene Danke: 91



BeitragVerfasst: Do 10.01.19 16:19 
Ich verstehe nicht, warum das nicht funktionieren soll, werfe aber mal noch FindComponent in die Waage:

ausblenden Delphi-Quelltext
1:
2:
for i:=0 to Anzahl do
  ImageList.GetBitmap(i, TSpeedButton(FindComponent('SpeedButton'+IntToStr(i+1))).Glyph);

ub60
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8387
Erhaltene Danke: 416

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.2 CE
BeitragVerfasst: Do 10.01.19 17:47 
@ub60: Wir reden hier über zwei leicht verschiedene Dinge, glaube ich. Du beschreibst, wie man aus einer ImageList heraus einzelnen Komponenten (SpeedButton) ein Bild zuweisen kann. Bei Menus oder Toolbars gibt es aber "nur" die Eigenschaft Images vom Typ TImageList, aus der die Unter-Komponenten (MenuItem, ToolButton, ...) dann über ImageIndex das Bild holen.

Beides geht natürlich. Man muss da nur die passende (ggf. zur Laufzeit erstellte und befüllte) Imagelist zuweisen, und ggf. aufpassen, dass die Bildgrößen passend sind und auf Transparenz achten, damit es vernünftig aussieht.

Wenn sämtliche Designs vorher schon feststehen, kann man natürlich auch einfach eine zweite (dritte, vierte, ...) ImageList auf die Form packen, und die zur Designzeit mit den passenden Grafiken füllen. Dann reicht eine einzelne Zuweisung, damit die Grafiken in Menü und Toolbar wechseln. :D

_________________
Oel ngati kameie.
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2132
Erhaltene Danke: 391

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Do 10.01.19 19:18 
@ Gausi

Ja, Menus und Toolbars haben eine .Images (TCustomImageList) Eigenschaft, und Nein, ein TMenuItem hat u.a. auch eine .Bitmap (TBitmap) Eigenschaft.

@ mats

Wenn du eh immer dieselben Icons in unterschiedlichen Auflösungen darstellen möchtest, dann reicht es doch aus, die größte Auflösung in eine InageList zu laden, und je nachdem, wo und wie man es braucht, an der Stelle die Icons etwas kleiner zu zeichnen.

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)