Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   Image.Data / ImageList in DFM (https://www.delphipraxis.net/170027-image-data-imagelist-dfm.html)

haentschman 26. Aug 2012 17:42


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:
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
.
.
.
Wo nimmt die ImageList die Info her daß das Image, in diesem Falle, 16x16 ist ?

Danke... 8-)

Uwe Raabe 26. Aug 2012 18:12

AW: Image.Data / ImageList in DFM
 
Zitat:

Zitat von haentschman (Beitrag 1180005)
Wo nimmt die ImageList die Info her daß das Image, in diesem Falle, 16x16 ist ?

Die Default-Werte für Width und Height sind 16, deswegen stehen die nicht in der DFM.

Uwe Raabe 26. Aug 2012 18:19

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?

haentschman 26. Aug 2012 18:49

AW: Image.Data / ImageList in DFM
 
Danke erst mal...
Zitat:

Ist das bei dir nicht so
bei manchen Komponenten ja, bei manchen nicht (z.B. AdvGlowButton)

inzwischen habe ich folgendes gefunden:
Zitat:

First isolate the Object section:

Object ilMain: TImageList
..down to:
end

then use ReadComponent to read the object just like delphi does.
ich quäle mich gerade damit. Bekomme immer "Ungültiges Stream Format"

Uwe Raabe 26. Aug 2012 21:00

AW: Image.Data / ImageList in DFM
 
Zitat:

Zitat von haentschman (Beitrag 1180023)
ich quäle mich gerade damit. Bekomme immer "Ungültiges Stream Format"

Machst du aus dem Text-DFM denn auch ein Binary-DFM? Schau mal nach ObjectTextToBinary.

haentschman 27. Aug 2012 06:19

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;

himitsu 27. Aug 2012 07:59

AW: Image.Data / ImageList in DFM
 
Alle Componenten aus in der DFM müssen vorher registriert werden, sonst geht da nichts.
Delphi-Referenz durchsuchenRegisterClass.

haentschman 27. Aug 2012 18:35

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:
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;
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...

Uwe Raabe 27. Aug 2012 18:47

AW: Image.Data / ImageList in DFM
 
Zitat:

Zitat von haentschman (Beitrag 1180194)
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...

Die IDE registriert die Komponenten beim Laden der diversen Packages. Wenn du deine App mit Packages compilierst, kannst du das auch nutzen.

himitsu 27. Aug 2012 18:50

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 04:55 Uhr.
Seite 1 von 2  1 2      

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