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/)
-   -   Delphi FMX - Falsches Unit Format / $IFDEF (https://www.delphipraxis.net/205306-fmx-falsches-unit-format-%24ifdef.html)

Int3g3r 25. Aug 2020 08:09

FMX - Falsches Unit Format / $IFDEF
 
Guten Tag,

Ich habe mich nun ein wenig mit dem FMX Framework beschäftigt.
Dies ist mein erstes FMX Projekt.

1) Ich kann nun plötzlich die Anwendung nicht mehr für Windows32 Compillieren.
"F2048 Falsches Unit-Format: '%s'" -> Entsteht dies wenn man für Win32 / Android32 keine seperaten DCU-Verzeichnisse verwendet ?
Ausgabeverzeichnis : ..\bin
Ausgabeverzeichniss für Units : ..\dcu

2) {$IFDEF PLATFORM}{$ENDIF} Compiler-Direktiven.
Ich habe solche Direktiven benutzt um Code beim Compillieren für die jeweilige Plattform zu verwednen.

z.b
Delphi-Quellcode:
function iniGetPathAndName: string;
begin
{$IFDEF MSWINDOWS}
  result := ChangeFileExt(ParamStr(0),'.ini');
{$ENDIF}
{$IFDEF ANDROID}
  result := System.IOUtils.TPath.GetDocumentsPath + SysUtils.PathDelim + 'config.ini'
{$ENDIF}
end;
Ist dies die korrekte Anwendung dieser Direktive ?
Wenn ich nun versuche auf Windows32 zu Compillieren hat er nun plötzlich Probleme bei einem MessageDlg : "Undeklarierter bezeichner mtConfirmation".
Ich konnte diesen Code am Anfang des Projekts ohne weiteres Compillieren, die uses sind auch per {$IFDEF} eingebunden.

Gruss Int3g3r

Gruss Int3g3r

haentschman 25. Aug 2020 08:16

AW: FMX - Falsches Unit Format / $IFDEF
 
Moin...:P
Zitat:

Entsteht dies wenn man für Win32 / Android32 keine seperaten DCU-Verzeichnisse verwendet ?
...könnte ich mir auch vorstellen.

Bei mir sieht das so aus: ..\..\_out\dcu\$(Config)\$(Platform) / ..\..\_out\app\$(Config)\$(Platform) (je nachdem wo der _out Ordner, liegt relativ zum Projekt)

himitsu 25. Aug 2020 08:40

AW: FMX - Falsches Unit Format / $IFDEF
 
Nach dem Wechsel nicht Compile, sondern Build.



Klar, es wäre bestimmt keine schlechte Idee, wenn der Compiler sehen würde, dass die DCU für ein anderes System ist und würde sie dann neu kompilieren, so als hätte er einer Änderung an der PAS erkannt.

Bzw. im Header sollten die genutzten DEFINES enthalten sein und dann auch ein ReBuild dieser Unit,
denn auch wenn man in einer INCLUDE-Datei oder den Projektoptionen daran was ändert, dann wird das beim Compile übersehen nicht beachtet.



Wegen dem String (managed type) kommt bei iniGetPathAndName leider keine Warnung, dass das Result nicht initialisiert ist, wenn man für Apple oder Linux kompiliert.
Ich Empfehle dringend ein paar ELSE und wenn keine Bedingung zutrifft, dann einen Compiler-Fehler auszulösen.

Delphi-Quellcode:
begin
  {$IFDEF MSWINDOWS}
    Result := TPath.ChangeExtension(ParamStr(0), 'ini');
  {$ELSE}
    {$IFDEF ANDROID}
      Result := TPath.Combine(TPath.GetDocumentsPath, 'config.ini');
    {$ELSE}
      {$MESSAGE Warn 'not supported'}
    {$ENDIF}
  {$ENDIF}
end;
Delphi-Quellcode:
begin
  {$IF Defined(MSWINDOWS)}
    Result := TPath.ChangeExtension(ParamStr(0), 'ini');
  {$ELSEIF Defined(ANDROID)}  // hier geht auch {$ELSEIF Defined(ANDROID) or Defined(IOS)}
    Result := TPath.Combine(TPath.GetDocumentsPath, 'config.ini');
  {$ELSE}
    {$MESSAGE Warn 'not supported'}  // oder "MESSAGE Fatal", um sofort den Compiler zu soppen
  {$IFEND}
end;

Int3g3r 25. Aug 2020 16:11

AW: FMX - Falsches Unit Format / $IFDEF
 
Danke euch für die Hilfe!

Zitat:

Zitat von himitsu (Beitrag 1472360)
Delphi-Quellcode:
{$IFDEF MSWINDOWS}
{$IF Defined(MSWINDOWS)}

Bewirken diese zwei Zeilen nicht das selbe ? Was ist hier der Unterschied ?

Zitat:

Zitat von himitsu (Beitrag 1472360)
Bzw. im Header sollten die genutzten DEFINES enthalten sein

Werden die DEFINES nicht automatisch gesetzt ?
Kannst du mir ein Beispiel machen wie man diese setzt ?

Gruss Int3g3r

Rollo62 25. Aug 2020 16:16

AW: FMX - Falsches Unit Format / $IFDEF
 
Zitat:

Zitat von Int3g3r (Beitrag 1472372)
Bewirken diese zwei Zeilen nicht das selbe ? Was ist hier der Unterschied ?

Im Prinzip ja,
aber $IF hat noch den Vorteil das es ein

Delphi-Quellcode:
{$ELSEIF Defined(ANDROID)}
erlaubt.

