![]() |
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:
Ist dies die korrekte Anwendung dieser Direktive ?
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; 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 |
AW: FMX - Falsches Unit Format / $IFDEF
Moin...:P
Zitat:
Bei mir sieht das so aus: ..\..\_out\dcu\$(Config)\$(Platform) / ..\..\_out\app\$(Config)\$(Platform) (je nachdem wo der _out Ordner, liegt relativ zum Projekt) |
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; |
AW: FMX - Falsches Unit Format / $IFDEF
Danke euch für die Hilfe!
Zitat:
Zitat:
Kannst du mir ein Beispiel machen wie man diese setzt ? Gruss Int3g3r |
AW: FMX - Falsches Unit Format / $IFDEF
Zitat:
aber $IF hat noch den Vorteil das es ein
Delphi-Quellcode:
erlaubt.
{$ELSEIF Defined(ANDROID)}
So kann man dan eine Art case/switch aufbauen, was dann relativ übersichtlich ist. |
AW: FMX - Falsches Unit Format / $IFDEF
Zitat:
Delphi-Quellcode:
Beliebt ist dann auch solche Defines in Include Dateien (Textdateien mit Endung .inc) zu stecken
{$DEFINE MeinTollesDefine}
... {$IFDEF MeinTollesDefine} DoSomething; {$ELSE} DoSomethingElse; {$ENDIF} 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. |
AW: FMX - Falsches Unit Format / $IFDEF
Ja, es gibt ein paar vordefinierte Compiler-DEFINEs und -Konstanten.
![]() 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:
für Ersatzcode einer Konstante, Funktion oder Typ.
{$IF not Declared(irgendwas)}
oder
Delphi-Quellcode:
anstatt
{$IF CompilerVersion < 30.0}
Delphi-Quellcode:
und jeden einzelnen Vorfahren zu prüfen.
{$IFDEF VER290}
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} |
AW: FMX - Falsches Unit Format / $IFDEF
Moin...:P
Zitat:
|
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 03:18 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