2013-07-15 7 views
5

Bedingte Definitionen in Delphi sind auf 255 Zeichen begrenzt. Das bedeutet, dass wenn Sie mehr als 255 Zeichen von Defines haben, diese ignoriert werden. Z.B.Wie überwinden 255 Zeichen Grenze für bedingte definiert?

enter image description here

So der Satz von bedingten definiert:

Win32API;AlarmServerEngineVersion27;ImNotUsingOlderSimpleThread;EnableJclExceptionTracking;SaveExceptionsToDatabase;ShowExceptionForm;SNAPIN_NEEDS_NODE_DESCRIPTOR;VIRTUAL_TREES_MOUSE_DOWN_FOCUS_LAST;UseSQLServerLocking;SnapInFactoryFormClassIsOptional;Strict;SIFFCIO;Sqm 

Die letzten 3 definiert ignoriert werden.

Was ich brauche, ist eine Möglichkeit, bedingte Definitionen im Projekt zu definieren, ohne auf 255 Zeichen beschränkt zu sein.

ich dachte vielleicht die bedingten definiert in das Projekt Quelldatei bewegen, vielleicht in Include-Datei enthalten durch:

program ConsotoManager; 

{$R *.RES} 
{$R '..\Resource\Wumpa.res' '..\Resource\Wumpa.rc'} 
{$DEFINE Win32API} 
... 
{$DEFINE Sqm} 
{$DEFINE Strict} 

uses 
    FastMM4, 
    Windows, 
    SysUtils, 

Leider spielt es keine Arbeit. Der Grund, warum es nicht funktioniert, ist, dass Sie keine Definitionen für bedingte Definitionen verwenden können. Definiert nur zuletzt bis zum Ende der Datei.

Also, wie überwinde ich die 255 Zeichen Grenze auf Conditional Definiert in Delphi?


Das Problem ist natürlich, wie Projekt Ebene definiert haben, während Quellcodedateien (gemeinsam genutzte Dateien sind in ihren eigenen Verzeichnissen, außerhalb des Projektordners) haben geteilt.

Antwort

0

Mein Delphi ist ein wenig eingerostet, aber ich glaube, Sie können eine Definition erstellen, die auch alle anderen definiert, so dass Sie nur nach einer Bedingung suchen müssen.

{$IF Defined(Win32API) 
    AND Defined(AlarmServerEngineVersion27) 
    AND Defined(ImNotUsingOlderSimpleThread) 
    AND Defined(EnableJclExceptionTracking) 
    AND Defined(SaveExceptionsToDatabase) 
    AND Defined(ShowExceptionForm) 
    AND Defined(SNAPIN_NEEDS_NODE_DESCRIPTOR) 
    AND Defined(VIRTUAL_TREES_MOUSE_DOWN_FOCUS_LAST) 
    AND Defined(UseSQLServerLocking) 
    AND Defined(SnapInFactoryFormClassIsOptional) 
    AND Defined(Strict) 
    AND Defined(SIFFCIO) 
    AND Defined(Sqm) 
} 
{$DEFINE I_AM_TOTALLY_READY} 
{$IFEND} 
9

Sie sind fast da mit den Definitionen in der Projektdatei, aber denken Sie daran, dass Delphi nicht C ist - der Compiler liest nicht jede erwähnte Einheit nacheinander jedes Mal, wenn etwas kompiliert, als ob die ganze Dateien wurden textuell zusammengefügt, sodass die in der Projektdatei definierten Objekte außerhalb dieser Datei nicht sichtbar sind.

jedoch Delphi ist wie C, dass sie eine Richtlinie include genannt unterstützt, dass tut weil es die genannte Datei auf jeder Kompilierung neu zu lesen. Lass uns das benutzen.

Zuerst legen Sie alle Ihre Definitionen in eine separate Textdatei. Nennen wir es Defines.inc.

{$DEFINE Win32API} 
... 
{$DEFINE Sqm} 
{$DEFINE Strict} 

umfassen dann die Datei in alle die Quelldateien, die jede dieser Definitionen benötigen.

program ConsotoManager; 

{$R *.RES} 
{$R '..\Resource\Wumpa.res' '..\Resource\Wumpa.rc'} 
{$INCLUDE Defines.inc} 

uses 
    FastMM4, 
    Windows, 

Jetzt können Sie die Liste in Ihren Projektoptionen löschen und stattdessen alle Definitionen hinzufügen, die Sie für diese Datei benötigen. Wenn Sie diese Datei ändern, müssen Sie möglicherweise eine vollständige Erstellung (anstelle einer einfachen Kompilierung) durchführen, damit die Änderungen wirksam werden.

Überlegen Sie auch, ob Sie wirklich so viele Kompilierungsvariablen benötigen. Vielleicht sind einige von ihnen immer definiert, so dass es nicht sinnvoll ist, sie zur Kompilierzeit zu überprüfen. Vielleicht sind einige von ihnen überflüssig.

+1

+1 für U + 2014: EM DASH! –

+1

Das Problem ist freigegebene Dateien. Sie verfügen über 15 Jahre neuer Funktionen und Abwärtskompatibilität, die für jedes Projekt aktiviert oder deaktiviert sind. Wenn ich '{$ INCLUDE Defines.inc}' an den Anfang von 'VirtualTrees.pas' setze, wird es nicht funktionieren, weil es' Definines.inc' nicht finden kann (da 'Defines.inc' sitzt) in meinem Projekt Quellordner.Und selbst wenn es funktioniert, würde ich eine brechende Änderung in die Bibliothek einführen, da keines der anderen Projekte diese 'Defines.inc' Datei haben wird. –

+0

Ich habe begonnen, die Definition' Strict' zu machen Aktivieren Sie die anderen Definitionen.So können Sie definieren "Strict", die automatisch einige der anderen definiert. Ich habe auch die Definition 'inuost' aktivieren die Definition' ImNotUsingOlderSimpleThread', als eine Möglichkeit, wertvolle Zeichen zu speichern. Was ich brauche a Stelle in das Projekt, um * "conditional define" * zu setzen, das über alle kompilierten Einheiten funktioniert, nicht nur bis zum Ende der Einheit, in der sie definiert sind. –

Verwandte Themen