![]() |
Image.Data / ImageList in DFM
Hallo alle...
heute habe ich mich mal wieder geärgert. In meinem Projekt habe ich eine, von mehreren, ImageList mit den Icons für Knöpfe etc. Beim Hinzufügen ändern sich ja, wenn man die Liste neu sortiert die Indexe. Dann müssen die ImageIndexe verschiedener Knöpfe angepaßt werden. Da man sich die Indexe nicht merken kann, muß man spicken. Nur wenn man die ImageList offen hat kann man im OI nix eintragen... sprich die Liste zum Spicken parallel. Jetzt hatte ich die Idee die DFM mit der ImageList auszulesen und ein Fenster mit den Icons / Indexen nebenbei öffnen zu können. Könnte mir jemand den Aufbau erklären oder gibt es bereits ein Tool ?
Delphi-Quellcode:
Wo nimmt die ImageList die Info her daß das Image, in diesem Falle, 16x16 ist ?
object pngil16: TPngImageList
ColorDepth = cd32Bit DrawingStyle = dsTransparent PngImages = < item Background = clWindow Name = 'icon_pfeil_up_left' PngImage.Data = { 89504E470D0A1A0A0000000D49484452000000100000001008060000001FF3FF 61000001554944415478DA6364A010300E3303749B19F97FFCF9FFF6DB2F0693 A7ED0C174832C0B65B90E7C79F6F1FD5254D998EDE3DF2FAC71F0687E7ED0CD7 8832C07FAA3CE7B75F3FBE288BE93319C8DA329C7B7C9461E78D1D2F7E410CB9 89D780F8B9BA9C3F7EFFFE262BACCEA02B63CDF0F0DD5D06515E6986D30F8F30 ECBDB1EBE9B77F0CB6AFDB19EEE3342075BEE17F19114D064D097386671F1F33 7CF8FE968195999341905B8CE1E483C30CFB6F1D6078D4FA17676033662F36FF FAE3CF2F064901152E1DA00BEEBEBEC620C9AFC470E0D62686B34F8E7FFBF6EB 3FC3FD66066E8281983857FFAFA75E12D3FDB7B71824F8E419661D6DFD7FB4F4 2313D1B190BED0F8AF9B4E22D3C3B7B719C4F9E418E61DEFF8BFB7F035F106E4 2E36FFEBAC1DCFF4F7FF3F863F7FFF302C38DEFD7F7BFE53E20DC85F6AFBFFCF BF5F0CA0F0F8F1E707C3B73F3FFEAFCFBC4FBC01E4028A0D00001A0091116C3D FBF60000000049454E44AE426082} end item Background = clWindow Name = 'icon_pfeil_down_left' PngImage.Data = { 89504E470D0A1A0A0000000D49484452000000100000001008060000001FF3FF 61000000B04944415478DA6364A010300E2303DEBBBBFF43375070E74E8216A0 18C0CDC202E77FFDF3E71FD000E621600050E35710839585858B0D49E21710FF FEF3E71B342CB8711BE0E1F19F8D85858115C4FBFF1F45126A08DEC004B94011 481F6667639366F9F70F55F3DFBF2043B980067CC71B064043D481D401A02112 2043A036834CE3C1A7193D10B54086B0B1B38BFEFAF913A4991FA8F90BD1B100 35C400489D016261A0E68F84346318400EA0D80000CC4B561196CA4BE5000000 0049454E44AE426082} end . . . Danke... 8-) |
AW: Image.Data / ImageList in DFM
Zitat:
|
AW: Image.Data / ImageList in DFM
Wenn du den ImageIndex eines Buttons setzt, muss dieser ja auch irgendwie eine Referenz zur ImageList haben (z.B. beim ToolButton die über die Toolbar). In diesem Fall werden aber beim Setzen des ImageIndex die Bildchen in der Dropdown-Liste angezeigt. Ist das bei dir nicht so?
|
AW: Image.Data / ImageList in DFM
Danke erst mal...
Zitat:
inzwischen habe ich folgendes gefunden: Zitat:
|
AW: Image.Data / ImageList in DFM
Zitat:
|
AW: Image.Data / ImageList in DFM
Danke für die Info... 8-)
...aber das hatte ich schon getan. Ich vermute, daß es daran liegt, daß mehrere gleiche TPngImageList vorhanden sind und es sich um die DFM eines DataModuls handelt. Wenn ich den Stream als Datamodule "einlese" bekomme ich die Meldung daß die Klasse TPngImageList nicht bekannt ist. Logisch, denn mein dynamisch erzeugtes Datamodule hat keine uses... Ich habe dann erst mal abgebrochen... Für Ideen bin ich dankbar. Versuchslabor:
Delphi-Quellcode:
procedure TForm1.FormShow(Sender: TObject);
begin FFileStream:= TFileStream.Create('D:\Projekte\Delphi Unicode\eAV3\Arbeitskopie\Quelltext\dm_ImageLists.dfm',fmOpenRead); FMemoryStream:= TMemoryStream.Create; pngil16:= TPngImageList.Create(nil); // Namen vom Standard auf die Namen in der DFM geändert dmImageLists:= TDataModule.Create(nil); try ObjectTextToBinary(FFileStream,FMemoryStream); //FMemoryStream.LoadFromStream(FFileStream); FMemoryStream.Position:= 0; FMemoryStream.ReadComponent(pngil16); // auch Versuch das komplette DataModule einzulesen incl. ReadComponentRes //FImageList:= dmImageLists.FindComponent('pngil16') as TPngImageList; btn1.Images:= pngil16; //FImageList btn1.ImageIndex:= 100; finally FFileStream.Free; FMemoryStream.Free; pngil16.Free; dmImageLists.Free; end; end; |
AW: Image.Data / ImageList in DFM
Alle Componenten aus in der DFM müssen vorher registriert werden, sonst geht da nichts.
![]() |
AW: Image.Data / ImageList in DFM
Soooo...
@himitsu: das mit dem RegisterClass brachte mich schon mal einen Schritt weiter. Der Quelltext läuft durch. A enthällt die richtige Anzahl der enthaltenen Images... Nur der Button weigert sich den Index anzuzeigen... :( Was habe ich nun vergessen ?
Delphi-Quellcode:
Nachtrag: Diese Vorgehensweise funktioniert doch nur, wenn man weiß welche Objekte (Klassen) enthalten sind. Wie macht das denn die IDE ? Irgendwie verstehe ich das nicht...
procedure TForm1.FormCreate(Sender: TObject);
var A: Integer; begin FFileStream:= TFileStream.Create('D:\Projekte\Delphi Unicode\eAV3\Arbeitskopie\Quelltext\dm_ImageLists.dfm',fmOpenRead); FMemoryStream:= TMemoryStream.Create; pngil16:= TPngImageList.Create(nil); dmImageLists:= TDataModule.Create(nil); try ObjectTextToBinary(FFileStream,FMemoryStream); RegisterClass(TPngImageList); RegisterClass(TGDIPPictureContainer); FMemoryStream.Position:= 0; FMemoryStream.ReadComponent(dmImageLists); pngil16:= dmImageLists.FindComponent('pngil16') as TPngImageList; A:= pngil16.Count; btn1.Images:= pngil16; btn1.ImageIndex:= 10; finally FFileStream.Free; FMemoryStream.Free; pngil16.Free; dmImageLists.Free; end; end; |
AW: Image.Data / ImageList in DFM
Zitat:
|
AW: Image.Data / ImageList in DFM
Delphi speichert sich das schon beim Kompilieren, wo der Compiler die entsprechende Typenliste zusammenstellt, anhand der Typen, welche im aktuellen Scope zu finden sind und die er in der DFM entdeckt.
Du könntes vorher über TReader die binäre DFM durchgehn, alle Klassennamen auslesen und diese über die RTTI suchen. Eindeutig ist das aber nicht, da diese Typenbezeichner nicht eindeutig sind und es mehrere Typen mit dem selben Namen geben könnte. @Uwe Raabe: Das ist auch nicht eindeutig. Siehe z.B. mein TNTHack für's TDE, wo im Scope des Formulars andere Typen deklariert werden. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:16 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz