Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Neuen Beitrag zur Code-Library hinzufügen (https://www.delphipraxis.net/33-neuen-beitrag-zur-code-library-hinzufuegen/)
-   -   Delphi Laden und Speichern von Icons (Icon Parser, für Icon Dateien oder Resourcen) (https://www.delphipraxis.net/170682-laden-und-speichern-von-icons-icon-parser-fuer-icon-dateien-oder-resourcen.html)

Zacherl 28. Sep 2012 12:19


Laden und Speichern von Icons (Icon Parser, für Icon Dateien oder Resourcen)
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo zusammen,

die hier vorgestellte Unit beinhaltet eine Klasse zum Laden und Speichern von Icons. Die Icons können sowohl aus einer Icon Datei, als auch aus einer Resource (beliebige PE Datei) geladen werden. Die Klasse stellt dann sämtliche Einzelbilder des geladenen Icons in einer Liste zur Verfügung. Bei Bedarf können auch die entsprechenden GDI Handles zum Zeichnen des Icons (per DrawIcon) erstellt werden (CreateIconHandles auf true setzen).

Das Hinzufügen, Entfernen oder Bearbeiten von Bildern wird nicht unterstüzt. Allerdings kann die Klasse beispielsweise dazu verwendet werden, um einer beliebigen PE Datei ein Icon hinzuzufügen, oder das bestehende Icon zu ersetzen.

Viele Grüße
Zacherl

Bummi 28. Sep 2012 13:06

AW: Laden und Speichern von Icons (Icon Parser, für Icon Dateien oder Resourcen)
 
Hi Zacherl, das funktioniert schön:
Delphi-Quellcode:
procedure TForm3.Button1Click(Sender: TObject);
var
 ir:TdxIconResource;
 ic:TIcon;
 i:Integer;
begin
   ic := TIcon.Create;
   ir:=TdxIconResource.Create;
   ir.CreateIconHandles := true;
   ir.LoadFromFile('C:\Icons\IconCollection\ix_ap_all\ico-files\add.ico');
   Caption := IntToStr(ir.ImageCount);
   For i := 0 to ir.ImageCount - 1 do
       begin
       memo1.Lines.Add(Format('H: %d W:%d NB:%d HD:',[ir.Images[i].Width,ir.Images[i].Height,ir.Images[i].Numbytes,ir.Images[i].Handle])) ;
       ic.Handle := ir.Images[i].Handle;
       canvas.Draw(i*50,i*20,ic);
       end;
   ic.Free;
   ir.Free;
end;
wie soll das mit den PE - Dateien gehen,oder verstehe ich etwas anderes als Du darunter?

Zacherl 28. Sep 2012 14:26

AW: Laden und Speichern von Icons (Icon Parser, für Icon Dateien oder Resourcen)
 
Hallo Bummi,

analog zum Laden aus einer Icon Datei, kannst du folgendes machen, um z.b. das Icon deiner eigenen EXE zu laden:
Delphi-Quellcode:
ir.LoadFromResource(hInstance, 'MAINICON');
Wenn du Icons aus externen PE Dateien extrahieren willst, kannst du wie folgt vorgehen:
Delphi-Quellcode:
var
  hModule: THandle;
begin
  hModule := LoadLibraryEx('ExterneExeDatei.exe', 0, LOAD_LIBRARY_AS_DATAFILE);
  if (hModule <> 0) and (hModule <> INVALID_HANDLE_VALUE) then
  try
    ir.LoadResource(hModule, 'ICONRESOURCENAME');
  finally
    FreeLibrary(hModule);
  end;
end;
Beim Speichern eines Icons in eine PE Datei funktioniert es etwas anders. Dort muss zum einen der Icon Header als RT_GROUPICON Resource angelegt werden und die Einzelbilder dann jeweils als eigene RT_ICON Resource. Deshalb übernimmt die SaveToResource() Funktion in diesem Falle den Dateinamen der Zieldatei als Parameter.

Delphi-Quellcode:
ir.SaveToResource('ExterneExeDatei.exe', 'ICONRESOURCENAME');
Wenn deine Zieldatei mehrere Icons besitzt könnte meine Methode allerdings teilweise die Einzelbilder überschreiben. Dafür habe ich bisher noch keinen Check eingebaut :)

Bummi 28. Sep 2012 17:42

AW: Laden und Speichern von Icons (Icon Parser, für Icon Dateien oder Resourcen)
 
Liste der Anhänge anzeigen (Anzahl: 2)
Da ich keine Möglichkeit fand unbenannte Icongroups zu laden habe ich den Code etwas erweitert. Ich habe die geänderte Datei als dxIconUtils_modi.pas beigelegt, da ich nicht sicher bin ob die Änderungen so wie sie vorgenommen wurden für Dich akzeptabel sind.

EDIT:

Rückgebaut siehe Folgepost

Zacherl 28. Sep 2012 18:40

AW: Laden und Speichern von Icons (Icon Parser, für Icon Dateien oder Resourcen)
 
Hallo Bummi,

die Funktion zum Enumerieren der Resourcen passt sehr gut dazu :) Für Erweiterungen der Unit, bzw. allgemein meiner Codes bin ich immer offen und dankbar. Danke auch für deine Demo Anwendung! Um eine unbenannte bzw. ID Resource zu laden, wäre alternativ auch folgende Lösung mit meiner originalen LoadFromResource Funktion möglich gewesen:
Delphi-Quellcode:
ir.LoadFromResource('PEDatei.exe', PChar(12345));
Wobei 12345 hier für die ID der IconGroup Resource steht. Die Windows APIs zum Laden von Resourcen erwarten einen PChar Parameter und erkennen automatisch, ob man hier wirlich einen Namen oder nur eine ID übergeben hat. Aus diesem Grund habe ich den ResourceName Parameter der LoadFromResource Funktion ebenfalls als PChar deklariert und nicht, wie man es vermutlich normalerweise machen würde, als String :)

