Grundlegende syntaktische Elemente (Delphi)

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Grundlegende syntaktische Elemente - Index


Kombinationen, die sich aus den grundlegenden syntaktischen Elementen (den sogenannten Token) zusammensetzen, ergeben Ausdrücke, Deklarationen und Anweisungen. Eine Anweisung beschreibt eine algorithmische Aktion, die innerhalb eines Programms ausgeführt werden kann. Ein Ausdruck ist eine syntaktische Einheit, die in einer Anweisung enthalten ist und einen Wert beschreibt. Eine Deklaration definiert einen Bezeichner (z. B. den Namen einer Funktion oder Variable), der in Ausdrücken und Anweisungen verwendet wird. Sie weist dem Bezeichner bei Bedarf auch Speicherplatz zu.

Dieses Thema enthält einen Überblick über den Zeichensatz von Delphi und eine Beschreibung der Deklarationssyntax für folgende Komponenten:

  • Bezeichner
  • Zahlen
  • Zeichen-Strings
  • Labels
  • Quelltextkommentare

Der Delphi-Zeichensatz

Die Delphi-Sprache verwendet für ihren Zeichensatz die Unicode-Zeichencodierung mit alphabetischen und alphanumerischen Unicode-Zeichen und den Unterstrich. Delphi unterscheidet nicht zwischen Groß- und Kleinschreibung. Das Leerzeichen und die Steuerzeichen (U+0000 bis U+001F und U+000D, das Wagenrücklauf- bzw. Zeilenendezeichen) sind "Blanks" (leer).

Der RAD Studio-Compiler akzeptiert eine Datei, die in UCS-2 oder UCS-4 codiert ist, wenn die Datei eine Byte-Reihenfolgenkennzeichnung (Byte Order Mark = BOM) enthält. Bei der Verwendung anderer Formate als UTF-8 kann jedoch die Compiliergeschwindigkeit beeinträchtigt werden. Alle Zeichen in einer in UCS-4 codierten Quelltextdatei müssen in UCS-2 ohne Ersatzpaare darstellbar sein. UCS-2-Codierungen mit Ersatzpaaren (einschließlich GB18030) werden nur akzeptiert, wenn die Compileroption codepage angegeben ist.

Token

Im Prinzip ist ein Programm eine Folge von Token, die durch Trennzeichen voneinander getrennt sind. Token sind die kleinsten Texteinheiten in einem Programm. Ein Trennzeichen kann entweder ein Leerzeichen oder ein Kommentar sein. Prinzipiell ist die Trennung zweier Token durch ein Trennzeichen nicht in jedem Fall erforderlich. Das Quelltextfragment:

 Size:=20;Price:=10;

ist beispielsweise korrekt. Aufgrund gängiger Konventionen und zugunsten der besseren Lesbarkeit sollte aber die folgende Schreibweise mit zwei Zeilen verwendet werden:

  Size := 20;
  Price := 10;

Ein Token ist ein Symbol, ein Bezeichner, ein reserviertes Wort, eine Direktive, eine Ziffer, ein Label oder eine String-Konstante. Außer bei String-Konstanten darf ein Trennzeichen nicht Teil eines Token sein. Zwei aufeinanderfolgende Bezeichner, reservierte Wörter, Ziffern oder Labels müssen durch ein oder mehrere Trennzeichen voneinander getrennt werden.

Spezielle Symbole

Symbole sind nicht alphanumerische Zeichen bzw. Zeichenpaare, die eine feste Bedeutung haben. Als spezielle Symbole gelten folgende Einzelzeichen:

# $ & ' ( ) * + , - . / : ; < = > @ [ ] ^ { }

Die folgenden Zeichenpaare sind ebenfalls spezielle Symbole:

(* (. *) .) .. // := <= >= <>

Die folgende Tabelle enthält Symbolpaare aus Delphi, die gleichbedeutend sind (die Symbolpaare {} und (* *) sind Kommentarzeichen, die im folgenden Thema ausführlich beschrieben werden: Kommentare und Compiler-Direktiven):

Spezielle Symbole   Entsprechende spezielle Symbole

[    ]

(.   .)

{    }

(*    *)


