Frage

Bedenken Sie:

const 
   clHotlight: TColor = $00FF9933;
   clLink = clHotLight; //alias of clHotlight

[Error] file.pas: Constant expression expected

und die alternative Formulierung, dass die Arbeiten:

const 
   clHotlight = TColor($00FF9933);
   clLink = clHotLight; //alias of clHotlight

Erklären.


Dann betrachten:

const 
   AdministratorGUID: TGUID = '{DE44EEA0-6712-11D4-ADD4-0006295717DA}';
   SuperuserGUID = AdministratorGUID; //alias of AdministratorGUID

[Error] file.pas: Constant expression expected

Und fix.

Edit: Hinzugefügt Stichwort const vor Erklärungen; jemand glaubte nicht, sie waren konst.

War es hilfreich?

Lösung

clHotlight: TColor = $00FF9933; ist keine Konstante, sondern eine typisierte Konstante (= statische Variablen), das heißt die Compiler-Reserven ein Schlitz im Speicher für einen TColor, die den Wert $00FF9933 zunächst zur Laufzeit halten werden.
Weil dieser Wert später geändert werden (mit der zuweisbaren Konst Option ON), ist es nicht eine echte Konstante und kann nicht durch den Compiler in clLink = clHotLight;

akzeptiert

clHotlight = TColor($00FF9933); ist streng die gleiche wie clHotlight = $00FF9933;
Es ist eine wahre Konstante und der Compiler wird clHotlight durch seinen Wert $00FF9933 ersetzen, wo immer es im Code erscheint. Und für clLink auch.

Lesen Sie auf dieser Frage SO ( In Delphi 7, warum kann ich einen Wert in eine const zuweisen? ) und alle die guten Antworten gibt ...

EDIT: über TGUID ...
Das Problem ist, dass AdministratorGUID: TGUID = '{DE44EEA0-6712-11D4-ADD4-0006295717DA}'; Schreiben nicht richtig ist.
Es wird mit einiger Compiler Magie StringToGUID hinter der Szene zu nennen, so dass die Bequemlichkeit der GUID als String zum Ausdruck bringen, die sie nicht von Natur aus sind. Sie sind Aufzeichnungen.

So wird versucht, AdministratorGUID = '{DE44EEA0-6712-11D4-ADD4-0006295717DA}'; nicht funktionieren. Das ist kein GUID ...

Eine Abhilfe zu haben ist eine typisierte Konstante und Variablen zeigt auf den gleichen Speicherbereich mit der absolute Richtlinie:

const
   AdministratorGUID: TGUID = '{DE44EEA0-6712-11D4-ADD4-0006295717DA}';
var
   SuperuserGUID: TGUID absolute AdministratorGUID; //alias of AdministratorGUID
   RootGUID: TGUID absolute AdministratorGUID;      //alias of AdministratorGUID

Andere Tipps

Ich habe versucht, diesen Code ein:

  const
    CAnswer1 = 42;
    CAnswer2 : Integer = 42;

  var
    LAnswer : Integer;

  begin
    LAnswer := CAnswer1;
    LAnswer := CAnswer2;
  end;

und hier ist der erzeugte Code:

Project9.dpr.18: LAnswer := CAnswer1;
004101AC C7056C6E41002A00 mov [$00416e6c],$0000002a //<- assign a hard-coded "42" value
Project9.dpr.19: LAnswer := CAnswer2;
004101B6 A1701C4100       mov eax,[$00411c70] //<- fetch a variable's content
004101BB A36C6E4100       mov [$00416e6c],eax //<- assign this content 

Sie haben Recht: einige Konstanten sind beständiger als andere. Die zweite Konstante wird vom Compiler als Variable tatsächlich behandelt.

clHotlight: TColor = $00FF9933; 
          ^

Ist erklärt clHotlight als ' Variable ' (na ja, ok ein 'belegbare konstant', wenn Sie diese in Compiler-Optionen erlaubt haben) mit Hilfe der :.

Wie Sie gefunden haben, erklärt:

clHotlight = TColor($00FF9933); 

Es wird keine Zuteilung von clHotlight, bis es später angegeben wird.

Das gleiche gilt für Ihre GUID.

Das Problem entsteht, weil eine typisierte Konstante ist nicht wirklich, eine Konstante, wie schon mit unterschiedlichem Grad der Klarheit und Erfolg von anderen erklärt.

Was hat sich noch nicht gezeigt worden ist, wie man Arbeit, um das Problem (in einer großen Anzahl von Fällen), obwohl ein paar greifbare Nähe kam dieses Geheimnis zu Aufgeben ...:)

In Ihrem speziellen Fall, dass Sie das Problem umgehen können, indem Sie den „Aliasing“ des Wertes Umkehr und die typisierten Konstante Erklärung wie folgt:

const
  clLink = $00FF9933;
  clHotlight: TColor = clLink;

clLink bietet jetzt Ihre wahre Konstante und clHotlight ist die typisierte Konstante, die den gleichen Wert wie hat clLink .

Für die gleiche Technik GUID verwendet werden kann, aber man muss bedenken, der normale konstante Ausdruck verwendet, um einen typisierte GUID Konstante initialisiert werden - es ist nicht eine Aufzeichnung nicht verwendet, sondern eine einfache Zeichenkette, so:

const
  ID_CONSTANT = '{AA1C8AF2-C290-40AB-9CF5-2888A46E1660}';
  GUID_CONSTANT: TGUID = ID_CONSTANT;

Hinweis: Eine solche GUID Konstanten sind perfekt verwendbar in allen Orten, an denen TGUID ist erforderlich sind, z.B. IsEqualGUID (TGUID, GUID_CONSTANT) etc.

Die rechte Seite einer konstanten Erklärung ist ein „konstanter Ausdruck“ sein, die definiert ist als „ein konstanter Ausdruck ist ein Ausdruck, der Compiler das Programm ohne Ausführung auswerten kann, in dem es auftritt“. Sie können die gesamte akzeptierte Syntax für konstanten Ausdruck in der Sprache Anleitung finden. Beachten Sie, dass die Sprachführung explizit states „typisierte Konstanten nicht in konstanten Ausdrücken auftreten können.“ - und deshalb Ihre Erklärungen nicht, beide clHotlight: TColor = 00FF9933 $; und AdministratorGUID: TGUID = ...; sind typisierte Konstanten. Auch kann konstanten Ausdruck enthalten keine Funktionen Anrufe außer jene, die in der Sprache Führung (das heißt Länge (), SizeOf () und einige andere), dass der Compiler in der Lage ist, bei der Kompilierung zu berechnen. Rewrite auf diese Weise:

const
  AdminGUID = '{DE44EEA0-6712-11D4-ADD4-0006295717DA}';
  AdministratorGUID: TGUID = AdminGUID;
  SuperuserGUID: TGUID = AdminGUID;

Und es wird funktionieren.

Willkommen in Delphi Evolution. DELPHI in 1 & 2, kann man nicht assign anfänglichen konstanten Wert zu einem globalen var (ex: var XVAR: Integer = 1). Der einzige Weg, Sie tun können, ist const XVAR mit: Integer = 1) und einige, wo in Ihnen Codes, können Sie es dann, falls gewünscht, um somethingelse ändern. Bis sie dieser alten Funktion loszuwerden, können Sie nicht „const XVAR: Integer“ verwenden. Konstrukt als const Wert

Prost A Pham

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top