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



BeitragVerfasst: Mi 09.01.19 13: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: 762
Erhaltene Danke: 127



BeitragVerfasst: Mi 09.01.19 15: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: 49



BeitragVerfasst: Do 10.01.19 10: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: 8535
Erhaltene Danke: 473

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Do 10.01.19 14: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.

_________________
We are, we were and will not be.
ub60
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 762
Erhaltene Danke: 127



BeitragVerfasst: Do 10.01.19 17: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: 8535
Erhaltene Danke: 473

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Do 10.01.19 18: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

_________________
We are, we were and will not be.
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 10.01.19 20:18 
- Nachträglich durch die Entwickler-Ecke gelöscht -