Die öffnende eckige Klammer [ ist gleichbedeutend mit dem Zeichenpaar, das aus einer öffnenden runden Klammer und einem Punkt besteht: (..


Die schließende eckige Klammer ] ist gleichbedeutend mit dem Zeichenpaar, das aus einem Punkt und einer schließenden runden Klammer besteht: .).

Die öffnende geschweifte Klammer { ist gleichbedeutend mit dem Zeichenpaar, das aus einer öffnenden runden Klammer und einem Sternchen besteht: (*.

Die schließende geschweifte Klammer } ist gleichbedeutend mit dem Zeichenpaar, das aus einem Sternchen und einer schließenden runden Klammer besteht: *).

Hinweis: Folgende Zeichen sind keine speziellen Symbole: %, ?, \, !, " (Anführungszeichen), _ (Unterstrich), | (Pipe) und ~ (Tilde).

Bezeichner

Bezeichner werden für Konstanten, Variablen, Felder, Typen, Eigenschaften, Prozeduren, Funktionen, Programme, Units, Bibliotheken und Packages verwendet. Obwohl ein Bezeichner beliebig lang sein kann, sind nur die ersten 255 Zeichen signifikant. Ein Bezeichner muss mit einem alphabetischen Zeichen, einem Unicode-Zeichen oder einem Unterstrich (_) beginnen und darf keine Leerzeichen enthalten. Auf das erste Zeichen können alphanumerische Zeichen, Unicode-Zeichen, Ziffern und Unterstriche folgen. Reservierte Wörter dürfen nicht als Bezeichner verwendet werden. Da die Groß-/Kleinschreibung in Delphi nicht berücksichtigt wird, sind beispielsweise für den Bezeichner CalculateValue folgende Schreibweisen zulässig:

 CalculateValue
 calculateValue
 calculatevalue
 CALCULATEVALUE

Da Unit-Namen Dateinamen entsprechen, kann eine unterschiedliche Schreibweise zu Compilierungsfehlern führen. Weitere Informationen finden Sie im Abschnitt Unit-Referenzen und die uses-Klausel in Programme und Units (Delphi).

Qualifizierte Bezeichner

Wenn Sie einen Bezeichner verwenden, der an mehreren Stellen deklariert wurde, muss dieser unter Umständen qualifiziert werden. Die Syntax für einen qualifizierten Bezeichner lautet:

Bezeichner1.Bezeichner2

Dabei qualifiziert Bezeichner1 den Bezeichner2. Angenommen, zwei Units deklarieren eine Variable namens CurrentValue. Mit der folgenden Anweisung legen Sie fest, dass auf CurrentValue in Unit2 zugegriffen werden soll:

 Unit2.CurrentValue

Bezeichner können über mehrere Ebenen qualifiziert werden. Zum Beispiel:

 Form1.Button1.Click

Mit dieser Anweisung wird die Methode Click in Button1 von Form1 aufgerufen.

Wenn Sie einen Bezeichner nicht qualifizieren, wird seine Interpretation von den Regeln für den Gültigkeitsbereich festgelegt, die im Abschnitt Blöcke und Gültigkeitsbereich unter Deklarationen und Anweisungen (Delphi) beschrieben sind.

Erweiterte Bezeichner

Sie könnten auf Bezeichner (z. B. Typen oder Methoden in Klassen) stoßen, die denselben Namen wie ein reserviertes Wort von Delphi haben. Eine Klasse könnte beispielsweise eine Methode mit dem Namen begin haben. Da begin aber in Delphi ein reserviertes Wort ist, darf es nicht als Name für einen Bezeichner verwendet werden.

Wenn Sie den Bezeichner vollständig qualifizieren, dann besteht kein Problem. Um beispielsweise das reservierte Delphi-Wort type als Bezeichnername zu verwenden, müssen Sie den voll qualifizierten Namen angeben:

 var TMyType.type
 // Using a fully qualified name avoids ambiguity with {{Delphi}} language keyword.

Der Ampersandoperator (&) kann als eine kürzere Alternative zum Auflösen der Doppeldeutigkeit zwischen Bezeichnern und reservierten Delphi-Wörtern verwendet werden. Das & verhindert, dass ein Schlüsselwort als Schlüsselwort (d. h., als reserviertes Wort) behandelt wird. Wenn Sie auf eine Methode oder einen Typ mit demselben Namen wie ein Delphi-Schlüsselwort stoßen, können Sie die Namespace-Spezifikation weglassen. Sie müssen dann aber dem Bezeichnernamen ein Ampersand voranstellen. Wenn Sie aber einen Bezeichner mit demselben Namen wie ein Schlüsselwort deklarieren, dann müssen Sie das & verwenden:

 type
  &Type = Integer;
  // Prefix with '&' is ok.