So kann man dan eine Art case/switch aufbauen, was dann relativ übersichtlich ist.

TurboMagic 25. Aug 2020 19:36

AW: FMX - Falsches Unit Format / $IFDEF
 
Zitat:

Zitat von Int3g3r (Beitrag 1472372)

Werden die DEFINES nicht automatisch gesetzt ?
Kannst du mir ein Beispiel machen wie man diese setzt ?

Gruss Int3g3r

Naja, du kannst auch selber defines definieren:

Delphi-Quellcode:
{$DEFINE MeinTollesDefine}

...

{$IFDEF MeinTollesDefine}
DoSomething;
{$ELSE}
DoSomethingElse;
{$ENDIF}
Beliebt ist dann auch solche Defines in Include Dateien (Textdateien mit Endung .inc) zu stecken
und diese Include Dateien in den entsprechenden Units wie folgt inkludieren:

{$I MeinInclude.inc}

Erst ab da gilt dann, was im Include steht, das das quasi an der Stelle der Unit eingefügt wird.

himitsu 25. Aug 2020 20:03

AW: FMX - Falsches Unit Format / $IFDEF
 
Ja, es gibt ein paar vordefinierte Compiler-DEFINEs und -Konstanten.
http://docwiki.embarcadero.com/RADSt...ation_(Delphi)
Aber man kann auch selbst Welche definieren.
DEBUG ist z.B. kein Define des Compilers, sondern kommt aus den Projektoptionen. Das findest in den "Bedingungen" (im Deutschen) des Debug-Profiles.
Und kanns auch global im Projekt Eingene dort einfügen, zusätzlich zu den DEFINE und UNDEF im Code.


Die Conditional-Statements haben ein paar Vorzeile, gegen über den einfachen IFDEF und IFNDEF ... erstmal übersieht man einfach das N , in der Mitte, gegenüber einem alleinstehenden NOT. Und man kann nicht jeweils nur "ein" DEFINE prüfen.

Vor allem das ELSE-IF und auch NOT, AND oder OR können genutzt werden.
Da kann man "echte" Konstanten (keine typisierten Konstanten), Typen und ein paar Compiler-Funktionen verwenden. Defined, Declared, SizeOf


z.B.
Delphi-Quellcode:
{$IF not Declared(irgendwas)}
für Ersatzcode einer Konstante, Funktion oder Typ.
oder
Delphi-Quellcode:
{$IF CompilerVersion < 30.0}
anstatt
Delphi-Quellcode:
{$IFDEF VER290}
und jeden einzelnen Vorfahren zu prüfen.

Stell dir mal vor du müsstest das nur nur mit mehrfach verschachtelten IFDEF/IFNDEF bauen. (Original-Code aus'm Delphi)
Delphi-Quellcode:
{$IFNDEF PC_MAPPED_EXCEPTIONS}
  {$IF defined(ANDROID)}
    {$DEFINE ZCX_BASED_EXCEPTIONS}
  {$ELSEIF defined(MACOS)}
    {$IF defined(CPUARM32)}
      {$DEFINE SJLJ_BASED_EXCEPTIONS}
    {$ELSEIF defined(CPUARM64)}
      {$DEFINE ZCX_BASED_EXCEPTIONS_MACOS}
    {$ELSEIF defined(CPUX64)}
      {$DEFINE ZCX_BASED_EXCEPTIONS_MACOS}
    {$ENDIF}
  {$ELSEIF defined(MSWINDOWS)}
    {$IFDEF EXTERNALLINKER}
      {$DEFINE ZCX_BASED_EXCEPTIONS}
    {$ELSE}
      {$IF defined(CPUX86)}
        {$DEFINE STACK_BASED_EXCEPTIONS}
      {$ELSEIF defined(CPUX64)}
        {$DEFINE TABLE_BASED_EXCEPTIONS}
      {$ELSE}
        {$MESSAGE ERROR 'Unknown platform'}
      {$ENDIF}
    {$ENDIF !EXTERNALLINKER}
  {$ELSEIF defined(LINUX)}
    {$IFDEF EXTERNALLINKER}
      {$DEFINE ZCX_BASED_EXCEPTIONS}
    {$ELSE}
      {$DEFINE PC_MAPPED_EXCEPTIONS}
    {$ENDIF}
  {$ELSE}
    {$MESSAGE ERROR 'Unknown platform'}
  {$ENDIF}
{$ENDIF !PC_MAPPED_EXCEPTIONS}

haentschman 26. Aug 2020 05:42

AW: FMX - Falsches Unit Format / $IFDEF
 
Moin...:P
Zitat:

Ja, es gibt ein paar vordefinierte Compiler-DEFINEs und -Konstanten.
Klär mich mal auf... Was haben IFDEF´s mit dem Ablageort der DCU und dem Fehler zu tun? :gruebel:

himitsu 26. Aug 2020 10:09

AW: FMX - Falsches Unit Format / $IFDEF
 
Wenn man die ändert, werden die nutzenden DCUs nicht neu kompiliert, wenn sie aus einer {$INCLUDE}, den Projektoptionen oder den Compiler-Parametern kommen.
Der Compiler erkennt keine Änderung in der DCU, gegenüber den PAS ... klar, da hat sich ja auch nichts verändert, in der PAS oder in abhängigen DCUs.

Würde eine Änderung an genutztem Compiler und DEFINES erkannt, dann wäre die DCU hier neu kompiliert worden und es gäbe keine Probleme, selbst wenn die DCUs für unterschiedliche Compiler/Options im selben Verzeichnis landen.


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