Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Bitmap aus einer bestimmten Resource laden (https://www.delphipraxis.net/204343-bitmap-aus-einer-bestimmten-resource-laden.html)

Amateurprofi 20. Mai 2020 18:12

Bitmap aus einer bestimmten Resource laden
 
Ich habe gelegentlich das Problem dass ich ein Projekt mehrere .res eingebunden habe, die jeweils Bitmaps enthalten.
Wenn sich die IDs der Bitmaps in den .res Dateien überschneiden, kommt es dann zu unliebsamen Effekten.
Beispiel:
A.Res enthält 2 Bitmaps
ID 1 = Bild eines Hammers
ID 2 = Bild einer Sichel
B.Res enthält 2 Bitmaps
ID 1 = Bild eines Lochers
ID 2 = Bild einer Hefters
Lade ich dann eine Bitmap mit
Delphi-Quellcode:
Bmp.LoadFromResourceId(HInstance,1);
dann wird z.B. ein Hammer gezeigt, wenn eigentlich der Locher gezeigt werden soll.
Der Ausweg für Helden ist, na klar, die IDs in den .res Dateien zu ändern, aber befriedigend ist das nicht.

Frage:
Gibt es eine Möglichkeit, eine Bitmap aus einer bestimmten .res zu laden?

DieDolly 20. Mai 2020 21:05

AW: Bitmap aus einer bestimmten Resource laden
 
Zitat:

Der Ausweg für Helden ist, na klar, die IDs in den .res Dateien zu ändern, aber befriedigend ist das nicht.
Namen statt numerische Werte?

himitsu 20. Mai 2020 23:49

AW: Bitmap aus einer bestimmten Resource laden
 
Zitat:

Zitat von Amateurprofi (Beitrag 1464965)
dann wird z.B. ein Hammer gezeigt, wenn eigentlich der Locher gezeigt werden soll.

Selbst Schuld, wenn man nicht auf dem Compiler Linker hört, der das bemängelt und dann nur eines von Beiden einbindet.
Es ist garnicht möglich dass du sonstwie Beide, mit der selben ID/Name, laden kannst, da garnicht Beide im Compilat enthalten sind.

Du musst also die IDs bzw. Namen eindeutig machen.




Einziger Ausweg: Für jede RES eine eigene DLL verwenden,
da ja pro PE (EXE/DLL/BPL) die Ressourcen eindeutig sind (InstanceHandle + Name/ID).

Amateurprofi 21. Mai 2020 00:01

AW: Bitmap aus einer bestimmten Resource laden
 
Zitat:

Zitat von DieDolly (Beitrag 1464971)
Zitat:

Der Ausweg für Helden ist, na klar, die IDs in den .res Dateien zu ändern, aber befriedigend ist das nicht.
Namen statt numerische Werte?

Danke, Dolly.
Dann wird ich mir mal die Zeit nehmen, die .res Dateien, die standardmäßig verwende, umzustellen.

Amateurprofi 21. Mai 2020 00:05

AW: Bitmap aus einer bestimmten Resource laden
 
Zitat:

Zitat von himitsu (Beitrag 1464978)
Zitat:

Zitat von Amateurprofi (Beitrag 1464965)
dann wird z.B. ein Hammer gezeigt, wenn eigentlich der Locher gezeigt werden soll.

Selbst Schuld, wenn man nicht auf dem Compiler Linker hört,

Recht hast Du!
Ich hatte den Hinweis nicht bemerkt, habe es aber getestet und Ja, der Hinweis wird gezeigt, wenn sich die IDs überschneiden.

himitsu 21. Mai 2020 05:41

AW: Bitmap aus einer bestimmten Resource laden
 
Ich spiele zwar auch mit selbstgeschriebenen .RC die ich von Delphi (in der DRP/DPK) automatisch zur RES kompilieren lasse.
In PAS eingebunden, muß man selbst mit rc.exe, brc32.exe oder brcc32.exe die RC kompilieren.
Delphi-Quellcode:
{$R xxxx.rc xxxx.res} bzw. {$RESSOURCE xxxx.rc xxxx.res}
, aber dieser zweite Parameter wird eben nur in den Projektdateien (DPR/DPK) ausgewertet und ansonsten ignoriert der Delphi-Compiler den Parameter einfach so, ohne was zu sagen.

Nett ist aber auch der integrierte Ressourcen-Manager im Delphi, womit man Dateien in die Ressource des Projekts (.dres) einfügen und verwalten kann.
Teilweise reicht es sogar eine Bitmap in das Projekt zu ziehen -> Projekt-Manager, neben seine Units.

Uwe Raabe 21. Mai 2020 08:59

AW: Bitmap aus einer bestimmten Resource laden
 
Zitat:

Zitat von himitsu (Beitrag 1464982)
Nett ist aber auch der integrierte Ressourcen-Manager im Delphi, womit man Dateien in die Ressource des Projekts (.dres) einfügen und verwalten kann.

Das ist mittlerweile meine bevorzugte Verfahrensweise. Da die beschriebene $R Direktive auch nur in der DPR funktioniert, kann man das auch gleich im Projekt direkt machen.

Es gilt dabei aber zu beachten, daß der bei Problemen mit der Projektdatei (dproj) oft gehörte Hinweis, einfach die dproj zu löschen und neu erzeugen zu lassen, mit dem obigen Vorgehen nicht kompatibel ist!


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:09 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