Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   define in anderer Unit wird nicht 'erkannt' (https://www.delphipraxis.net/162774-define-anderer-unit-wird-nicht-erkannt.html)

Viktorii 5. Sep 2011 10:47

Delphi-Version: XE

define in anderer Unit wird nicht 'erkannt'
 
Moin.

Wieso wird das define von Unit2 in Unit1 nicht 'erkannt'?

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Unit2;

type
  TForm1 = class(TForm)
  private
{$ifdef MyDef}
    procedure MyProc();
{$endif}
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.MyProc;
begin

end;

end.
Delphi-Quellcode:
unit Unit2;

interface

{$define MyDef}

implementation

end.
Ich möchte mit einem define in einer Unit bedingtes Kompilieren in verschiedenen Units erreichen... Wie kann ich das hinbekommen?

jfheins 5. Sep 2011 10:50

AW: define in anderer Unit wird nicht 'erkannt'
 
Das define gilt nur innerhalb der Unit.
siehe auch http://www.delphipraxis.net/18752-globale-compiler-directive-wie-%7B$define-test%7D.html

Viktorii 5. Sep 2011 11:12

AW: define in anderer Unit wird nicht 'erkannt'
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von jfheins (Beitrag 1121763)
Das define gilt nur innerhalb der Unit.
siehe auch http://www.delphipraxis.net/18752-globale-compiler-directive-wie-%7B$define-test%7D.html

*gnümpf*

Okay, mit dem Include wäre ja schon mal eine Lösung, aber wo kann ich denn in den Projektoptionen unter Delphi XE sowas anlegen, wie in dem verlinkten Thread beschrieben?

Dort wo ich es versucht habe, klappt das nicht (siehe Anhang)

uligerhardt 5. Sep 2011 11:16

AW: define in anderer Unit wird nicht 'erkannt'
 
Zitat:

Zitat von Viktorii (Beitrag 1121769)
Dort wo ich es versucht habe, klappt das nicht (siehe Anhang)

Sollte schon so klappen. Hast du nach der Änderung der Optionen das Projekt komplett neu erzeugt? Sonst wirkt das Define nicht.

Viktorii 5. Sep 2011 11:21

AW: define in anderer Unit wird nicht 'erkannt'
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich denke schon, mit Shift+F9

Scheint aber nicht zu gehen (siehe erneut Anhang)

Uwe Raabe 5. Sep 2011 11:50

AW: define in anderer Unit wird nicht 'erkannt'
 
Zitat:

Zitat von Viktorii (Beitrag 1121769)
Dort wo ich es versucht habe, klappt das nicht (siehe Anhang)

Das sind ja auch die Bedingungen für de Resourcen-Compiler!

himitsu 5. Sep 2011 12:02

AW: define in anderer Unit wird nicht 'erkannt'
 
Glabale DEFINES kann man über die Projektoptionen angeben.


Wenn "Conditional Expessions" im Compiler vorhanden sind, dann kann man statt auf Defines auch auf Typen/Constanten und Co. prüfen.

Delphi-Quellcode:
// Unit 1
{$IFDEF IRGENDWAS}
  const MyIRGENDWAS = True;
{$ENDIF}

// Unit 2
uses Unit1;
{$IF Declared(MyIRGENDWAS)}  // kann eine Konstante, Klasse oder Variable sein
  ...
{$IFEND}
Delphi-Quellcode:
// Unit 1
const MyIRGENDWAS = {$IFDEF IRGENDWAS}True{$ELSE}False{$ENDIF};


// Unit 2
uses Unit1;
{$IF MyIRGENDWAS}
  ...
{$IFEND}

Viktorii 5. Sep 2011 12:32

AW: define in anderer Unit wird nicht 'erkannt'
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1121784)
Zitat:

Zitat von Viktorii (Beitrag 1121769)
Dort wo ich es versucht habe, klappt das nicht (siehe Anhang)

Das sind ja auch die Bedingungen für de Resourcen-Compiler!

Jo, da hast Du recht. Habe nur nach 'Verzeichnisse und Bedingungen' geschaut und übersehen, dass das für den Ressourcen-Compiler ist. :roteyes:

Habe mittlerweile die richtige Stelle gefunden: Delphi-Compiler->Bedingungen.

Vielen Dank an alle.

himitsu 5. Sep 2011 12:59

AW: define in anderer Unit wird nicht 'erkannt'
 
Zitat:

Zitat von Viktorii (Beitrag 1121799)
Habe mittlerweile die richtige Stelle gefunden: Delphi-Compiler->Bedingungen.

Wenn sich diese Definition "öfters" mal ändern könnte, dann nimm Abstand davon.

Der Compiler bekommt diese Änderungen nicht mit und wenn sich sonst nichts in einer Unit geändert hat, dann wird sie nicht neu kompiliert.
Da hilft dann nur neu "erzeugen", was man gerne mal vergißt. :oops:
(macht voll Spaß, wenn man diese Condition in mehreren Units verwendet und diese am Ende unterschiedlich kompiliert wurden)

Ein Include-Datei wird dagegen immer beachtet.




Mit sowas hatte ich mir mal beholfen, als ich das DEFINE in eine andere Unit weiterreichen wollte.
Delphi-Quellcode:
// ########## Unit 1 ##############################

{$DEFINE IRGENDWAS}  // oder in den Projektoptionen

...

{$IFDEF IRGENDWAS}
  const IRGENDWAS_MARKER = True;
  {$MESSAGE Hint 'Define "IRGENDWAS" wurde gesetzt.'}  // nur sichtbar, wenn die Unit gerade kompiliert wurde
{$ENDIF}

...

{$IFDEF IRGENDWAS}...{$ENDIF}

// ########## Unit 2 ##############################

uses Unit1;

{$UNDEF IRGENDWAS}
{$IF Declared(IRGENDWAS_MARKER)}
  {$DEFINE IRGENDWAS}
{$IFEND}

...

{$IFDEF IRGENDWAS}...{$ENDIF}

CocoPops 3. Apr 2014 17:28

AW: define in anderer Unit wird nicht 'erkannt'
 
Hallöchen allle DPler.

Dasselbe Problem habe ich momentan auch.
Ich habe zwei Projekte und beide Projekte nutzen dieselbe Unit (kein Form, nur Methoden und ein paar Konstanten sind vorhanden).

In Projekt A binde ich
Delphi-Quellcode:
{$I include.inc}
ein.
In dieser Datei steht
Delphi-Quellcode:
{$DEFINE PROJEKT}
.

Und in dieser Unit, die beide Projekte nutzen, steht dann:
Delphi-Quellcode:
uses
 {$IFDEF PROJEKT} Forms, {$ENDIF} ...

 // viel code
 // und am ende eine Methode, welche enthält:

{$IFDEF PROJEKT}
 Application.ProcessMessages;
 showmessage('X');
{$ENDIF}
Application.ProcessMessages; wird nie aufgerufen und showmessage('X'); ebenfalls nicht. Zudem ist die Unit Dialogs nicht einmal in der Uses-Liste. Kompiliert wird es dennoch.
Aber es funktioniert nicht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:09 Uhr.
Seite 1 von 2  1 2      

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