Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Resourcen aus statisch eingebunder BPL (https://www.delphipraxis.net/187818-resourcen-aus-statisch-eingebunder-bpl.html)

Christoph Schneider 6. Jan 2016 15:15

Delphi-Version: 10 Seattle

Resourcen aus statisch eingebunder BPL
 
Nachdem wir unsere VCL-Skinning Lösung in ein eigenes Package auslagert haben, kriegen wir ein Problem mit der Skinning-Resource, welche im Code eingebunden ist und nicht als separates File ausgeliefert wird.

In der BPL haben wir das nötige VCLStyle.vsf File als Resource des Typs "VCLSTYLE" im Resourcen-Editor ins Package eingebunden.
Neben dieser Resource enthält das Package noch einige Funktionen für das Laden des VCL-Styles während dem Programstart.

Mein Problem ist jetzt, dass die Resource der statisch eingebundenen BPL nicht ins Exe gelinkt wird - vermutlich weil keine statische Referenz auf die Resource existiert und der Linker hier optimiert. Die Lösung mit dem Package läuft akutell nur, wenn ich die VCL-Style-Resource nochmals "manuell" ins Exe einbinde, was natürlich nicht im Sinne des Architekten ist.

Hat jemand Erfahrungen rsp. mehr Informationen zu Resourcen aus BPL's, wobei die Problematik eben diesen speziellen Resourcentyp "VCLSTYLE" betrifft?

himitsu 6. Jan 2016 16:15

AW: Resourcen aus statisch eingebunder BPL
 
Die RC in das Projekt eures Packages aufnehmen (einfach die RC in die Projektverwaltung ziehen)

oder in eine Unit der BPL manuell über
Delphi-Quellcode:
{$R 'x.res'}
oder
Delphi-Quellcode:
{$RESSOURCE 'x.res'}
, bzw.
Delphi-Quellcode:
{$R 'x.res' 'x.rc'}
oder
Delphi-Quellcode:
{$RESSOURCE 'x.res' 'x.rc'}
einbinden.
(das wurde z.B. damals mit dem XP-Manifest so gemacht ... die TXPManifest war nur dafür da, damit Dummi die Unit automatisch ins Uses bekommt)

Christoph Schneider 6. Jan 2016 17:25

AW: Resourcen aus statisch eingebunder BPL
 
Danke Dir für den Tipp! Das funktioniert so.

Ich musste nur noch einiges studieren bis ich Deinen Tip auch richtig verstand und korrekt umsetzen konnte, darum versuche ich es hier nochmals zu erklären.

Mein Problem war ja eigentlich nicht, dass ich die Resource nicht ins Package geladen kriegte.
Wir machten dies zwar nicht mehr explizit über {$R 'File.res'} sondern mit der neuen impliziten Methode via Menu "Project/Resources and Images".
Dahinter steckt dann aber auch ein RC-File das als kompiliertes RES eingebunden wird. Die Resource war aber auch vorher bereits in der BPL drin. Dies konnte ich mit dem XN-Resource-Editor zeigen.

Der Trick ist aber, genau darauf zu achten, wo die {$R 'File.res'} Zeile steht. In der DPK-Datei brachte diese Anweisung nocht nicht die Lösung.

Steht die Zeile aber in jener Unit, welche auch meine Klasse enthält, die das Stylesheet lädt, dann wird im Program diese Unit wiederum referenziert, wenn ich dieses Package anwende.
Dabei kommt es nicht darauf an, ob {$R 'File.res'} im Interface- oder Implementationsteil steht.
Beim Kompilieren des Exe sucht Delphi dann aber auch erneut nach dieser Res-Datei und verwendet nicht die Resource aus der BPL. Darum muss diese Res-Datei dann zwingend auch ins zentrale Library-Verzeichnis, was ich bei der Package-Installation noch berücksichtigen musste.

Die gefundene Lösung entspricht zwar nicht meiner ursprünglichen Vorstellung, dass diese Resource direkt aus der BPL ins Projekt gelangen soll.
Nur wenn kümmerts, solange ich die Packages sauber in verschiedene Verzeichnisse halten kann und so die Bausteine schön enkoppelt habe, ist die Architektur-Vorgabe wiederum erfüllt :wink:.

himitsu 7. Jan 2016 07:32

AW: Resourcen aus statisch eingebunder BPL
 
Beim Compilieren gegen den Inhalt der BPL brauchst du doch auch die DCP, DCU und DFMs?
Also so gesehn ist das mit der RES/RC auch kein Beinbruch und eigentlich normal.

Der Compiler/Linker kann halt nur aus dem "Original" den neuen Code erstellen/zusammen bauen und nicht aus dem zusammengemanschten Ergebnis in der BPL.
Gut, Ressourcen lassen sich zwar problemlos und verlustfrei wieder extrahieren, aber mit dem sonstigen Code ist das so nicht möglich.

Christoph Schneider 7. Jan 2016 08:05

AW: Resourcen aus statisch eingebunder BPL
 
Du hast natürlich Recht.

Ich ging hier von einer falschen Erwartung aus, dass beim Linken der BPL Inhalt verwendet wird und nur beim Debugger die Dcu gelesen werden.
Danke Dir für die Klärung.


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