Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Compilerschalter auslesbar? (https://www.delphipraxis.net/140406-compilerschalter-auslesbar.html)

DeddyH 17. Sep 2009 18:36


Compilerschalter auslesbar?
 
Moin,

ich steh gerade auf dem Schlauch. Ich möchte einen Compilerschalter (Rangechecks) temporär umstellen, diesen aber später wieder in den alten Zustand versetzen. Dazu müsste ich ja den alten Zustand erst einmal erfragen. Geht das überhaupt und wenn ja, wie? Ich meinte das in der Art
Delphi-Quellcode:
{$IF RANGECHECKS}
  {$DEFINE WAR_AN}
    {$RANGECHECKS OFF}
    //Hier der entsprechende Code
  {$IFDEF WAR_AN}
    {$RANGECHECKS ON}
  {$ENDIF}

himitsu 17. Sep 2009 18:41

Re: Compilerschalter auslesbar?
 
ja > [oh]$IFOPT[/oh] , aber das geht nur bei kompilerschaltern, welche aus einem Buchstaben mit + oder - bestehen

in deinem Fall geht das , da {$RANGECHECKS ON} = {$R+}

und du wirst es nicht glauben, aber rate mal, welches Beispiel die OH zu [oh]$IFOPT[/oh] hat?

Delphi-Quellcode:
{$IFOPT R+}
  Writeln('Mit Bereichsprüfung compiliert');
{$ENDIF}

DeddyH 17. Sep 2009 19:08

Re: Compilerschalter auslesbar?
 
Danke sehr.

Hawkeye219 17. Sep 2009 19:09

Re: Compilerschalter auslesbar?
 
Hallo Detlef,

ich habe mir zu diesem Zweck ein paar Include-Dateien angelegt:

Code:
Datei "R+.pas"

  {$ifopt R-}
    {$undef RangeCheckWasOn}
    {$R+}
  {$else}
    {$define RangeCheckWasOn}
  {$endif}

Datei "R-.pas"

  {$ifopt R+}
    {$define RangeCheckWasOn}
    {$R-}
  {$else}
    {$undef RangeCheckWasOn}
  {$endif}

Datei "R=.pas"

  {$ifdef RangeCheckWasOn}
    {$R+}
  {$else}
    {$R-}
  {$endif}
Die Dateien liegen in einem Bibliotheksverzeichnis und sind somit für alle Projekte verfügbar.

Anwendung:

Delphi-Quellcode:
{$I R+} // RangeCheck einschalten
...
{$I R=} // RangeCheck auf vorigen Zustand setzen
Das Konzept stammt noch aus den Zeiten von Turbo Pascal. Damals wurde der Schalter "=" allerdings noch direkt vom Compiler unterstützt, so dass der Umweg über die Include-Dateien nicht notwendig war.

Gruß Hawkeye

DeddyH 17. Sep 2009 19:15

Re: Compilerschalter auslesbar?
 
Auch Dir Danke, ich hab es jetzt so:
Delphi-Quellcode:
uses ...,
    {$IFOPT R+}
    {$DEFINE WAS_CHECKED}
    {$R-}
    {$ENDIF}UnitOhneBereichsprüfung
    {$IFDEF WAS_CHECKED}
    {$R+}
    {$ENDIF};
Ob ich da richtig gedacht habe, wird sich dann zeigen ;)

himitsu 17. Sep 2009 19:21

Re: Compilerschalter auslesbar?
 
Nicht ganz, diese Option ist nur unitintern, also dürfte dieses keine Auswirkungen auf die zwischenliegende Unit haben.

DeddyH 17. Sep 2009 19:24

Re: Compilerschalter auslesbar?
 
Da bin ich mir eben nicht sicher, ich hatte vorher vor dem Einbinden {$RANGECHECKS OFF} und dahinter dann wieder das Einschalten. Das hat funktioniert. Zur Gegenprobe die Schalter auskommentiert, und es kamen Fehlermeldungen. Also wieder entkommentiert und alles ist OK. Zufall?

himitsu 17. Sep 2009 19:30

Re: Compilerschalter auslesbar?
 
Ich hätte eher an Zufall gedacht, denn sonst könnte man doch die VCL neu kompilieren, nur indem man andere Optionen vor dem Einbinden setzt?

Es ist aber auch schlecht/garnicht erklärt welche Option nun von wo bis wo genau ihre Auswirkungen hat :?

DeddyH 17. Sep 2009 19:32

Re: Compilerschalter auslesbar?
 
Tja, ich weiß es auch nicht. Wenn es jetzt so funktioniert wie gedacht, bleibt es so, ansonsten muss ich mir etwas anderes überlegen.


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