AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Image.Data / ImageList in DFM

Ein Thema von haentschman · begonnen am 26. Aug 2012 · letzter Beitrag vom 28. Aug 2012
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.304 Beiträge
 
Delphi 12 Athens
 
#1

Image.Data / ImageList in DFM

  Alt 26. Aug 2012, 17:42
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...

Geändert von haentschman (26. Aug 2012 um 17:48 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.057 Beiträge
 
Delphi 12 Athens
 
#2

AW: Image.Data / ImageList in DFM

  Alt 26. Aug 2012, 18:12
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
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.057 Beiträge
 
Delphi 12 Athens
 
#3

AW: Image.Data / ImageList in DFM

  Alt 26. Aug 2012, 18:19
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?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.304 Beiträge
 
Delphi 12 Athens
 
#4

AW: Image.Data / ImageList in DFM

  Alt 26. Aug 2012, 18:49
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"
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.057 Beiträge
 
Delphi 12 Athens
 
#5

AW: Image.Data / ImageList in DFM

  Alt 26. Aug 2012, 21:00
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.304 Beiträge
 
Delphi 12 Athens
 
#6

AW: Image.Data / ImageList in DFM

  Alt 27. Aug 2012, 06:19
Danke für die Info...

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

Geändert von haentschman (27. Aug 2012 um 06:44 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.211 Beiträge
 
Delphi 12 Athens
 
#7

AW: Image.Data / ImageList in DFM

  Alt 27. Aug 2012, 07:59
Alle Componenten aus in der DFM müssen vorher registriert werden, sonst geht da nichts.
Delphi-Referenz durchsuchenRegisterClass.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.304 Beiträge
 
Delphi 12 Athens
 
#8

AW: Image.Data / ImageList in DFM

  Alt 27. Aug 2012, 18:35
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...

Geändert von haentschman (27. Aug 2012 um 18:38 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.057 Beiträge
 
Delphi 12 Athens
 
#9

AW: Image.Data / ImageList in DFM

  Alt 27. Aug 2012, 18:47
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.211 Beiträge
 
Delphi 12 Athens
 
#10

AW: Image.Data / ImageList in DFM

  Alt 27. Aug 2012, 18:50
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (27. Aug 2012 um 18:53 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:32 Uhr.
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