![]() |
Stringkonstanten als Resourcestring deklarieren
Erst mal wo von ich rede. Man kann String Konstanten einmal so deklarieren:
Delphi-Quellcode:
Oder so:
const
Test = 'Test';
Delphi-Quellcode:
Letzteres bewirkt, dass der String als ResourceString in einem Stringtable in die Ressource der Exe einkompiliert wird.
resourcestring
Test = 'Test'; So, in dem Buch "Delphi in a nutshell" schreibt der Autor dazu: Zitat:
Oder kann mir jemand die Begründung des Autors erklären? |
Re: Stringkonstanten als Resourcestring deklarieren
Zitat:
|
Re: Stringkonstanten als Resourcestring deklarieren
Bei der Initialisierung der RTL Deines Programms wird nach einer DLL gesucht, welche die Daten in der anderen Sprache enthält.
Falls eine passende gefunden wird, werden die Ressourcen aus der DLL anstatt der einkompilierten verwendet. Bei Foo.exe wird im gleichen Verzeichnis nach Foo.deu (dreistellige Sprachkennung (Deutsch (Deutschland)) des Benutzers) und Foo.de (zweistellige Sprachkennung (Deutsch) des Benutzers) gesucht. Wobei das pro Benutzer/Programm unter HKEY_CURRENT_USER\Software\Borland\Locales überschrieben werden kann. ps: Das bezieht sich nicht nur auf Strings, sondern auch auf Forms und andere Ressourcen. Zur einfacheren Verwaltung/Erstellung von Spach-DLLs gibt es in den teureren Delphi-Versionen einen Ressource-DLL Wizard und Language-Tools. |
Re: Stringkonstanten als Resourcestring deklarieren
Aha. Ich brauche also nur eine Sprach DLL beilegen und wenn die Sprache des Stringtables in der Ressource nicht mit der Sprache des Systems übereinstimmt aber eine entsprechende Sprach DLL gefunden wird, dann wird diese genommen?
Die Sprache des Stringtables ist Zitat:
Ich glaube, ich habe es verstanden. :thumb: Ach noch was, wie müsste so eine Sprach DLL aufgebaut sein? |
Re: Stringkonstanten als Resourcestring deklarieren
Haben wir doch schon ausprobiert für den Movie Organizer.
Mit "wir" meine ich den (oft von mir) genervten Chakotay und mich. Nummer 1: Du schaust nach dem Kompilieren nach, welche IDs die Strings bekommen haben. Leider vergibt Delphi IMHO die Nummern selbst, so dass man keinen Einfluss hat. Nehmen wir also an, der String hätte die ID 39678. Dann benutzt du die selbe ID für den lokalisierten String in deinem Ressourcenskript (Stringtable). Nummer 2: Bei VCL-Programmen genügt es, die Texte in den DFMs zu übersetzen. Die Ressource (*.res) mit den Strings und die übersetzten DFMs werden dann in eine leere DLL gespeichert, die die Endung erhält, die man wünscht
Delphi-Quellcode:
Kompilieren, und fertig. Wenn du die DLL dann in das Projektverzeichnis wirfst, in dem sich auch die originale EXE befindet, benutzt das Programm automatisch die Bibliothek, wenn auf dem Zielrechner Deutsch als Sprache eingestellt ist.
{$E deu}
Du schaust dir als Beispiel entweder Nicos und CRAs DelphUBB an, oder du holst dir bei mir den D5-Quellcode des o.g. Programms. |
Re: Stringkonstanten als Resourcestring deklarieren
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
ressourcestring haben außerdem den Vorteil, dass sie (im Gegensatz zu Konstanten) nur einmal in der exe gespeichert werden, auch wenn sie mehrmals verwendet werden. Allerdings dürfen sie maximal 1024 Zeichen lang sein (siehe LoadResString in System.pas) und man kann Resourcestrings nicht aus zuvor definierten Resourcestrings "zusammenbauen".
Delphi-Quellcode:
anbei mal ein Beipiel für 'ne Ressourcen-DLL. Vermutlich braucht man aber die Professional-Version von Delphi, um vernünftig damit arbeiten zu können.
const
cSelect = 'select * from TESTTABLE '; cWhere = 'where NR=:NR'; cSQL = sSelect + sWhere; // das funktioniert resourcestring rSelect = 'select * from TESTTABLE '; rWhere = 'where NR=:NR'; rSQL = sSelect + sWhere; // das nicht |
Re: Stringkonstanten als Resourcestring deklarieren
Klappt noch nicht so ganz.
eng.rc:
Code:
DLL:
STRINGTABLE
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL { 65520, "File %s successfully splitted." }
Code:
Erzeugte Sprach DLL eng.en.
library eng;
{$E en} {$R eng.res} begin end. Den Wert in der Registry habe ich ergänzt: D:\Programmierung\Delphi\Programme\NonVCL\in Bearbeitung\FileSplitter New\Source -> en Beim Starten der Exe nimmt er aber nicht den String aus der Sprach DLL. |
Re: Stringkonstanten als Resourcestring deklarieren
Was ist, wenn du der DLL mal die Endung ".deu" gibst? Geht es dann?
Wie dem auch sei, @Luckie. Aus dem Grund haben wir mit Chris den MO in Englisch gestaltet. Sollte sich das Programm wirklich mal richtig verbreiten (@Chris: ;)), dann haben die anderen wenigstens die englische Version und müssen sich nicht mit der deutschen Sprache rumschlagen. Und auf einem deutschen System wird dann eben die DEU-Ressource verwendet. |
Re: Stringkonstanten als Resourcestring deklarieren
Aha. Exename.deu, dann geht es. Da stimmt was mit dem Registry Key nicht. Im Pfad sind nämlich Leerzeichen. Mal sehen.
[edit] Auch wenn ich die Leerzeichen im Pfad entferne geht es nicht. Hmpf. :evil: |
Re: Stringkonstanten als Resourcestring deklarieren
Hm, ich bekomme das einfach nicht gebacken. Wenn ich der Sprach DLL die endung "deu2 oder "de2 gebe, dann nimmt er die. Aber erscheint die Registry Einstellungen zu ignorieren.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:51 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz