AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

FMX - Falsches Unit Format / $IFDEF

Ein Thema von Int3g3r · begonnen am 25. Aug 2020 · letzter Beitrag vom 26. Aug 2020
Antwort Antwort
Int3g3r

Registriert seit: 28. Nov 2018
Ort: Schweiz
118 Beiträge
 
Delphi 10.3 Rio
 
#1

FMX - Falsches Unit Format / $IFDEF

  Alt 25. Aug 2020, 09:09
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
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#2

AW: FMX - Falsches Unit Format / $IFDEF

  Alt 25. Aug 2020, 09:16
Moin...
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)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#3

AW: FMX - Falsches Unit Format / $IFDEF

  Alt 25. Aug 2020, 09:40
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;
$2B or not $2B

Geändert von himitsu (25. Aug 2020 um 09:54 Uhr)
  Mit Zitat antworten Zitat
Int3g3r

Registriert seit: 28. Nov 2018
Ort: Schweiz
118 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: FMX - Falsches Unit Format / $IFDEF

  Alt 25. Aug 2020, 17:11
Danke euch für die Hilfe!

Delphi-Quellcode:
{$IFDEF MSWINDOWS}
{$IF Defined(MSWINDOWS)}
Bewirken diese zwei Zeilen nicht das selbe ? Was ist hier der Unterschied ?

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

Geändert von Int3g3r (25. Aug 2020 um 17:14 Uhr)
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.116 Beiträge
 
Delphi 12 Athens
 
#5

AW: FMX - Falsches Unit Format / $IFDEF

  Alt 25. Aug 2020, 17:16
Bewirken diese zwei Zeilen nicht das selbe ? Was ist hier der Unterschied ?
Im Prinzip ja,
aber $IF hat noch den Vorteil das es ein

{$ELSEIF Defined(ANDROID)} erlaubt.

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

Geändert von Rollo62 (25. Aug 2020 um 17:20 Uhr)
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.960 Beiträge
 
Delphi 12 Athens
 
#6

AW: FMX - Falsches Unit Format / $IFDEF

  Alt 25. Aug 2020, 20:36

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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#7

AW: FMX - Falsches Unit Format / $IFDEF

  Alt 25. Aug 2020, 21:03
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. {$IF not Declared(irgendwas)} für Ersatzcode einer Konstante, Funktion oder Typ.
oder {$IF CompilerVersion < 30.0} anstatt {$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}
$2B or not $2B

Geändert von himitsu (25. Aug 2020 um 21:17 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#8

AW: FMX - Falsches Unit Format / $IFDEF

  Alt 26. Aug 2020, 06:42
Moin...
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?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#9

AW: FMX - Falsches Unit Format / $IFDEF

  Alt 26. Aug 2020, 11:09
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.
$2B or not $2B

Geändert von himitsu (26. Aug 2020 um 11:11 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:28 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