Reservierte Wörter

Die folgenden reservierten Wörter können weder neu definiert noch als Bezeichner verwendet werden.

Reservierte Wörter in Delphi:

and

end

interface

record

var

array

except

is

repeat

while  

as

exports

label

resourcestring    

with        

asm

file

library3

set    

xor

begin

finalization   

mod

shl

case

finally

nil

shr

class

for

not

String

const

function

object

then


constructor

goto

of

threadvar


destructor

if

or

to


dispinterface     

implementation    

packed

try


div

In

procedure    

type


do

inherited

program      

unit


downto

initialization   

property

until


else

inline

raise

uses


Hinweis: Neben den Wörtern in der obigen Tabelle gelten in Objekttypdeklarationen auch private, protected, public, published und automated als reservierte Wörter. In allen anderen Fällen werden sie als Direktiven behandelt. Die Wörter at und on haben ebenfalls eine besondere Bedeutung. Die Schlüsselwörter of object werden verwendet, um Methodenzeiger zu definieren.

Direktiven

In Delphi werden verschiedene Typen von Direktiven verwendet. So versteht man unter einer Direktive z. B. ein Wort, das an bestimmten Stellen des Quelltextes besonders behandelt wird. Direktiven dieses Typs haben in Delphi eine spezielle Bedeutung. Sie werden aber im Gegensatz zu reservierten Wörtern nur in Umgebungen verwendet, in denen benutzerdefinierte Bezeichner nicht auftreten können. Aus diesem Grund lassen sich Bezeichner definieren, die wie Direktiven lauten. Dieses Vorgehen ist allerdings nicht empfehlenswert.

Direktiven:

absolute

export12

name

public

stdcall

abstract

external

near1

published

strict

assembler12

far1

nodefault

read

stored

automated

final

operator10

readonly

unsafe

cdecl

forward

out

reference9

varargs

contains7

helper8

overload

register

virtual

default

implements

override

reintroduce

winapi6

delayed

index

package7

requires7

write

deprecated11

inline2

pascal


resident1

writeonly

dispid

library311

platform11

safecall


dynamic

local4

private

sealed5


experimental11

message

protected

static


Hinweise:  1. far, near und resident sind obsolet.  2. inline wird am Ende von Prozedur- und Funktionsdeklarationen wie eine Direktive verwendet, um die Prozedur oder Funktion für das Inlinig zu markieren, wurde aber in Turbo Pascal zu einem reservierten Wort.  3. library ist auch ein Schlüsselwort, wenn es als erstes Token im Projektquelltext verwendet wird; es kennzeichnet eine DLL. Ansonsten kennzeichnet es ein Symbol, damit es bei Verwendung eine Bibliothekswarnung erzeugt.  4. local war eine Kylix-Direktive und wird in Delphi für Win32 ignoriert.  5. sealed ist eine Klassendirektive mit der Syntax: 'class sealed'. Eine "sealed"-Klasse darf nicht erweitert oder abgeleitet werden (so wie final in C++). 6. winapi legt die Standardaufrufkonvention für die Plattform fest. So entspricht z. B. winapi stdcall für für Win32. 7. package kennzeichnet, wenn es als erstes Token verwendet wird, ein Package und aktiviert die Package-Syntax. requires und contains sind nur in der Package-Syntax Direktiven. 8. helper gibt an: "class helper for". 9. reference gibt eine Referenz auf eine Funktion oder Prozedur an. 10. operator gibt einen Klassenoperator an. 11. platform, deprecated, experimental und library sind Hinweis- (oder Warnung-) Direktiven. Diese Direktiven erstellen Warnungen zur Compilierungszeit. 12. assembler- und export-Direktiven haben keine Bedeutung. Sie existieren nur für die Abwärtskompatibilität.

Typen von Direktiven

Delphi verwendet neben dem in der Tabelle Direktiven ausgeführten kontextbezogenen Typ zwei weitere Typen von Direktiven.