Bummi 28. Sep 2012 18:43

AW: Laden und Speichern von Icons (Icon Parser, für Icon Dateien oder Resourcen)
 
Danke ... ich bau das zurück, was ein didn't know :oops:

MuTzE.Y85 29. Sep 2012 14:10

AW: Laden und Speichern von Icons (Icon Parser, für Icon Dateien oder Resourcen)
 
Warum die Mühe? Dafür gibts doch IconTools von Jan Peter Stotz :)

Zacherl 29. Sep 2012 15:50

AW: Laden und Speichern von Icons (Icon Parser, für Icon Dateien oder Resourcen)
 
Zitat:

Zitat von MuTzE.Y85 (Beitrag 1184960)
Warum die Mühe? Dafür gibts doch IconTools von Jan Peter Stotz :)

Diese Library war mir nicht bekannt. Habe sie mir mal kurz angeschaut und leider auch keine Funktion zum Speichern des Icons zurück in eine Resource gefunden. Für nonVCL Programme ist die Lib zudem auch nicht geeignet. Und mal ganz ehrlich: Irgendwas selbst zu programmieren macht um einiges mehr Spaß, als einfach nur eine fertige Komponente zu verwenden :)

MuTzE.Y85 1. Okt 2012 01:17

AW: Laden und Speichern von Icons (Icon Parser, für Icon Dateien oder Resourcen)
 
Ja das stimmt, 1:0 für dich :)

Zacherl 5. Okt 2012 01:48

AW: Laden und Speichern von Icons (Icon Parser, für Icon Dateien oder Resourcen)
 
Hatte ganz vergessen die SaveToResource Funktion komplett zu implementieren :-D Leider gibt es momentan ab und zu noch Probleme ein Icon hinzuzufügen, wenn die EXE vorher kein Icon besessen hat. Fals jemand einen Tipp für mich hat, bitte hier posten:
http://www.delphipraxis.net/170834-h...festlegen.html

:arrow: SaveToResource Funktion vervollständigt
Das Speichern funktioniert nun in den meisten Fällen. Achtung: Hat die neue Icon Resource mehr Einzelbilder, als die ersetzte Resource, können eventuell weitere Einzelbilder überschrieben werden.
:arrow: FindIconImageIndex hinzugefügt
FindIconImageIndex sucht anhand der übergebenen Maßen (und optional Farbtiefe) den Index des passendsten Einzelbildes heraus


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:09 Uhr.
Seite 1 von 4  1 23     Letzte »    

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