Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Anderes Verhalten der Bedingungen in RAD2009? (https://www.delphipraxis.net/136441-anderes-verhalten-der-bedingungen-rad2009.html)

messie 30. Jun 2009 15:33


Anderes Verhalten der Bedingungen in RAD2009?
 
Moin,

ich habe beim Umstellen eines Projektes von D6 auf RAD2009 ein merkwürdiges Verhalten.

In der einen Datei habe ich

Delphi-Quellcode:
{$IFDEF EINS}
wert_a := 0;
{$ELSE IFDEF ZWEI}
wert_a := LeseWert_a(inifile);
{$ENDIF}
in einer weiteren Datei steht dann
Delphi-Quellcode:
{$IFDEF ZWEI}
function LeseWert_a(inifile : WideString) : double;
{$ENDIF}
Im Projekt ist derzeit ZWEI definiert. Der Compiler geht in die Zuweisung von wert_a und meckert, dass er die Routine LeseWert_a() nicht kennt (Undeklarierter Bezeichner).

Die Behandlung der Bedingung in D6 und 2009 scheint dort unterschiedlich zu sein. Liegt das daran, dass man die Deklaration der Routine für externe Nutzung nicht mehr in einem solchen Block behandeln darf? Die Routine ist nicht Member eines Objects.

Grüße, Messie

samso 30. Jun 2009 16:03

Re: Anderes Verhalten der Bedingungen in RAD2009?
 
Nein, das kann eigentlich nicht sein. Ich habe zich solcher IFDEF's in meinem Quelltext - das spielt. Allerdings kommt die "Strukturansicht" mit den IFDEF's nicht klar.

fkerber 30. Jun 2009 16:08

Re: Anderes Verhalten der Bedingungen in RAD2009?
 
Hi!

Kannst du mal ein kleines Testpackage zum ausprobieren anhängen, in dem das Problem auftritt.

Grüße, Frederic

Uwe Raabe 30. Jun 2009 16:16

Re: Anderes Verhalten der Bedingungen in RAD2009?
 
Versuch mal dies:

Delphi-Quellcode:
{$IFDEF EINS}
wert_a := 0;
{$ELSEIF Defined(ZWEI)}
wert_a := LeseWert_a(inifile);
{$IFEND}
Man beachte auch den veränderten Abschluss mit $IFEND!

Bei einem Konstrukt wie {$ELSE IFDEF xyz} wird das IFDEF eigentlich komplett ignoriert.

himitsu 30. Jun 2009 16:17

Re: Anderes Verhalten der Bedingungen in RAD2009?
 
Delphi-Quellcode:
{$ELSE IFDEF ZWEI}
das "IFDEF ZWEI" wird vom Compiler mehr wie ein Kommentar behandelt und nicht ausgewertet ...
man kann auch genausogut sowas machen:
Delphi-Quellcode:
{$IFDEF ZWEI}

{$ENDIF ZWEI}
wobei hier das bei ENDIF ebenfalls als Kommentar angesehn wird.

wenn der Compiler das $IF-Konstrukt unterstützt, dann ginge es so
Delphi-Quellcode:
{$IF Defined(EINS)}

{$ELSEIF Defined(ZWEI)}

{$IFEND}
ansonsten bleibt dir nur dieser Weg:
Delphi-Quellcode:
{$IFDEF EINS}

{$ELSE}
  {$IFDEF ZWEI}

  {$ENDIF}
{$ENDIF}

messie 30. Jun 2009 18:32

Re: Anderes Verhalten der Bedingungen in RAD2009?
 
Das komische daran ist, dass der erste Teil mit dem $ELSE IFDEF im Ausgangspost hier in verschiedenen Varianten diskutiert wird - der Teil wird aber vom Compiler richtig erkannt.
Es ist der untere Teil
Delphi-Quellcode:
{$IFDEF ZWEI}
function LeseWert_a(inifile : WideString) : double;
{$ENDIF}
der nicht kompiliert wird und dass deshalb aus der anderen Datei nicht darauf zugegriffen werden kann. Die Bedingung ist unter Projekt/Optionen eingestellt und sollte damit ja global gültig sein.
Ich habe mal zur Probe die Direktiven von der Struktur her gleich gemacht:
Delphi-Quellcode:
{$IFDEF EINS}
//nix
{$ELSE IFDEF ZWEI}
function LeseWert_a(inifile : WideString) : double;
{$ENDIF}
und damit funktioniert es, die unter Bedingung ZWEI eingebundenen Routinen werden kompiliert.

:wiejetzt:

In der D6-Hilfe stand immer, $IFDEF wäre veraltet. Das steht in der 2009-Hilfe aber nicht mehr so drin.
Ich vermute mal, ich würde es so zum Laufen bekommen, würde aber gerne wissen, WARUM.
Ich versuche das morgen mal so zu isolieren, dass man es anhängen kann (oder bis dahin hat es jemand erklären können).

Grüße, Messie

Uwe Raabe 30. Jun 2009 18:44

Re: Anderes Verhalten der Bedingungen in RAD2009?
 
Zitat:

Zitat von messie
Das komische daran ist, dass der erste Teil mit dem $ELSE IFDEF im Ausgangspost hier in verschiedenen Varianten diskutiert wird - der Teil wird aber vom Compiler richtig erkannt.

Das sehe ich aber nicht so! Der Code wird nicht deswegen kompiliert, weil ZWEI definiert ist, sondern weil EINS nicht definiert ist!

messie 30. Jun 2009 19:06

Re: Anderes Verhalten der Bedingungen in RAD2009?
 
Das leuchtet ein. Aber warum wird dann im Fall des alleinstehenden $IFDEF ZWEI nicht geprüft?

:gruebel:

Nach der nochmaligen Untersuchung der Menüs stelle ich fest, dass ich die Bedingung für den Ressourcencompiler angegeben habe. :oops:
Der bietet sich beim Öffnen gleich so an, während man die Bedingungen für den Delphi-Compiler erst im Kleingedruckten suchen muss.

Also eine solcher Menüaufbau - das wäre ja fast schon ein Punkt für den Thread
Allgemein unbeliebtes Verhalten von Anwendungen


Danke für die Erleuchtung!

Messie

samso 30. Jun 2009 19:12

Re: Anderes Verhalten der Bedingungen in RAD2009?
 
Also ich glaube ja, <Spekulation>das "Zwei" bei den Optionen nicht unter "Delphi-Compiler", sondern unter "Resource-Compiler" eingestellt ist </Spekulation> und es deshalb nicht funktioniert.

edit: zu spät - da lag ich zwar richtig, aber er hat es schon selbst gesehen...

messie 30. Jun 2009 19:23

Re: Anderes Verhalten der Bedingungen in RAD2009?
 
Zitat:

Zitat von samso
Also ich glaube ja, <Spekulation>das "Zwei" bei den Optionen nicht unter "Delphi-Compiler", sondern unter "Resource-Compiler" eingestellt ist </Spekulation> und es deshalb nicht funktioniert.

edit: zu spät - da lag ich zwar richtig, aber er hat es schon selbst gesehen...

Ja, das grinst einen da ganz verführerisch an. Und ich hätte schon erwartet, das gleiche Einstellungen auf der gleichen Node-Ebene sind und sich optisch gleich darstellen.

Danke, Messie


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