Eine kontextbezogene Direktive kann auch ein Bezeichner sein (in der Regel kein Schlüsselwort), der am Ende einer Deklaration platziert wird, um die Bedeutung der Deklaration zu ändern. Zum Beispiel:

  procedure P; forward;

oder:

  procedure M; virtual; override;

oder:

  property Foo: Integer read FFoo write FFoo default 42;


Der letzte Direktiventyp stellt die offizielle Compiler-Direktive dar. Eine Compiler-Direktive ist ein Schalter oder eine Option, die das Verhalten des Compilers beeinflusst. Compiler-Direktiven werden in geschweifte Klammern ({}) gesetzt und beginnen mit einem Dollarzeichen ($), z. B.:

  {$POINTERMATH ON}

  {$D+} // DEBUGINFO ON

Wie die anderen Direktiventypen sind auch Compiler-Direktiven keine Schlüsselwörter. Ein Liste der Compiler-Direktiven finden Sie unter Liste der Delphi-Compiler-Direktiven.

Zahlen

Integer- und Real-Konstanten lassen sich in dezimaler Notation als Folge von Ziffern ohne Kommas oder Leerzeichen darstellen. Das Vorzeichen wird durch den vorangestellten Operator + oder - angegeben. Werte sind per Vorgabe positiv (67258 ist also identisch mit +67258) und müssen im Bereich des größten vordefinierten Real- bzw. Integer-Typs liegen.

Zahlen mit Nachkommastellen oder Exponenten bezeichnen Real-Konstanten. Andere Dezimalzahlen sind Integer-Konstanten. Bei Real-Typen wird die wissenschaftliche Notation (E oder e gefolgt von einem Exponenten) als "mal 10 hoch" gelesen. So bedeutet 7E2 beispielsweise 7 * 10^2, und 12,25e+6 oder 12,25e6 bedeutet 12,25 * 10^6.

Das Dollarzeichen als Vorzeichen kennzeichnet eine hexadezimale Zahl, beispielsweise $8F. Hexadezimalzahlen ohne vorausgehenden unären Operator - werden als positive Werte angesehen. Liegt ein Hexadezimalwert während einer Zuweisung außerhalb des Bereichs des empfangenden Typs, wird ein Fehler ausgelöst, ausgenommen bei Integer (32-Bit-Integer). Hier wird eine Warnung ausgelöst. In diesem Fall werden Werte, die den positiven Bereich für Integerwerte überschreiten, als negative Zahlen angesehen. Dieses Verfahren entspricht der Zweierkomplement-Darstellung von Ganzzahlen.

Ausführliche Informationen über Real- und Integer-Typen finden Sie unter Überblick über Datentypen (Delphi). Informationen über die Datentypen von Zahlen finden Sie unter Deklarierte Konstanten.

Labels

Als Label kann ein Bezeichner oder eine positive Integer-Zahl verwendet werden. Der Delphi-Compiler akzeptiert nummerische Label von 0 bis 4294967295 (uint32-Bereich).

Label werden in goto-Anweisungen verwendet. Ausführliche Informationen über goto-Anweisungen und Labels finden Sie im Abschnitt Goto-Anweisungen unter Deklarationen und Anweisungen.

Zeichen-Strings

Ein Zeichen-String (auch String-Literal oder String-Konstante genannt) kann aus einem String in Anführungszeichen, einem Steuerzeichen-String oder einer Kombination aus beiden bestehen. Trennzeichen dürfen nur bei Strings in Anführungszeichen auftreten.

Ein String in Anführungszeichen setzt sich aus einer Folge von Zeichen des ANSI- oder Multibyte-Zeichensatzes zusammen, die in einer Zeile stehen und in halbe Anführungszeichen eingeschlossen sein muss. Ein String in Anführungszeichen, der zwischen den halben Anführungszeichen kein Zeichen enthält, ist ein Null-String. Zwei in einem String in Anführungszeichen unmittelbar aufeinanderfolgende halbe Anführungszeichen stehen für ein einzelnes Anführungszeichen.

Der String wird intern als ein in UTF-16 codierter Unicode-String dargestellt. Für Zeichen aus dem Basic Multilingual Plane (BMP) werden 2 Byte und für Zeichen, die nicht im BMP enthalten sind, 4 Byte benötigt.

