Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Resourcendatei wird nicht erzeugt (https://www.delphipraxis.net/101483-resourcendatei-wird-nicht-erzeugt.html)

Jens Schumann 14. Okt 2007 10:11


Resourcendatei wird nicht erzeugt
 
Hallo,
ich verwende in einigen Projekten die Resourcendatei jsl.rc. Seit D5 ist es möglich die rc-Datei dem Projekt hinzuzufügen.
Dann wird die dazugehörige res-Datei automatisch beim erzeugen des Projektes erstellt und hinzugelinkt.

Jetzt versuche ich das gleiche mit D2006 Turbo. Aber irgendwie funktioniert das nicht. Die res-Datei wird nicht generiert.
Code:
[Pascal Fehler] E1026 Datei nicht gefunden: 'jsl.res'
Delphi-Quellcode:
program tpm;

{$R 'jsl.res' 'jsl.rc'}



uses
  Forms,
  tpm_main in 'tpm_main.pas' {FormTpmMain},
  at_datamodule in 'at_datamodule.pas' {DM: TDataModule};

{$R *.res}

begin
  Application.Initialize;
  Application.Title := 'TPM';
  Application.CreateForm(TDM, DM);
  Application.CreateForm(TFormTpmMain, FormTpmMain);
  Application.Run;
end.

Luckie 14. Okt 2007 10:40

Re: Resourcendatei wird nicht erzeugt
 
Das hat bei mir, Delphi 6 Personal, noch nie funktioniert.

lbccaleb 14. Okt 2007 10:42

Re: Resourcendatei wird nicht erzeugt
 
also bei mir auch nicht :-(

taktaky 14. Okt 2007 11:07

Re: Resourcendatei wird nicht erzeugt
 
Verschiebst Du die Zeile in die richtige Stelle!
Delphi-Quellcode:
program tpm;

//{$R 'jsl.res' 'jsl.rc'}



uses
  Forms,
  tpm_main in 'tpm_main.pas' {FormTpmMain},
  at_datamodule in 'at_datamodule.pas' {DM: TDataModule};

//....

implementation // !!!

{$R *.res}
{$R 'jsl.res' 'jsl.rc'}  // da soll sein

begin
  Application.Initialize;
  Application.Title := 'TPM';
  Application.CreateForm(TDM, DM);
  Application.CreateForm(TFormTpmMain, FormTpmMain);
  Application.Run;
end.

Jens Schumann 14. Okt 2007 12:14

Re: Resourcendatei wird nicht erzeugt
 
Zitat:

Zitat von Luckie
Das hat bei mir, Delphi 6 Personal, noch nie funktioniert.

ich habe die Professional Versionen für D5 und D7. Da funktioniert das einwandfrei. Das mache ich schon solange das ich mich gar nicht mehr daran erinnere wie man Resourcendateien manuell erstellt. :cyclops: Vor langer Zeit habe ich dafür den Borland Resourcenworkshop verwendet.

Jens Schumann 14. Okt 2007 12:15

Re: Resourcendatei wird nicht erzeugt
 
Zitat:

Zitat von taktaky
Verschiebst Du die Zeile in die richtige Stelle!

Unglaublich. Aber es funktioniert.

Vielen Dank

marabu 14. Okt 2007 14:35

Re: Resourcendatei wird nicht erzeugt
 
Hallo,

wer von euch verwendet erfolgreich das Schlüsselwort "implementation" im Projekt-Quelltext - und warum?

Und wer stellt hier mal ein Minimalprojekt ein, welches die automatische Umwandlung eines RC-Skriptes in eine RES-Datei zeigt? Nach euren Darstellungen hier genügen da ja 10 Zeilen. Ich würde mich freuen, wenn mir nach vielen Jahren endlich jemand beweisen könnte, dass dieses Feature kein Mythos ist. Bisher genügte mir das Löschen der irgendwo vorhandenen RES-Datei um das Feature zu deaktivieren.

Nach meinen bisherigen Beobachtungen werden Direktiven in der Form {$R FILENAME.RES FILENAME.RC} an den Resource Linker RLINK32 übergeben. Dazu wird nur der erste Dateiname ausgelesen, der Rest wird verworfen. Das macht der Delphi Preprocessor bei allen Direktiven so - was nach dem dokumentierten Teil steht, wird ignoriert.

Was mich auch noch interessiert: Wie kommt man auf sowas? Gibt es eine Stelle in der Dokumentation, die ich bisher übersehen habe? Oder wird hier ein Treppenwitz aus dem Usenet kolportiert? Ich bin dankbar für jeden Beleg, vorzugsweise Primärquellen.

Freundliche Grüße

turboPASCAL 14. Okt 2007 16:41

Re: Resourcendatei wird nicht erzeugt
 
Zitat:

Zitat von Luckie
Das hat bei mir, Delphi 6 Personal, noch nie funktioniert.

Neh, da muss ich wieder sprechen. Delphi 6 PE macht das ohne Probleme so lange der Path
stimmt. Das eigentliche hinzufügen einer Resourcedatei uberlässt man am besten Delphi selbst
in dem man über <Umschalt> + <F11> in der Dropdownbox die bzw. Resourcedateienformat *.rc
auswählt.

Damit das fuktioniert muss die Anweisung als erstes im Programm
aufgerufen werden. Das Funktioniert in der nonVCL sowie in der VCL.
Mehrfachaufrufe sind auch ohne weteres machbar.

Delphi-Quellcode:
program Fussel;

{$R 'resources\resources01.res' 'resources\resources01.rc'}
{$R 'resources\resources02.res' 'resources\resources02.rc'}

uses
  Windows,
  Messages,
  uMain in '_units\uMain.pas';

// ...
Wenn man eine Resourcedatei an Anderer Stelle einbindet
fuktioniert das erstllen der *.res nicht mehr.

Muetze1 14. Okt 2007 17:39

Re: Resourcendatei wird nicht erzeugt
 
@marabu:
Zitat:

Zitat von Delphi 5
Typ Parameter
Gültigkeitsbereich {$R filename}
{$RESOURCE filename}{$R *.xxx}
{$R filename.RES filename.RC}
Gültigkeitsbereich Lokal
Anmerkungen

Die Direktive $R legt den Namen einer Ressourcendatei fest, die in eine Anwendung oder eine Bibliothek eingebunden werden soll. Dabei muß es sich um eine Windows-Ressourcendatei handeln. Die vorgegebene Namenserweiterung ist RES. Wenn der Dateiname ein Leerzeichen enthält, schließen Sie ihn in halbe Anführungszeichen ein: {$I 'Meine Datei'}.
Das Symbol * hat in $R-Direktiven eine spezielle Bedeutung. Es steht für den Namensstamm (ohne Erweiterung) der Quelltextdatei, in welcher die Direktive enthalten ist. In der Regel weist eine Ressourcendatei einer Anwendung (RES) denselben Namen auf wie die zugehörige Projektdatei (DPR). In diesem Fall bewirkt die Verwendung von {$R *.RES} in der Projektdatei, daß die zugehörige Ressourcendatei mit der Anwendung verknüpft wird. Analog weist eine Formulardatei (.DFM) in der Regel denselben Namen auf wie ihre Unit-Datei (PAS); durch Verwendung von {$R *.DFM} in der PAS-Datei wird die entsprechende Formulardatei mit der Anwendung verknüpft.

{$R Dateiname.RES Dateiname.RC} bewirkt, daß die RC-Datei in der Projektverwaltung von Delphi enthalten ist (hierzu müssen die beiden "Dateinamen" übereinstimmen). Wenn der Benutzer die RC-Datei von der Projektverwaltung aus aufruft, wird der Editor für String-Tabellen aufgerufen.
Wenn Sie die Direktive {$R Dateiname} in einer Unit verwenden, wird der angegebene Dateiname einfach in der resultierenden Unit-Datei gespeichert. Es wird zu diesem Zeitpunkt nicht geprüft, ob der Dateiname korrekt ist und eine vorhandene Datei bezeichnet.

Beim Linken einer Anwendung oder einer Bibliothek (nach dem Compilieren des Programms bzw. der Bibliotheksquelldatei) erfolgt die Verarbeitung aller Ressourcendateien, die in den benutzten Units und im Programm bzw. in der Bibliothek angegeben sind. Dabei werden die Ressourcen aller Ressourcendateien in die ausführbare Datei kopiert. Während der Ressourcenverarbeitung sucht der Linker von Delphi nach den RES-Dateien. Diese Suche erfolgt in dem Verzeichnis, in dem auch das Modul mit der Direktive $R liegt. Außerdem werden alle Verzeichnisse durchsucht, die im Eingabefeld Suchpfad der Registerkarte Verzeichnisse|Bedingungen im Dialogfeld Projektoptionen (bzw. mit der Option /R in der DCC32-Kommandozeile) festgelegt wurden.


turboPASCAL 14. Okt 2007 17:53

Re: Resourcendatei wird nicht erzeugt
 
Zitat:

Zitat von marabu
Und wer stellt hier mal ein Minimalprojekt ein, welches die automatische Umwandlung eines RC-Skriptes in eine RES-Datei zeigt? Nach euren Darstellungen hier genügen da ja 10 Zeilen. Ich würde mich freuen, wenn mir nach vielen Jahren endlich jemand beweisen könnte, dass dieses Feature kein Mythos ist.


Upps, habe ich den Beitrag übersehen ? :gruebel:

Suche dir ein Opensource Programm von mir hier in der DP. Ich mache es schon viele Jahre so
wie beschrieben.

Jens Schumann 14. Okt 2007 17:55

Re: Resourcendatei wird nicht erzeugt
 
Hallo, der Quelltext sieht jetzt so aus. Natürlich ohne implementation

So funktioniert es bei mit D2006 Turbo
Delphi-Quellcode:
program tpm;

uses
  Forms,
  tpm_main in 'tpm_main.pas' {FormTpmMain},
  at_datamodule in 'at_datamodule.pas' {DM: TDataModule};

{$R *.res} 
{$R 'jsl.res' 'jsl.rc'} // habe ich manuell hier her verschoben. Sonst funktioniert es nicht

begin
  Application.Initialize;
  Application.Title := 'TPM';
  Application.CreateForm(TDM, DM);
  Application.CreateForm(TFormTpmMain, FormTpmMain);
  Application.Run;
end.
So funktioniert es bei mit D7 Pro.
Delphi-Quellcode:
program tpm;

{$R 'jsl.res' 'jsl.rc'} // Entsteht durch hinzufügen der rc-Datei

uses
  Forms,
  tpm_main in 'tpm_main.pas' {FormTpmMain},
  at_datamodule in 'at_datamodule.pas' {DM: TDataModule};

{$R *.res} 


begin
  Application.Initialize;
  Application.Title := 'TPM';
  Application.CreateForm(TDM, DM);
  Application.CreateForm(TFormTpmMain, FormTpmMain);
  Application.Run;
end.

marabu 14. Okt 2007 19:40

Re: Resourcendatei wird nicht erzeugt
 
@Thomas:

Danke für das Zitat, Thomas. Sobald ich D5 mal wieder installiert habe, werde ich nochmal versuchen den Text zu lokalisieren. In D7 ist es mir bisher leider noch nicht gelungen ihn sichtbar zu machen, so dass ich fast glaube, dass er dort nicht vorhanden ist. Vielleicht kennt ja jemand einen Zugriffspfad unter D7?

@Matti & @Jens:

Vielen Dank auch für eure Bemühungen um meine Erleuchtung. Ich hatte schon vor mich aus dem Fenster zu stürzen, weil ich es auch nach über einer Stunde nicht hinbekommen habe, aber dann hatte ich plötzlich eine Sternstunde:

Delphi-Quellcode:
{$R 'jsl.res' 'jsl.rc'} // Entsteht durch hinzufügen der rc-Datei
Hinzufügen ist für mich seit Jahren das manuelle Eintragen der Direktive. Jemand wie ich, der gelernt hat über 100 Anschläge pro Minute mit einer Hand (Ex-Schreibfunker) zu tippen, dem Icons und Bilder nichts sagen, kommt nicht so leicht auf die Idee auf den ToolButton oder den Menüeintrag "Dem Projekt hinzufügen..." zu klicken.

Die Funktionalität steckt im eingebauten Project Manager (internes MAKE), die manuell eingetragene Direktive wird so behandelt wie ich es gewohnt bin. Sie kann in D7 auch an beliebiger Stelle stehen und wird überall korrekt verarbeitet, wenn die RC-Datei in die Projektverwaltung eingetragen ist. Ist ja auch klar, wenn man bedenkt, dass diese Direktive nur eingesammelt wird um sie zum Schluss dem Resource Linker zu übergeben. Es wundert mich, dass sich da bei späteren Versionen etwas geändert haben soll.

Interessant ist auch, dass das erzeugte BPG-File (ProjectGroup) dieses Feature nicht an das externe MAKE weitergeben kann:

Code:
#------------------------------------------------------------------------------
VERSION = BWS.01
#------------------------------------------------------------------------------
!ifndef ROOT
ROOT = $(MAKEDIR)\..
!endif
#------------------------------------------------------------------------------
MAKE = $(ROOT)\bin\make.exe -$(MAKEFLAGS) -f$**
DCC = $(ROOT)\bin\dcc32.exe $**
BRCC = $(ROOT)\bin\brcc32.exe $**
#------------------------------------------------------------------------------
PROJECTS = Demo.exe
#------------------------------------------------------------------------------
default: $(PROJECTS)
#------------------------------------------------------------------------------

Demo.exe: Demo.dpr
  $(DCC)
Vielen Dank nochmal an alle. Wer weiß, was mir noch alles verborgen bleibt, weil ich die Menüpunkte und ToolButtons ignoriere.

Freundliche Grüße

turboPASCAL 14. Okt 2007 19:49

Re: Resourcendatei wird nicht erzeugt
 
@marabu, wo wird denn nun bei der makefile der Resourcecompiler aufgerufen ?
Laut Script nicht.

marabu 14. Okt 2007 19:59

Re: Resourcendatei wird nicht erzeugt
 
Das ist genau meine Feststellung: Die der Projektverwaltung zugeführten RC-Dateien tauchen nicht im MAKEFILE auf. Das von mir gezeigte Skript sollte das nur dokumentieren.

Muetze1 14. Okt 2007 20:01

Re: Resourcendatei wird nicht erzeugt
 
@marabu: ich habe den Eintrag (textlich erweitert) auch in D7 zum $R Hilfethema gefunden. Ich quote es hier mal nicht, da du ja D7 drauf hast, wie du schreibst. Also im Index direkt nach $R schauen...

marabu 14. Okt 2007 20:21

Re: Resourcendatei wird nicht erzeugt
 
Danke noch einmal, aber ich scheine mich momentan unsagbar dumm anzustellen: Mein Hilfe-Index bringt eine Auswahlliste:
  • Delphi-Projektdateien
  • Delphi-Unit-Dateien
In keinem der angezeigten Texte finde ich die Inhalte der von dir zitierten D5-Hilfe. Mir fällt auch auf, dass der D7-Hilfe-Index keinen Zugang auf die topics der einzelnen Direktiven bietet - so wie unter D5, wenn ich mich recht erinnere.

Es geht dem Ende zu - ich werde schon allmählich blind.

Muetze1 14. Okt 2007 20:38

Re: Resourcendatei wird nicht erzeugt
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von marabu
Es geht dem Ende zu - ich werde schon allmählich blind.

Ich schätze eher dein Hilfe Index. Hier mal der ScreenShot wie ich zu dem Eintrag komme. Deinen Eintrag habe ich auch, aber den meine ich auch nicht...

marabu 14. Okt 2007 21:01

Re: Resourcendatei wird nicht erzeugt
 
Danke für den ScreenShot - ich schöpfe wieder Mut. Ich schlafe jetzt erst mal eine Runde und werde morgen versuchen meinen Hilfe-Index wieder auf Vordermann zu bringen - da scheint im Laufe der Jahre einiges kaputt gegangen zu sein: Kaum einer deiner Einträge ist bei mir zu sehen. Ist mir bisher gar nicht aufgefallen. Wie auch.

Gute Nacht

marabu 15. Okt 2007 20:25

Re: Resourcendatei wird nicht erzeugt
 
Hallo,

ich möchte kurz vom (vorläufig) glücklichen Ende meiner Irrungen und Wirrungen berichten. Meine D7 Online Hilfe wurde vermutlich von der Setup-Routine einer Komponentensammlung zerschossen. Da ich das jetzt nicht nachvollziehen mag, nenne ich das Produkt erstmal nicht. Die Hilfe-Datei D7DOPTS (darin befinden sich die Topics zu den Direktiven) und andere wurden aus meiner OpenHelp-Konfiguration gekegelt.

Beim Lesen des von Thomas zitierten Topic ist mir aufgefallen, dass in der D5-Hilfe ein Fehler enthalten ist, der auch in D7 nicht korrigiert wurde:

Zitat:

... {$R Dateiname.RES Dateiname.RC} bewirkt, daß die RC-Datei in der Projektverwaltung von Delphi enthalten ist (hierzu müssen die beiden "Dateinamen" übereinstimmen). ...
Genau das habe ich vor langer Zeit ausprobiert und es funktionierte nicht. Der Text erweckt den Eindruck, dass die manuell eingetragene Direktive zur Aufnahme des Ressourcenskripts in die Projektverwaltung führt - was natürlich nicht so ist. Ich vermute, dass es sich dabei um einen Übersetzungsfehler handelt.

Freundliche Grüße

Muetze1 15. Okt 2007 20:42

Re: Resourcendatei wird nicht erzeugt
 
Naja, eher haben sie etwas wichtiges vergessen: Dieser Eintrag muss in der DPR, DPK o.ä. stehen um in der Projektverwaltung aufzutauchen. Die einzelnen Units helfen dabei nicht...

marabu 15. Okt 2007 20:55

Re: Resourcendatei wird nicht erzeugt
 
Hallo Thomas,

meine D7 Installation verhält sich so wie ich es beschreibe: Nur nach der expliziten Aufnahme der RC-Datei in die Projektverwaltung (über Menü oder Toolbar) wird das resource script automatisch übersetzt und eine RES-Datei erzeugt. Die Stelle an der die Direktive steht ist aus den von mir bereits geschilderten Gründen völlig egal, sie muss lediglich syntaktisch korrekt sein. Insbesondere kann ich vor dem Übersetzen die automatisch erzeugte Direktive an eine beliebige Stelle im Quelltext (auch einer anderen Unit) verschieben.

Vielleicht hat ja jemand die englische Fassung der Online Hilfe parat und kann die entprechende Stelle zitieren?

Freundliche Grüße


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