Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Compilerschalter für VCL-Sprache (https://www.delphipraxis.net/184862-compilerschalter-fuer-vcl-sprache.html)

himitsu 25. Apr 2015 19:42

Delphi-Version: XE3

Compilerschalter für VCL-Sprache
 
Kann man irgendwie "einfach" entscheiden, mit welcher Sprachversion der Delphi-Compiler grade compiliert?
BDSSetLang > Bibliothekssprache

Die Grundidee besteht darin, eigene Konstanten in der selben Sprache wie die RTL/VCL mitzugeben.

Erster billiger Versuch war,
Delphi-Quellcode:
uses
  SysConst;

resourcestring
  {$IF SUnknown = '<unbekannt>'}
    {$DEFINE LANG_DE}
    SAccessDenied = 'Zugriff verweigert';
  {$ELSEIF SUnknown = '<inconnu>'}
    {$DEFINE LANG_FR}
    SAccessDenied = 'Accès refusé';
  {$ELSEIF SUnknown = '<&#26410;&#30693;>'}
    {$DEFINE LANG_JA}
    SAccessDenied = '&#12450;&#12463;&#12475;&#12473;&#25298;&#21542;';
  {$ELSE SUnknown = '<unknown>'}
    {$DEFINE LANG_EN}
    SAccessDenied = 'Access denied';
  {$ENDIF}
was aber natürlich nicht ging, denn
Delphi-Quellcode:
const
  X = 'abc';
  Y: string = 'abc';

resourcestring
  Z = 'abc';

{$IF X = 'abc'} {$IFEND}  // geht
{$IF Y = 'abc'} {$IFEND}  // [dcc32 Fehler] E2026 Konstantenausdruck erwartet
{$IF Z = 'abc'} {$IFEND}  // [dcc32 Fehler] E2026 Konstantenausdruck erwartet
Und ich hab überall nur Resourcestrings gefunden. (System.SysConst, System.RTLConsts, FMX.Consts usw.)

Ideal wäre ein Compilerschalter (DEFINE) oder eine Konstante ala CompilerVersion/RTLVersion, welches direkt vom Compiler kommt.

Grade eben hab ich zumindestens einwas hinbekommen, daß sich dann so auswerten liese:
Delphi-Quellcode:
{$IFDEF LANG_DE}
  *
{$ENDIF}
bzw.
Delphi-Quellcode:
{$IF Defined(LANG_DE)}
  SAccessDenied = 'Zugriff verweigert';
{$ELSEIF Defined(LANG_FR)}
  SAccessDenied = 'Accès refusé';
{$ELSEIF Defined(LANG_JA)}
  SAccessDenied = '&#12450;&#12463;&#12475;&#12473;&#25298;&#21542;';
{$ELSE Defined(LANG_EN)}
  SAccessDenied = 'Access denied';
{$ENDIF}
Aber für eine Fremdkomponente ohne Installer ist es halt etwas unpraktisch, wenn man erst
Delphi-Quellcode:
LANG_$(LangDir)
in Projektooptionen > Delphi-Compiler > Bedingungen einfügen muß.
Auch der "offizielle" Weg ist bissl unpraktisch, also wo man für die zwei Strings jeweils mehrere Units erstellt, diese in Unterverzeichnisse verfrachtet und dann diese Verzeichnisse auch noch in den Bibliothekspfaden einrichten muß.

Dejan Vu 26. Apr 2015 20:36

AW: Compilerschalter für VCL-Sprache
 
Willst Du so tatsächlich unterschiedliche Sprachen unterstützen, oder geht es Dir nur um das 'wie' und 'ob'?

himitsu 26. Apr 2015 21:35

AW: Compilerschalter für VCL-Sprache
 
Ich benutzte gern die Sprachkonstanten der RTL und VCL,
vorallem für einfache Fehlermeldungen (Exceptions) in kleinen Komponenten.

Aber manchmal fehlt dann doch etwas.
Und diese paar zusätzlichen Strings sollten dann natürlich in der selben Sprache sein, wie die RTL/VCL-Konstanten. (z.B. die Buttonbeschriftung auf MessageBoxen)
Da Delphi nur 4 Sprachen versteht, wäre das auc nicht all zu aufwähndig, wenn man nur wüsste, in welcher Sprache diese Konstanten sind.
Ich könnte das zwar auch erst zur Laufzeit bestimmen, aber zur CompilileTime wäre es auch schon nett.

Bei Programmen, welche nicht gegen die RTL/VCL-Packages gelinkt sind, ist eh nur die eine Sprache drin.
[add] Hmmm, jetzt fällt mir ein, daß ich dann auch noch rausbekommen müsste, ob nicht auch noch Packages im Spiel sind. Und bei Packages kann man das natürlich nicht zur CompileTime bestimmen.



Ich finde es einfach nur unschön, wenn meine Komponenten nicht in der selben Sprache sprechen, wie die RTL/VCL.
Bisher hab ich einfach nur das alles in englisch gehalten (meistens), aber glücklich war ich mit dieser Lösung nie.

Uwe Raabe 26. Apr 2015 21:49

AW: Compilerschalter für VCL-Sprache
 
Zitat:

Zitat von himitsu (Beitrag 1299343)
Bei Programmen, welche nicht gegen die RTL/VCL-Packages gelinkt sind, ist eh nur die eine Sprache drin.
[add] Hmmm, jetzt fällt mir ein, daß ich dann auch noch rausbekommen müsste, ob nicht auch noch Packages im Spiel sind. Und bei Packages kann man das natürlich nicht zur CompileTime bestimmen.

Anstatt hier allzu verrenkte Klimmzüge zu veranstalten, solltest du vielleicht doch den offiziellen Weg über die Resourcen-DLLs gehen. Da wird dann ebenso wie für die RTL/VCL-Packages die Laufzeit-Sprache anhand bekannter Kriterien ermittelt. Das gilt dann insbesondere auch für die EXE und dann spielt es keine Rolle, ob man mit Packages compiliert oder nicht.


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