Zum Beispiel:

   'Embarcadero'        { Embarcadero }
   'You''ll see'        { You'll see }
   'アプリケーションを Unicode 対応にする'
   ''''                 { ' }
   ''                   { null string }
   ' '                  { a space }

Ein Steuerzeichen-String ist eine Folge von einem oder mehreren Steuerzeichen. Jedes dieser Steuerzeichen besteht aus einem #-Symbol und einer vorzeichenlosen Integer-Konstante zwischen 0 und 65535 (dezimal) oder zwischen $0 und $FFFF (hexadezimal) in UTF-16-Codierung und bezeichnet das einem bestimmten Codewert entsprechende Zeichen. Jeder Integerwert wird in dem String intern durch 2 Byte dargestellt. Dies ist für die Darstellung von Steuerzeichen und Multibyte-Zeichen hilfreich. Der Steuerzeichen-String

#89#111#117

entspricht dem folgenden String in Anführungszeichen:

'You'

Sie können Strings in Anführungszeichen mit Steuerzeichen-Strings kombinieren und damit längere Strings bilden. Beispielsweise wird mit dem String

'Line 1'#13#10'Line 2'

das Zeichen für einen Wagenrücklauf/Zeilenvorschub zwischen Zeile 1 und Zeile 2 eingefügt. Strings in Anführungszeichen lassen sich allerdings nicht auf diese Weise miteinander verbinden, weil ein Paar aufeinanderfolgender halber Anführungszeichen als ein einzelnes Zeichen interpretiert wird. (Für das Verketten von Strings in Anführungszeichen steht der Operator + zur Verfügung. Sie können die betreffenden Strings aber auch zu einem einzigen String in Anführungszeichen kombinieren.)

Zeichen-Strings sind mit allen String-Typen und mit dem Typ PChar kompatibel. Weil der Typ AnsiString Multibyte-Zeichen, einen Zeichen-String mit einem Zeichen, Einzel- oder Multibyte, enthalten kann, ist er mit allen Zeichentypen kompatibel. Wenn die erweiterte Syntax aktiviert ist (mit der Compiler-Direktive {$X+}), ist ein nicht leerer Zeichen-String der Länge n mit nullbasierten Arrays und gepackten Arrays mit n Zeichen kompatibel. Weitere Informationen finden Sie unterÜberblick über Datentypen (Delphi).

Kommentare und Compiler-Direktiven

Kommentare werden vom Compiler ignoriert. Dies gilt jedoch nicht für Kommentare, die als Trennzeichen (zur Trennung aufeinanderfolgender Token) oder als Compiler-Direktiven fungieren.

Kommentare lassen sich auf verschiedene Arten kennzeichnen:

 { Text between left and right braces is a comment. }
 (* Text between left-parenthesis-plus-asterisk and an
  asterisk-plus-right-parenthesis is also a comment *)
 // Text between double-slash and end of line is a comment.

Gleiche Kommentararten können nicht verschachtelt werden. (*{}*) dagegen schon. Diese Form ist nützlich zum Auskommentieren von Abschnitten, die ebenfalls Kommentare enthalten.

Empfehlungen für die Verwendung der drei Kommentararten:

  • Doppelter Schrägstrich (//) Eignet sich zum Auskommentieren temporärer Änderungen, die während der Entwicklung vorgenommen wurden. Sie können im Quelltext-Editor mit der Tastenkombination STRG+/ (Nummernzeichen) diese Kommentarzeichen bequem einfügen.
  • Klammer-Sternchen "(*...*)": Eignet sich für Entwicklungskommentare und zum Auskommentieren eines Codeblocks, der andere Kommentare enthält. In diese Kommentarzeichen können mehrere Quelltextzeilen, einschließlich andere Kommentararten, eingeschlossen werden. Der gesamte Block wird vom Compiler ignoriert.
  • Geschweifte Klammern ({}): Eignet sich zur Dokumentation des Quelltextes. Diese Kommentare sollen im Quelltext verbleiben.

Ein Kommentar, in dem unmittelbar nach { oder (* ein Dollarzeichen ($) steht, ist eine Compiler-Direktive. Zum Beispiel:

 {$WARNINGS OFF}

Diese Direktive weist den Compiler an, keine Warnmeldungen zu generieren.

Siehe auch