<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Nicolas.rios</id>
	<title>RAD Studio - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Nicolas.rios"/>
	<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/de/Spezial:Beitr%C3%A4ge/Nicolas.rios"/>
	<updated>2026-09-07T13:24:18Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Prozeduren_und_Funktionen_(Delphi)&amp;diff=219392</id>
		<title>Prozeduren und Funktionen (Delphi)</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Prozeduren_und_Funktionen_(Delphi)&amp;diff=219392"/>
		<updated>2026-08-31T19:49:57Z</updated>

		<summary type="html">&lt;p&gt;Nicolas.rios: /* Eine Routine unter einem anderen Namen importieren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Parent|Prozeduren und Funktionen - Index}}&lt;br /&gt;
Dieses Thema enthält Informationen zu folgenden Bereichen:&lt;br /&gt;
&lt;br /&gt;
* Prozeduren und Funktionen deklarieren&lt;br /&gt;
* Aufrufkonventionen&lt;br /&gt;
* forward- und interface-Deklarationen&lt;br /&gt;
* external-Deklarationen&lt;br /&gt;
* Prozeduren und Funktionen überladen&lt;br /&gt;
* Lokale Deklarationen und verschachtelte Routinen&lt;br /&gt;
&lt;br /&gt;
==Allgemeines zu Prozeduren und Funktionen==&lt;br /&gt;
&lt;br /&gt;
Prozeduren und Funktionen, die zusammenfassend auch als &#039;&#039;Routinen&#039;&#039; bezeichnet werden, sind abgeschlossene Anweisungsblöcke, die von unterschiedlichen Positionen in einem Programm aufgerufen werden können. Eine &#039;&#039;Funktion&#039;&#039; ist eine Routine, die nach Ausführung einen Wert zurückgibt. Eine &#039;&#039;Prozedur&#039;&#039; ist eine Routine, die keinen Wert zurückgibt.&lt;br /&gt;
&lt;br /&gt;
Funktionsaufrufe können auch in Zuweisungen und Operationen eingesetzt werden, da sie einen Wert zurückgeben. Zum Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 I := SomeFunction(X);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Anweisung ruft die Funktion &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;SomeFunction&amp;lt;/span&amp;gt; auf und weist das Ergebnis der Variable &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;I&amp;lt;/span&amp;gt; zu. Funktionsaufrufe dürfen nicht auf der linken Seite einer Zuweisungsanweisung stehen.&lt;br /&gt;
&lt;br /&gt;
Prozeduraufrufe können als eigenständige Anweisungen eingesetzt werden. Bei Funktionsaufrufen ist dies ebenfalls möglich, wenn die erweiterte Syntax (&amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;{$X+}&amp;lt;/span&amp;gt;) aktiviert ist. Zum Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 DoSomething;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Anweisung ruft die Routine &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;DoSomething&amp;lt;/span&amp;gt; auf. Ist &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;DoSomething&amp;lt;/span&amp;gt; eine Funktion, wird der Rückgabewert verworfen.&lt;br /&gt;
&lt;br /&gt;
Prozeduren und Funktionen können auch rekursiv aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
==Prozeduren und Funktionen deklarieren==&lt;br /&gt;
&lt;br /&gt;
Beim Deklarieren einer Prozedur oder Funktion geben Sie den Namen, die Anzahl und den Typ der Parameter sowie bei Funktionen den Typ des Rückgabewertes an. Dieser Teil der Deklaration wird auch Prototyp, Kopf oder Header genannt. Anschließend schreiben Sie den Code, der beim Aufrufen der Prozedur oder Funktion ausgeführt werden soll. Dieser Teil wird auch als Rumpf oder Block der Routine bezeichnet.&lt;br /&gt;
&lt;br /&gt;
===Prozedurdeklarationen===&lt;br /&gt;
&lt;br /&gt;
Eine Prozedurdeklaration hat folgende Form:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 procedure procedureName(parameterList); directives;&lt;br /&gt;
   localDeclarations;&lt;br /&gt;
 begin&lt;br /&gt;
   statements&lt;br /&gt;
 end;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Prozedurname&#039;&#039; ist ein beliebiger gültiger Bezeichner, &#039;&#039;Anweisungen&#039;&#039; eine Folge von Anweisungen, die beim Aufruf der Prozedur ausgeführt werden. &#039;&#039;(Parameterliste)&#039;&#039;, &#039;&#039;Direktiven&#039;&#039; und &#039;&#039;LokaleDeklarationen&#039;&#039; sind optional.&lt;br /&gt;
&lt;br /&gt;
Ein Beispiel für eine Prozedurdeklaration:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 procedure NumString(N: Integer; var S: string);&lt;br /&gt;
 var&lt;br /&gt;
   V: Integer;&lt;br /&gt;
 begin&lt;br /&gt;
   V := Abs(N);&lt;br /&gt;
   S := &#039;&#039;;&lt;br /&gt;
   repeat&lt;br /&gt;
     S := Chr(V mod 10 + Ord(&#039;0&#039;)) + S;&lt;br /&gt;
     V := V div 10;&lt;br /&gt;
   until V = 0;&lt;br /&gt;
   if N &amp;lt; 0 then S := &#039;-&#039; + S;&lt;br /&gt;
 end;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach dieser Deklaration können Sie die Prozedur &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;NumString&amp;lt;/span&amp;gt; folgendermaßen aufrufen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 NumString(17, MyString);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Prozeduraufruf weist der Variable &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;MyString&amp;lt;/span&amp;gt; (es muss sich um eine Variable vom Typ &#039;&#039;&#039;String&#039;&#039;&#039; handeln) den Wert 17 zu.&lt;br /&gt;
&lt;br /&gt;
Im Anweisungsblock einer Prozedur können Sie Variablen und Bezeichner verwenden, die im Abschnitt &#039;&#039;localDeclarations&#039;&#039; der Prozedur deklariert wurden. Sie können außerdem die Parameternamen aus der Parameterliste (&amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;N&amp;lt;/span&amp;gt; und &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;S&amp;lt;/span&amp;gt; in diesem Beispiel) verwenden. Die Parameterliste definiert eine Gruppe lokaler Variablen. Aus diesem Grund dürfen im Abschnitt &#039;&#039;localDeclarations&#039;&#039; keine gleichlautenden Parameternamen auftauchen. Natürlich können Sie auch alle Bezeichner verwenden, in deren Gültigkeitsbereich die Prozedur deklariert wurde.&lt;br /&gt;
&lt;br /&gt;
===Funktionsdeklarationen===&lt;br /&gt;
&lt;br /&gt;
Eine Funktionsdeklaration entspricht einer Prozedurdeklaration, definiert aber zusätzlich einen Rückgabetyp und einen Rückgabewert. Funktionsdeklarationen haben folgende Form:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 function functionName(parameterList): returnType; directives;&lt;br /&gt;
   localDeclarations;&lt;br /&gt;
 begin&lt;br /&gt;
   statements&lt;br /&gt;
 end;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Funktionsname&#039;&#039; ist ein beliebiger gültiger Bezeichner, &#039;&#039;Rückgabetyp&#039;&#039; ein Typbezeichner, &#039;&#039;Anweisungen&#039;&#039; enthält die Folge von Anweisungen, die beim Aufruf der Funktion ausgeführt werden sollen. &#039;&#039;(Parameterliste)&#039;&#039;, &#039;&#039;Direktiven;&#039;&#039; und &#039;&#039;LokaleDeklarationen;&#039;&#039; sind optional.&lt;br /&gt;
&lt;br /&gt;
Für den Anweisungsblock der Funktion gelten die Regeln, die bereits für Prozeduren erläutert wurden. Sie können Variablen und andere Bezeichner, die im Abschnitt &#039;&#039;localDeclarations&#039;&#039; der Funktion deklariert wurden, die Parameternamen aus der Parameterliste und alle Bezeichner verwenden, in deren Gültigkeitsbereich die Funktion deklariert wurde. Der Funktionsname dient als spezielle Variable, die wie die vordefinierte Variable &#039;&#039;&#039;Result&#039;&#039;&#039; den Rückgabewert der Funktion enthält.&lt;br /&gt;
&lt;br /&gt;
Wenn die erweiterte Syntax (&amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;{$X+}&amp;lt;/span&amp;gt;) aktiviert ist, wird &#039;&#039;&#039;Result&#039;&#039;&#039; implizit in jeder Funktion deklariert. Sie dürfen diese Variable deshalb nicht manuell deklarieren.&lt;br /&gt;
&lt;br /&gt;
Zum Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 function WF: Integer;&lt;br /&gt;
 begin&lt;br /&gt;
   WF := 17;&lt;br /&gt;
 end;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Deklaration definiert eine Konstantenfunktion namens &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;WF&amp;lt;/span&amp;gt;, die keine Parameter entgegennimmt und immer den Integerwert 17 zurückgibt. Diese Deklaration ist zur folgenden äquivalent:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 function WF: Integer;&lt;br /&gt;
 begin&lt;br /&gt;
   Result := 17;&lt;br /&gt;
 end;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das nächste Beispiel enthält eine etwas komplexere Funktionsdeklaration:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 function Max(A: array of Real; N: Integer): Real;&lt;br /&gt;
 var&lt;br /&gt;
   X: Real;&lt;br /&gt;
   I: Integer;&lt;br /&gt;
 begin&lt;br /&gt;
   X := A[0];&lt;br /&gt;
   for I := 1 to N - 1 do&lt;br /&gt;
     if X &amp;lt; A[I] then X := A[I];&lt;br /&gt;
   Max := X;&lt;br /&gt;
 end;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sie können der Variable &#039;&#039;&#039;Result&#039;&#039;&#039; oder dem Funktionsnamen im Anweisungsblock mehrmals einen Wert zuweisen. Die zugewiesenen Werte müssen jedoch dem deklarierten Rückgabetyp entsprechen. Sobald die Ausführung der Funktion beendet wird, bildet der Wert, der zuletzt der Variable &#039;&#039;&#039;Result&#039;&#039;&#039; oder dem Funktionsnamen zugewiesen wurde, den Rückgabewert der Funktion. Zum Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 function Power(X: Real; Y: Integer): Real;&lt;br /&gt;
 var&lt;br /&gt;
   I: Integer;&lt;br /&gt;
 begin&lt;br /&gt;
   Result := 1.0;&lt;br /&gt;
   I := Y;&lt;br /&gt;
   while I &amp;gt; 0 do&lt;br /&gt;
    begin&lt;br /&gt;
     if Odd(I) then Result := Result * X;&lt;br /&gt;
     I := I div 2;&lt;br /&gt;
     X := Sqr(X);&lt;br /&gt;
    end;&lt;br /&gt;
 end;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Result&#039;&#039;&#039; und der Funktionsname repräsentieren immer denselben Wert. Deshalb gibt die Deklaration&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 function MyFunction: Integer;&lt;br /&gt;
 begin&lt;br /&gt;
   MyFunction := 5;&lt;br /&gt;
   Result := Result * 2;&lt;br /&gt;
   MyFunction := Result + 1;&lt;br /&gt;
 end;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
den Wert 11 zurück. &#039;&#039;&#039;Result&#039;&#039;&#039; ist jedoch nicht vollständig mit dem Funktionsnamen austauchbar. Wenn der Funktionsname auf der linken Seite einer Zuweisungsanweisung angegeben ist, verwendet der Compiler den Funktionsnamen als Variable (wie &#039;&#039;&#039;Result&#039;&#039;&#039;) zur Aufzeichnung des Rückgabewerts. Taucht der Funktionsname dagegen an einer anderen Stelle im Anweisungsblock auf, wird er vom Compiler als rekursiver Aufruf der Funktion interpretiert. &#039;&#039;&#039;Result&#039;&#039;&#039; kann als Variable in Operationen eingesetzt werden, beispielsweise bei Typkonvertierungen, in Konstruktoren, Indizes und in Aufrufen anderer Routinen.&lt;br /&gt;
&lt;br /&gt;
Wenn die Ausführung einer Funktion beendet wird, bevor &#039;&#039;&#039;Result&#039;&#039;&#039; oder dem Funktionsnamen ein Wert zugewiesen wurde, ist der Rückgabewert der Funktion nicht definiert.&lt;br /&gt;
&lt;br /&gt;
==Aufrufkonventionen==&lt;br /&gt;
&lt;br /&gt;
Wenn Sie eine Prozedur oder Funktion deklarieren, können Sie eine Aufrufkonvention mit einer der Direktiven &#039;&#039;&#039;register&#039;&#039;&#039;, &#039;&#039;&#039;pascal&#039;&#039;&#039;, &#039;&#039;&#039;cdecl&#039;&#039;&#039;, &#039;&#039;&#039;stdcall&#039;&#039;&#039;, &#039;&#039;&#039;safecall&#039;&#039;&#039; und &#039;&#039;&#039;winapi&#039;&#039;&#039; angeben. Zum Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 function MyFunction(X, Y: Real): Real; cdecl;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aufrufkonventionen bestimmen die Reihenfolge, in der Parameter an die Routine übergeben werden. Sie beeinflussen außerdem das Entfernen der Parameter vom Stack, den Einsatz der Register zur Übergabe von Parametern sowie die Fehler- und Exception-Behandlung. Die Standard-Aufrufkonvention ist &#039;&#039;&#039;register&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* Für die Konventionen &#039;&#039;&#039;register&#039;&#039;&#039; und &#039;&#039;&#039;pascal&#039;&#039;&#039; ist die Auswertungsreihenfolge nicht definiert.&lt;br /&gt;
* Die Konventionen &#039;&#039;&#039;cdecl&#039;&#039;&#039;, &#039;&#039;&#039;stdcall&#039;&#039;&#039; und &#039;&#039;&#039;safecall&#039;&#039;&#039; übergeben die Parameter von rechts nach links.&lt;br /&gt;
* Bei allen Konventionen mit Ausnahme von &#039;&#039;&#039;cdecl&#039;&#039;&#039; entfernt die Prozedur bzw. Funktion die Parameter vom Stack, sobald die Steuerung zurückgegeben wird. Bei der Konvention &#039;&#039;&#039;cdecl&#039;&#039;&#039; entfernt die aufrufende Routine die Parameter vom Stack, sobald sie wieder die Steuerung erhält.&lt;br /&gt;
* Die Konvention &#039;&#039;&#039;register&#039;&#039;&#039; verwendet bis zu drei CPU-Register zur Übergabe der Parameter, alle anderen Konventionen übergeben die Parameter an den Stack.&lt;br /&gt;
* Die Konvention &#039;&#039;&#039;safecall&#039;&#039;&#039; implementiert &amp;quot;Exception-Firewalls&amp;quot; und in Win32 die prozessübergreifende COM-Fehlerbenachrichtigung.&lt;br /&gt;
*  &#039;&#039;&#039;winapi&#039;&#039;&#039; ist eigentlich keine Aufrufkonvention. &#039;&#039;&#039;winapi&#039;&#039;&#039; legt fest, dass die standardmäßige Aufrufkonvention der Plattform verwendet wird. Unter Win32 entspricht &#039;&#039;&#039;winapi&#039;&#039;&#039; der Aufrufkonvention &#039;&#039;&#039;stdcall&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Die folgende Tabelle beschreibt die Aufrufkonventionen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Aufrufkonventionen &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; frame=&amp;quot;hsides&amp;quot; rules=&amp;quot;rows&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039; Direktive &#039;&#039;&#039;&amp;amp;nbsp;&lt;br /&gt;
! &#039;&#039;&#039; Parameterreihenfolge &#039;&#039;&#039;&amp;amp;nbsp;&lt;br /&gt;
! &#039;&#039;&#039; Bereinigung &#039;&#039;&#039;&amp;amp;nbsp;&lt;br /&gt;
! &#039;&#039;&#039; Parameterübergabe in Registern? &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
&#039;&#039;&#039;register&#039;&#039;&#039;&amp;amp;nbsp;&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
Undefiniert&amp;amp;nbsp;&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
Routine&amp;amp;nbsp;&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
Ja&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
&#039;&#039;&#039;pascal&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
Undefiniert&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
Routine&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
Nein&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
&#039;&#039;&#039;cdecl&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
Von rechts nach links&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
Aufrufender&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
Nein&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
&#039;&#039;&#039;stdcall&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
Von rechts nach links&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
Routine&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
Nein&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
&#039;&#039;&#039;safecall&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
Von rechts nach links&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
Routine&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
Nein&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die weitaus effizienteste Aufrufkonvention ist &#039;&#039;&#039;register&#039;&#039;&#039;, da hier meistens kein Stack-Frame für die Parameter angelegt werden muss. (Zugriffsmethoden für Eigenschaften, die als &#039;&#039;&#039;published&#039;&#039;&#039; deklariert sind, müssen &#039;&#039;&#039;register&#039;&#039;&#039; verwenden.) Die Konvention &#039;&#039;&#039;cdecl&#039;&#039;&#039; ist hilfreich, wenn Funktionen in gemeinsam benutzten Bibliotheken aufgerufen werden, die in C oder C++ geschrieben wurden. Die Konventionen &#039;&#039;&#039;stdcall&#039;&#039;&#039; und &#039;&#039;&#039;safecall&#039;&#039;&#039; sollten für Aufrufe von externem Quelltext benutzt werden. In Win32 verwenden die Betriebssystem-APIs die Konventionen &#039;&#039;&#039;stdcall&#039;&#039;&#039; und &#039;&#039;&#039;safecall&#039;&#039;&#039;. Andere Betriebssysteme verwenden normalerweise die Konvention &#039;&#039;&#039;cdecl&#039;&#039;&#039; (beachten Sie, dass &#039;&#039;&#039;stdcall&#039;&#039;&#039; effizienter ist als &#039;&#039;&#039;cdecl&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Die Konvention &#039;&#039;&#039;safecall&#039;&#039;&#039; muss bei der Deklaration von Methoden für duale Interfaces verwendet werden. Die Konvention &#039;&#039;&#039;pascal&#039;&#039;&#039; gewährleistet die Abwärtskompatibilität.&lt;br /&gt;
&lt;br /&gt;
Die Direktiven &#039;&#039;&#039;near&#039;&#039;&#039;, &#039;&#039;&#039;far&#039;&#039;&#039; und &#039;&#039;&#039;export&#039;&#039;&#039; beziehen sich auf die Aufrufkonventionen bei der Programmierung für 16-Bit-Windows-Umgebungen. Sie haben keine Auswirkungen auf die aktuellen Plattformziele und werden nur aus Gründen der Abwärtskompatibilität beibehalten.&lt;br /&gt;
&lt;br /&gt;
==forward- und interface-Deklarationen==&lt;br /&gt;
&lt;br /&gt;
Die Direktive &#039;&#039;&#039;forward&#039;&#039;&#039; in einer Prozedur- oder Funktionsdeklaration wird durch einen Rumpf mit Anweisungen und lokalen Variablendeklarationen ersetzt. Zum Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 function Calculate(X, Y: Integer): Real; forward;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die hier deklarierte Funktion &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Calculate&amp;lt;/span&amp;gt; enthält die Direktive &#039;&#039;&#039;forward&#039;&#039;&#039;. An einer anderen Position muss der Rumpf der Routine deklariert werden. Diese definierende Deklaration für &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Calculate&amp;lt;/span&amp;gt; kann beispielsweise folgendermaßen aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 function Calculate;&lt;br /&gt;
   ... { declarations }&lt;br /&gt;
 begin&lt;br /&gt;
   ... { statement block }&lt;br /&gt;
 end;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Grundsätzlich muss eine definierende Deklaration die Parameterliste oder den Rückgabetyp der Routine nicht wiederholen. Werden diese Angaben jedoch wiederholt, müssen sie denen in der &#039;&#039;&#039;forward&#039;&#039;&#039;-Deklaration exakt entsprechen. Standardparameter in der definierenden Deklaration können aber weggelassen werden. Wenn die &#039;&#039;&#039;forward&#039;&#039;&#039;-Deklaration eine überladene Prozedur oder Funktion angibt, muss die Parameterliste in der definierenden Deklaration wiederholt werden.&lt;br /&gt;
&lt;br /&gt;
Eine &#039;&#039;&#039;forward&#039;&#039;&#039;-Deklaration und die dazugehörige definierende Deklaration müssen in demselben &#039;&#039;&#039;type&#039;&#039;&#039;-Deklarationsabschnitt enthalten sein. Sie können also keinen neuen Abschnitt (z. B. einen &#039;&#039;&#039;var&#039;&#039;&#039;- oder &#039;&#039;&#039;const&#039;&#039;&#039;-Abschnitt) zwischen der forward-Deklaration und der definierenden Deklaration einfügen. Die definierende Deklaration kann eine &#039;&#039;&#039;external&#039;&#039;&#039;- oder &#039;&#039;&#039;assembler&#039;&#039;&#039;-Deklaration sein, es darf sich jedoch nicht um eine weitere &#039;&#039;&#039;forward&#039;&#039;&#039;-Deklaration handeln.&lt;br /&gt;
&lt;br /&gt;
Mit einer &#039;&#039;&#039;forward&#039;&#039;&#039;-Deklaration kann der Gültigkeitsbereich eines Prozedur- oder Funktionsbezeichners auf einen früheren Punkt im Quelltext ausgedehnt werden. Andere Prozeduren und Funktionen können also die mit &#039;&#039;&#039;forward&#039;&#039;&#039; deklarierte Routine aufrufen, bevor sie tatsächlich definiert wurde. &#039;&#039;&#039;forward&#039;&#039;&#039;-Deklarationen bieten nicht nur mehr Flexibilität bei der Programmierung, sie werden auch gelegentlich für Rekursionen benötigt.&lt;br /&gt;
&lt;br /&gt;
Die Direktive &#039;&#039;&#039;forward&#039;&#039;&#039; hat keine Auswirkung im &#039;&#039;&#039;interface&#039;&#039;&#039;-Abschnitt einer Unit. Prozedur- und Funktions-Header im &#039;&#039;&#039;interface&#039;&#039;&#039;-Abschnitt verhalten sich wie &#039;&#039;&#039;forward&#039;&#039;&#039;-Deklarationen. Die zugehörigen definierenden Deklarationen müssen in den &#039;&#039;&#039;implementation&#039;&#039;&#039;-Abschnitt eingefügt werden. Eine im &#039;&#039;&#039;interface&#039;&#039;&#039;-Abschnitt deklarierte Routine ist von jeder Position in der Unit und für jede Unit und jedes Programm verfügbar, die bzw. das die Unit mit der Deklaration einbindet.&lt;br /&gt;
&lt;br /&gt;
==external-Deklarationen==&lt;br /&gt;
&lt;br /&gt;
Die Direktive &#039;&#039;&#039;external&#039;&#039;&#039; ersetzt den Anweisungsblock in einer Prozedur- oder Funktionsdeklaration. Sie ermöglicht das Aufrufen von Routinen, die unabhängig vom aktuellen Programm compiliert wurden. Externe Routinen stammen aus Objektdateien oder aus dynamisch ladbaren Bibliotheken.&lt;br /&gt;
&lt;br /&gt;
Verwenden Sie zum Importieren einer C-Funktion, die eine variable Anzahl von Parametern übernimmt, die Direktive &#039;&#039;&#039;varargs&#039;&#039;&#039;. Zum Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 function printf(Format: PChar): Integer; cdecl; varargs;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Direktive &#039;&#039;&#039;varargs&#039;&#039;&#039; kann nur bei externen Routinen und zusammen mit der Aufrufkonvention &#039;&#039;&#039;cdecl&#039;&#039;&#039; eingesetzt werden.&lt;br /&gt;
&lt;br /&gt;
===Objektdateien linken===&lt;br /&gt;
&lt;br /&gt;
Um Routinen aus einer separat compilierten Objektdatei aufrufen zu können, müssen Sie die Objektdatei mit der Compiler-Direktive &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;$L&amp;lt;/span&amp;gt; (oder &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;$LINK&amp;lt;/span&amp;gt;) zur gewünschten Anwendung linken. Zum Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 {$L BLOCK.OBJ}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Anweisung linkt die Datei &amp;lt;font face=&amp;quot;courier new,courier,monospace&amp;quot;&amp;gt;&amp;lt;span&amp;gt;&amp;lt;font color=&amp;quot;#004A80&amp;quot;&amp;gt;BLOCK.OBJ&amp;lt;/font&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/font&amp;gt; zu dem Programm bzw. der Unit, in der die Anweisung verwendet wird. Anschließend müssen Sie die aufzurufenden Funktionen und Prozeduren deklarieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 procedure MoveWord(var Source, Dest; Count: Integer); external;&lt;br /&gt;
 procedure FillWord(var Dest; Data: Integer; Count: Integer); external;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt können Sie die Routinen &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;MoveWord&amp;lt;/span&amp;gt; und &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;FillWord&amp;lt;/span&amp;gt; in &amp;lt;font face=&amp;quot;courier new,courier,monospace&amp;quot;&amp;gt;&amp;lt;span&amp;gt;&amp;lt;font color=&amp;quot;#004A80&amp;quot;&amp;gt;BLOCK.OBJ&amp;lt;/font&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/font&amp;gt; aufrufen.&lt;br /&gt;
&lt;br /&gt;
In Win32 werden Deklarationen wie die oben gezeigten häufig verwendet, um auf externe Assembler-Routinen zuzugreifen. Assembler-Routinen können auch direkt in {{Delphi}}-Quelltext eingefügt werden.&lt;br /&gt;
&lt;br /&gt;
===Funktionen aus Bibliotheken importieren===&lt;br /&gt;
&lt;br /&gt;
Mit einer Direktive der Form&lt;br /&gt;
&lt;br /&gt;
: {{Code|external StringKonstante;}}&lt;br /&gt;
&lt;br /&gt;
können Sie Routinen aus einer dynamisch ladbaren Bibliothek (.DLL-Datei) importieren. Die Anweisung muss an das Ende des Prozedur- bzw. Funktions-Headers angefügt werden. {{Code|stringConstant}} gibt die Bibliotheksdatei in einfachen Anführungszeichen (Hochkommas) an. Ein Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
function SomeFunction(S: string): string; external &#039;strlib.dll&#039;;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit dieser Anweisung wird in Win32 die Funktion {{Code|SomeFunction}} aus der Datei {{Path|strlib.dll}} importiert.&lt;br /&gt;
&lt;br /&gt;
====Interne und externe Linker verwenden====&lt;br /&gt;
&lt;br /&gt;
Der Delphi-Compiler interpretiert &amp;quot;External&amp;quot; unterschiedlich, je nachdem, ob der Compiler einen externen Linker verwendet nicht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Von Delphi unterstützte Plattformen können in die zwei folgenden Gruppen unterteilt werden:&lt;br /&gt;
&lt;br /&gt;
*Der Compiler verwendet den eigenen internen Linker.&lt;br /&gt;
&lt;br /&gt;
*Der Compiler verwendet einen externen Linker.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; frame=&amp;quot;hsides&amp;quot; rules=&amp;quot;rows&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
Verwenden des &#039;&#039;&#039;internen&#039;&#039;&#039; Linkers&amp;amp;nbsp;	&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
WIN32 und WIN64&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
Verwenden eines &#039;&#039;&#039;externen&#039;&#039;&#039; Linkers&amp;amp;nbsp;	&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
iOS-Device, Android, Linux, macOS64&amp;amp;nbsp;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
2. Auf Plattformen, auf denen Delphi einen internen Linker verwendet, gibt {{Code|external &amp;amp;lt;StringKonstante&amp;amp;gt;}} an, dass sich die Funktion/Prozedur in einer DLL befindet.&lt;br /&gt;
&lt;br /&gt;
Auf diesen Plattformen geht Delphi davon aus, dass das Symbol aus einer {{Code|.dll}} importiert wird. Beim Linken wird keine Validierung vorgenommen. Delphi generiert ein Bild mit einer Referenz auf das Symbol/die Bibliothek. Wenn sich das Symbol nicht in dieser Bibliothek befindet, werden Sie bei der Ausführung darauf hingewiesen.&lt;br /&gt;
&lt;br /&gt;
3. Auf Plattformen, auf denen Delphi einen externen Linker verwendet, beispielsweise wenn die iOSDevice64-Plattform das Ziel ist, wird der in {{Code|external &amp;amp;lt;StringKonstante&amp;amp;gt;}} angegebene Bezeichner an den externen Linker übergeben.&lt;br /&gt;
&lt;br /&gt;
Der Delphi-Compiler übergibt {{Code|&amp;amp;lt;StringKonstante&amp;amp;gt;}} an ld.exe. Wenn der Compiler die Bibliothek nicht findet, wird die folgende Fehlermeldung angezeigt: {{Code|Fehler: E2597 ld: Datei nicht gefunden: &amp;amp;lt;StringKonstante&amp;amp;gt;}}.&lt;br /&gt;
&lt;br /&gt;
====Funktionen aus Objektdateien importieren (nur externer Linker)====&lt;br /&gt;
&lt;br /&gt;
Wenn ein externer Linker verwendet wird, können Sie die Verwendung der Compiler-Direktive &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;$L&amp;lt;/span&amp;gt; (oder &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;$LINK&amp;lt;/span&amp;gt;) unterdrücken, indem Sie die Objektdatei mit der external-Direktive angeben. Zum Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
procedure FunctionName; cdecl; external object &#039;ObjectFile.o&#039; name &#039;_FunctionName&#039;;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Funktionen aus Frameworks importieren====&lt;br /&gt;
&lt;br /&gt;
Sie können keine Routinen aus einem externen Framework importieren. Zum Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Function foo: Integer; external framework &#039;&amp;lt;framework name&amp;gt;&#039;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies gilt nur für iOS64, macOS64 ARM und macOS64.&lt;br /&gt;
&lt;br /&gt;
====Eine Routine unter einem anderen Namen importieren====&lt;br /&gt;
&lt;br /&gt;
Sie können Routinen unter einem anderen als dem in der Bibliothek verwendeten Namen importieren, indem Sie den Originalnamen in der &#039;&#039;&#039;external&#039;&#039;&#039;-Direktive angeben:&lt;br /&gt;
&lt;br /&gt;
: {{Code|external &amp;amp;lt;StringKonstante1&amp;amp;gt; name &amp;amp;lt;StringKonstante2&amp;amp;gt;;}}&lt;br /&gt;
&lt;br /&gt;
{{Code|&amp;amp;lt;StringKonstante1&amp;amp;gt;}} gibt den Namen der Bibliotheksdatei an und {{Code|&amp;amp;lt;StringKonstante2&amp;amp;gt;}} ist der Originalname der Routine.&lt;br /&gt;
&lt;br /&gt;
Die folgende Deklaration importiert eine Funktion aus {{Path|user32.dll}} (Bestandteil der Windows-API):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
function MessageBox(HWnd: Integer; Text, Caption: PChar; Flags: Integer): Integer; stdcall; external &#039;user32.dll&#039; name &#039;MessageBoxW&#039;;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Originalname der Funktion lautet {{Code|MessageBoxW}}, sie wird jedoch unter dem Namen {{Code|MessageBox}} importiert.&lt;br /&gt;
&lt;br /&gt;
	Stellen Sie in Ihrer Import-Deklaration sicher, dass die Schreibweise und der Fall des Routinenamens übereinstimmen. Beim Aufruf der importierten Routine wird die Groß-/Kleinschreibung nicht mehr berücksichtigt.&lt;br /&gt;
&lt;br /&gt;
====Eine Routine über den Index importieren====&lt;br /&gt;
&lt;br /&gt;
Sie können die zu importierende Routine auch über eine Nummer angeben:&lt;br /&gt;
&lt;br /&gt;
: {{Code|external &amp;amp;lt;StringKonstante&amp;amp;gt; Index &amp;amp;lt;IntegerKonstante&amp;amp;gt;;}}&lt;br /&gt;
&lt;br /&gt;
{{Code|&amp;amp;lt;IntegerKonstante&amp;amp;gt;}} ist der Index der Routine in der Exporttabelle.&lt;br /&gt;
&lt;br /&gt;
====Laden der Bibliothek verzögern====&lt;br /&gt;
&lt;br /&gt;
Um das Laden der Bibliothek, die die Funktion enthält, bis zu dem Moment zu verzögern, an dem die Funktion wirklich benötigt wird, hängen Sie die Direktive {{Code|delayed}} an die importierte Funktion an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
function ExternalMethod(const SomeString: PChar): Integer; stdcall; external &#039;cstyle.dll&#039; delayed;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Code|delayed}} stellt sicher, dass die Bibliothek, die die importierte Funktion enthält, nicht beim Start der Anwendung geladen wird, sondern erst, wenn die Funktion aufgerufen wird. Weitere Informationen zu diesem Thema finden Sie unter [[Bibliotheken und Packages (Delphi)#Verzögertes Laden|Bibliotheken und Packages - Verzögertes Laden]].&lt;br /&gt;
&lt;br /&gt;
====Abhängigkeit von der Bibliothek festlegen====&lt;br /&gt;
&lt;br /&gt;
Wenn die Bibliothek, die die Zielroutine beinhaltet, von anderen Bibliotheken abhängt, verwenden Sie die {{Code|dependency}}-Direktive, um diese Abhängigkeit festzulegen.&lt;br /&gt;
&lt;br /&gt;
Um die {{Code|dependency}}-Direktive zu verwenden, fügen Sie das Schlüsselwort {{Code|dependency}}, gefolgt von einer durch ein Komma getrennten String-Liste an. Jeder String muss einen Namen einer Bibliothek enthalten, die von einer externen Zielbibliothek abhängig ist:&lt;br /&gt;
&lt;br /&gt;
: {{Code|external {{Placeholder|library}} dependency {{Placeholder|dependency1}}, {{Placeholder|dependency2}}, …}}&lt;br /&gt;
&lt;br /&gt;
Die folgende Deklaration gibt an, dass {{Path|libmidas.a}} von der Standard-C++-Bibliothek abhängig ist: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
function DllGetDataSnapClassObject(const [REF] CLSID, [REF] IID: TGUID; var Obj): HResult; cdecl; external &#039;libmidas.a&#039; dependency &#039;stdc++&#039;;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Prozeduren und Funktionen überladen==&lt;br /&gt;
&lt;br /&gt;
Sie können mehrere Routinen mit identischen Namen in demselben Gültigkeitsbereich deklarieren. Dieses Verfahren wird Überladen genannt. Überladene Routinen müssen mit der Direktive &#039;&#039;&#039;overload&#039;&#039;&#039; deklariert werden und unterschiedliche Parameterlisten haben. Beispiele: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 function Divide(X, Y: Real): Real; overload;&lt;br /&gt;
 begin&lt;br /&gt;
   Result := X/Y;&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
 function Divide(X, Y: Integer): Integer; overload;&lt;br /&gt;
 begin&lt;br /&gt;
   Result := X div Y;&lt;br /&gt;
 end;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Deklarationen definieren zwei Funktionen namens &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Divide&amp;lt;/span&amp;gt;, die Parameter mit unterschiedlichen Typen entgegennehmen. Wenn Sie &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Divide&amp;lt;/span&amp;gt; aufrufen, ermittelt der Compiler die zu verwendende Funktion durch Prüfung des übergebenen Parametertyps. &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Divide(6.0, 3.0)&amp;lt;/span&amp;gt; ruft beispielsweise die erste &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Divide&amp;lt;/span&amp;gt;-Funktion auf, weil es sich bei den Argumenten um reelle Zahlen handelt.&lt;br /&gt;
&lt;br /&gt;
Einer überladenen Routine können Parameter übergeben werden, deren Typ keinem der in den Routinendeklarationen verwendeten Typen entspricht. Voraussetzung dafür ist, dass diese Parameter zuweisungskompatibel mit den Parametern in mehr als einer Deklaration sind. Dieses Vorgehen wird meist beim Überladen von Routinen mit unterschiedlichen Integer- oder Real-Typen verwendet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 procedure Store(X: Longint); overload;&lt;br /&gt;
 procedure Store(X: Shortint); overload;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn die Eindeutigkeit gewährleistet ist, ruft der Compiler in diesen Fällen die Routine auf, deren Parametertyp für den Wertebereich der tatsächlich übergebenen Parameter mindestens erforderlich ist. (Beachten Sie, dass konstante Ausdrücke, die reelle Zahlen sind, immer vom Typ &#039;&#039;&#039;Extended&#039;&#039;&#039; sind.) &lt;br /&gt;
&lt;br /&gt;
Überladene Routinen müssen hinsichtlich der Anzahl der entgegengenommenen Parameter oder der Typen dieser Parameter eindeutig sein. Die folgenden beiden Deklarationen führen deshalb zu einem Fehler bei der Compilierung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 function Cap(S: string): string; overload;&lt;br /&gt;
   ...&lt;br /&gt;
 procedure Cap(var Str: string); overload;&lt;br /&gt;
   ...&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dagegen sind die Deklarationen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 function Func(X: Real; Y: Integer): Real; overload;&lt;br /&gt;
   ...&lt;br /&gt;
 function Func(X: Integer; Y: Real): Real; overload;&lt;br /&gt;
   ...&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
zulässig. &lt;br /&gt;
&lt;br /&gt;
Wird eine überladene Routine mit &#039;&#039;&#039;forward&#039;&#039;&#039; oder &amp;quot;interface&amp;quot; deklariert, muss die Parameterliste in der definierenden Deklaration der Routine wiederholt werden.&lt;br /&gt;
&lt;br /&gt;
Der Compiler kann zwischen überladenen Funktionen unterscheiden, die &#039;&#039;&#039;AnsiString&#039;&#039;&#039;/&#039;&#039;&#039;PAnsiChar&#039;&#039;&#039;, &#039;&#039;&#039;UnicodeString&#039;&#039;&#039;/&#039;&#039;&#039;PChar&#039;&#039;&#039; und &#039;&#039;&#039;WideString&#039;&#039;&#039;/&#039;&#039;&#039;PWideChar&#039;&#039;&#039; Parameter in derselben Parameterposition enthalten. String-Konstanten oder String-Literale, die in eine solche überladene Position übergeben werden, werden in den nativen String- oder Zeichentyp übersetzt, der &#039;&#039;&#039;UnicodeString&#039;&#039;&#039;/&#039;&#039;&#039;PChar&#039;&#039;&#039; lautet. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 procedure test(const A: AnsiString); overload;&lt;br /&gt;
 procedure test(const W: WideString); overload;&lt;br /&gt;
 procedure test(const U: UnicodeString); overload;&lt;br /&gt;
 procedure test(const PW: PWideChar); overload;&lt;br /&gt;
 var&lt;br /&gt;
   a: AnsiString;&lt;br /&gt;
   b: WideString;&lt;br /&gt;
   c: UnicodeString;&lt;br /&gt;
   d: PWideChar;&lt;br /&gt;
   e: string;&lt;br /&gt;
 begin&lt;br /&gt;
   a := &#039;a&#039;;&lt;br /&gt;
   b := &#039;b&#039;;&lt;br /&gt;
   c := &#039;c&#039;;&lt;br /&gt;
   d := &#039;d&#039;;&lt;br /&gt;
   e := &#039;e&#039;;&lt;br /&gt;
   test(a);    // calls AnsiString version&lt;br /&gt;
   test(b);    // calls WideString version&lt;br /&gt;
   test(c);    // calls UnicodeString version&lt;br /&gt;
   test(d);    // calls PWideChar version&lt;br /&gt;
   test(e);    // calls UnicodeString version&lt;br /&gt;
   test(&#039;abc&#039;);    // calls UnicodeString version&lt;br /&gt;
   test(AnsiString (&#039;abc&#039;));    // calls AnsiString version&lt;br /&gt;
   test(WideString(&#039;abc&#039;));    // calls WideString version&lt;br /&gt;
   test(PWideChar(&#039;PWideChar&#039;));    // calls PWideChar version&lt;br /&gt;
 end;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Varianten können ebenfalls als Parameter in überladenen Funktionsdeklarationen verwendet werden. Eine Variante wird allgemeiner angesehen als ein beliebiger einfacher Typ. Exakte Typübereinstimmungen werden stets gegenüber Variantenübereinstimmungen bevorzugt. Wird eine Variante an eine solche überladene Position übergeben, und ist eine overload-Anweisung an dieser Parameterposition vorhanden, die eine Variante akzeptiert, wird diese als exakte Übereinstimmung für den Variant-Typ angesehen.&lt;br /&gt;
&lt;br /&gt;
Dies kann bei Gleitkommatypen einige geringe Nebeneffekte bewirken. Gleitkommatypen werden anhand der Größe verglichen. Falls es keine genaue Übereinstimmung für die Gleitkommavariable gibt, die an den overload-Aufruf übergeben wird, aber ein varianter Parameter vorhanden ist, erhält die Variante den Vorzug gegenüber dem kleineren Gleitkommatyp. &lt;br /&gt;
&lt;br /&gt;
Zum Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 procedure foo(i: integer); overload;&lt;br /&gt;
 procedure foo(d: double); overload;&lt;br /&gt;
 procedure foo(v: variant); overload;&lt;br /&gt;
 var&lt;br /&gt;
   v: variant;&lt;br /&gt;
 begin&lt;br /&gt;
   foo(1);       // integer version&lt;br /&gt;
   foo(v);       // variant version&lt;br /&gt;
   foo(1.2);     // variant version (float literals -&amp;gt; extended precision)&lt;br /&gt;
 end;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieses Beispiel ruft die variant-Version von &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;foo&amp;lt;/span&amp;gt;, nicht die double-Version auf, da die Konstante 1.2 implizit ein extended-Typ ist. extended ist jedoch keine genaue Übereinstimmung für double. &#039;&#039;&#039;Extended&#039;&#039;&#039; ist auch keine Übereinstimmung für &#039;&#039;&#039;Variant&#039;&#039;&#039;, aber &#039;&#039;&#039;Variant&#039;&#039;&#039; wird als allgemeinerer Typ angesehen (während &#039;&#039;&#039;Double&#039;&#039;&#039; ein kleinerer Typ als &#039;&#039;&#039;Extended&#039;&#039;&#039; ist).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 foo(Double(1.2));&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Typumwandlung funktioniert nicht. Verwenden Sie stattdessen typisierte Konstanten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 const  d: double = 1.2;&lt;br /&gt;
   begin&lt;br /&gt;
     foo(d);&lt;br /&gt;
   end;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Quelltext arbeitet korrekt und ruft die double-Version auf.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 const  s: single = 1.2;&lt;br /&gt;
   begin&lt;br /&gt;
     foo(s);&lt;br /&gt;
   end;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Quelltext funktioniert und ruft die double-Version von &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;foo&amp;lt;/span&amp;gt; auf. &#039;&#039;&#039;Single&#039;&#039;&#039; passt besser zu double als &#039;&#039;&#039;variant&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Bei der Deklaration von überladenen Routinen besteht die beste Möglichkeit zur Vermeidung einer Gleitkommapromotion zu Variant darin, eine Version ihrer überladenen Funktion für jeden Gleitkommatyp (&#039;&#039;&#039;Single&#039;&#039;&#039;, &#039;&#039;&#039;Double&#039;&#039;&#039;, &#039;&#039;&#039;Extended&#039;&#039;&#039;) zusammen mit der &#039;&#039;&#039;Variant&#039;&#039;&#039;-Version zu deklarieren. &lt;br /&gt;
&lt;br /&gt;
Bei Verwendung von Standardparametern in überladenen Routinen müssen Sie mehrdeutige Parametersignaturen vermeiden.&lt;br /&gt;
&lt;br /&gt;
Die möglichen Auswirkungen des Überladens lassen sich beschränken, indem Sie beim Aufruf den qualifizierten Routinennamen verwenden. Mit &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Unit1.MyProcedure(X, Y)&amp;lt;/span&amp;gt; können nur die in &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Unit1;&amp;lt;/span&amp;gt; deklarierten Routinen aufgerufen werden. Wenn der Name und die Parameterliste keiner Routine in &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Unit1&amp;lt;/span&amp;gt; entsprechen, gibt der Compiler einen Fehler aus.&lt;br /&gt;
&lt;br /&gt;
==Lokale Deklarationen==&lt;br /&gt;
&lt;br /&gt;
Der Rumpf einer Funktion oder Prozedur beginnt in vielen Fällen mit der Deklaration lokaler Variablen, die im Anweisungsblock der Routine verwendet werden. Sie können beispielsweise Konstanten, Typen und andere Routinen deklarieren. Der Gültigkeitsbereich lokaler Bezeichner ist auf die Routine beschränkt, in der sich die Deklaration befindet.&lt;br /&gt;
&lt;br /&gt;
===Verschachtelte Routinen===&lt;br /&gt;
&lt;br /&gt;
Funktionen und Prozeduren können im Abschnitt mit den lokalen Deklarationen ihrerseits Funktionen und Prozeduren enthalten. Die folgende Deklaration der Prozedur &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;DoSomething&amp;lt;/span&amp;gt; enthält beispielsweise eine verschachtelte Prozedur: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 procedure DoSomething(S: string);&lt;br /&gt;
 var&lt;br /&gt;
   X, Y: Integer;&lt;br /&gt;
&lt;br /&gt;
   procedure NestedProc(S: string);&lt;br /&gt;
   begin&lt;br /&gt;
   ...&lt;br /&gt;
   end;&lt;br /&gt;
&lt;br /&gt;
 begin&lt;br /&gt;
   ...&lt;br /&gt;
   NestedProc(S);&lt;br /&gt;
   ...&lt;br /&gt;
 end;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Gültigkeitsbereich einer verschachtelten Routine ist auf die Funktion bzw. Prozedur beschränkt, in der sie deklariert ist. Im letzten Beispiel kann &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;NestedProc&amp;lt;/span&amp;gt; nur in &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;DoSomething&amp;lt;/span&amp;gt; aufgerufen werden..&lt;br /&gt;
&lt;br /&gt;
Echte Beispiele verschachtelter Routinen sind die Prozedur DateTimeToString, die Funktion&#039;&#039;&#039;ScanDate&#039;&#039;&#039; und andere Routinen in der Unit &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;SysUtils&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
&lt;br /&gt;
* [[Parameter (Delphi)|Parameter (Delphi)]]&lt;br /&gt;
*[[Prozeduren und Funktionen aufrufen (Delphi)|Prozeduren und Funktionen aufrufen (Delphi)]]&lt;br /&gt;
* [[Deklarationen und Anweisungen (Delphi)|Deklarationen und Anweisungen (Delphi)]]&lt;br /&gt;
* [[Methoden (Delphi)|Methoden (Delphi)]]&lt;br /&gt;
* [[Ablaufsteuerung (Delphi)|Ablaufsteuerung (Delphi)]]&lt;br /&gt;
* [[Prozedurale Typen|Prozedurale Typen (Delphi)]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Delphi]]&lt;br /&gt;
[[Category:Delphi-Sprachreferenz]]&lt;br /&gt;
[[Category:AMMigrate]]&lt;/div&gt;</summary>
		<author><name>Nicolas.rios</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Hilfe_zur_Hilfe_-_CHM&amp;diff=219320</id>
		<title>Hilfe zur Hilfe - CHM</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Hilfe_zur_Hilfe_-_CHM&amp;diff=219320"/>
		<updated>2025-10-22T15:26:37Z</updated>

		<summary type="html">&lt;p&gt;Nicolas.rios: /* Die Offline-CHM-Hilfe aktualisieren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Parent|Hilfe zur Hilfe}}&lt;br /&gt;
&lt;br /&gt;
Die CHM-Hilfe von {{Product}} wird mit {{Product}} ausgeliefert und reagiert auf die &#039;&#039;&#039;Hilfe&#039;&#039;&#039;-Schaltfläche oder die Taste {{Key|F1}} in der IDE. Diese Hilfe liegt im Format &#039;&#039;&#039;[[Wikipedia:Microsoft Compiled HTML Help|Microsoft Compilierte HTML-Hilfe]]&#039;&#039;&#039;, auch als CHM bezeichnet, vor.&lt;br /&gt;
&lt;br /&gt;
Im &#039;&#039;&#039;HTML-Hilfe-Viewer unter Windows&#039;&#039;&#039; gibt es zwei Bereiche:&lt;br /&gt;
&lt;br /&gt;
* Im linken Bereich können Sie auf Navigationsfunktionen: &#039;&#039;&#039;Inhalt&#039;&#039;&#039;, &#039;&#039;&#039;Index&#039;&#039;&#039;, &#039;&#039;&#039;Suchen&#039;&#039;&#039;, &#039;&#039;&#039;Favoriten&#039;&#039;&#039; zugreifen.&lt;br /&gt;
* Im rechten Bereich wird das aktuelle Hilfethema angezeigt.&lt;br /&gt;
&lt;br /&gt;
==Kontextsensitive F1-Hilfe in der IDE==&lt;br /&gt;
&lt;br /&gt;
Kontextsensitive Hilfe wird durch Auswahl eines Elements in der IDE und Drücken von {{Key|F1}} aufgerufen:&lt;br /&gt;
&lt;br /&gt;
* Im &#039;&#039;&#039;[[Quelltext-Editor#Verwenden_von_F1-Hilfe|Quelltext-Editor]]&#039;&#039;&#039; können Sie:&lt;br /&gt;
** Auf einen {{Code|identifier}} zeigen, der einem Namen einer Prozedur, Funktion, Konstanten, Eigenschaft, Variablen, Feld, Typ, Programm, Unit, Bibliothek oder Package, das in den installierten CHM-Hilfedateien beschrieben wird, entspricht.&lt;br /&gt;
** Auf ein {{Code|word}} (oder {{Code|token}}) zeigen, der einem [[Grundlegende syntaktische Elemente (Delphi)#Reservierte_Wörter|reservierten Wort]], [[Grundlegende syntaktische Elemente (Delphi)#Directiven|Directive]] oder [[Schlüsselwörter|C++-Schlüsselwort]] entspricht.&lt;br /&gt;
** Einen qualifizierten Bezeichner {{Code|identifier1.identifier2}} auswählen. Hier qualifiziert {{Code|identifier1}} {{Code|identifier2}}. Sie können z. B. {{Code|TCollection.Clear}} auswählen.&lt;br /&gt;
** Im &#039;&#039;&#039;Quelltext-Editor&#039;&#039;&#039; auf eine beliebe Stelle zeigen. &lt;br /&gt;
* In einem Formular im &#039;&#039;&#039;[[Formular-Designer|Formular-Designer]]&#039;&#039;&#039; markieren Sie die Komponente.&lt;br /&gt;
* Im Fenster &#039;&#039;&#039;[[Fenster: Meldungen|Meldungen]]&#039;&#039;&#039; markieren Sie eine Meldung.&lt;br /&gt;
* In IDE-Fenstern, wie der &#039;&#039;&#039;[[Projekte-Fenster|Projektverwaltung]]&#039;&#039;&#039; oder der &#039;&#039;&#039;[[Modellansicht|Modellansicht]]&#039;&#039;&#039;, klicken Sie in das Fenster.&lt;br /&gt;
&lt;br /&gt;
==DocWiki enthält die aktuellen Informationen==&lt;br /&gt;
&lt;br /&gt;
Die {{Product}}-Hilfe wird aus einem Wiki erzeugt: &#039;&#039;&#039;[[Hilfe zur Hilfe: DocWiki|DocWiki]]&#039;&#039;&#039;. Die Hilfe mit den neuesten Informationen finden Sie stets im DocWiki.  Alle Benutzer von {{Product}} sind eingeladen, sich am DocWiki zu beteiligen. Sie können ein eigenes Benutzerkonto erstellen, indem Sie auf einer beliebigen Seite im DocWiki auf &#039;&#039;&#039;Anmelden/Benutzerkonto anlegen&#039;&#039;&#039; klicken.&lt;br /&gt;
&lt;br /&gt;
Das DocWiki ist in drei einzelne DocWikis unterteilt:&lt;br /&gt;
&lt;br /&gt;
* Themenbezogene Seiten: {{f|radstudio|[http://docwiki.embarcadero.com/RADStudio/en/Main_Page}}{{f|appmethod|http://docwiki.appmethod.com/appmethod/topics/en/Main_Page}} http://docwiki.embarcadero.com/RADStudio/de/Hauptseite}}{{f|appmethod|http://docwiki.appmethod.com/appmethod/topics/de/Hauptseite}}]&lt;br /&gt;
* Bibliotheksreferenz: {{f|radstudio|[http://docwiki.embarcadero.com/Libraries/en/Main_Page}}{{f|appmethod|http://docwiki.appmethod.com/appmethod/libraries/en/Main_Page}} http://docwiki.embarcadero.com/Libraries/de/Hauptseite}}{{f|appmethod|http://docwiki.appmethod.com/appmethod/libraries/de/Hauptseite}}]&lt;br /&gt;
* Code- und Produktbeispiele: {{f|radstudio|[http://docwiki.embarcadero.com/CodeExamples/en/Main_Page}}{{f|appmethod|docwiki.appmethod.com/appmethod/codeexamples/en/Main_Page}} http://docwiki.embarcadero.com/CodeExamples/en/Main_Page}}{{f|appmethod|docwiki.appmethod.com/appmethod/codeexamples/en/Main_Page}}]&lt;br /&gt;
&lt;br /&gt;
In der Offline-CHM-Hilfe wird auf jeder Seite ein Link, &#039;&#039;&#039;Aktuelle Wiki-Seite&#039;&#039;&#039; angezeigt: Klicken Sie auf diesen Link, um auf die aktuelle Docwiki-Version der angezeigten Seite zuzugreifen.&lt;br /&gt;
&lt;br /&gt;
===Die Offline-CHM-Hilfe aktualisieren===&lt;br /&gt;
&lt;br /&gt;
Gelegentlich&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; wird eine neuere Version der Offline-CHM-Hilfe als separater Download bereitgestellt. Um die neuere Version anzuwenden, folgenden Sie den unten genannten Schritten:&lt;br /&gt;
&amp;lt;section begin=&amp;quot;steps&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#  Schließen Sie {{Product}}.&lt;br /&gt;
#  Laden Sie die [http://docwiki.embarcadero.com/docs/products/rad_studio/{{RadstudioVersion}}/{{RadstudioVersion}}-CHM-de.zip Zip-Datei] mit den CHM-Dateien herunter.&lt;br /&gt;
#  Extrahieren Sie die ZIP-Datei.&lt;br /&gt;
#  Navigieren Sie zum Speicherort der CHM-Dateien (standardmäßig {{Path|{{InstallPath}}\Help\Doc\de}}).&lt;br /&gt;
#  Überschreiben Sie die vorhandenen CHM-Dateien mit denen aus der ZIP-Datei (Sie können vorher eine Sicherung der alten CHM-Dateien erstellen).&lt;br /&gt;
#  Öffnen Sie {{Product}}.&lt;br /&gt;
#  Starten Sie die Hilfe.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;section end=&amp;quot;steps&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt;Sie finden das Datum, an dem die CHM-Dateien aktualisiert wurden, [https://docwiki.embarcadero.com/docs/products/rad_studio/index.php hier] oder in der Readme-Datei, di in der [http://docwiki.embarcadero.com/docs/products/rad_studio/{{RadstudioVersion}}/{{RadstudioVersion}}-CHM-de.zip Zip-Datei] enthalten ist.&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
&lt;br /&gt;
* [[Hilfe für Ihre Komponenten bereitstellen|Hilfe für Ihre Komponenten bereitstellen]]&lt;br /&gt;
* [[Einführung in RAD Studio|Einführung in {{Product}}]]&lt;br /&gt;
* [[Hilfe zur Hilfe: DocWiki|Hilfe zur Hilfe: DocWiki]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Einführung]]&lt;br /&gt;
[[Category:XE8]]&lt;br /&gt;
[[Category:AMMigrate]]&lt;br /&gt;
&lt;br /&gt;
[[en:Help on Help - CHM]]&lt;br /&gt;
[[fr:Utilisation de l&#039;aide - CHM]]&lt;br /&gt;
[[ja:ヘルプの使用方法 - CHM]]&lt;/div&gt;</summary>
		<author><name>Nicolas.rios</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Hilfe_zur_Hilfe_-_CHM&amp;diff=219319</id>
		<title>Hilfe zur Hilfe - CHM</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Hilfe_zur_Hilfe_-_CHM&amp;diff=219319"/>
		<updated>2025-10-22T15:21:07Z</updated>

		<summary type="html">&lt;p&gt;Nicolas.rios: RS-130010&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Parent|Hilfe zur Hilfe}}&lt;br /&gt;
&lt;br /&gt;
Die CHM-Hilfe von {{Product}} wird mit {{Product}} ausgeliefert und reagiert auf die &#039;&#039;&#039;Hilfe&#039;&#039;&#039;-Schaltfläche oder die Taste {{Key|F1}} in der IDE. Diese Hilfe liegt im Format &#039;&#039;&#039;[[Wikipedia:Microsoft Compiled HTML Help|Microsoft Compilierte HTML-Hilfe]]&#039;&#039;&#039;, auch als CHM bezeichnet, vor.&lt;br /&gt;
&lt;br /&gt;
Im &#039;&#039;&#039;HTML-Hilfe-Viewer unter Windows&#039;&#039;&#039; gibt es zwei Bereiche:&lt;br /&gt;
&lt;br /&gt;
* Im linken Bereich können Sie auf Navigationsfunktionen: &#039;&#039;&#039;Inhalt&#039;&#039;&#039;, &#039;&#039;&#039;Index&#039;&#039;&#039;, &#039;&#039;&#039;Suchen&#039;&#039;&#039;, &#039;&#039;&#039;Favoriten&#039;&#039;&#039; zugreifen.&lt;br /&gt;
* Im rechten Bereich wird das aktuelle Hilfethema angezeigt.&lt;br /&gt;
&lt;br /&gt;
==Kontextsensitive F1-Hilfe in der IDE==&lt;br /&gt;
&lt;br /&gt;
Kontextsensitive Hilfe wird durch Auswahl eines Elements in der IDE und Drücken von {{Key|F1}} aufgerufen:&lt;br /&gt;
&lt;br /&gt;
* Im &#039;&#039;&#039;[[Quelltext-Editor#Verwenden_von_F1-Hilfe|Quelltext-Editor]]&#039;&#039;&#039; können Sie:&lt;br /&gt;
** Auf einen {{Code|identifier}} zeigen, der einem Namen einer Prozedur, Funktion, Konstanten, Eigenschaft, Variablen, Feld, Typ, Programm, Unit, Bibliothek oder Package, das in den installierten CHM-Hilfedateien beschrieben wird, entspricht.&lt;br /&gt;
** Auf ein {{Code|word}} (oder {{Code|token}}) zeigen, der einem [[Grundlegende syntaktische Elemente (Delphi)#Reservierte_Wörter|reservierten Wort]], [[Grundlegende syntaktische Elemente (Delphi)#Directiven|Directive]] oder [[Schlüsselwörter|C++-Schlüsselwort]] entspricht.&lt;br /&gt;
** Einen qualifizierten Bezeichner {{Code|identifier1.identifier2}} auswählen. Hier qualifiziert {{Code|identifier1}} {{Code|identifier2}}. Sie können z. B. {{Code|TCollection.Clear}} auswählen.&lt;br /&gt;
** Im &#039;&#039;&#039;Quelltext-Editor&#039;&#039;&#039; auf eine beliebe Stelle zeigen. &lt;br /&gt;
* In einem Formular im &#039;&#039;&#039;[[Formular-Designer|Formular-Designer]]&#039;&#039;&#039; markieren Sie die Komponente.&lt;br /&gt;
* Im Fenster &#039;&#039;&#039;[[Fenster: Meldungen|Meldungen]]&#039;&#039;&#039; markieren Sie eine Meldung.&lt;br /&gt;
* In IDE-Fenstern, wie der &#039;&#039;&#039;[[Projekte-Fenster|Projektverwaltung]]&#039;&#039;&#039; oder der &#039;&#039;&#039;[[Modellansicht|Modellansicht]]&#039;&#039;&#039;, klicken Sie in das Fenster.&lt;br /&gt;
&lt;br /&gt;
==DocWiki enthält die aktuellen Informationen==&lt;br /&gt;
&lt;br /&gt;
Die {{Product}}-Hilfe wird aus einem Wiki erzeugt: &#039;&#039;&#039;[[Hilfe zur Hilfe: DocWiki|DocWiki]]&#039;&#039;&#039;. Die Hilfe mit den neuesten Informationen finden Sie stets im DocWiki.  Alle Benutzer von {{Product}} sind eingeladen, sich am DocWiki zu beteiligen. Sie können ein eigenes Benutzerkonto erstellen, indem Sie auf einer beliebigen Seite im DocWiki auf &#039;&#039;&#039;Anmelden/Benutzerkonto anlegen&#039;&#039;&#039; klicken.&lt;br /&gt;
&lt;br /&gt;
Das DocWiki ist in drei einzelne DocWikis unterteilt:&lt;br /&gt;
&lt;br /&gt;
* Themenbezogene Seiten: {{f|radstudio|[http://docwiki.embarcadero.com/RADStudio/en/Main_Page}}{{f|appmethod|http://docwiki.appmethod.com/appmethod/topics/en/Main_Page}} http://docwiki.embarcadero.com/RADStudio/de/Hauptseite}}{{f|appmethod|http://docwiki.appmethod.com/appmethod/topics/de/Hauptseite}}]&lt;br /&gt;
* Bibliotheksreferenz: {{f|radstudio|[http://docwiki.embarcadero.com/Libraries/en/Main_Page}}{{f|appmethod|http://docwiki.appmethod.com/appmethod/libraries/en/Main_Page}} http://docwiki.embarcadero.com/Libraries/de/Hauptseite}}{{f|appmethod|http://docwiki.appmethod.com/appmethod/libraries/de/Hauptseite}}]&lt;br /&gt;
* Code- und Produktbeispiele: {{f|radstudio|[http://docwiki.embarcadero.com/CodeExamples/en/Main_Page}}{{f|appmethod|docwiki.appmethod.com/appmethod/codeexamples/en/Main_Page}} http://docwiki.embarcadero.com/CodeExamples/en/Main_Page}}{{f|appmethod|docwiki.appmethod.com/appmethod/codeexamples/en/Main_Page}}]&lt;br /&gt;
&lt;br /&gt;
In der Offline-CHM-Hilfe wird auf jeder Seite ein Link, &#039;&#039;&#039;Aktuelle Wiki-Seite&#039;&#039;&#039; angezeigt: Klicken Sie auf diesen Link, um auf die aktuelle Docwiki-Version der angezeigten Seite zuzugreifen.&lt;br /&gt;
&lt;br /&gt;
===Die Offline-CHM-Hilfe aktualisieren===&lt;br /&gt;
&lt;br /&gt;
Gelegentlich&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; wird eine neuere Version der Offline-CHM-Hilfe als separater Download bereitgestellt. Um die neuere Version anzuwenden, folgenden Sie den unten genannten Schritten:&lt;br /&gt;
&amp;lt;section begin=&amp;quot;steps&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#  Schließen Sie {{Product}}.&lt;br /&gt;
#  Laden Sie die [http://docwiki.embarcadero.com/docs/products/rad_studio/{{RadstudioVersion}}/{{RadstudioVersion}}-CHM-en.zip Zip-Datei] mit den CHM-Dateien herunter.&lt;br /&gt;
#  Extrahieren Sie die ZIP-Datei.&lt;br /&gt;
#  Navigieren Sie zum Speicherort der CHM-Dateien (standardmäßig {{Path|{{InstallPath}}\Help\Doc\de}}).&lt;br /&gt;
#  Überschreiben Sie die vorhandenen CHM-Dateien mit denen aus der ZIP-Datei (Sie können vorher eine Sicherung der alten CHM-Dateien erstellen).&lt;br /&gt;
#  Öffnen Sie {{Product}}.&lt;br /&gt;
#  Starten Sie die Hilfe.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;section end=&amp;quot;steps&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt;Sie finden das Datum, an dem die CHM-Dateien aktualisiert wurden, [https://docwiki.embarcadero.com/docs/products/rad_studio/index.php hier] oder in der Readme-Datei, di in der [http://docwiki.embarcadero.com/docs/products/rad_studio/{{RadstudioVersion}}/{{RadstudioVersion}}-CHM-en.zip Zip-Datei] enthalten ist.&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
&lt;br /&gt;
* [[Hilfe für Ihre Komponenten bereitstellen|Hilfe für Ihre Komponenten bereitstellen]]&lt;br /&gt;
* [[Einführung in RAD Studio|Einführung in {{Product}}]]&lt;br /&gt;
* [[Hilfe zur Hilfe: DocWiki|Hilfe zur Hilfe: DocWiki]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Einführung]]&lt;br /&gt;
[[Category:XE8]]&lt;br /&gt;
[[Category:AMMigrate]]&lt;br /&gt;
&lt;br /&gt;
[[en:Help on Help - CHM]]&lt;br /&gt;
[[fr:Utilisation de l&#039;aide - CHM]]&lt;br /&gt;
[[ja:ヘルプの使用方法 - CHM]]&lt;/div&gt;</summary>
		<author><name>Nicolas.rios</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=FireMonkey_for_Linux&amp;diff=219318</id>
		<title>FireMonkey for Linux</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=FireMonkey_for_Linux&amp;diff=219318"/>
		<updated>2025-08-22T19:21:14Z</updated>

		<summary type="html">&lt;p&gt;Nicolas.rios: /* Erzeugen und Bereitstellen Ihres ersten Projekts */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Was ist FMX for Linux?==&lt;br /&gt;
&lt;br /&gt;
FireMonkey for Linux, auch als FMXLinux bezeichnet, ist eine Zusatzkomponente, die Kunden von Delphi und RAD Studio Enterprise und Architect Edition über eine exklusive OEM-Vereinbarung mit [http://www.fmxlinux.com/ FMXLinux] zur Verfügung steht. FMXLinux ermöglicht die Erstellung von GUI-Anwendungen für Linux und erweitert somit das plattformübergreifende FireMonkey-Framework von RAD Studio (Delphi Edition).&lt;br /&gt;
&lt;br /&gt;
Ab 10.3.1 ist der FireMonkey for Linux (FMX)-Client für Delphi und RAD Studio Enterprise-Kunden mit einer aktuellen Update Subskription über den GetIt-Package-Manager von RAD Studio in der IDE verfügbar.&lt;br /&gt;
&lt;br /&gt;
===Schlüsselfunktionen:===&lt;br /&gt;
&lt;br /&gt;
* FireMonkey for Linux ermöglicht die Erstellung von GUI-Anwendungen für Linux und erweitert somit das plattformübergreifende FireMonkey-Framework von Delphi.&lt;br /&gt;
* FMXLinux erweitert die Delphi-Unterstützung von Serveranwendungen auf FMX-Client-Anwendungen für gängige Linux-Distributionen.&lt;br /&gt;
* Enthält mehrere gebrauchsfertige Benutzeroberflächenstile.&lt;br /&gt;
* Viele FMX-Komponenten, wie Tabellen, Widgets usw., arbeiten nahtlos auf Linux-Clients.&lt;br /&gt;
* Nutzen Sie die innovativen Funktionen von RAD Studio, wie LiveBindings und mehr, in Ihren Linux-Client-Anwendungen.&lt;br /&gt;
* Nutzen Sie die WebKitGTK-Unterstützung, um eine FMXLinux-Anwendung im Browser als HTML5-Webanwendung auszuführen.&lt;br /&gt;
&lt;br /&gt;
===Zugriff auf FMX for Linux===&lt;br /&gt;
&lt;br /&gt;
Um FMXLinux herunterzuladen und zu installieren, öffnen Sie Delphi, wählen {{Menu|Tools &amp;amp;gt; GetIt-Package-Manager}} aus, und suchen nach &#039;&#039;&#039;fmxlinux&#039;&#039;&#039;. Am Ende des Vorgangs fordert Sie der GetIt-Package-Manager zum Neustart der IDE auf.&lt;br /&gt;
&lt;br /&gt;
[[File:FMXLinux01.png]]&lt;br /&gt;
&lt;br /&gt;
==Voraussetzungen für FireMonkey-GUI-Anwendungen==&lt;br /&gt;
&lt;br /&gt;
===Installieren der Linux-Plattformunterstützung===&lt;br /&gt;
&lt;br /&gt;
Vor der Installation von FMXLinux müssen Sie die Linux-Plattformunterstützung für Delphi installieren. Wählen Sie {{Menu|Tools &amp;amp;gt; Plattformen verwalten}}, um zu überprüfen, ob &#039;&#039;&#039;Delphi Linux 64 Bit&#039;&#039;&#039; installiert ist. &lt;br /&gt;
&lt;br /&gt;
[[File:FMXLinux02.png]]&lt;br /&gt;
&lt;br /&gt;
===Installieren und Ausführen von PAServer===&lt;br /&gt;
&lt;br /&gt;
Nach der Installation der Linux-Plattformunterstützung müssen Sie den [[PAServer: Die Platform Assistant Server-Anwendung|Platform Assistant]] auf Linux installieren, um Linux-Anwendungen zu erzeugen und bereitzustellen. PAServer ermöglicht Ihnen, den [[Bereitstellungs-Manager|Bereitstellungs-Manager]] zu verwenden, das Linux-SDK zu importieren und Remote-Debugging auf einem Linux-System durchzuführen. Nach der Installation von PAServer für Linux müssen Sie zunächst [[Ausführen des Platform Assistant unter Linux|PAServer ausführen]], bevor Sie mit dem Erzeugen von FMXLinux-GUI-Anwendungen beginnen können.&lt;br /&gt;
&lt;br /&gt;
===Installieren von Abhängigkeiten auf dem Linux-Server===&lt;br /&gt;
&lt;br /&gt;
Um die grafischen Funktionen in Ihrer Serveranwendung zu verwenden, müssen Sie bestimmte Abhängigkeiten installieren. Es ist nicht erforderlich, das gesamte X11-System auf Ihrem Server zu installieren.&lt;br /&gt;
&lt;br /&gt;
Geben Sie Folgendes in das Terminal ein, um Abhängigkeiten auf Ubuntu/Debian zu installieren:&lt;br /&gt;
&lt;br /&gt;
 sudo apt install libgl1-mesa-glx libglu1-mesa libgtk-3-common libgstreamer1.0 libgstreamer-plugins-base1.0&lt;br /&gt;
&lt;br /&gt;
==Erste Schritte==&lt;br /&gt;
&lt;br /&gt;
===FMXLinux-Konfiguration===&lt;br /&gt;
&lt;br /&gt;
Bei der Installation von FMXLinux über GetIt registriert das System das unten gezeigte DLL-Experten-Menü (&amp;quot;Linux-Plattform hinzufügen&amp;quot;) und fügt dem Bibliothekspfad auch den Bibliotheksordner für das Katalog-Repository für die Linux-Plattform hinzu. Sie können dies unter {{Menu|Tools &amp;amp;gt; Optionen &amp;amp;gt; Sprache &amp;amp;gt; Delphi-Optionen &amp;amp;gt; Bibliothek}} überprüfen und oben aus dem Kombinationsfeld &#039;&#039;&#039;Plattformen auswählen&#039;&#039;&#039; die Option &#039;&#039;&#039;Linux 64 Bit&#039;&#039;&#039; auswählen:&lt;br /&gt;
&lt;br /&gt;
[[File:FMXLinuxLibrary.png]]&lt;br /&gt;
&lt;br /&gt;
Klicken Sie auf die Ellipse [[File:Ellipsis ide.png]], um die Liste der Pfade zu erweitern und sie anzupassen.&lt;br /&gt;
&lt;br /&gt;
===Erzeugen und Bereitstellen Ihres ersten Projekts===&lt;br /&gt;
&lt;br /&gt;
Wählen Sie nach der Installation der oben aufgeführten Voraussetzungen und von FMXLinux über den GetIt-Package-Manager {{Menu|Datei &amp;amp;gt; Projekt öffnen}}, um ein vorhandenes FireMonkey-Projekt zu öffnen, oder {{Menu|Datei &amp;amp;gt; Neu &amp;amp;gt; Geräteübergreifende Anwendung}}, um ein neues FireMonkey-Projekt zu erstellen.&lt;br /&gt;
&lt;br /&gt;
Klicken Sie als Nächstes in der Projektgruppe mit der rechten Maustaste auf das Projekt und klicken Sie dann auf &#039;&#039;&#039;Linux-Plattform hinzufügen&#039;&#039;&#039;, um die Linux-Plattform hinzuzufügen.&lt;br /&gt;
&lt;br /&gt;
[[File:FMXLinux03.png]]&lt;br /&gt;
&lt;br /&gt;
Nach dem Hinzufügen der Linux-Plattform zu Ihrem Projekt können Sie zu &amp;quot;Linux 64 Bit&amp;quot; wechseln und Ihre FMX-GUI-Anwendungen für Linux bereitstellen. Dazu muss auf Ihrem Linux-Zielcomputer [[Ausführen des Platform Assistant unter Linux|PAServer ausgeführt]] werden. Klicken Sie auf &#039;&#039;&#039;Ausführen&#039;&#039;&#039;, um Ihre Linux-GUI-Anwendung bereitzustellen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:FMX Linux image 04.png]]&lt;br /&gt;
&lt;br /&gt;
{{Attention|Beim Erzeugen einer FMXLinux-Anwendung kann die Fehlermeldung &#039;&#039;&#039;System.Devices wird auf dieser Plattform nicht unterstützt&#039;&#039;&#039; angezeigt werden. &lt;br /&gt;
&lt;br /&gt;
[[File:Error message.png]]&lt;br /&gt;
&lt;br /&gt;
Der Grund dafür ist, dass Ihre Bibliothekspfade nicht richtig konfiguriert sind. Anstatt das Build mit der richtigen DCU-Datei zu erzeugen, sucht der Compiler nach der Originalversion der Quellcodedatei, die nicht kompatibel ist (FMXLinux patcht diese Datei).}}&lt;br /&gt;
&lt;br /&gt;
==Weitere Funktionen==&lt;br /&gt;
&lt;br /&gt;
===Webbereitstellung auf Ubuntu Server===&lt;br /&gt;
&lt;br /&gt;
Sie können mit dem GTK-Broadway-Backend eine FMXLinux-Anwendung als HTML5-Webanwendung im Browser ausführen:&lt;br /&gt;
&lt;br /&gt;
# Installieren Sie die erforderlichen Bibliotheken: &amp;lt;code&amp;gt;sudo apt install xorg libgl1-mesa-dev libosmesa-dev libgtk-3-bin&amp;lt;/code&amp;gt;&lt;br /&gt;
# Starten Sie den Broadway-Server: broadwayd&lt;br /&gt;
# Führen Sie die Anwendung in der IDE aus.&lt;br /&gt;
# Laden Sie im Browser &amp;amp;nbsp;:8080.&lt;br /&gt;
&lt;br /&gt;
==Unterstützte Linux-Distributionen==&lt;br /&gt;
&lt;br /&gt;
Delphi Linux unterstützt RedHat Enterprise- und Ubuntu-Distributionen. Weitere Informationen finden Sie in der [[Unterstützte Zielplattformen|Liste der unterstützten Zielplattformen]].&lt;br /&gt;
&lt;br /&gt;
==Weitere Ressourcen==&lt;br /&gt;
&lt;br /&gt;
Es gibt zahlreiche Videos mit hilfreichen Informationen zum Erstellen von FMXLinux-Anwendungen:&lt;br /&gt;
&lt;br /&gt;
* [https://youtu.be/3mw20kUCXho FMXLinux app in action (EN)]&lt;br /&gt;
* [https://youtu.be/rhu1Qs8Y470 Adding FMX Linux to your project (EN)]&lt;br /&gt;
* [https://youtu.be/Mvu2NxxqxGw FMX UI controls on Linux (EN)]&lt;br /&gt;
* [https://youtu.be/67xzTHTXlrc Running an FMXLinux app as an HTML5 web application in the browser (EN)]&lt;br /&gt;
* [https://youtu.be/p7smPdUfy2w CodeRage webinar replay (EN)]&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
&lt;br /&gt;
* [[PAServer: Die Platform Assistant Server-Anwendung|PAServer: Die Platform Assistant Server-Anwendung]]&lt;br /&gt;
* [[Bereitstellungs-Manager|Bereitstellungs-Manager]]&lt;br /&gt;
* [[Ausführen des Platform Assistant unter Linux|Ausführen des Platform Assistant unter Linux]]&lt;br /&gt;
* [http://www.fmxlinux.com/ FMXLinux]&lt;br /&gt;
* [[FireMonkey|FireMonkey]]&lt;br /&gt;
* [https://community.idera.com/developer-tools/b/blog/posts/webinar-introduction-to-fmxlinux---delphi-s-firemonkey-for-linux-solution Webinar: Introduction to FmxLinux - Delphi&#039;s FireMonkey for Linux Solution (EN)]&lt;br /&gt;
&lt;br /&gt;
[[en:FireMonkey for Linux]]&lt;br /&gt;
[[fr:FireMonkey pour Linux]]&lt;br /&gt;
[[ja:FireMonkey for Linux]]&lt;/div&gt;</summary>
		<author><name>Nicolas.rios</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Datei:FMX_Linux_image_04.png&amp;diff=219317</id>
		<title>Datei:FMX Linux image 04.png</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Datei:FMX_Linux_image_04.png&amp;diff=219317"/>
		<updated>2025-08-22T19:20:04Z</updated>

		<summary type="html">&lt;p&gt;Nicolas.rios: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;FMX Linux image 04&lt;/div&gt;</summary>
		<author><name>Nicolas.rios</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Hauptseite&amp;diff=219316</id>
		<title>Hauptseite</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Hauptseite&amp;diff=219316"/>
		<updated>2025-06-26T17:39:32Z</updated>

		<summary type="html">&lt;p&gt;Nicolas.rios: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:Hilfe für {{Product}} {{MarketingVersion}}}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;floatleft&amp;quot; style=&amp;quot;width: 49%&amp;quot;&amp;gt;&lt;br /&gt;
==[[Überblick über RAD Studio|Überblick]]==&lt;br /&gt;
* [[Überblick über RAD Studio|Funktionsübersicht]]&lt;br /&gt;
* [[Neuerungen|Neuerungen]]&lt;br /&gt;
* [[11 Alexandria - Release 1]]&lt;br /&gt;
* [[11 Alexandria – Release 2]]&lt;br /&gt;
* [[Release-Hinweise|Release-Hinweise]]&lt;br /&gt;
* [[rad_en: Community Edition|Community Edition]]&lt;br /&gt;
&lt;br /&gt;
==[[Installation|Installation]]==&lt;br /&gt;
* [[Installationshinweise|Installationshinweise]]&lt;br /&gt;
* [[Plat en:Main Page#{{Product}} {{MarketingVersion}}|Hotfixes und Workarounds]]&lt;br /&gt;
==[[Einführung in RAD Studio|Einführung]]==&lt;br /&gt;
* [[Tutorials|Tutorials]] | [[Tutorial: Verwenden der IDE|Ihre erste Anwendung erstellen]]&lt;br /&gt;
* [[Hilfreiche Ressourcen für neue Benutzer#Code- und Anwendungsbeispiele|Code- und Anwendungsbeispiele]]&lt;br /&gt;
* [[Hilfreiche Ressourcen für neue Benutzer#Grundlagen|Lesen]]&lt;br /&gt;
* [[Hilfreiche Ressourcen für neue Benutzer#Video-Demos|Videos]]&lt;br /&gt;
* [[Hilfreiche Ressourcen für neue Benutzer#CodeRage-Seminare|Seminare]]&lt;br /&gt;
==Projektentwicklung==&lt;br /&gt;
* [[Hauptanwendungstypen|Hauptanwendungstypen]]&lt;br /&gt;
* [[Arbeitsschritte bei der Projektentwicklung|Arbeitsschritte bei der Projektentwicklung]]&lt;br /&gt;
==Referenz==&lt;br /&gt;
* [[Unterstützte Zielplattformen|Zielplattformen]]&lt;br /&gt;
* [[Frameworks und Bibliotheken|Frameworks und Bibliotheken]]&lt;br /&gt;
* [[Programmiersprachen|Programmiersprachen]]&lt;br /&gt;
* [[IDE-Referenz und Hilfsprogramme|IDE-Referenz und Hilfsprogramme]]&lt;br /&gt;
* [[Index|Index]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;floatright&amp;quot; style=&amp;quot;width: 49%&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{f|winguide|&lt;br /&gt;
&lt;br /&gt;
==[[Windows-Entwicklerhandbuch - Index|Windows-Entwicklung]]==&lt;br /&gt;
* [[VCL|VCL-Formularanwendung für Windows]]&lt;br /&gt;
* [[Entwickeln von Metropolis-UI-Anwendungen|Metropolis-UI-Anwendungen für VCL und {{FM}} (Windows 8-Stil)]]&lt;br /&gt;
* [[Komponentenentwicklung - Index|Komponentenentwicklung]]&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==[[Geräteübergreifende Anwendungen - Index|Geräteübergreifende Entwicklung]]==&lt;br /&gt;
* [[Geräteübergreifende Anwendungen entwickeln|Geräteübergreifende Anwendungen entwickeln]]&lt;br /&gt;
* [[Schritte bei der Entwicklung von geräteübergreifenden Anwendungen|Schritte bei der Entwicklung von geräteübergreifenden Anwendungen]]&lt;br /&gt;
* [[Datenbankanwendungen entwickeln|Datenbankanwendungen entwickeln]]&lt;br /&gt;
* [[Entwickeln von RAD Server-, Cloud- und REST-Anwendungen|Entwickeln von RAD Server-, Cloud- und REST-Anwendungen]] {{f|datasnap|&lt;br /&gt;
* [[DataSnap-Anwendungen entwickeln|DataSnap-Anwendungen entwickeln]] }}&lt;br /&gt;
==Mobile Entwicklung==&lt;br /&gt;
* [[Mobile Android-Anwendungsentwicklung|Mobile Android-Anwendungsentwicklung]]&lt;br /&gt;
* [[Mobile iOS-Anwendungsentwicklung|Mobile iOS-Anwendungsentwicklung]]&lt;br /&gt;
* [[Mobile-Tutorials: Mobile Anwendungsentwicklung (iOS und Android)|Mobile-Tutorials: Mobile Anwendungsentwicklung (iOS und Android)]]&lt;br /&gt;
&lt;br /&gt;
{{f|radstudio|&lt;br /&gt;
&lt;br /&gt;
==[[Internetanwendungen entwickeln - Index|Webentwicklung]]==&lt;br /&gt;
* [[Web Broker verwenden - Index|Verwenden von Web Broker]]&lt;br /&gt;
* [[DataSnap-Anwendungen entwickeln|Verwenden von DataSnap]]&lt;br /&gt;
* [[RAD Server (EMS)|Verwenden von RAD Server]]&lt;br /&gt;
==[[UML-Modellierung|UML-Modellierung]]==&lt;br /&gt;
* [[Einführende Modellierungskonzepte|Einführende Modellierungskonzepte]]&lt;br /&gt;
* [[Anleitungen für die Modellierung|Anleitungen für die Modellierung]]&lt;br /&gt;
* [[Modellierungsreferenz - Index|Modellierungsreferenz]]&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DEFAULTSORT:Hilfe fur RAD Studio 11 11.0 Alexandria}}&lt;br /&gt;
[[Category:Delphi]]&lt;br /&gt;
[[Category:C++]]&lt;br /&gt;
[[Category:AMMigrate]]&lt;br /&gt;
&lt;br /&gt;
[[en:Main Page]]&lt;br /&gt;
[[fr:Accueil]]&lt;br /&gt;
[[ja:メインページ]]&lt;/div&gt;</summary>
		<author><name>Nicolas.rios</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Vorlage:MarketingVersion&amp;diff=219315</id>
		<title>Vorlage:MarketingVersion</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Vorlage:MarketingVersion&amp;diff=219315"/>
		<updated>2025-06-26T17:35:15Z</updated>

		<summary type="html">&lt;p&gt;Nicolas.rios: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{f|radstudio&amp;lt;!--&lt;br /&gt;
--&amp;gt;| {{#switch: {{RadstudioVersion|{{{1|{{RadstudioVersion}}}}}}}&amp;lt;!--&lt;br /&gt;
    --&amp;gt;| Seattle = 10 Seattle&amp;lt;!--&lt;br /&gt;
    --&amp;gt;| Berlin = 10.1 Berlin&amp;lt;!--&lt;br /&gt;
    --&amp;gt;| Tokyo = 10.2 Tokyo&amp;lt;!--&lt;br /&gt;
    --&amp;gt;| Rio = 10.3 Rio&amp;lt;!--&lt;br /&gt;
    --&amp;gt;| Denali = 10.4 Sydney&amp;lt;!--&lt;br /&gt;
    --&amp;gt;| Alexandria = 11 Alexandria&amp;lt;!--&lt;br /&gt;
    --&amp;gt;| {{Version|{{RadstudioVersion|{{{1|{{RadstudioVersion}}}}}}}}}&amp;lt;!--&lt;br /&gt;
    --&amp;gt;}}&amp;lt;!--&lt;br /&gt;
--&amp;gt;}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Datenvorlagen]]&lt;br /&gt;
[[Category:Durch Hauptversionsänderungen betroffene Vorlagen]]&lt;/div&gt;</summary>
		<author><name>Nicolas.rios</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Ausrichtung_von_Anwendungen&amp;diff=219298</id>
		<title>Ausrichtung von Anwendungen</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Ausrichtung_von_Anwendungen&amp;diff=219298"/>
		<updated>2025-05-05T19:41:10Z</updated>

		<summary type="html">&lt;p&gt;Nicolas.rios: RS-127787&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Parent|Anwendungsoptionen}}&lt;br /&gt;
&lt;br /&gt;
{{Menu|Projekt &amp;amp;gt; Optionen &amp;amp;gt; [[Anwendungsoptionen|Anwendung]] &amp;amp;gt; Ausrichtung}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
Legt die Ausrichtung für Ihre geräteübergreifende Anwendung auf mobilen Plattformen fest.&lt;br /&gt;
&lt;br /&gt;
[[File:Orientation.png|830px|link=]]&lt;br /&gt;
&lt;br /&gt;
===Ausrichtung auf iOS-Geräten===&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; frame=&amp;quot;hsides&amp;quot; rules=&amp;quot;rows&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feld&lt;br /&gt;
! Beschreibung&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| Benutzerdefinierte Ausrichtung aktivieren&lt;br /&gt;
| Aktivieren Sie dieses Kontrollkästchen, um die Ausrichtungen zu beschränken oder festzulegen, die Ihre iOS-App unterstützt. &amp;lt;br /&amp;gt;Um beispielsweise Ihre iOS-App immer im Hochformat anzuzeigen, aktivieren Sie die Kontrollkästchen &#039;&#039;&#039;Benutzerdefinierte Ausrichtung aktivieren&#039;&#039;&#039; und &#039;&#039;&#039;Hochformat&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
iOS-Geräte unterstützen die Drehung des Formulars in den folgenden Richtungen:&lt;br /&gt;
* &#039;&#039;&#039;iPad:&#039;&#039;&#039; Drehung in alle Richtungen&lt;br /&gt;
* &#039;&#039;&#039;iPhone und iPod Touch:&#039;&#039;&#039; Drehung in alle Richtungen mit Ausnahme von auf dem Kopf stehend (umgedreht)&lt;br /&gt;
&lt;br /&gt;
Wenn &#039;&#039;&#039;Benutzerdefinierte Ausrichtung aktivieren&#039;&#039;&#039; nicht ausgewählt ist, dann verwendet die App die Standarddrehungen entsprechend dem iOS-Gerät.&lt;br /&gt;
{| border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Hochformat&lt;br /&gt;
| iOS-App wird vertikal (im Hochformat) angezeigt.&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Umgedreht&lt;br /&gt;
| iOS-App wird vertikal, aber auf dem Kopf stehend, angezeigt. Die Start-Schaltfläche des Gerätes befindet sich oben anstatt unten.&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| Startseite Querformat rechts&lt;br /&gt;
| iOS-App wird horizontal (im Querformat) angezeigt. Die Start-Schaltfläche des Gerätes befindet sich rechts.&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| Startseite Querformat links&lt;br /&gt;
| iOS-App wird horizontal (im Querformat) angezeigt. Die Start-Schaltfläche des Gerätes befindet sich links.&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Ausrichtung auf Android-Geräten===&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; frame=&amp;quot;hsides&amp;quot; rules=&amp;quot;rows&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feld&lt;br /&gt;
! Beschreibung&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| Benutzerdefinierte Ausrichtung aktivieren&lt;br /&gt;
|&lt;br /&gt;
Aktivieren Sie dieses Kontrollkästchen, um die Ausrichtungen zu beschränken oder festzulegen, die Ihre Android-App unterstützt. &amp;lt;br /&amp;gt;Um beispielsweise Ihre Android-App immer im Hochformat anzuzeigen, aktivieren Sie die Kontrollkästchen &#039;&#039;&#039;Benutzerdefinierte Ausrichtung aktivieren&#039;&#039;&#039; und &#039;&#039;&#039;Hochformat&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Android-Geräte unterstützen die Drehung des Formulars in alle Richtungen.&lt;br /&gt;
{| border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Hochformat&lt;br /&gt;
| Android-App wird vertikal (im Hochformat) angezeigt.&lt;br /&gt;
|-&lt;br /&gt;
| Umgedreht&lt;br /&gt;
| Android-App wird vertikal, aber auf dem Kopf stehend, angezeigt. Die Start-Schaltfläche des Gerätes befindet sich oben anstatt unten.&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| Startseite Querformat rechts&lt;br /&gt;
| Android-App wird horizontal (im Querformat) angezeigt. Die Start-Schaltfläche des Gerätes befindet sich rechts.&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| Startseite Querformat links&lt;br /&gt;
| Android-App wird horizontal (im Querformat) angezeigt. Die Start-Schaltfläche des Gerätes befindet sich links.&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Hinweise zur Ausrichtung für Android====&lt;br /&gt;
&lt;br /&gt;
* Wenn &#039;&#039;&#039;Benutzerdefinierte Ausrichtung aktivieren&#039;&#039;&#039; nicht ausgewählt ist oder wenn es ausgewählt ist und alle vier Ausrichtungen ebenfalls ausgewählt sind, dann verwendet die App die Standarddrehungen entsprechend dem Android-Gerät.&lt;br /&gt;
* Wenn Sie &#039;&#039;&#039;Startseite Querformat links&#039;&#039;&#039; und &#039;&#039;&#039;Startseite Querformat rechts&#039;&#039;&#039; aktivieren, verwendet die Android-App nur eine davon, normalerweise &#039;&#039;&#039;Startseite Querformat rechts&#039;&#039;&#039;.&lt;br /&gt;
* Wenn Sie &#039;&#039;&#039;Hochformat&#039;&#039;&#039; und &#039;&#039;&#039;Umgedreht&#039;&#039;&#039; wählen, verwendet die Android-App nur &#039;&#039;&#039;Hochformat&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
&lt;br /&gt;
* [[Erscheinungsbild der Anwendung|Erscheinungsbild der Anwendung]]&lt;br /&gt;
* [https://developer.apple.com/documentation/bundleresources/information-property-list/uisupportedinterfaceorientations UISupportedInterfaceOrientations]&lt;br /&gt;
* [https://developer.apple.com/documentation/bundleresources/information-property-list/uirequiresfullscreen UIRequiresFullScreen]&lt;br /&gt;
&lt;br /&gt;
[[Category:IDE-Referenz]]&lt;br /&gt;
[[Category:XE6]]&lt;br /&gt;
[[Category:AMMigrate]]&lt;br /&gt;
&lt;br /&gt;
[[en:Application Orientation]]&lt;br /&gt;
[[fr:Orientation de l&#039;application]]&lt;br /&gt;
[[ja:［アプリケーション｜向き］]]&lt;/div&gt;</summary>
		<author><name>Nicolas.rios</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Sichern_von_Indy-Netzwerkverbindungen&amp;diff=219259</id>
		<title>Sichern von Indy-Netzwerkverbindungen</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Sichern_von_Indy-Netzwerkverbindungen&amp;diff=219259"/>
		<updated>2025-02-10T18:41:35Z</updated>

		<summary type="html">&lt;p&gt;Nicolas.rios: RS-126681&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Parent|Sichern der Netzwerkverbindungen von geräteübergreifenden Apps}}&lt;br /&gt;
&lt;br /&gt;
In diesem Thema wird gezeigt, wie Sie Ihren [[Indy|Indy]]-Netzwerkverbindungen die Unterstützung für TLS/SSL-Sicherheit hinzufügen.&lt;br /&gt;
&lt;br /&gt;
==Voraussetzungen==&lt;br /&gt;
&lt;br /&gt;
Laden Sie das neueste [[OpenSSL|OpenSSL]]-Archive für Ihre Entwicklungsplattform von [http://indy.fulgan.com/SSL/ http://indy.fulgan.com/SSL/] herunter, um TLS/SSL mit Indy auf Ihrem Entwicklungscomputer zu verwenden:&lt;br /&gt;
&lt;br /&gt;
* 32-Bit-Windows: {{Path|openssl-{{Placeholder|version}}-i386-win32.zip}}.&lt;br /&gt;
* 64-Bit-Windows: {{Path|openssl-{{Placeholder|version}}-x64_86-win64.zip}}.&lt;br /&gt;
&lt;br /&gt;
Extrahieren Sie den Inhalt des heruntergeladenen Archivs, und suchen Sie die folgenden Bibliotheksdateien:&lt;br /&gt;
&lt;br /&gt;
* {{Path|libeay32.dll}}&lt;br /&gt;
* {{Path|ssleay32.dll}}&lt;br /&gt;
&lt;br /&gt;
Kopieren Sie diese Dateien in den Ordner, in dem {{Product}} die ausführbare Datei Ihrer Anwendung erstellt. Zum Beispiel in {{Path|{{Placeholder|Projektordner}}/Win32/Debug}} für 32-Bit-Windows.&lt;br /&gt;
&lt;br /&gt;
Bevor Sie Ihre Anwendung auf einem Remote-Computer ausführen oder Ihre Anwendung an andere Benutzer verteilen können, müssen Sie für &#039;&#039;&#039;Windows&#039;&#039;&#039; die Bereitstellungskonfiguration Ihrer Anwendung ändern, um diese Bibliotheksdateien in den Pfad der ausführbaren Datei Ihrer Anwendung aufzunehmen:&lt;br /&gt;
&lt;br /&gt;
# Wählen Sie {{Menu|Projekt &amp;amp;gt; Bereitstellung}}.&lt;br /&gt;
# Öffnen Sie das Kombinationsfeld oben im &#039;&#039;&#039;[[Bereitstellungs-Manager|Bereitstellungs-Manager]]&#039;&#039;&#039;, und wählen Sie unter &#039;&#039;&#039;Alle Konfigurationen&#039;&#039;&#039; die Zielplattform (32-Bit-Windows oder 64-Bit-Windows) aus.&lt;br /&gt;
# Klicken Sie auf [[File:DMgrAddFiles.png|Dateien hinzufügen]].&lt;br /&gt;
# Wählen Sie die erforderlichen, zuvor heruntergeladenen Bibliotheksdateien aus, und klicken Sie auf &#039;&#039;&#039;OK&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Für &#039;&#039;&#039;macOS&#039;&#039;&#039; muss Ihre Anwendung keine Voraussetzungen für die TLS/SSL-Unterstützung erfüllen. Die erforderliche [[OpenSSL|OpenSSL]]-Bibliothek ist standardmäßig in diesen Betriebssystemen verfügbar.&lt;br /&gt;
&lt;br /&gt;
Für &#039;&#039;&#039;iOS&#039;&#039;&#039; finden Sie unter [[Erstellen von iOS-Apps#OpenSSL-Unterstützung|Erstellen von iOS-Apps, OpenSSL-Unterstützung]] Informationen zum Konfigurieren Ihrer Anwendung für die Unterstützung der TLS/SSL-Verschlüsselung.&lt;br /&gt;
&lt;br /&gt;
Unter &#039;&#039;&#039;Android&#039;&#039;&#039;-Versionen höher als 6 müssen Sie die OpenSSL-Bibliotheken einbeziehen, da Android nicht mehr [https://www.openssl.org/ OpenSSL], sondern [https://boringssl.googlesource.com/boringssl/ BoringSSL] verwendet. &lt;br /&gt;
&lt;br /&gt;
{{Note| {{Product}} Sydney unterstützt nur die Android-Versionen höher als 6.}}&lt;br /&gt;
&lt;br /&gt;
Für &#039;&#039;&#039;weitere Plattformen&#039;&#039;&#039; siehe [[OpenSSL|OpenSSL-Bibliotheken]].&lt;br /&gt;
&lt;br /&gt;
==Implementieren der TLS/SSL-Unterstützung in Ihrem Indy-Client==&lt;br /&gt;
&lt;br /&gt;
Von [http://www.indyproject.org/docsite/html/frames.html?frmname=topic&amp;amp;frmfile=TIdTCPConnection.html TIdTCPConnection] abgeleitete Klassen, wie [http://www.indyproject.org/docsite/html/frames.html?frmname=topic&amp;amp;frmfile=TIdHTTP.html TIdHTTP], stellen die Eigenschaft [http://www.indyproject.org/docsite/html/frames.html?frmname=topic&amp;amp;frmfile=TIdTCPConnection_IOHandler.html IOHandler] bereit.&lt;br /&gt;
&lt;br /&gt;
Zur Sicherung einer Indy-Netzwerkverbindung ziehen Sie eine [http://www.indyproject.org/docsite/html/frames.html?frmname=topic&amp;amp;frmfile=TIdSSLIOHandlerSocketOpenSSL.html TIdSSLIOHandlerSocketOpenSSL]-Komponente in den &#039;&#039;&#039;[[Formular-Designer|Formular-Designer]]&#039;&#039;&#039; und doppelklicken im &#039;&#039;&#039;[[Objektinspektor|Objektinspektor]]&#039;&#039;&#039; auf die Eigenschaft {{Code|IOHandler}} der Indy-Client-Komponente, damit Ihre neue {{Code|TIdSSLIOHandlerSocketOpenSSL}}-Komponente als Eingabe-/Ausgabe-Behandlungsroutine ausgewählt wird.&lt;br /&gt;
&lt;br /&gt;
Alternativ können Sie die Netzwerkverbindungen des Indy-Clients auch über den Code sichern:&lt;br /&gt;
&amp;lt;l s=&amp;quot;delphi&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;{{Delphi}}:&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Client.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create;&amp;lt;/source&amp;gt;&amp;lt;l e=&amp;quot;delphi&amp;quot; /&amp;gt;&amp;lt;l s=&amp;quot;cpp&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;C++:&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Client-&amp;gt;IOHandler = new TIdSSLIOHandlerSocketOpenSSL();&amp;lt;/source&amp;gt;&amp;lt;l e=&amp;quot;cpp&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sie können jetzt mit Ihrem Client sichere Anforderungen an einen Server, der die TLS/SSL-Verschlüsselung unterstützt, über das HTTPS-Protokoll senden. Um beispielsweise &amp;quot;&amp;lt;nowiki&amp;gt;http://www.example.com&amp;lt;/nowiki&amp;gt;&amp;quot; mit der TLS/SSL-Verschlüsselung abzurufen, erhalten Sie mit Ihrem Client &amp;quot;http&#039;&#039;&#039;s&#039;&#039;&#039;://www.example.com&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
&lt;br /&gt;
* [[Indy|Indy]]&lt;br /&gt;
* [https://www.indyproject.org/documentation/ Dokumentation der Indy-Referenz]&lt;br /&gt;
&lt;br /&gt;
[[Category:XE7]]&lt;br /&gt;
[[Category:AMMigrate]]&lt;br /&gt;
&lt;br /&gt;
[[en:Securing Indy Network Connections]]&lt;br /&gt;
[[fr:Sécurisation des connexions réseau Indy]]&lt;br /&gt;
[[ja:Indy ネットワーク接続のセキュリティ保護]]&lt;/div&gt;</summary>
		<author><name>Nicolas.rios</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Benutzerdefinierte_Titelleiste_f%C3%BCr_VCL-Formulare&amp;diff=219258</id>
		<title>Benutzerdefinierte Titelleiste für VCL-Formulare</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Benutzerdefinierte_Titelleiste_f%C3%BCr_VCL-Formulare&amp;diff=219258"/>
		<updated>2025-01-09T16:38:34Z</updated>

		<summary type="html">&lt;p&gt;Nicolas.rios: RS-126082&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Übersicht==&lt;br /&gt;
&lt;br /&gt;
Mit der Eigenschaft [[lib_de:Vcl.Forms.TForm.CustomTitleBar|TForm.CustomTitleBar]] und dem neuen Steuerelement [[lib_de:Vcl.ExtCtrls.TTitleBarPanel|TTitleBarPanel]] können Sie die native Titelleiste eines VCL-Formulars ähnlich wie bei Windows-Explorer, Google Chrome oder anderen Anwendungen anpassen. Sie können VCL-Steuerelemente auf der Titelleiste platzieren und benutzerdefiniertes Zeichnen in der Titelleiste ausführen sowie das standardmäßige Zeichnen von Elementen wie das Fenstersymbol und die Beschriftung steuern. &lt;br /&gt;
&lt;br /&gt;
[[File:CustomTitleBarVCL.png|border]]&lt;br /&gt;
&lt;br /&gt;
{{Note| Die benutzerdefinierte Titelleiste wird ab Windows 7 unterstützt.}}&lt;br /&gt;
&lt;br /&gt;
Die Unterstützung für die [[lib_de:Vcl.Forms.TForm.CustomTitleBar|benutzerdefinierte Titelleiste]] verwendet die echte native Windows-Titelleiste und erfordert, dass DWM (Desktop Window Manager) aktiviert ist. Wenn Sie Aero in Windows 7 oder in Situationen deaktivieren, in denen der DWM nicht zum Rendern von Fenstern verwendet wird, wird die Anpassung der Titelleiste nicht unterstützt. Dies wird vom Steuerelement korrekt gehandhabt, aber um diese Situation in Ihrem Code zu überprüfen, prüfen Sie den Wert von TForm.CustomTitleBar.Supported. Dieser Wert ist True, wenn Sie die benutzerdefinierte Titelleiste verwenden können.&lt;br /&gt;
&lt;br /&gt;
Um die volle Leistungsfähigkeit der benutzerdefinierten Titelleiste zu nutzen, müssen Sie eine Kombination der Eigenschaft [[lib_de:Vcl.Forms.TForm.CustomTitleBar|TForm.CustomTitleBar]] und einem auf dem Formular platzierten [[lib_de:Vcl.ExtCtrls.TTitleBarPanel|TTitleBarPanel]] verwenden. TTitleBarPanel wird zum Hosten von VCL-Steuerelementen verwendet, aber es ist auch erforderlich, um erweiterte Funktionen, wie Anpassen das Zeichnens, zu unterstützen, selbst wenn sich in der Titelleiste keine benutzerdefinierten Steuerelemente befinden. Im Wesentlichen stellt die Eigenschaft [[lib_de:Vcl.Forms.TForm.CustomTitleBar|TForm.CustomTitleBar]] die Einstellungen für die Titelleiste des Formulars dar und [[lib_de:Vcl.ExtCtrls.TTitleBarPanel|TTitleBarPanel]] ist ein VCL-Steuerelement, mit dem erweiterte Funktionen in der Titelleiste selbst repräsentiert werden und darauf zugegriffen wird.&lt;br /&gt;
&lt;br /&gt;
{{Attention| Nur die &#039;&#039;&#039;Plattform&#039;&#039;&#039;-VCL-Stile funktionieren in der Titelleiste.}}&lt;br /&gt;
&lt;br /&gt;
==Grundlegende Anpassung==&lt;br /&gt;
&lt;br /&gt;
Die Klasse [[lib_de:Vcl.Forms.TForm Properties|VCL TForm]] hat eine neue Eigenschaft, [[lib_de:Vcl.Forms.TForm.CustomTitleBar|CustomTitleBar]]. Damit können grundlegende Eigenschaften, wie die Anzeige des Titels oder Symbols geändert werden sowie die erweiterten Funktionen, darunter die Platzierung von Steuerelementen, gesteuert werden.&lt;br /&gt;
&lt;br /&gt;
Setzen Sie TForm.CustomTitleBar.Enabled auf True, um die Anpassung der Titelleiste zu aktivieren. Beachten Sie, dass oben in Ihrem VCL-Formular im Designer jetzt ein schattierter blauer Bereich angezeigt wird. Dieser Bereich im Formular wird für die Titelleiste verwendet.&lt;br /&gt;
&lt;br /&gt;
==Position der VCL-Steuerelemente==&lt;br /&gt;
&lt;br /&gt;
Die Titelleiste wird mit der [https://docs.microsoft.com/en-us/windows/win32/api/dwmapi/nf-dwmapi-dwmextendframeintoclientarea DwmExtendFrameIntoClientArea-Funktion] implementiert. Das bedeutet, dass es keinen Nicht-Client-Bereich im Formular gibt, und die Titelleiste sowohl im Client- als auch im Nicht-Client-Bereich gerendert wird. (Der Client-Bereich ist der Bereich, in dem Sie normalerweise VCL-Steuerelemente platzieren, und der Nicht-Client-Bereich ist der Bereich, der normalerweise von der Systemtitelleiste, dem vom System bereitgestellten Hauptmenü, das von einem TMainMenu gekapselt wird, den Bildlaufleisten und dem Größenänderungsrahmen verwendet wird. Weitere Informationen finden Sie unter [[lib_de:Vcl.Controls.TControl.ClientRect|ClientRect]], [[lib_de:Vcl.Controls.TControl.ClientWidth|ClientWidth]] und [[lib_de:Vcl.Controls.TControl.ClientHeight|ClientHeight]].)&lt;br /&gt;
&lt;br /&gt;
Alle dem Formular untergeordneten Steuerelemente mit einer Align-Eigenschaft, wie z. B. alTop, werden korrekt an den Bereich der Titelleiste angepasst. Jedes Steuerelement, das über die Eigenschaften Left und Top platziert wird, d. h. absolut positioniert ist, bleibt jedoch an der Stelle, an der es sich befindet, und kann daher die Titelleiste überlappen, sodass seine Position angepasst werden muss, wenn die benutzerdefinierte Titelleiste aktiviert ist.&lt;br /&gt;
&lt;br /&gt;
Wir empfehlen, Steuerelemente im Formular auf einem am Client ausgerichteten TPanel zu platzieren. Beachten Sie, dass Sie möglicherweise auch die Eigenschaft Height des Formulars vergrößern sollten, um den Platz zu berücksichtigen, der zuvor von der Titelleiste verwendet wurde.&lt;br /&gt;
&lt;br /&gt;
==Einstellungen und teilweise benutzerdefinierte Farbgebung==&lt;br /&gt;
&lt;br /&gt;
Die folgenden Einstellungen steuern das Verhalten der Titelleiste sowie häufige Szenarien für die Farbgebung (wie etwa den Titel der Titelleiste ohne Farbe), mit denen Sie diese Szenarien berücksichtigen können, ohne eine vollständige benutzerdefinierte Farbgebung zu implementieren.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[[lib_de:Vcl.Forms.TTitleBar.CaptionAlignment|CaptionAlignment]]:&#039;&#039;&#039; Damit geben Sie an, wo der Titel gezeichnet werden soll. Windows 10 zeichnet standardmäßig links. Sie können den Titel zentriert, wie in Windows 8, oder rechtsbündig zeichnen.&lt;br /&gt;
* &#039;&#039;&#039;[[lib_de:Vcl.Forms.TTitleBar.Control|Control]]:&#039;&#039;&#039; Legen Sie diese Eigenschaft auf ein TTitleBarPanel fest, das auf dem Formular platziert ist. Siehe den folgenden Abschnitt über benutzerdefinierte Steuerelemente in einer Titelleiste.&lt;br /&gt;
* &#039;&#039;&#039;[[lib_de:Vcl.Forms.TTitleBar.Enabled|Enabled]]:&#039;&#039;&#039; Aktiviert oder deaktiviert die Verwendung der benutzerdefinierten Titelleiste.&lt;br /&gt;
* &#039;&#039;&#039;[[lib_de:Vcl.Forms.TTitleBar.Height|Height]]:&#039;&#039;&#039; Höhe der Titelleiste in Pixel. Um die Höhe der Titelleiste zu ändern, deaktivieren Sie &#039;&#039;&#039;[[lib_de:Vcl.Forms.TTitleBar.SystemHeight|SystemHeight]]&#039;&#039;&#039;. Dadurch wird die Titelleiste auf die Standardhöhe des Systems beschränkt. Sie können die Eigenschaft Height auf einen beliebigen Wert festlegen.&lt;br /&gt;
* &#039;&#039;&#039;[[lib_de:Vcl.Forms.TTitleBar.ShowCaption|ShowCaption]]:&#039;&#039;&#039; Steuert, ob der Titel gezeichnet wird.&lt;br /&gt;
* &#039;&#039;&#039;[[lib_de:Vcl.Forms.TTitleBar.ShowIcon|ShowIcon]]:&#039;&#039;&#039; Steuert, ob das Symbol des Formulars an der linken Ecke der Titelleiste gezeichnet wird.&lt;br /&gt;
* &#039;&#039;&#039;[[lib_de:Vcl.Forms.TTitleBar.SystemHeight|SystemHeight]]&#039;&#039;&#039;: Bei True hat die Höhe der Titelleiste immer den Wert, der auch von anderen Fenstern auf dem aktuellen Bildschirm verwendet wird. Um die Höhe der Titelleiste anzupassen, deaktivieren Sie &#039;&#039;&#039;[[lib_de:Vcl.Forms.TTitleBar.SystemHeight|SystemHeight]]&#039;&#039;&#039; und geben dann einen Wert für die Eigenschaft Height ein.&lt;br /&gt;
* &#039;&#039;&#039;[[lib_de:Vcl.Forms.TTitleBar.SystemColors|SystemColors]]:&#039;&#039;&#039; Steuert, ob für den aktiven oder inaktiven Status des Titels der Titelleiste und der Schaltflächen die Systemfarben oder benutzerdefinierte Farben verwendet werden. Das ist nützlich, wenn Sie die Titelleiste mit anderen Hinter- und Vordergrundfarben als denjenigen des Systems ohne vollständige benutzerdefinierte Farbgebung darstellen möchten.&lt;br /&gt;
&lt;br /&gt;
: Bei True erhalten der Hintergrund, der Titel und die Systemschaltflächen, wie andere Anwendungen, die Standardfarben des Systems. Bei False werden die Farben verwendet, die Sie in den Farbeigenschaften (siehe unten) angeben.&lt;br /&gt;
: Damit benutzerdefinierte Farben verwendet werden, müssen Sie ein [[lib_de:Vcl.ExtCtrls.TTitleBarPanel|TTitleBarPanel]] auf dem Formular platzieren und die Eigenschaft CustomTitleBar.Control darauf festlegen, genau so, als ob Sie Steuerelemente in der Titelleiste zu platzieren wollten, auch wenn der Titelleistenbereich leer ist und keine Steuerelemente enthält.&lt;br /&gt;
&lt;br /&gt;
* Mit &#039;&#039;&#039;[[lib_de:Vcl.Forms.TTitleBar.BackgroundColor|BackgroundColor]]&#039;&#039;&#039;, &#039;&#039;&#039;[[lib_de:Vcl.Forms.TTitleBar.ForegroundColor|ForegroundColor]]&#039;&#039;&#039;, &#039;&#039;&#039;[[lib_de:Vcl.Forms.TTitleBar.ButtonInactiveBackgroundColor|InactiveBackgroundColor]]&#039;&#039;&#039; und &#039;&#039;&#039;[[lib_de:Vcl.Forms.TTitleBar.ButtonInactiveForegroundColor|InactiveForegroundColor]]&#039;&#039;&#039; werden die Farben für die Titelleiste festgelegt. Legen Sie &#039;&#039;&#039;[[lib_de:Vcl.Forms.TTitleBar.SystemColors|SystemColors]]&#039;&#039;&#039; auf True fest, um diese Werte zu ignorieren und die aktuellen Systemfarben zu verwenden.&lt;br /&gt;
* &#039;&#039;&#039;[[lib_de:Vcl.Forms.TTitleBar.ButtonBackgroundColor|ButtonBackgroundColor]]&#039;&#039;&#039;, &#039;&#039;&#039;[[lib_de:Vcl.Forms.TTitleBar.ButtonForegroundColor|ButtonForegroundColor]]&#039;&#039;&#039;, &#039;&#039;&#039;[[lib_de:Vcl.Forms.TTitleBar.ButtonHoverBackgroundColor|ButtonHoverBackgroundColor]]&#039;&#039;&#039;, &#039;&#039;&#039;[[lib_de:Vcl.Forms.TTitleBar.ButtonHoverForegroundColor|ButtonHoverForegroundColor]]&#039;&#039;&#039;, &#039;&#039;&#039;[[lib_de:Vcl.Forms.TTitleBar.ButtonInactiveBackgroundColor|ButtonInactiveBackgroundColor]]&#039;&#039;&#039;, &#039;&#039;&#039;[[lib_de:Vcl.Forms.TTitleBar.ButtonInactiveForegroundColor|ButtonInactiveForegroundColor]]&#039;&#039;&#039;, &#039;&#039;&#039;[[lib_de:Vcl.Forms.TTitleBar.ButtonPressedBackgroundColor|ButtonPressedBackgroundColor]]&#039;&#039;&#039; und &#039;&#039;&#039;[[lib_de:Vcl.Forms.TTitleBar.ButtonPressedForegroundColor|ButtonPressedForegroundColor]]&#039;&#039;&#039; geben die Farben an, die für Systemschaltflächen verwendet werden sollen, wenn es sich um benutzerdefinierte Schaltflächen handelt oder wenn die Titelleiste benutzerdefiniert gezeichnet wird. Legen Sie &#039;&#039;&#039;[[lib_de:Vcl.Forms.TTitleBar.SystemColors|SystemColors]]&#039;&#039;&#039; auf True fest, um dieser Wert zu ignorieren und die aktuellen Systemfarben zu verwenden.&lt;br /&gt;
&lt;br /&gt;
==Vollständige benutzerdefinierte Farbgebung==&lt;br /&gt;
&lt;br /&gt;
Sie können vollständig anpassen, wie die Titelleise gerendert wird, indem Sie die Titelleiste mit Farbe füllen und darauf zeichnen. Dazu müssen Sie ein [[lib_de:Vcl.ExtCtrls.TTitleBarPanel|TTitleBarPanel]] auf dem Formular platzieren und die Eigenschaft CustomTitleBar.Control darauf festlegen, genau so, als ob Sie Steuerelemente in der Titelleiste platzieren wollten, auch wenn der Titelleistenbereich leer ist und keine Steuerelemente enthält. Sie können dann eine Ereignisbehandlungsroutine für das Ereignis [[lib_de:Vcl.ExtCtrls.TCustomTitleBarPanel.OnPaint|TTitleBarPanel.OnPaint]] erstellen.&lt;br /&gt;
&lt;br /&gt;
Das Ereignis [[lib_de:Vcl.ExtCtrls.TCustomTitleBarPanel.OnPaint|TTitleBarPanel.OnPaint]] wird als allerletzter Schritt bei der Farbgebung aufgerufen. Die Farbe wird über alles gelegt, was bereits in der Titelleiste mit Farbe versehen wurde, z. B. Beschriftungen oder Systemschaltflächen. Sie können zudem mit den Rect-Eigenschaften das Zeichnen anpassen. Mit den Eigenschaften [[lib_de:Vcl.Forms.TTitleBar.IconRect|IconRect]], [[lib_de:Vcl.Forms.TTitleBar.FrameRect|FrameRect]], [[lib_de:Vcl.Forms.TTitleBar.ClientRect|ClientRect]] und [[lib_de:Vcl.Forms.TTitleBar.CaptionButtonsRect|CaptionButtonsRect]] können Sie ermitteln, wo sich Systemschaltflächen, Titel usw. befinden.&lt;br /&gt;
&lt;br /&gt;
Die Farbe ist eine 32-Bit-Oberfläche. Sie hat dieselben Anforderungen wie die Farbgebung auf Glas in Windows 7.&lt;br /&gt;
&lt;br /&gt;
==Titelschaltflächen==&lt;br /&gt;
&lt;br /&gt;
Sie können der Titelleiste Titelschaltflächen hinzufügen. Dies wird auch in der&lt;br /&gt;
IDE verwendet, um die Schaltflächen &amp;quot;Hilfe&amp;quot; und &amp;quot;Desktop&amp;quot; links neben den Schaltflächen &amp;quot;Minimieren&amp;quot;/&amp;quot;Maximieren&amp;quot;/&amp;quot;Schließen&amp;quot; hinzuzufügen, die in der Regel in der Titelleiste angezeigt werden.&lt;br /&gt;
&lt;br /&gt;
Platzieren Sie dazu ein [[lib_de:Vcl.ExtCtrls.TTitleBarPanel|TTitleBarPanel]] auf dem Formular und legen Sie es auf die Eigenschaft CustomTitleBar.Control des Formulars fest, wie oben beschrieben. Anschließend können Sie benutzerdefinierte Schaltflächen über die Eigenschaft CustomButtons von TTitleBarPanel hinzufügen. Diese Eigenschaft ist eine Sammlung von TCaptionButtonItem. Schaltflächen werden automatisch in der Reihenfolge von rechts nach links angeordnet, beginnend links von der Schaltfläche &amp;quot;Minimieren&amp;quot;. Die 0. Schaltfläche in der Sammlung ist die äußerst rechte und die letzte Schaltfläche die äußerst linke. In Windows 7 befindet sich ein kleiner Zwischenraum&lt;br /&gt;
zwischen der Schaltfläche &amp;quot;Minimieren&amp;quot; und der ersten benutzerdefinierten Schaltfläche.&lt;br /&gt;
&lt;br /&gt;
Die Komponente TCaptionButtonItem repräsentiert eine Schaltfläche in der Titelleiste. Sie verfügt über die folgenden Eigenschaften:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;ButtonType&#039;&#039;&#039;: ermöglicht die Verwendung einer Systemschaltfläche, wie &amp;quot;Schließen&amp;quot;, &amp;quot;Minimieren&amp;quot; oder &amp;quot;Wiederherstellen&amp;quot;, das Hinzufügen eines Zwischenraums oder einer vollständig benutzerdefinierten Schaltfläche. In der Regel verwenden Sie die benutzerdefinierte Schaltfläche.&lt;br /&gt;
* &#039;&#039;&#039;Enabled&#039;&#039;&#039;: wenn deaktiviert, wird die Schaltfläche gezeichnet und reagiert nicht auf Mausbewegungen oder Klicks.&lt;br /&gt;
* &#039;&#039;&#039; Hint&#039;&#039;&#039;: ermöglicht das Festlegen eines Kurzhinweises, der angezeigt werden soll, wenn die Maus über die Schaltfläche geführt wird.&lt;br /&gt;
* &#039;&#039;&#039;Visible&#039;&#039;&#039;: steuert, ob die Schaltfläche in der Titelleiste angezeigt wird.&lt;br /&gt;
* &#039;&#039;&#039;Width&#039;&#039;&#039;: legt die Breite des Steuerelements fest.&lt;br /&gt;
* &#039;&#039;&#039;OnClick&#039;&#039;&#039;: eine Ereignisbehandlungsroutine für das Klicken auf die Schaltfläche.&lt;br /&gt;
* &#039;&#039;&#039;OnPaint&#039;&#039;&#039;: eine Ereignisbehandlungsroutine zum Zeichnen auf der Schaltfläche, wie ein Schaltflächensymbol. Schaltflächen sind nicht mit einer Bilderliste verbunden.&lt;br /&gt;
&lt;br /&gt;
==Unterstützung für Windows 7 und 10==&lt;br /&gt;
&lt;br /&gt;
Die benutzerdefinierte Titelleiste unterstützt Windows 7 und Windows 10 vollständig, einschließlich der Titelschaltflächen:&lt;br /&gt;
&lt;br /&gt;
[[File:TTitleBar.png]]&lt;br /&gt;
&lt;br /&gt;
Die RAD Studio-Titelleiste unter Windows 7. &lt;br /&gt;
&lt;br /&gt;
{{Note| &lt;br /&gt;
Die Plattformen Windows Vista oder früher werden nicht unterstützt. &lt;br /&gt;
&lt;br /&gt;
Die benutzerdefinierte Titelleiste wird unter Windows 8 unterstützt, es können aber optische Unterschiede im Vergleich zu anderen Anwendungen auftreten, etwa wie Systemschaltflächen mit Farbe gefüllt werden, wenn die Farben angepasst werden (sie werden wie Windows 10-Schaltflächen gerendert).}}&lt;br /&gt;
&lt;br /&gt;
==Benutzerdefinierte Steuerelemente==&lt;br /&gt;
&lt;br /&gt;
Mit dem Steuerelement [[lib_de:Vcl.ExtCtrls.TTitleBarPanel|TTitleBarPanel]] werden Steuerelemente im Titelleistenbereich auf dem VCL-Formular platziert. Es dient als Container, der beim Entwurf Unterstützung für die Steuerelemente bereitstellt. Außerdem stellt es eine Beziehung zwischen dem Formular und dem benutzerdefinierten Titelleistenbereich her.&lt;br /&gt;
&lt;br /&gt;
In der Titelleiste platzierte Steuerelemente müssen das Zeichnen auf eine 32-Bit-Oberfläche unterstützen, wie auf Glas unter Windows 7. Als allgemeine Richtlinie gilt: Wenn ein Steuerelement auf Glas unter Windows 7 korrekt gerendert wird, wird es unter Windows 7 und 10 vermutlich korrekt in der Titelleiste angezeigt. Es kommt häufig vor, dass ein Steuerelement platziert wird und dann festgestellt wird, dass es nicht richtig gerendert wird, selbst im Designer. Möglicherweise müssen Sie Eigenschaften wie DoubleBuffered für normale VCL-Steuerelemente verwenden. &lt;br /&gt;
&lt;br /&gt;
So platzieren Sie Steuerelemente in der Titelleiste:&lt;br /&gt;
&lt;br /&gt;
* Suchen Sie in der Palette das Steuerelement [[lib_de:Vcl.ExtCtrls.TTitleBarPanel|TTitleBarPanel]] und platzieren Sie es auf dem Formular. Es wird oben auf dem Formular angezeigt.&lt;br /&gt;
* Legen Sie die Eigenschaft CustomTitleBar.Control des Formulars auf den Titelleistenbereich fest. Der Titelleistenbereich hat eine blaue Hintergrundfarbe und rechts werden Systemschaltflächen angezeigt.&lt;br /&gt;
* Ändern Sie optional die Eigenschaft Height der Titelleiste, damit sie mit der Eigenschaft CustomTitleBar.Height übereinstimmt. Nur Steuerelemente, die sich innerhalb der Höhe der Titelleiste befinden, werden in der Titelleiste selbst gerendert.&lt;br /&gt;
* Suchen Sie in der Palette ein Steuerelement, z. B. TEdit, und platzieren Sie es auf [[lib_de:Vcl.ExtCtrls.TTitleBarPanel|TTitleBarPanel]] mit diesen Einstellungen:&lt;br /&gt;
** Legen Sie im Objektinspektor die Eigenschaftt DoubleBuffered des neuen Steuerelements auf True fest.&lt;br /&gt;
** Da es sich bei [[lib_de:Vcl.ExtCtrls.TTitleBarPanel|TTitleBarPanel]] um ein normales VCL-Steuerelement handelt, können Sie Align, Anchors und andere Positionierungseigenschaften für darauf befindliche Steuerelemente festlegen. Damit das TEdit-Steuerelement rechts neben den Systemschaltflächen ausgerichtet wird, wie etwa für ein Sucheingabefeld, ziehen Sie es an die gewünschte Position und ändern Sie die Eigenschaft Anchors von akLeft in akRight.&lt;br /&gt;
&lt;br /&gt;
:&lt;br /&gt;
:: [[File:VCL control.png]]&lt;br /&gt;
&lt;br /&gt;
:&lt;br /&gt;
:* Fügen Sie dem Formular das Ereignis OnShow hinzu oder verwenden Sie OnResize, wenn Sie Steuerelemente manuell anstatt über Anker in der Titelleiste platzieren möchten. (Wir empfehlen die Verwendung der Ausrichtung und von Ankern, da die Positionierung über [[lib_de:Vcl.Controls.TControl.OnResize|OnResize]] eine visuelle Verzögerung in Bezug auf die Fenstergröße erzeugen kann). Sie können sich auf die Eigenschaften [[lib_de:Vcl.Forms.TTitleBar.IconRect|IconRect]], [[lib_de:Vcl.Forms.TTitleBar.FrameRect|FrameRect]], [[lib_de:Vcl.Forms.TTitleBar.ClientRect|ClientRect]] und [[lib_de:Vcl.Forms.TTitleBar.CaptionButtonsRect|CaptionButtonsRect]] von CustomTitleBar beziehen, um Ihre Steuerelemente im Verhältnis zu bekannten Titelleistenelementen zu positionieren. Hier legen Sie die Eigenschaft Left des Eingabesteuerelements auf CaptionButtonsRect.Left minus der Breite für einen schmalen Rand (nur aus optischen Gründen) fest, indem Sie der Ereignisbehandlungsroutine die folgende Zeile hinzufügen:&lt;br /&gt;
&lt;br /&gt;
:&lt;br /&gt;
::&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt; Edit1.Left := CustomTitleBar.CaptionButtonsRect.Left - Edit1.Width - 8; &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&lt;br /&gt;
:: [[File:TForm.png]]&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
&lt;br /&gt;
* [[lib_de:Vcl.Forms.TForm.CustomTitleBar|CustomTitleBar]]&lt;br /&gt;
* [[lib_de:Vcl.ExtCtrls.TTitleBarPanel|TTitleBarPanel]]&lt;br /&gt;
* [[lib_de:Vcl.Forms.TTitleBar.CaptionAlignment|CaptionAlignment]]&lt;br /&gt;
* [[lib_de:Vcl.Forms.TTitleBar.Control|Control]]&lt;br /&gt;
* [[lib_de:Vcl.Forms.TTitleBar.Enabled|Enabled]]&lt;br /&gt;
* [[lib_de:Vcl.Forms.TTitleBar.Height|Height]]&lt;br /&gt;
* [[lib_de:Vcl.Forms.TTitleBar.SystemHeight|SystemHeight]]&lt;br /&gt;
* [[lib_de:Vcl.Forms.TTitleBar.ShowCaption|ShowCaption]]&lt;br /&gt;
* [[lib_de:Vcl.Forms.TTitleBar.ShowIcon|ShowIcon]]&lt;br /&gt;
* [[lib_de:Vcl.Forms.TTitleBar.SystemColors|SystemColors]]&lt;br /&gt;
* [[lib_de:Vcl.Forms.TTitleBar.BackgroundColor|BackgroundColor]]&lt;br /&gt;
* [[lib_de:Vcl.Forms.TTitleBar.ForegroundColor|ForegroundColor]]&lt;br /&gt;
* [[lib_de:Vcl.Forms.TTitleBar.ButtonInactiveBackgroundColor|InactiveBackgroundColor]]&lt;br /&gt;
* [[lib_de:Vcl.Forms.TTitleBar.ButtonInactiveForegroundColor|InactiveForegroundColor]]&lt;br /&gt;
* [[lib_de:Vcl.Forms.TTitleBar.SystemColors|SystemColors]]&lt;br /&gt;
* [[lib_de:Vcl.Forms.TTitleBar.ButtonBackgroundColor|ButtonBackgroundColor]]&lt;br /&gt;
* [[lib_de:Vcl.Forms.TTitleBar.ButtonForegroundColor|ButtonForegroundColor]]&lt;br /&gt;
* [[lib_de:Vcl.Forms.TTitleBar.ButtonHoverBackgroundColor|ButtonHoverBackgroundColor]]&lt;br /&gt;
* [[lib_de:Vcl.Forms.TTitleBar.ButtonHoverForegroundColor|ButtonHoverForegroundColor]]&lt;br /&gt;
* [[lib_de:Vcl.Forms.TTitleBar.ButtonInactiveBackgroundColor|ButtonInactiveBackgroundColor]]&lt;br /&gt;
* [[lib_de:Vcl.Forms.TTitleBar.ButtonInactiveForegroundColor|ButtonInactiveForegroundColor]]&lt;br /&gt;
* [[lib_de:Vcl.Forms.TTitleBar.ButtonPressedBackgroundColor|ButtonPressedBackgroundColor]]&lt;br /&gt;
* [[lib_de:Vcl.Forms.TTitleBar.ButtonPressedForegroundColor|ButtonPressedForegroundColor]]&lt;br /&gt;
* [[lib_de:Vcl.ExtCtrls.TCustomTitleBarPanel.OnPaint|TTitleBarPanel.OnPaint]]&lt;br /&gt;
* [[lib_de:Vcl.Forms.TTitleBar.IconRect|IconRect]]&lt;br /&gt;
* [[lib_de:Vcl.Forms.TTitleBar.FrameRect|FrameRect]]&lt;br /&gt;
* [[lib_de:Vcl.Forms.TTitleBar.ClientRect|ClientRect]]&lt;br /&gt;
* [[lib_de:Vcl.Forms.TTitleBar.CaptionButtonsRect|CaptionButtonsRect]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Sydney]]&lt;br /&gt;
[[Category:Mit Delphi für Windows arbeiten]]&lt;br /&gt;
[[Category:Delphi]]&lt;/div&gt;</summary>
		<author><name>Nicolas.rios</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Neuerungen_in_den_letzten_Releases&amp;diff=219050</id>
		<title>Neuerungen in den letzten Releases</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Neuerungen_in_den_letzten_Releases&amp;diff=219050"/>
		<updated>2024-10-08T15:58:33Z</updated>

		<summary type="html">&lt;p&gt;Nicolas.rios: removing broken link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Parent|Neuerungen}}&lt;br /&gt;
&lt;br /&gt;
Anhand der folgenden Liste können Sie die Seiten [[Neuerungen|Neuerungen]] von früheren Versionen von {{Product}} anzeigen:&lt;br /&gt;
&lt;br /&gt;
*[http://docwiki.embarcadero.com/RADStudio/Alexandria/en/What%27s_New {{Product|Alexandria}} {{Version|Alexandria}}]&lt;br /&gt;
**[https://docwiki.embarcadero.com/RADStudio/Alexandria/en/11_Alexandria_-_Release_1 {{Product|Alexandria}} {{Version|Alexandria Release 1}}]&lt;br /&gt;
**[https://docwiki.embarcadero.com/RADStudio/Alexandria/en/What&#039;s_New_in_11.1.5 {{Product|Alexandria}} {{Version|Alexandria Release 1.5}}]&lt;br /&gt;
**[https://docwiki.embarcadero.com/RADStudio/Alexandria/en/11_Alexandria_-_Release_2 {{Product|Alexandria}} {{Version|Alexandria Release 2}}]&lt;br /&gt;
**[https://docwiki.embarcadero.com/RADStudio/Alexandria/en/11_Alexandria_-_Release_3 {{Product|Alexandria}} {{Version|Alexandria Release 3}}]&lt;br /&gt;
*[http://docwiki.embarcadero.com/RADStudio/Sydney/en/What%27s_New {{Product|Sydney}} {{Version|Sydney}}]&lt;br /&gt;
** [https://docwiki.embarcadero.com/RADStudio/Sydney/en/10.4_Sydney_-_Release_1 {{Product|Sydney}} {{Version|Sydney Release 1}}]&lt;br /&gt;
** [https://docwiki.embarcadero.com/RADStudio/Sydney/en/10.4_Sydney_-_Release_2 {{Product|Sydney}} {{Version|Sydney Release 2}}]&lt;br /&gt;
*[http://docwiki.embarcadero.com/RADStudio/Rio/en/What%27s_New {{Product|Rio}} {{Version|Rio}}]&lt;br /&gt;
** [https://docwiki.embarcadero.com/RADStudio/Rio/en/10.3_Rio_-_Release_1 {{Product|Rio}} {{Version|Rio Release 1}}]&lt;br /&gt;
** [https://docwiki.embarcadero.com/RADStudio/Rio/en/10.3_Rio_-_Release_2 {{Product|Rio}} {{Version|Rio Release 2}}]&lt;br /&gt;
** [https://docwiki.embarcadero.com/RADStudio/Rio/en/10.3_Rio_-_Release_3 {{Product|Rio}} {{Version|Rio Release 3}}]&lt;br /&gt;
*[https://docwiki.embarcadero.com/RADStudio/Tokyo/en/What%27s_New {{Product|Tokyo}} {{Version|Tokyo}}]&lt;br /&gt;
** [https://docwiki.embarcadero.com/RADStudio/Tokyo/en/10.2_Tokyo_-_Release_1 {{Product|Tokyo}} {{Version|Tokyo Release 1}}]&lt;br /&gt;
** [https://docwiki.embarcadero.com/RADStudio/Tokyo/en/10.2_Tokyo_-_Release_2 {{Product|Tokyo}} {{Version|Tokyo Release 2}}]&lt;br /&gt;
** [https://docwiki.embarcadero.com/RADStudio/Tokyo/en/10.2_Tokyo_-_Release_3 {{Product|Tokyo}} {{Version|Tokyo Release 3}}]&lt;br /&gt;
*[[Neuerungen in Berlin|RAD Studio Berlin]]&lt;br /&gt;
** [https://docwiki.embarcadero.com/RADStudio/Berlin/en/Subscription_Update_1 {{Product|Berlin}} {{Version|Berlin Release 1}}]&lt;br /&gt;
** [https://docwiki.embarcadero.com/RADStudio/Berlin/en/Subscription_Update_2_-_Anniversary_Edition {{Product|Berlin}} {{Version|Berlin Release 2}}]&lt;br /&gt;
*[[Neuerungen in Seattle|RAD Studio Seattle]]&lt;br /&gt;
** [https://docwiki.embarcadero.com/RADStudio/Seattle/en/Subscription_Update_1 {{Product|Seattle}} {{Version|Seattle Release 1}}]&lt;br /&gt;
* [https://docwiki.embarcadero.com/RADStudio/Berlin/en/What%27s_New_in_XE8 {{Product|XE8}} {{Version|XE8}}]&lt;br /&gt;
* [https://docwiki.embarcadero.com/RADStudio/Seattle/en/What%27s_New_in_XE7 {{Product|XE7}} {{Version|XE7}}]&lt;br /&gt;
* [http://docwiki.embarcadero.com/RADStudio/XE/en/What&#039;s_New {{Product|XE}} {{Version|XE}}]&lt;br /&gt;
* [http://docwiki.embarcadero.com/RADStudio/2010/en/What&#039;s_New {{Product|2010}} {{Version|2010}}]&lt;br /&gt;
* [http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/devcommon/whatsnewtiburon_xml.html {{Product|2009}} {{Version|2009}}]&lt;br /&gt;
* {{Product|2007}} {{Version|2007}}&lt;br /&gt;
** [http://docs.embarcadero.com/products/rad_studio/radstudio2007/RS2007_helpupdates/HUpdate4/EN/html/devcommon/whatsnewspacely_xml.html {{Delphi}}]&lt;br /&gt;
** [http://docs.embarcadero.com/products/rad_studio/radstudio2007/RS2007_helpupdates/HUpdate4/EN/html/devcommon/whatsnewcogswell_xml.html {{CBuilder}}]&lt;br /&gt;
&lt;br /&gt;
{{Attention| Online-Dokumentation für Versionen vor Seattle ist aktuell nicht verfügbar. Sie können in der mit dem Produkt installierten Hilfedatei nachschlagen.}}&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
&lt;br /&gt;
* [[Compiler-Versionen|Compiler-Versionen]]&lt;br /&gt;
* [[Vordefinierte Makros|Vordefinierte Makros]]&lt;br /&gt;
&lt;br /&gt;
[[en:What Was New in Past Releases]]&lt;br /&gt;
[[fr:Nouveautés des releases précédentes]]&lt;br /&gt;
[[ja:以前のリリースでの新機能]]&lt;/div&gt;</summary>
		<author><name>Nicolas.rios</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Erzeugen_von_statischen_Packages&amp;diff=219049</id>
		<title>Erzeugen von statischen Packages</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Erzeugen_von_statischen_Packages&amp;diff=219049"/>
		<updated>2024-10-08T13:48:45Z</updated>

		<summary type="html">&lt;p&gt;Nicolas.rios: replacing link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Parent|Packages compilieren}}&lt;br /&gt;
&lt;br /&gt;
Zum Erzeugen einer [[Statische Package-Bibliotheksdatei|statischen C++-Package-Bibliothek]] (.lib) ist ein Satz von [[C++-Objektdatei (*.obj, *.o)|C++-Objektdateien]] erforderlich, die nicht mit den zum Erzeugen der [[Geteilte Package-Bibliotheksdatei|dynamischen Bibliothek]] (.bpl) verwendeten C++-Objektdateien identisch sind.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie einen &amp;quot;Erzeugen&amp;quot;-Befehl ausführen, erstellt der C++-Compiler zwei Gruppen von C++-Objektdateien wie folgt:&lt;br /&gt;
&lt;br /&gt;
* Die C++-Objektdateien für die dynamische Bibliothek (.dll oder .bpl) werden mit:&lt;br /&gt;
** &amp;lt;code&amp;gt;BCC32 -D_RTLDLL;USEPACKAGES&amp;lt;/code&amp;gt; oder:&lt;br /&gt;
** &amp;lt;code&amp;gt;DCC32 -JPHNE&amp;lt;/code&amp;gt; (C++-Objektdatei, [[C++-Header-Datei|C++-Header-Datei]] im Namespace erzeugen, alles exportieren) erzeugt.&lt;br /&gt;
* Die C++-Objektdateien für die statische Bibliothek (.lib) werden mit:&lt;br /&gt;
** &amp;lt;code&amp;gt;BCC32 -U_RTLDLL;USEPACKAGES&amp;lt;/code&amp;gt; oder:&lt;br /&gt;
** &amp;lt;code&amp;gt;DCC32 -JPHN&amp;lt;/code&amp;gt; (C++-Objektdatei, C++-Header-Datei im Namespace erzeugen) erzeugt&lt;br /&gt;
* Für beide Typen erstellt der [[TLIB.EXE: Der Bibliotheksmanager|TLIB-Bibliotheksmanager]] im Verzeichnis {{Path|\bpilib}} die eigentliche Bibliothek.&lt;br /&gt;
&lt;br /&gt;
Die C++-Objektdateien für die dynamische Bibliothek (.bpl) werden in das Projektverzeichnis ausgegeben.&lt;br /&gt;
&lt;br /&gt;
Die C++-Objektdateien für die statische Bibliothek (.lib) werden in ein Unterverzeichnis ausgegeben, das im Projektverzeichnis, normalerweise im Verzeichnis {{Path|\Debug\Win32\staticobjs}}, erstellt wird.&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[Statische Package-Bibliotheksdatei]]&lt;br /&gt;
* [[TLIB.EXE: Der Bibliotheksmanager]]&lt;br /&gt;
* [https://blogs.embarcadero.com/create-and-use-static-library-lib-and-dynamic-dlls-in-c-builder/ EDN-Artikel: {{CBuilder}} Basics: Tutorial for Creating and Using a Static Library in {{CBuilder}}]&lt;br /&gt;
&lt;br /&gt;
[[Category:Windows-Entwicklerhandbuch]]&lt;br /&gt;
[[Category:C++]]&lt;br /&gt;
[[Category:{{Delphi}}]]&lt;br /&gt;
&lt;br /&gt;
[[en:Building Static Packages]]&lt;br /&gt;
[[fr:Construction de packages statiques]]&lt;br /&gt;
[[ja:静的パッケージのビルド]]&lt;/div&gt;</summary>
		<author><name>Nicolas.rios</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Multithread-Anwendungen_erstellen&amp;diff=219048</id>
		<title>Multithread-Anwendungen erstellen</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Multithread-Anwendungen_erstellen&amp;diff=219048"/>
		<updated>2024-10-08T13:35:26Z</updated>

		<summary type="html">&lt;p&gt;Nicolas.rios: removing broken link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Parent|So erstellen Sie Multithread-Anwendungen}}&lt;br /&gt;
&lt;br /&gt;
Die Erstellung einer Multithread-VCL-Formularanwendung mit einem Thread-Objekt in {{Variables|Product}} umfasst die folgenden grundlegenden Schritte:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Allgemeine Anleitung: So erstellen Sie eine Multithread-Anwendung&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Ein VCL-Formular mit einem [[Thread-Objekt definieren|definierten Thread-Objekt]] erstellen.&lt;br /&gt;
# [[Threads initialisieren|Den Thread initialisieren]] (optional).&lt;br /&gt;
# [[Die Thread-Funktion schreiben|Die Thread-Funktion schreiben]].&lt;br /&gt;
# [[Speicherbereinigungscode schreiben|Den Speicherbereinigungscode verfassen]] (optional).&lt;br /&gt;
&lt;br /&gt;
==Themen==&lt;br /&gt;
&lt;br /&gt;
* [[Thread-Objekt definieren|Thread-Objekt definieren]]&lt;br /&gt;
* [[Threads initialisieren|Threads initialisieren]]&lt;br /&gt;
* [[Die Thread-Funktion schreiben (Anleitung)|Die Thread-Funktion schreiben (Anleitung)]]&lt;br /&gt;
* [[Speicherbereinigungscode schreiben|Speicherbereinigungscode schreiben]]&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
&lt;br /&gt;
*[[Überblick zu VCL|Überblick zu VCL]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Mit Delphi für Windows arbeiten]]&lt;br /&gt;
[[Category:Delphi]]&lt;br /&gt;
&lt;br /&gt;
[[en:Building a Multithreaded Application]]&lt;br /&gt;
[[fr:Construction d&#039;une application multithread]]&lt;br /&gt;
[[ja:マルチスレッドアプリケーションを構築する]]&lt;/div&gt;</summary>
		<author><name>Nicolas.rios</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=64-Bit-Windows-Anwendungsentwicklung&amp;diff=219047</id>
		<title>64-Bit-Windows-Anwendungsentwicklung</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=64-Bit-Windows-Anwendungsentwicklung&amp;diff=219047"/>
		<updated>2024-10-04T14:29:33Z</updated>

		<summary type="html">&lt;p&gt;Nicolas.rios: /* Siehe auch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Parent|Geräteübergreifende Anwendungstypen, die erstellt werden können}}&lt;br /&gt;
&lt;br /&gt;
{{Delphi}} und {{CBuilder}} unterstützen die Entwicklung von &#039;&#039;&#039;64-Bit-Windows&#039;&#039;&#039;-Anwendungen auf einem Win64- oder einem nativen Win32-Entwicklungssystem.&lt;br /&gt;
{{f|vcl|&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==FMX, VCL und RTL unterstützen die 64-Bit-Windows-Anwendungsentwicklung==&lt;br /&gt;
&lt;br /&gt;
Die drei Bibliotheken in {{Variables|Product}} unterstützen Win32 und Win64 wie folgt:&lt;br /&gt;
&lt;br /&gt;
* Die {{FM}}-Bibliothek (FMX) unterstützt alle [[Unterstützte Zielplattformen|unterstützten Zielplattformen]].&lt;br /&gt;
* Die VCL und die RTL wurden so geändert, dass sie mit 64-Bit-Anwendungen genauso wie mit 32-Bit-Anwendungen arbeiten. Wenn Sie nur die VCL und RTL verwenden, können Sie denselben Quellcode auf Win64- und Win32-Plattformen ausführen.&lt;br /&gt;
&lt;br /&gt;
|&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==FMX und RTL unterstützen die 64-Bit-Windows-Anwendungsentwicklung==&lt;br /&gt;
&lt;br /&gt;
Die zwei Bibliotheken in {{Variables|Product}} unterstützen Win32 und Win64 wie folgt:&lt;br /&gt;
&lt;br /&gt;
* Die {{FM}}-Bibliothek (FMX) unterstützt alle [[Unterstützte Zielplattformen|unterstützten Zielplattformen]].&lt;br /&gt;
* Die RTL wurden so geändert, dass sie mit 64-Bit-Anwendungen genauso wie mit 32-Bit-Anwendungen arbeitet. Wenn Sie nur die RTL verwenden, können Sie denselben Quellcode auf Win64- und Win32-Plattformen ausführen.&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Für 32-Bit-Windows und 64-Bit-Windows sind eigene ausführbare Dateien erforderlich==&lt;br /&gt;
&lt;br /&gt;
Für visuelle Komponenten müssen Sie zwei separate Anwendungen compilieren und jede für eine andere Zielplattform konfigurieren – eine Anwendung für Win32 und eine für Win64. Sie erhalten dann eine EXE für Win32 und eine weitere EXE für Win64, jede ist so konfiguriert, dass im [[Projekte-Fenster|Projekte-Fenster]] die jeweils passende &#039;&#039;&#039;Zielplattform&#039;&#039;&#039; zugeordnet wird. Komponenten, Packages und Bibliotheken, die Sie während des Entwurfs verwenden, müssen als Win32-Versionen und als 64-Bit-Versionen vorliegen.&lt;br /&gt;
&lt;br /&gt;
==Konfigurieren einer 64-Bit-Windows-Anwendung in der IDE==&lt;br /&gt;
&lt;br /&gt;
Für die [[Aktivieren und Konfigurieren der Zielplattform|Zielplattform 64-Bit-Windows]] müssen Sie in der &#039;&#039;&#039;[[Projekte-Fenster#Kontextmenü für Zielplattformen|Projektverwaltung]]&#039;&#039;&#039; dem Knoten &#039;&#039;&#039;Zielplattformen&#039;&#039;&#039; die Plattform &#039;&#039;&#039;64-Bit-Windows&#039;&#039;&#039; hinzufügen (oder aktivieren, falls sie bereits hinzugefügt ist):&lt;br /&gt;
&lt;br /&gt;
[[Image:ActiveWindows64Platform.png]]&lt;br /&gt;
&lt;br /&gt;
Wenn Sie einen Entwicklungs-PC mit 32-Bit-Windows verwenden, können Sie Anwendungen für die 64-Bit-Windows-Plattform mithilfe eines Remote-64-Bit-Windows-Systems ausführen, debuggen und bereitstellen: [[Erstellen und Testen eines Verbindungsprofils auf dem Entwicklungs-PC|Erstellen Sie in der IDE ein Verbindungsprofil]], in dem die Verbindung zu dem 64-Bit-Windows-Ziel definiert ist, und [[Aktivieren und Konfigurieren der Zielplattform#Konfigurieren einer Zielplattform|weisen Sie dieses Verbindungsprofil]] im &#039;&#039;&#039;[[Projekte-Fenster|Projekte-Fenster]]&#039;&#039;&#039; der 64-Bit-Windows-Zielplattform zu.&lt;br /&gt;
&lt;br /&gt;
Für einen Entwicklungs-PC mit 64-Bit-Windows ist die Verwendung eines Verbindungsprofils optional und nicht erforderlich.&lt;br /&gt;
&lt;br /&gt;
===64-Bit-Windows-Anwendungen verwenden die übliche Windows-API===&lt;br /&gt;
&lt;br /&gt;
Wenn Sie mit der Windows-API für die 32-Bit-Windows-Anwendungsentwicklung gearbeitet haben, sollten Sie mit vielen der Windows-API-Funktionen vertraut sein, die für die 64-Bit-Windows-Anwendungsentwicklung verfügbar sind.&lt;br /&gt;
&lt;br /&gt;
==Für das Ausführen, Debuggen und Bereitstellen ist Win64 erforderlich==&lt;br /&gt;
&lt;br /&gt;
Die Win64-Anwendungsentwicklung in {{Variables|Product}} ist per Definition eine plattformübergreifende Entwicklung, weil die IDE eine Win32-Anwendung ist. Das bedeutet, dass Sie bei der Ausführung einer Anwendung für die &#039;&#039;&#039;64-Bit-Windows&#039;&#039;&#039;-Zielplattform im Grunde die [[Bereitstellung von geräteübergreifenden Anwendungen|Anwendung auf der Win64-Plattform bereitstellen]].  Daher muss zur Laufzeit Ihr Entwicklungssystem entweder 64-Bit-Windows sein oder mit einem Win64-System verbunden sein.&lt;br /&gt;
&lt;br /&gt;
Es gibt – abhängig davon, ob auf Ihrem Entwicklungs-PC 64-Bit- oder 32-Bit-Windows ausgeführt wird – zwei Szenarien zum Ausführen, Debuggen und Bereitstellen einer 64-Bit-Windows-Anwendung.&lt;br /&gt;
&lt;br /&gt;
===Verwenden eines 64-Bit-Windows-Entwicklungssystems===&lt;br /&gt;
&lt;br /&gt;
Wenn Ihr Entwicklungs-PC ein 64-Bit-Computer mit 64-Bit-Windows ist, können Sie Anwendungen genauso ausführen, debuggen und bereitstellen wie bei einer 32-Bit-Windows-Anwendung ohne den &#039;&#039;&#039;Platform Assistant&#039;&#039;&#039; und ohne ein Verbindungsprofil. Die Verwendung des &#039;&#039;&#039;Platform Assistant&#039;&#039;&#039; und eines Verbindungsprofils ist für 64-Bit-Windows-Entwicklungssysteme optional, ermöglicht aber die Verwendung des &#039;&#039;&#039;[[Bereitstellungs-Manager|Bereitstellungs-Managers]]&#039;&#039;&#039; für die Weitergabe Ihrer Anwendung.&lt;br /&gt;
&lt;br /&gt;
===Verwenden eines 32-Bit-Windows-Entwicklungssystems===&lt;br /&gt;
&lt;br /&gt;
Zum Ausführen, Debuggen oder Bereitstellen einer 64-Bit-Windows-Anwendung mit der IDE auf einem &#039;&#039;&#039;32-Bit-Windows-Entwicklungssystem&#039;&#039;&#039; ist Folgendes erforderlich:&lt;br /&gt;
&lt;br /&gt;
* [[Installieren des Platform Assistant unter Windows|Installieren]] Sie den &amp;quot;Platform Assistant&amp;quot; und [[Ausführen des Platform Assistant unter Windows|führen]] Sie ihn auf dem 64-Bit-Windows-Zielsystem aus.&lt;br /&gt;
* [[Erstellen und Testen eines Verbindungsprofils auf dem Entwicklungs-PC|Erstellen Sie ein Verbindungsprofil]] auf dem Win32-Entwicklungssystem, das die Verbindung zu PAServer auf dem 64-Bit-Windows-Zielsystem beschreibt.&lt;br /&gt;
*[[Aktivieren und Konfigurieren der Zielplattform#Konfigurieren einer Zielplattform|Weisen Sie dieses Verbindungsprofil der 64-Bit-Windows-Zielplattform]] im &#039;&#039;&#039;[[Projekte-Fenster|Projekte-Fenster]]&#039;&#039;&#039; zu.&lt;br /&gt;
&lt;br /&gt;
Weitere Einzelheiten zur Verwendung des &#039;&#039;&#039;Platform Assistant&#039;&#039;&#039; und von Verbindungsprofilen finden Sie unter [[Schritte bei der Entwicklung von geräteübergreifenden Anwendungen|Schritte bei der Entwicklung von geräteübergreifenden Anwendungen]].&lt;br /&gt;
&lt;br /&gt;
Sie können eine Verbindung zu einem 64-Bit-Windows-PC entweder mit einem Standard-Ethernet-LAN oder einer &#039;&#039;&#039;Remote-Desktop-Verbindung&#039;&#039;&#039; herstellen.&lt;br /&gt;
&lt;br /&gt;
{{Note| Wenn die Windows-Firewall auf dem Win64-Ziel aktiviert ist, erhalten Sie möglicherweise bei der ersten Verbindung von PAServer mit dem Win64-Ziel eine Meldung der Windows-Firewall. Klicken Sie auf &#039;&#039;&#039;Zugriff zulassen&#039;&#039;&#039; (und belassen Sie &amp;quot;Private Netzwerke&amp;quot; unter &amp;quot;Kommunikation von paserver.exe unter diesen Netzwerken zulassen&amp;quot; aktiviert).}}&lt;br /&gt;
&lt;br /&gt;
===Debuggen einer 64-Bit-Windows-Anwendung===&lt;br /&gt;
&lt;br /&gt;
Im Allgemeinen ist das Debuggen einer 64-Bit-Windows-Anwendung in {{Variables|Product}} dem Debuggen einer 32-Bit-Windows-Anwendung sehr ähnlich. Es gibt nur wenige Unterschiede.  Z. B. sind die CPU-Fenster, wie die [[FPU|FPU-Ansicht]], unterschiedlich.&lt;br /&gt;
&lt;br /&gt;
* Beim Debuggen einer C++-Anwendung für 64-Bit-Windows sind einige Debugger-Funktionen nicht verfügbar. Weitere Informationen finden Sie in den Debugger-Hinweisen unter &#039;&#039;&#039;[[Debuggen von C++Builder-Anwendungen für 64-Bit-Windows|Debuggen von C++-Builder-Anwendungen für 64-Bit-Windows]]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* Bei einem 64-Bit-Windows-Entwicklungssystem können Sie die 64-Bit-Windows-Anwendungen auf dem Entwicklungssystem [[Start|ausführen und debuggen]] und müssen über keine Verbindung zu einem separaten Zielsystem verfügen.&lt;br /&gt;
* Auf einem 32-Bit-Windows-Entwicklungssystem muss {{Variables|Product}} die 64-Bit-Windows-Anwendung &#039;&#039;&#039;bereitstellen&#039;&#039;&#039;, damit sie gedebuggt werden kann. Das heißt, Sie müssen zur Laufzeit über eine Live-Verbindung zu einem 64-Bit-Windows-System verfügen.&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen finden Sie unter [[Debuggen von geräteübergreifenden Anwendungen|Debuggen von geräteübergreifenden Anwendungen]].&lt;br /&gt;
&lt;br /&gt;
===Bereitstellen einer 64-Bit-Windows-Anwendung===&lt;br /&gt;
&lt;br /&gt;
* Wenn Sie den [[PAServer: Die Platform Assistant Server-Anwendung|Platform Assistant]] und ein [[Verbindungsprofil-Manager|Verbindungsprofil]] verwenden, können Sie 64-Bit-Windows-Anwendungen mit dem [[Bereitstellungs-Manager|Bereitstellungs-Manager]] bereitstellen.&lt;br /&gt;
* Wenn Sie den [[Bereitstellungs-Manager|Bereitstellungs-Manager]] auf einem 64-Bit-Windows-Entwicklungssystem verwenden möchten, müssen Sie ein Verbindungsprofil erstellen, das das Zielsystem für die Bereitstellung beschreibt.&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen finden Sie unter [[Debuggen von geräteübergreifenden Anwendungen|Debuggen von geräteübergreifenden Anwendungen]].&lt;br /&gt;
&lt;br /&gt;
===Benutzerdefinierter Port für den Win64-Debugger===&lt;br /&gt;
&lt;br /&gt;
Die IDE und der Win64-Debugger kommunizieren über ein Socket. Wenn dieses verwendet wird, wird beim Starten des Debuggens eine Fehlermeldung angezeigt.&lt;br /&gt;
&lt;br /&gt;
Wenn WSL2 (Windows Subsystem für Linux) installiert ist, schlägt der Win64-Debugger fehl. Die zugehörige Fehlermeldung lautet: &#039;&#039;Prozess kann nicht erzeugt werden&#039;&#039; oder &#039;&#039;Der Port wird verwendet&#039;&#039;.&lt;br /&gt;
Um dieses oder ähnliche Probleme zu beheben, definieren Sie die Umgebungsvariable &amp;lt;code&amp;gt;DBK_DEBUG_PORT &amp;amp;lt;port-number&amp;amp;gt;&amp;lt;/code&amp;gt; zum Überschreiben der Standard-Portnummer.&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen finden Sie unter [[Debuggen von geräteübergreifenden Anwendungen|Debuggen von geräteübergreifenden Anwendungen]].&lt;br /&gt;
&lt;br /&gt;
==Überlegungen für 64-Bit-Anwendungen==&lt;br /&gt;
&lt;br /&gt;
===Für 64-Bit-Windows-Komponenten, -Packages und -Bibliotheken sind 32-Bit-Entwurfszeitversionen erforderlich===&lt;br /&gt;
&lt;br /&gt;
Wenn Sie 64-Bit-Windows-Komponenten, -Packages oder -Bibliotheken erstellen, müssen Sie über deren 32-Bit-Windows-Entwurfszeitversionen verfügen, damit Sie diese Komponenten, Packages und Bibliotheken während der Anwendungsentwicklung in der IDE verwenden können. Dies ist erforderlich, weil die IDE ein 32-Bit-Windows-Programm ist.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie beispielsweise den Experten [[Neue Komponente|Neue Komponente]] verwenden, müssen Sie zunächst eine 32-Bit-Windows-Version Ihrer Komponente erstellen. Später compilieren Sie Ihre Komponente erneut als eine Win64-Komponente, indem Sie die &#039;&#039;&#039;Zielplattform&#039;&#039;&#039; auf 64-Bit-Windows festlegen (im [[Projekte-Fenster|Projekte-Fenster]]). {{Product}} speichert die Ausgabedateien (wie .bpl und .dcp) in plattformspezifischen Verzeichnissen in Ihrem Projektausgabeverzeichnis.&lt;br /&gt;
&lt;br /&gt;
===Erzeugen und Importieren von 64-Bit-Typbibliotheken===&lt;br /&gt;
&lt;br /&gt;
In einer 64-Bit-Windows-Anwendung (wie z. B. einige 64-Bit-Anwendungen von MS Office) kann eine 32-Bit-Windows-Typbibliothek verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Wenn die aktuelle Zielplattform 64-Bit-Windows ist, übergibt die IDE jetzt &amp;quot;-E64&amp;quot; an &#039;&#039;&#039;[[GenTLB.exe|GenTLB.exe]]&#039;&#039;&#039;. Das Ergebnis ist eine Typbibliothek, deren Feld SYSKIND &#039;&#039;&#039;SYS_WIN64&#039;&#039;&#039; enthält (im Vergleich zu SYSKIND=SYS_WIN32 für eine 32-Bit-Windows-Typbibliothek).&lt;br /&gt;
&lt;br /&gt;
Wenn Sie eine 64-Bit-Windows-Typbibliothek importieren, die von einer anderen nur in den 64-Bit-Windows-Schlüsseln der Registrierung registrierten Typbibliothek abhängt, müssen Sie die 64-Bit-Windows-Version von &#039;&#039;&#039;[[TLIBIMP.EXE|TLIBIMP.EXE]]&#039;&#039;&#039; aus dem folgenden Verzeichnis verwenden:&lt;br /&gt;
&lt;br /&gt;
: {{Path|{{InstallPath}}\bin64\tlibimp.exe}}&lt;br /&gt;
&lt;br /&gt;
Informationen für {{CBuilder}} finden Sie unter [[Migrieren von C++-Code von import nach TLIBIMP.EXE|Migrieren von C++-Code von #import nach TLIBIMP.EXE]].&lt;br /&gt;
&lt;br /&gt;
===Verfügbarkeit von Komponenten zur Entwurfs- und Laufzeit===&lt;br /&gt;
&lt;br /&gt;
Die IDE stellt anhand der beiden folgenden Methoden fest, ob eine Komponente für die jeweilige Plattform verfügbar ist. (Hier bedeutet &amp;quot;verfügbar&amp;quot;, dass die Komponente in der Palette angezeigt und von der IDE überprüft wird. Die IDE führt beim Compilieren lediglich eine Prüfung auf Vorhandensein der Komponenten-Unit durch.)&lt;br /&gt;
&lt;br /&gt;
Die beiden hier beschriebenen Methoden beziehen sich auf Daten, die im &amp;lt;strong&amp;gt;Win32-Laufzeit&amp;lt;/strong&amp;gt;-Package (oder Entwurfszeit- und Laufzeit-Package) eingebettet sind, das die Komponenten implementiert. Die IDE kann keine Packages in die IDE laden, die nicht für die Win32-Plattform erzeugt wurden, daher muss die IDE die benötigten Informationen aus dem Win32-Package verwenden.&lt;br /&gt;
&lt;br /&gt;
* Das Build-System von {{Product}} bettet automatisch eine RC_DATA-Ressource (&#039;&#039;&#039;PLATFORMTARGETS&#039;&#039;&#039;) in die binäre Win32-Package-Datei ein. Dabei handelt es sich um die Bitmaske der pidXXX-Konstanten aus der Unit System.Classes.pas und diese gibt die Zielplattformen des Package-Projekts an. Die IDE liest diese Ressource beim Laden des Package und legt beispielsweise anhand der Ressourcendaten fest, ob die Komponente/Komponenten in der Palette deaktiviert wird/werden, wenn eine nicht unterstützte Plattform aktiv ist.&lt;br /&gt;
&lt;br /&gt;
: Wenn ein Komponenten-Package für mehrere Plattformen eingesetzt werden soll, schließt dies eine &amp;quot;Vereinbarung&amp;quot; zwischen dem Komponentenentwickler und der IDE ein. Wenn ein Komponenten-Package-Projekt für mehrere Plattformen eingesetzt werden soll und der Entwickler das Win32-Laufzeit-Package (und alle zugehörigen compilierbaren und linkbaren Dateien) an Kunden weitergibt, wird davon ausgegangen, dass der Entwickler auch alle erforderlichen compilierbaren, linkbaren und Laufzeitbestandteile für die anderen Zielplattformen weitergibt.&lt;br /&gt;
&lt;br /&gt;
* Einzelne Komponenten können mit dem Klassenattribut &#039;&#039;&#039;ComponentPlatformsAttribute&#039;&#039;&#039; die Daten in PLATFORMTARGETS anhand einer Bitmaske derselben Konstanten aus der Unit Classes überschreiben. Zum Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
type&lt;br /&gt;
  [ComponentPlatformsAttribute(pidWin32 or pidWin64)] // Only supported on Win32 and Win64&lt;br /&gt;
  TMyComponent = class(TComponent)&lt;br /&gt;
  private&lt;br /&gt;
    ...&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Die Verwendung des Attributs &#039;&#039;&#039;ComponentPlatformsAttribute&#039;&#039;&#039; unterliegt auch der oben beschriebenen Vereinbarung.&lt;br /&gt;
&lt;br /&gt;
===Windows-Programmierung===&lt;br /&gt;
&lt;br /&gt;
* Windows-API-Aufrufe müssen 64-Bit-Versionen sein.&lt;br /&gt;
** Try-Blöcke werden in 64-Bit-Windows-Programmen unterstützt.&lt;br /&gt;
** Sie können 32-Bit- und 64-Bit-Windows-Code nicht in demselben Prozess verwenden.&lt;br /&gt;
* Für DLLs, Komponenten, Bibliotheken und Packages ist es erforderlich, dass Sie separate 32-Bit-Windows-Versionen (Entwurfszeit) und 64-Bit-Windows-Versionen (Laufzeit) compilieren oder installieren, wenn Sie den [[Formular-Designer|Formular-Designer]] verwenden möchten.&lt;br /&gt;
* 64-Bit-Windows ist für Betriebssystem- und Shell-Erweiterungen erforderlich.&lt;br /&gt;
* Die Größe von LRESULT, WPARAM und LPARAM wird auf 64 Bit erweitert, daher müssen Botschaftsbehandlungsroutinen bezüglich ungeeigneter Typumwandlungen überprüft werden.&lt;br /&gt;
&lt;br /&gt;
==Themen zu 64-Bit-Windows==&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Vorbereiten der Entwicklungsumgebung (nur wenn das Entwicklungssystem Win32 ist): &#039;&#039;&#039;&lt;br /&gt;
**&lt;br /&gt;
*** [[Installieren des Platform Assistant unter Windows|Installieren des Platform Assistant unter Windows]]&lt;br /&gt;
*** [[Erstellen und Testen eines Verbindungsprofils auf dem Entwicklungs-PC|Erstellen und Testen eines Verbindungsprofils auf dem Entwicklungs-PC]]&lt;br /&gt;
*** [[Ausführen des Platform Assistant unter Windows|Ausführen des Platform Assistant unter Windows]]&lt;br /&gt;
*&#039;&#039;&#039;Erstellen und Ausführen von Win64-Anwendungen:&#039;&#039;&#039;&lt;br /&gt;
** [[64-Bit-Windows-Anwendung Hello World (Delphi und C++)|64-Bit-Windows-Anwendung &amp;quot;Hello World&amp;quot; ({{Delphi}} und C++)]]&lt;br /&gt;
** [[64-Bit-Windows-Datentypen im Vergleich zu 32-Bit-Windows-Datentypen|64-Bit-Windows-Datentypen im Vergleich zu 32-Bit-Windows-Datentypen]]&lt;br /&gt;
** [[Konvertieren von 32-Bit-Delphi-Anwendungen in 64-Bit-Windows|Konvertieren von 32-Bit-Delphi-Anwendungen in 64-Bit-Windows]]&lt;br /&gt;
**[[C++Builder-Anwendungsentwicklung für 64-Bit-Windows|C++Builder-Anwendungsentwicklung für 64-Bit-Windows]]&lt;br /&gt;
*** [[Unterschiede von C++Builder für 64-Bit-Windows|Unterschiede von C++Builder für 64-Bit-Windows]]&lt;br /&gt;
*** [[Upgrade von vorhandenen C++-Projekten nach 64-Bit-Windows|Upgrade von vorhandenen C++-Projekten nach 64-Bit-Windows]]&lt;br /&gt;
*** [[Striktere C++-Compiler (Durch Clang erweiterte C++-Compiler)|Striktere C++-Compiler (Durch Clang erweiterte C++-Compiler)]]&lt;br /&gt;
*** [[Debuggen von C++Builder-Anwendungen für 64-Bit-Windows|Debuggen von C++Builder-Anwendungen für 64-Bit-Windows]]&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
&lt;br /&gt;
*[[Unterschiede zwischen Windows und macOS|Unterschiede zwischen Windows und macOS]]&lt;br /&gt;
* [[Geräteübergreifende Anwendungen entwickeln|Geräteübergreifende Anwendungen entwickeln]]&lt;br /&gt;
* [[Compilieren und Erzeugen von geräteübergreifenden Anwendungen|Compilieren und Erzeugen von geräteübergreifenden Anwendungen]]&lt;br /&gt;
* [[Debuggen von geräteübergreifenden Anwendungen|Debuggen von geräteübergreifenden Anwendungen]]&lt;br /&gt;
* [[DCC64.EXE: Der Delphi-64-Bit-Befehlszeilen-Compiler|DCC64.EXE: Der Delphi-64-Bit-Befehlszeilen-Compiler]]&lt;br /&gt;
* [http://windows.microsoft.com/en-US/windows-vista/32-bit-and-64-bit-Windows-frequently-asked-questions Differences between Win32 and Win64 - FAQ (EN)]&lt;br /&gt;
* [http://msdn.microsoft.com/cc300794.aspx Matt Pietriek&#039;s Getting Started with 64-Bit (EN)]&lt;br /&gt;
* [http://msdn.microsoft.com/7kcdt6fy.aspx MSDN x64 Software Conventions]&lt;br /&gt;
* [http://msdn.microsoft.com/tawsa7cb.aspx Low level info on prolog / eplilog]&lt;br /&gt;
* [http://msdn.microsoft.com/1eyas8tf.aspx MSDN Exception Handling (x64)]&lt;br /&gt;
* [http://msdn.microsoft.com/ff545910.aspx Info about x64 not supporting FPU (EN)]&lt;br /&gt;
* [http://msdn.microsoft.com/x4d2c09s.aspx Detailed information about the MSVC x64 command prompts]&lt;br /&gt;
* Detaillierte Informationen über PE-Dateiformate von Matt Pietriek&lt;br /&gt;
** [http://msdn.microsoft.com/bb985992.aspx http://msdn.microsoft.com/bb985992.aspx (EN)]&lt;br /&gt;
** [http://msdn.microsoft.com/cc301808.aspx http://msdn.microsoft.com/cc301808.aspx (EN)]&lt;br /&gt;
* Kleine C-Laufzeitbibliothek:&lt;br /&gt;
** [http://msdn.microsoft.com/bb985746.aspx http://msdn.microsoft.com/bb985746.aspx (EN)]&lt;br /&gt;
** [http://www.codeproject.com/KB/library/tlibc.aspx?fid=332286 http://www.codeproject.com/KB/library/tlibc.aspx?fid=332286 (EN)]&lt;br /&gt;
* [http://msdn.microsoft.com/bb985996.aspx Microsoft PE Section names (EN)]&lt;br /&gt;
* [http://msdn.microsoft.com/aa366769 C-Compiler Packing Issues (EN)]&lt;br /&gt;
* [http://msdn.microsoft.com/aa290049.aspx Windows Data Alignment on IPF, x86, and x64 (from 2006, fairly technical and long) (EN)]&lt;br /&gt;
&lt;br /&gt;
[[Category:Delphi]]&lt;br /&gt;
[[Category:64Bit]]&lt;br /&gt;
[[Category:XE2]]&lt;br /&gt;
[[Category:Geräteübergreifend]]&lt;br /&gt;
[[Category:AMMigrate]]&lt;br /&gt;
&lt;br /&gt;
[[en:64-bit Windows Application Development]]&lt;br /&gt;
[[fr:Développement d&#039;applications Windows 64 bits]]&lt;br /&gt;
[[ja:64 ビット Windows アプリケーション開発]]&lt;/div&gt;</summary>
		<author><name>Nicolas.rios</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Ausf%C3%BChren_von_Anweisungen_(FireDAC)&amp;diff=219046</id>
		<title>Ausführen von Anweisungen (FireDAC)</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Ausf%C3%BChren_von_Anweisungen_(FireDAC)&amp;diff=219046"/>
		<updated>2024-08-20T23:39:34Z</updated>

		<summary type="html">&lt;p&gt;Nicolas.rios: RS-124097&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Parent|Arbeiten mit Anweisungen (FireDAC)}} __TOC__&lt;br /&gt;
&lt;br /&gt;
==Verwenden von TFDConnection==&lt;br /&gt;
&lt;br /&gt;
[[lib_de:FireDAC.Comp.Client.TFDConnection|TFDConnection]] stellt [[lib_de:FireDAC.Comp.Client.TFDCustomConnection.ExecSQL|ExecSQL]]-Methoden bereit. Dabei handelt es sich um einfach zu verwendende überladene Methoden, die in folgenden Fällen hilfreich sind:&lt;br /&gt;
&lt;br /&gt;
* Es werden keine Ergebnismengen zurückgegeben.&lt;br /&gt;
* Ein SQL-Anweisung wird nur einmal ausgeführt, daher muss sie nicht im vorbereiteten Status gespeichert werden.&lt;br /&gt;
* Eine erweiterte Parameterkonfiguration ist nicht erforderlich.&lt;br /&gt;
* Eine SQL-Anwendungskonfiguration zur Entwurfszeit ist nicht erforderlich.&lt;br /&gt;
&lt;br /&gt;
Verwenden Sie beispielsweise die folgende Syntax, um DDL-Anweisungen auszuführen: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
FDConnection1.ExecSQL(&#039;drop table testtab&#039;);&lt;br /&gt;
FDConnection1.ExecSQL(&#039;create table testtab (id integer, name varchar(10))&#039;);&lt;br /&gt;
FDConnection1.ExecSQL(&#039;insert into testtab values (1, &#039;&#039;FireDAC&#039;&#039;)&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verwenden Sie die folgende überladene Methode, um eine parametrisierte Abfrage auszuführen: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
FDConnection1.ExecSQL(&#039;insert into testtab values (:id, :name)&#039;, [1, &#039;FireDAC&#039;]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
TFDConnection stellt auch [[lib_de:FireDAC.Comp.Client.TFDCustomConnection.ExecSQLScalar|ExecSQLScalar]]-Methoden bereit, die sich von &#039;&#039;&#039;ExecSQL&#039;&#039;&#039;-Methoden unterscheiden, da sie einen einzelnen Ergebnismengenwert zurückgeben: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
sName := FDConnection1.ExecSQLScalar(&#039;select name from testtab where id = :id&#039;, [1]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Verwenden von TFDQuery==&lt;br /&gt;
&lt;br /&gt;
Im Allgemeinen wird [[lib_de:FireDAC.Comp.Client.TFDQuery|TFDQuery]] zur Entwurfszeit und/oder zur Laufzeit konfiguriert. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Konfigurieren von TFDQuery zur Entwurfszeit===&lt;br /&gt;
&lt;br /&gt;
Legen Sie eine TFDQuery-Komponente auf einem Formular ab, um sie zur Entwurfszeit zu konfigurieren. [[lib_de:FireDAC.Comp.Client.TFDRdbmsDataSet.Connection|TFDQuery.Connection]] wird automatisch so festgelegt, dass auf eine TADConnection-Komponente in diesem Formular gezeigt wird, falls eine vorhanden ist. Doppelklicken Sie dann auf TFDQuery, um den Abfrage-Editor von FireDAC aufzurufen: &lt;br /&gt;
&lt;br /&gt;
[[File:AD QueryDlg.png]]&lt;br /&gt;
&lt;br /&gt;
Hier können Sie den SQL-Text und optional Parameter- und Makrowerte angeben und Optionen festlegen. &lt;br /&gt;
&lt;br /&gt;
Drücken Sie die Schaltfläche &#039;&#039;&#039;Ausführen&#039;&#039;&#039;, um den Editor zu schließen. Wenn eine Anweisung eine Ergebnismenge zurückgibt, wird diese im Bereich &#039;&#039;&#039;RecordSet&#039;&#039;&#039; angezeigt, und die Struktur der Ergebnismenge wird im Bereich &#039;&#039;&#039;Struktur&#039;&#039;&#039; angezeigt. Wenn das DBMS Meldungen oder Warnungen für eine Anweisung zurückgibt, werden diese im Bereich &#039;&#039;&#039;Meldungen&#039;&#039;&#039; angezeigt. Mit der Schaltfläche &#039;&#039;&#039;Nächstes RecordSet&#039;&#039;&#039; können Sie durch alle von einer Anweisung zurückgegebenen Ergebnismengen blättern. &lt;br /&gt;
&lt;br /&gt;
Wenn Sie DML-Anweisungen, wie &#039;&#039;&#039;UPDATE&#039;&#039;&#039;/&#039;&#039;&#039;INSERT&#039;&#039;&#039;/&#039;&#039;&#039;DELETE&#039;&#039;&#039;, testen, müssen Sie das Kontrollkästchen &#039;&#039;&#039;Automatisch zurücksetzen&#039;&#039;&#039; aktivieren, damit die von einer Anweisung durchgeführten Aktionen automatisch zurückgesetzt werden. &lt;br /&gt;
&lt;br /&gt;
Drücken Sie OK, um die Änderungen in TFDQuery zu speichern.&lt;br /&gt;
&lt;br /&gt;
===Verwenden von Parametern===&lt;br /&gt;
&lt;br /&gt;
Die Verwendung von parametrisierten Abfragen ist eins der bewährtesten Verfahren bei der Entwicklung von SQL-Datenbankanwendung. Die Hauptvorteile sind:&lt;br /&gt;
&lt;br /&gt;
* Sie können eine einzelne SQL-Anweisung zusammenstellen und sie mehrmals mit verschiedenen Parameterwerten einsetzen. Das DBMS erstellt den Ausführungsplan für die Anweisung nur einmal. Dadurch wird die Auslastung des DBMS-Moduls reduziert.&lt;br /&gt;
* Beim nächsten Ausführen der Anweisung werden nur die Parameterwerte an das DBMS-Modul übertragen. Dadurch wird die Auslastung des Netzwerks reduziert.&lt;br /&gt;
* Sie brauchen sich nicht um korrekte SQL-Konstantenformate zu kümmern, z. B. darum, wie in Microsoft Access-SQL eine Datumskonstante richtig angegeben wird.&lt;br /&gt;
&lt;br /&gt;
Verwenden Sie die Syntax &#039;&#039;&#039;:&amp;amp;lt;Name&amp;amp;gt;&#039;&#039;&#039;, um einen Parametermarker im SQL-Text zu setzen. Weisen Sie dann die entsprechenden Werte mit der Params-Sammlung zu. Zum Beispiel: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
FDQuery1.SQL.Text := &#039;select * from tab where code = :Code&#039;;&lt;br /&gt;
FDQuery1.ParamByName(&#039;code&#039;).AsString := &#039;123&#039;;&lt;br /&gt;
FDQuery1.Open;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vor Ausführung der Abfrage müssen alle Parameter (&#039;&#039;&#039;Name&#039;&#039;&#039;, &#039;&#039;&#039;DataType&#039;&#039;&#039; und &#039;&#039;&#039;ParamType&#039;&#039;&#039;) ausgefüllt werden. Auch &#039;&#039;&#039;Position&#039;&#039;&#039; sollte festgelegt werden. &lt;br /&gt;
&lt;br /&gt;
Wenn Sie die Eigenschaft SQL zuweisen und &#039;&#039;&#039;ResourceOptions.ParamCreate&#039;&#039;&#039; &#039;&#039;&#039;True&#039;&#039;&#039; ist, wird die Params-Sammlung automatisch gefüllt. &lt;br /&gt;
&lt;br /&gt;
{{Note| Nur &#039;&#039;&#039;TFDParam.Name&#039;&#039;&#039; und &#039;&#039;&#039;TFDParam.Position&#039;&#039;&#039; sind festgelegt. &#039;&#039;&#039;DataType&#039;&#039;&#039;, &#039;&#039;&#039;ParamType&#039;&#039;&#039; und andere Eigenschaften müssen in Ihrer Anwendung festgelegt werden. Die Parameter in der Params-Sammlung erscheinen in derselben Reihenfolge wie in der SQL-Anweisung. }}&lt;br /&gt;
&lt;br /&gt;
Sie können die Params-Sammlung auch im Code füllen. Dazu müssen Sie die automatische Parametererstellung durch Setzen von &#039;&#039;&#039;ResourceOptions.ParamCreate&#039;&#039;&#039; auf &#039;&#039;&#039;False&#039;&#039;&#039; deaktivieren. Zum Beispiel: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
FDQuery1.ResourceOptions.ParamCreate := False;&lt;br /&gt;
FDQuery1.SQL.Text := &#039;select * from tab where code = :Code&#039;;&lt;br /&gt;
with FDQuery1.Params do begin&lt;br /&gt;
  Clear;&lt;br /&gt;
  with Add do begin&lt;br /&gt;
    Name := &#039;CODE&#039;;&lt;br /&gt;
    DataType := ftString;&lt;br /&gt;
    Size := 10;&lt;br /&gt;
    ParamType := ptInput;&lt;br /&gt;
  end;&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Parameter können an die SQL-Anweisung entweder per Name oder per Position gebunden werden. Mit der Eigenschaft Params.BindMode können Sie dies steuern:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;pbByName&#039;&#039;&#039;. Die Parameter in der Params-Sammlung werden durch die Eigenschaft &#039;&#039;&#039;Name&#039;&#039;&#039; an die entsprechenden Parametermarker gebunden. Wenn die SQL-Anweisung Parametermarker mit gleichen Namen hat, erscheint nur eine Instanz in Params.&lt;br /&gt;
* &#039;&#039;&#039;pbByNumber&#039;&#039;&#039;. Die Parameter in der Params-Sammlung werden durch die Eigenschaft &#039;&#039;&#039;Position&#039;&#039;&#039; an die entsprechenden Marker im SQL-Anweisungstext gebunden. Wenn die SQL-Anweisung Parametermarker mit gleichen Namen hat, erscheint jedes Vorkommen in Params. Wenn &#039;&#039;&#039;Position&#039;&#039;&#039; für Parameter nicht festgelegt ist, wird es automatisch bei der Anweisungsvorbereitung mithilfe der Parameterindizes zugewiesen. Die Position beginnt bei 1.&lt;br /&gt;
&lt;br /&gt;
Der Datentyp wird entweder explizit oder implizit durch Zuweisen eines Parameterwertes zur Eigenschaft &#039;&#039;&#039;Value&#039;&#039;&#039; oder &#039;&#039;&#039;AsXxxx&#039;&#039;&#039; festgelegt. Andernfalls wird [[lib_de:FireDAC.Stan.Option.TFDFormatOptions.DefaultParamDataType|FormatOptions.DefaultParamDataType]] verwendet. &lt;br /&gt;
&lt;br /&gt;
Wenn &#039;&#039;&#039;ParamType&#039;&#039;&#039; nicht angegeben ist, wird [[lib_de:FireDAC.Stan.Option.TFDResourceOptions.DefaultParamType|ResourceOptions.DefaultParamType]] verwendet. Standardmäßig sind alle Parameter nur Eingabeparameter. Zur Verwendung von Ausgabeparametern muss ParamType explizit angegeben werden. &lt;br /&gt;
&lt;br /&gt;
Die Eingabeparameterwerte müssen vor Ausführung der Abfrage festgelegt werden. Verwenden Sie dazu eine der folgenden Alternativen:&lt;br /&gt;
&lt;br /&gt;
* Weisen Sie Parameterwerte explizit zu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
FDQuery1.ParamByName(&#039;code&#039;).AsString := &#039;DA1001&#039;;&lt;br /&gt;
FDQuery1.Open;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Verwenden Sie eine der überladenen &#039;&#039;&#039;ExecSQL&#039;&#039;&#039;- oder &#039;&#039;&#039;Open&#039;&#039;&#039;-Methoden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
FDQuery1.Open(&#039;&#039;, [&#039;DA1001&#039;]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um den Parameterwert auf &#039;&#039;&#039;Null&#039;&#039;&#039; zu setzen, geben Sie den Parameterdatentyp an und rufen dann die Methode &#039;&#039;&#039;Clear&#039;&#039;&#039; auf: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
with FDQuery1.ParamByName(&#039;name&#039;) do begin&lt;br /&gt;
  DataType := ftString;&lt;br /&gt;
  Clear;&lt;br /&gt;
end;&lt;br /&gt;
FDQuery1.ExecSQL;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auf die Werte der Ausgabeparameter können Sie nach Ausführung der Abfrage zugreifen. Bei einigen SQL-Anweisungen und DBMSs müssen Sie eventuell zuerst alle Ergebnismengen verarbeiten, erst dann können die Werte der Ausgabeparameter abgerufen werden. Mit der Methode [[lib_de:FireDAC.Comp.Client.TFDAdaptedDataSet.GetResults|TFDAdaptedDataSet.GetResults]] können Sie die Übergabe der Ausgabeparameterwerte anfordern. Lesen Sie auch den Artikel [[Einheitliche Unterstützung für RETURNING (FireDAC)|Einheitliche Unterstützung für RETURNING]] über Ausgabeparameter in der RETURNING-Klausel von Firebird und Oracle.&lt;br /&gt;
&lt;br /&gt;
===Vorbereiten der Abfrage===&lt;br /&gt;
&lt;br /&gt;
Bevor eine Abfrage ausgeführt wird, muss sie vorbereitet werden. Dazu führt FireDAC automatisch die folgenden Aktionen durch:&lt;br /&gt;
&lt;br /&gt;
* Versetzen der Verbindung in den [[Herstellen von Verbindungen (FireDAC)|aktiven]] oder [[Offline-Modus von Verbindungen (FireDAC)|Online]]-Status.&lt;br /&gt;
* Überprüfen, ob alle Parameter korrekt festgelegt sind.&lt;br /&gt;
* [[Vorverarbeiten von Anweisungstext (FireDAC)|Vorverarbeiten des Anweisungstextes]].&lt;br /&gt;
* Optional Anwenden von [[lib_de:FireDAC.Stan.Option.TFDFetchOptions.RecsSkip|RecsSkip]] und [[lib_de:FireDAC.Stan.Option.TFDFetchOptions.RecsMax|RecsMax]] für den Anweisungstext.&lt;br /&gt;
* Optional Starten einer Transaktion für Firebird/InterBase-DBMSs, wenn keine aktive Verbindung vorhanden ist.&lt;br /&gt;
* Übertragen des endgültigen Anweisungstextes an die DBMS-API. Der endgültige Text wird aus der Eigenschaft [[lib_de:FireDAC.Comp.Client.TFDCustomQuery.Text|TFDQuery.Text]] abgerufen.&lt;br /&gt;
&lt;br /&gt;
Während der Vorbereitung der Anweisung muss die Verbindung aktiv sein, und die Abfrage belegt die Serverressourcen. Verwenden Sie die Methoden &#039;&#039;&#039;Unprepare&#039;&#039;&#039; oder &#039;&#039;&#039;Disconnect&#039;&#039;&#039;, um die Vorbereitung der Abfrage aufzuheben und alle Ressourcen freizugeben. &lt;br /&gt;
&lt;br /&gt;
Wenn eine Anweisung nur einmal ausgeführt werden muss, setzen Sie [[lib_de:FireDAC.Stan.Option.TFDResourceOptions.DirectExecute|ResourceOptions.DirectExecute]] auf &#039;&#039;&#039;True&#039;&#039;&#039;. Bei einigen DBMSs (SQL Server, SQL Anywhere) wird dadurch die Ausführung beschleunigt, weil die zeitintensive Vorbereitung der SQL-Anweisung vermieden wird.&lt;br /&gt;
&lt;br /&gt;
===Ausführen der Abfrage===&lt;br /&gt;
&lt;br /&gt;
Mit den &#039;&#039;&#039;ExecSQL&#039;&#039;&#039;-Methoden führen Sie eine Abfrage aus, die keine Ergebnismenge zurückgibt. Wenn eine Abfrage eine Ergebnismenge zurückgibt, wird die Exception &#039;&#039;&#039;[FireDAC][Phys][MSAcc]-310. Anweisung, die Ergebnismengen zurückgibt, kann nicht ausgeführt werden&#039;&#039;&#039; ausgelöst. &lt;br /&gt;
&lt;br /&gt;
Mit den &#039;&#039;&#039;Open&#039;&#039;&#039;-Methoden führen Sie eine Abfrage aus, die eine Ergebnismenge zurückgibt, und öffnen diese Ergebnismenge. Wenn eine Abfrage keine Ergebnismengen zurückgibt, wird die Exception &#039;&#039;&#039;[FireDAC][Phys][MSAcc]-308. Anweisung, die keine Ergebnismengen zurückgibt, kann nicht geöffnet/definiert werden&#039;&#039;&#039; ausgelöst. &lt;br /&gt;
&lt;br /&gt;
Mit der Methode &#039;&#039;&#039;OpenOrExecute&#039;&#039;&#039; führen Sie eine Ad-hoc-Abfrage aus. &lt;br /&gt;
&lt;br /&gt;
{{Note| Die Abfrage kann [[Asynchrone Ausführung (FireDAC)|asynchron ausgeführt werden]]. Wenn es sich bei der Abfrage um einen Anweisungsstapel handelt, finden Sie unter &#039;&#039;&#039;[[Anweisungsstapel (FireDAC)|Anweisungsstapel]]&#039;&#039;&#039; Einzelheiten.}}&lt;br /&gt;
&lt;br /&gt;
===Die Exception &#039;&#039;&#039;Datentyp des Parameters wurde geändert&#039;&#039;&#039;===&lt;br /&gt;
&lt;br /&gt;
Wenn der Parametertyp nach dem ersten Aufruf von Prepare/ExecSQL/Open geändert wird, löst FireDAC beim folgenden Aufruf eine Exception aus: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
[FireDAC][Phys][IB]-338. Parameter [Xxxx] data type is changed.&lt;br /&gt;
Query must be reprepared.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
FireDAC speichert beim ersten Aufruf von Prepare/ExecSQL/Open den Datentyp der Parameter. Der Datentyp kann entweder explizit durch Setzen der Eigenschaft &#039;&#039;&#039;TFDParam.DataType&#039;&#039;&#039; oder implizit durch Zuweisen eines Wertes mit der Eigenschaft &#039;&#039;&#039;TFDParam.AsXxxx&#039;&#039;&#039; oder &#039;&#039;&#039;TFDParam.Value&#039;&#039;&#039; angegeben werden. Wenn die Anwendung den Parameterdatentyp vor dem nächsten Aufruf von ExecSQL/Open ändert, wird beim erneuten Aufrufen von ExecSQL/Open die Exception &amp;quot;Datentyp des Parameters [xxxxx] wurde geändert&amp;quot; ausgelöst. &lt;br /&gt;
&lt;br /&gt;
Die Eigenschaft &#039;&#039;&#039;TFDParam.Value&#039;&#039;&#039; ändert den Parameterdatentyp beim nächsten Aufruf nicht. Sie wandelt den Typ des zugewiesenen Wertes in den aktuellen Datentyp um. Um die obige Exception zu vermeiden, verwenden Sie:&lt;br /&gt;
&lt;br /&gt;
* Den &#039;&#039;&#039;TFDParam.Value&#039;&#039;&#039;-Eigenschaftswert.&lt;br /&gt;
* Die Eigenschaft &#039;&#039;&#039;TFDParam.AsXxxx&#039;&#039;&#039;, wenn &#039;&#039;&#039;Xxxx&#039;&#039;&#039; beim ersten Aufruf verwendet wurde.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Abrufen von DBMS-Rückmeldungen===&lt;br /&gt;
&lt;br /&gt;
Mit der Eigenschaft [[lib_de:FireDAC.Comp.Client.TFDRdbmsDataSet.RowsAffected|TFDQuery.RowsAffected]] rufen Sie die Anzahl der von der Anweisung verarbeiteten Zeilen ab (z. B. die Anzahl der durch die Anweisung DELETE gelöschten Zeilen). &lt;br /&gt;
&lt;br /&gt;
{{Note| Bei MS SQL Server kann &#039;&#039;&#039;RowsAffected&#039;&#039;&#039; gleich -1 sein, wenn bei einer gespeicherten Prozedur oder einem Tabellen-Trigger SET NOCOUNT ON weggelassen wird. Verwenden Sie dann die Eigenschaft &#039;&#039;&#039;TFDQuery.RecordCount&#039;&#039;&#039; zum Ermitteln der Anzahl der abgerufenen Zeilen. }}&lt;br /&gt;
&lt;br /&gt;
{{Note| FireDAC stellt keine Meldungen über die Anzahl der verarbeiteten Zeilen bereit. Bei Bedarf müssen solche Meldungen in der Anwendung erstellt werden. }}&lt;br /&gt;
&lt;br /&gt;
Wenn die Anweisung einen Fehler zurückgibt, wird eine Exception ausgelöst. Weitere Einzelheiten finden Sie unter [[Fehlerbehandlung (FireDAC)|Fehlerbehandlung]]. Die Exception kann auf eine der folgenden drei Arten verarbeitet werden:&lt;br /&gt;
&lt;br /&gt;
* Verwenden der Konstruktion &amp;quot;try/except/end&amp;quot;. Zum Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
try&lt;br /&gt;
  FDQuery1.ExecSQL;&lt;br /&gt;
except&lt;br /&gt;
  on E: EFDDBEngineException do&lt;br /&gt;
    ; // do something here&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Festlegen der Ereignisbehandlungsroutine [[lib_de:FireDAC.Comp.Client.TFDAdaptedDataSet.OnError|TFDQuery.OnError]].&lt;br /&gt;
* Festlegen der Ereignisbehandlungsroutine [[lib_de:FireDAC.Comp.Client.TFDCustomConnection.OnError|TFDConnection.OnError]]. Zum Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
procedure TForm1.FDConnection1Error(ASender: TObject; const AInitiator: IFDStanObject;&lt;br /&gt;
  var AException: Exception);&lt;br /&gt;
begin&lt;br /&gt;
  if (AException is EFDDBEngineException) and (EFDDBEngineException(AException).Kind = ekRecordLocked) then&lt;br /&gt;
    AException.Message := &#039;Please, try the operation later. At moment, the record is busy&#039;;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
FDConnection1.OnError := FDConnection1Error;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei der Array DML ist die Fehlerbehandlung komplexer. &lt;br /&gt;
&lt;br /&gt;
Die Anweisung gibt je nach DBMS Warnungen, Hinweise und Meldungen zurück. Setzen Sie [[lib_de:FireDAC.Stan.Option.TFDTopResourceOptions.ServerOutput|ResourceOptions.ServerOutput]] auf &#039;&#039;&#039;True&#039;&#039;&#039;, um die Meldungsverarbeitung zu aktivieren. Mit der Eigenschaft [[lib_de:FireDAC.Comp.Client.TFDCustomConnection.Messages|TFDConnection.Messages]] werden die Meldungen verarbeitet. Zum Beispiel: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
var&lt;br /&gt;
  i: Integer;&lt;br /&gt;
begin&lt;br /&gt;
  FDConnection1.ResourceOptions.ServerOutput := True;&lt;br /&gt;
  FDQuery1.ExecSQL;&lt;br /&gt;
  if FDConnection1.Messages &amp;lt;&amp;gt; nil then&lt;br /&gt;
    for i := 0 to FDConnection1.Messages.ErrorCount - 1 do&lt;br /&gt;
      Memo1.Lines.Add(FDConnection1.Messages[i].Message);&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Einige DBMSs, wie SQL Server, geben Meldungen als weitere Ergebnismenge zurück. Daher muss die Anwendung zum Verarbeiten von Meldungen mehrere Ergebnismengen verarbeiten. Im Folgenden finden Sie ein komplexeres Beispiel, das den Status und die Meldungen für SQL Server bereitstellt. In diesem Beispiel wird &#039;&#039;&#039;TFDMemTable&#039;&#039;&#039; verwendet, um Ergebnismengen mit Zeilen zu speichern. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
var&lt;br /&gt;
  i: Integer;&lt;br /&gt;
begin&lt;br /&gt;
  FDConnection1.ResourceOptions.ServerOutput := True;&lt;br /&gt;
  FDQuery1.FetchOptions.AutoClose := False;&lt;br /&gt;
  FDQuery1.Open(&#039;select * from Region; print &#039;&#039;Hello&#039;&#039;&#039;);&lt;br /&gt;
  FDMemTable1.Data := FDQuery1.Data;&lt;br /&gt;
  Memo1.Lines.Add(Format(&#039;%d rows processed&#039;, [FDMemTable1.RecordCount]));&lt;br /&gt;
  FDQuery1.NextRecordSet;&lt;br /&gt;
  if FDConnection1.Messages &amp;lt;&amp;gt; nil then&lt;br /&gt;
    for i := 0 to FDConnection1.Messages.ErrorCount - 1 do&lt;br /&gt;
      Memo1.Lines.Add(FDConnection1.Messages[i].Message);&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Abfrageausführung und Transaktionen==&lt;br /&gt;
&lt;br /&gt;
Standardmäßig werden alle SQL-Anweisungsausführungen im Modus &amp;quot;Autocommit&amp;quot; durchgeführt. Das heißt, dass diese implizite Transaktion gestartet wird, wenn direkt vor der Anweisungsausführung keine aktive Transaktion vorhanden ist. Ebenso wird die Transaktion direkt nach der Anweisungsausführung beendet:&lt;br /&gt;
&lt;br /&gt;
* durch &#039;&#039;&#039;Commit&#039;&#039;&#039; bei erfolgreicher Ausführung.&lt;br /&gt;
* durch &#039;&#039;&#039;Rollback&#039;&#039;&#039; bei einem Fehler.&lt;br /&gt;
&lt;br /&gt;
Bei Firebird und InterBase startet eine implizite Transaktion direkt vor der Abfragevorbereitung. Eine einzelne Anweisungsausführung muss nicht in explizite Transaktionen eingeschlossen sein, verwenden Sie einfach den Modus &amp;quot;Autocommit&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Erweiterte Optionen==&lt;br /&gt;
&lt;br /&gt;
Die meisten Datenbankanwendungen verfügen für die Verwaltung über Backend-Hilfsprogramme, die SQL-Skripte ausführen müssen. Die Zeilen in diesen Skripten entsprechen in gewisser Weise der DBMS-SQL-Skriptsyntax. Verwenden Sie zum Ausführen von [[Ausführen von SQL-Skripten (FireDAC)|SQL-Skripten]] die Komponente [[lib_de:FireDAC.Comp.Script.TFDScript|TFDScript]]. &lt;br /&gt;
&lt;br /&gt;
Manchmal führt eine Datenbankanwendung heterogene Abfragen aus, indem Tabellen aus verschiedenen Datenbanken verwendet werden, oder sie führt SQL-Anweisungen für &#039;&#039;&#039;TDataSet&#039;&#039;&#039;-Nachkommen anstatt für die Datenbanktabellen aus. Verwenden Sie die [[Local SQL (FireDAC)|Local SQL-Engine]] und die Komponente [[lib_de:FireDAC.Phys.SQLiteVDataSet.TFDLocalSQL|TFDLocalSQL]], um solche Abfragen auszuführen.&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
&lt;br /&gt;
*[[Ausführen von gespeicherten Prozeduren (FireDAC)|Ausführen von gespeicherten Prozeduren]]&lt;br /&gt;
*[[Durchsuchen von Tabellen (FireDAC)|Durchsuchen von Tabellen]]&lt;br /&gt;
*[[Anweisungsstapel (FireDAC)|Anweisungsstapel]]&lt;br /&gt;
*[[Asynchrone Ausführung (FireDAC)|Asynchrone Ausführung]]&lt;br /&gt;
*[[Local SQL (FireDAC)|Local SQL]]&lt;br /&gt;
&lt;br /&gt;
{{DEFAULTSORT:Ausfuhren von Anweisungen (FireDAC)}}&lt;br /&gt;
[[Category:FireDAC]]&lt;br /&gt;
[[Category:AMMigrate]]&lt;br /&gt;
&lt;br /&gt;
[[en:Executing Commands (FireDAC)]]&lt;br /&gt;
[[fr:Exécution des commandes (FireDAC)]]&lt;br /&gt;
[[ja:コマンドの実行（FireDAC）]]&lt;/div&gt;</summary>
		<author><name>Nicolas.rios</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Melden_eines_Fehlers_%C3%BCber_das_Quality_Portal_von_RAD_Studio&amp;diff=219045</id>
		<title>Melden eines Fehlers über das Quality Portal von RAD Studio</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Melden_eines_Fehlers_%C3%BCber_das_Quality_Portal_von_RAD_Studio&amp;diff=219045"/>
		<updated>2024-08-08T23:58:22Z</updated>

		<summary type="html">&lt;p&gt;Nicolas.rios: RS-123874 qp link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Parent|Einführung in RAD Studio}}&lt;br /&gt;
&lt;br /&gt;
Wenn Sie bei {{Product}} ein Problem feststellen, können Sie einen Fehlerbericht über unser &#039;&#039;&#039;Quality Portal&#039;&#039;&#039; unter &#039;&#039;&#039;[https://qp.embarcadero.com/ qp.embarcadero.com (EN)]&#039;&#039;&#039; einreichen. &lt;br /&gt;
&lt;br /&gt;
Die Quality Portal-Website verwendet das Fehlerverfolgungssystem JIRA, das wir auch intern nutzen. Bitte verwenden Sie das Quality Portal anstatt des alten &#039;&#039;&#039;[[Quality Central|Quality Central]]&#039;&#039;&#039;, auch als QC bezeichnet, das allmählich abgeschafft wird. Beide Websites sind mit unserem internen JIRA-System verbunden.}}&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen über die Verwendung des Quality Portal finden Sie in folgendem Artikel im Embarcadero Developer Network:  [http://dn.embarcadero.com/article/44137 http://dn.embarcadero.com/article/44137 (EN)].&lt;br /&gt;
&lt;br /&gt;
==Hotfixes und Workarounds==&lt;br /&gt;
&lt;br /&gt;
Vor dem Melden eines Fehlers über das &#039;&#039;&#039;Quality Portal&#039;&#039;&#039; sollten Sie einen Blick auf die [[Plat de:Hauptseite|Platformstatus]]-Seite werfen. Auf dieser Seite finden Sie die verfügbare Hotfixes sowie eine Referenzliste aller Plattformen, die von einer bestimmten {{Product}}-Version unterstützt werden.&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
&lt;br /&gt;
{{f|qc|&lt;br /&gt;
&lt;br /&gt;
* [[Quality Central|Quality Central]] }}&lt;br /&gt;
* [[Interne Fehler beheben (C++)|Interne Fehler beheben (C++)]]&lt;br /&gt;
&lt;br /&gt;
{{DEFAULTSORT:Melden eines Fehlers uber das Quality Portal von RAD Studio}}&lt;br /&gt;
[[Category:Delphi]]&lt;br /&gt;
[[Category:C++]]&lt;br /&gt;
[[Category:Einführung]]&lt;br /&gt;
[[Category:AMMigrate]]&lt;br /&gt;
&lt;br /&gt;
[[en:How to File a Bug Using the RAD Studio Quality Portal]]&lt;br /&gt;
[[fr:Comment entrer un bogue dans Studio Quality Portal]]&lt;br /&gt;
[[ja:RAD Studio 品質ポータルを使用したバグの連絡方法]]&lt;/div&gt;</summary>
		<author><name>Nicolas.rios</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Interne_Fehler_beheben_(C%2B%2B)&amp;diff=219044</id>
		<title>Interne Fehler beheben (C++)</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Interne_Fehler_beheben_(C%2B%2B)&amp;diff=219044"/>
		<updated>2024-08-08T23:52:07Z</updated>

		<summary type="html">&lt;p&gt;Nicolas.rios: RS-123874 qp link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Parent|So verwenden Sie den Debugger}}&lt;br /&gt;
&lt;br /&gt;
==Interne Compiler-Fehler==&lt;br /&gt;
&lt;br /&gt;
Es gibt drei Arten von Fehlern, die der C++-Compiler erzeugt und die als interne Compiler-Fehler eingestuft werden:&lt;br /&gt;
&lt;br /&gt;
*[[F1001 Interner Verarbeitungsfehler im Code-Generator (C++)|F1001 Interner Verarbeitungsfehler im Code-Generator:]]&lt;br /&gt;
*:&amp;lt;code&amp;gt;F1001 [C++ Schwerer Fehler] &amp;amp;lt;Dateiname&amp;amp;gt;(&amp;amp;lt;Zeile&amp;amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
*[[F1004 Interner Compiler-Fehler (C++)|F1004 Interner Compiler-Fehler:]]&lt;br /&gt;
*:&amp;lt;code&amp;gt;F1004 [C++ Schwerer Fehler] &amp;amp;lt;Dateiname&amp;amp;gt;(&amp;amp;lt;Zeile&amp;amp;gt;): &amp;lt;/code&amp;gt;&lt;br /&gt;
* Interner Backend-Fehler &amp;lt;code&amp;gt;Fehlercode&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alle drei Fehlerarten resultieren aus Fehlern im Compiler. &amp;amp;lt;Dateiname&amp;amp;gt; und &amp;amp;lt;Zeile&amp;amp;gt; geben die Stelle im Quelltext an, die der Compiler vor dem Fehler analysiert hat. Anhand dieser Informationen können Sie möglicherweise die Ursache des Problems ermitteln. &amp;amp;lt;Fehlercode&amp;amp;gt; ist eine spezifische Information, die Compiler-Entwicklern mitteilt, was der Compiler auszuführen versuchte, als der Fehler auftrat.&lt;br /&gt;
&lt;br /&gt;
==Vorgehen bei internen Compiler-Fehlern==&lt;br /&gt;
&lt;br /&gt;
# Ihr Quelltext muss nicht wirklich fehlerhaft sein.&lt;br /&gt;
# Versuchen Sie, ein neues, bereinigtes Build auszuführen.{{f|radstudio|&lt;br /&gt;
# Versuchen Sie, ein Befehlszeilen-Build auszuführen.}}&lt;br /&gt;
# Analysieren Sie den Quelltext, um das Problem einzugrenzen.&lt;br /&gt;
# Senden Sie einen Fehlerbericht.&lt;br /&gt;
&lt;br /&gt;
===So führen Sie ein neues, bereinigtes Build aus:===&lt;br /&gt;
&lt;br /&gt;
# Klicken Sie in der Projektverwaltung mit der rechten Maustaste auf das Projekt, und wählen Sie &#039;&#039;&#039;Bereinigen&#039;&#039;&#039;.&lt;br /&gt;
# Überprüfen Sie die Verzeichnisstruktur, um sicherzustellen, dass dem Projekt keine .obj-, .tds-, .dcu-, .#*-, oder .pch-Dateien zugeordnet sind.&lt;br /&gt;
# Wählen Sie im Menü &amp;quot;Projekt&amp;quot; den Befehl &#039;&#039;&#039;Erzeugen&#039;&#039;&#039; aus.&lt;br /&gt;
&lt;br /&gt;
{{f|radstudio|&lt;br /&gt;
&lt;br /&gt;
===So führen Sie ein Befehlszeilen-Build aus:===&lt;br /&gt;
&lt;br /&gt;
# Sie können die Befehlszeile des Compilers aus der Registerkarte &amp;quot;Ausgabe&amp;quot; des Fensters &amp;quot;Meldungen&amp;quot; kopieren und diesen Befehl an der Eingabeaufforderung verwenden oder ...&lt;br /&gt;
# Wählen Sie im Startmenü &amp;quot;Rad Studio-Befehlszeile&amp;quot;, und geben Sie dann &amp;quot;msbuild IhrProjekt.cbproj&amp;quot; ein.&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===So analysieren Sie den Quelltext:===&lt;br /&gt;
&lt;br /&gt;
{{f|radstudio|Wenn das Problem weder durch ein bereinigtes Build noch durch ein Befehlszeilen-Build behoben wurde, sollten Sie den Quelltext analysieren, um das Problem einzugrenzen.}}&lt;br /&gt;
{{f|appmethod|Wenn das Problem nicht durch ein bereinigtes Build behoben wurde, sollten Sie den Quelltext analysieren, um das Problem einzugrenzen.}}&lt;br /&gt;
&lt;br /&gt;
#Verarbeiten Sie die in der Fehlermeldung angegebene Datei vor. Klicken Sie dazu in der Projektverwaltung mit der rechten Maustaste auf die Datei, und wählen Sie &amp;quot;Vorverarbeiten&amp;quot;{{f|radstudio|, oder ersetzen Sie in die Befehlszeile im Befehl zum Compilieren der Datei den Compiler (bcc32.exe) durch den Präprozessor (cpp32.exe)}}. Dadurch wird eine Datei ohne externe Abhängigkeiten für die Compilierung erzeugt, die möglicherweise sehr groß ist.&lt;br /&gt;
# Compilieren Sie die vorverarbeitete Datei mit der Option -P. Wenn das ausreicht, um das Problem zu reproduzieren, können Sie direkt mit Schritt 4 fortfahren.&lt;br /&gt;
# Wenn die .i-Datei korrekt compiliert wird, sind wahrscheinlich weitere Optionen erforderlich, um das Problem zu reproduzieren. Compilieren Sie die .i-Datei erneut, und fügen Sie nacheinander alle Optionen hinzu, die Sie für das ursprüngliche Befehlszeilen-Build verwendet haben, bis Sie feststellen können, welche Optionen zum Reproduzieren des Problems erforderlich sind.&lt;br /&gt;
# Diese Informationen sind ausreichend, um einen Fehlerbericht zu senden. Wenn Sie das Problem nicht weiter eingrenzen möchten, fahren Sie bitte mit der Anleitung zum Senden eines Fehlerberichts fort.&lt;br /&gt;
# Sie können alles nach der Zeile, in der der Fehler auftritt, und alle Kommentare löschen.&lt;br /&gt;
# Beginnen Sie damit, Funktionsrümpfe und andere Codebereiche auszukommentieren, die höchstwahrscheinlich nichts mit dem Problem zu tun haben.&lt;br /&gt;
# Wenn Sie Bereiche identifizieren, die zum Reproduzieren des Problems nicht erforderlich sind, können Sie diese Abschnitte aus der .i-Datei löschen.&lt;br /&gt;
# Wenn Sie die für das Problem nötigen Elemente eingegrenzt haben, können Sie einen Fehlerbericht senden und den verwendeten Konstrukttyp analysieren, mit dem eine Lösung gefunden werden sollte.&lt;br /&gt;
&lt;br /&gt;
===So senden Sie einen Fehlerbericht:===&lt;br /&gt;
&lt;br /&gt;
# Melden eines neuen Fehlers über das &#039;&#039;&#039;Quality Portal&#039;&#039;&#039; unter &#039;&#039;&#039;[https://qp.embarcadero.com/ qp.embarcadero.com]&#039;&#039;&#039;.&lt;br /&gt;
# Wählen Sie {{CBuilder}} als Projekt.&lt;br /&gt;
# Wählen Sie Compiler/C++ als Bereich.&lt;br /&gt;
# Geben Sie die zum Reproduzieren des Fehlers erforderliche Befehlszeile in die Fehlerschritte ein.&lt;br /&gt;
# Hängen Sie die .i-Datei an.&lt;br /&gt;
# Klicken Sie auf das Häkchen, um den Bericht zu speichern.&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
&lt;br /&gt;
* [[Compiler-Fehler und -Warnungen (C++) - Index|Compiler-Fehler und -Warnungen (C++) - Index]]&lt;br /&gt;
* [[Interne Fehler beheben (Delphi)|Interne Fehler beheben (Delphi)]]&lt;br /&gt;
* [[Melden eines Fehlers über das Quality Portal von RAD Studio|Melden eines Fehlers über das Quality Portal von RAD Studio]]&lt;br /&gt;
&lt;br /&gt;
[[Category:C++]]&lt;br /&gt;
[[Category:AMMigrate]]&lt;br /&gt;
&lt;br /&gt;
[[en:Resolving Internal Errors (C++)]]&lt;br /&gt;
[[fr:Résolution des erreurs internes (C++)]]&lt;br /&gt;
[[ja:内部エラーを解決する（C++）]]&lt;/div&gt;</summary>
		<author><name>Nicolas.rios</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Speichern_und_Wiederherstellen&amp;diff=219043</id>
		<title>Speichern und Wiederherstellen</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Speichern_und_Wiederherstellen&amp;diff=219043"/>
		<updated>2024-07-12T12:39:13Z</updated>

		<summary type="html">&lt;p&gt;Nicolas.rios: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Parent|Ein erster Blick auf die IDE}}&lt;br /&gt;
&lt;br /&gt;
{{Menu|Tools &amp;amp;gt; Optionen &amp;amp;gt; IDE &amp;amp;gt; Speichern und Wiederherstellen}}&lt;br /&gt;
&lt;br /&gt;
==Auto-Wiederherstellen==&lt;br /&gt;
&lt;br /&gt;
Die Funktion &amp;quot;Auto-Wiederherstellen&amp;quot; ermöglicht, dass die IDE alle geöffneten Dateien nach einer bestimmten Zeit speichert. Die gespeicherten Dateien können Sie nach einem unerwarteten Schließen der IDE wiederherstellen.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; frame=&amp;quot;hsides&amp;quot; rules=&amp;quot;rows&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!&#039;&#039;&#039;Element&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Beschreibung&#039;&#039;&#039;&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
Sicherungsdateien regelmäßig für Auto-Wiederherstellen speichern&lt;br /&gt;
|&lt;br /&gt;
Aktiviert oder deaktiviert die Funktion &amp;quot;Auto-Wiederherstellen&amp;quot;.&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
Speicherintervall (Minuten)&lt;br /&gt;
|&lt;br /&gt;
Zeitspanne in Minuten, in der die IDE alle geöffneten Dateien für die Wiederherstellung speichert.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Wenn &#039;&#039;&#039;AutoRecover&#039;&#039;&#039; aktiviert ist, speichert {{Product}} die Wiederherstellungsdateien im verborgenen Ordner {{Path|_recovery}} im Ordner Ihres Projekts. Im Falle eines unerwarteten Schließens der IDE stellt {{Product}} mit den gespeicherten Dateien die Informationen beim erneuten Öffnen der IDE wieder her.&lt;br /&gt;
&lt;br /&gt;
Führen Sie nach einem unerwarteten Schließen die folgenden Schritte aus, um Ihre Dateien wiederherzustellen:&lt;br /&gt;
&lt;br /&gt;
#Öffnen Sie die IDE.&lt;br /&gt;
#Das Fenster &#039;&#039;&#039;Dateiwiederherstellung&#039;&#039;&#039; wird mit den wiederherstellbaren Dateien angezeigt.&lt;br /&gt;
#Doppelklicken Sie auf die Dateien, die Sie wiederherstellen möchten.&lt;br /&gt;
#Klicken Sie auf &#039;&#039;&#039;Schließen&#039;&#039;&#039;, um das Fenster &amp;quot;Dateiwiederherstellung&amp;quot; zu schließen.&lt;br /&gt;
#Fahren Sie mit dem Speichern Ihrer Dateien nach Bedarf fort.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie das Fenster &#039;&#039;&#039;Dateiwiederherstellung&#039;&#039;&#039; ohne Wiederherstellung Ihrer Dateien schließen, werden Sie von der IDE gefragt, ob Sie die verbleibenden wiederhergestellten Dateien verwerfen möchten. Klicken Sie auf &#039;&#039;&#039;Nein&#039;&#039;&#039;, wenn Sie diese Dateien später wiederherstellen möchten.&lt;br /&gt;
&lt;br /&gt;
{{Warning|Wenn Sie auf &#039;&#039;&#039;Ja&#039;&#039;&#039; klicken, verwirft die IDE die Wiederherstellungsdateien, und Sie können die Dateien danach nicht mehr wiederherstellen.}}&lt;br /&gt;
&lt;br /&gt;
:&lt;br /&gt;
::[[File:FileRecoverySydney.png|link=]]&lt;br /&gt;
&lt;br /&gt;
==Auto-Speichern==&lt;br /&gt;
&lt;br /&gt;
Mit der Funktion &#039;&#039;&#039;Auto-Speichern&#039;&#039;&#039; kann die IDE automatisch Dateien und Projekt-Desktop-Einstellungen speichern.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; frame=&amp;quot;hsides&amp;quot; rules=&amp;quot;rows&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!&#039;&#039;&#039;Element&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Beschreibung&#039;&#039;&#039;&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
Dateien beim Compilieren oder Ausführen speichern&lt;br /&gt;
|&lt;br /&gt;
Ermöglicht der IDE alle geänderten Dateien automatisch beim Ausführen, Compilieren oder Erzeugen des Projekts oder beim Beenden des Produkts zu speichern.&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
Projekt-Desktop beim Schließen speichern&lt;br /&gt;
|&lt;br /&gt;
Speichert oder aktualisiert automatisch die Projekt-Desktop-Dateien (Dateierweiterung .dsk), wenn Sie das Projekt schließen oder das Produkt beenden.&lt;br /&gt;
In der Datei &amp;lt;code&amp;gt;&amp;amp;lt;myproject&amp;amp;gt;.dsk&amp;lt;/code&amp;gt; werden die aktuellen Einstellungen für Folgendes erfasst:&lt;br /&gt;
*Desktop-Layout&lt;br /&gt;
*Haltepunkte&lt;br /&gt;
*Überwachte Ausdrücke&lt;br /&gt;
*Dateien, die aktuell in der IDE geöffnet sind&lt;br /&gt;
&lt;br /&gt;
Wenn &#039;&#039;&#039;Projekt-Desktop automatisch speichern&#039;&#039;&#039; deaktiviert ist, werden alle vorhandenen .dsk-Projektdateien beim Öffnen des Projekts gelesen, aber sie werden nie aktualisiert. Deshalb wird derselbe Satz von Dateien mit dem Projekt geöffnet, bis die .dsk-Datei manuell von der Festplatte gelöscht wird.&lt;br /&gt;
Wenn Sie das Projekt später erneut öffnen, wird die .dsk-Datei gelesen, und das Desktop-Layout, die Haltepunkte und die überwachten Ausdrücke werden wiederhergestellt. Außerdem werden alle Dateien, die beim Schließen des Projekts geöffnet waren, wieder geöffnet, auch wenn sie vom Projekt nicht verwendet werden.&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
Zuletzt geöffnetes Projekt beim Starten von RAD Studio erneut öffnen&lt;br /&gt;
|&lt;br /&gt;
Wenn Sie {{Product}} schließen, während ein Projekt geöffnet ist, merkt sich die IDE dieses Projekt und öffnet es beim nächsten Start von {{Product}} wieder.&lt;br /&gt;
Wenn &#039;&#039;&#039;Projekt-Desktop beim Schließen speichern&#039;&#039;&#039; aktiviert ist, dann wird das Projekt mit demselben Satz von Dateien, Haltepunkten und überwachten Ausdrücken wieder geöffnet, die es beim Beenden von {{Product}} hatte.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
&lt;br /&gt;
*[[Speichern-Befehle|Speichern-Befehle]]&lt;br /&gt;
*[[Default Folders|Standardordner]]&lt;br /&gt;
*[[Compilierung und Ausführung|Compilierung und Ausführung]]&lt;br /&gt;
*[[Komponenten-Symbolleiste|Komponenten-Symbolleiste]]&lt;br /&gt;
*[[Umgebungsvariablen|Umgebungsvariablen]]&lt;br /&gt;
*[[Dateizuordnung|Dateizuordnung]]&lt;br /&gt;
*[[Desktop und Layout|Desktop und Layout]]&lt;br /&gt;
*[[Projekt-Upgrade|Projekt-Upgrade]]&lt;br /&gt;
*[[LiveBindings-Optionen|LiveBindings]]&lt;br /&gt;
*[[GetIt (Optionen)|GetIt-Package-Manager]]&lt;br /&gt;
&lt;br /&gt;
[[en:Saving and Recovering]]&lt;br /&gt;
[[fr:Enregistrement et récupération]]&lt;br /&gt;
[[ja:保存とリカバリ]]&lt;/div&gt;</summary>
		<author><name>Nicolas.rios</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=ALLOWBIND&amp;diff=219042</id>
		<title>ALLOWBIND</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=ALLOWBIND&amp;diff=219042"/>
		<updated>2024-06-07T15:27:50Z</updated>

		<summary type="html">&lt;p&gt;Nicolas.rios: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Parent|Liste der Delphi-Compiler-Direktiven - Index}}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; frame=&amp;quot;hsides&amp;quot; rules=&amp;quot;rows&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
&#039;&#039;&#039;Typ&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
Option&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
&#039;&#039;&#039;Syntax&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
{$ALLOWBIND ON}, {$ALLOWBIND OFF}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
&#039;&#039;&#039;Vorgabe&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
{$ALLOWBIND OFF}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
&#039;&#039;&#039;Bereich&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
Global&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bemerkungen&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Legt fest, ob eine DLL gebunden werden kann. Die Option &#039;&#039;&#039;{$ALLOWBIND}&#039;&#039;&#039; setzt ein Bit im Header der DLL, das für die Datei Bind.exe angibt, dass das Image gebunden werden kann. Deaktivieren Sie die Option &#039;&#039;&#039;{$ALLOWBIND}&#039;&#039;&#039;, um zu verhindern, dass Bind.exe die DLL bindet.&lt;br /&gt;
&lt;br /&gt;
{{Note| Wenn ASLR (Address Space Layout Randomization) für das Image aktiviert ist, hat &#039;&#039;&#039;{$ALLOWBIND}&#039;&#039;&#039; keine Auswirkungen.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Delphi]]&lt;br /&gt;
&lt;br /&gt;
[[en:ALLOWBIND]]&lt;br /&gt;
[[fr:ALLOWBIND]]&lt;/div&gt;</summary>
		<author><name>Nicolas.rios</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Dynamisch_ladbare_Bibliotheken_schreiben&amp;diff=219041</id>
		<title>Dynamisch ladbare Bibliotheken schreiben</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Dynamisch_ladbare_Bibliotheken_schreiben&amp;diff=219041"/>
		<updated>2024-06-06T18:23:15Z</updated>

		<summary type="html">&lt;p&gt;Nicolas.rios: RS-123009&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Parent|Bibliotheken und Packages - Index}}&lt;br /&gt;
&amp;lt;ideTag id=&amp;quot;library&amp;quot;&amp;gt;&amp;lt;/ideTag&amp;gt;&lt;br /&gt;
&amp;lt;ideTag id=&amp;quot;stdcall&amp;quot;&amp;gt;&amp;lt;/ideTag&amp;gt;&lt;br /&gt;
&amp;lt;ideTag id=&amp;quot;register&amp;quot;&amp;gt;&amp;lt;/ideTag&amp;gt;&lt;br /&gt;
&amp;lt;ideTag id=&amp;quot;exports&amp;quot;&amp;gt;&amp;lt;/ideTag&amp;gt;&lt;br /&gt;
&amp;lt;ideTag id=&amp;quot;local&amp;quot;&amp;gt;&amp;lt;/ideTag&amp;gt;&lt;br /&gt;
&amp;lt;ideTag id=&amp;quot;EBX&amp;quot;&amp;gt;&amp;lt;/ideTag&amp;gt;&lt;br /&gt;
&amp;lt;ideTag id=&amp;quot;name&amp;quot;&amp;gt;&amp;lt;/ideTag&amp;gt;&lt;br /&gt;
&amp;lt;ideTag id=&amp;quot;resident&amp;quot;&amp;gt;&amp;lt;/ideTag&amp;gt;&lt;br /&gt;
&amp;lt;ideTag id=&amp;quot;DllProc&amp;quot;&amp;gt;&amp;lt;/ideTag&amp;gt;&lt;br /&gt;
&amp;lt;ideTag id=&amp;quot;IsLibrary&amp;quot;&amp;gt;&amp;lt;/ideTag&amp;gt;&lt;br /&gt;
&amp;lt;ideTag id=&amp;quot;HInstance&amp;quot;&amp;gt;&amp;lt;/ideTag&amp;gt;&lt;br /&gt;
&amp;lt;ideTag id=&amp;quot;DLL_PROCESS_DETACH&amp;quot;&amp;gt;&amp;lt;/ideTag&amp;gt;&lt;br /&gt;
&amp;lt;ideTag id=&amp;quot;FreeLibrary&amp;quot;&amp;gt;&amp;lt;/ideTag&amp;gt;&lt;br /&gt;
&amp;lt;ideTag id=&amp;quot;DLL_PROCESS_ATTACH&amp;quot;&amp;gt;&amp;lt;/ideTag&amp;gt;&lt;br /&gt;
&amp;lt;ideTag id=&amp;quot;LoadLibrary&amp;quot;&amp;gt;&amp;lt;/ideTag&amp;gt;&lt;br /&gt;
&amp;lt;ideTag id=&amp;quot;DLL_THREAD_ATTACH&amp;quot;&amp;gt;&amp;lt;/ideTag&amp;gt;&lt;br /&gt;
&amp;lt;ideTag id=&amp;quot;DLL_THREAD_DETACH&amp;quot;&amp;gt;&amp;lt;/ideTag&amp;gt;&lt;br /&gt;
&amp;lt;ideTag id=&amp;quot;$OEEDFADE&amp;quot;&amp;gt;&amp;lt;/ideTag&amp;gt;&lt;br /&gt;
&amp;lt;ideTag id=&amp;quot;ExceptionInformation&amp;quot;&amp;gt;&amp;lt;/ideTag&amp;gt;&lt;br /&gt;
&amp;lt;ideTag id=&amp;quot;GetMem&amp;quot;&amp;gt;&amp;lt;/ideTag&amp;gt;&lt;br /&gt;
&amp;lt;ideTag id=&amp;quot;ShareMem&amp;quot;&amp;gt;&amp;lt;/ideTag&amp;gt;&lt;br /&gt;
&amp;lt;ideTag id=&amp;quot;BORLANDMM.DLL&amp;quot;&amp;gt;&amp;lt;/ideTag&amp;gt;&lt;br /&gt;
&amp;lt;ideTag id=&amp;quot;delayed&amp;quot;&amp;gt;&amp;lt;/ideTag&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note| Hinsichtlich der Exportmöglichkeiten sind Bibliotheken gegenüber Packages deutlich eingeschränkter. &amp;lt;!-- :&lt;br /&gt;
* In Win32 und Linux,  --&amp;gt; Bibliotheken können keine Konstanten, Typen und normale Variablen exportieren. Das heißt, dass in einer Bibliothek definierte Klassentypen für ein Programm, das diese Bibliothek verwendet, nicht sichtbar sind.&lt;br /&gt;
&amp;lt;!--  *In .NET, libraries can export types for use by other languages such as C#, but not for Delphi.  --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Um andere Elemente als einfache Prozeduren und Funktionen zu exportieren,&#039;&#039;&#039; sind &#039;&#039;&#039;[[Packages (Delphi)|Packages]]&#039;&#039;&#039; die empfohlene Alternative. Bibliotheken sollten nur verwendet werden, wenn eine Interoperabilität mit anderen Programmen erforderlich ist.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In den folgenden Abschnitten werden die Elemente beschrieben, die bei der Erstellung einer dynamisch ladbaren Bibliothek zum Einsatz kommen:&lt;br /&gt;
&lt;br /&gt;
* Die exports-Klausel&lt;br /&gt;
* Code für die Initialisierung der Bibliothek&lt;br /&gt;
* Globale Variablen&lt;br /&gt;
* Bibliotheken und Systemvariablen&lt;br /&gt;
&lt;br /&gt;
==Die exports-Klausel==&lt;br /&gt;
&lt;br /&gt;
Die Grundstruktur einer dynamisch ladbaren Bibliothek ist identisch mit der eines Programms. Der einzige Unterschied besteht darin, dass sie nicht mit &#039;&#039;&#039;program&#039;&#039;&#039;, sondern mit dem reservierten Wort &#039;&#039;&#039;library&#039;&#039;&#039; beginnt.&lt;br /&gt;
&lt;br /&gt;
Andere Bibliotheken und Programme können nur auf die Routinen zugreifen, die eine Bibliothek explizit exportiert. Das folgende Beispiel zeigt eine Bibliothek mit den exportierten Funktionen &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Min&amp;lt;/span&amp;gt; und &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Max&amp;lt;/span&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 library MinMax;&lt;br /&gt;
 function Min(X, Y: Integer): Integer; stdcall;&lt;br /&gt;
 begin&lt;br /&gt;
   if X &amp;lt; Y then Min := X else Min := Y;&lt;br /&gt;
 end;&lt;br /&gt;
 function Max(X, Y: Integer): Integer; stdcall;&lt;br /&gt;
 begin&lt;br /&gt;
   if X &amp;gt; Y then Max := X else Max := Y;&lt;br /&gt;
 end;&lt;br /&gt;
 exports&lt;br /&gt;
   Min,&lt;br /&gt;
   Max;&lt;br /&gt;
   begin&lt;br /&gt;
  end.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sie können eine Bibliothek auch Anwendungen zur Verfügung stellen, die in anderen Sprachen geschrieben wurden. Für diesen Zweck ist es am sichersten, wenn Sie in den Deklarationen exportierter Funktionen die Direktive &#039;&#039;&#039;stdcall&#039;&#039;&#039; angeben. Die standardmäßig verwendete {{Delphi}}-Aufrufkonvention &#039;&#039;&#039;register&#039;&#039;&#039; wird nicht von allen anderen Sprachen unterstützt.&lt;br /&gt;
&lt;br /&gt;
Bibliotheken können aus mehreren Units bestehen. In diesem Fall enthält die Quelltextdatei der Bibliothek häufig nur eine &#039;&#039;&#039;uses&#039;&#039;&#039;-Klausel, eine &#039;&#039;&#039;exports&#039;&#039;&#039;-Klausel und den Initialisierungscode. Zum Beispiel:&lt;br /&gt;
&lt;br /&gt;
 library Editors;&lt;br /&gt;
 uses EdInit, EdInOut, EdFormat, EdPrint;&lt;br /&gt;
 exports&lt;br /&gt;
   InitEditors,&lt;br /&gt;
   DoneEditors name Done,&lt;br /&gt;
   InsertText name Insert,&lt;br /&gt;
   DeleteSelection name Delete,&lt;br /&gt;
   FormatSelection,&lt;br /&gt;
   PrintSelection name Print,&lt;br /&gt;
     .&lt;br /&gt;
     .&lt;br /&gt;
     .&lt;br /&gt;
   SetErrorHandler;&lt;br /&gt;
  begin&lt;br /&gt;
    InitLibrary;&lt;br /&gt;
  end.&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;&#039;exports&#039;&#039;&#039;-Klauseln können in den &#039;&#039;&#039;interface&#039;&#039;&#039;- oder &#039;&#039;&#039;implementation&#039;&#039;&#039;-Abschnitt einer Unit eingefügt werden. Alle Bibliotheken mit einer solchen Unit in ihrer &#039;&#039;&#039;uses&#039;&#039;&#039;-Klausel exportieren automatisch die Routinen, die in der &#039;&#039;&#039;exports&#039;&#039;&#039;-Klausel der Unit aufgelistet sind, ohne dass eine eigene &#039;&#039;&#039;exports&#039;&#039;&#039;-Klausel benötigt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--   Mit &#039;&#039;&#039;local&#039;&#039;&#039; werden Routinen als nicht exportierbar gekennzeichnet. Dies ist plattformspezifisch und hat unter Windows keine Wirkung.&lt;br /&gt;
&lt;br /&gt;
In Linux-Programmen lässt sich mit der Direktive &#039;&#039;&#039;local&#039;&#039;&#039; die Ausführungsgeschwindigkeit von Routinen erhöhen, die in eine Bibliothek compiliert, aber nicht exportiert werden. Diese Direktive kann für eigenständige Prozeduren und Funktionen, nicht aber für Methoden eingesetzt werden. Hier ein Beispiel für eine als &#039;&#039;&#039;local&#039;&#039;&#039; deklarierte Routine:&lt;br /&gt;
&lt;br /&gt;
 function Contraband(I: Integer): Integer; local;&lt;br /&gt;
&lt;br /&gt;
Diese Routine aktualisiert das Register EBX nicht. Dies hat für die Routine folgende Auswirkungen:&lt;br /&gt;
&lt;br /&gt;
* Sie kann nicht aus einer Bibliothek exportiert werden.&lt;br /&gt;
* Die Routine kann nicht im &#039;&#039;&#039;interface&#039;&#039;&#039;-Abschnitt einer Unit deklariert werden.&lt;br /&gt;
* Die Adresse der Routine kann nicht von einer Variable eines prozeduralen Typs übernommen oder einer solchen zugewiesen werden.&lt;br /&gt;
* Wenn es sich um eine reine Assembler-Routine handelt, kann sie nur dann aus einer anderen Unit aufgerufen werden, wenn der Aufrufer das EBX-Register aktualisiert.   --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine Routine wird exportiert, wenn sie in einer &#039;&#039;&#039;exports&#039;&#039;&#039;-Klausel wie der folgenden angegeben wird:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;exports&#039;&#039;&#039; &#039;&#039;Eintritt1&#039;&#039;, ..., &#039;&#039;Eintrittn&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Eintritt&#039;&#039; steht für den Namen einer Prozedur, Funktion oder Variable, die vor der &#039;&#039;&#039;exports&#039;&#039;&#039;-Klausel deklariert werden muss. Darauf folgt eine Parameterliste (nur beim Exportieren einer überladenen Routine) und ein optionaler &#039;&#039;&#039;name&#039;&#039;&#039;-Bezeichner. Der Name der Prozedur oder Funktion kann mit dem Namen einer Unit qualifiziert werden.&lt;br /&gt;
&lt;br /&gt;
(Eintrittspunkte können außerdem die Direktive &#039;&#039;&#039;resident&#039;&#039;&#039; enthalten, die der Abwärtskompatibilität dient und vom Compiler ignoriert wird.)&lt;br /&gt;
&lt;br /&gt;
Der Bezeichner &#039;&#039;&#039;index&#039;&#039;&#039; (nur Win32) besteht aus der Direktive &#039;&#039;&#039;index&#039;&#039;&#039; und einer numerischen Konstante von 1 bis 2.147.483.647 (je niedriger die Konstante, desto effizienter das Programm). Ist kein &#039;&#039;&#039;index&#039;&#039;&#039;-Bezeichner angegeben, wird der Routine in der Exporttabelle automatisch eine Nummer zugewiesen.&lt;br /&gt;
&lt;br /&gt;
{{Note| Der Bezeichner &#039;&#039;&#039;index&#039;&#039;&#039; dient lediglich der Abwärtskompatibilität und sollte nach Möglichkeit nicht verwendet werden, da er in anderen Entwicklungstools zu Problemen führen kann.}}&lt;br /&gt;
&lt;br /&gt;
Ein &#039;&#039;&#039;name&#039;&#039;&#039;-Bezeichner besteht aus der Direktive &#039;&#039;&#039;name&#039;&#039;&#039; und einer nachfolgenden String-Konstante. Verfügt ein Eintrittspunkt über keinen &#039;&#039;&#039;name&#039;&#039;&#039;-Bezeichner, wird die Routine unter ihrem ursprünglich deklarierten Namen (in derselben Schreibweise) exportiert. Verwenden Sie die &#039;&#039;&#039;name&#039;&#039;&#039;-Klausel, wenn Sie eine Routine unter einem anderen Namen exportieren wollen. Zum Beispiel:&lt;br /&gt;
&lt;br /&gt;
 exports&lt;br /&gt;
 DoSomethingABC name &#039;DoSomething&#039;;&lt;br /&gt;
&lt;br /&gt;
Wenn eine überladene Funktion oder Prozedur aus einer dynamisch ladbaren Bibliothek exportiert wird, muss die &#039;&#039;&#039;exports&#039;&#039;&#039;-Klausel die zugehörige Parameterliste enthalten. Zum Beispiel:&lt;br /&gt;
&lt;br /&gt;
 exports&lt;br /&gt;
 Divide(X, Y: Integer) name &#039;Divide_Ints&#039;,&lt;br /&gt;
 Divide(X, Y: Real) name &#039;Divide_Reals&#039;;&lt;br /&gt;
&lt;br /&gt;
In Win32 dürfen überladene Routinen keine &#039;&#039;&#039;index&#039;&#039;&#039;-Bezeichner enthalten.&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;&#039;exports&#039;&#039;&#039;-Klausel kann im Deklarationsteil des Programms oder der Bibliothek bzw. im &#039;&#039;&#039;interface&#039;&#039;&#039;- oder &#039;&#039;&#039;implementation&#039;&#039;&#039;-Abschnitt einer Unit an beliebigen Stellen und beliebig oft angegeben werden. Programme enthalten nur selten eine &#039;&#039;&#039;exports&#039;&#039;&#039;-Klausel.&lt;br /&gt;
&lt;br /&gt;
==Code für die Initialisierung der Bibliothek==&lt;br /&gt;
&lt;br /&gt;
Die Anweisungen im Block einer Bibliothek bilden den Initialisierungscode der Bibliothek. Diese Anweisungen werden nur einmal beim Laden der Bibliothek ausgeführt. Mit diesen Anweisungen werden beispielsweise Fensterklassen registriert und Variablen initialisiert. Außerdem kann der Initialisierungscode einer Bibliothek mithilfe der Variablen &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;DllProc&amp;lt;/span&amp;gt; eine Eintrittspunkt-Prozedur installieren. Die Variable &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;DllProc&amp;lt;/span&amp;gt; ist einer Exit-Prozedur ähnlich, die im Abschnitt &amp;quot;Exit-Prozeduren&amp;quot; beschrieben wird. Die Eintrittspunkt-Prozedur wird beim Laden oder Entladen der Bibliothek ausgeführt.&lt;br /&gt;
&lt;br /&gt;
Der Initialisierungscode einer Bibliothek kann einen Fehler signalisieren. Zu diesem Zweck wird der Variable &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;ExitCode&amp;lt;/span&amp;gt; ein Wert zugewiesen, der ungleich Null ist. &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;ExitCode&amp;lt;/span&amp;gt; ist in der Unit &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;System&amp;lt;/span&amp;gt; deklariert und hat den Standardwert Null. Dieser Wert gibt an, dass die Initialisierung erfolgreich war. Wenn der Initialisierungscode der Bibliothek der Variable &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;ExitCode&amp;lt;/span&amp;gt; einen anderen Wert zuweist, wird die Bibliothek aus dem Speicher entfernt, und die aufrufende Anwendung wird über den Fehler benachrichtigt. Tritt während der Ausführung des Initialisierungscodes eine nicht behandelte Exception auf, wird die aufrufende Anwendung über einen Fehler beim Laden der Bibliothek benachrichtigt.&lt;br /&gt;
&lt;br /&gt;
Hier ein Beispiel für eine Bibliothek mit Initialisierungscode und einer Eintrittspunkt-Prozedur:&lt;br /&gt;
 &lt;br /&gt;
 library MyDll;&lt;br /&gt;
 uses&lt;br /&gt;
   System.SysUtils,&lt;br /&gt;
   System.IOUtils,&lt;br /&gt;
 {$IFDEF MSWINDOWS}&lt;br /&gt;
    Windows,&lt;br /&gt;
 {$ENDIF}&lt;br /&gt;
   CrossPlatform.Methods in &#039;CrossPlatform.Methods.pas&#039;;&lt;br /&gt;
 {$R *.res}&lt;br /&gt;
 &lt;br /&gt;
 exports&lt;br /&gt;
 //mac requires _understaore methods in the export or it will not find the entrypoint&lt;br /&gt;
 {$IFDEF MACOS}&lt;br /&gt;
   _myMethod&lt;br /&gt;
 {$ELSE}&lt;br /&gt;
   MyMethod&lt;br /&gt;
 {$ENDIF}&lt;br /&gt;
 &lt;br /&gt;
 {$IFDEF MSWINDOWS}&lt;br /&gt;
 //unload windows method here&lt;br /&gt;
  var&lt;br /&gt;
   SaveDllProc: TDLLProc;&lt;br /&gt;
 &lt;br /&gt;
 procedure LibExit(Reason: Integer);&lt;br /&gt;
 begin&lt;br /&gt;
   if Reason = DLL_PROCESS_DETACH then&lt;br /&gt;
   begin&lt;br /&gt;
   //unload code&lt;br /&gt;
   end;&lt;br /&gt;
 &lt;br /&gt;
   if Assigned(SaveDllProc) then&lt;br /&gt;
     SaveDllProc(Reason); // Call the saved entry point procedure&lt;br /&gt;
 end;&lt;br /&gt;
 {$ENDIF}&lt;br /&gt;
 &lt;br /&gt;
 begin&lt;br /&gt;
 &lt;br /&gt;
 {$IFDEF MSWINDOWS}&lt;br /&gt;
   SaveDllProc := DllProc; // Save the original DLL procedure&lt;br /&gt;
   DllProc := @LibExit;    // Set our exit procedure&lt;br /&gt;
 {$ENDIF}&lt;br /&gt;
 &lt;br /&gt;
   // Any additional library initialization code&lt;br /&gt;
 end.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;DllProc&amp;lt;/span&amp;gt; wird immer dann aufgerufen, wenn die Bibliothek das erste Mal in den Speicher geladen wird, wenn ein Thread gestartet oder angehalten wird, oder wenn die Bibliothek aus dem Speicher entfernt wird. Die Initialisierungsteile aller von einer Bibliothek verwendeten Units werden vor dem Initialisierungscode der Bibliothek, die &#039;&#039;&#039;finalization&#039;&#039;&#039;-Abschnitte nach der Eintrittspunkt-Prozedur der Bibliothek ausgeführt.&lt;br /&gt;
&lt;br /&gt;
==Globale Variablen in einer Bibliothek==&lt;br /&gt;
&lt;br /&gt;
In einer gemeinsamen Bibliothek deklarierte globale Variablen können von {{Delphi}}-Anwendungen nicht importiert werden.&lt;br /&gt;
&lt;br /&gt;
Eine Bibliothek kann von mehreren Anwendungen gleichzeitig genutzt werden. Jede Anwendung verfügt aber in ihrem Verarbeitungsbereich über eine Kopie der Bibliothek mit einem eigenen Satz globaler Variablen. Damit mehrere Bibliotheken (oder mehrere Instanzen einer Bibliothek) den Speicher gemeinsam nutzen können, müssen Speicherzuordnungstabellen verwendet werden. Weitere Informationen zu diesem Thema finden Sie in der Systemdokumentation.&lt;br /&gt;
&lt;br /&gt;
==Bibliotheken und Systemvariablen==&lt;br /&gt;
&lt;br /&gt;
Einige der in der Unit &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;System&amp;lt;/span&amp;gt; deklarierten Variablen sind für Programmierer von Bibliotheken von besonderem Interesse. Mit &#039;&#039;&#039;IsLibrary&#039;&#039;&#039; können Sie feststellen, ob der Code in einer Anwendung oder in einer Bibliothek ausgeführt wird. &#039;&#039;&#039;IsLibrary&#039;&#039;&#039; ist in einer Anwendung immer &#039;&#039;&#039;False&#039;&#039;&#039;, in einer Bibliothek dagegen immer &#039;&#039;&#039;True&#039;&#039;&#039;. Während der Lebensdauer einer Bibliothek enthält die Variable &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;HInstance&amp;lt;/span&amp;gt; das Instanzen-Handle der Bibliothek. Die Variable &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;CmdLine&amp;lt;/span&amp;gt; ist in einer Bibliothek immer &#039;&#039;&#039;nil&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Die Variable &amp;lt;codeInline&amp;gt;DllProc&amp;lt;/codeInline&amp;gt; ermöglicht einer Bibliothek die Überwachung der Betriebssystemaufrufe an ihrem Eintrittspunkt. Diese Möglichkeit wird normalerweise nur von Bibliotheken verwendet, die Multithreading unterstützen. DLLProc wird in Multithread-Anwendungen eingesetzt. &amp;lt;!--      DLLProc is available on both Windows and Linux but its use differs on each. On Win32, &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;DLLProc&amp;lt;/span&amp;gt; is used in multithreading applications.; on Linux, it is used to determine when your library is being unloaded.     --&amp;gt; Es empfiehlt sich, alle Abläufe bei der Programmbeendigung nicht über Exit-Prozeduren, sondern über &#039;&#039;&#039;finalization&#039;&#039;&#039;-Abschnitte zu steuern.&lt;br /&gt;
&lt;br /&gt;
Für die Überwachung von Betriebssystemaufrufen erstellen Sie eine Callback-Prozedur mit einem Integer-Parameter. Beispiel:&lt;br /&gt;
&lt;br /&gt;
 procedure DLLHandler(Reason: Integer);&lt;br /&gt;
&lt;br /&gt;
Außerdem müssen Sie der Variable &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;DLLProc&amp;lt;/span&amp;gt; die Adresse der Prozedur zuweisen. Beim Aufruf der Prozedur wird ihr einer der folgenden Werte übergeben:&lt;br /&gt;
&lt;br /&gt;
{|  border=&amp;quot;1&amp;quot; frame=&amp;quot;hsides&amp;quot; rules=&amp;quot;rows&amp;quot; &lt;br /&gt;
|  align=&amp;quot;left&amp;quot; valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
DLL_PROCESS_DETACH&lt;br /&gt;
|  align=&amp;quot;left&amp;quot; valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
Gibt an, dass die Bibliothek als Ergebnis einer Beendigungsprozedur oder eines Aufrufs von &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;FreeLibrary&amp;lt;/span&amp;gt; vom Adressraum des aufrufenden Prozesses getrennt wird.&lt;br /&gt;
|- &lt;br /&gt;
|  align=&amp;quot;left&amp;quot; valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
DLL_PROCESS_ATTACH&lt;br /&gt;
|  align=&amp;quot;left&amp;quot; valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
Gibt an, dass die Bibliothek eine Verbindung mit dem Adressraum des aufrufenden Prozesses herstellt. Dies ergibt sich aus einem Aufruf von &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;LoadLibrary&amp;lt;/span&amp;gt;.&lt;br /&gt;
|- &lt;br /&gt;
|  align=&amp;quot;left&amp;quot; valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
DLL_THREAD_ATTACH&lt;br /&gt;
|  align=&amp;quot;left&amp;quot; valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
Gibt an, dass der aktuelle Prozess einen neuen Thread erstellt.&lt;br /&gt;
|- &lt;br /&gt;
|  align=&amp;quot;left&amp;quot; valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
DLL_THREAD_DETACH&lt;br /&gt;
|  align=&amp;quot;left&amp;quot; valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
Gibt an, dass ein Thread ohne Probleme beendet wurde.&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sie können die Aktionen im Rumpf der Prozedur davon abhängig machen, welcher Parameter an die Prozedur übergeben wird.&lt;br /&gt;
&lt;br /&gt;
==Exceptions und Laufzeitfehler in Bibliotheken==&lt;br /&gt;
&lt;br /&gt;
Wenn in einer dynamisch ladbaren Bibliothek eine Exception erzeugt, aber nicht behandelt wird, wird sie nach außen an den Aufrufer weitergegeben. Wenn die aufrufende Anwendung oder Bibliothek in {{Delphi}} geschrieben wurde, kann die Exception in einer normalen &#039;&#039;&#039;try...except&#039;&#039;&#039;-Anweisung behandelt werden.&lt;br /&gt;
&lt;br /&gt;
In Win32 kann die Exception wie eine Betriebssystem-Exception mit dem Code &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;$0EEDFADE&amp;lt;/span&amp;gt; behandelt werden, wenn die aufrufende Anwendung oder Bibliothek in einer anderen Programmiersprache entwickelt wurde. Der erste Eintrag im Array &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;ExceptionInformation&amp;lt;/span&amp;gt; des Records mit der Betriebssystem-Exception enthält die Exception-Adresse, der zweite Eintrag eine Referenz auf das Exception-Objekt von {{Delphi}}.&lt;br /&gt;
&lt;br /&gt;
Normalerweise sollten Exceptions innerhalb der Bibliothek behandelt werden. {{Delphi}}-Exceptions entsprechen dem Exception-Modell des Betriebssystems.&lt;br /&gt;
&lt;br /&gt;
Wenn in einer Bibliothek die Unit &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;SysUtils&amp;lt;/span&amp;gt; nicht verwendet wird, ist die Unterstützung von Exceptions deaktiviert. Tritt in diesem Fall in der Bibliothek ein Laufzeitfehler auf, wird die aufrufende Anwendung beendet. Da die Bibliothek nicht feststellen kann, ob sie von einem {{Delphi}}-Programm aufgerufen wurde, kann sie auch nicht die Exit-Prozeduren der Anwendung aufrufen. Die Anwendung wird einfach beendet und aus dem Speicher entfernt.&lt;br /&gt;
&lt;br /&gt;
==Der Shared Memory Manager &amp;lt;!-- (Win32 Only) --&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Wenn eine DLL in Win32 Routinen exportiert, die lange Strings oder dynamische Arrays als Parameter oder als Funktionsergebnis übergeben (entweder direkt oder in Records bzw. Objekten), müssen die DLL und ihre Client-Anwendungen (oder -DLLs) die Unit &#039;&#039;&#039;ShareMem&#039;&#039;&#039; verwenden. Dasselbe gilt, wenn eine Anwendung oder DLL mit &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;New&amp;lt;/span&amp;gt; oder &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;GetMem&amp;lt;/span&amp;gt; Speicherplatz reserviert, der in einem anderen Modul durch einen Aufruf von &#039;&#039;&#039;Dispose&#039;&#039;&#039; oder &#039;&#039;&#039;FreeMem&#039;&#039;&#039; wieder freigegeben wird. &#039;&#039;&#039;ShareMem&#039;&#039;&#039; sollte in der &#039;&#039;&#039;uses&#039;&#039;&#039;-Klausel der Programme oder Bibliotheken, von denen sie eingebunden wird, immer an erster Stelle stehen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ShareMem&#039;&#039;&#039; ist die Interface-Unit für den Speichermanager &amp;lt;font face=&amp;quot;courier new,courier,monospace&amp;quot;&amp;gt;&amp;lt;span&amp;gt;&amp;lt;font color=&amp;quot;#004a80&amp;quot;&amp;gt;BORLANDMM.DLL&amp;lt;/font&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/font&amp;gt;, der es Modulen ermöglicht, dynamisch zugewiesenen Speicherplatz gemeinsam zu nutzen. &amp;lt;font face=&amp;quot;courier new,courier,monospace&amp;quot;&amp;gt;&amp;lt;span&amp;gt;&amp;lt;font color=&amp;quot;#004a80&amp;quot;&amp;gt;BORLANDMM.DLL&amp;lt;/font&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/font&amp;gt; muss mit Anwendungen und DLLs weitergegeben werden, die &#039;&#039;&#039;ShareMem&#039;&#039;&#039; einbinden. Wenn eine Anwendung oder DLL &#039;&#039;&#039;ShareMem&#039;&#039;&#039; verwendet, ersetzt &amp;lt;font face=&amp;quot;courier new,courier,monospace&amp;quot;&amp;gt;&amp;lt;span&amp;gt;&amp;lt;font color=&amp;quot;#004a80&amp;quot;&amp;gt;BORLANDMM.DLL&amp;lt;/font&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/font&amp;gt; den Speichermanager dieser Anwendung oder DLL.&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
&lt;br /&gt;
* [[Bibliotheken und Packages (Delphi)]]&lt;br /&gt;
* [[Packages (Delphi)]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:{{Delphi}}]]&lt;br /&gt;
[[Kategorie:{{Delphi}}-Sprachreferenz]]&lt;br /&gt;
[[Kategorie:AMMigrate]]&lt;br /&gt;
&lt;br /&gt;
[[en:Writing Dynamically Loaded Libraries]]&lt;br /&gt;
[[fr:Ecriture de bibliothèques à chargement dynamique]]&lt;br /&gt;
[[ja:動的にロードされるライブラリの作成]]&lt;/div&gt;</summary>
		<author><name>Nicolas.rios</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=TProc&amp;diff=218862</id>
		<title>TProc</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=TProc&amp;diff=218862"/>
		<updated>2024-05-28T13:59:55Z</updated>

		<summary type="html">&lt;p&gt;Nicolas.rios: RS-121780&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Parent|Index}}&lt;br /&gt;
&lt;br /&gt;
{{Redirect|lib_de:System.SysUtils.TProc|System.SysUtils.TProc}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Berlin]]&lt;br /&gt;
&lt;br /&gt;
[[en:TProc]]&lt;br /&gt;
[[fr:TProc]]&lt;br /&gt;
[[ja:TProc]]&lt;/div&gt;</summary>
		<author><name>Nicolas.rios</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Mobile_iOS-Anwendungsentwicklung&amp;diff=218861</id>
		<title>Mobile iOS-Anwendungsentwicklung</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Mobile_iOS-Anwendungsentwicklung&amp;diff=218861"/>
		<updated>2024-05-21T13:44:15Z</updated>

		<summary type="html">&lt;p&gt;Nicolas.rios: RS-122759&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Parent|Geräteübergreifende Anwendungstypen, die erstellt werden können}}&lt;br /&gt;
{{DISPLAYTITLE:Mobile iOS-Anwendungsentwicklung}}&lt;br /&gt;
&lt;br /&gt;
{{Product}} enthält Tools für die Entwicklung von Anwendung für die iOS-Zielplattform. Mit [[FireMonkey|FireMonkey]] können Sie eine iOS-Anwendung erstellen und für iOS-Geräte (C++ oder {{Delphi}}) bereitstellen.&lt;br /&gt;
&lt;br /&gt;
Das Verfahren für die Entwicklung von iOS-Apps in {{Product}} ist im Großen und Ganzen identisch mit dem Verfahren für die Entwicklung von Android-Apps in {{Product}}. Ein wichtiger Unterschied besteht darin, dass &#039;&#039;&#039;PAServer&#039;&#039;&#039; und &#039;&#039;&#039;Verbindungsprofile&#039;&#039;&#039; für die iOS-Entwicklung erforderlich sind, für die Android-Entwicklung werden sie dagegen nicht benötigt. Sowohl für iOS als auch für Android muss ein SDK für die Zielplattform hinzugefügt werden.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; |&#039;&#039;&#039;Vergleich der Entwicklungsanforderungen für iOS und Android&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;iOS-Anforderungen&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Android-Anforderungen&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&#039;&#039;&#039;[[Teilnehmen am Apple-Entwicklerprogramm|Beitreten zum Apple-Entwicklerprogramm]]&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
[http://developer.android.com/index.html Die Website für Android-Entwickler ist für jeden zugänglich (EN)]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&#039;&#039;&#039;[[Erwerben eines iOS-Entwicklerzertifikats|Ein Entwicklerzertifikat erwerben]]&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
[[Erstellen einer KeyStore-Datei|KeyStore-Datei erstellen]]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&#039;&#039;&#039;[[Bereitstellen von iOS-Anwendungen|Ein Bereitstellungsprofil erstellen und installieren]]&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
Nicht zutreffend.&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&#039;&#039;&#039;[[Installieren des Platform Assistant auf dem Mac|PAServer auf dem Mac installieren]]&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
Nicht zutreffend.&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&#039;&#039;&#039;[[Ausführen des Platform Assistant auf dem Mac|PAServer auf dem Mac ausführen]]&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
Nicht zutreffend.&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&#039;&#039;&#039;[[Verbindungsprofil erstellen|Verbindungsprofil erstellen]]&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
Nicht zutreffend.&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&#039;&#039;&#039;[[Ausführen von iOS-Anwendungen auf einem iOS-Gerät|Verbindung mit dem iOS-Gerät über eine USB-Verbindung herstellen]]&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
[[Installieren des USB-Treibers für Ihr Android-Gerät|Den USB-Treiber für Ihr Android-Gerät installieren]] und Ihr Android-Gerät über eine USB-Verbindung anschließen.&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&#039;&#039;&#039;[[Hinzufügen von SDKs für macOS oder iOS|iOS-SDK (für Geräte oder Simulator) hinzufügen]]&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
[[Hinzufügen von Android-SDKs|Ein Android-SDK hinzufügen]]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&#039;&#039;&#039;Nicht zutreffend.&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
Für die Android-Anwendung benötigte [[Verwendet Berechtigungen|Berechtigungen]] überprüfen oder festlegen&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Hardwareanforderungen==&lt;br /&gt;
&lt;br /&gt;
Zusätzlich zu Ihrem Entwicklungs-PC benötigen Sie für die Entwicklung von geräteübergreifenden Anwendungen für iOS Folgendes:&lt;br /&gt;
&lt;br /&gt;
* Einen Mac mit macOS&lt;br /&gt;
* Ein iOS-Gerät, das über ein USB-Kabel an den Mac angeschlossen ist&lt;br /&gt;
&lt;br /&gt;
Unter &#039;&#039;&#039;[[Plattformvoraussetzungen für FireMonkey|Plattformvoraussetzungen für {{FM}}]]&#039;&#039;&#039; finden Sie eine Liste mit den Systemanforderungen für den Entwicklungs-PC sowie für den Mac.&lt;br /&gt;
&lt;br /&gt;
Der Mac und Ihr Entwicklungssystem müssen sich in einem gemeinsamen Netzwerk befinden, z. B. einem LAN (Local Area Network).&lt;br /&gt;
&lt;br /&gt;
==Vorbereiten der Entwicklungsumgebung==&lt;br /&gt;
&lt;br /&gt;
===Arbeiten mit einem Mac und einem PC===&lt;br /&gt;
&lt;br /&gt;
Wenn Sie Anwendungen für iOS entwickeln, müssen Sie zusätzlich zu Ihrer Entwicklungsumgebung einen Mac verwenden, um die iOS-Entwicklungs- und Distributionszertifikate zu installieren, den &amp;quot;Platform Assistant&amp;quot; auszuführen sowie andere erforderliche Aufgaben (siehe die Details unten) durchzuführen.&lt;br /&gt;
&lt;br /&gt;
Ein PC und ein Mac können auf verschiedene Weise für die Zusammenarbeit konfiguriert werden. Unter &#039;&#039;&#039;[[Arbeiten mit einem Mac und einem PC|Arbeiten mit einem Mac und einem PC]]&#039;&#039;&#039; finden Sie Informationen zur Entscheidung, welche Konfiguration am besten für Sie geeignet ist, und darüber, wie Sie diese Konfiguration für Ihre Entwicklungsumgebung anwenden.&lt;br /&gt;
&lt;br /&gt;
===Konfigurieren des Mac===&lt;br /&gt;
&lt;br /&gt;
Auf dem Mac müssen Sie Folgendes ausführen:&lt;br /&gt;
&lt;br /&gt;
# [[Installieren von Xcode auf einem Mac|Xcode installieren]].&lt;br /&gt;
# Die [[Installieren der Xcode-Befehlszeilen-Tools auf einem Mac|Xcode-Befehlszeilentools installieren]], die für die Signierung Ihrer Anwendungen erforderlich sind, damit Sie sie auf einem iOS-Gerät ausführen können.&lt;br /&gt;
#: {{Note| Ab Xcode Version 6.1 werden die Xcode-Befehlszeilentools automatisch bei der Xcode-Installation installiert.}}&lt;br /&gt;
# Den [[Installieren des Platform Assistant auf dem Mac|Platform Assistant installieren]]. Der &#039;&#039;&#039;[[PAServer: Die Platform Assistant Server-Anwendung|Platform Assistant]]&#039;&#039;&#039;, der mit {{Product}} ausgeliefert wird, ermöglicht der IDE die iOS-SDK-Dateien vom Mac zu übertragen und Ihre Anwendungen auf an den MAC angeschlossenen iOS-Geräten auszuführen.&lt;br /&gt;
# Den [[Ausführen des Platform Assistant auf dem Mac|Platform Assistant ausführen]]. Für {{Product}} muss der &amp;quot;Platform Assistant&amp;quot; auf dem Mac ausgeführt werden, damit Anwendungen für die Zielplattformen &#039;&#039;&#039;iOS-Gerät - 64 Bit&#039;&#039;&#039; ausgeführt, gedebuggt und bereitgestellt werden können.&lt;br /&gt;
&lt;br /&gt;
===Konfigurieren des Entwicklungssystems===&lt;br /&gt;
&lt;br /&gt;
Öffnen Sie auf Ihrem Entwicklungssystem {{Product}}, und führen Sie Folgendes aus:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;[[Erstellen und Testen eines Verbindungsprofils auf dem Entwicklungs-PC|Erstellen Sie ein Verbindungsprofil]]&#039;&#039;&#039; für die &#039;&#039;&#039;macOS&#039;&#039;&#039;-Plattform. macOS ist eine Zwischenplattform, die die Zielplattform &#039;&#039;&#039;iOS-Gerät - 64 Bit&#039;&#039;&#039; unterstützt.&lt;br /&gt;
** Sie benötigen dieses Verbindungsprofil, damit die IDE eine Verbindung zum &#039;&#039;&#039;[[PAServer: Die Platform Assistant Server-Anwendung|Platform Assistant]]&#039;&#039;&#039; herstellen kann, der auf dem Mac ausgeführt wird.&lt;br /&gt;
* &#039;&#039;&#039;[[Hinzufügen von SDKs für macOS oder iOS|Fügen Sie der IDE ein SDK]]&#039;&#039;&#039; für die Zielplattform &#039;&#039;&#039;iOS-Gerät - 64 Bit&#039;&#039;&#039; hinzu. {{Product}} erstellt auf Ihrem Entwicklungssystem einen lokalen Dateizwischenspeicher des iOS-SDK vom Mac, damit Sie Ihre Anwendungen für iOS lokal erzeugen können.&lt;br /&gt;
&lt;br /&gt;
==Entwickeln von Anwendungen==&lt;br /&gt;
&lt;br /&gt;
Wählen Sie zum Erstellen einer neuen geräteübergreifenden Anwendung in {{Product}} entweder {{Menu|Datei &amp;amp;gt; Neu &amp;amp;gt; [[Geräteübergreifende Anwendung|Geräteübergreifende Anwendung]] - {{Delphi}}}} oder {{Menu|Datei &amp;amp;gt; Neu &amp;amp;gt; [[Geräteübergreifende Anwendung|Geräteübergreifende Anwendung]] - {{CBuilderUI}}}}, wählen Sie einen Anwendungstyp aus, und klicken Sie auf &#039;&#039;&#039;OK&#039;&#039;&#039;. Informationen über die möglichen Anwendungstypen finden Sie unter [[Geräteübergreifende Anwendung#Geräteübergreifende Anwendungstypen, die erstellt werden können|Typen geräteübergreifender Anwendungen, die Sie erstellen können]]. Die Standardzielplattform ist &#039;&#039;&#039;[[Mobile Android-Anwendungsentwicklung|Android]]&#039;&#039;&#039;. Als Zielplattformen für neue geräteübergreifende Anwendungen stehen aber auch iOS-Plattformen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Sie können für die Entwicklung geräteübergreifender Anwendungen sowohl das [[FireMonkey|FireMonkey-Framework]] als auch die [[RTL|RTL-Bibliothek]] verwenden. Siehe &#039;&#039;&#039;[[Erstellen von iOS-Apps|Erstellen von iOS-Apps]]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Am besten arbeiten Sie zum Einstieg in die iOS-Anwendungsentwicklung die Mobile-Tutorials: &#039;&#039;&#039;[[Mobile-Tutorials: Mobile Anwendungsentwicklung (iOS und Android)|Mobile Anwendungsentwicklung (iOS und Android)]]&#039;&#039;&#039; durch.&lt;br /&gt;
&lt;br /&gt;
==Vorbereiten der Codesignierung von Anwendungen==&lt;br /&gt;
&lt;br /&gt;
Um [[Ausführen von iOS-Anwendungen auf einem iOS-Gerät|Ihre Anwendungen auf einem iOS-Gerät auszuführen]] oder für andere bereitzustellen, müssen Sie:&lt;br /&gt;
&lt;br /&gt;
# [[Teilnehmen am Apple-Entwicklerprogramm|Dem Apple-Entwicklerprogramm beitreten]]. Wenn Sie Mitglied im Apple-Entwicklerprogramm sind, erhalten Sie von Apple alle notwendigen Zertifikate und Tools, um Anwendungen für iOS-Geräte auszuführen und bereitzustellen.&lt;br /&gt;
# [[Erwerben eines iOS-Entwicklerzertifikats|Ein iOS-Entwicklerzertifikat erwerben]], das für die Signierung Ihrer Anwendung erforderlich ist.&lt;br /&gt;
# [[Bereitstellen von iOS-Anwendungen|Ihre Anwendung bereitstellen]], damit Sie sie auf Ihren iOS-Geräten ausführen können.&lt;br /&gt;
&lt;br /&gt;
==Ausführen von Anwendungen==&lt;br /&gt;
&lt;br /&gt;
Auf der folgenden Seite sind die erforderlichen Schritte zum Ausführen Ihrer Anwendung auf einem iOS-Gerät beschrieben:&lt;br /&gt;
&lt;br /&gt;
* [[Ausführen von iOS-Anwendungen auf einem iOS-Gerät|Ausführen von iOS-Anwendungen auf einem iOS-Gerät]]&lt;br /&gt;
&lt;br /&gt;
==Bereitstellen der endgültigen iOS-Anwendung==&lt;br /&gt;
&lt;br /&gt;
Bevor Sie Ihre iOS-Anwendungen veröffentlichen, sollten Sie überprüfen, ob alle Einstellungen korrekt konfiguriert sind. Siehe &#039;&#039;&#039;[[Vorbereiten von iOS-Anwendungen für die Bereitstellung|Vorbereiten von iOS-Anwendungen für die Bereitstellung]]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Wenn Ihre iOS-Anwendung für die endgültige Weitergabe bereit ist, stehen Ihnen zwei Möglichkeiten für die Bereitstellung zur Verfügung: &#039;&#039;&#039;Ad-hoc&#039;&#039;&#039;-Distribution oder &#039;&#039;&#039;Anwendungs-Store&#039;&#039;&#039;-Distribution.&lt;br /&gt;
&lt;br /&gt;
Die Schritte für die Weitergabe Ihrer Anwendungen sind je nach gewählter Bereitstellungsmethode unterschiedlich:&lt;br /&gt;
&lt;br /&gt;
* [[Bereitstellen von iOS-Anwendungen für die Ad-hoc-Weitergabe|Bereitstellen von iOS-Anwendungen für die Ad-hoc-Weitergabe]]&lt;br /&gt;
* [[Bereitstellen von iOS-Anwendungen für die Übermittlung an den App Store|Bereitstellen von iOS-Anwendungen für die Übermittlung an den App Store]] und [[Übermittlung der App an den App Store (iOS)|Übermitteln von Apps an den App Store]]&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen über diese Weitergabemethoden finden Sie in der [https://developer.apple.com/programs/ios/distribute.html Apple-Dokumentation (EN)].&lt;br /&gt;
&lt;br /&gt;
==Unterstützung des dunklen Designs für iOS 13==&lt;br /&gt;
&lt;br /&gt;
{{Product}} 10.3.3 unterstützt das dunkle Design für iOS 13.&lt;br /&gt;
&lt;br /&gt;
===Integrierte Unterstützung des dunklen Designs===&lt;br /&gt;
&lt;br /&gt;
Die Unterstützung des dunklen Designs ist standardmäßig im [[FireMonkey|FireMonkey]]-Framework für mit Stilen versehene Steuerelemente und nativ gerenderte Steuerelemente aktiviert. &lt;br /&gt;
&lt;br /&gt;
Für Entwickler, die Komponenten wie [[lib_de:FMX.Edit.TEdit|TEdit]] und [[lib_de:FMX.StdCtrls.TSwitch|TSwitch]] verwenden, die die [[rad_de:Native FireMonkey-iOS-Steuerelemente|native iOS-Darstellung]] zusammen mit im FMX-Stil gerenderten Steuerelementen (mit dem Standardplattformstil) unterstützen, wird die Anwendungs-UI automatisch entsprechend den iOS-Einstellungen des Benutzers gerendert. &lt;br /&gt;
&lt;br /&gt;
Die Unterstützung des dunklen Designs erstreckt sich auf die Systemstatusleiste und unterstützt beide Designs (hell und dunkel). &lt;br /&gt;
&lt;br /&gt;
{{Note|Wenn Sie einen benutzerdefinierten, Bitmap-basierten [[FireMonkey|FireMonkey]]-Stil verwenden und dasselbe Design für alle Steuerelemente der Benutzeroberfläche anwenden möchten, sollten Sie die Eigenschaft ControlType für alle Steuerelemente auf &amp;quot;Styled&amp;quot; setzen. Wenn Sie einen benutzerdefinierten Stil verwenden und die Eigenschaft ControlType für [[lib_de:FMX.Memo.TMemo|TMemo]] oder [[lib_de:FMX.Edit.TEdit|TEdit]] (oder andere [[rad_de:Native FireMonkey-iOS-Steuerelemente|unterstützte Steuerelemente]]) auf &amp;quot;Platform&amp;quot; setzen, werden diese Steuerelemente entsprechend der iOS 13-Einstellung des Benutzers mit einem hellen oder dunklen Design gerendert.&lt;br /&gt;
&amp;amp;lt;/br&amp;amp;gt;&lt;br /&gt;
Wenn Sie &amp;quot;ControlType&amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt;Platform&amp;quot; für [[lib_de:FMX.Edit.TEdit|TEdit]] und [[lib_de:FMX.Memo.TMemo|TMemo]] verwenden, können Sie jedes Steuerelement mit einem transparenten Hintergrund und ohne Rand rendern, anstatt das helle oder dunkle Design zu verwenden, indem Sie in der Eigenschaft StyleLookUp &amp;quot;TEdit&amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt;TransparentEdit&amp;quot; und &amp;quot;TMemo&amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt;TransparentMemo&amp;quot; festlegen. Diese Einstellung wird nur für [[lib_de:FMX.Edit.TEdit|TEdit]] und [[lib_de:FMX.Memo.TMemo|TMemo]] unterstützt.}}&lt;br /&gt;
&lt;br /&gt;
===Nur helles Design===&lt;br /&gt;
&lt;br /&gt;
Entwickler können die Anwendungs-UI nur auf das helle Design festlegen, indem Sie in {{Menu|Anwendung &amp;amp;gt; Versionsinformationen}} einen neuen Schlüssel hinzufügen. &lt;br /&gt;
&lt;br /&gt;
Wenn ein Entwickler den Schlüssel in den Versionsinformationen nicht festlegt, wird Endbenutzern abhängig von den iOS-Einstellungen auf dem Gerät des Benutzers entweder das dunkle oder das helle Design angezeigt. Dies gilt nur für mit dem iOS 13-SDK erstellte Anwendungen.&lt;br /&gt;
&lt;br /&gt;
==Arbeiten mit dem iOS-Storyboard==&lt;br /&gt;
&lt;br /&gt;
Für neue FireMonkey-Projekte, die in einem neuen Verzeichnis erstellt werden, sind keine zusätzlichen Schritte für die Verwendung der integrierten IDE-Unterstützung für das Storyboard erforderlich.&lt;br /&gt;
&lt;br /&gt;
Bei einem vorhandenen FMX-Projekt für die iOS-Plattform aus einer früheren {{Product}}-Version müssen Sie die Datei info.plist.TemplateiOS.xml in Ihrem Projektverzeichnis löschen.&lt;br /&gt;
&lt;br /&gt;
Es gibt in 10.4 zwei Möglichkeiten, die Unterstützung für den Startbildschirm des Storyboards für iOS anzupassen, die davon abhängen, ob Sie ein eigenes compiliertes Storyboard verwenden oder mit einem neuen mit den in 10.4 vorgesehenen Funktionen beginnen.&lt;br /&gt;
&lt;br /&gt;
Option 1: Der Benutzer verwendet sein eigenes compiliertes Storyboard und den Asset-Katalog (*.storyboardc und Assets.car). Führen Sie die folgenden Schritte aus, um diese mit 10.4 zu verwenden:&lt;br /&gt;
&lt;br /&gt;
* Deaktivieren Sie die Bereitstellung von *.launchscreen unter &amp;quot;Projekt | Bereitstellung&amp;quot;.&lt;br /&gt;
* Wenn der Name des Storyboards nicht LaunchScreen.storyboard lautet, müssen Sie in der Datei info.plist.TemplateiOS.xml den Eintrag &amp;quot;&amp;amp;lt;%StoryboardInfoPListKey%&amp;amp;gt;&amp;quot; durch den Eintrag &amp;quot;UILaunchStoryboardName Schlüssel/Wert&amp;quot; ersetzen.&lt;br /&gt;
* Öffnen Sie &amp;quot;Projekt | Bereitstellung&amp;quot;, und fügen Sie die compilierten Storyboard- und Asset-Katalogdateien hinzu.&lt;br /&gt;
&lt;br /&gt;
Option 2: Der Benutzer ändert das Standard-Storyboard und den Asset-Katalog, die von der IDE bereitgestellt werden. Befolgen Sie die folgenden Schritte, wenn Sie diese Option verwenden:&lt;br /&gt;
&lt;br /&gt;
* Bearbeiten Sie die LaunchScreen.storyboard- und Assets-Dateien in LaunchScreen.TemplateiOS nach Bedarf.&lt;br /&gt;
* Öffnen Sie &amp;quot;Projekt | Bereitstellung&amp;quot; und fügen Sie gegebenenfalls die zusätzlichen Bilder für den Startbildschirm hinzu, die bereitgestellt werden sollen.&lt;br /&gt;
&lt;br /&gt;
Die Templates info.plist.TemplateiOS.xml und LaunchScreen.TemplateiOS befinden sich in den folgenden Verzeichnissen:&lt;br /&gt;
&lt;br /&gt;
 a. &amp;amp;lt;bds&amp;amp;gt;\ObjRepos\&amp;amp;lt;locale&amp;amp;gt;\iOS&lt;br /&gt;
 b. %APPDATA%\Embarcadero\BDS\21.0&lt;br /&gt;
 c. the location where the project is located.&lt;br /&gt;
&lt;br /&gt;
Die IDE sucht nach diesen Templates in der folgenden Reihenfolge: Projektverzeichnis,&amp;amp;nbsp;%APPDATA%-Verzeichnis und ObjRepos-Verzeichnis.&lt;br /&gt;
&lt;br /&gt;
{{Product}} unterstützt die [[Anwendungsoptionen#Symbole für iOS-Apps|Symbolgrößen]], die Apple für iOS verlangt.&lt;br /&gt;
&lt;br /&gt;
===Storyboard für den iOS-Startbildschirm===&lt;br /&gt;
&lt;br /&gt;
Der iOS-Startbildschirm wird sofort beim Start Ihrer App angezeigt und schnell durch den ersten Bildschirm der App ersetzt. Dadurch entsteht der Eindruck einer schnellen App. &lt;br /&gt;
&lt;br /&gt;
Wenn Sie in RAD Studio den Projektstartbildschirm so ändern, dass derselbe Dateiname verwendet wird, wird bei der Projektbereitstellung nur eine Datei bereitgestellt.&lt;br /&gt;
&lt;br /&gt;
Eine mögliche Lösung besteht darin, die Datei unter einem anderen Dateinamen zu kopieren, dann {{Menu|Projekt &amp;amp;gt; Optionen &amp;amp;gt; Anwendungen &amp;amp;gt; Symbole}} zu öffnen, den Bildpfad umzuleiten und zu speichern.&lt;br /&gt;
&lt;br /&gt;
{{Note|Wenn Sie Änderungen am Storyboard für den Startbildschirm vornehmen, müssen Sie entweder das Projekt umbenennen oder das Gerät neu starten.}}&lt;br /&gt;
&lt;br /&gt;
==Bekannte Probleme==&lt;br /&gt;
&lt;br /&gt;
* Wenn Sie auf Probleme mit dem neuen Feature &amp;quot;Apple Transport Security&amp;quot; für iOS 9 stoßen, finden Sie weitere Informationen zum Lösen des Problems unter [[Plat en:Main Page#Beschränkung für das HTTP-Protokoll|Beschränkung für das HTTP-Protokoll]].&lt;br /&gt;
&lt;br /&gt;
==iOS-Themen==&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Vorbereiten der Entwicklungsumgebung (iOS):&#039;&#039;&#039;&lt;br /&gt;
**[[Arbeiten mit einem Mac und einem PC|Arbeiten mit einem Mac und einem PC]]&lt;br /&gt;
*** [[Gemeinsame Nutzung von Dateien auf dem PC und dem Mac|Gemeinsame Nutzung von Dateien auf dem PC und dem Mac]]&lt;br /&gt;
** [[Installieren von Xcode auf einem Mac|Installieren von Xcode auf einem Mac]]&lt;br /&gt;
** [[Installieren der Xcode-Befehlszeilen-Tools auf einem Mac|Installieren der Xcode-Befehlszeilen-Tools auf einem Mac]]&lt;br /&gt;
** [[Erstellen und Testen eines Verbindungsprofils auf dem Entwicklungs-PC|Erstellen und Testen eines Verbindungsprofils auf dem Entwicklungs-PC]]&lt;br /&gt;
** [[Installieren des Platform Assistant auf dem Mac|Installieren des Platform Assistant auf dem Mac]]&lt;br /&gt;
** [[Ausführen des Platform Assistant auf dem Mac|Ausführen des Platform Assistant auf dem Mac]]&lt;br /&gt;
** [[Hinzufügen von SDKs für macOS oder iOS|Hinzufügen eines macOS- oder iOS-SDK]]&lt;br /&gt;
*&#039;&#039;&#039;Entwickeln von iOS-Apps: {{f|cmd|&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[[Migrieren von Delphi-Code zu mobilen Anwendungen vom Desktop aus|Migrieren von {{Delphi}}-Code von Desktop- zu mobilen Anwendungen]]&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[[Migrieren von C++-Code zu mobilen Anwendungen vom Desktop aus|Migrieren von C++-Code zu mobilen Anwendungen vom Desktop aus]] }}&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[[Erstellen von iOS-Apps|Erstellen von iOS-Apps]]&#039;&#039;&#039;&lt;br /&gt;
** [[Einstellungen für Standards in RAD Studio|Einstellungen für Standards in {{Product}}]]&lt;br /&gt;
** [[Verwenden von Stilen für iOS: Stile für Mehrfachauflösung sowie schwarze und transparente Stile|Verwenden von iOS-Stilen: Stile für Mehrfachauflösung sowie schwarze und transparente Stile]]&lt;br /&gt;
** [[Native FireMonkey-iOS-Steuerelemente|Verwenden von nativen FireMonkey-iOS-Steuerelementen]]&lt;br /&gt;
** [[Verwenden des iOS-In-App-Kaufdienstes|Verwenden des iOS-In-App-Kaufdienstes]]&lt;br /&gt;
** [[Verwenden des iAd-Dienstes|Verwenden des iAd-Dienstes]]&lt;br /&gt;
** [[Codefragmente für die mobile Entwicklung|Codefragmente für die mobile Entwicklung]]&lt;br /&gt;
** &#039;&#039;&#039;[[Mobile-Tutorials: Mobile Anwendungsentwicklung (iOS und Android)|Mobile-Tutorials: Mobile Anwendungsentwicklung (iOS und Android)]]&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Vorbereiten der Signierung von iOS-Apps:&#039;&#039;&#039;&lt;br /&gt;
** [[Teilnehmen am Apple-Entwicklerprogramm|Beitreten zum Apple-Entwicklerprogramm]]&lt;br /&gt;
** [[Erwerben eines iOS-Entwicklerzertifikats|Erwerben eines iOS-Entwicklerzertifikats]]&lt;br /&gt;
** [[Bereitstellen von iOS-Anwendungen|Bereitstellen von iOS-Anwendungen]]&lt;br /&gt;
*&#039;&#039;&#039;Ausführen von iOS-Apps:&#039;&#039;&#039;&lt;br /&gt;
** [[Ausführen von iOS-Anwendungen auf einem iOS-Gerät|Ausführen von iOS-Anwendungen auf einem iOS-Gerät]]&lt;br /&gt;
*&#039;&#039;&#039;Bereitstellen von iOS-Apps:&#039;&#039;&#039;&lt;br /&gt;
** [[Konfigurieren eines Anwendungseintrags in iTunes Connect für das Hochladen|Konfigurieren eines Anwendungseintrags in iTunes Connect für das Hochladen]]&lt;br /&gt;
** [[Vorbereiten von iOS-Anwendungen für die Bereitstellung|Vorbereiten von iOS-Anwendungen für die Bereitstellung]]&lt;br /&gt;
** [[Bereitstellen von iOS-Anwendungen für die Ad-hoc-Weitergabe|Bereitstellen von iOS-Anwendungen für die Ad-hoc-Weitergabe]]&lt;br /&gt;
** [[Bereitstellen von iOS-Anwendungen für die Übermittlung an den App Store|Bereitstellen von iOS-Anwendungen für die Übermittlung an den App Store]]&lt;br /&gt;
** [[Übermittlung der App an den App Store (iOS)|Übermittlung der App an den App Store (iOS)]]&lt;br /&gt;
*&#039;&#039;&#039;Fehlerbehandlung bei iOS-Apps:&#039;&#039;&#039;&lt;br /&gt;
** [[Fehlerbehebung: In der Projektverwaltung werden keine iOS-Geräteziele angezeigt|Fehlerbehebung: In der Projektverwaltung werden keine iOS-Geräteziele angezeigt]]&lt;br /&gt;
** [[Fehlerbehebung: Kann nicht auf dem iOS-Gerät bereitgestellt werden|Fehlerbehebung: Bereitstellung auf dem iOS-Gerät nicht möglich]]&lt;br /&gt;
** [[Fehlerbehebung: Verbindung zum Mac kann nicht hergestellt werden|Fehlerbehebung: Verbindung zum Mac kann nicht hergestellt werden]]&lt;br /&gt;
*&#039;&#039;&#039;[[Mobile-Tutorials: Mobile Anwendungsentwicklung (iOS und Android)|Mobile-Tutorials: Mobile Anwendungsentwicklung (iOS und Android)]]&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;&#039;Konfigurieren der Entwicklungsumgebung für das iOS-Gerät:&#039;&#039;&#039;&lt;br /&gt;
*** [[Mobile-Tutorial: Konfigurieren der Entwicklungsumgebung auf dem Mac (iOS)|Mobile-Tutorial: Konfigurieren der Entwicklungsumgebung auf dem Mac (iOS)]]&lt;br /&gt;
*** [[Mobile-Tutorial: Konfigurieren der Entwicklungsumgebung auf dem Windows-PC (iOS)|Mobile-Tutorial: Konfigurieren der Entwicklungsumgebung auf dem Windows-PC (iOS)]]&lt;br /&gt;
**&#039;&#039;&#039;Verwenden von grundlegenden iOS-Oberflächenelementen:&#039;&#039;&#039;&lt;br /&gt;
*** [[Mobile-Tutorial: Erstellen einer Anwendung für mobile Plattformen (iOS und Android)|Mobile-Tutorial: Erstellen einer Anwendung für mobile Plattformen (iOS und Android)]]&lt;br /&gt;
*** [[Mobile-Tutorial: Verwenden von Schaltflächen-Komponenten mit unterschiedlichen Stilen (iOS und Android)|Mobile-Tutorial: Verwenden von Schaltflächen-Komponenten mit unterschiedlichen Stilen (iOS und Android)]]&lt;br /&gt;
*** [[Mobile-Tutorial: Verwenden von Kalender-Komponenten zur Datumsauswahl (iOS und Android)|Mobile-Tutorial: Verwenden von Kalender-Komponenten zur Datumsauswahl (iOS und Android)]]&lt;br /&gt;
*** [[Mobile-Tutorial: Verwenden von Kombinationsfeld-Komponenten zur Auswahl von Einträgen (iOS und Android)|Mobile-Tutorial: Verwenden von Kombinationsfeld-Komponenten zur Auswahl von Einträgen (iOS und Android)]]&lt;br /&gt;
*** [[Mobile-Tutorial: Verwenden von Webbrowser-Komponenten (iOS und Android)|Mobile-Tutorial: Verwenden von Webbrowser-Komponenten (iOS und Android)]]&lt;br /&gt;
*** [[Mobile-Tutorial: Verwenden von Registerkarten-Komponenten zur Anzeige von Seiten (iOS und Android)|Mobile-Tutorial: Verwenden von Registerkarten-Komponenten zur Anzeige von Seiten (iOS und Android)]]&lt;br /&gt;
*** [[Mobile-Tutorial: Verwenden von Listenfeld-Komponenten zur Anzeige von Tabellenansichten (iOS und Android)|Mobile-Tutorial: Verwenden von Listenfeld-Komponenten zur Anzeige von Tabellenansichten (iOS und Android)]]&lt;br /&gt;
*** [[Mobile-Tutorial: Verwenden von Layouts zur Ausrichtung unterschiedlicher Formulargrößen (iOS und Android)|Mobile-Tutorial: Verwenden von Layouts zur Ausrichtung unterschiedlicher Formulargrößen (iOS und Android)]]&lt;br /&gt;
**&#039;&#039;&#039;Verwenden von Gerätefunktionen:&#039;&#039;&#039;&lt;br /&gt;
*** [[Mobile-Tutorial: Aufnehmen und Teilen von Bildern und Teilen von Texten (iOS und Android)|Mobile-Tutorial: Aufnehmen und Teilen von Bildern und Teilen von Text (iOS und Android)]]&lt;br /&gt;
*** [[Mobile-Tutorial: Verwenden von Positionssensoren (iOS und Android)|Mobile-Tutorial: Verwenden von Positionssensoren (iOS und Android)]]&lt;br /&gt;
*** [[Mobile-Tutorial: Verwenden von Mitteilungen (iOS und Android)|Mobile-Tutorial: Verwenden von Mitteilungen (iOS und Android)]]&lt;br /&gt;
**&#039;&#039;&#039;Verwenden von BaaS (Backend as a Service ):&#039;&#039;&#039;&lt;br /&gt;
*** [[Mobile-Tutorial: Verwenden von Remote-Mitteilungen (iOS und Android)|Mobile-Tutorial: Verwenden von Remote-Mitteilungen (iOS und Android)]]&lt;br /&gt;
*** [[Mobile-Tutorial: Verwenden von BaaS für Backend-Speicher (iOS und Android)|Mobile-Tutorial: Verwenden von BaaS für Backend-Speicher (iOS und Android)]]&lt;br /&gt;
**&#039;&#039;&#039;Zugreifen auf Datenbanken:&#039;&#039;&#039;&lt;br /&gt;
*** [[Mobile-Tutorial: Verwenden von InterBase ToGo mit FireDac (iOS und Android)|Mobile-Tutorial: Verwenden von InterBase ToGo mit FireDAC (iOS und Android)]]&lt;br /&gt;
*** &amp;lt;f s=&amp;quot;radstudio&amp;quot; t=&amp;quot;span&amp;quot; /&amp;gt;[[Mobile-Tutorial: Verwenden von dbExpress und SQLite (iOS und Android)|Mobile-Tutorial: Verwenden von SQLite und dbExpress (iOS und Android)]]&amp;lt;f e=&amp;quot;radstudio&amp;quot; t=&amp;quot;span&amp;quot; /&amp;gt;&amp;lt;f s=&amp;quot;appmethod&amp;quot; t=&amp;quot;span&amp;quot; /&amp;gt;[[Mobile-Tutorial: Verwenden von FireDAC und SQLite (iOS und Android)|Mobile-Tutorial: Verwenden von FireDAC und SQLite (iOS und Android)]]&amp;lt;f e=&amp;quot;appmethod&amp;quot; t=&amp;quot;span&amp;quot; /&amp;gt; {{f|vcl|&lt;br /&gt;
*** [[Mobile-Tutorial: Herstellen einer Verbindung zu Unternehmensdatenbanken von mobilen Client-Anwendungen aus (iOS und Android)|Mobile-Tutorial: Herstellen einer Verbindung zu Unternehmensdatenbanken von mobilen Client-Anwendungen aus (iOS und Android)]] }}&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
&lt;br /&gt;
* [[Plattformvoraussetzungen für FireMonkey|Plattformvoraussetzungen für {{FM}}]]&lt;br /&gt;
* [[Regeln für die Benennung von geräteübergreifenden Projekten und Dateien|Regeln für die Benennung von geräteübergreifenden Projekten und Dateien]]&lt;br /&gt;
* [[Experten zum Erstellen von geräteübergreifenden FireMonkey-Anwendungen und -Komponenten|Experten zum Erstellen von geräteübergreifenden {{FM}}-Anwendungen und -Komponenten]]&lt;br /&gt;
* [[Vorlagen für geräteübergreifende Anwendungen|Vorlagen für geräteübergreifende Anwendungen]]{{f|cmd|&lt;br /&gt;
*&#039;&#039;&#039;{{Delphi}}-iOS-Compiler:&#039;&#039;&#039;&lt;br /&gt;
** [[DCCIOSARM64.EXE: Der Delphi-Compiler für 64-Bit-iOS-Geräte|DCCIOSARM64: Der {{Delphi}}-Compiler für 64-Bit-iOS-Geräte]]&lt;br /&gt;
* [[BCCIOSARM64.EXE: Der C++-Compiler für 64-Bit-iOS-Geräte|BCCIOSARM64: Der C++-Compiler für 64-Bit-iOS-Geräte]]}}&lt;br /&gt;
* [[Automatic Reference Counting in C++|Automatische Referenzzählung in C++]]&lt;br /&gt;
* [[Unterschiede zwischen Windows und macOS|Unterschiede zwischen Windows und macOS]]&lt;br /&gt;
* [[Mobile Android-Anwendungsentwicklung|Mobile Android-Anwendungsentwicklung]]&lt;br /&gt;
* [[MacOS-Anwendungsentwicklung|macOS-Anwendungsentwicklung]]&lt;br /&gt;
* [[PAServer: Die Platform Assistant Server-Anwendung|PAServer: Die Platform Assistant Server-Anwendung]] {{f|radstudio|&lt;br /&gt;
* [http://cc.embarcadero.com/item/29490 EDN: iOS User Interface Design with {{Delphi}} XE4 (EN)] }}&lt;br /&gt;
&lt;br /&gt;
[[Category:Geräteübergreifend]]&lt;br /&gt;
[[Category:FMX]]&lt;br /&gt;
[[Category:IOS]]&lt;br /&gt;
[[Category:XE4]]&lt;br /&gt;
[[Category:AMMigrate]]&lt;br /&gt;
&lt;br /&gt;
[[en:IOS Mobile Application Development]]&lt;br /&gt;
[[fr:Développement d&#039;applications mobiles iOS]]&lt;br /&gt;
[[ja:IOS モバイル アプリケーション開発]]&lt;/div&gt;</summary>
		<author><name>Nicolas.rios</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Drucken_aus_FireMonkey-Anwendungen&amp;diff=218860</id>
		<title>Drucken aus FireMonkey-Anwendungen</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Drucken_aus_FireMonkey-Anwendungen&amp;diff=218860"/>
		<updated>2024-05-13T19:39:44Z</updated>

		<summary type="html">&lt;p&gt;Nicolas.rios: RS-117502&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Parent|FireMonkey-Anwendungshandbuch}}&lt;br /&gt;
&lt;br /&gt;
Sie können auf &#039;&#039;&#039;Windows&#039;&#039;&#039; oder &#039;&#039;&#039;macOS&#039;&#039;&#039; aus einer {{FM}}-Anwendung drucken.&lt;br /&gt;
&lt;br /&gt;
=={{FM}}-API zum Drucken==&lt;br /&gt;
&lt;br /&gt;
Das Objekt [[lib_de:FMX.Printer.TPrinter|FMX.Printer.TPrinter]] kapselt die Funktionalität für den Zugriff auf einen Drucker und das Drucken auf einem Drucker, der an einem Computer für Windows oder macOS angeschlossen ist. Mit dem Objekt [[lib_de:FMX.Printer.TPrinter|FMX.Printer.TPrinter]] können Sie alle Druckoperationen einer Anwendung verwalten. Durch Aufruf der globalen Funktion [[lib_de:FMX.Printer.Printer|FMX.Printer.Printer]] können Sie eine Instanz von [[lib_de:FMX.Printer.TPrinter|FMX.Printer.TPrinter]] abrufen.&lt;br /&gt;
&lt;br /&gt;
[[lib_de:FMX.Printer.TPrinter|FMX.Printer.TPrinter]] enthält eine Liste der [[lib_de:FMX.Printer.TPrinterDevice|TPrinterDevice]]-Objekte, die jeweils einen Drucker repräsentieren. Jeder Drucker enthält eine eigene Liste mit Druckauflösungen DPI (Dots Per Inch, Punkte pro Zoll). In der Eigenschaft [[lib_de:FMX.Printer.TPrinterDevice.DPICount|DPICount]] ist die Anzahl der Auflösungen enthalten, die von dem Drucker unterstützt werden. Die indizierte Eigenschaft [[lib_de:FMX.Printer.TPrinterDevice.DPI|DPI]] kann zum Ermitteln der tatsächlichen Auflösungen durchlaufen werden. [[lib_de:FMX.Printer.TPrinterDevice.ActiveDPIIndex|ActiveDPIIndex]] ist ein nullbasierter Index für die indizierte Eigenschaft [[lib_de:FMX.Printer.TPrinterDevice.DPI|DPI]], die die Druckauflösung auf dem Drucker darstellt.&lt;br /&gt;
&lt;br /&gt;
==Aktivieren der Druckfunktion in {{FM}}-Anwendungen==&lt;br /&gt;
&lt;br /&gt;
In den folgenden Schritten wird gezeigt, wie das Drucken aus einer {{FM}}-Anwendung durchgeführt wird.&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Beziehen Sie [[lib_de:FMX.Printer|FMX.Printer]] in das Formular ein, in dem der Druckauftrag verwendet werden soll.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;l s=&amp;quot;delphi&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
&#039;&#039;&#039;{{Delphi}}:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 uses FMX.Printer;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;l e=&amp;quot;delphi&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;l s=&amp;quot;cpp&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;C++:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 #include &amp;quot;FMX.Printer.hpp&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;l e=&amp;quot;cpp&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Verwenden Sie immer die [[lib_de:FMX.Printer.TPrinter.Canvas|Zeichenfläche des Druckers]] oder die Zeichenfläche einer grafischen Komponente (z.B. die Zeichenfläche eines Bildes) anstelle der Zeichenfläche des Formulars. Beginnen Sie den Druckvorgang immer mit [[lib_de:FMX.Graphics.TCanvas.BeginScene|BeginScene]] und beenden Sie den Druckauftrag mit [[lib_de:FMX.Graphics.TCanvas.EndScene|EndScene]], wenn Sie die [[lib_de:FMX.Printer.TPrinter.Canvas|Zeichenfläche des Druckers]] nicht verwenden.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Setzen Sie zuerst zur vollständigen Kontrolle über die Druckqualität (Auflösung der und Portabilität der [[lib_de:FMX.Printer.TPrinter.Canvas|Zeichenfläche]]) [[lib_de:FMX.Printer.TPrinterDevice.ActiveDPIIndex|ActiveDPIIndex]] durch Zuweisen eines Wertes oder durch Aufruf der Methode [[lib_de:FMX.Printer.TPrinterDevice.SelectDPI|SelectDPI]] (empfohlenes Vorgehen).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;l s=&amp;quot;delphi&amp;quot;/&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
&#039;&#039;&#039;{{Delphi}}:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 Printer.ActivePrinter.SelectDPI(1200, 1200); { one way }&lt;br /&gt;
 Printer.ActivePrinter.ActiveDPIIndex := 1; { another way }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;	&lt;br /&gt;
&amp;lt;l e=&amp;quot;delphi&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;l s=&amp;quot;cpp&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;C++:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 Printer-&amp;gt;ActivePrinter-&amp;gt;SelectDPI(1200, 1200); /* one way */&lt;br /&gt;
 Printer-&amp;gt;ActivePrinter-&amp;gt;ActiveDPIIndex = 1; /* another way */&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;l e=&amp;quot;cpp&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Starten Sie den eigentlichen Druckauftrag mit [[lib_de:FMX.Printer.TPrinter.BeginDoc|BeginDoc]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;l s=&amp;quot;delphi&amp;quot;/&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
&#039;&#039;&#039;{{Delphi}}:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 Printer.BeginDoc;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;l e=&amp;quot;delphi&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;l s=&amp;quot;cpp&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;C++:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 Printer-&amp;gt;BeginDoc();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;l e=&amp;quot;cpp&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Beenden Sie den eigentlichen Druckauftrag mit [[lib_de:FMX.Printer.TPrinter.EndDoc|EndDoc]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;l s=&amp;quot;delphi&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;{{Delphi}}:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 Printer.EndDoc;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;l e=&amp;quot;delphi&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;l s=&amp;quot;cpp&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;C++:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 Printer-&amp;gt;EndDoc();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;l e=&amp;quot;cpp&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Ändern Sie während eines Druckauftrags nie die Eigenschaft [[lib_de:FMX.Printer.TPrinterDevice.ActiveDPIIndex|ActiveDPIIndex]].&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DPI- und Treiberunterstützung==&lt;br /&gt;
&lt;br /&gt;
Die Treiberunterstützung für Drucker ist auf verschiedenen Plattformen (Windows, macOS) unterschiedlich. Deshalb sollten Sie sich nicht darauf verlassen, dass die Anzahl oder die Reihenfolge der unterstützten Auflösungen im Array [[lib_de:FMX.Printer.TPrinterDevice.DPI|DPI]] unter Windows und macOS identisch sind. Unter macOS gibt es beispielsweise für den HP-Laserdrucker 3 unterstützte Auflösungen, für Windows hingegen 7. Bei Anwendungen mit Druckfunktionen für Windows und macOS müssen Sie zusätzlichen Code hinzufügen (hauptsächlich zur Angabe der DPI), damit die Druckausgabe auf beiden Plattformen annähernd gleich ist.&lt;br /&gt;
&lt;br /&gt;
Als &#039;&#039;&#039;bestes Verfahren&#039;&#039;&#039; hat sich erwiesen, die DPI immer durch Setzen der Eigenschaft [[lib_de:FMX.Printer.TPrinterDevice.ActiveDPIIndex|ActiveDPIIndex]] oder durch Aufruf der Methode [[lib_de:FMX.Printer.TPrinterDevice.SelectDPI|SelectDPI]] vor dem Drucken, wie oben erwähnt, festzulegen.&lt;br /&gt;
&lt;br /&gt;
[[lib_de:FMX.Printer.TPrinterDevice.ActiveDPIIndex|ActiveDPIIndex]] wird für einen gegebenen Drucker &#039;&#039;&#039;nicht&#039;&#039;&#039; auf die Standard-DPI gesetzt. Ein [[lib_de:FMX.Printer.TPrinterDevice|TPrinterDevice]]-Objekt unterstützt keine Standard-DPI, insbesondere weil die Standard-DPI von einigen macOS-Druckertreibern nicht angegeben wird. Deshalb wird beim Start der Anwendung [[lib_de:FMX.Printer.TPrinterDevice.ActiveDPIIndex|ActiveDPIIndex]] für alle [[lib_de:FMX.Printer.TPrinterDevice|TPrinterDevice]]-Objekte auf -1 gesetzt. Der Wert -1 bedeutet, dass entweder die letzte Druck-DPI oder die Standard-DPI verwendet wird. Die Standard-DPI ist nur nach dem Start der Anwendung verfügbar, wenn Sie [[lib_de:FMX.Printer.TPrinterDevice.ActiveDPIIndex|ActiveDPIIndex]] nicht in einen anderen Indexwert geändert und [[lib_de:FMX.Printer.TPrinter.BeginDoc|BeginDoc]] nicht aufgerufen haben.&lt;br /&gt;
&lt;br /&gt;
Andererseits können Sie [[lib_de:FMX.Printer.TPrinterDevice.ActiveDPIIndex|ActiveDPIIndex]] auf -1 setzen, und die letzte DPI des zuvor festgelegten Druckers wird von der Anwendung verwendet. Denken Sie immer daran, einen Wert für [[lib_de:FMX.Printer.TPrinterDevice.ActiveDPIIndex|ActiveDPIIndex]] zu setzen, bevor Sie [[lib_de:FMX.Printer.TPrinter.BeginDoc|BeginDoc]] aufrufen, wenn Sie dieselbe Größe der [[lib_de:FMX.Printer.TPrinter.Canvas|Zeichenfläche]] für Windows und macOS verwenden möchten.&lt;br /&gt;
&lt;br /&gt;
Mit der Methode [[lib_de:FMX.Printer.TPrinterDevice.SelectDPI|SelectDPI]] kann durch ein [[lib_de:FMX.Printer.TPrinter|TPrinter]]-Objekt sehr einfach die Ihrem Drucker ähnlichste Auflösung auf Basis der an [[lib_de:FMX.Printer.TPrinterDevice.SelectDPI|SelectDPI]] übergebenen Parameter ausgewählt werden. Es ist einfacher festzulegen; anstatt die Eigenschaft [[lib_de:FMX.Printer.TPrinterDevice.ActiveDPIIndex|ActiveDPIIndex]] direkt zu setzen, können Sie beispielsweise den Wert zur Laufzeit ändern:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;l s=&amp;quot;delphi&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;{{Delphi}}:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Printer.ActivePrinter.SelectDPI(600, 600);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;l e=&amp;quot;delphi&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;l s=&amp;quot;cpp&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;C++:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Printer-&amp;gt;ActivePrinter-&amp;gt;SelectDPI(600, 600);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;l e=&amp;quot;cpp&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In Anbetracht der Tatsache, dass unter Windows die Anzahl der vom Treiber angegebenen Druckerauflösungen von denen, die der macOS-Druckertreiber liefert, abweicht, könnte der Index nicht verfügbar sein.&lt;br /&gt;
&lt;br /&gt;
Zusammengefasst stellt die Verwendung von [[lib_de:FMX.Printer.TPrinterDevice.SelectDPI|SelectDPI]] zum Setzen der Druck-DPI die &#039;&#039;&#039;weitaus praktischere Methode&#039;&#039;&#039; dar.&lt;br /&gt;
&lt;br /&gt;
==Druckerzeichenfläche==&lt;br /&gt;
&lt;br /&gt;
Es gibt einige Unterschiede bei der Verwendung einer &#039;&#039;&#039;Druckerzeichenfläche&#039;&#039;&#039; im Vergleich zu einer &#039;&#039;&#039;Bildschirm- oder Fenster-(Formular-)Zeichenfläche&#039;&#039;&#039;:	&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
* Für Druckerzeichenflächen müssen Sie die Farb- und Fülleinstellungen mit [[lib_de:FMX.Graphics.TCanvas.Fill|Canvas.Fill]] festlegen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;l s=&amp;quot;delphi&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;{{Delphi}}:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Canvas.Fill.Color := claXXX;&lt;br /&gt;
Canvas.Fill.Kind := TBrushKind.Solid;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;l e=&amp;quot;delphi&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;l s=&amp;quot;cpp&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;C++:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Canvas-&amp;gt;Fill-&amp;gt;Color = claXXX;&lt;br /&gt;
Canvas-&amp;gt;Fill-&amp;gt;Kind = TBrushKind.Solid;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;l e=&amp;quot;cpp&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Für Bildschirm- oder Fensterzeichenflächen müssen Sie die Farb- und Fülleinstellungen mit [[lib_de:FMX.Graphics.TCanvas.Stroke|Canvas.Stroke]] festlegen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;l s=&amp;quot;delphi&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;{{Delphi}}:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Canvas.Stroke.Color := claXXX;&lt;br /&gt;
Canvas.Stroke.Kind := TBrushKind.Solid;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;l e=&amp;quot;delphi&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;l s=&amp;quot;cpp&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;C++:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Canvas-&amp;gt;Stroke-&amp;gt;Color = claXXX;&lt;br /&gt;
Canvas-&amp;gt;Stroke-&amp;gt;Kind = TBrushKind.Solid;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;l e=&amp;quot;cpp&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beachten Sie, dass:&lt;br /&gt;
* Sie beim Drucken von Text, dessen Farbe Sie ändern möchten, [[lib_de:FMX.Graphics.TCanvas.Fill|Canvas.Fill]] verwenden müssen.&lt;br /&gt;
* Sie beim Drucken anderer Elemente – außer Text – [[lib_de:FMX.Graphics.TCanvas.Stroke|Canvas.Stroke]] verwenden müssen.&lt;br /&gt;
&lt;br /&gt;
Der Parameter &amp;lt;code&amp;gt;Opacity&amp;lt;/code&amp;gt; übernimmt bei allen Routinen, die diesen Parameter unterstützen (wie [[lib_de:FMX.Graphics.TCanvas.FillRect|FMX.Graphics.TCanvas.FillRect]]) Gleitkommawerte im Bereich von &amp;lt;code&amp;gt;0..1&amp;lt;/code&amp;gt; (0 ist transparent und 1 ist undurchsichtig). Verwenden Sie keine Werte außerhalb dieses Bereichs.&lt;br /&gt;
&lt;br /&gt;
==Beispiel für programmgesteuertes Drucken==&lt;br /&gt;
&lt;br /&gt;
Im folgenden Beispiel wird ein Bild und eine Schaltfläche verwendet. Bei jedem Klicken auf die Schaltfläche wird das Bild auf dem Drucker ausgegeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;l s=&amp;quot;delphi&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;{{Delphi}}:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
var&lt;br /&gt;
  SrcRect, DestRect: TRectF;&lt;br /&gt;
begin&lt;br /&gt;
  { Set the default DPI for the printer. The SelectDPI routine defaults&lt;br /&gt;
    to the closest available resolution as reported by the driver. }&lt;br /&gt;
  Printer.ActivePrinter.SelectDPI(1200, 1200);&lt;br /&gt;
  { Start printing. }&lt;br /&gt;
  Printer.BeginDoc;&lt;br /&gt;
 &lt;br /&gt;
  if Printer.Canvas.BeginScene then&lt;br /&gt;
  try&lt;br /&gt;
    { Set canvas filling style. }&lt;br /&gt;
    Printer.Canvas.Fill.Color := claBlack;&lt;br /&gt;
    Printer.Canvas.Fill.Kind := TBrushKind.Solid;&lt;br /&gt;
 &lt;br /&gt;
    { Set the Source and Destination TRects. }&lt;br /&gt;
    SrcRect := Image1.LocalRect;&lt;br /&gt;
    DestRect := TRectF.Create(0, 0, Printer.PageWidth, Printer.PageHeight);&lt;br /&gt;
 &lt;br /&gt;
    { Print the picture on all the surfaces of the page and all opaque. }&lt;br /&gt;
    Printer.Canvas.DrawBitmap(Image1.Bitmap, SrcRect, DestRect, 1);&lt;br /&gt;
  finally&lt;br /&gt;
    Printer.Canvas.EndScene;&lt;br /&gt;
  end;&lt;br /&gt;
 &lt;br /&gt;
  { Finish printing job. }&lt;br /&gt;
  Printer.EndDoc;&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;l e=&amp;quot;delphi&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;l s=&amp;quot;cpp&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;C++&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
TRectF SrcRect, DestRect;&lt;br /&gt;
  TPrinter *Printer = Printer;&lt;br /&gt;
 &lt;br /&gt;
  /* Set the default DPI for the printer. The SelectDPI routine defaults&lt;br /&gt;
		 to the closest available resolution as reported by the driver. */&lt;br /&gt;
  Printer-&amp;gt;ActivePrinter-&amp;gt;SelectDPI(1200, 1200);&lt;br /&gt;
 &lt;br /&gt;
  /* Start printing. */&lt;br /&gt;
  Printer-&amp;gt;BeginDoc();&lt;br /&gt;
 &lt;br /&gt;
  if (Printer-&amp;gt;Canvas-&amp;gt;BeginScene()) {&lt;br /&gt;
	  try&lt;br /&gt;
	  {&lt;br /&gt;
		/* Set canvas filling style. */&lt;br /&gt;
		  Printer-&amp;gt;Canvas-&amp;gt;Fill-&amp;gt;Color = claBlack;&lt;br /&gt;
		  Printer-&amp;gt;Canvas-&amp;gt;Fill-&amp;gt;Kind = TBrushKind(1);&lt;br /&gt;
 &lt;br /&gt;
		  /* Set the Source and Destination TRects. */&lt;br /&gt;
		  SrcRect = Image1-&amp;gt;LocalRect;&lt;br /&gt;
		  DestRect = TRectF(0, 0, Printer-&amp;gt;PageWidth, Printer-&amp;gt;PageHeight);&lt;br /&gt;
 &lt;br /&gt;
		  /* Print the picture on all the surface of the page and all opaque. */&lt;br /&gt;
		  Printer-&amp;gt;Canvas-&amp;gt;DrawBitmap(Image1-&amp;gt;Bitmap, SrcRect, DestRect, 1);&lt;br /&gt;
	  }&lt;br /&gt;
	   __finally&lt;br /&gt;
	  {&lt;br /&gt;
		Printer-&amp;gt;Canvas-&amp;gt;EndScene();&lt;br /&gt;
	  }&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  /* Finish the printing job. */&lt;br /&gt;
  Printer-&amp;gt;EndDoc();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;l e=&amp;quot;cpp&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen bezüglich der Druck-API finden Sie in der API-Dokumentation in der [[lib_de:FMX.Printer|Unit FMX.Printer]].&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
&lt;br /&gt;
* [[lib_de:FMX.Printer|FMX.Printer (Unit)]]&lt;br /&gt;
&lt;br /&gt;
==Codebeispiele==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;l s=&amp;quot;delphi&amp;quot;/&amp;gt;&lt;br /&gt;
* [[samp_en:FMXPrinting_({{Delphi}})|Drucken aus {{FM}} ({{Delphi}})]]&lt;br /&gt;
&amp;lt;l e=&amp;quot;delphi&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;l s=&amp;quot;cpp&amp;quot;/&amp;gt;&lt;br /&gt;
* [[samp_en:FMXPrinting_(C++)|Drucken aus {{FM}} (C++)]]&lt;br /&gt;
&amp;lt;l e=&amp;quot;cpp&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:XE2]]&lt;br /&gt;
[[Category:FMX]]&lt;br /&gt;
[[Category:AMMigrate]]&lt;br /&gt;
&lt;br /&gt;
[[en:Printing from a FireMonkey Application]]&lt;br /&gt;
[[fr:Impression depuis une application FireMonkey]]&lt;br /&gt;
[[ja:FireMonkey アプリケーションからの印刷]]&lt;/div&gt;</summary>
		<author><name>Nicolas.rios</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Pragma_package&amp;diff=218859</id>
		<title>Pragma package</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Pragma_package&amp;diff=218859"/>
		<updated>2024-05-09T13:55:31Z</updated>

		<summary type="html">&lt;p&gt;Nicolas.rios: {{Note|&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:#pragma package}}&lt;br /&gt;
{{Parent|Pragma-Direktiven (Übersicht) - Index}}&lt;br /&gt;
==Syntax &amp;lt;span style=&amp;quot;font-size: 60%&amp;quot;&amp;gt;(siehe [[Pseudogrammatik]])&amp;lt;/span&amp;gt;==&lt;br /&gt;
 #pragma package(smart_init)&lt;br /&gt;
 #pragma package(smart_init, weak)&lt;br /&gt;
&lt;br /&gt;
==Beschreibung==&lt;br /&gt;
===#pragma package(smart_init)===&lt;br /&gt;
&lt;br /&gt;
Die Anweisung &amp;lt;code&amp;gt;#pragma package(smart_init)&amp;lt;/code&amp;gt; stellt sicher, dass gepackte Units in der Reihenfolge initialisiert werden, die durch ihre Abhängigkeiten (standardmäßig in der Package-Quelldatei enthalten) festgelegt ist. Normalerweise setzen Sie &amp;lt;code&amp;gt;#pragma package&amp;lt;/code&amp;gt; für CPP-Dateien ein, die als Packages erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
:{{Note| Verwenden Sie &amp;lt;code&amp;gt;#pragma package(smart_init)&amp;lt;/code&amp;gt; nicht in Header-Dateien. Dies könnte zum Compiler-Fehler [[E2177 Redeklaration des pragma-Package mit verschiedenen Parametern (C++)|E2177 Redeklaration von #pragma package mit verschiedenen Argumenten (C++)]] führen.}}&lt;br /&gt;
&lt;br /&gt;
Dieses Pragma wirkt sich auf die Reihenfolge der Initialisierung dieser Compilierungs-Unit aus. Units werden in folgender Reihenfolge initialisiert:&lt;br /&gt;
&lt;br /&gt;
# Nach ihren &amp;quot;uses&amp;quot;-Abhängigkeiten, d. h., wenn UnitA von UnitB abhängt, muss UnitB vor UnitA initialisiert werden.&lt;br /&gt;
# Nach der Link-Reihenfolge.&lt;br /&gt;
# Nach der Priorität innerhalb der Unit.&lt;br /&gt;
&lt;br /&gt;
Reguläre OBJ-Dateien (solche, die nicht als Units erzeugt werden) werden zuerst nach der Priorität und dann nach der Link-Reihenfolge initialisiert. Wenn Sie die Reihenfolge der Objektdateien ändern, werden die Konstruktoren der globalen Objekte in der entsprechenden Reihenfolge aufgerufen.&lt;br /&gt;
&lt;br /&gt;
Die folgenden Beispiele zeigen die Unterschiede der Initialisierung bei Units und regulären Objektdateien.&lt;br /&gt;
&lt;br /&gt;
====Beispiel====&lt;br /&gt;
Sie haben beispielsweise drei Quelldateien A, B und C, die mit &amp;lt;code&amp;gt;#pragma package(smart_init)&amp;lt;/code&amp;gt; initialisiert wurden und über Funktionen mit den Prioritätswerten 10, 20 und 30 (definiert durch den Prioritätsparameter von &amp;lt;code&amp;gt;#pragma startup&amp;lt;/code&amp;gt;) verfügen. Die Funktionen sind entsprechend ihrer Prioritätswerte und der zugehörigen Quelldatei als a10, a20, a30, b10, b20 usw. benannt.&lt;br /&gt;
&lt;br /&gt;
Hier sind die drei Programme A, B und C:&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
 // A.cpp&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #ifdef USE_PACKAGE_INIT&lt;br /&gt;
 #pragma package(smart_init)&lt;br /&gt;
 #endif&lt;br /&gt;
 &lt;br /&gt;
 void A10() {&lt;br /&gt;
   printf(&amp;quot;%s() &amp;quot;, __FUNCTION__);&lt;br /&gt;
 }&lt;br /&gt;
 #pragma startup A10 10&lt;br /&gt;
 &lt;br /&gt;
 void A20() {&lt;br /&gt;
   printf(&amp;quot;%s() &amp;quot;, __FUNCTION__);&lt;br /&gt;
 }&lt;br /&gt;
 #pragma startup A20 20&lt;br /&gt;
 &lt;br /&gt;
 void A30() {&lt;br /&gt;
   printf(&amp;quot;%s() &amp;quot;, __FUNCTION__);&lt;br /&gt;
 }&lt;br /&gt;
 #pragma startup A30 30&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
 // B.cpp&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #ifdef USE_PACKAGE_INIT&lt;br /&gt;
 #pragma package(smart_init)&lt;br /&gt;
 #endif&lt;br /&gt;
 &lt;br /&gt;
 void B10() {&lt;br /&gt;
   printf(&amp;quot;%s() &amp;quot;, __FUNCTION__);&lt;br /&gt;
 }&lt;br /&gt;
 #pragma startup B10 10&lt;br /&gt;
 &lt;br /&gt;
 void B20() {&lt;br /&gt;
   printf(&amp;quot;%s() &amp;quot;, __FUNCTION__);&lt;br /&gt;
 }&lt;br /&gt;
 #pragma startup B20 20&lt;br /&gt;
 &lt;br /&gt;
 void B30() {&lt;br /&gt;
   printf(&amp;quot;%s() &amp;quot;, __FUNCTION__);&lt;br /&gt;
 }&lt;br /&gt;
 #pragma startup B30 30&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
 // C.cpp&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #ifdef USE_PACKAGE_INIT&lt;br /&gt;
 #pragma package(smart_init)&lt;br /&gt;
 #endif&lt;br /&gt;
 &lt;br /&gt;
 void C10() {&lt;br /&gt;
   printf(&amp;quot;%s() &amp;quot;, __FUNCTION__);&lt;br /&gt;
 }&lt;br /&gt;
 #pragma startup C10 10&lt;br /&gt;
 &lt;br /&gt;
 void C20() {&lt;br /&gt;
   printf(&amp;quot;%s() &amp;quot;, __FUNCTION__);&lt;br /&gt;
 }&lt;br /&gt;
 #pragma startup C20 20&lt;br /&gt;
 &lt;br /&gt;
 void C30() {&lt;br /&gt;
   printf(&amp;quot;%s() &amp;quot;, __FUNCTION__);&lt;br /&gt;
 }&lt;br /&gt;
 #pragma startup C30 30&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn Sie die Quelldateien so, wie sie geschrieben sind, und mit definierter Anweisung &#039;&#039;&#039;USE_PACKAGE_INIT&#039;&#039;&#039; erzeugen, erhalten Sie die folgende Ausgabe:&lt;br /&gt;
 A10() A20() A30() B10() B20() B30() C10() C20() C30()&lt;br /&gt;
Das heißt, dass die Priorität ignoriert wird und für jede Unit die gesamte Initialisierung auf einmal durchgeführt wird.&lt;br /&gt;
&lt;br /&gt;
Sie erhalten ein vollständig anderes Ergebnis, wenn Sie die Quelldateien ohne &#039;&#039;&#039;USE_PACKAGE_INIT&#039;&#039;&#039; erzeugen. In diesem Fall wird bei Ausführung des Programms Folgendes ausgegeben:&lt;br /&gt;
 A10() B10() C10() A20() B20() C20() A30() B30() C30()&lt;br /&gt;
Das heißt, dass die anfängliche Priorität verwendet wird.&lt;br /&gt;
&lt;br /&gt;
Da es sich bei allen dreien um Units handelt, und wenn A B und C verwendet, und die Link-Reihenfolge A, B dann C ist, ergibt sich die Initialisierungsreihenfolge: &amp;lt;code&amp;gt; B10() B20() B30() C10() C20() C30() A10() A20() A30() &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei Objektdateien anstelle von Units ergibt sich die folgende Reihenfolge: &amp;lt;code&amp;gt; A10() B10() C10() A20() B20() C20() A30() B30() C30() &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für CPP-Dateien, die &amp;lt;code&amp;gt;#pragma package(smart_init)&amp;lt;/code&amp;gt; verwenden, ist es auch erforderlich, dass alle &amp;lt;code&amp;gt;#pragma link&amp;lt;/code&amp;gt;-Referenzen zu anderen Objektdateien von einer CPP-Datei aus, die &amp;lt;code&amp;gt;#pragma package(smart_init) &amp;lt;/code&amp;gt; deklariert, durch eine Unit aufgelöst werden. &amp;lt;code&amp;gt;#pragma link&amp;lt;/code&amp;gt;-Referenzen auf Nicht-Objektdateien können auch durch Bibliotheken usw. aufgelöst werden.&lt;br /&gt;
&lt;br /&gt;
===#pragma package(smart_init, weak)===&lt;br /&gt;
Die Direktive &amp;lt;code&amp;gt;#pragma package(smart_init, weak)&amp;lt;/code&amp;gt; beeinflusst die Art, wie eine Objektdatei in [[Bibliotheksdatei für den Package-Import|.bpi]]- und [[Geteilte Package-Bibliotheksdatei|.bpl]]-Dateien eines Packages gespeichert wird. Wenn &amp;lt;code&amp;gt;#pragma package(smart_init, weak)&amp;lt;/code&amp;gt; in einer Unit-Datei enthalten ist, lässt der Compiler, wenn möglich, die Unit aus BPLs weg. Der Compiler legt eine lokale Kopie der Unit (ohne Package) an, wenn die Unit für eine andere Anwendung oder ein anderes Package erforderlich ist. Eine solche Unit bezeichnet man als &amp;quot;schwach gepackt&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;#pragma package(smart_init, weak)&amp;lt;/code&amp;gt; wird verwendet, um Konflikte zwischen Packages auszuschließen, die von derselben externen Bibliothek abhängen könnten.&lt;br /&gt;
&lt;br /&gt;
Unit-Dateien mit der Direktive &amp;lt;code&amp;gt;#pragma package(smart_init, weak)&amp;lt;/code&amp;gt; dürfen keine globalen Variablen enthalten.&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen hierzu finden Sie unter [[Schwach Packen |Schwaches Packen]].&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[Präprozessor-Direktiven - Index|Präprozessor-Direktiven]]&lt;br /&gt;
* [[Schwach Packen |Schwaches Packen]]&lt;br /&gt;
* [[Verwendung des schwachen Packens]]&lt;br /&gt;
* [[E2177 Redeklaration des pragma-Package mit verschiedenen Parametern (C++)|E2177 Redeklaration von #pragma package mit verschiedenen Argumenten (C++)]]&lt;br /&gt;
[[Category:C++-Referenz]]&lt;br /&gt;
[[Category:C++]]&lt;br /&gt;
&lt;br /&gt;
[[en:Pragma package]]&lt;br /&gt;
[[fr:Pragma package]]&lt;br /&gt;
[[ja:Pragma package]]&lt;/div&gt;</summary>
		<author><name>Nicolas.rios</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Spezielle_Compiler-Direktiven_f%C3%BCr_Packages&amp;diff=218858</id>
		<title>Spezielle Compiler-Direktiven für Packages</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Spezielle_Compiler-Direktiven_f%C3%BCr_Packages&amp;diff=218858"/>
		<updated>2024-05-09T13:37:40Z</updated>

		<summary type="html">&lt;p&gt;Nicolas.rios: {{Note|&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Parent|Packages compilieren}}&lt;br /&gt;
Die folgende Tabelle enthält spezielle Compiler-Direktiven für Packages, die in den Quelltext eingefügt werden können.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Spezielle Compiler-Direktiven für Packages: &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;l s=&#039;cpp&#039;/&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; frame=&amp;quot;hsides&amp;quot; rules=&amp;quot;rows&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;C++-Direktive&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Beschreibung&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
 [[pragma package|#pragma package(smart_init)]]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
Diese Direktive stellt sicher, dass die gepackten Units in der Reihenfolge initialisiert werden, die durch ihre Abhängigkeiten festgelegt ist. (Sie wird standardmäßig in die Quelldatei eines Package eingebunden.)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
 [[pragma package|#pragma package(smart_init, weak)]]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
Mit dieser Direktive wird eine Unit schwach eingebunden. Siehe (Direktive in die Quelltextdatei der Unit einfügen.)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;l e=&#039;cpp&#039;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;l s=&#039;delphi&#039;/&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; frame=&amp;quot;hsides&amp;quot; rules=&amp;quot;rows&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;{{Delphi}}-Direktive&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Beschreibung&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
 [[Implizites Erstellen (Delphi)|{$IMPLICITBUILD OFF}]]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
Verhindert, dass ein Package in Zukunft implizit neu compiliert wird. Diese Direktive wird in [[Delphi-Package-Quelldatei (*.dpk)|.dpk-Dateien]] verwendet, wenn Packages mit Low-Level-Funktionen compiliert werden, die sich nur selten ändern, oder wenn der Quelltext des Package nicht weitergegeben wird. &lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
 [[Importierte Daten|{$G} oder {$IMPORTEDDATA OFF}]]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
Deaktiviert die Erstellung von Referenzen auf importierte Daten. Diese Direktive führt zu schnelleren Speicherzugriffen, verhindert aber, dass die Unit, in der sie verwendet wird, Variablen in anderen Packages referenzieren kann. &lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
 [[Schwach Packen|{$WEAKPACKAGEUNIT ON}]]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
Die Unit wird schwach eingebunden. Einzelheiten finden Sie unter [[Verwendung des schwachen Packens]].&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
 [[DENYPACKAGEUNIT-Direktive (Delphi)|{$DENYPACKAGEUNIT ON}]]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
Verhindert, dass die Unit in ein Package eingebunden wird. &lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
 [[DESIGNONLY-Direktive (Delphi)|{$DESIGNONLY ON}]]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
Das Package wird für die Installation in der IDE compiliert. (Nur in .dpk-Dateien.)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
 [[RUNONLY-Direktive (Delphi)|{$RUNONLY ON}]]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
Das Package wird nur als Laufzeit-Package compiliert. (Nur in .dpk-Dateien.)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Notes| &lt;br /&gt;
*Wenn Sie die Compiler-Direktive {&#039;&#039;&#039;$DENYPACKAGEUNIT ON&#039;&#039;&#039;} im Quelltext verwenden, wird die Unit nicht in das Package aufgenommen. &lt;br /&gt;
*Die Angabe von {&#039;&#039;&#039;$G-&#039;&#039;&#039;} oder {&#039;&#039;&#039;$IMPORTEDDATA OFF&#039;&#039;&#039;} kann bewirken, dass das Package nicht zusammen mit anderen Packages in derselben Anwendung verwendet werden kann. Packages, die mit der Direktive {&#039;&#039;&#039;$DESIGNONLY ON&#039;&#039;&#039;} compiliert wurden, enthalten zusätzlichen Quelltext, der von der IDE benötigt wird. Derartige Packages sollten in normalen Anwendungen nicht verwendet werden. &lt;br /&gt;
*Bei Bedarf können auch andere Compiler-Direktiven in den Quelltext eines Package aufgenommen werden. Unter [[Liste der Delphi-Compiler-Direktiven - Index|Compiler-Direktiven]] finden Sie Informationen, die hier nicht erläutert werden.}}&lt;br /&gt;
&amp;lt;l e=&#039;delphi&#039;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere Direktiven, die in allen Bibliotheken einsetzbar sind, werden unter [[Packages und DLLs erstellen|Packages und DLLs erstellen]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
&lt;br /&gt;
* [[Verwendung des schwachen Packens]]&lt;br /&gt;
*[[Packages und Komponenten: Übersicht]]&lt;br /&gt;
*[[Packages compilieren]]&lt;br /&gt;
*[[Packages erstellen und bearbeiten]]&lt;br /&gt;
&lt;br /&gt;
{{DEFAULTSORT:Spezielle Compiler-Direktiven fur Packages}}&lt;br /&gt;
[[Category:Windows-Entwicklerhandbuch]]&lt;br /&gt;
[[Category:{{Delphi}}]]&lt;br /&gt;
[[Category:C++]]&lt;br /&gt;
&lt;br /&gt;
[[en:Package-specific Compiler Directives]]&lt;br /&gt;
[[fr:Directives de compilation spécifiques aux packages]]&lt;br /&gt;
[[ja:パッケージ固有のコンパイラ指令]]&lt;/div&gt;</summary>
		<author><name>Nicolas.rios</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Hauptseite&amp;diff=218857</id>
		<title>Hauptseite</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Hauptseite&amp;diff=218857"/>
		<updated>2024-04-30T16:43:27Z</updated>

		<summary type="html">&lt;p&gt;Nicolas.rios: RS-108677 added links to Web section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:Hilfe für {{Product}} 11 {{MarketingVersion}}}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;floatleft&amp;quot; style=&amp;quot;width: 49%&amp;quot;&amp;gt;&lt;br /&gt;
==[[Überblick über RAD Studio|Überblick]]==&lt;br /&gt;
* [[Überblick über RAD Studio|Funktionsübersicht]]&lt;br /&gt;
* [[Neuerungen|Neuerungen]]&lt;br /&gt;
* [[11 Alexandria - Release 1]]&lt;br /&gt;
* [[11 Alexandria – Release 2]]&lt;br /&gt;
* [[Release-Hinweise|Release-Hinweise]]&lt;br /&gt;
* [[rad_en: Community Edition|Community Edition]]&lt;br /&gt;
&lt;br /&gt;
==[[Installation|Installation]]==&lt;br /&gt;
* [[Installationshinweise|Installationshinweise]]&lt;br /&gt;
* [[Plat en:Main Page#{{Product}} {{MarketingVersion}}|Hotfixes und Workarounds]]&lt;br /&gt;
==[[Einführung in RAD Studio|Einführung]]==&lt;br /&gt;
* [[Tutorials|Tutorials]] | [[Tutorial: Verwenden der IDE|Ihre erste Anwendung erstellen]]&lt;br /&gt;
* [[Hilfreiche Ressourcen für neue Benutzer#Code- und Anwendungsbeispiele|Code- und Anwendungsbeispiele]]&lt;br /&gt;
* [[Hilfreiche Ressourcen für neue Benutzer#Grundlagen|Lesen]]&lt;br /&gt;
* [[Hilfreiche Ressourcen für neue Benutzer#Video-Demos|Videos]]&lt;br /&gt;
* [[Hilfreiche Ressourcen für neue Benutzer#CodeRage-Seminare|Seminare]]&lt;br /&gt;
==Projektentwicklung==&lt;br /&gt;
* [[Hauptanwendungstypen|Hauptanwendungstypen]]&lt;br /&gt;
* [[Arbeitsschritte bei der Projektentwicklung|Arbeitsschritte bei der Projektentwicklung]]&lt;br /&gt;
==Referenz==&lt;br /&gt;
* [[Unterstützte Zielplattformen|Zielplattformen]]&lt;br /&gt;
* [[Frameworks und Bibliotheken|Frameworks und Bibliotheken]]&lt;br /&gt;
* [[Programmiersprachen|Programmiersprachen]]&lt;br /&gt;
* [[IDE-Referenz und Hilfsprogramme|IDE-Referenz und Hilfsprogramme]]&lt;br /&gt;
* [[Index|Index]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;floatright&amp;quot; style=&amp;quot;width: 49%&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{f|winguide|&lt;br /&gt;
&lt;br /&gt;
==[[Windows-Entwicklerhandbuch - Index|Windows-Entwicklung]]==&lt;br /&gt;
* [[VCL|VCL-Formularanwendung für Windows]]&lt;br /&gt;
* [[Entwickeln von Metropolis-UI-Anwendungen|Metropolis-UI-Anwendungen für VCL und {{FM}} (Windows 8-Stil)]]&lt;br /&gt;
* [[Komponentenentwicklung - Index|Komponentenentwicklung]]&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==[[Geräteübergreifende Anwendungen - Index|Geräteübergreifende Entwicklung]]==&lt;br /&gt;
* [[Geräteübergreifende Anwendungen entwickeln|Geräteübergreifende Anwendungen entwickeln]]&lt;br /&gt;
* [[Schritte bei der Entwicklung von geräteübergreifenden Anwendungen|Schritte bei der Entwicklung von geräteübergreifenden Anwendungen]]&lt;br /&gt;
* [[Datenbankanwendungen entwickeln|Datenbankanwendungen entwickeln]]&lt;br /&gt;
* [[Entwickeln von RAD Server-, Cloud- und REST-Anwendungen|Entwickeln von RAD Server-, Cloud- und REST-Anwendungen]] {{f|datasnap|&lt;br /&gt;
* [[DataSnap-Anwendungen entwickeln|DataSnap-Anwendungen entwickeln]] }}&lt;br /&gt;
==Mobile Entwicklung==&lt;br /&gt;
* [[Mobile Android-Anwendungsentwicklung|Mobile Android-Anwendungsentwicklung]]&lt;br /&gt;
* [[Mobile iOS-Anwendungsentwicklung|Mobile iOS-Anwendungsentwicklung]]&lt;br /&gt;
* [[Mobile-Tutorials: Mobile Anwendungsentwicklung (iOS und Android)|Mobile-Tutorials: Mobile Anwendungsentwicklung (iOS und Android)]]&lt;br /&gt;
&lt;br /&gt;
{{f|radstudio|&lt;br /&gt;
&lt;br /&gt;
==[[Internetanwendungen entwickeln - Index|Webentwicklung]]==&lt;br /&gt;
* [[Web Broker verwenden - Index|Verwenden von Web Broker]]&lt;br /&gt;
* [[DataSnap-Anwendungen entwickeln|Verwenden von DataSnap]]&lt;br /&gt;
* [[RAD Server (EMS)|Verwenden von RAD Server]]&lt;br /&gt;
==[[UML-Modellierung|UML-Modellierung]]==&lt;br /&gt;
* [[Einführende Modellierungskonzepte|Einführende Modellierungskonzepte]]&lt;br /&gt;
* [[Anleitungen für die Modellierung|Anleitungen für die Modellierung]]&lt;br /&gt;
* [[Modellierungsreferenz - Index|Modellierungsreferenz]]&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DEFAULTSORT:Hilfe fur RAD Studio 11 11.0 Alexandria}}&lt;br /&gt;
[[Category:Delphi]]&lt;br /&gt;
[[Category:C++]]&lt;br /&gt;
[[Category:AMMigrate]]&lt;br /&gt;
&lt;br /&gt;
[[en:Main Page]]&lt;br /&gt;
[[fr:Accueil]]&lt;br /&gt;
[[ja:メインページ]]&lt;/div&gt;</summary>
		<author><name>Nicolas.rios</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=11_Alexandria_%E2%80%93_Release_1&amp;diff=218850</id>
		<title>11 Alexandria – Release 1</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=11_Alexandria_%E2%80%93_Release_1&amp;diff=218850"/>
		<updated>2024-04-25T21:04:16Z</updated>

		<summary type="html">&lt;p&gt;Nicolas.rios: /* Siehe auch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Parent|Hauptseite}} &lt;br /&gt;
{{Parent|Neuerungen in den letzten Releases}}&lt;br /&gt;
Aktualisiertes Release von {{Product}} 11.1 {{Version}} verfügbar (15. März&amp;lt;sup&amp;gt;&amp;lt;/sup&amp;gt; 2022).&lt;br /&gt;
&lt;br /&gt;
{{Note|&lt;br /&gt;
&lt;br /&gt;
* Informationen zum Inhalt von Version &#039;&#039;&#039;[[Neuerungen|11 Alexandria]]&#039;&#039;&#039;&lt;br /&gt;
* Informationen zum Inhalt von Version &#039;&#039;&#039;[[What&#039;s New in 11.1.5|11 Alexandria – Release 1.5]]&#039;&#039;&#039;&lt;br /&gt;
* Informationen zum Inhalt von Version &#039;&#039;&#039;[[11 Alexandria – Release 2|11 Alexandria – Release 2]]&#039;&#039;&#039;&lt;br /&gt;
* Informationen zum Inhalt von Version &#039;&#039;&#039;[[11 Alexandria - Release 3|11 Alexandria – Release 3]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
RAD Studio 11 Alexandria – Release 1 (alias 11.1) ist für die Installation verfügbar. RAD 11.1 baut auf dem Funktionsumfang von RAD Studio 11 auf, wobei im gesamten Produkt Funktionen erweitert und neue hinzugefügt wurden. Delphi 11, C++Builder 11 und RAD Studio 11 stehen für jeden aktiven Update Subscription-Kunden zum Herunterladen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Der Fokus von RAD Studio 11.1 wurde überwiegend auf Qualitätsverbesserungen gelegt. Zu den wichtigsten Bereichen mit Qualitätsverbesserungen zählen: &lt;br /&gt;
&lt;br /&gt;
* IDE&lt;br /&gt;
* Remotedesktop&lt;br /&gt;
* Delphi- und C++-Compiler&lt;br /&gt;
* C++-Toolkette&lt;br /&gt;
* Delphi-LSP&lt;br /&gt;
* C++-LSP&lt;br /&gt;
* Delphi-RTL&lt;br /&gt;
* VCL&lt;br /&gt;
* FireMonkey&lt;br /&gt;
* Daten&lt;br /&gt;
* Internet&lt;br /&gt;
&lt;br /&gt;
=Wichtige Verbesserungen in 11.1 nach Produktbereich=&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen für die IDE==&lt;br /&gt;
&lt;br /&gt;
===Allgemeine IDE-Verbesserungen===&lt;br /&gt;
&lt;br /&gt;
* Der Vorgang &amp;quot;Mit der Arbeit beginnen&amp;quot; nach Abschluss der Installation startet die IDE neu, sodass die erste Ausführung mit Benutzerrechten und nicht mit erhöhten Rechten erfolgt. &lt;br /&gt;
* &amp;quot;Laufzeit-Themes aktivieren&amp;quot; ist jetzt für die Basiskonfiguration eines Projekts aktiviert.&lt;br /&gt;
* ProjectRoot in einer dproj/cbproj-Datei sollte jetzt immer konsistent sortiert werden.&lt;br /&gt;
* Im IDE-Dialogfeld &amp;quot;Warten&amp;quot; der ToolsAPI-Schnittstelle wurden einige Parameter umbenannt, um deren Funktionalität besser widerzuspiegeln.&lt;br /&gt;
* Der Menüeintrag &amp;quot;Neues Editierfenster&amp;quot; ist jetzt deaktiviert, wenn eine Ansicht das Klonen nicht unterstützt. Dazu zählt die Willkommensseite, die nicht dupliziert oder in ein anderes Fenster gezogen werden kann.&lt;br /&gt;
* Die Seite &amp;quot;Optionen &amp;amp;gt; Speichern und Desktop&amp;quot; wurde in zwei neue Seiten aufgeteilt:&lt;br /&gt;
** Speichern und Wiederherstellen (enthält Optionen für die automatische Wiederherstellung und Speicherung)&lt;br /&gt;
** Desktop und Layout (enthält die restlichen Optionen)&lt;br /&gt;
* In der Ansicht &amp;quot;Meldungen&amp;quot; im Dialogfeld &amp;quot;Optionen&amp;quot; können Sie jetzt die Farben für Fehler, Warnungen und Hinweise ändern. Sie können verschiedene Farben für jedes IDE-Theme festlegen, d. h., unterschiedliche Farben für hell und dunkel oder andere Themes.&lt;br /&gt;
&lt;br /&gt;
[[File:Build log.png|600px |link=]]&lt;br /&gt;
&lt;br /&gt;
* Für einige untergeordnete von der IDE verwendete Dialogfelder wurde die Unterstützung für Stile hinzugefügt, wie z. B. die Aufforderung an Benutzer, das Überschreiben von Dateien zu bestätigen, sowie die Anzeige einer Warnung dazu, die Prüfung auf Unicode-Projektnamen und die Verwendung einer ungültigen Codepage.&lt;br /&gt;
* Das Problem, dass eine Projektdatei eine inkonsistente Sortierreihenfolge der bereitgestellten Dateien haben könnte, was bedeutet, dass sie sich ändert, ohne dass sich ihr Inhalt ändert, wurde behoben.&lt;br /&gt;
* Die standardmäßige C++-Konsolen-App wurde verbessert, und das Erstellen einer Konsolen-App erfolgt jetzt über ein Tastenkürzel im Menü &amp;quot;Datei &amp;amp;gt; Neu&amp;quot; (und &amp;quot;Neu erstellen&amp;quot;) sowohl für C++ als auch für Delphi.&lt;br /&gt;
* Eine kleine Anzahl von Elementen aus dem IDE Fix Pack wurde integriert.&lt;br /&gt;
** Die IDE-Symbolleisten, wie etwa die Symbolleisten für die Bearbeitung&lt;br /&gt;
** Fehlende Bildlaufleisten auf den Seiten des Dialogfelds &amp;quot;Optionen&amp;quot;&lt;br /&gt;
** Rendering-Probleme im Objektinspektor&lt;br /&gt;
** IDE und der Code-Editor wurden beim Debuggen leer angezeigt&lt;br /&gt;
** Sondertasten (wie die Windows-Taste) bei der Texteingabe im FMX-Formular-Designer&lt;br /&gt;
** Listenmodus in der Ansicht &amp;quot;Projekte&amp;quot;&lt;br /&gt;
** Eine Reihe von Exceptions und vieles mehr&lt;br /&gt;
* Im Dialogfeld &amp;quot;Objektgalerie&amp;quot; werden Plattformen für alle Elemente angezeigt.&lt;br /&gt;
&lt;br /&gt;
[[File:Compile dialog.png|600px|link=]]&lt;br /&gt;
&lt;br /&gt;
* Im Dialogfeld &amp;quot;Neu&amp;quot;, in dem Sie Ihrem Projekt Elemente hinzufügen können, werden Elemente auf Grundlage der aktiven Plattform des Projekts ausgeblendet.&lt;br /&gt;
* Das Dialogfeld &amp;quot;Neu&amp;quot; unterstützt auch mehrere Ansichtsstile und nicht nur eine vertikale Liste (Karte, Liste, Symbole und kleine Symbole).&lt;br /&gt;
* Das Dialogfeld &amp;quot;Objektgalerie&amp;quot; verwendet jetzt das VCL-Steuerelement TControlList, wodurch das Scrollen verbessert wird.&lt;br /&gt;
* Im Dialogfeld &amp;quot;Compilieren&amp;quot; werden jetzt die Plattform und die Build-Konfiguration und Fehler vor Warnungen und Hinweisen angezeigt.&lt;br /&gt;
&lt;br /&gt;
[[File:New items.png|600px |link=]]&lt;br /&gt;
&lt;br /&gt;
===High-DPI-Qualitätsverbesserungen in der IDE===&lt;br /&gt;
&lt;br /&gt;
* Datenmodule speichern jetzt die Eigenschaft PixelsPerInch, wenn ihr Wert 96, dem Standard, entspricht. Dies trifft auch für VCL-Formulare zu.&lt;br /&gt;
* Dynamisch erstellte Frames werden jetzt beim Entwurf mit High DPI korrekt skaliert. &lt;br /&gt;
&lt;br /&gt;
===Willkommensseite===&lt;br /&gt;
&lt;br /&gt;
* Die Willkommensseite unterstützt jetzt Hintergrundbilder. Wenn Sie ein Bild auswählen, wird es so skaliert, dass es auf die Willkommensseite passt. Das Seitenverhältnis wird beibehalten, was bedeutet, dass die linke/rechte oder obere/untere Seite des Bildes außerhalb des Bildschirms liegen kann, solange die andere Achse der Größe der Willkommensseite entspricht.&lt;br /&gt;
* Das Dialogfeld &amp;quot;IDE-Optionen&amp;quot; enthält eine neue Seite für die Einstellungen der Willkommensseite, darunter der Hintergrund (der nach Theme festgelegt werden kann) und das Schließen der Seite beim Öffnen eines Projekts. Sie können auf diese Seite auch über den Layout-Editor zugreifen.&lt;br /&gt;
* Die Frames der Willkommensseite sind jetzt standardmäßig transparent. Das Hintergrundbild, das Sie festlegen, scheint teilweise hindurch. Der Transparenzwert ist eine der in der ToolsAPI verfügbaren Metriken für die Willkommensseite. &lt;br /&gt;
* Der Abstand zwischen Frames und den oberen und unteren Rändern der Willkommensseite wurde etwas verringert.&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;&#039;ToolsAPI-Unterstützung!&#039;&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
Die Willkommensseite unterstützt jetzt vollständig das Erstellen von Frames mit der ToolsAPI! Unsere Frames verwenden dieselbe API, das bedeutet, dass alles, was unsere Frames können, auch Ihre können.&lt;br /&gt;
&lt;br /&gt;
Auf unserem öffentlichen [https://github.com/Embarcadero/RADStudio11Demos/tree/main/Object%20Pascal/VCL/VCL%20WelcomePage Github ] finden Sie zwei Willkommensseiten-Demos, die eine einfache und eine fortgeschrittene Verwendung zeigen.&lt;br /&gt;
&lt;br /&gt;
In der einfachsten Form können Sie eine von TFrame abgeleitete Klasse erstellen und Titel anzeigen. Dieser Frame kann beliebigen Inhalt haben. Wir verfügen jedoch über komplexere Funktionen, die Sie ebenfalls nutzen können:&lt;br /&gt;
&lt;br /&gt;
* Frame-Titel können angepasste UI-Elemente von Chrome enthalten (implementiert über einen zweiten Frame), genau wie einige unsere Frames z. B. der Frame &amp;quot;Letzte öffnen&amp;quot; (Schaltflächen) und der Frame &amp;quot;Erstellen&amp;quot; (Umschalten zwischen Delphi und C++)&lt;br /&gt;
* Unsere Frames verwenden ein MVC-Muster und laden Daten in einen Hintergrund-Thread. Sie können unsere Implementierung verwenden, einschließlich derselben Frames und Listenansichten, mit denen unsere erstellt wurden. Das bedeutet, dass Sie dasselbe Verhalten und Aussehen erhalten können, ohne unserer Setup zu imitieren, auch wenn in Zukunft Änderungen am Standardlayout, den Größen usw. vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
===Verbesserungen des GetIt-Dialogfelds===&lt;br /&gt;
&lt;br /&gt;
* Das GetIt-Dialogfeld wurde umgestaltet, dabei wurde die Benutzeroberfläche ähnlich beibehalten, aber es wurde eine ControlList-Komponente für die Liste der Packages hinzugefügt. Dies hat spürbare Auswirkungen auf die Leistung.&lt;br /&gt;
* RAD Studio speichert jetzt die Package-Symbole in GetIt, wodurch die Zeit für das erneute Öffnen des Dialogfelds verkürzt wird.&lt;br /&gt;
* Es gibt eine neue Option zum Ignorieren von Patches in GetIt. Damit können Sie die Installation eines Patches überspringen und die Benachrichtigung über den anstehenden Patch stoppen.&lt;br /&gt;
&lt;br /&gt;
==Verbesserungen von Compilern und Toolketten==&lt;br /&gt;
&lt;br /&gt;
===Delphi und C++===&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;&#039;ASLR, DEP/NX und TSAWARE&#039;&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
In Delphi und C++ bieten die Windows-Linker jetzt eine bessere Unterstützung für Plattform-Sicherheitskonfigurationen:&lt;br /&gt;
Für Delphi:&lt;br /&gt;
&lt;br /&gt;
* Diese Features waren bereits als Compiler-/Linker-Flags verfügbar:&lt;br /&gt;
** &amp;lt;code&amp;gt;{$DYNAMICBASE} für ASLR&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;{$SetPEOptFlags $40} für DEP/NX oder die entsprechende Option ‑‑peflags&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für C++:&lt;br /&gt;
&lt;br /&gt;
* Verwenden Sie die Linker-Option -GE:, um diese Flags zu aktivieren oder zu deaktivieren:&lt;br /&gt;
&lt;br /&gt;
  **-GE:option|0xNNNN[=on|off] Set DLL characteristics flags&lt;br /&gt;
      ALLOWBIND | ALLOWISOLATION | DYNAMICBASE | HIGHENTROPYVA&lt;br /&gt;
      NXCOMPAT | TSAWARE&lt;br /&gt;
 HIGHENTROPYVA is ASLR; NXCOMPAT is DEP/NX; and TSAWARE is for Terminal Server.&lt;br /&gt;
&lt;br /&gt;
Für Delphi und C++:&lt;br /&gt;
&lt;br /&gt;
* Die Aktivierung dieser Einstellungen ist jetzt der Standard&lt;br /&gt;
* Wir erstellen weitergabefähige Binärdateien (wie BPL-Package-Dateien) mit aktivierten Sicherheitskonfigurationen&lt;br /&gt;
&lt;br /&gt;
===Delphi-Debugger für macOS ARM und Android===&lt;br /&gt;
&lt;br /&gt;
Wir haben einen neuen Debugger für die Ausführung einer macOS-Anwendung auf einem Apple ARM-Gerät. Dieser Debugger wird auf Intel-Computern nicht verwendet. &lt;br /&gt;
&lt;br /&gt;
Dieser neue Debugger ist ein neuer Build von LLDB, und seine Schlüsseltechnologie ist ein Delphi-Parser, der eine Teilmenge der Delphi-Syntax versteht. (Beispielsweise versteht er Delphi-Ausdrücke, obwohl Sie keine neue Klasse definieren können. Er sollte genug Delphi für alle Debugger-Ausdrücke verstehen, die Sie verwenden müssen.) Diese Syntax sollte wirklich Delphi entsprechen: ohne Berücksichtigung der Groß-/Kleinschreibung und fähig, komplexe Ausdrücke in der Delphi-Syntax auszuwerten.&lt;br /&gt;
&lt;br /&gt;
Wir haben &#039;&#039;&#039;diesen Debugger auch für Android 64 Bit aktiviert&#039;&#039;&#039;. Bei diesem Debugger ist es viel unwahrscheinlicher, dass er &amp;quot;Verbindungsabbrüche&amp;quot; oder Einfrieren verursacht.&lt;br /&gt;
&lt;br /&gt;
===C++-Compiler und Toolkette===&lt;br /&gt;
&lt;br /&gt;
* Der Standardkonstruktor für UnicodeString ist jetzt nicht mehr inline, was hilfreich ist, wenn beim Debuggen und Aufrufen einer Funktion, die einen String zurückgibt, nicht der Konstruktor herangezogen werden soll.&lt;br /&gt;
* AnsiStringT hat das Namespace-Präfix System::&lt;br /&gt;
* Viele intrinsische Header (xmmintrin.h usw.) sollten jetzt verfügbar sein.&lt;br /&gt;
* Dieses Release umfasst ein &amp;quot;Breaking Change&amp;quot; der C++-RTL. Das bedeutet, dass C++-Bibliotheken in 11.1 neu erzeugt werden müssen (d. h. nicht mit Objektdateien oder .lib-s linken, die mit 11 erstellt wurden). Diese Änderung bezieht sich auf die korrekte Handhabung von Handles für Win64. Einige interne RTL-Strukturen wurden in der Vergangenheit nicht verbreitert, sodass Handles möglicherweise abgeschnitten wurden. Jetzt sind sie breit genug.&lt;br /&gt;
* Zusätzliche intrinsische Elemente (z. B. SSE-AVX) werden jetzt mit unserer RTL ausgeliefert.&lt;br /&gt;
* System::DynamicArray enthält STL-Member für die Iteration, wie z. B. begin().&lt;br /&gt;
* Einige String-Funktionen, die in Delphi in unterstützenden Klassen waren, sind jetzt in C++ verfügbar. &lt;br /&gt;
* Die IDE wies ein Problem auf, bei dem die Verknüpfungspfade dazu führten, dass der Linker die klassischen Debug-Bibliotheken (falls vorhanden) vor den Clang-Release-Binärdateien fand. Das bedeutet, dass Ihre Kunden letztendlich mit der Version des falschen Compilers linken würden, wenn Sie Debug-Builds Ihrer Komponente oder Bibliothek bereitstellen und beide Compiler unterstützen würden. Dies ist jetzt behoben.&lt;br /&gt;
* Eine Vielzahl von Compiler-Fehlern im Debugger (insbesondere Win64) und Debug-Informationen wurden verbessert, die Verwendung einer TDS-Datei im Release-Modus, Optimierungen der Gebietseinstellungen und viele andere RTL- und STL-Bereiche, viele Verbesserungen an den Import-Bibliotheken, Korrekturen an coff2omf für die generierten OMF-Bibliotheken usw.&lt;br /&gt;
&lt;br /&gt;
==LSP-Verbesserungen (Delphi und C++)==&lt;br /&gt;
&lt;br /&gt;
===Delphi LSP===&lt;br /&gt;
&lt;br /&gt;
* Bei DelphiLSP wurde großer Wert auf Qualität und Geschwindigkeit gelegt, und 11.1 bringt einige erhebliche Leistungsverbesserungen.&lt;br /&gt;
* Die wichtigste Änderung besteht darin, dass die neue höhere Leistung für alle Projekttypen gilt, auch für Packages.&lt;br /&gt;
* Exception-Infos werden wieder in der Symbolbeschreibung angezeigt. &lt;br /&gt;
* Informationen zu den Zeilennummern sind jetzt in der Symbolbeschreibung für Arrays und Mengen verfügbar.&lt;br /&gt;
* Durch Drücken von STRG+UMSCHALT-AB in einem inaktiven Makro/ifdef wurde zur Implementierung der nächsten deklarierten Methode gesprungen.&lt;br /&gt;
* Die Navigation bei gedrückter STRG-Taste funktioniert jetzt auch mit aliasierten generischen Typen. Wenn IntArray beispielsweise ein TArray&amp;amp;lt;Integer&amp;amp;gt; ist, führt ein STRG-Klick auf IntArray zu der Stelle mit der Deklaration des Typs TArray&amp;amp;lt;Integer&amp;amp;gt; und nicht zur Position von TArray&amp;amp;lt;&amp;amp;gt; in System.pas.&lt;br /&gt;
* Ein Problem wurde behoben, bei dem die Navigation mit STRG+UMSCHALT+AUF/AB nicht korrekt funktionierte, wenn sich Include-Anweisungen in der Unit befanden.&lt;br /&gt;
* Die Fehlermarkierung hat nicht funktioniert, wenn das Projekt Dateien verwendete, die sich auf einem anderen Laufwerk als das Projekt befanden.&lt;br /&gt;
* Normale Projekte werden jetzt viel schneller geladen. Die Technik, die wir zum Laden eines Projekts verwenden, wurde erheblich geändert, mit deutlich weniger Parsen. DelphiLSP sollte das Laden eines Projekts viel schneller beenden und wieder schneller auf Anforderungen reagieren. &lt;br /&gt;
* Die Ergebnisse der Fehlermarkierung werden jetzt viel schneller aktualisiert. Auch hier können Sie mit einer 5- bis 30-fachen Geschwindigkeitssteigerung rechnen. Die größte Verbesserung ist bei Units mit vielen Abhängigkeiten (viele andere Units werden verwendet) zu verzeichnen.&lt;br /&gt;
&lt;br /&gt;
Weitere Verbesserungen:&lt;br /&gt;
&lt;br /&gt;
* Bessere Handhabung von Makros (defines), sodass das Umschalten zwischen der Implementierung und der Deklaration einer Methode besser funktioniert, wenn IFDEFs vorhanden sind, ebenso bei der Programmierhilfe in Klassendeklarationen.&lt;br /&gt;
* Makros (defines) werden auch gefunden, wenn sie in einer einbezogenen Datei deklariert sind, was sich auf das oben Genannte auswirkt.&lt;br /&gt;
* Bei der Deklaration einer Eigenschaft schlägt die Programmierhilfe Getter und Setter vor.&lt;br /&gt;
* Die Programmierhilfe zeigt Mengentypen an.&lt;br /&gt;
* Typparameter werden in der Programmierhilfe in einer Klassendeklaration angezeigt, einschließlich generischer Typen (z. B., T) in einer generischen Deklaration.&lt;br /&gt;
* Kurzhinweise/Hilfe zu Parametern kann bei der Instanziierung generischer Typen angezeigt werden.&lt;br /&gt;
* Die Programmierhilfe hat einige TObject-spezifische Vervollständigungen angezeigt, wie AfterConstruction, bei der Vervollständigung innerhalb einer Record-Deklaration. Dies wurde behoben.&lt;br /&gt;
&lt;br /&gt;
===C++ und cquery===&lt;br /&gt;
&lt;br /&gt;
[[File:Cpp options.png|600px |link=]]&lt;br /&gt;
&lt;br /&gt;
Die neue Registerkarte &amp;quot;LSP-Verhalten&amp;quot; enthält zwei Optionen, die steuern, wie der cquery-LSP-Server Dateien indiziert, d. h. wie er die Informationen speichert, die er für die Programmierhilfe, die Navigation usw. verwendet. &amp;quot;Server bei jeder Aktivierung eines Projekts neu starten&amp;quot; und &amp;quot;Nur im Editor geöffnete Dateien indizieren&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{{Note| Die Indizierung kann sehr rechenintensiv sein und Sie können Code Insight in der Regel nicht verwenden, bevor sie abgeschlossen ist. Beachten Sie, dass bei einem Neustart des Servers, z. B. bei einem Plattformwechsel, auch der Index gelöscht wird.}}&lt;br /&gt;
&lt;br /&gt;
Weitere Verbesserungen:&lt;br /&gt;
&lt;br /&gt;
* Die Elemente der Programmierhilfe werden in der Reihenfolge angezeigt, in der sie von cquery zurückgegeben werden, d. h. in der Reihenfolge des Gültigkeitsbereichs, es sei denn, Sie aktivieren die alphabetische Sortierung (ist standardmäßig deaktiviert). &lt;br /&gt;
* Die Indizierung sollte in den Projektoptionen für alle C++-Projekte standardmäßig aktiviert sein.&lt;br /&gt;
* Sie können nun Code vollständig in Header-Dateien schreiben, die nicht direkt Teil des Projekts sind (z. B. nicht Teil eines cpp/Header-Unit-Paars).&lt;br /&gt;
* Wenn Sie Projektoptionen oder die aktive Plattform ändern, wird der Server neu gestartet, um die neuen Projekteinstellungen zu übernehmen.&lt;br /&gt;
* Dem Server ist jetzt bekannt, wann eine Datei gespeichert wurde, und er aktualisiert sie korrekt. Dies ist wichtig für neue Dateien, da Code Insight in diesem Build erst dann funktioniert, wenn die Datei auf der Festplatte vorhanden ist.&lt;br /&gt;
&lt;br /&gt;
Weitere C++-Features:&lt;br /&gt;
&lt;br /&gt;
* Die IDE wartet korrekterweise, bis der Server bereit ist. &lt;br /&gt;
* Sie können Code vollständig in die Hauptquelldatei eines Projekts schreiben.&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;&#039;Verbesserungen der Leistung&#039;&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
* Die Programmierhilfe wird in zwei Sekunden oder weniger angezeigt, unabhängig von der Größe des Projekts. Beachten Sie, dass beim Aufrufen der Programmierhilfe im globalen Gültigkeitsbereich für ein VCL-Projekt über achtzigtausend Elemente zurückgegeben werden.&lt;br /&gt;
&lt;br /&gt;
==Verbesserungen der Bibliotheken==&lt;br /&gt;
&lt;br /&gt;
Um die gemeinsame Nutzung von Code in Projekten, die mit FMX und der VCL erstellt wurden, zu erleichtern, haben wir Framework-spezifische vordefinierte Symbole hinzugefügt:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;FRAMEWORK_VCL&#039;&#039;&#039; – Diese vordefinierte Variable wird auf true gesetzt, wenn das Projekt das VCL-Framework verwendet.  &lt;br /&gt;
* &#039;&#039;&#039;FRAMEWORK_FMX&#039;&#039;&#039; – Diese vordefinierte Variable wird auf true gesetzt, wenn das Projekt das FireMonkey-Framework (FMX) verwendet. &lt;br /&gt;
&lt;br /&gt;
===Delphi-RTL===&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;&#039;Optimierungen&#039;&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
* In Bezug auf die Delphi-RTL haben wir einige Leistungsoptimierungen durchgeführt.&lt;br /&gt;
* Wir haben auch Verbesserungen an _CopyArray, _IntToStr64, _IntToStr32, InitInstance, InvokeRecordInitializer, _FinalizeRecord, _UStrAsg (einschließlich der PurePascal-Version), _LStrAsg, _LStrLAsg, AnsiLowerCase/AnsiUpperCase und TStringHelper.IndexOf vorgenommen.&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;&#039;Neue Klasse TURLStream&#039;&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
* Es gibt eine neue Stream-Klasse, TURLStream, und eine allgemeine Basisklasse: TAsyncStream ist eine neue Basisklasse für asynchrone Streams, geerbt von TMemoryStream. TURLStream ist ein asynchroner Stream, der URL-Pfade unterstützt, geerbt von TAsyncStream.&lt;br /&gt;
* TAsyncStream.Create startet APopulate im Hintergrund-Thread. Solange dies nicht abgeschlossen ist, werden alle TStream-Methoden, die TAsyncStream aufrufen, blockiert. Eine Anwendung kann:&lt;br /&gt;
** IAsyncResult verwenden, um auf den Abschluss des Füllens von TAsyncStream zu warten/das Füllen zu prüfen. TAsyncStream unterstützt IAsyncResult.&lt;br /&gt;
** Eine anonyme AProvide-Methode bereitstellen, die beim Abschluss des Füllens aufgerufen wird.&lt;br /&gt;
* Der TURLStream-Konstruktor erweitert den Basisklassenkonstruktor und wird wie folgt deklariert:&lt;br /&gt;
&lt;br /&gt;
constructor TURLStream.Create(const AURL: string; &lt;br /&gt;
&lt;br /&gt;
  const AProvide: TAsyncStream.TStreamer;&lt;br /&gt;
  ASynchronizeProvide, AFreeOnCompletion: Boolean);&lt;br /&gt;
&lt;br /&gt;
* TURLStream erbt das Verhalten der TAsyncStream-Basisklasse, aber verwendet intern THttpClient oder TFileStream, je nach dem URL-Schema.&lt;br /&gt;
* TAsyncStream definiert die folgenden als public deklarierten Methoden: Destroy, AfterConstruction, Read, Write, Seek, SetSize(Int64), SetSize(Longint), SaveToStream.&lt;br /&gt;
* TURLStream definiert die folgenden als public deklarierten Methoden: Destroy, RegisterSyncReqExexcutor, UnRegisterSyncReqExecutor.&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;&#039;Weitere RTL-Verbesserungen&#039;&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
* Unterstützung für Windows 11 und Server 2022 in der TOSVersion-Datenstruktur&lt;br /&gt;
* TURI.ToString berücksichtigt den Port&lt;br /&gt;
* TMetaFile kann nun aus einem großen Stream laden&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;&#039;TMemIniFile und doppelte Abschnitte&#039;&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
* TIniFile wurde geändert, um die Kompatibilität mit dem Verhalten vor 10.3 in Bezug auf doppelte Abschnitte zu verbessern. &lt;br /&gt;
&lt;br /&gt;
===VCL===&lt;br /&gt;
&lt;br /&gt;
Wir haben uns in erster Linie mit Problemen im Zusammenhang mit neuen Funktionen wie TTreeView, TRichEdit, TEdgeBrowser und TNumberBox befasst.&lt;br /&gt;
&lt;br /&gt;
===FireMonkey===&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;&#039;Verbesserte Android-SDK-Integration&#039;&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
* Wir haben die Abhängigkeiten zum android.bat-Dateitool zugunsten von advmanager entfernt und das Dialogfeld &amp;quot;IDE-SDK-Manager&amp;quot; für die Android-Plattform aktualisiert. &lt;br /&gt;
* Die DEX-Compilierung und DEX-Zusammenführung sind jetzt nach dem C++-/Delphi-Linken verschoben, wodurch die Compilierung ohne Bereitstellung schneller erfolgt.&lt;br /&gt;
* Für die Kernintegration der Android-Plattform haben wir Unterstützung für Delphi-Klassen hinzugefügt, die Java-Schnittstellen mit Methodenüberladungen implementieren. Dadurch wird ein Problem mit Android 12 und dem Zugriff auf Sensoren gelöst (Korrektur der SensorInfo-Demo).&lt;br /&gt;
* Delphi-Klassen, die Java-Schnittstellen implementieren, können jetzt Funktionen haben, die Int8-, Int16-, Int64-, Float32- und Float64-Werte zurückgeben.&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;&#039;TWebBrowser&#039;&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
* Verbesserungen an TWebBrowser unter Windows (mit WebView 2-Unterstützung), einschließlich der Möglichkeit, die Windows-Engine mehrmals zu ändern. Der Standardwert der Eigenschaft WindowsEngine wurde geändert. &lt;br /&gt;
* Es wurden auch Probleme mit der Größenänderung und der Transparenz des Steuerelements behoben. Außerdem wurde WebBrowser für die Arbeit mit lokalen Dateien auf mobilen Geräten verbessert.&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;&#039;Zusätzliche FMX-Qualitätsverbesserungen&#039;&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
* Mehrere Probleme im Zusammenhang mit Windows HighDPI behoben&lt;br /&gt;
* Verbesserte Leistung von TMessageManager.Unsubscribe&lt;br /&gt;
* Option &amp;quot;Rückgängig&amp;quot; dem Kontextmenü von TMemo hinzugefügt und Probleme mit dem automatischen Scrollen des Inhalts behoben&lt;br /&gt;
* Verbesserungen bei der Emoji-Farbe für Android und iOS&lt;br /&gt;
* Verbesserungen der Unterstützung für den Metal-GPU-Treiber auf der macOS-Plattform&lt;br /&gt;
&lt;br /&gt;
===Daten===&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;&#039;Allgemein&#039;&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
* Wir haben den Bereich &amp;quot;Feldverbindungs-Designer&amp;quot; und das Dialogfeld &amp;quot;Neues Feld&amp;quot; vergrößert und benutzerfreundlicher gemacht.&lt;br /&gt;
* Zur Unterstützung der langen Firebird 4.0-Feldnamen (bis zu 63 Zeichen) wurde die Begrenzung auf 31 Zeichen in Feldnamen in der Datenbank-RTL entfernt.&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;&#039;FireDAC&#039;&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
* Unterstützung für die &#039;&#039;&#039;Strukturansicht&#039;&#039;&#039; für FireDAC implementiert. Auch einige der FireDAC-Fenster bieten eine bessere Unterstützung für High DPI. &lt;br /&gt;
* Unterstützung für &#039;&#039;&#039;MariaDB&#039;&#039;&#039; 10.6-Server mit einem 10.6-Client hinzugefügt&lt;br /&gt;
* Unterstützung für &#039;&#039;&#039;SQLite SEE&#039;&#039;&#039; hinzugefügt mit einem Befehlszeilen-Batch zum Erzeugen von SQLite-OBJs mit C++Builder für die statische FireDAC-Bindung. In der Readme-Datei sqlite_see.txt ist der Prozess erklärt (dieses Feature war bereits für RAD Studio 11 über ein GetIt-Plugin verfügbar).&lt;br /&gt;
* FireDAC verbessert den Firebird 4.0-Treiber durch Unterstützung [https://firebirdsql.org/file/documentation/release_notes/html/en/4_0/rlsnotes40.html#rnfb40-ddl-new-data-types weiterer Datentypen]:&lt;br /&gt;
** INT128&lt;br /&gt;
** NUMERIC mit einer Genauigkeit von 19..38&lt;br /&gt;
** TIME WITH TIME ZONE, TIMESTAMP WITH TIME ZONE (begrenzt)&lt;br /&gt;
** DECFLOAT(16/34)&lt;br /&gt;
* FireDAC fügt Unterstützung für die native Anweisungszeitüberschreitung für FireBird 4.0 hinzu.&lt;br /&gt;
* FireDAC fügt Unterstützung für Seitengröße 32768 von FireBird 4.0 hinzu.&lt;br /&gt;
&lt;br /&gt;
{{Note| Der Firebird 4.0-Client benötigt möglicherweise einige ICU-Dateien, wenn Sie mit Datentypen wie &amp;lt;code&amp;gt;TIMESTAMP WITH TIME ZONE&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;TIME WITH TIME ZONE&amp;lt;/code&amp;gt; arbeiten möchten. Weitere Informationen finden Sie [https://ib-aid.com/download/docs/fb4migrationguide.html#_installing_client hier].}}&lt;br /&gt;
&lt;br /&gt;
{{Warning|Für Firebird 4.0 ist die Installation von Microsoft Runtime ++ 2017 mit derselben Bitanzahl wie in der Datei &amp;lt;code&amp;gt;FBCLIENT.DLL&amp;lt;/code&amp;gt; erforderlich.}}&lt;br /&gt;
&lt;br /&gt;
===Internet===&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;&#039;WebBroker auf Android&#039;&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
* Die WebBroker-Serveranwendungen können jetzt auf Android-Geräten oder Entwicklerboards (wie Raspberry Pi mit dem Android-Betriebssystem) bereitgestellt werden. 32-Bit-Android und 64-Bit-Android werden unterstützt.&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;&#039;DataSnap&#039;&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
* Wir haben Web.Win.ISAPIThreadPool erweitert, um mehr als 64 Threads zuzulassen. Der Variablentyp NumberOfThreads wurde in Cardinal geändert. Die Variable ShutdownTimeout (eine Zeitüberschreitung in Millisekunden, die der Thread-Pool wartet, bevor alle Worker-Threads finalisiert werden) hat den Standardwert 2 Minuten.&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;&#039;RAD Server&#039;&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
* Einige Verbesserungen an der Datenbankstruktur und neue entsprechende REST-SysAdmin-Endpunkte:&lt;br /&gt;
** GET /sysadmin/log – gibt Informationen über den LOG-Tabelleninhalt zurück.&lt;br /&gt;
** POST /sysadmin/log?minTime=&amp;amp;lt;ISO8601 date&amp;amp;gt; – löscht alle Datensätze aus der LOG-Tabelle, die älter als das angegebene Datum/die angegebene Uhrzeit sind.&lt;br /&gt;
** DELETE /sysadmin/log – löscht alle Datenätze aus der LOG-Tabelle.&lt;br /&gt;
** GET /sysadmin/backup?backupFile=&amp;amp;lt;file path&amp;amp;gt; – erstellt eine angegebene Sicherungsdatei der Datenbank emsserver.ib. Die Sicherungsdatei wird auf dem InterBase-Server gespeichert.&lt;br /&gt;
** POST /sysadmin/backup?backupFile=&amp;amp;lt;file path&amp;amp;gt; – stellt die Datenbank emsserver.ib aus der angegebenen Sicherungsdatei wieder her. Die Sicherungsdatei wird auf dem InterBase-Server gespeichert.&lt;br /&gt;
** GET /sysadmin/validate – führt eine Validierung der emsserver.ib-Datenbank durch und gibt den Datenbankstatus zurück.&lt;br /&gt;
* RAD Server-Benutzer können sich von mehr als einer Sitzung aus gleichzeitig anmelden.&lt;br /&gt;
* Neue Bereitstellungsfunktion für RSLite&lt;br /&gt;
** Option in EMS.INI zum Auswählen einer bestimmten Interbase-Clientbibliothek (für eingebettete oder reguläre DB) mit dem Eintrag &amp;quot;ClientLib&amp;quot; im Abschnitt &amp;quot;Data&amp;quot;.&lt;br /&gt;
** Es gibt jetzt eine gebrauchsfertige Bereitstellungsfunktion für RSLite.&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;&#039;Sonstiges&#039;&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
* Eine Option zum Auswählen eines clientseitigen Zertifikats im REST-Debugger.&lt;br /&gt;
* Der REST-Debugger ist jetzt DPI-fähig.&lt;br /&gt;
* Die Klasse TCustomRESTRequest hat die neue Eigenschaft BodyCodePage, die die Codeseite des Anforderungsrumpfs angibt. Einige der speziellen Werte sind:&lt;br /&gt;
** -1 (der Standardwert) – die Standardcodierung der Plattform verwenden&lt;br /&gt;
** 0 – aktuell aktive Codeseite&lt;br /&gt;
** 65001 – UTF8&lt;br /&gt;
* Unterstützung für das Umschalten der Region in AmazonAPI&lt;br /&gt;
&lt;br /&gt;
===Siehe auch===&lt;br /&gt;
&lt;br /&gt;
* [[Installationshinweise|Installationshinweise]]&lt;br /&gt;
* [[Release-Hinweise|Release-Hinweise]]&lt;br /&gt;
* [[New features and customer reported issues fixed in RAD Studio 11.1|Neue Funktionen und behobene Probleme]]&lt;br /&gt;
* [[Neuerungen in den letzten Releases|Neuerungen in den letzten Releases]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Alexandria]]&lt;br /&gt;
&lt;br /&gt;
[[en:11 Alexandria - Release 1]]&lt;br /&gt;
[[ja:11 Alexandria - Release 1]]&lt;/div&gt;</summary>
		<author><name>Nicolas.rios</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Aktualisieren_von_VCL-Stilen&amp;diff=218849</id>
		<title>Aktualisieren von VCL-Stilen</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Aktualisieren_von_VCL-Stilen&amp;diff=218849"/>
		<updated>2024-04-25T13:40:04Z</updated>

		<summary type="html">&lt;p&gt;Nicolas.rios: Added &amp;lt;code&amp;gt; to clActiveCaption&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Parent|Arbeiten mit VCL-Stilen}}&lt;br /&gt;
&lt;br /&gt;
Wenn Sie das Erscheinungsbild einer VCL-Anwendung ändern möchten, müssen Sie manchmal die VCL-Stile aktualisieren. Ansonsten kann es zu IDE-Problemen im Zusammenhang mit Folgendem kommen:&lt;br /&gt;
&lt;br /&gt;
* Titeltext&lt;br /&gt;
* Schaltflächen auf der Titelleiste&lt;br /&gt;
* Titel des angedockten Formulars&lt;br /&gt;
* Symbole&lt;br /&gt;
&lt;br /&gt;
[[Image:Copper Before.png|900px|link=|border]]&lt;br /&gt;
&lt;br /&gt;
Um dieses Problem zu beheben, können Sie den VCL-Stil im Bitmap-Stil-Designer aktualisieren. &lt;br /&gt;
&lt;br /&gt;
==Konfigurieren Ihres VCL-Stils==&lt;br /&gt;
&lt;br /&gt;
Sie können die System- und Schriftfarben für den VCL-Stil wie folgt ändern:&lt;br /&gt;
&lt;br /&gt;
# Wählen Sie {{Menu|Tools &amp;amp;gt; [[Bitmap-Stil-Designer|Bitmap-Stil-Designer]]}} aus.&lt;br /&gt;
# Wählen Sie in der Objekthierarchie die Option &#039;&#039;&#039;Syscolors&#039;&#039;&#039; aus.&lt;br /&gt;
# Aktivieren Sie in der Ansicht &amp;quot;Systemfarben&amp;quot; die Farben &amp;lt;code&amp;gt;clActiveCaption&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;clCaptionText&amp;lt;/code&amp;gt;. &amp;lt;br /&amp;gt;[[Image:System ColorsI.png|link=|border]]&amp;lt;br /&amp;gt;{{Note|Wenn die oben genannten Fehler auftreten, haben &amp;lt;code&amp;gt;clActiveCaption&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;clCaptionText&amp;lt;/code&amp;gt; möglicherweise dieselbe Farbkonfiguration. Wenn Sie die Konfiguration ändern, können Sie dieses Problem beheben.}}&lt;br /&gt;
# Legen Sie unterschiedliche Farben dafür fest. &amp;lt;br /&amp;gt;[[Image:System Colors GoodI.png|link=|border]]&lt;br /&gt;
# Speichern Sie die Änderungen.&lt;br /&gt;
# Nach dem Speichern der Änderungen und dem Öffnen der IDE ist das Problem behoben.&amp;lt;br /&amp;gt;[[Image:VCLSyst.png|link=|border]]&lt;br /&gt;
&lt;br /&gt;
==Relevante System- und Schriftfarben==&lt;br /&gt;
&lt;br /&gt;
Neben der Überprüfung der obigen Konfiguration gibt es noch weitere Parameter, die Sie überprüfen sollten, wenn Sie Probleme mit der Benutzeroberfläche haben.&lt;br /&gt;
&lt;br /&gt;
===Systemfarben===&lt;br /&gt;
&lt;br /&gt;
clActiveCaption, clInActiveCaption, clCaptionText, clInActiveCaptionText, clWindow, clWindowsText, clBtnFace, clBtnText&lt;br /&gt;
&lt;br /&gt;
===Schriftfarben===&lt;br /&gt;
&lt;br /&gt;
CategoryButtonsCategoryNormal,  CategoryButtonsCategorySelected,  CategoryButtonsCNormal, StaticTextNormal, RadioButtonTextNormal, CheckBoxTextNormal.&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
&lt;br /&gt;
* [[Überblick über VCL-Stile|Überblick über VCL-Stile]]&lt;br /&gt;
* [[Bitmap-Stil-Designer|Bitmap-Stil-Designer]]&lt;br /&gt;
* [[Erstellen eines Stils mit dem Bitmap-Stil-Designer|Erstellen eines Stils mit dem Bitmap-Stil-Designer]]&lt;br /&gt;
* [[Arbeiten mit Bildern im Bitmap-Stil-Designer|Arbeiten mit Bildern im Bitmap-Stil-Designer]]&lt;br /&gt;
* [[Verwenden von IDE-Stilen in Plugins von Fremdherstellern|Verwenden von IDE-Stilen in Plugins von Fremdherstellern]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Mit Delphi fﾃｼr Windows arbeiten]]&lt;br /&gt;
[[Category:Delphi]]&lt;br /&gt;
&lt;br /&gt;
[[en:Updating VCL Styles]]&lt;br /&gt;
[[ja:VCL スタイルの更新]]&lt;/div&gt;</summary>
		<author><name>Nicolas.rios</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Anwendungsentwicklung_f%C3%BCr_Linux&amp;diff=218596</id>
		<title>Anwendungsentwicklung für Linux</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Anwendungsentwicklung_f%C3%BCr_Linux&amp;diff=218596"/>
		<updated>2024-03-22T14:41:15Z</updated>

		<summary type="html">&lt;p&gt;Nicolas.rios: RS-121905&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mit RAD Studio können Sie Anwendungen für die Linux-Plattform entwickeln. Wenn RAD Studio auf einem Windows-Computer installiert ist, können Sie eine 64-Bit-Linux-Anwendung entwickeln und sie auf einem Linux-Computer bereitstellen.&lt;br /&gt;
Die Entwicklung von Linux-Anwendungen ist mit der Entwicklung von Android-Apps in RAD Studio vergleichbar. Für Linux können Sie allerdings keine visuellen VCL- und FireMonkey-Anwendungen erstellen. Die folgenden Apps sind für die Linux-Plattform verfügbar:&lt;br /&gt;
&lt;br /&gt;
* Konsolenanwendung&lt;br /&gt;
* EMS-Package (RAD Server)&lt;br /&gt;
* DataSnap&lt;br /&gt;
* DataSnap-WebBroker&lt;br /&gt;
* WebBroker&lt;br /&gt;
* Dynamische Linkbibliotheken&lt;br /&gt;
* DUnitX-Projekt&lt;br /&gt;
&lt;br /&gt;
==Voraussetzungen==&lt;br /&gt;
&lt;br /&gt;
Um Linux-Anwendungen zu entwickeln, benötigen Sie einen Windows-PC, auf dem RAD Studio installiert ist, sowie einen Computer mit der Linux-Plattform (kann eine virtuelle Maschine sein).&lt;br /&gt;
&lt;br /&gt;
==Vorbereiten der Linux-Entwicklungsumgebung==&lt;br /&gt;
&lt;br /&gt;
So bereiten Sie Ihr Entwicklungssystem (PC) und den Linux-Computer für die Anwendungsentwicklung mit RAD Studio vor:&lt;br /&gt;
&lt;br /&gt;
# Installieren Sie RAD Studio auf dem Windows-PC.&lt;br /&gt;
# [[Anwendungsentwicklung für Linux#Installieren von Entwicklungs-Packages|Installieren von Entwicklungs-Packages]]&lt;br /&gt;
# [[Anwendungsentwicklung für Linux#Vorbereiten_des_Linux-Computers|Bereiten Sie den Linux-Computer vor]].&lt;br /&gt;
# [[Anwendungsentwicklung für Linux#Erstellen_eines_Verbindungsprofils|Erstellen Sie ein Verbindungsprofil]].&lt;br /&gt;
# [[Anwendungsentwicklung für Linux#Hinzufügen_des_installierten_SDK_zu_RAD_Studio|Fügen Sie RAD Studio das installierte SDK hinzu]].&lt;br /&gt;
# [[Anwendungsentwicklung für Linux#Ausführen_von_PAServer_auf_dem_Linux-Computer|Führen Sie PAServer auf dem Linux-Computer aus]].&lt;br /&gt;
&lt;br /&gt;
===Installieren von Entwicklungs-Packages===&lt;br /&gt;
&lt;br /&gt;
So installieren Sie Entwicklungs-Packages auf Ubuntu:&lt;br /&gt;
&lt;br /&gt;
# Klicken Sie auf dem Desktop mit der rechten Maustaste, und wählen Sie &#039;&#039;&#039;Terminal öffnen&#039;&#039;&#039;.&lt;br /&gt;
# Um für bereits installierte Packages ein Upgrade durchzuführen, geben Sie in das Terminal &amp;lt;code&amp;gt; sudo apt update &amp;amp;amp;&amp;amp;amp; sudo apt upgrade &amp;amp;amp;&amp;amp;amp; sudo apt dist-upgrade&amp;lt;/code&amp;gt; ein. &lt;br /&gt;
# Geben Sie Ihr Benutzerpasswort ein, und drücken Sie die &#039;&#039;&#039;Eingabetaste&#039;&#039;&#039;.&lt;br /&gt;
# Warten Sie, bis Sie aufgefordert werden, dem Upgrade der Packages zuzustimmen. Geben Sie &#039;&#039;&#039;J&#039;&#039;&#039; ein, und drücken Sie die &#039;&#039;&#039;Eingabetaste&#039;&#039;&#039;.&lt;br /&gt;
# Warten Sie, bis das Upgrade der Packages abgeschlossen ist. Dies kann einige Minuten dauern.&lt;br /&gt;
# Geben Sie zum Hinzufügen von Entwicklungs-Packages im Terminal &amp;lt;code&amp;gt; sudo apt install joe wget p7zip-full curl openssh-server build-essential zlib1g-dev libcurl4-gnutls-dev libncurses5&amp;lt;/code&amp;gt; ein.&lt;br /&gt;
# Geben Sie Ihr Benutzerpasswort ein, und drücken Sie die &#039;&#039;&#039;Eingabetaste&#039;&#039;&#039;.&lt;br /&gt;
# Warten Sie, bis Sie aufgefordert werden, der Installation der Packages zuzustimmen. Geben Sie &#039;&#039;&#039;J&#039;&#039;&#039; ein, und drücken Sie die &#039;&#039;&#039;Eingabetaste&#039;&#039;&#039;.&lt;br /&gt;
# Warten Sie, bis die Installation der Packages abgeschlossen ist. Dies kann einige Minuten dauern.&lt;br /&gt;
&lt;br /&gt;
So installieren Sie Entwicklungs-Packages auf Red Hat:&lt;br /&gt;
&lt;br /&gt;
# Klicken Sie auf dem Desktop mit der rechten Maustaste, und wählen Sie &#039;&#039;&#039;Terminal öffnen&#039;&#039;&#039;. &lt;br /&gt;
# Geben Sie &amp;lt;code&amp;gt;yum groupinstall &#039;Development Tools&#039;&amp;lt;/code&amp;gt; in das Terminal ein.&lt;br /&gt;
# Drücken Sie die &#039;&#039;&#039;Eingabetaste&#039;&#039;&#039;, und warten Sie, bis die Installation der Packages abgeschlossen ist. Dies kann einige Minuten dauern.&lt;br /&gt;
&lt;br /&gt;
===Vorbereiten des Linux-Computers===&lt;br /&gt;
&lt;br /&gt;
Um Linux-Anwendungen zu erstellen, müssen Sie eine virtuelle Maschinen mit PAServer hinzufügen:&lt;br /&gt;
&lt;br /&gt;
: 1. Suchen Sie die Datei &amp;lt;code&amp;gt;{{PAServerLinuxInstallerFile}}&amp;lt;/code&amp;gt; im folgenden Verzeichnis: &lt;br /&gt;
::{{Path|{{InstallPath}}\PAServer\{{PAServerLinuxInstallerFile}}}}&lt;br /&gt;
: 2. Entpacken Sie die Datei &amp;lt;code&amp;gt;{{PAServerLinuxInstallerFile}}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
So verwenden Sie die Unit &amp;lt;code&amp;gt;System.zLib&amp;lt;/code&amp;gt; unter Red Hat:&lt;br /&gt;
&lt;br /&gt;
: 1. Installieren Sie die Bibliothek &amp;lt;code&amp;gt;zLib-devel&amp;lt;/code&amp;gt; mit dem folgenden Befehl auf Ihrem RHEL-Computer:&lt;br /&gt;
:: &amp;lt;code&amp;gt;sudo yum install zlib-devel &amp;lt;/code&amp;gt;&lt;br /&gt;
: 2. Aktualisieren Sie den lokalen SDK-Zwischenspeicher.&lt;br /&gt;
&lt;br /&gt;
So verwenden Sie die Unit &amp;lt;code&amp;gt;System.zLib&amp;lt;/code&amp;gt; unter Ubuntu:&lt;br /&gt;
&lt;br /&gt;
: 1. Installieren Sie die Bibliothek &amp;lt;code&amp;gt;zLib-devel&amp;lt;/code&amp;gt; mit dem folgenden Befehl auf Ihrem Ubuntu-Computer:&lt;br /&gt;
:: &amp;lt;code&amp;gt;sudo apt-get install zlib1g-dev &amp;lt;/code&amp;gt;&lt;br /&gt;
: 2. Aktualisieren Sie den lokalen SDK-Zwischenspeicher.&lt;br /&gt;
&lt;br /&gt;
===Erstellen eines Verbindungsprofils===&lt;br /&gt;
&lt;br /&gt;
# Klicken Sie mit der rechten Maustaste auf den Ordner, in dem Sie die Datei &amp;lt;code&amp;gt;{{PAServerLinuxInstallerFile}}&amp;lt;/code&amp;gt; entpackt haben, und klicken Sie dann auf &#039;&#039;&#039;Im Terminal öffnen&#039;&#039;&#039;.&lt;br /&gt;
# Geben Sie im Terminal &amp;lt;code&amp;gt;./paserver&amp;lt;/code&amp;gt; ein. Drücken Sie dann &#039;&#039;&#039;Eingabe&#039;&#039;&#039;.&lt;br /&gt;
# Klicken Sie auf der Seite &amp;lt;font color=&amp;quot;#598527&amp;quot;&amp;gt; &#039;&#039;&#039;Tools &amp;amp;gt; Optionen &amp;amp;gt; Umgebungsoptionen &amp;amp;gt; Verbindungsprofil-Manager&#039;&#039;&#039;&amp;lt;/font&amp;gt; auf die Schaltfläche &#039;&#039;&#039;Hinzufügen&#039;&#039;&#039;. Der Experte &#039;&#039;&#039;Verbindungsprofil erstellen&#039;&#039;&#039; wird geöffnet.&lt;br /&gt;
# Geben Sie auf der Seite &#039;&#039;&#039;Profilinformation&#039;&#039;&#039; Folgendes ein:&lt;br /&gt;
#* Geben Sie in das Feld &#039;&#039;&#039;Profilname&#039;&#039;&#039; den erforderlichen Namen ein.&lt;br /&gt;
#* Klicken Sie im Feld &#039;&#039;&#039;Plattform&#039;&#039;&#039; auf die Plattform &#039;&#039;&#039;64-Bit-Linux&#039;&#039;&#039;.&lt;br /&gt;
#* Klicken Sie auf &#039;&#039;&#039;Weiter&#039;&#039;&#039;.&lt;br /&gt;
# Geben Sie auf der Seite &#039;&#039;&#039;Informationen zum Remote-Computer&#039;&#039;&#039; Folgendes ein:&lt;br /&gt;
#* Geben Sie in das Feld &#039;&#039;&#039;Remote-Computer&#039;&#039;&#039; die IP-Adresse oder den Namen des Computers ein. &lt;br /&gt;
#* Klicken Sie auf &#039;&#039;&#039;Verbindung testen&#039;&#039;&#039;, um die Gültigkeit der eingegebenen Werte zu überprüfen.&lt;br /&gt;
# Klicken Sie auf &#039;&#039;&#039;Fertig stellen&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
===Hinzufügen des installierten SDK zu RAD Studio===&lt;br /&gt;
&lt;br /&gt;
# Klicken Sie auf der Seite &amp;lt;font color=&amp;quot;#598527&amp;quot;&amp;gt; &#039;&#039;&#039;Tools &amp;amp;gt; Optionen &amp;amp;gt; Umgebungsoptionen &amp;amp;gt; SDK-Manager&#039;&#039;&#039;&amp;lt;/font&amp;gt; auf die Schaltfläche &#039;&#039;&#039;Hinzufügen&#039;&#039;&#039;.&lt;br /&gt;
# Geben Sie im Dialogfeld &#039;&#039;&#039;Neues SDK hinzufügen&#039;&#039;&#039; Folgendes ein:&lt;br /&gt;
#* Klicken Sie im Feld &#039;&#039;&#039;Plattform auswählen&#039;&#039;&#039; auf &#039;&#039;&#039;64-Bit-Linux&#039;&#039;&#039;.&lt;br /&gt;
#* Wählen Sie im Feld &#039;&#039;&#039;Profil für Verbindung auswählen&#039;&#039;&#039; ein erstelltes Profil aus der Dropdown-Liste aus.&lt;br /&gt;
#* Im Feld &#039;&#039;&#039;SDK-Version auswählen&#039;&#039;&#039; wird automatisch der Name des SDK, das Sie gerade installiert haben, angezeigt. Wenn Sie das SDK nicht installiert haben, können Sie das in diesem Schritt nachholen. Wenn Sie das SDK bereits installiert haben, fahren Sie mit dem nächsten Schritt fort.&lt;br /&gt;
&lt;br /&gt;
===Ausführen von PAServer auf einem Linux-Computer===&lt;br /&gt;
&lt;br /&gt;
So führen Sie den PAServer auf einem Linux-Computer aus:&lt;br /&gt;
&lt;br /&gt;
* Öffnen Sie das Terminal, und führen Sie PAServer im Terminal aus.&lt;br /&gt;
&lt;br /&gt;
==Entwickeln von Anwendungen==&lt;br /&gt;
&lt;br /&gt;
# Wählen Sie den Projekttyp für Ihre &#039;&#039;&#039;Delphi&#039;&#039;&#039;-Anwendung aus.&lt;br /&gt;
#*&amp;lt;font color=&amp;quot;#598527&amp;quot;&amp;gt;&#039;&#039;&#039;Datei &amp;amp;gt; Neu &amp;amp;gt; Weitere &amp;amp;gt; Delphi-Projekte:&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
#** Konsolenanwendung&lt;br /&gt;
#** DUnitX-Projekt&lt;br /&gt;
#** Dynamische Link-Bibliothek&lt;br /&gt;
#** Package&lt;br /&gt;
#*&amp;lt;font color=&amp;quot;#598527&amp;quot;&amp;gt;&#039;&#039;&#039;Datei &amp;amp;gt; Neu &amp;amp;gt; Weitere &amp;amp;gt; Delphi-Projekte &amp;amp;gt; DataSnap-Server:&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
#** DataSnap-Server&lt;br /&gt;
#** DataSnap-WebBroker&lt;br /&gt;
#* &amp;lt;font color=&amp;quot;#598527&amp;quot;&amp;gt;&#039;&#039;&#039;Datei &amp;amp;gt; Neu &amp;amp;gt; Weitere &amp;amp;gt; Delphi-Projekte &amp;amp;gt; WebBroker &amp;amp;gt; WebBroker-Anwendung&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
&lt;br /&gt;
* [[Anwendungsentwicklung für Linux#Installieren_des_Linux-SDK|Installieren Sie das Linux-SDK]].&lt;br /&gt;
* [[Anwendungsentwicklung für Linux#Vorbereiten_des_Linux-Computers|Bereiten Sie den Linux-Computer vor]].&lt;br /&gt;
* [[Anwendungsentwicklung für Linux#Erstellen_eines_Verbindungsprofils|Erstellen Sie ein Verbindungsprofil]].&lt;br /&gt;
* [[Anwendungsentwicklung für Linux#Hinzufügen_des_installierten_SDK_zu_RAD_Studio|Fügen Sie RAD Studio das installierte SDK hinzu]].&lt;br /&gt;
* [[Anwendungsentwicklung für Linux#Ausführen_von_PAServer_auf_dem_Linux-Computer|Führen Sie PAServer auf dem Linux-Computer aus]].&lt;br /&gt;
* [[FireMonkey for Linux]]&lt;br /&gt;
* [[Linux-Konsolenanwendung &amp;quot;Hello World&amp;quot; erstellen|Linux-Konsolenanwendung &amp;quot;Hello World&amp;quot; erstellen]]&lt;br /&gt;
* [[Warnmeldungen (Delphi)|Warnmeldungen (Delphi)]]&lt;br /&gt;
* [https://chapmanworld.com/2016/12/29/configure-delphi-and-redhat-or-ubuntu-for-linux-development/%7CConfigure Delphi and RedHat or Ubuntu for Linux development (EN)]&lt;br /&gt;
* [https://community.idera.com/developer-tools/b/blog/posts/preparing-ubuntu-16-04-lts-for-linux-development-with-upcoming-delphi-10-2---part-2%7CPreparing Ubuntu 16.04 LTS for Linux Development with Upcoming Delphi 10.2 (EN)]&lt;br /&gt;
&lt;br /&gt;
{{DEFAULTSORT:Anwendungsentwicklung fur Linux}}&lt;br /&gt;
&lt;br /&gt;
[[en:Linux Application Development]]&lt;br /&gt;
[[fr:Développement d&#039;applications Linux]]&lt;br /&gt;
[[ja:Linux アプリケーション開発]]&lt;/div&gt;</summary>
		<author><name>Nicolas.rios</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=InterBase-Datenbankverschl%C3%BCsselung&amp;diff=218595</id>
		<title>InterBase-Datenbankverschlüsselung</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=InterBase-Datenbankverschl%C3%BCsselung&amp;diff=218595"/>
		<updated>2024-03-20T19:57:10Z</updated>

		<summary type="html">&lt;p&gt;Nicolas.rios: {{Note|&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Parent|Datenbankanwendungen entwickeln}}&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;&#039;InterBase-Verschlüsselung&#039;&#039;&#039; wird ab InterBase 2009 unterstützt. InterBase ermöglicht die Verschlüsselung von Informationen auf einer oder zwei der folgenden Ebenen:&lt;br /&gt;
&lt;br /&gt;
* Verschlüsselung auf Datenbankebene (InterBase verschlüsselt alle Datenbankseiten, die Benutzerinformationen enthalten).&lt;br /&gt;
* Verschlüsselung auf Spaltenebene (die Verschlüsselung auf Spaltenebene ist flexibler und spezifischer).&lt;br /&gt;
&lt;br /&gt;
Mit der &#039;&#039;&#039;InterBase-Datenbankverschlüsselung&#039;&#039;&#039; können Sie auch Datenbanksicherungsdateien verschlüsseln. Weitere Informationen zur Verschlüsselung von Daten mit InterBase finden Sie im &#039;&#039;&#039;[https://docwiki.embarcadero.com/InterBase/2020/en/Data_Definition_Guide Data Definition Guide (EN)]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==Erstellen von Verschlüsselungen mit InterBase==&lt;br /&gt;
&lt;br /&gt;
Um bestimmte Verschlüsselungsaufgaben in InterBase zu erstellen, müssen Sie den &#039;&#039;&#039;Eigentümer der Systemdatensicherheit (SYSDSO, System Data Security Owner)&#039;&#039;&#039; anlegen. Beide Benutzer, der &#039;&#039;&#039;SYSDSO&#039;&#039;&#039; und der &#039;&#039;&#039;SYSDBA&#039;&#039;&#039; (Datenbankeigentümer), sind für die &#039;&#039;&#039;InterBase-Verschlüsselung&#039;&#039;&#039; verantwortlich. In der folgenden Tabelle sind die Unterschiede zwischen den Aufgaben der beiden Benutzer aufgeführt:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; frame=&amp;quot;hsides&amp;quot; rules=&amp;quot;rows&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;Berechtigungen&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039; Datenbank-&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;br /&amp;gt;eigentümer&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039; SYSDSO&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Erstellen von Verschlüsselungsschlüsseln&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; |&#039;&#039;&#039;NEIN&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; |&amp;lt;font color=&amp;quot;#598527&amp;quot;&amp;gt;&#039;&#039;&#039;JA&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Festlegen des &#039;&#039;&#039;SEP&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; |&#039;&#039;&#039;NEIN&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; |&amp;lt;font color=&amp;quot;#598527&amp;quot;&amp;gt;&#039;&#039;&#039;JA&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Erteilen von Verschlüsselungsberechtigungen&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; |&#039;&#039;&#039;NEIN&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; |&amp;lt;font color=&amp;quot;#598527&amp;quot;&amp;gt;&#039;&#039;&#039;JA&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Verschlüsseln der Datenbank&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; |&amp;lt;font color=&amp;quot;#598527&amp;quot;&amp;gt;&#039;&#039;&#039;JA&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; |&#039;&#039;&#039;NEIN&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Verschlüsseln von Spalten&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; |&amp;lt;font color=&amp;quot;#598527&amp;quot;&amp;gt;&#039;&#039;&#039;JA&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; |&#039;&#039;&#039;NEIN&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Erteilen von Entschlüsselungsberechtigungen&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; |&amp;lt;font color=&amp;quot;#598527&amp;quot;&amp;gt;&#039;&#039;&#039;JA&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; |&#039;&#039;&#039;NEIN&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Darüber hinaus können Verschlüsselungsaufgaben von jedem einzelnen Tabellenbenutzer mit der Berechtigung zum Verschlüsseln von Spalten in einer Tabelle durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
==Verschlüsseln einer Datenbank mit IBConsole==&lt;br /&gt;
&lt;br /&gt;
InterBase bietet zwei Möglichkeiten zur Verschlüsselung von Datenbanken. Die Verschlüsselung kann mit &#039;&#039;&#039;isql&#039;&#039;&#039; aktiviert und implementiert werden, oder Sie können mit &#039;&#039;&#039;IBConsole&#039;&#039;&#039; eine Datenbank verschlüsseln. In diesem Thema wird die zweite Option – &#039;&#039;&#039;Verschlüsseln einer Datenbank mit IBConsole&#039;&#039;&#039; – verwendet.&lt;br /&gt;
&lt;br /&gt;
Führen Sie die folgenden Schritte aus, um eine Verschlüsselung beim Erstellen einer neuen Datenbank durchzuführen:&lt;br /&gt;
&lt;br /&gt;
# Öffnen Sie &#039;&#039;&#039;IBConsole&#039;&#039;&#039;.&lt;br /&gt;
# Wählen Sie aus dem Menü &amp;lt;font color=&amp;quot;#598527&amp;quot;&amp;gt;&#039;&#039;&#039;Server &amp;amp;gt; Login&#039;&#039;&#039;&amp;lt;/font&amp;gt;.&lt;br /&gt;
# Melden Sie sich als &#039;&#039;&#039;SYSDBA&#039;&#039;&#039; oder als Datenbankeigentümer an.&lt;br /&gt;
# Wählen Sie aus dem Menü &amp;lt;font color=&amp;quot;#598527&amp;quot;&amp;gt;&#039;&#039;&#039;Database &amp;amp;gt; Create Database&#039;&#039;&#039;&amp;lt;/font&amp;gt;.&lt;br /&gt;
# Wählen Sie im Feld &#039;&#039;&#039;Save In&#039;&#039;&#039; den Ordner aus, in dem die Datenbank gespeichert werden soll.&lt;br /&gt;
# Geben Sie einen Dateinamen an, und klicken Sie auf &#039;&#039;&#039;Save&#039;&#039;&#039;. Das Dialogfeld wird geschlossen.&lt;br /&gt;
# Ändern Sie den Wert im Feld &#039;&#039;&#039;Embedded User Authentication&#039;&#039;&#039; in &#039;&#039;&#039;Yes&#039;&#039;&#039;.&lt;br /&gt;
#: {{Note| Das Feld &#039;&#039;&#039;Use Encryption&#039;&#039;&#039; ist jetzt sichtbar.}}&lt;br /&gt;
# Ändern Sie den Wert im Feld &#039;&#039;&#039;Use Encryption&#039;&#039;&#039; in &#039;&#039;&#039;Yes&#039;&#039;&#039;.&lt;br /&gt;
#: [[File:CreateDatabase-Encryption.png]]&lt;br /&gt;
# Klicken Sie auf die Schaltfläche &#039;&#039;&#039;OK&#039;&#039;&#039;, um eine Datenbank zu erstellen.&lt;br /&gt;
# Geben Sie Ihre Verbindungsinformationen ein, und klicken Sie auf die Schaltfläche &#039;&#039;&#039;Connect&#039;&#039;&#039;.&lt;br /&gt;
# Klicken Sie im &amp;quot;Encryption Wizard&amp;quot; auf die Schaltfläche &#039;&#039;&#039;Next&#039;&#039;&#039;.&lt;br /&gt;
# Geben Sie das &#039;&#039;&#039;SYSDSO&#039;&#039;&#039;-Passwort ein, und klicken Sie auf die Schaltfläche &#039;&#039;&#039;Next&#039;&#039;&#039;.&lt;br /&gt;
# Geben Sie das &#039;&#039;&#039;SEP&#039;&#039;&#039;-Passwort ein, und klicken Sie auf die Schaltfläche &#039;&#039;&#039;Next&#039;&#039;&#039;.&lt;br /&gt;
#: [[File:ExternalOptionEnc.png]]&lt;br /&gt;
#: {{Note| Die Option &#039;&#039;&#039;External&#039;&#039;&#039; erschwert es nicht autorisierten Benutzern, auf eine verschlüsselte Datenbank auf einem mobilen Gerät, wie einem Laptop-Computer, oder auf einem gesicherten Desktop-Computer zuzugreifen.}}&lt;br /&gt;
# Geben Sie den Namen für den &#039;&#039;&#039;Encryption Key&#039;&#039;&#039; ein.&lt;br /&gt;
# Wählen Sie für die Option &amp;quot;Cipher&amp;quot; &#039;&#039;&#039;DES&#039;&#039;&#039; aus.&lt;br /&gt;
# Klicken Sie auf &#039;&#039;&#039;OK&#039;&#039;&#039;.&lt;br /&gt;
#: [[File:EncryptionKeyWiz.png]]&lt;br /&gt;
# Geben Sie den Namen und das Passwort für &amp;quot;BackupKey&amp;quot; ein.&lt;br /&gt;
#: {{Note| Um die Sicherheit und Vertraulichkeit von verschlüsselten Datenbanken aufrechtzuerhalten, müssen Sie auch die Datenbanksicherungsdateien verschlüsseln.}}&lt;br /&gt;
# Klicken Sie auf &#039;&#039;&#039;OK&#039;&#039;&#039;.&lt;br /&gt;
#: [[File:EncDBCompleted.png]]&lt;br /&gt;
# Klicken Sie im angezeigten Dialogfeld auf die Schaltfläche &#039;&#039;&#039;OK&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==Parameter für das Systemverschlüsselungspasswort in InterBase==&lt;br /&gt;
&lt;br /&gt;
Bei einer verschlüsselten Datenbank in InterBase kann das &#039;&#039;&#039;SEP&#039;&#039;&#039; (System Encryption Password, Systemverschlüsselungspasswort) &#039;&#039;&#039;intern&#039;&#039;&#039; (Vorgabe, keine Verwendung eines Schlüsselwortes) oder &#039;&#039;&#039;extern&#039;&#039;&#039; (Verwendung eines Schlüsselwortes) festlegt werden.&lt;br /&gt;
&lt;br /&gt;
* Das &#039;&#039;&#039;interne SEP&#039;&#039;&#039; ermöglicht, dass von Datenbankbenutzern auf die Datenbank zugegriffen werden kann, wenn die Datenbank bereits einmal mit dem &#039;&#039;&#039;SEP&#039;&#039;&#039; auf diesem Computer verwendet wurde. Bei folgenden Verbindungen oder einer Verbindung nach einem Neustart muss der &#039;&#039;&#039;SEP&#039;&#039;&#039;-Wert nicht angegeben werden. Wenn die &#039;&#039;&#039;{{Product}}&#039;&#039;&#039;-Anwendung auf einem Mac oder einem mobilen Gerät bereitgestellt wird, dann ist für die erste Verbindung der &#039;&#039;&#039;SEP&#039;&#039;&#039;-Parameterwert erforderlich.&lt;br /&gt;
* Bei Datenbanken, für die ein &#039;&#039;&#039;externes SEP&#039;&#039;&#039; festgelegt ist, muss bei der ersten Verbindung der &#039;&#039;&#039;SEP&#039;&#039;&#039;-Parameterwert angegeben werden. Nach einem Neustart des Computers muss die Anwendung bei der ersten Verbindung das &#039;&#039;&#039;SEP&#039;&#039;&#039; angeben. Das externe &#039;&#039;&#039;Systemverschlüsselungspasswort&#039;&#039;&#039; ist für mobile Geräte sicherer.&lt;br /&gt;
*: {{Note| Aktivieren Sie zum Festlegen des externen &#039;&#039;&#039;SEP&#039;&#039;&#039; im &amp;quot;Encryption Wizard&amp;quot; die Option &#039;&#039;&#039;External&#039;&#039;&#039;, oder verwenden Sie den Befehl &amp;lt;code&amp;gt;alter database set system encryption password &amp;amp;lt;String mit 255 Zeichen&amp;amp;gt; [external]&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
{{f|dbexpress|&lt;br /&gt;
&lt;br /&gt;
===Systemverschlüsselungspasswort in dbExpress===&lt;br /&gt;
&lt;br /&gt;
Bei &#039;&#039;&#039;dbExpress&#039;&#039;&#039; können Sie den &#039;&#039;&#039;SEP&#039;&#039;&#039;-Wert in der [[lib_de:Data.SqlExpr.TSQLConnection|TSQLConnection]]-&#039;&#039;&#039;Params&#039;&#039;&#039;-Sammlung festlegen oder den &#039;&#039;&#039;SEP&#039;&#039;&#039;-Wert programmseitig setzen.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[File:ValueListEditorDBX.png]]&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Delphi&amp;quot;&amp;gt;&lt;br /&gt;
 procedure TForm10.BtnConnectClick(Sender: TObject);&lt;br /&gt;
 begin&lt;br /&gt;
   try&lt;br /&gt;
     SQLConnection1.Params.Values[&#039;SEP&#039;]:=&#039;password&#039;;&lt;br /&gt;
     SQLConnection1.Connected:=true;&lt;br /&gt;
   except&lt;br /&gt;
     on E:Exception do&lt;br /&gt;
         ShowMessage(E.ClassName + &#039; &#039; + E.Message);&lt;br /&gt;
   end;&lt;br /&gt;
 end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Systemverschlüsselungspasswort in FireDAC===&lt;br /&gt;
&lt;br /&gt;
Bei &#039;&#039;&#039;FireDAC&#039;&#039;&#039; können Sie den Parameter &#039;&#039;&#039;SEPassword&#039;&#039;&#039; in den [[lib_de:FireDAC.Comp.Client.TFDConnection|TFDConnection]]-[[Herstellen einer Verbindung zu InterBase (FireDAC)|Verbindungsdefinitionsparametern]] festlegen.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[File:FDConnectionEdt.png]]&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Delphi&amp;quot;&amp;gt;&lt;br /&gt;
 procedure TForm10.BtnConnectClick(Sender: TObject);&lt;br /&gt;
 begin&lt;br /&gt;
   try&lt;br /&gt;
     FDConnection1.Params.Values[&#039;SEPasword&#039;]:=&#039;password&#039;;&lt;br /&gt;
     FDConnection1.Connected:=true;&lt;br /&gt;
   except&lt;br /&gt;
     on E:Exception do&lt;br /&gt;
         ShowMessage(E.ClassName + &#039; &#039; + E.Message);&lt;br /&gt;
   end;&lt;br /&gt;
 end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{f|ibx|&lt;br /&gt;
&lt;br /&gt;
===Systemverschlüsselungspasswort in InterBase Express===&lt;br /&gt;
&lt;br /&gt;
Bei InterBase Express (&#039;&#039;&#039;IBX&#039;&#039;&#039;) wird der Parameter &#039;&#039;&#039;SysEncryptPassword&#039;&#039;&#039;-[[lib_de:IBX.IBDatabase.TIBDatabase|TIBDatabase]] programmseitig festgelegt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Delphi&amp;quot;&amp;gt;&lt;br /&gt;
 procedure TForm10.BtnConnectClick(Sender: TObject);&lt;br /&gt;
 begin&lt;br /&gt;
   try&lt;br /&gt;
      IBDatabase1.SysEncryptPassword:=&#039;password&#039;;&lt;br /&gt;
      IBDatabase1.Open;&lt;br /&gt;
   except&lt;br /&gt;
     on E:Exception do&lt;br /&gt;
         ShowMessage(E.ClassName + &#039; &#039; + E.Message);&lt;br /&gt;
   end;&lt;br /&gt;
 end;&lt;br /&gt;
&amp;lt;/source&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
&lt;br /&gt;
* [[InterBase|InterBase]]&lt;br /&gt;
&lt;br /&gt;
{{f|radstudio|&lt;br /&gt;
&lt;br /&gt;
* [[InterBase ToGo|InterBase ToGo]]&lt;br /&gt;
* [[Lizenzierung von IBLite und IBToGo in RAD Studio|Lizenzierung von IBLite und IBToGo in {{Product}}]]&lt;br /&gt;
* [[Übersicht über die Funktionen von dbExpress|Übersicht über die Funktionen von dbExpress]]&lt;br /&gt;
&lt;br /&gt;
}}{{f|appmethod|&lt;br /&gt;
&lt;br /&gt;
* [[InterBase ToGo|InterBase ToGo]]&lt;br /&gt;
* [[Lizenzierung von IBLite und IBToGo|Lizenzierung von IBLite und IBToGo]]&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
{{f|dbexpress|&lt;br /&gt;
&lt;br /&gt;
* [[Übersicht über die Funktionen von dbExpress|Übersicht über die Funktionen von dbExpress]] &lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
* [[FireDAC|FireDAC]]&lt;br /&gt;
&lt;br /&gt;
{{DEFAULTSORT:InterBase-Datenbankverschlusselung}}&lt;br /&gt;
[[Category:Delphi]]&lt;br /&gt;
[[Category:XE5]]&lt;br /&gt;
[[Category:AMMigrate]]&lt;br /&gt;
&lt;br /&gt;
[[en:InterBase Database Encryption]]&lt;br /&gt;
[[fr:Cryptage de bases de données InterBase]]&lt;br /&gt;
[[ja:InterBase データベース暗号化]]&lt;/div&gt;</summary>
		<author><name>Nicolas.rios</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=InterBase-Datenbankverschl%C3%BCsselung&amp;diff=218594</id>
		<title>InterBase-Datenbankverschlüsselung</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=InterBase-Datenbankverschl%C3%BCsselung&amp;diff=218594"/>
		<updated>2024-03-20T18:05:26Z</updated>

		<summary type="html">&lt;p&gt;Nicolas.rios: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Parent|Datenbankanwendungen entwickeln}}&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;&#039;InterBase-Verschlüsselung&#039;&#039;&#039; wird ab InterBase 2009 unterstützt. InterBase ermöglicht die Verschlüsselung von Informationen auf einer oder zwei der folgenden Ebenen:&lt;br /&gt;
&lt;br /&gt;
* Verschlüsselung auf Datenbankebene (InterBase verschlüsselt alle Datenbankseiten, die Benutzerinformationen enthalten).&lt;br /&gt;
* Verschlüsselung auf Spaltenebene (die Verschlüsselung auf Spaltenebene ist flexibler und spezifischer).&lt;br /&gt;
&lt;br /&gt;
Mit der &#039;&#039;&#039;InterBase-Datenbankverschlüsselung&#039;&#039;&#039; können Sie auch Datenbanksicherungsdateien verschlüsseln. Weitere Informationen zur Verschlüsselung von Daten mit InterBase finden Sie im &#039;&#039;&#039;[https://docwiki.embarcadero.com/InterBase/2020/en/Data_Definition_Guide Data Definition Guide (EN)]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==Erstellen von Verschlüsselungen mit InterBase==&lt;br /&gt;
&lt;br /&gt;
Um bestimmte Verschlüsselungsaufgaben in InterBase zu erstellen, müssen Sie den &#039;&#039;&#039;Eigentümer der Systemdatensicherheit (SYSDSO, System Data Security Owner)&#039;&#039;&#039; anlegen. Beide Benutzer, der &#039;&#039;&#039;SYSDSO&#039;&#039;&#039; und der &#039;&#039;&#039;SYSDBA&#039;&#039;&#039; (Datenbankeigentümer), sind für die &#039;&#039;&#039;InterBase-Verschlüsselung&#039;&#039;&#039; verantwortlich. In der folgenden Tabelle sind die Unterschiede zwischen den Aufgaben der beiden Benutzer aufgeführt:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; frame=&amp;quot;hsides&amp;quot; rules=&amp;quot;rows&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;Berechtigungen&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039; Datenbank-&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;br /&amp;gt;eigentümer&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039; SYSDSO&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Erstellen von Verschlüsselungsschlüsseln&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; |&#039;&#039;&#039;NEIN&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; |&amp;lt;font color=&amp;quot;#598527&amp;quot;&amp;gt;&#039;&#039;&#039;JA&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Festlegen des &#039;&#039;&#039;SEP&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; |&#039;&#039;&#039;NEIN&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; |&amp;lt;font color=&amp;quot;#598527&amp;quot;&amp;gt;&#039;&#039;&#039;JA&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Erteilen von Verschlüsselungsberechtigungen&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; |&#039;&#039;&#039;NEIN&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; |&amp;lt;font color=&amp;quot;#598527&amp;quot;&amp;gt;&#039;&#039;&#039;JA&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Verschlüsseln der Datenbank&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; |&amp;lt;font color=&amp;quot;#598527&amp;quot;&amp;gt;&#039;&#039;&#039;JA&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; |&#039;&#039;&#039;NEIN&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Verschlüsseln von Spalten&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; |&amp;lt;font color=&amp;quot;#598527&amp;quot;&amp;gt;&#039;&#039;&#039;JA&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; |&#039;&#039;&#039;NEIN&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Erteilen von Entschlüsselungsberechtigungen&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; |&amp;lt;font color=&amp;quot;#598527&amp;quot;&amp;gt;&#039;&#039;&#039;JA&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; |&#039;&#039;&#039;NEIN&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Darüber hinaus können Verschlüsselungsaufgaben von jedem einzelnen Tabellenbenutzer mit der Berechtigung zum Verschlüsseln von Spalten in einer Tabelle durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
==Verschlüsseln einer Datenbank mit IBConsole==&lt;br /&gt;
&lt;br /&gt;
InterBase bietet zwei Möglichkeiten zur Verschlüsselung von Datenbanken. Die Verschlüsselung kann mit &#039;&#039;&#039;isql&#039;&#039;&#039; aktiviert und implementiert werden, oder Sie können mit &#039;&#039;&#039;IBConsole&#039;&#039;&#039; eine Datenbank verschlüsseln. In diesem Thema wird die zweite Option – &#039;&#039;&#039;Verschlüsseln einer Datenbank mit IBConsole&#039;&#039;&#039; – verwendet.&lt;br /&gt;
&lt;br /&gt;
Führen Sie die folgenden Schritte aus, um eine Verschlüsselung beim Erstellen einer neuen Datenbank durchzuführen:&lt;br /&gt;
&lt;br /&gt;
# Öffnen Sie &#039;&#039;&#039;IBConsole&#039;&#039;&#039;.&lt;br /&gt;
# Wählen Sie aus dem Menü &amp;lt;font color=&amp;quot;#598527&amp;quot;&amp;gt;&#039;&#039;&#039;Server &amp;amp;gt; Login&#039;&#039;&#039;&amp;lt;/font&amp;gt;.&lt;br /&gt;
# Melden Sie sich als &#039;&#039;&#039;SYSDBA&#039;&#039;&#039; oder als Datenbankeigentümer an.&lt;br /&gt;
# Wählen Sie aus dem Menü &amp;lt;font color=&amp;quot;#598527&amp;quot;&amp;gt;&#039;&#039;&#039;Database &amp;amp;gt; Create Database&#039;&#039;&#039;&amp;lt;/font&amp;gt;.&lt;br /&gt;
# Wählen Sie im Feld &#039;&#039;&#039;Save In&#039;&#039;&#039; den Ordner aus, in dem die Datenbank gespeichert werden soll.&lt;br /&gt;
# Geben Sie einen Dateinamen an, und klicken Sie auf &#039;&#039;&#039;Save&#039;&#039;&#039;. Das Dialogfeld wird geschlossen.&lt;br /&gt;
# Ändern Sie den Wert im Feld &#039;&#039;&#039;Embedded User Authentication&#039;&#039;&#039; in &#039;&#039;&#039;Yes&#039;&#039;&#039;.&lt;br /&gt;
#: &#039;&#039;&#039;Hinweis&#039;&#039;&#039;: Das Feld &#039;&#039;&#039;Use Encryption&#039;&#039;&#039; ist jetzt sichtbar.&lt;br /&gt;
# Ändern Sie den Wert im Feld &#039;&#039;&#039;Use Encryption&#039;&#039;&#039; in &#039;&#039;&#039;Yes&#039;&#039;&#039;.&lt;br /&gt;
#: [[File:CreateDatabase-Encryption.png]]&lt;br /&gt;
# Klicken Sie auf die Schaltfläche &#039;&#039;&#039;OK&#039;&#039;&#039;, um eine Datenbank zu erstellen.&lt;br /&gt;
# Geben Sie Ihre Verbindungsinformationen ein, und klicken Sie auf die Schaltfläche &#039;&#039;&#039;Connect&#039;&#039;&#039;.&lt;br /&gt;
# Klicken Sie im &amp;quot;Encryption Wizard&amp;quot; auf die Schaltfläche &#039;&#039;&#039;Next&#039;&#039;&#039;.&lt;br /&gt;
# Geben Sie das &#039;&#039;&#039;SYSDSO&#039;&#039;&#039;-Passwort ein, und klicken Sie auf die Schaltfläche &#039;&#039;&#039;Next&#039;&#039;&#039;.&lt;br /&gt;
# Geben Sie das &#039;&#039;&#039;SEP&#039;&#039;&#039;-Passwort ein, und klicken Sie auf die Schaltfläche &#039;&#039;&#039;Next&#039;&#039;&#039;.&lt;br /&gt;
#: [[File:ExternalOptionEnc.png]]&lt;br /&gt;
#: &#039;&#039;&#039;Hinweis&#039;&#039;&#039;: Die Option &#039;&#039;&#039;External&#039;&#039;&#039; erschwert es nicht autorisierten Benutzern, auf eine verschlüsselte Datenbank auf einem mobilen Gerät, wie einem Laptop-Computer, oder auf einem gesicherten Desktop-Computer zuzugreifen.&lt;br /&gt;
# Geben Sie den Namen für den &#039;&#039;&#039;Encryption Key&#039;&#039;&#039; ein.&lt;br /&gt;
# Wählen Sie für die Option &amp;quot;Cipher&amp;quot; &#039;&#039;&#039;DES&#039;&#039;&#039; aus.&lt;br /&gt;
# Klicken Sie auf &#039;&#039;&#039;OK&#039;&#039;&#039;.&lt;br /&gt;
#: [[File:EncryptionKeyWiz.png]]&lt;br /&gt;
# Geben Sie den Namen und das Passwort für &amp;quot;BackupKey&amp;quot; ein.&lt;br /&gt;
#: &#039;&#039;&#039;Hinweis&#039;&#039;&#039;: Um die Sicherheit und Vertraulichkeit von verschlüsselten Datenbanken aufrechtzuerhalten, müssen Sie auch die Datenbanksicherungsdateien verschlüsseln.&lt;br /&gt;
# Klicken Sie auf &#039;&#039;&#039;OK&#039;&#039;&#039;.&lt;br /&gt;
#: [[File:EncDBCompleted.png]]&lt;br /&gt;
# Klicken Sie im angezeigten Dialogfeld auf die Schaltfläche &#039;&#039;&#039;OK&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==Parameter für das Systemverschlüsselungspasswort in InterBase==&lt;br /&gt;
&lt;br /&gt;
Bei einer verschlüsselten Datenbank in InterBase kann das &#039;&#039;&#039;SEP&#039;&#039;&#039; (System Encryption Password, Systemverschlüsselungspasswort) &#039;&#039;&#039;intern&#039;&#039;&#039; (Vorgabe, keine Verwendung eines Schlüsselwortes) oder &#039;&#039;&#039;extern&#039;&#039;&#039; (Verwendung eines Schlüsselwortes) festlegt werden.&lt;br /&gt;
&lt;br /&gt;
* Das &#039;&#039;&#039;interne SEP&#039;&#039;&#039; ermöglicht, dass von Datenbankbenutzern auf die Datenbank zugegriffen werden kann, wenn die Datenbank bereits einmal mit dem &#039;&#039;&#039;SEP&#039;&#039;&#039; auf diesem Computer verwendet wurde. Bei folgenden Verbindungen oder einer Verbindung nach einem Neustart muss der &#039;&#039;&#039;SEP&#039;&#039;&#039;-Wert nicht angegeben werden. Wenn die &#039;&#039;&#039;{{Product}}&#039;&#039;&#039;-Anwendung auf einem Mac oder einem mobilen Gerät bereitgestellt wird, dann ist für die erste Verbindung der &#039;&#039;&#039;SEP&#039;&#039;&#039;-Parameterwert erforderlich.&lt;br /&gt;
* Bei Datenbanken, für die ein &#039;&#039;&#039;externes SEP&#039;&#039;&#039; festgelegt ist, muss bei der ersten Verbindung der &#039;&#039;&#039;SEP&#039;&#039;&#039;-Parameterwert angegeben werden. Nach einem Neustart des Computers muss die Anwendung bei der ersten Verbindung das &#039;&#039;&#039;SEP&#039;&#039;&#039; angeben. Das externe &#039;&#039;&#039;Systemverschlüsselungspasswort&#039;&#039;&#039; ist für mobile Geräte sicherer.&lt;br /&gt;
*: &#039;&#039;&#039;Hinweis&#039;&#039;&#039;: Aktivieren Sie zum Festlegen des externen &#039;&#039;&#039;SEP&#039;&#039;&#039; im &amp;quot;Encryption Wizard&amp;quot; die Option &#039;&#039;&#039;External&#039;&#039;&#039;, oder verwenden Sie den Befehl &amp;lt;code&amp;gt;alter database set system encryption password &amp;amp;lt;String mit 255 Zeichen&amp;amp;gt; [external]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{f|dbexpress|&lt;br /&gt;
&lt;br /&gt;
===Systemverschlüsselungspasswort in dbExpress===&lt;br /&gt;
&lt;br /&gt;
Bei &#039;&#039;&#039;dbExpress&#039;&#039;&#039; können Sie den &#039;&#039;&#039;SEP&#039;&#039;&#039;-Wert in der [[lib_de:Data.SqlExpr.TSQLConnection|TSQLConnection]]-&#039;&#039;&#039;Params&#039;&#039;&#039;-Sammlung festlegen oder den &#039;&#039;&#039;SEP&#039;&#039;&#039;-Wert programmseitig setzen.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[File:ValueListEditorDBX.png]]&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Delphi&amp;quot;&amp;gt;&lt;br /&gt;
 procedure TForm10.BtnConnectClick(Sender: TObject);&lt;br /&gt;
 begin&lt;br /&gt;
   try&lt;br /&gt;
     SQLConnection1.Params.Values[&#039;SEP&#039;]:=&#039;password&#039;;&lt;br /&gt;
     SQLConnection1.Connected:=true;&lt;br /&gt;
   except&lt;br /&gt;
     on E:Exception do&lt;br /&gt;
         ShowMessage(E.ClassName + &#039; &#039; + E.Message);&lt;br /&gt;
   end;&lt;br /&gt;
 end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Systemverschlüsselungspasswort in FireDAC===&lt;br /&gt;
&lt;br /&gt;
Bei &#039;&#039;&#039;FireDAC&#039;&#039;&#039; können Sie den Parameter &#039;&#039;&#039;SEPassword&#039;&#039;&#039; in den [[lib_de:FireDAC.Comp.Client.TFDConnection|TFDConnection]]-[[Herstellen einer Verbindung zu InterBase (FireDAC)|Verbindungsdefinitionsparametern]] festlegen.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[File:FDConnectionEdt.png]]&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Delphi&amp;quot;&amp;gt;&lt;br /&gt;
 procedure TForm10.BtnConnectClick(Sender: TObject);&lt;br /&gt;
 begin&lt;br /&gt;
   try&lt;br /&gt;
     FDConnection1.Params.Values[&#039;SEPasword&#039;]:=&#039;password&#039;;&lt;br /&gt;
     FDConnection1.Connected:=true;&lt;br /&gt;
   except&lt;br /&gt;
     on E:Exception do&lt;br /&gt;
         ShowMessage(E.ClassName + &#039; &#039; + E.Message);&lt;br /&gt;
   end;&lt;br /&gt;
 end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{f|ibx|&lt;br /&gt;
&lt;br /&gt;
===Systemverschlüsselungspasswort in InterBase Express===&lt;br /&gt;
&lt;br /&gt;
Bei InterBase Express (&#039;&#039;&#039;IBX&#039;&#039;&#039;) wird der Parameter &#039;&#039;&#039;SysEncryptPassword&#039;&#039;&#039;-[[lib_de:IBX.IBDatabase.TIBDatabase|TIBDatabase]] programmseitig festgelegt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Delphi&amp;quot;&amp;gt;&lt;br /&gt;
 procedure TForm10.BtnConnectClick(Sender: TObject);&lt;br /&gt;
 begin&lt;br /&gt;
   try&lt;br /&gt;
      IBDatabase1.SysEncryptPassword:=&#039;password&#039;;&lt;br /&gt;
      IBDatabase1.Open;&lt;br /&gt;
   except&lt;br /&gt;
     on E:Exception do&lt;br /&gt;
         ShowMessage(E.ClassName + &#039; &#039; + E.Message);&lt;br /&gt;
   end;&lt;br /&gt;
 end;&lt;br /&gt;
&amp;lt;/source&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
&lt;br /&gt;
* [[InterBase|InterBase]]&lt;br /&gt;
&lt;br /&gt;
{{f|radstudio|&lt;br /&gt;
&lt;br /&gt;
* [[InterBase ToGo|InterBase ToGo]]&lt;br /&gt;
* [[Lizenzierung von IBLite und IBToGo in RAD Studio|Lizenzierung von IBLite und IBToGo in {{Product}}]]&lt;br /&gt;
* [[Übersicht über die Funktionen von dbExpress|Übersicht über die Funktionen von dbExpress]]&lt;br /&gt;
&lt;br /&gt;
}}{{f|appmethod|&lt;br /&gt;
&lt;br /&gt;
* [[InterBase ToGo|InterBase ToGo]]&lt;br /&gt;
* [[Lizenzierung von IBLite und IBToGo|Lizenzierung von IBLite und IBToGo]]&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
{{f|dbexpress|&lt;br /&gt;
&lt;br /&gt;
* [[Übersicht über die Funktionen von dbExpress|Übersicht über die Funktionen von dbExpress]] &lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
* [[FireDAC|FireDAC]]&lt;br /&gt;
&lt;br /&gt;
{{DEFAULTSORT:InterBase-Datenbankverschlusselung}}&lt;br /&gt;
[[Category:Delphi]]&lt;br /&gt;
[[Category:XE5]]&lt;br /&gt;
[[Category:AMMigrate]]&lt;br /&gt;
&lt;br /&gt;
[[en:InterBase Database Encryption]]&lt;br /&gt;
[[fr:Cryptage de bases de données InterBase]]&lt;br /&gt;
[[ja:InterBase データベース暗号化]]&lt;/div&gt;</summary>
		<author><name>Nicolas.rios</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Herstellen_einer_Verbindung_zu_InterBase_(FireDAC)&amp;diff=218593</id>
		<title>Herstellen einer Verbindung zu InterBase (FireDAC)</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Herstellen_einer_Verbindung_zu_InterBase_(FireDAC)&amp;diff=218593"/>
		<updated>2024-03-20T17:59:16Z</updated>

		<summary type="html">&lt;p&gt;Nicolas.rios: RS-121926&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Parent|Datenbankkonnektivität (FireDAC)}}&lt;br /&gt;
In diesem Thema wird beschrieben, wie eine Verbindung zu {{Company}} InterBase hergestellt wird.&lt;br /&gt;
&lt;br /&gt;
==Unterstützte Versionen==&lt;br /&gt;
&lt;br /&gt;
Der native FireDAC-Treiber unterstützt die {{Company}}-Editionen von InterBase Server, Desktop, Developer, [http://edn.embarcadero.com/article/42319 ToGo (EN)] und IBLite Version 6 und höher.&lt;br /&gt;
&lt;br /&gt;
Verwenden Sie den FireDAC-[[Herstellen einer Verbindung zu Firebird (FireDAC)|Firebird-Treiber]], um eine Verbindung zu Firebird oder dem Jaffil-Server herzustellen.&lt;br /&gt;
&lt;br /&gt;
==Client-Software==&lt;br /&gt;
&lt;br /&gt;
===Windows-Client-Software===&lt;br /&gt;
&lt;br /&gt;
Für FireDAC muss die folgende x86- oder x64-Client-Software auf dem Arbeitsplatz-Computer installiert sein:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;InterBase Server&#039;&#039;&#039;:&lt;br /&gt;
** &#039;&#039;&#039;Win32&#039;&#039;&#039;: Die Bibliothek &#039;&#039;&#039;GDS32.DLL&#039;&#039;&#039; für die Verbindung zu InterBase Server, Desktop oder Developer von x86-Anwendungen aus.&lt;br /&gt;
** &#039;&#039;&#039;Win64&#039;&#039;&#039;: Die Bibliothek &#039;&#039;&#039;IBCLIENT64.DLL&#039;&#039;&#039; für die Verbindung zu InterBase Server, Desktop oder Developer von x64-Anwendungen aus.&lt;br /&gt;
*&#039;&#039;&#039;InterBase ToGo&#039;&#039;&#039;:&lt;br /&gt;
** &#039;&#039;&#039;Win32&#039;&#039;&#039;: Die Bibliothek &#039;&#039;&#039;IBTOGO.DLL&#039;&#039;&#039; für die Arbeit mit Datenbanken mit eingebettetem InterBase ToGo von x86-Anwendungen aus.&lt;br /&gt;
** &#039;&#039;&#039;Win64&#039;&#039;&#039;: Die Bibliothek &#039;&#039;&#039;IBTOGO64.DLL&#039;&#039;&#039; für die Arbeit mit Datenbanken mit eingebettetem InterBase ToGo von x64-Anwendungen aus.&lt;br /&gt;
&lt;br /&gt;
Sie können die erforderlichen Dateien in einen der folgenden Ordner einfügen:&lt;br /&gt;
&lt;br /&gt;
* In einen in der Umgebungsvariable PATH aufgeführten Ordner (z. B. &amp;amp;lt;Windows&amp;amp;gt;\SYSTEM32).&lt;br /&gt;
* In Ihren Anwendungs-EXE-Ordner.&lt;br /&gt;
* In einen beliebigen anderen Ordner und in der Datei [[Konfigurieren von Treibern (FireDAC)|FDDrivers.ini]] Folgendes angeben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[IB]&lt;br /&gt;
VendorLib=&amp;lt;folder&amp;gt;\gds32.dll&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn die InterBase-Client-Bibliothek nicht ordnungsgemäß installiert wurde, wird beim Verbindungsversuch eine Exception ausgelöst:&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 [FireDAC][Phys][IB]-314. Cannot load vendor library [gds32.dll]. The specified module could not be found.&lt;br /&gt;
 Check [gds32.dll], which is located in one of the PATH directories or in the application EXE directory.&lt;br /&gt;
&lt;br /&gt;
===macOS-Client-Software===&lt;br /&gt;
&lt;br /&gt;
FireDAC benötigt:&lt;br /&gt;
&lt;br /&gt;
* Die x86-Client-Bibliothek &#039;&#039;&#039;libgds.dylib&#039;&#039;&#039;, um eine Verbindung zum InterBase-Server herzustellen. Verwenden Sie in {{Product}} {{Menu|Projekt &amp;amp;gt; Bereitstellung &amp;amp;gt; Weitere Dateien hinzufügen &amp;amp;gt; InterBase-Client\OSX32}}.&lt;br /&gt;
* Die eingebettete InterBase-x86-Datei &#039;&#039;&#039;libibtogo.dylib&#039;&#039;&#039;. Verwenden Sie in {{Product}} {{Menu|Projekt &amp;amp;gt; Bereitstellung &amp;amp;gt; Weitere Dateien hinzufügen &amp;amp;gt; InterBase ToGo\OSX32}}.&lt;br /&gt;
&lt;br /&gt;
===iOS-Client-Software===&lt;br /&gt;
&lt;br /&gt;
FireDAC benötigt:&lt;br /&gt;
&lt;br /&gt;
* Für 64-Bit-iOS-Geräte - die eingebettete InterBase-Datei &#039;&#039;&#039;libibtogo.a&#039;&#039;&#039; als statische ARM-Bibliothek. Verwenden Sie in {{Product}} {{Menu|Projekt &amp;amp;gt; Bereitstellung &amp;amp;gt; Weitere Dateien hinzufügen &amp;amp;gt; InterBase ToGo\iOSDevice64}}.&lt;br /&gt;
&lt;br /&gt;
Beachten Sie, dass der Einbindungsmodus nicht ausgewählt werden kann.&lt;br /&gt;
&lt;br /&gt;
===Android-Client-Software===&lt;br /&gt;
&lt;br /&gt;
FireDAC benötigt:&lt;br /&gt;
&lt;br /&gt;
* Die eingebettete InterBase-Datei &#039;&#039;&#039;libibtogo.a&#039;&#039;&#039; als statische ARM-Bibliothek. Verwenden Sie in {{Product}} {{Menu|Projekt &amp;amp;gt; Bereitstellung &amp;amp;gt; Weitere Dateien hinzufügen &amp;amp;gt; InterBase ToGo\Android}}.&lt;br /&gt;
&lt;br /&gt;
Beachten Sie, dass der Einbindungsmodus nicht ausgewählt werden kann.&lt;br /&gt;
&lt;br /&gt;
===Linux-Client-Software===&lt;br /&gt;
&lt;br /&gt;
FireDAC benötigt:&lt;br /&gt;
&lt;br /&gt;
* Die x64-Client-Bibliothek &#039;&#039;&#039;libgds.so&#039;&#039;&#039;, um eine Verbindung zum InterBase-Server herzustellen. Verwenden Sie in {{Product}} {{Menu|Projekt &amp;amp;gt; Bereitstellung &amp;amp;gt; Weitere Dateien hinzufügen &amp;amp;gt; InterBase-Client\Linux}}.&lt;br /&gt;
* Die eingebettete InterBase-x64-Datei &#039;&#039;&#039;libibtogo.so&#039;&#039;&#039;. Verwenden Sie in {{Product}} {{Menu|Projekt &amp;amp;gt; Bereitstellung &amp;amp;gt; Weitere Dateien hinzufügen &amp;amp;gt; InterBase ToGo\Linux}}.&lt;br /&gt;
&lt;br /&gt;
==Treibereinbindung==&lt;br /&gt;
&lt;br /&gt;
So binden Sie den Treiber ein:&lt;br /&gt;
&lt;br /&gt;
* Ziehen Sie aus der [[Tool-Palette|Tool-Palette]] eine [[lib_de:FireDAC.Phys.IB.TFDPhysIBDriverLink|TFDPhysIBDriverLink]]- und eine [[lib_de:FireDAC.Comp.Client.TFDConnection|TFDConnection]]-Komponente auf das Formular.&lt;br /&gt;
* Oder nehmen Sie die Unit [[lib_de:FireDAC.Phys.IB|FireDAC.Phys.IB]] in die uses-Klausel auf.&lt;br /&gt;
&lt;br /&gt;
==Verbindungsdefinitionsparameter==&lt;br /&gt;
&lt;br /&gt;
Für eine Verbindung mit InterBase ist für die meisten Anwendungen die Angabe der Verbindungsdefinitionsparameter &#039;&#039;&#039;DriverID&#039;&#039;&#039;, &#039;&#039;&#039;Protocol&#039;&#039;&#039;, &#039;&#039;&#039;Server&#039;&#039;&#039;, &#039;&#039;&#039;Database&#039;&#039;&#039;, &#039;&#039;&#039;User_Name&#039;&#039;&#039;, &#039;&#039;&#039;Password&#039;&#039;&#039; und &#039;&#039;&#039;CharacterSet&#039;&#039;&#039; erforderlich (Einzelheiten finden Sie unter [[Definieren von Verbindungen (FireDAC)|Definieren von Verbindungen (FireDAC)]]). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DriverID=IB&#039;&#039;&#039; oder &#039;&#039;&#039;DriverID=IBLite&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; frame=&amp;quot;hsides&amp;quot; rules=&amp;quot;rows&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;Parameter&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Beschreibung&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Beispielwert&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; | &#039;&#039;&#039;Database &#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
Der Name der zuzuordnenden Datenbank. Folgende Werte sind möglich:&lt;br /&gt;
* Datenbankdateipfad.&lt;br /&gt;
* Vollständiger Datenbankpfad, einschließlich Serveradresse.&lt;br /&gt;
&lt;br /&gt;
Bei einer eingebetteten Datenbank kann ein Pfad [[Pfadvariablen (FireDAC)|Pfadvariablen]] enthalten.&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
* C:\ib\ADDEMO_IB2007.IB&lt;br /&gt;
* 127.0.0.1:C:\ib\ADDEMO_IB2007.IB&lt;br /&gt;
* \\MySrv\C:\ib\ADDEMO_IB2007.IB&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; | &#039;&#039;&#039;OSAuthent &#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
{{note|Nur für &#039;&#039;&#039;DriverID&amp;lt;nowiki&amp;gt; = &amp;lt;/nowiki&amp;gt;IB&#039;&#039;&#039;.}}&lt;br /&gt;
Steuert den Authentifizierungsmodus:&lt;br /&gt;
* &#039;&#039;&#039;Yes&#039;&#039;&#039; – Windows-Authentifizierung verwenden.&lt;br /&gt;
* &#039;&#039;&#039;No&#039;&#039;&#039; – DBMS-Authentifizierung verwenden. Das ist der Vorgabewert.&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; | Yes&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; | &#039;&#039;&#039;User_Name &#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; | Der Benutzername.&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; | sysdba&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; | &#039;&#039;&#039;Password &#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; | Das Benutzerpasswort.&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; | masterkey&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; | &#039;&#039;&#039;CharacterSet &#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; | Legt den zu verwendenden Zeichensatz fest. &amp;lt;br /&amp;gt; Es wird dringend empfohlen, den Parameter &#039;&#039;&#039;CharacterSet&#039;&#039;&#039; auf einen der folgenden Werte zu setzen:&lt;br /&gt;
* UTF8, wenn Ihre Anwendung Unicode unterstützen muss. Einzelheiten finden Sie unter &amp;quot;Verwenden von Unicode (FireDAC)&amp;quot;.&lt;br /&gt;
* WIN1250 für Mitteleuropa.&lt;br /&gt;
* WIN1251 für Kyrillisch.&lt;br /&gt;
* WIN1252 für Westeuropa, Amerika.&lt;br /&gt;
* usw.&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; | WIN1252&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; | &#039;&#039;&#039;ExtendedMetadata &#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
Steuert die [[Erweiterte Metadaten (FireDAC)|erweiterte Beschreibung]] von Abfrage-Ergebnismengen:&lt;br /&gt;
* &#039;&#039;&#039;True&#039;&#039;&#039; – FireDAC erhält Spaltendomänennamen zusätzlich zu den anderen Spaltenattributen. Wenn eine Spalte zu einer Domäne mit demselben Namen gehört, wie z. B. &#039;&#039;&#039;%BOOL%&#039;&#039;&#039;, wird sie als &#039;&#039;&#039;dtBoolean&#039;&#039;&#039; beschrieben. Wenn eine Tabelle über einen &#039;&#039;&#039;INSERT-Trigger&#039;&#039;&#039; verfügt, der eine einzelne Sequenz liest und deren Wert einer einzelnen Spalte zuweist, dann wird diese Spalte als eine &#039;&#039;&#039;Auto-Inkrementierungsspalte&#039;&#039;&#039; beschrieben. Durch Setzen dieser Option auf &#039;&#039;&#039;True&#039;&#039;&#039; wird das Öffnen von Datenmengen geringfügig verlangsamt.&lt;br /&gt;
* &#039;&#039;&#039;False&#039;&#039;&#039; – FireDAC verwendet die beschränkten Informationen über die Abfragespalten. Das ist der Vorgabewert.&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; | False&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; | &#039;&#039;&#039;Port&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
{{note|Nur für &#039;&#039;&#039;DriverID&amp;lt;nowiki&amp;gt; = &amp;lt;/nowiki&amp;gt;IB&#039;&#039;&#039;.}}&lt;br /&gt;
Der TCP/IP-Port, über den der InterBase-Server empfängt. Standardmäßig entspricht dieser Port dem in den Diensten definierten Port von &#039;&#039;&#039;gds_db&#039;&#039;&#039;. Normalerweise ist dies Port 3050. Wenn &#039;&#039;&#039;gds_db&#039;&#039;&#039; nicht definiert ist, dann sollten Sie den Parameter &#039;&#039;&#039;Port&#039;&#039;&#039; auf den erforderlichen Wert setzen.&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; | 3051&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; | &#039;&#039;&#039;Protocol &#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
{{note|Nur für &#039;&#039;&#039;DriverID&amp;lt;nowiki&amp;gt; = &amp;lt;/nowiki&amp;gt;IB&#039;&#039;&#039;.}}&lt;br /&gt;
Das für die Verbindung mit dem DB-Server verwendete Protokoll. Folgende Werte sind möglich:&lt;br /&gt;
* &#039;&#039;&#039;Local&#039;&#039;&#039; – Herstellen einer Verbindung zu einem lokal ausgeführten Server, zu einem eingebetteten Server oder zu einem Server mit einem Alias.&lt;br /&gt;
* &#039;&#039;&#039;NetBEUI&#039;&#039;&#039; – Herstellen einer Verbindung über das Microsoft NetBIOS-Protokoll.&lt;br /&gt;
* &#039;&#039;&#039;SPX&#039;&#039;&#039; – Herstellen einer Verbindung über das Novell SPX-Protokoll.&lt;br /&gt;
* &#039;&#039;&#039;TCPIP&#039;&#039;&#039; – Herstellen einer Verbindung über das TCP/IP-Protokoll.&lt;br /&gt;
&lt;br /&gt;
Wenn der Parameter &amp;quot;Protocol&amp;quot; angegeben ist, erstellt FireDAC vollständige Datenbankpfade im entsprechenden Protokollformat und mit den jeweiligen Parameterwerten für &amp;quot;Server&amp;quot; und &amp;quot;Database&amp;quot;.&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; | TCPIP&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; | &#039;&#039;&#039;Server &#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
{{note|Nur für &#039;&#039;&#039;DriverID&amp;lt;nowiki&amp;gt; = &amp;lt;/nowiki&amp;gt;IB&#039;&#039;&#039;.}}&lt;br /&gt;
Legt die Adresse des Servers, zu dem eine Verbindung hergestellt werden soll, fest. Der &amp;quot;Server&amp;quot;-Parameterwert wird nur verwendet, wenn der Parameter &amp;quot;Protocol&amp;quot; angegeben ist.&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; | 127.0.0.1&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; | &#039;&#039;&#039;InstanceName &#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
{{note|Nur für &#039;&#039;&#039;DriverID&amp;lt;nowiki&amp;gt; = &amp;lt;/nowiki&amp;gt;IB&#039;&#039;&#039;.}}&lt;br /&gt;
Der Name der InterBase-Instanz. Wird ab InterBase 2007 unterstützt.&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; | srv2&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; | &#039;&#039;&#039;SQLDialect &#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
{{note|Nur für &#039;&#039;&#039;DriverID&amp;lt;nowiki&amp;gt; = &amp;lt;/nowiki&amp;gt;IB&#039;&#039;&#039;.}}&lt;br /&gt;
Der für die Verbindung zu verwendende SQL-Dialekt. 3 ist der Vorgabewert.&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; | 1&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; | &#039;&#039;&#039;RoleName &#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
{{note|Nur für &#039;&#039;&#039;DriverID&amp;lt;nowiki&amp;gt; = &amp;lt;/nowiki&amp;gt;IB&#039;&#039;&#039;.}}&lt;br /&gt;
Der Standardrollenname.&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; | Admin&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; | &#039;&#039;&#039;OpenMode &#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
Legt fest, wie die Datenbank geöffnet werden soll. Die folgenden Modi werden unterstützt:&lt;br /&gt;
* &#039;&#039;&#039;Open&#039;&#039;&#039; -- Öffnen einer vorhandenen Datenbankdatei, die im Parameter &#039;&#039;&#039;Database&#039;&#039;&#039; angegeben ist, unmittelbar nach der Verbindung mit dem Server. Wenn die angegebene Datenbank nicht vorhanden ist, löst die Anwendung eine Exception aus. Das ist der Vorgabewert.&lt;br /&gt;
* &#039;&#039;&#039;Create&#039;&#039;&#039; – Erstellen einer neuen Datenbank. Wenn die angegebene Datenbank vorhanden ist, löst die Anwendung eine Exception aus.&lt;br /&gt;
* &#039;&#039;&#039;OpenOrCreate&#039;&#039;&#039; – Öffnen einer vorhandenen Datenbank oder Erstellen einer neuen Datenbank, wenn die angegebene Datenbank nicht vorhanden ist.&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; | Open&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; | &#039;&#039;&#039;DropDatabase &#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
Steuert das Löschen einer vorhandenen Datenbank:&lt;br /&gt;
* &#039;&#039;&#039;Yes&#039;&#039;&#039; – Löschen der Datenbankdatei, die im Parameter &amp;quot;Database&amp;quot; angegeben ist, unmittelbar nach Aufheben der Verbindung mit dem Server.&lt;br /&gt;
* &#039;&#039;&#039;No&#039;&#039;&#039; – Datenbank nicht löschen. Das ist der Vorgabewert.&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; | Yes&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; | &#039;&#039;&#039;PageSize &#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; | Die Seitengröße für die neu erstellte Datenbank, wenn &amp;quot;CreateDatabase = Yes&amp;quot;. 4096 ist der Vorgabewert.&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; | 8192&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; | &#039;&#039;&#039;IBAdvanced &#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; | Die durch &amp;quot;;&amp;quot; getrennte Liste mit weiteren Parametern. In der Unit FireDAC.Phys.IBWrapper (beim Konstanten-Array DPBInfos) finden Sie die vollständige Liste der unterstützten Parameter. Die Beschreibung des hier aufgeführten Codes finden Sie in den InterBase-Handbüchern.&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; | &#039;&#039;&#039;GUIDEndian &#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; | Definiert, wie der GUID-Wert auf dem Client repräsentiert wird. &amp;quot;Little&amp;quot; ist der Vorgabewert.&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; | Big&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Anwendungsfälle==&lt;br /&gt;
&lt;br /&gt;
===Verwenden einer sicheren Verbindung===&lt;br /&gt;
&lt;br /&gt;
Übergeben Sie für die Verwendung der TLS/SSL-Verschlüsselung das Schlüssel/Wertepaar {{Code|1=ssl=true}} für den Wert des Parameters &#039;&#039;&#039;Database&#039;&#039;&#039; wie folgt:&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 DriverID=IB&lt;br /&gt;
 Database=my.interbasehost.net/3065?ssl=true?serverPublicFile=C:\PublicCertFileOnClient\CertFile.pem??:C:/DB/TEST.IB&lt;br /&gt;
 User_Name=sysdba&lt;br /&gt;
 Password=masterkey&lt;br /&gt;
 CharacterSet=UTF8&lt;br /&gt;
 ExtendedMetadata=True&lt;br /&gt;
&lt;br /&gt;
Weitere Einzelheiten finden Sie in der [https://docwiki.embarcadero.com/InterBase/2020/en/Operations_Guide Dokumentation zu InterBase (EN)] in Kapitel 5 ab Seite 5.&lt;br /&gt;
&lt;br /&gt;
===Weitere Anwendungsfälle===&lt;br /&gt;
&lt;br /&gt;
* Herstellen einer Verbindung über das TCP/IP-Protokoll zu einer Datenbank, die auf einem Remote-Server ausgeführt wird:&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 DriverID=IB&lt;br /&gt;
 Database=C:\ib\ADDEMO_IBXE3.gdb&lt;br /&gt;
 Protocol=TCPIP&lt;br /&gt;
 Server=IBSrv&lt;br /&gt;
 User_Name=sysdba&lt;br /&gt;
 Password=masterkey&lt;br /&gt;
 CharacterSet=win1252&lt;br /&gt;
 ExtendedMetadata=True&lt;br /&gt;
&lt;br /&gt;
* Herstellen einer Verbindung über das TCP/IP-Protokoll zu einer Datenbank, die auf einem Remote-Server ausgeführt wird:&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 DriverID=IB&lt;br /&gt;
 Database=IBSrv:C:\ib\ADDEMO_IBXE3.gdb&lt;br /&gt;
 User_Name=sysdba&lt;br /&gt;
 Password=masterkey&lt;br /&gt;
 CharacterSet=utf8&lt;br /&gt;
&lt;br /&gt;
* Herstellen einer Verbindung zu einer lokalen Datenbank:&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 DriverID=IB&lt;br /&gt;
 Database=C:\ib\ADDEMO_IBXE3.gdb&lt;br /&gt;
 User_Name=sysdba&lt;br /&gt;
 Password=masterkey&lt;br /&gt;
 CharacterSet=win1251&lt;br /&gt;
&lt;br /&gt;
* Herstellen einer Verbindung zu einer InterBase ToGo-Datenbank:&lt;br /&gt;
&lt;br /&gt;
Legen Sie die Komponente TFDPhysIBDriverLink auf dem Formular ab, und setzen Sie &amp;quot;VendorLib&amp;quot; auf &amp;amp;lt;Ihr Pfad&amp;amp;gt;\ibtogo.dll, oder verwenden Sie eine virtuelle Treiberdefinition.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 DriverID=IB&lt;br /&gt;
 Database=C:\ib\ADDEMO_IBXE3.gdb&lt;br /&gt;
 User_Name=sysdba&lt;br /&gt;
 Password=masterkey&lt;br /&gt;
 CharacterSet=utf8&lt;br /&gt;
&lt;br /&gt;
* Herstellen einer Verbindung zu einer Datenbankdatei im Ordner &amp;quot;Documents&amp;quot; auf einem iOS-Gerät:&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 DriverID=IB&lt;br /&gt;
 User_Name=sysdba&lt;br /&gt;
 Password=masterkey&lt;br /&gt;
 Database=$(DOC)/ADDEMO.GDB&lt;br /&gt;
 SQLDialect=3&lt;br /&gt;
 CharacterSet=UTF8&lt;br /&gt;
 ExtendedMetadata=True&lt;br /&gt;
&lt;br /&gt;
* Herstellen einer Verbindung zu einer verschlüsselten Datenbankdatei im externen Speicher des Android-Geräts:&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 DriverID=IB&lt;br /&gt;
 User_Name=sysdba&lt;br /&gt;
 Password=masterkey&lt;br /&gt;
 Database=$(DOC)/ADDEMO.GDB&lt;br /&gt;
 SQLDialect=3&lt;br /&gt;
 CharacterSet=UTF8&lt;br /&gt;
 ExtendedMetadata=True&lt;br /&gt;
 SEPassword=12345&lt;br /&gt;
&lt;br /&gt;
* Herstellen einer Verbindung zu einer IBLite-Datenbank:&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 DriverID=IBLite&lt;br /&gt;
 Database=C:\ib\ADDEMO_IBXE3.gdb&lt;br /&gt;
 User_Name=sysdba&lt;br /&gt;
 Password=masterkey&lt;br /&gt;
 CharacterSet=utf8&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
&lt;br /&gt;
* [[Allgemeine Verbindungsparameter (FireDAC)|Allgemeine Verbindungsparameter]]&lt;br /&gt;
* [[FAQ (FireDAC)|FAQs]]&lt;br /&gt;
* [[Konfigurieren von Treibern (FireDAC)|Konfigurieren von FireDAC-Treibern]]&lt;br /&gt;
* [[Definieren von Verbindungen (FireDAC)|Verwalten von FireDAC-Verbindungsdefinitionen]]&lt;br /&gt;
* [[Tutorial: Verwenden von FireDAC aus einer geräteübergreifenden Anwendung auf Desktop-Plattformen|Tutorial: Verwenden von FireDAC aus einer geräteübergreifenden Anwendung auf Desktop-Plattformen]]&lt;br /&gt;
&lt;br /&gt;
===Beispiele===&lt;br /&gt;
&lt;br /&gt;
* [[samp_en:FireDAC.InterBase Sample|FireDAC InterBase]] (Beispiel)&lt;br /&gt;
&lt;br /&gt;
[[Category:FireDAC]]&lt;br /&gt;
[[Category:AMMigrate]]&lt;br /&gt;
&lt;br /&gt;
[[en:Connect to InterBase (FireDAC)]]&lt;br /&gt;
[[fr:Connexion à InterBase (FireDAC)]]&lt;br /&gt;
[[ja:InterBase への接続（FireDAC）]]&lt;/div&gt;</summary>
		<author><name>Nicolas.rios</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=InterBase&amp;diff=218592</id>
		<title>InterBase</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=InterBase&amp;diff=218592"/>
		<updated>2024-03-20T17:55:46Z</updated>

		<summary type="html">&lt;p&gt;Nicolas.rios: RS-121926&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Parent|Datenbankanwendungen entwickeln}}&lt;br /&gt;
&lt;br /&gt;
{{Product}} unterstützt InterBase {{InterBaseVersion}}-Datenbanken vollständig. InterBase {{InterBaseVersion}} wird mit {{Product}} in folgendem Verzeichnis installiert: {{Path|{{InstallPath}}\InterBase{{InterBaseVersion}}}}.&lt;br /&gt;
&lt;br /&gt;
==Voraussetzungen==&lt;br /&gt;
&lt;br /&gt;
Folgende Voraussetzungen sind für die Verwendung von InterBase {{InterBaseVersion}}-Datenbanken erforderlich:&lt;br /&gt;
&lt;br /&gt;
* Die neueste Client-Version von InterBase (wenn Sie {{Variables|Product}} installieren, wird die richtige Client-Version von InterBase {{InterBaseVersion}} automatisch installiert, außer Sie deaktivieren InterBase {{InterBaseVersion}} ausdrücklich.)&lt;br /&gt;
* Ein x64-Computer für die neue Plattformunterstützung (nur bei Verwendung von 64 Bit)&lt;br /&gt;
&lt;br /&gt;
Die 64-Bit-Edition kann auf den folgenden Betriebssystemen installiert werden:&lt;br /&gt;
&lt;br /&gt;
* Microsoft Windows 10&lt;br /&gt;
* Microsoft Windows 8.1&lt;br /&gt;
* Microsoft Windows 7 &lt;br /&gt;
* Windows Server 2016&lt;br /&gt;
* Windows Server 2012 R2&lt;br /&gt;
* macOS El Capitan 10.11&lt;br /&gt;
* macOS Sierra 10.12&lt;br /&gt;
* macOS High Sierra 10.13&lt;br /&gt;
* macOS Mojave 10.14&lt;br /&gt;
* macOS Catalina 10.15&lt;br /&gt;
&lt;br /&gt;
===Starten des InterBase-Servers===&lt;br /&gt;
&lt;br /&gt;
#Wählen Sie dazu {{InterBaseServerManagerMenu}}&lt;br /&gt;
#Starten Sie im &#039;&#039;&#039;InterBase {{InterBaseVersion}} 64 Server Manager&#039;&#039;&#039; den InterBase-Server, falls er noch nicht ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
=={{Product}}-Unterstützung für InterBase==&lt;br /&gt;
&lt;br /&gt;
===Integrierte Lizenzierung für InterBase {{InterBaseVersion}}===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;InterBase {{InterBaseVersion}} Developer Edition&#039;&#039;&#039; wird mit {{Product}} installiert &amp;lt;f s=&amp;quot;radstudio&amp;quot; t=&amp;quot;span&amp;quot; /&amp;gt;(gilt nicht für die Starter-Edition)&amp;lt;f e=&amp;quot;radstudio&amp;quot; t=&amp;quot;span&amp;quot; /&amp;gt; und ist in der {{Product}}-Lizenz integriert. &#039;&#039;&#039;InterBase {{InterBaseVersion}} ToGo&#039;&#039;&#039; muss nicht auf einem Server oder einem Endbenutzer-Arbeitsplatz installiert werden und verfügt über zwei Lizenzierungsoptionen für die Bereitstellung: &#039;&#039;&#039;ToGo&#039;&#039;&#039; und &#039;&#039;&#039;IBLite&#039;&#039;&#039;. Dieses Leistungsmerkmal erleichtert Entwicklern das Erstellen von {{CBuilder}}- und {{Delphi}}-InterBase-Anwendungen mit {{Product}}.&lt;br /&gt;
&lt;br /&gt;
{{Note|Unterstützung für macOS-64-Bit steht nur für Delphi-Anwendungen zur Verfügung.}}&lt;br /&gt;
&lt;br /&gt;
{{Attention|Die macOS-64-Bit-Dateien sind jetzt in einem eigenen Ordner vorhanden, nicht mehr im selben Ordner wie die macOS-32-Bit-Dateien für InterBase ToGo.}}&lt;br /&gt;
&lt;br /&gt;
==Neuerungen InterBase {{InterBaseVersion}}==&lt;br /&gt;
&lt;br /&gt;
Einzelheiten finden Sie in der [http://docwiki.embarcadero.com/InterBase/2020/en/Readme Readme-Datei] zu InterBase {{InterBaseVersion}}.&lt;br /&gt;
&lt;br /&gt;
Weitere Einzelheiten zu den neuen Features in InterBase {{InterBaseVersion}} finden Sie unter [http://docwiki.embarcadero.com/InterBase/2020/en/What%27s_New InterBase 2020]&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
&lt;br /&gt;
* [[Datenbankanwendungen entwickeln - Index|Datenbankanwendungen entwickeln - Index]]&lt;br /&gt;
* [http://www.embarcadero.com/database-in-action/interbase-labs InterBase-Videos (EN)]&lt;br /&gt;
* [[Tutorial: Eine InterBase-Datenbank in einer Delphi- oder C++-Anwendung verwenden|Tutorial: Eine InterBase-Datenbank in einer {{Delphi}}- oder C++-Anwendung verwenden]]&lt;br /&gt;
* [[Tutorial: Mit InterBase Express auf eine Datenbank zugreifen|Tutorial: Mit InterBase Express auf eine Datenbank zugreifen]]&lt;br /&gt;
* [[InterBase-Datenbankverschlüsselung|InterBase-Datenbankverschlüsselung]]&lt;br /&gt;
* [[Bereitstellungslizenz für IBLite und IBToGo|Bereitstellungslizenz für IBLite und IBToGo]]&lt;br /&gt;
* InterBase 2020-Readme, verfügbar im Produktinstallationsverzeichnis im Ordner \Interbase2020\Doc. &lt;br /&gt;
** [https://docwiki.embarcadero.com/InterBase/2020/en/InterBase_2020_Readme InterBase 2020 Online Readme (EN)]&lt;br /&gt;
&lt;br /&gt;
===Beispiele===&lt;br /&gt;
&lt;br /&gt;
* [[samp_en:FireDAC.InterBase Sample|FireDAC InterBase]] sample&lt;br /&gt;
&lt;br /&gt;
[[Category:Windows-Entwicklerhandbuch]]&lt;br /&gt;
[[Category:Delphi]]&lt;br /&gt;
[[Category:XE6]]&lt;br /&gt;
[[Category:AMMigrate]]&lt;br /&gt;
&lt;br /&gt;
[[en:InterBase]]&lt;br /&gt;
[[fr:InterBase]]&lt;br /&gt;
[[ja:InterBase]]&lt;/div&gt;</summary>
		<author><name>Nicolas.rios</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Verwenden_von_InterBase_mit_FireDAC&amp;diff=218591</id>
		<title>Verwenden von InterBase mit FireDAC</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Verwenden_von_InterBase_mit_FireDAC&amp;diff=218591"/>
		<updated>2024-03-20T15:19:08Z</updated>

		<summary type="html">&lt;p&gt;Nicolas.rios: RS-121926&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Parent|Arbeiten mit DBMS (FireDAC)}}&lt;br /&gt;
&lt;br /&gt;
==Transaction Wait Time==&lt;br /&gt;
&lt;br /&gt;
Mit dem folgenden Code können Sie [http://docwiki.embarcadero.com/InterBase/2020/en/Wait_time Transaction Wait Time (EN)] mit FireDAC verwenden:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
FDConnection1.TxOptions.Params.Clear;&lt;br /&gt;
FDConnection1.TxOptions.Params.Add(&#039;wait_time=1000&#039;); // 1000 seconds&lt;br /&gt;
FDConnection1.StartTransaction;&lt;br /&gt;
try&lt;br /&gt;
  // perform required DB actions&lt;br /&gt;
  FDConnection1.Commit;&lt;br /&gt;
except&lt;br /&gt;
  FDConnection1.Rollback;&lt;br /&gt;
  raise;&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exclusive Isolation Level==&lt;br /&gt;
&lt;br /&gt;
Mit dem folgenden Code verwenden Sie [http://docwiki.embarcadero.com/InterBase/2020/en/Exclusive_Isolation_Level Exclusive Isolation Level (EN)] mit FireDAC verwenden:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
FDConnection1.TxOptions.Isolation := xiUnspecified;&lt;br /&gt;
FDConnection1.TxOptions.Params.Clear;&lt;br /&gt;
FDConnection1.TxOptions.Params.Add(&#039;exclusive&#039;);&lt;br /&gt;
FDConnection1.StartTransaction;&lt;br /&gt;
try&lt;br /&gt;
  // perform required DB actions&lt;br /&gt;
  FDConnection1.Commit;&lt;br /&gt;
except&lt;br /&gt;
  FDConnection1.Rollback;&lt;br /&gt;
  raise;&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
&lt;br /&gt;
* [[Herstellen einer Verbindung zu InterBase (FireDAC)|Herstellen einer Verbindung zu InterBase]]&lt;br /&gt;
&lt;br /&gt;
[[en:Using InterBase with FireDAC]]&lt;br /&gt;
[[fr:Utilisation d&#039;InterBase avec FireDAC]]&lt;br /&gt;
[[ja:FireDAC での InterBase の利用]]&lt;/div&gt;</summary>
		<author><name>Nicolas.rios</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Arbeiten_mit_DBMS_(FireDAC)&amp;diff=218590</id>
		<title>Arbeiten mit DBMS (FireDAC)</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Arbeiten_mit_DBMS_(FireDAC)&amp;diff=218590"/>
		<updated>2024-03-20T15:16:49Z</updated>

		<summary type="html">&lt;p&gt;Nicolas.rios: RS-121926&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Parent|FireDAC}}&lt;br /&gt;
&lt;br /&gt;
Dieser Abschnitt enthält eine Reihe von Artikeln über die Arbeit mit einer bestimmten Datenbank in einer FireDAC-Anwendung.&lt;br /&gt;
&lt;br /&gt;
==Themen==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; frame=&amp;quot;hsides&amp;quot; rules=&amp;quot;rows&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;Thema&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Beschreibung&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; | [[Verwenden von SQLite mit FireDAC|Verwenden von SQLite mit FireDAC]]&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; | In diesem Artikel werden die Aspekte der Entwicklung von [http://www.sqlite.org/ SQLite (EN)]-Datenbankanwendungen mit FireDAC für {{Delphi}} beschrieben. SQLite ist eine eingebettete SQL-Datenbank-Engine, die weltweit [http://www.sqlite.org/mostdeployed.html am häufigsten eingesetzte (EN)] SQL-Datenbank.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; | [[Verwenden von Oracle mit FireDAC|Verwenden von Oracle mit FireDAC]]&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; | In diesem Artikel werden die Aspekte der Entwicklung von [http://www.oracle.com/us/products/database/overview/index.html Oracle (EN)]-Datenbankanwendungen mit FireDAC für {{Delphi}} beschrieben. Oracle ist ein relationaler Datenbankserver auf Unternehmensebene, weltweit führend bei den mit RDBMS-Software erzielten Umsätzen.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; | [[Verwenden von InterBase mit FireDAC|Verwenden von InterBase mit FireDAC]]&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; | In diesem Artikel werden die Aspekte der Entwicklung von [http://docwiki.embarcadero.com/InterBase/2020/en/Main_Page InterBase (EN)]-Datenbankanwendungen mit FireDAC für {{Delphi}} beschrieben. InterBase ist eine schlanke, integrierbare relationale Hochleistungsdatenbank ohne Verwaltungsaufwand für Softwareentwickler.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:FireDAC]]&lt;br /&gt;
[[Category:AMMigrate]]&lt;br /&gt;
&lt;br /&gt;
[[en:Working with DBMS (FireDAC)]]&lt;br /&gt;
[[fr:Utilisation des SGBD (FireDAC)]]&lt;br /&gt;
[[ja:DBMS での作業（FireDAC）]]&lt;/div&gt;</summary>
		<author><name>Nicolas.rios</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Mobile-Tutorial:_Herstellen_einer_Verbindung_zu_Unternehmensdatenbanken_von_mobilen_Client-Anwendungen_aus_(iOS_und_Android)&amp;diff=218589</id>
		<title>Mobile-Tutorial: Herstellen einer Verbindung zu Unternehmensdatenbanken von mobilen Client-Anwendungen aus (iOS und Android)</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Mobile-Tutorial:_Herstellen_einer_Verbindung_zu_Unternehmensdatenbanken_von_mobilen_Client-Anwendungen_aus_(iOS_und_Android)&amp;diff=218589"/>
		<updated>2024-03-20T15:08:06Z</updated>

		<summary type="html">&lt;p&gt;Nicolas.rios: RS-121926&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Parent|Mobile-Tutorials: Mobile Anwendungsentwicklung (iOS und Android)}}&lt;br /&gt;
&lt;br /&gt;
Bevor Sie dieses Tutorial beginnen:&lt;br /&gt;
&lt;br /&gt;
* Arbeiten Sie die folgenden Tutorials durch:&lt;br /&gt;
** &#039;&#039;&#039;[[Mobile-Tutorial: Verwenden von Listenfeld-Komponenten zur Anzeige von Tabellenansichten (iOS und Android)|Mobile-Tutorial: Verwenden von Listenfeld-Komponenten zur Anzeige von Tabellenansichten (iOS und Android)]]&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[[Mobile-Tutorial: Verwenden von InterBase ToGo mit dbExpress (iOS und Android)|Mobile-Tutorial: Verwenden von InterBase ToGo mit dbExpress (iOS und Android)]]&#039;&#039;&#039;&lt;br /&gt;
* Wählen Sie &#039;&#039;&#039;Start | Alle Programme | Embarcadero InterBase {{InterBaseVersion}} | &amp;amp;lt;xx&amp;amp;gt;-bit instance = gd_db | InterBase Server Manager&#039;&#039;&#039; und starten Sie den InterBase-Server. Der InterBase-Server muss ausgeführt werden, bevor Sie das Beispiel erstellen oder ausführen. &lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
In diesem Tutorial wird beschrieben, wie Sie von einer mobilen Client-Anwendung aus eine Verbindung zu einer Unternehmensdatenbank herstellen.&lt;br /&gt;
&lt;br /&gt;
Für die Verbindung zu einer Unternehmensdatenbank benötigen Sie eine &#039;&#039;&#039;Client-Bibliothek&#039;&#039;&#039;. Meistens wird die Client-Bibliothek vom Hersteller der Datenbank als DLL bereitgestellt. Für mobile Geräte ist dieses Vorgehen nicht angebracht, weil keine Client-Bibliothek verfügbar ist. Zur Lösung dieses Problems können Sie eine &#039;&#039;&#039;Mittelschicht&#039;&#039;&#039; für die Verbindung zu einer Unternehmensdatenbank entwickeln, und Ihre Anwendung kann mit der Mittelschicht interagieren.&lt;br /&gt;
&lt;br /&gt;
{{Variables|Product}} stellt das &#039;&#039;&#039;DataSnap&#039;&#039;&#039;-Framework bereit, mit dem Sie die Mittelschicht, fast ohne zu programmieren, entwickeln (und darauf zugreifen) können. In diesem Tutorial werden die Schritte zum Entwickeln der Mittelschicht und des mobilen Clients beschrieben.&lt;br /&gt;
&lt;br /&gt;
[[File:NTiersMobileAppDiagram.png]]&lt;br /&gt;
&lt;br /&gt;
==Erstellen der Mittelschicht: Ein DataSnap-Server==&lt;br /&gt;
&lt;br /&gt;
Erstellen Sie zunächst einen DataSnap-Server, der eine Tabelle von einem Datenbankserver bereitstellt. In diesem Tutorial wird als DataSnap-Server eine &#039;&#039;&#039;DataSnap-Server-VCL-Formularanwendung&#039;&#039;&#039; verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; In diesem Tutorial dient der DataSnap-Server (eine VCL-Anwendung) als Mittelschicht in einer mehrschichtigen Datenbankanwendung.&lt;br /&gt;
Sie können eine Instanz eines DataSnap-Servers einfach erstellen und später wieder löschen. Wenn Ihnen die grundlegenden Schritte klar sind, können Sie die Mittelschicht in eine Windows-Dienstanwendung umwandeln.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Erstellen einer DataSnap-Server-VCL-Anwendung===&lt;br /&gt;
&lt;br /&gt;
# Um ein neues {{Delphi}}- oder C++-Projekt zu erstellen, wählen Sie &amp;lt;font color=&amp;quot;#598527&amp;quot;&amp;gt;&#039;&#039;&#039;Datei &amp;amp;gt; Neu &amp;amp;gt; Weitere&#039;&#039;&#039;&amp;lt;/font&amp;gt;, und im Dialogfeld &#039;&#039;&#039;Objektgalerie&#039;&#039;&#039; wählen Sie dann:&lt;br /&gt;
#* &#039;&#039;&#039;Für Delphi:&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#598527&amp;quot;&amp;gt;&#039;&#039;&#039;{{Delphi}}-Projekte &amp;amp;gt; DataSnap-Server &amp;amp;gt; DataSnap-Server&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
#* &#039;&#039;&#039;Für C++:&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#598527&amp;quot;&amp;gt;&#039;&#039;&#039;{{CBuilder}}-Projekte &amp;amp;gt; DataSnap-Server &amp;amp;gt; DataSnap-Server&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
#: [[File:DSServer iOS1.png|400px]]&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
# Der Experte [[DataSnap-Server-Experte|Neuer DataSnap-Server]] wird angezeigt:&lt;br /&gt;
#: [[File:DSServer iOS2.png|700px]]&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
## Wählen Sie als ersten Schritt &#039;&#039;&#039;Formularanwendung&#039;&#039;&#039; als Projekttyp aus.&lt;br /&gt;
## Wählen Sie als zweiten Schritt &#039;&#039;&#039;VCL-Anwendung&#039;&#039;&#039; als Anwendungstyp aus.&lt;br /&gt;
## Wählen Sie als dritten Schritt das Protokoll &#039;&#039;&#039;TCP/IP&#039;&#039;&#039;, die &#039;&#039;&#039;Servermethodenklasse&#039;&#039;&#039; und &#039;&#039;&#039;Beispielmethoden&#039;&#039;&#039; aus der Liste aus.&lt;br /&gt;
## Belassen Sie im vierten Schritt die Einstellung des Standard-TCP/IP Kommunikations-Ports auf &#039;&#039;&#039;211&#039;&#039;&#039;. Damit wird sichergestellt, dass die Kommunikation zwischen dem Client und dem Server über den Standard-DataSnap-Port ausgeführt wird.&lt;br /&gt;
## Wählen Sie als fünften und letzten Schritt &#039;&#039;&#039;TDSServerModule&#039;&#039;&#039; als Vorfahre für die Servermethoden aus.&lt;br /&gt;
# Speichern Sie die neue Formular-Unit unter &#039;&#039;&#039;DataSnapServerUnit&#039;&#039;&#039;.&lt;br /&gt;
# Wechseln Sie zu &#039;&#039;&#039;DataSnapServerUnit&#039;&#039;&#039;, und ändern Sie die Eigenschaft &#039;&#039;&#039;Name&#039;&#039;&#039; des Formulars in &#039;&#039;&#039;DSServerForm&#039;&#039;&#039;.&lt;br /&gt;
# Speichern Sie die Servermethoden-Unit (vom Experten standardmäßig als &#039;&#039;&#039;ServerMethodsUnit1&#039;&#039;&#039; erstellt) unter dem Namen &#039;&#039;&#039;ServerModuleUnit&#039;&#039;&#039;.&lt;br /&gt;
# Speichern Sie die Servercontainer-Unit (vom Experten standardmäßig als &#039;&#039;&#039;ServerContainerUnit1&#039;&#039;&#039; erstellt) unter dem Namen &#039;&#039;&#039;ServerContainerUnit&#039;&#039;&#039;.&lt;br /&gt;
# Speichern Sie das neue Projekt unter &#039;&#039;&#039;DataSnapServerProject&#039;&#039;&#039;.&lt;br /&gt;
# Wählen Sie in der [[Projekte-Fenster|Projektverwaltung]] ProjectGroup1 aus, und speichern Sie das Projekt unter &#039;&#039;&#039;DataSnapTutorialProjectGroup.groupproj&#039;&#039;&#039;.&lt;br /&gt;
#: [[File:SaveAsDataSnapTutorialProjectGroup.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Definieren einer Datenmenge für den DataSnap-Server===&lt;br /&gt;
&lt;br /&gt;
# Wechseln Sie zur Datei &#039;&#039;&#039;ServerContainerUnit.pas&#039;&#039;&#039;, und ersetzen Sie für Delphi die uses-Klausel in der Implementierung durch &amp;lt;code&amp;gt;uses Winapi.Windows, ServerModuleUnit&amp;lt;/code&amp;gt;, und ersetzen Sie für C++ in &#039;&#039;&#039;ServerContainerUnit.cpp&#039;&#039;&#039; &#039;&#039;&#039;#include &amp;quot;ServerMethodsUnit.h&amp;quot; &#039;&#039;&#039; durch &amp;lt;code&amp;gt; #include &amp;quot;ServerModuleUnit.h&amp;quot;&amp;lt;/code&amp;gt; .&lt;br /&gt;
# Wechseln Sie zur Datei &#039;&#039;&#039;ServerModuleUnit.pas&#039;&#039;&#039;.&lt;br /&gt;
# Ändern Sie im Formular-Designer die Eigenschaft &#039;&#039;&#039;Name&#039;&#039;&#039; des Servermoduls in &#039;&#039;&#039;DSServerModule_EMPLOYEE&#039;&#039;&#039;.&lt;br /&gt;
# Konfigurieren Sie die folgenden Komponenten für das Servermodul:&lt;br /&gt;
#* Ziehen Sie eine [[lib_de:Data.SqlExpr.TSQLConnection|TSQLConnection]]-Komponente in das Servermodul, und legen Sie die folgenden Eigenschaften fest:&lt;br /&gt;
#*: &#039;&#039;&#039;TSQLConnection&#039;&#039;&#039; kapselt die dbExpress-Verbindung zu einem Datenbankserver.&lt;br /&gt;
#** Setzen Sie die Eigenschaft [[lib_de:System.Classes.TComponent.Name|Name]] auf &#039;&#039;&#039;SQLConnection_EMPLOYEE&#039;&#039;&#039;.&lt;br /&gt;
#** Setzen Sie die Eigenschaft [[lib_de:Data.SqlExpr.TSQLConnection.LoginPrompt|LoginPrompt]] auf &#039;&#039;&#039;False&#039;&#039;&#039;.&lt;br /&gt;
#** Setzen Sie &#039;&#039;&#039;Driver&#039;&#039;&#039; auf &#039;&#039;&#039;InterBase Server&#039;&#039;&#039;.&lt;br /&gt;
#*:&lt;br /&gt;
#*:: &#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Stellen Sie sicher, dass der &#039;&#039;&#039;InterBase-Server&#039;&#039;&#039; ausgeführt wird.&lt;br /&gt;
#** Erweitern Sie den Knoten &#039;&#039;&#039;Driver&#039;&#039;&#039;, und setzen Sie die Eigenschaft &#039;&#039;&#039;DataBase&#039;&#039;&#039; auf {{Path|{{DataSamplesPath}}\EMPLOYEE.GDB}}.&lt;br /&gt;
#** Setzen Sie Eigenschaft [[lib_de:Data.SqlExpr.TSQLConnection.Connected|Connected]] auf &#039;&#039;&#039;True&#039;&#039;&#039;. Falls Sie eine Fehlermeldung erhalten, überprüfen Sie die &#039;&#039;&#039;Driver&#039;&#039;&#039;-Eigenschaften:&lt;br /&gt;
#**: [[File:DefineConnectionToInterBase.png|500px]]&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
#* Ziehen Sie eine [[lib_de:Data.SqlExpr.TSQLDataSet|TSQLDataSet]]-Komponente in das Servermodul, und legen Sie die folgenden Eigenschaften fest:&lt;br /&gt;
#*: &#039;&#039;&#039;TSQLDataSet&#039;&#039;&#039; stellt die Daten dar, die mit dbExpress abgerufen wurden.&lt;br /&gt;
#** Setzen Sie die Eigenschaft &#039;&#039;&#039;[[lib_de:System.Classes.TComponent.Name|Name]]&#039;&#039;&#039; auf &#039;&#039;&#039;SQLDataSet_EMPLOYEE&#039;&#039;&#039;.&lt;br /&gt;
#** Setzen Sie die Eigenschaft &#039;&#039;&#039;[[lib_de:Data.SqlExpr.TSQLDataSet.SQLConnection|SQLConnection]]&#039;&#039;&#039; auf &#039;&#039;&#039;SQLConnection_EMPLOYEE&#039;&#039;&#039;.&lt;br /&gt;
#** Setzen Sie die Eigenschaft &#039;&#039;&#039;[[lib_de:Data.SqlExpr.TSQLDataSet.CommandType|CommandType]]&#039;&#039;&#039; auf &#039;&#039;&#039;ctTable&#039;&#039;&#039;.&lt;br /&gt;
#** Setzen Sie die Eigenschaft &#039;&#039;&#039;[[lib_de:Data.SqlExpr.TSQLDataSet.CommandText|CommandText]]&#039;&#039;&#039; auf &#039;&#039;&#039;EMPLOYEE&#039;&#039;&#039;.&lt;br /&gt;
#** Setzen Sie die Eigenschaft &#039;&#039;&#039;[[lib_de:Data.SqlExpr.TCustomSQLDataSet.Active|Active]]&#039;&#039;&#039; auf &#039;&#039;&#039;True&#039;&#039;&#039;. Falls Sie eine Fehlermeldung erhalten, überprüfen Sie die Eigenschaften, die Sie gerade konfiguriert haben.&lt;br /&gt;
#* Ziehen Sie eine [[lib_de:Datasnap.Provider.TDataSetProvider|TDataSetProvider]]-Komponente in das Servermodul, und legen Sie die folgenden Eigenschaften fest:&lt;br /&gt;
#*: Die Komponente &#039;&#039;&#039;TDataSetProvider&#039;&#039;&#039; packt Daten aus einer Datenmenge und übergibt ein oder mehrere übertragbare Datenpakete an den DataSnap-Client.&lt;br /&gt;
#** Setzen Sie die Eigenschaft &#039;&#039;&#039;[[lib_de:System.Classes.TComponent.Name|Name]]&#039;&#039;&#039; auf &#039;&#039;&#039;DataSetProvider_EMPLOYEE&#039;&#039;&#039;.&lt;br /&gt;
#** Setzen Sie die Eigenschaft &#039;&#039;&#039;[[lib_de:Datasnap.Provider.TDataSetProvider.DataSet|DataSet]]&#039;&#039;&#039; auf &#039;&#039;&#039;SQLDataSet_EMPLOYEE&#039;&#039;&#039;:&lt;br /&gt;
#** [[File:ServerModuleUnit.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; In diesem Tutorial wird InterBase verwendet. Sie können aber mit denselben Schritten eine Verbindung zu jedem beliebigen Datenbankserver herstellen. Wählen Sie für die Verbindung den entsprechenden Treiber und andere Eigenschaften für die jeweilige Datenbank aus.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Bereitstellen der Datenmenge vom DataSnap-Server===&lt;br /&gt;
&lt;br /&gt;
Sie haben gerade ein neues Servermodul mit einer DataSet-Komponente und einer DataSetProvider-Komponente erstellt, die Daten in die nächste Schicht packt. Als Nächstes muss das Servermodul für den DataSnap-Client bereitgestellt werden.&lt;br /&gt;
&lt;br /&gt;
# Öffnen Sie im Formular-Designer &#039;&#039;&#039;ServerContainerUnit&#039;&#039;&#039;.&lt;br /&gt;
# Wählen Sie &#039;&#039;&#039;DSServerClass1&#039;&#039;&#039;, und aktualisieren Sie die vorhandene Ereignisbehandlungsroutine für das Ereignis &#039;&#039;&#039;OnGetClass&#039;&#039;&#039;. Fügen Sie der Ereignisbehandlungsroutine &#039;&#039;&#039;DSServerClass1&#039;&#039;&#039; den folgenden Quelltext hinzu:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Delphi:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Delphi&amp;quot;&amp;gt;&lt;br /&gt;
procedure TServerContainer1.DSServerClass1GetClass(DSServerClass: TDSServerClass;&lt;br /&gt;
  var PersistentClass: TPersistentClass);&lt;br /&gt;
begin&lt;br /&gt;
  PersistentClass := TDSServerModule_EMPLOYEE;&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;C++ (nur für iOS):&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void __fastcall TServerContainer1::DSServerClass1GetClass(TDSServerClass *DSServerClass,&lt;br /&gt;
          TPersistentClass &amp;amp;PersistentClass)&lt;br /&gt;
{&lt;br /&gt;
        PersistentClass =  __classid(TDSServerModule_EMPLOYEE);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Mit dieser Ereignisbehandlungsroutine stellt der DataSnap-Server Provider und public-Methoden in dieser Klasse für einen DataSnap-Client bereit.&lt;br /&gt;
Ausgehend von den Schritten im vorherigen Abschnitt wird nun die Komponente &#039;&#039;&#039;DataSetProvider_EMPLOYEE DataSetProvider&#039;&#039;&#039; für den DataSnap-Client bereitgestellt.&lt;br /&gt;
&lt;br /&gt;
===Ausführen des DataSnap-Servers===&lt;br /&gt;
&lt;br /&gt;
Die Implementierung des DataSnap-Servers ist abgeschlossen. Klicken Sie mit der rechten Maustaste auf &#039;&#039;&#039;DataSnapServerProject.exe&#039;&#039;&#039;, und wählen Sie &#039;&#039;&#039;Ohne Debugger ausführen&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
[[File:RunDataSnapServerProjectWihoutDebugging.png]].&lt;br /&gt;
&lt;br /&gt;
Der DataSnap-Server wird nun auf Ihrem Windows-Computer ausgeführt. Da dieser DataSnap-Server keine UI-Elemente hat, sieht er wie ein leeres Formular aus, und das ist hier genau das erwartete Verhalten.&lt;br /&gt;
&lt;br /&gt;
[[File:RunDataSnapServerRunningOnWindows.png]]&lt;br /&gt;
&lt;br /&gt;
==Erstellen einer mobilen Anwendung für die Verbindung zum DataSnap-Server==&lt;br /&gt;
&lt;br /&gt;
Als Nächstes wird die mobile Client-Anwendung erstellt.&lt;br /&gt;
&lt;br /&gt;
# Klicken Sie in der [[Projekte-Fenster|Projektverwaltung]] mit der rechten Maustaste auf &#039;&#039;&#039;DataSnapTutorialProjectGroup&#039;&#039;&#039;, und wählen Sie &#039;&#039;&#039;Neues Projekt hinzufügen&#039;&#039;&#039;.&lt;br /&gt;
#: [[File:AddNewProjectToDataSnapTutorialProjectGroup.png]]&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
# Wählen Sie auf der Seite &#039;&#039;&#039;{{Delphi}}-Projekte&#039;&#039;&#039; den Eintrag &#039;&#039;&#039;Geräteübergreifende Anwendung&#039;&#039;&#039; aus:&lt;br /&gt;
#: [[File:SelectFireMonkeyMobileApplication.png|400px]]&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
# Speichern Sie die neue Unit unter &#039;&#039;&#039;DataSnapClientUnit&#039;&#039;&#039;.&lt;br /&gt;
# Speichern Sie das neue Projekt unter &#039;&#039;&#039;DataSnapClientProject&#039;&#039;&#039;.&lt;br /&gt;
# Öffnen Sie &#039;&#039;&#039;DataSnapClientUnit&#039;&#039;&#039;, und ändern Sie die Eigenschaft &#039;&#039;&#039;Name&#039;&#039;&#039; des Formulars in &#039;&#039;&#039;DSClientForm&#039;&#039;&#039;.&lt;br /&gt;
# Ziehen Sie die folgenden Komponenten in den &#039;&#039;&#039;[[Formular-Designer|Formular-Designer]]&#039;&#039;&#039;:&lt;br /&gt;
#*[[lib_de:Data.SqlExpr.TSQLConnection|TSQLConnection]] (SQLConnection1)&lt;br /&gt;
#*: &#039;&#039;&#039;TSQLConnection&#039;&#039;&#039; kapselt die dbExpress-Verbindung zu einem Datenbankserver. Außerdem unterstützt die Komponente den DataSnap-Server.&lt;br /&gt;
#** Setzen Sie die Eigenschaft &#039;&#039;&#039;Driver&#039;&#039;&#039; auf &#039;&#039;&#039;DataSnap&#039;&#039;&#039;.&lt;br /&gt;
#** Erweitern Sie die Eigenschaft &#039;&#039;&#039;Driver&#039;&#039;&#039;, und setzen Sie die Eigenschaft &#039;&#039;&#039;HostName&#039;&#039;&#039; auf den Host-Namen oder die IP-Adresse des DataSnap-Servers.&lt;br /&gt;
#** Setzen Sie die Eigenschaft [[lib_de:Data.SqlExpr.TSQLConnection.LoginPrompt|LoginPrompt]] auf &#039;&#039;&#039;False&#039;&#039;&#039;.&lt;br /&gt;
#** Setzen Sie Eigenschaft [[lib_de:Data.SqlExpr.TSQLConnection.Connected|Connected]] auf &#039;&#039;&#039;True&#039;&#039;&#039;.&lt;br /&gt;
#**: Wenn Sie eine Fehlermeldung erhalten, überprüfen Sie die gerade festgelegten Eigenschaften nochmals.&lt;br /&gt;
#*[[lib_de:Datasnap.DSConnect.TDSProviderConnection|TDSProviderConnection]] (DSProviderConnection1)&lt;br /&gt;
#*: Die Komponente [[lib_de:Datasnap.DSConnect.TDSProviderConnection|TDSProviderConnection]] stellt die Konnektivität zu DataSnap-Servern mithilfe von dbExpress her.&lt;br /&gt;
#** Setzen Sie die Eigenschaft [[lib_de:Datasnap.DSConnect.TDSProviderConnection.SQLConnection|SQLConnection]] auf &#039;&#039;&#039;SQLConnection1&#039;&#039;&#039;.&lt;br /&gt;
#** Setzen Sie &#039;&#039;&#039;ServerClassName&#039;&#039;&#039; auf &#039;&#039;&#039;TDSServerModule_EMPLOYEE&#039;&#039;&#039;. Dieser Name muss mit dem Namen der Klasse des Servermoduls des DataSnap-Servers übereinstimmen.&lt;br /&gt;
#** Setzen Sie Eigenschaft [[lib_de:Datasnap.DSConnect.TDSProviderConnection.Connected|Connected]] auf &#039;&#039;&#039;True&#039;&#039;&#039;.&lt;br /&gt;
#*[[lib_de:Datasnap.DBClient.TClientDataSet|TClientDataSet]] (ClientDataSet1)&lt;br /&gt;
#*: TClientDataSet implementiert eine datenbankunabhängige Datenmenge, die als lokaler Speicherpuffer der Datensätze aus einer anderen Datenmenge verwendet werden kann.&lt;br /&gt;
#** Setzen Sie die Eigenschaft [[lib_de:Datasnap.DBClient.TClientDataSet.RemoteServer|RemoteServer]] auf &#039;&#039;&#039;DSProviderConnection1&#039;&#039;&#039;.&lt;br /&gt;
#** Setzen Sie die Eigenschaft [[lib_de:Datasnap.DBClient.TClientDataSet.ProviderName|ProviderName]] auf &#039;&#039;&#039;DataSetProvider_EMPLOYEE&#039;&#039;&#039;. Dieser Name muss mit dem Namen des Providers für den DataSnap-Server übereinstimmen.&lt;br /&gt;
#** Setzen Sie die Eigenschaft [[lib_de:Datasnap.DBClient.TClientDataSet.Active|Active]] auf &#039;&#039;&#039;True&#039;&#039;&#039;.&lt;br /&gt;
#*[[lib_de:FMX.ListBox.TListBox|TListBox]]&lt;br /&gt;
#** Setzen Sie die Eigenschaft [[lib_de:FMX.ListBox.TListBox.Align|Align]] auf &#039;&#039;&#039;Client&#039;&#039;&#039;:&lt;br /&gt;
#: [[File:Configure iOSDataSnapClient.png]]&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
# Öffnen Sie den [[LiveBindings-Designer|LiveBindings-Designer]], und verbinden Sie die Daten und die Benutzeroberfläche folgendermaßen:&lt;br /&gt;
## Klicken Sie in BindSourceDB1 auf &#039;&#039;&#039;FULL_NAME&#039;&#039;&#039;, und ziehen Sie den Mauszeiger auf &#039;&#039;&#039;Item.Text&#039;&#039;&#039; in ListBox1:&lt;br /&gt;
##: [[File:ConnectFullNameToItemText.png]]&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
## Nun haben Sie den DataSnap-Client auf der mobilen Plattform erstellt und konfiguriert. Die Daten vom DataSnap-Server sollten nun in der IDE angezeigt werden:&lt;br /&gt;
##:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
!&lt;br /&gt;
&#039;&#039;&#039; iOS&#039;&#039;&#039;&lt;br /&gt;
!&lt;br /&gt;
&#039;&#039;&#039; Android&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:DSClientCompleted.png|250px]]&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|[[File:DSClientCompletedAndroid.png|250px]]&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Bereitstellen der MIDAS-Bibliothek auf dem iOS-Simulator==&lt;br /&gt;
&lt;br /&gt;
Damit Ihre Anwendung auf dem iOS-Simulator ausgeführt werden kann, müssen Sie die folgenden Dateien bereitstellen:&lt;br /&gt;
&lt;br /&gt;
* MIDAS-Bibliothek&lt;br /&gt;
&lt;br /&gt;
# Öffnen Sie den [[Bereitstellungs-Manager|Bereitstellungs-Manager]] durch Auswahl von &amp;lt;font color=&amp;quot;#598527&amp;quot;&amp;gt;&#039;&#039;&#039;Projekt &amp;amp;gt; Bereitstellung&#039;&#039;&#039;&amp;lt;/font&amp;gt;.&lt;br /&gt;
# Wählen Sie [[Bereitstellungs-Manager - Weitere Dateien hinzufügen|Weitere Dateien hinzufügen]] ([[Image:DMgrAddFeatFiles.png]]):&lt;br /&gt;
#: [[File:AddingFeaturedFiles.png]]&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
# Wählen Sie das folgende Modul aus, und klicken Sie dann auf &#039;&#039;&#039;OK&#039;&#039;&#039;, um den Bereitstellungs-Manager zu schließen:&lt;br /&gt;
#* MIDAS-Bibliothek&lt;br /&gt;
#*: [[File:SelectingMIDASFeaturedFiles.png]]&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ausführen der Anwendung auf der mobilen Plattform==&lt;br /&gt;
&lt;br /&gt;
Ihre Anwendung kann nun ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
Wählen Sie in der [[Projekte-Fenster|Projektverwaltung]] die mobile Zielplattform, und führen Sie Ihre Anwendung aus. Sie sollten genau wie in der IDE durch die Daten blättern können.&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
&lt;br /&gt;
* [[Mobile-Tutorial: Verwenden von InterBase ToGo mit dbExpress (iOS und Android)|Mobile-Tutorial: Verwenden von InterBase ToGo mit dbExpress (iOS und Android)]]&lt;br /&gt;
* [[Mobile-Tutorial: Verwenden von dbExpress und SQLite (iOS und Android)|Mobile-Tutorial: Verwenden von dbExpress und SQLite (iOS und Android)]]&lt;br /&gt;
* [[Mobile-Tutorial: Verwenden von FireDAC in mobilen Anwendungen (iOS und Android)|Mobile-Tutorial: Verwenden von FireDAC in mobilen Anwendungen (iOS und Android)]]&lt;br /&gt;
* [[DataSnap-Anwendungen entwickeln|DataSnap-Anwendungen entwickeln]]&lt;br /&gt;
* [[Grundlagen der mehrschichtigen Datenbank-Anwendungen|Grundlagen der mehrschichtigen Datenbank-Anwendungen]]&lt;br /&gt;
* [[lib_de:Datasnap.DSServer.TDSServer|Datasnap.DSServer.TDSServer]]&lt;br /&gt;
* [http://docwiki.embarcadero.com/InterBase/2020/en/Start_the_InterBase_Server Start the InterBase Server]&lt;br /&gt;
&lt;br /&gt;
[[Category:Delphi]]&lt;br /&gt;
[[Category:FMX]]&lt;br /&gt;
[[Category:IOS]]&lt;br /&gt;
[[Category:XE4]]&lt;br /&gt;
[[Category:Android]]&lt;br /&gt;
&lt;br /&gt;
[[en:Mobile Tutorial: Connecting to an Enterprise Database from a Mobile Client (iOS and Android)]]&lt;br /&gt;
[[fr:Tutoriel mobile : Connexion à une base de données d&#039;entreprise depuis un client mobile (iOS et Android)]]&lt;br /&gt;
[[ja:モバイル チュートリアル：モバイル クライアントからエンタープライズ データベースに接続する（iOS および Android）]]&lt;/div&gt;</summary>
		<author><name>Nicolas.rios</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=InterBase_ToGo_mit_dbExpress&amp;diff=218588</id>
		<title>InterBase ToGo mit dbExpress</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=InterBase_ToGo_mit_dbExpress&amp;diff=218588"/>
		<updated>2024-03-20T15:04:23Z</updated>

		<summary type="html">&lt;p&gt;Nicolas.rios: RS-121926&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Parent|Datenbankanwendungen entwickeln}}&lt;br /&gt;
Ab XE3 unterstützt {{Product}} InterBase ToGo-Datenbanken.&lt;br /&gt;
&lt;br /&gt;
==Änderungen==&lt;br /&gt;
Ab XE3 wurde in {{Product}} das [[DbExpress-Framework|dbExpress-Framework]] durch Hinzufügen eines InterBase ToGo-spezifischen Treibers erweitert. Durch diese Änderung können Benutzer Verbindungen mit InterBase ToGo-Datenbanken in {{Delphi}}- und C++-Anwendungen über dbExpress einfacher einrichten.&lt;br /&gt;
&lt;br /&gt;
==Verwenden des InterBase ToGo-Treibers==&lt;br /&gt;
&lt;br /&gt;
Der InterBase ToGo-Treiber kann nur zur Laufzeit verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie beim Entwurf eine Verbindung mit InterBase ToGo aktivieren oder im [[Daten-Explorer]] eine geöffnete InterBase ToGo-Verbindung vorhanden ist und Sie versuchen, die Anwendung auszuführen, erhalten Sie einen Laufzeitfehler.  Und zwar, weil für die InterBase ToGo-Serverlizenz der exklusive Zugriff auf die Datenbank erforderlich ist. Da beim Entwurf bereits eine Verbindung geöffnet ist, können Sie in der Anwendung, die Sie erzeugen/ausführen, keine lokale Verbindung zu derselben Datenbank öffnen. InterBase ToGo ist nur als Bereitstellungsoption gedacht und sollte nicht in der IDE oder im [[Daten-Explorer]] verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Verwenden Sie deshalb beim Entwurf und im [[Daten-Explorer]] die Vollversion des [[InterBase|InterBase]]-Clients.&lt;br /&gt;
&lt;br /&gt;
==Beispiel==&lt;br /&gt;
Das folgende Beispiel ist ein Tutorial zum Einrichten einer Verbindung mit einer InterBase ToGo-Datenbank in einer {{Delphi}}-VCL-Formularanwendung:&lt;br /&gt;
&lt;br /&gt;
===Schritte===&lt;br /&gt;
# Wählen Sie &amp;lt;font color=&amp;quot;#598527&amp;quot;&amp;gt;&#039;&#039;&#039;Datei &amp;amp;gt; Neu &amp;amp;gt; VCL-Formularanwendung - {{Delphi}}&#039;&#039;&#039;&amp;lt;/font&amp;gt;.&lt;br /&gt;
# Fügen Sie dem Formular die folgenden Komponenten hinzu:&lt;br /&gt;
#* Ein [[lib_de:Vcl.StdCtrls.TButton|TButton]]-Steuerelement; setzen Sie im [[Objektinspektor|Objektinspektor]] die Eigenschaft [[lib_de:System.Classes.TComponent.Name|Name]] der Schaltfläche auf &amp;lt;code&amp;gt;connectButton&amp;lt;/code&amp;gt; und die Eigenschaft [[lib_de:Vcl.StdCtrls.TButton.Caption|Caption]] auf &amp;lt;code&amp;gt;Connect&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* Ein [[lib_de:Data.SqlExpr.TSQLConnection|TSQLConnection]]-Steuerelement.&lt;br /&gt;
#* Ein [[lib_de:Vcl.StdCtrls.TMemo|TMemo]]-Steuerelement; setzen Sie im [[Objektinspektor|Objektinspektor]] die Eigenschaft [[lib_de:System.Classes.TComponent.Name|Name]] auf &amp;lt;code&amp;gt;outputMemo&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Fügen Sie der [[lib_de:Vcl.Controls.TControl.OnClick|OnClick]]-Ereignisbehandlungsroutine für &amp;lt;code&amp;gt;connectButton&amp;lt;/code&amp;gt; den folgenden Code hinzu.&lt;br /&gt;
&amp;lt;source lang=Delphi&amp;gt;&lt;br /&gt;
procedure TForm1.connectButtonClick(Sender: TObject);&lt;br /&gt;
 begin&lt;br /&gt;
   // create a new TSQLConnection object&lt;br /&gt;
   SQLConnection1 := TSQLConnection.Create(nil);&lt;br /&gt;
   // set the driver of the TSQLConnection control&lt;br /&gt;
   SQLConnection1.DriverName := &#039;IBToGo&#039;;&lt;br /&gt;
   // add the Database parameter to Params&lt;br /&gt;
   SQLConnection1.Params.Add(&#039;Database=full_path_to_your_database_file&#039;);&lt;br /&gt;
   // set the Username and Password parameters&lt;br /&gt;
   SQLConnection1.Params.Add(&#039;User_Name=SYSDBA&#039;);&lt;br /&gt;
   SQLConnection1.Params.Add(&#039;Password=masterkey&#039;);&lt;br /&gt;
   try&lt;br /&gt;
     // open the connection&lt;br /&gt;
     SQLConnection1.Open;&lt;br /&gt;
     Memo1.Text := &#039;Connection established&#039;;&lt;br /&gt;
   except&lt;br /&gt;
     on E: Exception do&lt;br /&gt;
       Memo1.Text := &#039;Exception raised with message : &#039; + #13#10 + E.Message;&lt;br /&gt;
   end;&lt;br /&gt;
 end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[InterBase ToGo]]&lt;br /&gt;
* [[Mobile-Tutorial: Verwenden von InterBase ToGo mit dbExpress (iOS und Android)]]&lt;br /&gt;
* [http://docwiki.embarcadero.com/InterBase/2020/en/ToGo_Quick_Start InterBase 2020 ToGo Quick Start Guide]&lt;br /&gt;
* [[lib_de:Data.SqlExpr.TSQLConnection|Data.SqlExpr.TSQLConnection]]&lt;br /&gt;
* [[lib_de:Vcl.StdCtrls.TButton|Vcl.StdCtrls.TButton]]&lt;br /&gt;
* [[lib_de:Vcl.StdCtrls.TMemo|Vcl.StdCtrls.TMemo]]&lt;br /&gt;
* [[lib_de:Vcl.Controls.TControl.OnClick|Vcl.Controls.TControl.OnClick]]&lt;br /&gt;
* [[Objektinspektor|Objektinspektor]]&lt;br /&gt;
* [[lib_de:System.Classes.TComponent.Name|System.Classes.TComponent.Name]]&lt;br /&gt;
* [[lib_de:Vcl.StdCtrls.TButton.Caption|Vcl.StdCtrls.TButton.Caption]]&lt;br /&gt;
* [[Daten-Explorer]]&lt;br /&gt;
* [[InterBase]]&lt;br /&gt;
[[Category:XE3]]&lt;br /&gt;
&lt;br /&gt;
[[en:InterBase ToGo with dbExpress]]&lt;br /&gt;
[[fr:InterBase ToGo avec dbExpress]]&lt;br /&gt;
[[ja:DbExpress での InterBase ToGo の使用]]&lt;/div&gt;</summary>
		<author><name>Nicolas.rios</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Benachrichtigungen_%C3%BCber_Daten%C3%A4nderungen_(FireDAC)&amp;diff=218587</id>
		<title>Benachrichtigungen über Datenänderungen (FireDAC)</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Benachrichtigungen_%C3%BCber_Daten%C3%A4nderungen_(FireDAC)&amp;diff=218587"/>
		<updated>2024-03-20T14:31:10Z</updated>

		<summary type="html">&lt;p&gt;Nicolas.rios: RS-121926&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
{{Parent|Arbeiten mit Anweisungen (FireDAC)}}&lt;br /&gt;
&lt;br /&gt;
Mit der Funktion &amp;quot;Benachrichtigungen über Datenänderungen&amp;quot; können Sie Datenbank-Clients über Datenänderungen für einige Datenbanken benachrichtigen. Diese Funktion findet Änderungen in Daten in einer Datenbank (wie {{code|INSERT}}-, {{code|UPDATE}}- oder {{code|DELETE}}-Operationen) und benachrichtigt den Datenbank-Client über diese Änderungen.&lt;br /&gt;
&lt;br /&gt;
FireDAC unterstützt die Funktion &amp;quot;Benachrichtigungen über Änderungen&amp;quot; für verschiedene Datenbanken (siehe [[#Unterstützung für Änderungsbenachrichtigungen|Unterstützung für Änderungsbenachrichtigungen]]). FireDAC verwendet verschiedene Methoden, um diese Funktion, abhängig von der Art der Datenbank, zu implementieren. Dieses Thema beschreibt die allgemeinen Informationen der Funktion &amp;quot;Benachrichtigungen über FireDAC-Datenänderungen&amp;quot; und gibt dann einige [[#Benachrichtigungen über Datenänderungen für Spezifisches DBMS|Gesichtspunkte für spezifische DBMS-Implementierungen]].&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen über Mechanismen für Datenbankwarnungen finden Sie unter [[Datenbankwarnungen (FireDAC)|Datenbankwarnungen]].&lt;br /&gt;
&lt;br /&gt;
==Einrichten der Funktion &amp;quot;Benachrichtigung über FireDAC-Datenänderungen&amp;quot;==&lt;br /&gt;
&lt;br /&gt;
Um die Funktion &amp;quot;Benachrichtigung über FireDAC-Datenänderungen&amp;quot; auf einer FireDAC-Anwendung einzurichten, sollten Sie die folgenden Hauptkomponenten hinzufügen und konfigurieren:&lt;br /&gt;
&lt;br /&gt;
* Ein [[lib_de:FireDAC.Comp.Client.TFDConnection|TFDConnection]]-Objekt -  Dies ist das FireDAC-Verbindungsobjekt, mit dem eine Verbindung zu einem DBMS hergestellt wird.&lt;br /&gt;
{{Note| In diesem Abschnitt wird davon ausgegangen, dass Sie das Tutorial [[Erste Schritte bei der Verwendung von FireDAC|Erste Schritte bei der Verwendung von FireDAC]], das Anleitungen zum Entwickeln einer einfachen VCL-Anwendung zur Verbindung mit Demo-Datenbanken bereitstellt, gelesen und verstanden haben.}}&lt;br /&gt;
&lt;br /&gt;
* Ein [[lib_de:FireDAC.Comp.Client.TFDQuery|TFDQuery]]-Objekt - Dies ist das FireDAC-Objekt, mit dem Datenmengen, die SQL-Abfragen ausführen können, implementiert werden. Sie sollten die folgenden Grundeigenschaften der SQL-Abfrage, die festgestellt wird, implementieren:&lt;br /&gt;
** Die [[lib_de:FireDAC.Comp.Client.TFDRdbmsDataSet.Connection|Connection]]-Eigenschaft muss gesetzt werden, damit das FireDAC-Verbindungsobjekt angegeben wird.&lt;br /&gt;
** Die [[lib_de:FireDAC.Comp.Client.TFDQuery.SQL|SQL]]-Eigenschaft muss mit der gewünschten SQL-Anweisung gesetzt werden. &lt;br /&gt;
** Die [[lib_de:FireDAC.Comp.Client.TFDQuery.ChangeAlerter|ChangeAlerter]]-Eigenschaft muss gesetzt werden, damit das FireDAC-Warnobjekt, das mit Ihrer Datenmenge assoziiert ist, angegeben wird.&lt;br /&gt;
** Die [[lib_de:FireDAC.Comp.Client.TFDQuery.ChangeAlertName|ChangeAlertName]]-Eigenschaft kann gesetzt werden, damit der Name der Basistabelle, deren Änderungen festgestellt wurden, angegeben wird.&lt;br /&gt;
&lt;br /&gt;
* Ein [[lib_de:FireDAC.Comp.Client.TFDEventAlerter|TFDEventAlerter]]-Objekt - Dies ist das Objekt, mit dem die Benachrichtigungen über Datenbankänderungen behandelt werden. Sie sollten die folgenden Grundeigenschaften der Ereigniswarnung konfigurieren:&lt;br /&gt;
** Mit der [[lib_de:FireDAC.Comp.Client.TFDEventAlerter.Options|Options]]-Eigenschaft kann eine [[lib_de:FireDAC.Stan.Option.TFDEventAlerterOptions|Menge von Eigenschaften]] festgelegt werden, um das Verhalten der Ereigniswarnung zu kontrollieren.&lt;br /&gt;
** Die [[lib_de:FireDAC.Comp.Client.TFDEventAlerter.SubscriptionName|SubscriptionName]]-Eigenschaft muss gesetzt werden, damit der Substriptionsname der Änderungsbenachrichtigung angegeben wird. Es hängt vom Typ der Datenbank, die Sie verwenden, ab.&lt;br /&gt;
{{Note| Aktivieren Sie [[lib_de:FireDAC.Comp.Client.TFDEventAlerter|TFDEventAlerter]] vor der Ausführung der gefundenen [[lib_de:FireDAC.Comp.Client.TFDQuery|TFDQuery]]. Dies ist nötig, da die Anweisung mit der Abfragebenachrichtigungs-API vor der Ausführung registriert werden muss. Dies ist eine Anforderung vom SQL-Server und Oracle.}}&lt;br /&gt;
&lt;br /&gt;
==Antworten auf Änderungsbenachrichtigungen==&lt;br /&gt;
&lt;br /&gt;
Beim Empfang einer Benachrichtigung über Datenänderungen ruft FireDAC die Änderungen automatisch ab und aktualisiert die Datenmenge. Dieser Prozess wird von den folgenden Eigenschaften der Komponente [[lib_de:FireDAC.Comp.Client.TFDEventAlerter|TFDEventAlerter]] gesteuert:&lt;br /&gt;
&lt;br /&gt;
* [[lib_de:FireDAC.Comp.Client.TFDCustomEventAlerter.Options|FireDAC.Comp.Client.TFDCustomEventAlerter.Options]].[[lib_de:FireDAC.Stan.Option.TFDEventAlerterOptions.AutoRefresh|AutoRefresh]]&lt;br /&gt;
* [[lib_de:FireDAC.Comp.Client.TFDCustomEventAlerter.Options|FireDAC.Comp.Client.TFDCustomEventAlerter.Options]].[[lib_de:FireDAC.Stan.Option.TFDEventAlerterOptions.Timeout|Timeout]]&lt;br /&gt;
* [[lib_de:FireDAC.Comp.Client.TFDCustomEventAlerter.Options|FireDAC.Comp.Client.TFDCustomEventAlerter.Options]].[[lib_de:FireDAC.Stan.Option.TFDEventAlerterOptions.MergeData|MergeData]]&lt;br /&gt;
&lt;br /&gt;
Jedes der Demo-Projekte, die in [[#Benachrichtigungen über Datenänderungen für Spezifisches DBMS|Benachrichtigungen über Datenänderungen für Spezifisches DBMS]] aufgelistet sind, zeigt, wie das oben genannte Szenario verwendet wird.&lt;br /&gt;
&lt;br /&gt;
Außerdem können Sie die [[lib_de:FireDAC.Comp.Client.TFDCustomEventAlerter.OnAlert|TFDCustomEventAlerter.OnAlert]]-Ereignisbehandlungsroutine verwenden, die nach dem Ermitteln jeder Änderung der gefundenen Datenmenge ausgelöst wird. Mit dieser Ereignisbehandlungsroutine können Sie Ihr benutzerdefiniertes Szenario implementieren, um auf Benachrichtigungen über Datenänderungen zu antworten. Der folgende Code implementiert eine [[lib_de:FireDAC.Comp.Client.TFDCustomEventAlerter.OnAlert|OnAlert]]-Ereignisbehandlungsroutine, die eine Benachrichtigung anzeigt, wenn jede Daten in einer Datenbank geändert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;l s=&amp;quot;delphi&amp;quot; /&amp;gt;&#039;&#039;&#039;{{Delphi}}&#039;&#039;&#039;:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Delphi&amp;quot;&amp;gt;&lt;br /&gt;
procedure TForm1.FDEventAlerter1Alert(ASender: TFDCustomEventAlerter;&lt;br /&gt;
  const AEventName: string; const AArgument: Variant);&lt;br /&gt;
begin&lt;br /&gt;
ShowMessage(&#039;Detected changes to the demo dataset.&#039;);&lt;br /&gt;
end;&amp;lt;/source&amp;gt;&amp;lt;l e=&amp;quot;delphi&amp;quot; /&amp;gt;&amp;lt;l s=&amp;quot;cpp&amp;quot; /&amp;gt;&#039;&#039;&#039;{{CBuilder}}:&#039;&#039;&#039; &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void __fastcall TForm1::FDEventAlerter1Alert(TFDCustomEventAlerter *ASender, const UnicodeString AEventName,&lt;br /&gt;
          const Variant &amp;amp;AArgument)&lt;br /&gt;
{&lt;br /&gt;
  ShowMessage(&amp;quot;Detected changes to the demo dataset. &amp;quot;);&lt;br /&gt;
}&amp;lt;/source&amp;gt;&amp;lt;l e=&amp;quot;cpp&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Unterstützung für Änderungsbenachrichtigungen==&lt;br /&gt;
&lt;br /&gt;
Die folgende Tabelle enthält eine Zusammenfassung der für das jeweilige DBMS verwendeten Änderungsbenachrichtigung.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; frame=&amp;quot;hsides&amp;quot; rules=&amp;quot;rows&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;DBMS&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Typ der Änderungsbenachrichtigung&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Delta-Typ&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;TFDEventAlerter.SubscriptionName&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |InterBase&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |Event Alerter (manuelle Benachrichtigung)&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |Change Views (automatisches Delta)&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |Abonnementname von InterBase Change View&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |MS SQL Server&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |Query Update Notification (automatische Benachrichtigung)&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |Keiner (vollständige Datenmengenaktualisierung)&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |Benachrichtigungsmeldungstext&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align: left; vertical-align: middle;&amp;quot; | Oracle&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |DBMS_ALERT / DBMS_PIPE (manuelle Benachrichtigung)&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |Keiner (vollständige Datenmengenaktualisierung)&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |Benachrichtigungsmeldungstext&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |Continuous Query Notification (CQN)&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |Automatisches Delta&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |Jeder Wert&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |Advantage Database&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |Event Alerter (manuelle Benachrichtigung)&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |Keiner (vollständige Datenmengenaktualisierung)&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |Benachrichtigungsmeldungstext&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |Sybase SQL Anywhere&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |Meldungen (manuelle Benachrichtigung)&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |Keiner (vollständige Datenmengenaktualisierung)&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |Benachrichtigungsmeldungstext&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |DataSnap-Server&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |Callbacks (manuelle Benachrichtigung)&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |Keiner (vollständige Datenmengenaktualisierung)&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |Benachrichtigungsmeldungstext&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |DB2&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |DBMS_ALERT / DBMS_PIPE (manuelle Benachrichtigung)&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |Keiner (vollständige Datenmengenaktualisierung)&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |Benachrichtigungsmeldungstext&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |Firebird&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |Event Alerter (manuelle Benachrichtigung)&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |Keiner (vollständige Datenmengenaktualisierung)&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |Benachrichtigungsmeldungstext&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |Informix&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |DBMS_ALERT (manuelle Benachrichtigung)&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |Keiner (vollständige Datenmengenaktualisierung)&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |Benachrichtigungsmeldungstext&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |PostgreSQL&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |Ereignisbenachrichtigung (manuelle Benachrichtigung)&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |Keiner (vollständige Datenmengenaktualisierung)&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |Benachrichtigungsmeldungstext&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |SQLite&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |Event Alerter (manuelle Benachrichtigung)&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |Keiner (vollständige Datenmengenaktualisierung)&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |Benachrichtigungsmeldungstext&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Benachrichtigungen über Datenänderungen für Spezifisches DBMS==&lt;br /&gt;
&lt;br /&gt;
Dieser Abschnitt gibt einige Gesichtpunkte zur Implementierung der Funktion &amp;quot;Benachrichtigung über Datenänderungen&amp;quot; für verschiedene Datenbanken.&lt;br /&gt;
&lt;br /&gt;
===InterBase Change Views===&lt;br /&gt;
&lt;br /&gt;
Die Funktion Change Views ist die Interbase-Methode zur Implementierung von Benachrichtigungen über Datenbankänderungen. Weitere Informationen finden Sie unter [http://docwiki.embarcadero.com/InterBase/2020/en/Change_Views Change Views (EN)].&lt;br /&gt;
&lt;br /&gt;
Vor der Entwicklung einer InterBase-Anwendung, die die Funktion Change Views verwendet, sollten Sie eine Subskription von Change Views erstellen. Der folgende Quelltextabschnitt ist ein Beispiel für die Erstellung der Subskription:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
/* Create the xxx subscription to track changes to the &#039;yyy&#039; table */&lt;br /&gt;
CREATE SUBSCRIPTION xxx ON yyy FOR ROW (INSERT, UPDATE, DELETE);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen zur Konfigurierung der Funktion Change Views finden Sie in dem Demo-Projekt unter:&lt;br /&gt;
&lt;br /&gt;
* {{SamplesMenu}} und zu &#039;&#039;&#039;Object Pascal\Database\FireDAC\Samples\DBMS Specific\InterBase\ChangeView\Generic&#039;&#039;&#039; navigieren.&lt;br /&gt;
&lt;br /&gt;
===Oracle CQN===&lt;br /&gt;
&lt;br /&gt;
De Funktion Continuous Query Notification (CQN) ist die Oracle-Implementierung der Funktion &amp;quot;Benachrichtigung über Datenänderungen&amp;quot;. Weitere Informationen finden Sie unter [http://docs.oracle.com/cd/B28359_01/appdev.111/b28395/oci10new.htm#CJGHFEDD Continuous Query Notification (EN)].&lt;br /&gt;
&lt;br /&gt;
Um die Oracle-CQN-Funktion zu konfigurieren, sollten Sie die folgenden Gesichtspunkte in Betracht ziehen:&lt;br /&gt;
&lt;br /&gt;
* Der Oracle-Client muss die &#039;&#039;&#039;Änderungsbenachrichtigung&#039;&#039;&#039;-Rechte besitzen. Der folgende Quelltextabschnitt ist ein Beispiel dafür, wie der Benutzer dieses Recht verwendet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
/* Give change notification privilege to the xxx Oracle user */&lt;br /&gt;
GRANT DBMS_CHANGE_NOTIFICATION TO xxx;&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Die [[lib_de:FireDAC.Comp.Client.TFDQuery.SQL|SQL]]-Eigenschaft sollte die [[Verwenden von Oracle mit FireDAC#Implicit ROWIDs|{{code|ROWID}}-Spalten]] der {{code|SELECT}} Liste für die Basistabelle hinzufügen. Zum Beispiel: {{code|SELECT t.ROWID, t.* FROM table t}}.&lt;br /&gt;
{{Note| Der {{code|ROWID}}-Bezeichner ist ein [[Eindeutige Kennzeichnungsfelder (FireDAC)|Eindeutige Kennzeichnungsfeld (FireDAC) (FireDAC)]] für einer Zeile in einer Datenbank. Es wird in der Zeit erstellt, in der die Zeile in die Tabelle eingefügt wird, und freigegeben wird, wenn sie entfernt wird. ROWID-Werte haben verschiedenen wichtige Verwendungen; sie sind z. B. der schnellste Weg, um auf eine Reihe zuzugreifen.}}&lt;br /&gt;
&lt;br /&gt;
* Die folgenden Eigenschaften des [[lib_de:FireDAC.Comp.Client.TFDEventAlerter|TFDEventAlerter]]-Objekts sollten wie folgt konfiguriert werden:&lt;br /&gt;
** Setzen Sie die [[lib_de:FireDAC.Comp.Client.TFDEventAlerter.Options|Options]].[[lib_de:FireDAC.Stan.Option.TFDEventAlerterOptions.Kind|Kind]]-Eigenschaft auf {{code|QueryNotifies}}.&lt;br /&gt;
** Setzen Sie die [[lib_de:FireDAC.Comp.Client.TFDEventAlerter.SubscriptionName|SubscriptionName]]-Eigenschaft auf jeden Wert. Diese Eigenschaft kann nicht leer sein. Andernfalls ist die Abfrage völlig, statt inkrementell, aktualisiert.&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen zur Konfiguration der Oracle-CQN-Funktion finden Sie unter dem Beispiel [[samp_en:FireDAC.Oracle CQN Sample|FireDAC Oracle CQN]].&lt;br /&gt;
&lt;br /&gt;
====Bekannte Oracle-Probleme====&lt;br /&gt;
&lt;br /&gt;
Im Gegensatz zu Versionen der 11.2-Datenbank, können einige Versionen von 11.2-Client-Software keine Änderungsbenachrichtigungen, OCI-Callbacks oder Advanced Queuing (AQ)-Benachrichtigungen empfangen. Dies ist ein bekanntes Oracle-Problem. Weitere Informationen finden Sie auf der folgenden Oracle-[https://support.oracle.com/epmos/faces/DocumentDisplay?id=1310859.1 Seite (EN)].&lt;br /&gt;
&lt;br /&gt;
===Microsoft-SQL===&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen zur Konfigurierung der Funktion &amp;quot;Benachrichtigungen über Datenänderungen&amp;quot; für eine MSSQL-Datenbank finden Sie in dem Demo-Projekt unter:&lt;br /&gt;
&lt;br /&gt;
* {{SamplesMenu}} und navigieren Sie zu &#039;&#039;&#039;Object Pascal\Database\FireDAC\Samples\DBMS Specific\MSSQL\QueryNotify&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
&lt;br /&gt;
* [[Datenbankwarnungen (FireDAC)|Datenbankwarnungen (FireDAC)]]&lt;br /&gt;
* [[lib_de:FireDAC.Comp.Client.TFDEventAlerter|FireDAC.Comp.Client.TFDEventAlerter]]&lt;br /&gt;
* [[lib_de:FireDAC.Comp.Client.TFDQuery|FireDAC.Comp.Client.TFDQuery]]&lt;br /&gt;
&lt;br /&gt;
{{DEFAULTSORT:Benachrichtigungen uber Datenanderungen (FireDAC)}}&lt;br /&gt;
[[Category:FireDAC]]&lt;br /&gt;
[[Category:AMMigrate]]&lt;br /&gt;
&lt;br /&gt;
[[en:Data Change Notifications (FireDAC)]]&lt;br /&gt;
[[fr:Notifications de changements de données (FireDAC)]]&lt;br /&gt;
[[ja:データ変更通知（FireDAC）]]&lt;/div&gt;</summary>
		<author><name>Nicolas.rios</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=MediaWiki:Sidebar&amp;diff=218584</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=MediaWiki:Sidebar&amp;diff=218584"/>
		<updated>2024-01-30T20:00:02Z</updated>

		<summary type="html">&lt;p&gt;Nicolas.rios: {{Note|&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* SEARCH&lt;br /&gt;
&lt;br /&gt;
* RAD Studio 11 Alexandria&lt;br /&gt;
** Hauptseite | Themen&lt;br /&gt;
** lib_de:Hauptseite | Bibliothek-Referenz&lt;br /&gt;
** samp_en:Main_Page | Codebeispiele&lt;br /&gt;
&lt;br /&gt;
* RAD Studio 11 Themen&lt;br /&gt;
** Neuerungen | Neuerungen&lt;br /&gt;
** Tutorials | Tutorials&lt;br /&gt;
** {{FM}}-Anwendungsplattform | {{FM}}-Anwendungsplattform&lt;br /&gt;
** Geräteübergreifende Anwendungen - Index | Geräteübergreifende Anwendungen&lt;br /&gt;
** Einführung in {{Product}} | Einführung&lt;br /&gt;
** Arbeitsschritte bei der Projektentwicklung | Arbeitsschritte bei der Projektentwicklung&lt;br /&gt;
** Hauptanwendungstypen | Hauptanwendungstypen&lt;br /&gt;
** FireDAC | FireDAC&lt;br /&gt;
** Windows-Entwicklerhandbuch - Index | Windows-Entwicklerhandbuch&lt;br /&gt;
** Mit den Modellierungstools arbeiten | Modellierungstools&lt;br /&gt;
** IDE-Referenz und Befehlszeilenhilfsprogramme | IDE-Referenz und Befehlszeilenhilfsprogramme&lt;br /&gt;
** {{Delphi}}-Referenz | {{Delphi}}-Referenz&lt;br /&gt;
** C++-Referenz | C++-Referenz&lt;br /&gt;
** Index | Subjekt-Index&lt;br /&gt;
&lt;br /&gt;
* LANGUAGES&lt;br /&gt;
&lt;br /&gt;
* Frühere Versionen&lt;br /&gt;
** https://docwiki.embarcadero.com/RADStudio/Sydney/de/Hauptseite | Sydney-Themen&lt;br /&gt;
** https://docwiki.embarcadero.com/RADStudio/Rio/de/Hauptseite | Rio-Themen&lt;br /&gt;
** Hilfe von früheren Versionen | Ältere Versionen&lt;br /&gt;
&lt;br /&gt;
* Assistenz&lt;br /&gt;
** recentchanges-url | Letzte Änderungen&lt;br /&gt;
&lt;br /&gt;
* TOOLBOX&lt;/div&gt;</summary>
		<author><name>Nicolas.rios</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Deklarationen_und_Anweisungen_(Delphi)&amp;diff=218582</id>
		<title>Deklarationen und Anweisungen (Delphi)</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Deklarationen_und_Anweisungen_(Delphi)&amp;diff=218582"/>
		<updated>2023-12-11T21:21:50Z</updated>

		<summary type="html">&lt;p&gt;Nicolas.rios: RS-85687&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Parent|Grundlegende syntaktische Elemente - Index}}&lt;br /&gt;
Dieses Thema enthält eine Beschreibung der Deklarations- und Anweisungssyntax in {{Delphi}}.&lt;br /&gt;
&lt;br /&gt;
Neben der &#039;&#039;&#039;uses&#039;&#039;&#039;-Klausel (und reservierten Wörtern zur Abgrenzung von Abschnitten in Units, wie &#039;&#039;&#039;implementation&#039;&#039;&#039;) besteht ein Programm ausschließlich aus &#039;&#039;Deklarationen&#039;&#039; und &#039;&#039;Anweisungen&#039;&#039;, die in so genannten &#039;&#039;Blöcken&#039;&#039; organisiert sind.&lt;br /&gt;
&lt;br /&gt;
Dieses Thema enthält Informationen zu folgenden Bereichen:&lt;br /&gt;
&lt;br /&gt;
* Deklarationen&lt;br /&gt;
* Einfache Anweisungen, wie z. B. Zuweisungen&lt;br /&gt;
* Strukturierte Anweisungen, wie bedingte Tests (z. B. &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;if-then&amp;lt;/span&amp;gt; und &#039;&#039;&#039;case&#039;&#039;&#039;), Iterationen (z. B. &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;for&amp;lt;/span&amp;gt; und &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;while&amp;lt;/span&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
==Deklarationen==&lt;br /&gt;
&lt;br /&gt;
Die Namen von Variablen, Konstanten, Typen, Feldern, Eigenschaften, Prozeduren, Funktionen, Programmen, Units, Bibliotheken und Packages werden &#039;&#039;Bezeichner&#039;&#039; genannt. (Numerische Konstanten wie 26057 sind keine Bezeichner.) Damit ein Bezeichner verwendet werden kann, muss er zuerst deklariert werden. Ausnahmen bilden einige vordefinierte Typen, Routinen und Konstanten, die vom Compiler auch ohne Deklaration interpretiert werden können, die Variable &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Result&amp;lt;/span&amp;gt; innerhalb eines Funktionsblocks und die Variable &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Self&amp;lt;/span&amp;gt; in einer Methodenimplementierung.&lt;br /&gt;
&lt;br /&gt;
Eine Deklaration definiert den Bezeichner und sorgt dafür, dass bei Bedarf Speicher für ihn reserviert wird. Zum Beispiel:&lt;br /&gt;
&lt;br /&gt;
 var Size: Extended;&lt;br /&gt;
&lt;br /&gt;
Diese Anweisung deklariert eine Variable namens &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Size&amp;lt;/span&amp;gt;, die einen &#039;&#039;&#039;Extended&#039;&#039;&#039;-Wert (Typ Real) enthält:&lt;br /&gt;
&lt;br /&gt;
 function DoThis(X, Y: string): Integer;&lt;br /&gt;
&lt;br /&gt;
Diese Anweisung deklariert eine Funktion mit dem Namen &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;DoThis&amp;lt;/span&amp;gt;, die zwei Strings als Argumente übernimmt und einen Integerwert zurückgibt. Jede Deklaration wird durch einen Strichpunkt abgeschlossen. Werden mehrere Variablen, Konstanten, Typen oder Labels gleichzeitig deklariert, genügt es, das entsprechende reservierte Wort nur einmal anzugeben:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 var&lt;br /&gt;
   Size: Extended;&lt;br /&gt;
   Quantity: Integer;&lt;br /&gt;
   Description: string;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Die Syntax und der Ort einer Deklaration sind vom Typ des Bezeichners abhängig, der definiert werden soll. In der Regel erfolgen Deklarationen nur am Anfang eines Blocks bzw. am Anfang des interface- oder &#039;&#039;&#039;implementation&#039;&#039;&#039;-Abschnitts einer Unit (nach der &#039;&#039;&#039;uses&#039;&#039;&#039;-Klausel). Die Konventionen für die Deklaration von Variablen, Konstanten, Typen, Funktionen usw. werden in den betreffenden Themen erläutert.&lt;br /&gt;
&lt;br /&gt;
===Hinweis-Direktiven===&lt;br /&gt;
&lt;br /&gt;
Die Hinweis-Direktiven &#039;&#039;&#039;platform&#039;&#039;&#039;, &#039;&#039;&#039;deprecated&#039;&#039;&#039; und &#039;&#039;&#039;library&#039;&#039;&#039; können an jede Deklaration angehängt werden. Diese Direktiven erzeugen beim Compilieren Warnungen. Hinweis-Direktiven können für Typdeklarationen, Variablendeklarationen, Klassen-, Interface- und Strukturdeklarationen, Felddeklarationen innerhalb von Klassen oder Records, Prozedur-, Funktions- und Methodendeklarationen sowie Unit-Deklarationen angewendet werden.&lt;br /&gt;
&lt;br /&gt;
Tritt eine Hinweis-Direktive in einer Unit-Deklaration auf, bedeutet dies, dass der Hinweis für alle Elemente in der Unit gilt. Die Unit &amp;lt;font face=&amp;quot;courier new,courier,monospace&amp;quot;&amp;gt;&amp;lt;span&amp;gt;&amp;lt;font color=&amp;quot;#004A80&amp;quot;&amp;gt;OleAuto.pas&amp;lt;/font&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/font&amp;gt; im Windows 3.1-Stil ist beispielsweise unter Windows völlig veraltet. Jeder Verweis auf diese Unit oder auf ein Symbol in dieser Unit erzeugt die Meldung, dass diese veraltet ist.&lt;br /&gt;
&lt;br /&gt;
Die Hinweis-Direktive &#039;&#039;&#039;platform&#039;&#039;&#039; bei einem Symbol oder einer Unit gibt an, dass diese eventuell nicht existiert oder die Implementierungen auf unterschiedlichen Plattformen wesentlich voneinander abweichen. Die Hinweis-Direktive &#039;&#039;&#039;library&#039;&#039;&#039; bei einem Symbol oder einer Unit gibt an, dass der Quelltext eventuell nicht existiert oder die Implementierungen in unterschiedlichen Bibliotheksarchitekturen wesentlich voneinander abweichen.&lt;br /&gt;
&lt;br /&gt;
Die Direktiven &#039;&#039;&#039;platform&#039;&#039;&#039; und &#039;&#039;&#039;library&#039;&#039;&#039; enthalten keine Angaben über die Plattform oder Bibliothek. Wenn Sie beabsichtigen, plattformunabhängigen Code zu erstellen, müssen Sie nicht wissen, für welche Plattform ein Symbol spezifisch ist. Es reicht aus, das Symbol für &#039;&#039;irgendeine&#039;&#039; Plattform als spezifisch zu kennzeichnen, damit Sie wissen, dass es eventuell bei der Portabilität Probleme bereiten könnte.&lt;br /&gt;
&lt;br /&gt;
In einer Prozedur- oder Funktionsdeklaration sollte die Hinweis-Direktive durch einen Strichpunkt vom Rest der Deklaration getrennt werden. Beispiele:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 procedure SomeOldRoutine; stdcall; deprecated;&lt;br /&gt;
&lt;br /&gt;
 var&lt;br /&gt;
   VersionNumber: Real library;&lt;br /&gt;
&lt;br /&gt;
 type&lt;br /&gt;
   AppError = class(Exception)&lt;br /&gt;
      ...&lt;br /&gt;
 end platform;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Wenn der Quelltext im Status &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;{$HINTS ON} {$WARNINGS ON}&amp;lt;/span&amp;gt; compiliert wird, erzeugt jede Referenz auf einen Bezeichner, der mit einer dieser Direktiven deklariert wurde, einen entsprechenden Hinweis oder eine entsprechende Warnung. Mit der Direktive &#039;&#039;&#039;platform&#039;&#039;&#039; werden Elemente gekennzeichnet, die für ein bestimmtes Betriebssystem (z. B. Windows) spezifisch sind. Mit &#039;&#039;&#039;deprecated&#039;&#039;&#039; wird angegeben, dass ein Element veraltet ist oder nur aus Gründen der Abwärtskompatibilität unterstützt wird. Die Direktive &#039;&#039;&#039;library&#039;&#039;&#039; wird verwendet, um auf die Abhängigkeit von einem bestimmten Bibliotheks- oder Komponenten-Framework hinzuweisen.&lt;br /&gt;
&lt;br /&gt;
Der {{Delphi}}-Compiler erkennt auch die Hinweis-Direktive &#039;&#039;&#039;experimental&#039;&#039;&#039;. Mit dieser Direktive werden Units gekennzeichnet, die sich in einem instabilen Entwicklungszustand befinden. Beim Compilieren einer Anwendung, die diese Unit verwendet, wird eine Warnung ausgegeben.&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen zu den {{Delphi}}-Hinweis-Direktiven finden Sie unter &#039;&#039;&#039;[[Methoden (Delphi)#Allgemeines zu Methoden|Warnungs-Direktiven in Methodendeklarationen]]&#039;&#039;&#039;. Alle {{Delphi}}-Direktiven sind unter [[Grundlegende syntaktische Elemente (Delphi)#Direktiven|Direktiven]] aufgelistet.&lt;br /&gt;
&lt;br /&gt;
==Anweisungen==&lt;br /&gt;
&lt;br /&gt;
Anweisungen definieren algorithmische Aktionen in einem Programm. Einfache Anweisungen (z. B. Zuweisungen und Prozeduraufrufe) können kombiniert werden. Auf diese Weise lassen sich Schleifen, bedingte Anweisungen und andere strukturierte Anweisungen erstellen.&lt;br /&gt;
&lt;br /&gt;
Mehrere Anweisungen in einem Block sowie im initialization- und finalization-Abschnitt einer Unit werden durch Strichpunkte voneinander getrennt.&lt;br /&gt;
&lt;br /&gt;
==Einfache Anweisungen==&lt;br /&gt;
&lt;br /&gt;
Einfache Anweisungen enthalten keine anderen Anweisungen. Zu ihnen gehören Zuweisungen, Aufrufe von Prozeduren und Funktionen sowie goto-Sprünge.&lt;br /&gt;
&lt;br /&gt;
===Zuweisungen===&lt;br /&gt;
&lt;br /&gt;
Eine Zuweisung hat folgendes Format:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;variable&#039;&#039; := &#039;&#039;expression&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;variable&#039;&#039; ist eine beliebige Variablenreferenz, d. h. eine Variable, eine Variablenumwandlung, ein dereferenzierter Zeiger oder eine Komponente einer strukturierten Variable. &#039;&#039;expression&#039;&#039; kann jeder zuweisungskompatible Ausdruck sein (in einem Funktionsblock kann die Variable durch den Namen der definierten Funktion ersetzt werden; siehe [[Prozeduren und Funktionen (Delphi)|Prozeduren und Funktionen (Delphi)]].) Das Symbol &#039;&#039;&#039;:=&#039;&#039;&#039; wird auch als &#039;&#039;&#039;Zuweisungsoperator&#039;&#039;&#039; bezeichnet.&lt;br /&gt;
&lt;br /&gt;
Eine Zuweisung ersetzt den aktuellen Wert der Variable durch den Wert des Ausdrucks. Zum Beispiel:&lt;br /&gt;
&lt;br /&gt;
 I := 3;&lt;br /&gt;
&lt;br /&gt;
Mit dieser Anweisung wird der Variable &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;I&amp;lt;/span&amp;gt; der Wert 3 zugewiesen. Die Variablenreferenz auf der linken Seite der Zuweisung kann auch im Ausdruck auf der rechten Seite enthalten sein. Zum Beispiel:&lt;br /&gt;
&lt;br /&gt;
 I := I + 1;&lt;br /&gt;
&lt;br /&gt;
Hier wird der Wert von &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;I&amp;lt;/span&amp;gt; inkrementiert. Weitere Beispiele für Zuweisungen:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 X := Y + Z;&lt;br /&gt;
 Done := (I &amp;gt;= 1) and (I &amp;lt; 100);&lt;br /&gt;
 Hue1 := [Blue, Succ(C)];&lt;br /&gt;
 I := Sqr(J) - I  * K;&lt;br /&gt;
 Shortint(MyChar) := 122;&lt;br /&gt;
 TByteRec(W).Hi := 0;&lt;br /&gt;
 MyString[I] := &#039;A&#039;;&lt;br /&gt;
 SomeArray[I + 1] := P^;&lt;br /&gt;
 TMyObject.SomeProperty := True;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Prozedur- und Funktionsaufrufe===&lt;br /&gt;
&lt;br /&gt;
Ein Prozeduraufruf besteht aus dem Namen einer Prozedur (mit oder ohne Qualifizierer) und (falls erforderlich) einer Parameterliste. Hier einige Beispiele für Prozeduraufrufe:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 PrintHeading;&lt;br /&gt;
 Transpose(A, N, M);&lt;br /&gt;
 Find(Smith, William);&lt;br /&gt;
 Writeln(&#039;Hello world!&#039;);&lt;br /&gt;
 DoSomething();&lt;br /&gt;
 Unit1.SomeProcedure;&lt;br /&gt;
 TMyObject.SomeMethod(X,Y);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Wenn die erweiterte Syntax (&#039;&#039;&#039;&amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;{$X+}&amp;lt;/span&amp;gt;&#039;&#039;&#039;) aktiviert ist, können auch Funktionsaufrufe, wie z. B. Aufrufe von Prozeduren, als Anweisungen behandelt werden:&lt;br /&gt;
&lt;br /&gt;
 MyFunction(X);&lt;br /&gt;
&lt;br /&gt;
Bei dieser Verwendung eines Funktionsaufrufs wird der Rückgabewert verworfen.&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen zu Prozeduren und Funktionen finden Sie unter [[Prozeduren und Funktionen (Delphi)|Prozeduren und Funktionen (Delphi)]].&lt;br /&gt;
&lt;br /&gt;
===Goto-Anweisungen===&lt;br /&gt;
&lt;br /&gt;
Die Syntax für &#039;&#039;&#039;goto&#039;&#039;&#039;-Anweisungen lautet:&lt;br /&gt;
&lt;br /&gt;
 goto label&lt;br /&gt;
&lt;br /&gt;
Eine goto-Anweisung setzt die Ausführung des Programms mit der Anweisung fort, die mit dem angegebenen Label gekennzeichnet ist. Zur Kennzeichnung einer Anweisung deklarieren Sie zunächst das Label. Dann fügen Sie vor der zu kennzeichnenden Anweisung das Label und einen Doppelpunkt ein:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;label: statement&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Labels werden folgendermaßen deklariert:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;label&amp;lt;/span&amp;gt; &#039;&#039;label;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Es können auch mehrere Labels gleichzeitig deklariert werden:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;label&amp;lt;/span&amp;gt; &#039;&#039;label1&#039;&#039;, ..., &#039;&#039;labeln;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Als Label kann jeder gültige Bezeichner und jede Zahl von 0 bis 4294967295 verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Da Labels keine Sprünge aus einer Prozedur bzw. Funktion in eine andere erlauben, müssen sich die Label-Deklaration, die gekennzeichnete Anweisung und die &#039;&#039;&#039;goto&#039;&#039;&#039;-Anweisung innerhalb eines Blocks befinden. (siehe &amp;quot;Blöcke und Gültigkeitsbereich&amp;quot; weiter unten). In einem Block darf jedes Label nur einmal zur Kennzeichnung einer Anweisung verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Zum Beispiel:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 label StartHere;&lt;br /&gt;
     ...&lt;br /&gt;
 StartHere: Beep;&lt;br /&gt;
 goto StartHere;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Dieser Quelltext ergibt eine Endlosschleife, in der immer wieder die Prozedur &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Beep&amp;lt;/span&amp;gt; aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
Sprünge in oder aus &#039;&#039;&#039;try&#039;&#039;&#039;-&#039;&#039;&#039;finally&#039;&#039;&#039;- oder &#039;&#039;&#039;try&#039;&#039;&#039;-&#039;&#039;&#039;except&#039;&#039;&#039;-Anweisungen sind nicht möglich.&lt;br /&gt;
&lt;br /&gt;
Im Sinne eines guten Programmierstils sollten &#039;&#039;&#039;goto&#039;&#039;&#039;-Anweisungen so sparsam wie möglich eingesetzt werden. In bestimmten Fällen bieten sie sich aber an, um eine verschachtelte Schleife zu verlassen. Dazu ein Beispiel:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 procedure FindFirstAnswer;&lt;br /&gt;
   var X, Y, Z, Count: Integer;&lt;br /&gt;
 label FoundAnAnswer;&lt;br /&gt;
 begin&lt;br /&gt;
   Count := SomeConstant;&lt;br /&gt;
   for X := 1 to Count do&lt;br /&gt;
     for Y := 1 to Count do&lt;br /&gt;
       for Z := 1 to Count do&lt;br /&gt;
         if ... { some condition holds on X, Y, and Z } then&lt;br /&gt;
           goto FoundAnAnswer;&lt;br /&gt;
&lt;br /&gt;
   ... { Code to execute if no answer is found }&lt;br /&gt;
   Exit;&lt;br /&gt;
&lt;br /&gt;
   FoundAnAnswer:&lt;br /&gt;
     ... { Code to execute when an answer is found }&lt;br /&gt;
 end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Die &#039;&#039;&#039;goto&#039;&#039;&#039;-Anweisung wird hier eingesetzt, um eine verschachtelte Schleife zu verlassen. Sprünge in eine Schleife oder strukturierte Anweisung müssen vermieden werden, da dies zu unvorhersehbaren Ergebnissen führen könnte.&lt;br /&gt;
&lt;br /&gt;
==Strukturierte Anweisungen==&lt;br /&gt;
&lt;br /&gt;
Strukturierte Anweisungen setzen sich aus anderen Anweisungen zusammen. Sie werden eingesetzt, wenn andere Anweisungen sequenziell, wiederholt oder in Abhängigkeit von einer Bedingung ausgeführt werden sollen.&lt;br /&gt;
&lt;br /&gt;
* Eine Verbundanweisung (auch als &#039;&#039;&#039;with&#039;&#039;&#039;-Anweisung bezeichnet) führt eine Folge von Teilanweisungen aus.&lt;br /&gt;
* Eine bedingte Anweisung (also eine &#039;&#039;&#039;if&#039;&#039;&#039;- oder &#039;&#039;&#039;case&#039;&#039;&#039;-Anweisung) führt nach der Auswertung einer Bedingung mindestens eine ihrer Teilanweisungen aus.&lt;br /&gt;
* Schleifenanweisungen (&#039;&#039;&#039;repeat&#039;&#039;&#039;-, &#039;&#039;&#039;while&#039;&#039;&#039;- und &#039;&#039;&#039;for&#039;&#039;&#039;-Schleifen) führen eine Folge von Teilanweisungen mehrmals hintereinander aus.&lt;br /&gt;
* Eine spezielle Anweisungsgruppe (einschließlich Konstruktionen mit &#039;&#039;&#039;raise&#039;&#039;&#039;, &#039;&#039;&#039;try&#039;&#039;&#039;...&#039;&#039;&#039;except&#039;&#039;&#039; und &#039;&#039;&#039;try&#039;&#039;&#039;...&#039;&#039;&#039;finally&#039;&#039;&#039; dienen zur Generierung und Behandlung von Exceptions. Einzelheiten zum Erzeugen und Behandeln von Exceptions finden Sie unter [[Exceptions (Delphi)|Exceptions ({{Delphi}})]].&lt;br /&gt;
&lt;br /&gt;
===Verbundanweisungen===&lt;br /&gt;
&lt;br /&gt;
Eine Verbundanweisung setzt sich aus einer Folge von anderen (einfachen oder strukturierten) Anweisungen zusammen, die nacheinander ausgeführt werden. Die in einer Verbundanweisung enthaltenen Teilanweisungen sind zwischen den reservierten Wörtern &#039;&#039;&#039;begin&#039;&#039;&#039; und &#039;&#039;&#039;end&#039;&#039;&#039; eingeschlossen und durch Strichpunkte voneinander getrennt. Zum Beispiel:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 begin&lt;br /&gt;
    Z := X;&lt;br /&gt;
    X := Y;&lt;br /&gt;
    X := Y;&lt;br /&gt;
 end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Der letzte Strichpunkt vor &#039;&#039;&#039;end&#039;&#039;&#039; ist optional. Die Verbundanweisung könnte demnach auch folgendermaßen aussehen:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 begin&lt;br /&gt;
    Z := X;&lt;br /&gt;
    X := Y;&lt;br /&gt;
    Y := Z&lt;br /&gt;
 end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Verbundanweisungen sind wichtig, wenn die Syntax von {{Delphi}} eine einzelne Anweisung verlangt. Sie können in Programm-, Funktions- und Prozedurblöcke und in andere strukturierte Anweisungen (z. B. bedingte Anweisungen oder Schleifen) integriert werden. Zum Beispiel:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 begin&lt;br /&gt;
   I := SomeConstant;&lt;br /&gt;
   while I &amp;gt; 0 do&lt;br /&gt;
   begin&lt;br /&gt;
     ...&lt;br /&gt;
     I := I - 1;&lt;br /&gt;
   end;&lt;br /&gt;
 end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Es gibt auch Verbundanweisungen, die nur eine einzelne Teilanweisung enthalten. Wie runde Klammen in einem komplexen Ausdruck tragen die Wörter &#039;&#039;&#039;begin&#039;&#039;&#039; und &#039;&#039;&#039;end&#039;&#039;&#039; zur Vermeidung von Mehrdeutigkeiten und zur Verbesserung der Lesbarkeit bei. Es ist auch möglich, mit einer leeren Verbundanweisung einen Block zu erzeugen, der keine Aktion ausführt:&lt;br /&gt;
&lt;br /&gt;
 begin&lt;br /&gt;
 end;&lt;br /&gt;
&lt;br /&gt;
===with-Anweisungen===&lt;br /&gt;
&lt;br /&gt;
Eine &#039;&#039;&#039;with&#039;&#039;&#039;-Anweisung stellt eine einfache und bequeme Möglichkeit dar, die Felder eines Records oder die Felder, Eigenschaften und Methoden eines Objekts zu referenzieren. Die Syntax einer &#039;&#039;&#039;with&#039;&#039;&#039;-Anweisung lautet:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;with&#039;&#039;&#039; &#039;&#039;obj&#039;&#039; &#039;&#039;&#039;do&#039;&#039;&#039; &#039;&#039;statement&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
oder:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;with&#039;&#039;&#039; &#039;&#039;obj1, ..., objn&#039;&#039; &#039;&#039;&#039;do&#039;&#039;&#039; &#039;&#039;statement&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;obj&#039;&#039; ist ein Ausdruck mit einer Referenz auf einen Record, eine Objektinstanz, eine Klasseninstanz, eine Interface- oder Klassentyp-(Metaklassen-)Instanz. &#039;&#039;statement&#039;&#039; ist eine einfache oder eine strukturierte Anweisung. Innerhalb von &#039;&#039;statement&#039;&#039; können Felder, Eigenschaften und Methoden von &#039;&#039;obj&#039;&#039; nur über ihren Bezeichner referenziert werden. Die Angabe von Qualifizierern ist nicht erforderlich.&lt;br /&gt;
&lt;br /&gt;
Ausgehend von den Deklarationen:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 type&lt;br /&gt;
   TDate = record&lt;br /&gt;
     Day: Integer;&lt;br /&gt;
     Month: Integer;&lt;br /&gt;
     Year: Integer;&lt;br /&gt;
   end;&lt;br /&gt;
&lt;br /&gt;
 var&lt;br /&gt;
   OrderDate: TDate;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
könnten Sie die folgende &#039;&#039;&#039;with&#039;&#039;&#039;-Anweisung:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 with OrderDate do&lt;br /&gt;
   if Month = 12 then&lt;br /&gt;
     begin&lt;br /&gt;
       Month := 1;&lt;br /&gt;
       Year := Year + 1;&lt;br /&gt;
   end&lt;br /&gt;
   else&lt;br /&gt;
     Month := Month + 1;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
oder eine &#039;&#039;&#039;with&#039;&#039;&#039;-Anweisung schreiben:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 if OrderDate.Month = 12 then&lt;br /&gt;
 begin&lt;br /&gt;
   OrderDate.Month := 1;&lt;br /&gt;
   OrderDate.Year := OrderDate.Year + 1;&lt;br /&gt;
 end&lt;br /&gt;
 else&lt;br /&gt;
   OrderDate.Month := OrderDate.Month + 1;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Wenn die Interpretation von &#039;&#039;obj&#039;&#039; die Indizierung von Arrays oder die Dereferenzierung von Zeigern verlangt, werden diese Aktionen einmal durchgeführt, bevor die Anweisung ausgeführt wird. Dies macht &#039;&#039;&#039;with&#039;&#039;&#039;-Anweisungen sowohl effizient als auch kurz. Außerdem können sich während der aktuellen Ausführung der &#039;&#039;&#039;with&#039;&#039;&#039;-Anweisung Zuweisungen an eine Variable innerhalb der Anweisung nicht auf die Interpretation von &#039;&#039;obj&#039;&#039; auswirken.&lt;br /&gt;
&lt;br /&gt;
Jede Variablenreferenz und jeder Methodenname in einer &#039;&#039;&#039;with&#039;&#039;&#039;-Anweisung wird, wenn möglich, als Member des angegebenen Objekts bzw. Records interpretiert. Wenn in der &#039;&#039;&#039;with&#039;&#039;&#039;-Anweisung auf eine andere Variable oder Methode mit demselben Namen zugegriffen werden soll, ist ein Qualifizierer erforderlich:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 with OrderDate do&lt;br /&gt;
   begin&lt;br /&gt;
     Year := Unit1.Year;&lt;br /&gt;
      ...&lt;br /&gt;
   end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Wenn auf &#039;&#039;&#039;with&#039;&#039;&#039; mehrere Objekte oder Records folgen, wird die gesamte Anweisung als Folge von verschachtelten &#039;&#039;&#039;with&#039;&#039;&#039;-Anweisungen behandelt. Die Anweisung:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;with&#039;&#039;&#039; &#039;&#039;obj1, obj2, ..., objn&#039;&#039; &#039;&#039;&#039;do&#039;&#039;&#039; &#039;&#039;statement&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
ist gleichbedeutend mit:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
  with obj1 do&lt;br /&gt;
   with obj2 do&lt;br /&gt;
     ...&lt;br /&gt;
     with objn do&lt;br /&gt;
       // statement&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
In diesem Fall wird jede Variablenreferenz und jeder Methodenname in der Anweisung als Member von &#039;&#039;objn&#039;&#039; behandelt, wenn dies möglich ist. Andernfalls wird die Referenz bzw. der Name als Member von &#039;&#039;objn1&#039;&#039; interpretiert usw. Dieselbe Regel gilt für die Interpretation von &#039;&#039;objs&#039;&#039; selbst. Ist beispielsweise &#039;&#039;objn&#039;&#039; sowohl ein Member von &#039;&#039;obj1&#039;&#039; als auch von &#039;&#039;obj2&#039;&#039;, wird es als &#039;&#039;obj2.objn&#039;&#039; interpretiert.&lt;br /&gt;
&lt;br /&gt;
Da für eine &#039;&#039;&#039;with&#039;&#039;&#039;-Anweisung eine Variable oder ein Feld erforderlich ist, kann deren Verwendung mit Eigenschaften manchmal kompliziert sein. Variablen für eine &#039;&#039;&#039;with&#039;&#039;&#039;-Anweisung müssen &#039;&#039;&#039;per Referenz&#039;&#039;&#039; zur Verfügung stehen.&lt;br /&gt;
&lt;br /&gt;
Beachten Sie bei der Verwendung von &#039;&#039;&#039;with&#039;&#039;&#039; Folgendes:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;with&#039;&#039;&#039; kann bei schreibgeschützten Eigenschaften &#039;&#039;nur zum Lesen&#039;&#039; verwendet werden. Der Versuch, ein Feld in dem betreffenden Record oder Objekt zu ändern, führt zu einem Compilierfehler.&lt;br /&gt;
* Auch wenn die Eigenschaft einen Schreibzugriff auf das Feld zulässt, können Sie deren Felder nicht mit &#039;&#039;&#039;with&#039;&#039;&#039; ändern.&lt;br /&gt;
&lt;br /&gt;
Der folgende Code veranschaulicht das Problem bei der Verwendung der &#039;&#039;&#039;with&#039;&#039;&#039;-Anweisung für schreibgeschützte Eigenschaften, die einen Record bereitstellen. Angenommen, es gibt die folgende Klasse:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
  TShape = class&lt;br /&gt;
  private&lt;br /&gt;
    FCenter: TPoint;&lt;br /&gt;
  public&lt;br /&gt;
    property Center: TPoint read FCenter;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
TPoint ist ein folgendermaßen deklarierter Record:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
  TPoint = record&lt;br /&gt;
    X, Y: Integer;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Normalerweise ist die Eigenschaft &#039;&#039;&#039;Center&#039;&#039;&#039; schreibgeschützt und erlaubt das Ändern der Werte oder Felder des &#039;&#039;&#039;FCenter&#039;&#039;&#039;-Feldes nicht.&lt;br /&gt;
In diesem Fall misslingt eine &#039;&#039;&#039;with&#039;&#039;&#039;-Anweisung wie die folgende mit einem Compilierfehler, weil Shape.Center keine Variable ist und nicht referenziert werden kann:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
  with Shape.Center do&lt;br /&gt;
  begin&lt;br /&gt;
    X := 100;&lt;br /&gt;
    Y := 100;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Eigenschaften für Lese- und Schreibzugriffe komplizieren die Verwendung der &#039;&#039;&#039;with&#039;&#039;&#039;-Anweisung. Die ursprüngliche &#039;&#039;&#039;TShape&#039;&#039;&#039;-Klasse wurde geändert, um einen Schreibzugriff auf das Feld &#039;&#039;&#039;FCenter&#039;&#039;&#039; zuzulassen:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
  TShape = class&lt;br /&gt;
  private&lt;br /&gt;
    FCenter: TPoint;&lt;br /&gt;
  public&lt;br /&gt;
    property Center: TPoint read FCenter &#039;&#039;&#039;write FCenter&#039;&#039;&#039;;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Obwohl die Eigenschaft &#039;&#039;&#039;Center&#039;&#039;&#039; nicht schreibgeschützt ist, wird derselbe Compilierfehler ausgegeben. Zur Lösung dieses Problems muss der folgende Code:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
  with Shape.Center do&lt;br /&gt;
  begin&lt;br /&gt;
    X := 100;&lt;br /&gt;
    Y := 100;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
in diesen Code geändert werden:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
  { Copy the value of Center to a local variable. }&lt;br /&gt;
  TempPoint := Shape.Center;&lt;br /&gt;
&lt;br /&gt;
  with TempPoint do&lt;br /&gt;
  begin&lt;br /&gt;
    X := 100;&lt;br /&gt;
    Y := 100;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  { Set the value back. }&lt;br /&gt;
  Shape.Center := TempPoint;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===if-Anweisungen===&lt;br /&gt;
&lt;br /&gt;
Es gibt zwei Formen der &#039;&#039;&#039;if&#039;&#039;&#039;-Anweisung: &#039;&#039;&#039;if&#039;&#039;&#039;...&#039;&#039;&#039;then&#039;&#039;&#039; und &#039;&#039;&#039;if&#039;&#039;&#039;...&#039;&#039;&#039;then&#039;&#039;&#039;...&#039;&#039;&#039;else&#039;&#039;&#039;. Die Syntax für eine &#039;&#039;&#039;if&#039;&#039;&#039;...&#039;&#039;&#039;then&#039;&#039;&#039;-Anweisung lautet:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;if&#039;&#039;&#039; &#039;&#039;expression&#039;&#039; &#039;&#039;&#039;then&#039;&#039;&#039; &#039;&#039;statement&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das Ergebnis von &#039;&#039;expression&#039;&#039; ist ein Wert vom Typ &#039;&#039;&#039;Boolean&#039;&#039;&#039;. &#039;&#039;statement&#039;&#039; wird nur ausgeführt, wenn expression &#039;&#039;&#039;True&#039;&#039;&#039; ergibt. Zum Beispiel:&lt;br /&gt;
&lt;br /&gt;
 if J &amp;amp;lt;&amp;amp;gt; 0 &#039;&#039;&#039;then&#039;&#039;&#039; Result := I / J;&lt;br /&gt;
&lt;br /&gt;
Die Syntax für eine &#039;&#039;&#039;if&#039;&#039;&#039;...&#039;&#039;&#039;then&#039;&#039;&#039;...&#039;&#039;&#039;else&#039;&#039;&#039;-Anweisung lautet:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;if&#039;&#039;&#039; &#039;&#039;expression&#039;&#039; &#039;&#039;&#039;then&#039;&#039;&#039; &#039;&#039;statement1&#039;&#039; &#039;&#039;&#039;else&#039;&#039;&#039; &#039;&#039;statement2&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das Ergebnis von &#039;&#039;expression&#039;&#039; ist ein Wert vom Typ &#039;&#039;&#039;Boolean&#039;&#039;&#039;. Wenn expression den Wert &#039;&#039;&#039;True&#039;&#039;&#039; ergibt, wird &#039;&#039;statement1&#039;&#039; ausgeführt, andernfalls &#039;&#039;statement2&#039;&#039;. Zum Beispiel:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 if J = 0 then&lt;br /&gt;
    Exit&lt;br /&gt;
 else&lt;br /&gt;
    Result := I / J;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Die &#039;&#039;&#039;then&#039;&#039;&#039;- und &#039;&#039;&#039;else&#039;&#039;&#039;-Klauseln enthalten jeweils nur eine Anweisung, die aber auch eine strukturierte Anweisung sein könnte. Zum Beispiel:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 if J &amp;lt;&amp;gt; o then&lt;br /&gt;
 begin&lt;br /&gt;
   Result := I / J;&lt;br /&gt;
   Count := Count + 1;&lt;br /&gt;
 end&lt;br /&gt;
 else if Count = Last then&lt;br /&gt;
   Done := True&lt;br /&gt;
 else&lt;br /&gt;
   Exit;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Zwischen der &#039;&#039;&#039;then&#039;&#039;&#039;-Klausel und dem Wort &#039;&#039;&#039;else&#039;&#039;&#039; darf kein Strichpunkt stehen. Nach einer vollständigen &#039;&#039;&#039;if&#039;&#039;&#039;-Anweisung können Sie einen Strichpunkt verwenden, um sie von der nächsten Anweisung innerhalb des Blocks zu trennen. Zwischen der &#039;&#039;&#039;then&#039;&#039;&#039;- und der &#039;&#039;&#039;else&#039;&#039;&#039;-Klausel wird nur ein Leerzeichen oder ein Wagenrücklaufzeichen benötigt. Das Einfügen eines Strichpunkts vor dem Wort &#039;&#039;&#039;else&#039;&#039;&#039; (in einer &#039;&#039;&#039;if&#039;&#039;&#039;-Anweisung) ist ein häufiger Programmierfehler.&lt;br /&gt;
&lt;br /&gt;
Auch verschachtelte &#039;&#039;&#039;if&#039;&#039;&#039;-Anweisungen bergen die Gefahr von Programmierfehlern. Und zwar deshalb, weil für bestimmte &#039;&#039;&#039;if&#039;&#039;&#039;-Anweisungen &#039;&#039;&#039;else&#039;&#039;&#039;-Klauseln existieren, für andere jedoch nicht. Ansonsten ist die Syntax für die beiden Konstrukte identisch. Wenn in einer Folge von Bedingungen weniger &#039;&#039;&#039;else&#039;&#039;&#039;-Klauseln als &#039;&#039;&#039;if&#039;&#039;&#039;-Anweisungen vorhanden sind, ist möglicherweise die Zuordnung der &#039;&#039;&#039;else&#039;&#039;&#039;-Klauseln zu den &#039;&#039;&#039;if&#039;&#039;&#039;-Anweisungen nicht eindeutig erkennbar. Die Anweisung&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;if&#039;&#039;&#039; &#039;&#039;expression1&#039;&#039; &#039;&#039;&#039;then&#039;&#039;&#039; &#039;&#039;&#039;if&#039;&#039;&#039; &#039;&#039;expression2&#039;&#039; &#039;&#039;&#039;then&#039;&#039;&#039; &#039;&#039;statement1&#039;&#039; &#039;&#039;&#039;else&#039;&#039;&#039; &#039;&#039;statement2&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
könnte demnach auf zwei Arten interpretiert werden:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;if&#039;&#039;&#039; &#039;&#039;expression1&#039;&#039; &#039;&#039;&#039;then&#039;&#039;&#039; [ &#039;&#039;&#039;if&#039;&#039;&#039; &#039;&#039;expression2&#039;&#039; &#039;&#039;&#039;then&#039;&#039;&#039; &#039;&#039;statement1&#039;&#039; &#039;&#039;&#039;else&#039;&#039;&#039; &#039;&#039;statement2&#039;&#039; ];&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;if&#039;&#039;&#039; &#039;&#039;expression1&#039;&#039; &#039;&#039;&#039;then&#039;&#039;&#039; [ &#039;&#039;&#039;if&#039;&#039;&#039; &#039;&#039;expression2&#039;&#039; &#039;&#039;&#039;then&#039;&#039;&#039; &#039;&#039;statement1&#039;&#039; ] &#039;&#039;&#039;else&#039;&#039;&#039; &#039;&#039;statement2&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
Der Compiler verwendet aber immer die erste Interpretationsart. Dies bedeutet, dass die Anweisung:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 if ... { expression1} then&lt;br /&gt;
   if ... {expression2} then&lt;br /&gt;
     ... {statement1}&lt;br /&gt;
   else&lt;br /&gt;
     ... {statement2}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
gleichbedeutend ist mit:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 if ... {expression1} then&lt;br /&gt;
   begin&lt;br /&gt;
     if ... {expression2} then&lt;br /&gt;
       ... {statement1}&lt;br /&gt;
     else&lt;br /&gt;
       ... {statement2}&lt;br /&gt;
 end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Die Interpretation von verschachtelten Bedingungen beginnt immer bei der innersten Bedingung. Dabei wird jedes &#039;&#039;&#039;else&#039;&#039;&#039; dem letzten vorhergehenden &#039;&#039;&#039;if&#039;&#039;&#039; zugeordnet. Wenn der Compiler die zweite Interpretationsart verwenden soll, muss der Quelltext folgendermaßen aussehen:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
  if ... &lt;br /&gt;
{expression1} &lt;br /&gt;
&lt;br /&gt;
then&lt;br /&gt;
  begin&lt;br /&gt;
    if ... &lt;br /&gt;
{expression2} &lt;br /&gt;
&lt;br /&gt;
then&lt;br /&gt;
      ... &lt;br /&gt;
{statement1}&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
  else&lt;br /&gt;
    ... &lt;br /&gt;
{statement2}&lt;br /&gt;
&lt;br /&gt;
;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===case-Anweisungen===&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;&#039;case&#039;&#039;&#039;-Anweisung ist eine Alternative zur &#039;&#039;&#039;if&#039;&#039;&#039;-Anweisung, die aufgrund der besseren Lesbarkeit bei komplexen Verschachtelungen eingesetzt werden sollte. Die Syntax einer &#039;&#039;&#039;case&#039;&#039;&#039;-Anweisung lautet:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 case selectorExpression of&lt;br /&gt;
   caseList1: statement1;&lt;br /&gt;
    ...&lt;br /&gt;
   caseListn: statementn;&lt;br /&gt;
 end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&#039;&#039;selectorExpression&#039;&#039; ist ein beliebiger Ausdruck mit einem ordinalen Typ, der kleiner als 32 Bit ist (String-Typen und ordinale Typen, die größer als 32 Bit sind, sind nicht zulässig). Für &#039;&#039;caseList&#039;&#039; kann Folgendes angegeben werden:&lt;br /&gt;
&lt;br /&gt;
* Eine Zahl, eine deklarierte Konstante oder ein anderer Ausdruck, den der Compiler auswerten kann, ohne dazu das Programm selbst auszuführen. Dieser Wert muss ein ordinaler Typ sein, der mit dem Typ von &#039;&#039;selectorExpression&#039;&#039; kompatibel ist. &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;7&amp;lt;/span&amp;gt;, &#039;&#039;&#039;True&#039;&#039;&#039;, &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;4 + 5 * 3&amp;lt;/span&amp;gt;, &#039;A&#039; und &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Integer(&#039;A&#039;)&amp;lt;/span&amp;gt; sind demnach als &#039;&#039;caseLists&#039;&#039; zulässig, Variablen und die meisten Funktionsaufrufe dagegen nicht. (Einige integrierte Funktionen wie &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Hi&amp;lt;/span&amp;gt; und &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Lo&amp;lt;/span&amp;gt; können in einer &#039;&#039;caseList&#039;&#039; enthalten sein.  Siehe [[Deklarierte Konstanten|Deklarierte Konstanten]].)&lt;br /&gt;
* Ein Teilbereich der Form &#039;&#039;Erster..Letzter&#039;&#039;, wobei &#039;&#039;Erster&#039;&#039; und &#039;&#039;Letzter&#039;&#039; dem obigen Kriterium entsprechen müssen und &#039;&#039;Erster&#039;&#039; kleiner oder gleich &#039;&#039;Letzter&#039;&#039; sein muss.&lt;br /&gt;
* Eine Liste der Form &#039;&#039;Element1, ..., Elementn&#039;&#039;, wobei jedes &#039;&#039;Element&#039;&#039; den obigen Kriterien entsprechen muss.&lt;br /&gt;
&lt;br /&gt;
Jeder in einer &#039;&#039;caseList&#039;&#039; angegebene Wert muss innerhalb der &#039;&#039;&#039;case&#039;&#039;&#039;-Anweisung eindeutig sein. Teilbereiche und Listen dürfen sich nicht überschneiden. Eine &#039;&#039;&#039;case&#039;&#039;&#039;-Anweisung kann über eine abschließende &#039;&#039;&#039;else&#039;&#039;&#039;-Klausel verfügen:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 case selectorExpression of&lt;br /&gt;
   caseList1: statement1;&lt;br /&gt;
    ...&lt;br /&gt;
   caselistn: statementn;&lt;br /&gt;
 else&lt;br /&gt;
   statements;&lt;br /&gt;
 end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&#039;&#039;statements&#039;&#039; ist eine Folge von Anweisungen, die durch Strichpunkte voneinander getrennt sind. Bei der Ausführung einer &#039;&#039;&#039;case&#039;&#039;&#039;-Anweisung wird höchstens eine &#039;&#039;statement1 ...statementn&#039;&#039;-Anweisung ausgeführt. Dabei handelt es sich um genau diejenige, deren &#039;&#039;caseList&#039;&#039;-Wert mit dem von &#039;&#039;selectorExpression&#039;&#039; identisch ist. Ist kein entsprechender &#039;&#039;selectorExpression&#039;&#039;-Wert in &#039;&#039;caseList&#039;&#039; vorhanden, werden die Anweisungen in der &#039;&#039;&#039;else&#039;&#039;&#039;-Klausel (falls vorhanden) ausgeführt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die case-Anweisung&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 case I of&lt;br /&gt;
   1..5: Caption := &#039;Low&#039;;&lt;br /&gt;
   6..9: Caption := &#039;High&#039;;&lt;br /&gt;
   0, 10..99: Caption := &#039;Out of range&#039;;&lt;br /&gt;
 else&lt;br /&gt;
   Caption := &#039;&#039;;&lt;br /&gt;
 end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
ist mit der folgenden verschachtelten Anweisung identisch:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 if I in [1..5] then&lt;br /&gt;
   Caption := &#039;Low&#039;;&lt;br /&gt;
 else if I in [6..10] then&lt;br /&gt;
   Caption := &#039;High&#039;;&lt;br /&gt;
   else if (I = 0) or (I in [10..99]) then&lt;br /&gt;
     Caption := &#039;Out of range&#039;&lt;br /&gt;
     else&lt;br /&gt;
       Caption := &#039;&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Weitere Beispiele für case-Anweisungen&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 case MyColor of&lt;br /&gt;
   Red: X := 1;&lt;br /&gt;
   Green: X := 2;&lt;br /&gt;
   Blue: X = 3;&lt;br /&gt;
   Yellow, Orange, Black: X := 0;&lt;br /&gt;
 end;&lt;br /&gt;
&lt;br /&gt;
 case Selection of&lt;br /&gt;
   Done: Form1.Close;&lt;br /&gt;
   Compute: calculateTotal(UnitCost, Quantity);&lt;br /&gt;
 else&lt;br /&gt;
   Beep;&lt;br /&gt;
 end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schleifen===&lt;br /&gt;
&lt;br /&gt;
Schleifen ermöglichen die wiederholte Ausführung einer Anweisungsfolge. Eine Bedingung oder eine Variable bestimmt, wann die Ausführung angehalten wird. {{Delphi}} unterstützt drei Arten von Schleifen: &#039;&#039;&#039;repeat&#039;&#039;&#039;-, &#039;&#039;&#039;while&#039;&#039;&#039;- und &#039;&#039;&#039;for&#039;&#039;&#039;-Anweisungen.&lt;br /&gt;
&lt;br /&gt;
Mit den Standardprozeduren &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Break&amp;lt;/span&amp;gt; und &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Continue&amp;lt;/span&amp;gt; können Sie den Ablauf einer &#039;&#039;&#039;repeat&#039;&#039;&#039;-, &#039;&#039;&#039;while&#039;&#039;&#039;- oder &#039;&#039;&#039;for&#039;&#039;&#039;-Anweisung steuern. &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Break&amp;lt;/span&amp;gt; beendet eine Schleife, &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Continue&amp;lt;/span&amp;gt; fährt mit der nächsten Iteration fort.&lt;br /&gt;
&lt;br /&gt;
====repeat-Anweisungen====&lt;br /&gt;
&lt;br /&gt;
Die Syntax einer &#039;&#039;&#039;repeat&#039;&#039;&#039;-Anweisung lautet:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;repeat&#039;&#039;&#039; &#039;&#039;statement1; ...; statementn;&#039;&#039; &#039;&#039;&#039;until&#039;&#039;&#039; &#039;&#039;expression&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das Ergebnis von &#039;&#039;expression&#039;&#039; ist ein Wert vom Typ &#039;&#039;&#039;Boolean&#039;&#039;&#039;. (Die Angabe des letzten Strichpunkts vor &#039;&#039;&#039;until&#039;&#039;&#039; ist optional.) Alle &#039;&#039;&#039;repeat&#039;&#039;&#039;-Anweisungen werden der Reihe nach ausgeführt. Nach jedem Durchlauf wird &#039;&#039;expression&#039;&#039; ausgewertet. Liefert &#039;&#039;expression&#039;&#039; den Wert &#039;&#039;&#039;True&#039;&#039;&#039;, wird die &#039;&#039;&#039;repeat&#039;&#039;&#039;-Anweisung beendet. Da &#039;&#039;expression&#039;&#039; erst am Ende der ersten Iteration ausgewertet wird, wird die Anweisungsfolge mindestens einmal durchlaufen.&lt;br /&gt;
&lt;br /&gt;
Hier einige Bespiele für &#039;&#039;&#039;repeat&#039;&#039;&#039;-Anweisungen:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 repeat&lt;br /&gt;
   K := I mod J;&lt;br /&gt;
   I := J;&lt;br /&gt;
   J := K;&lt;br /&gt;
 until J = 0;&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
   Write(&#039;Enter a value (0..9): &#039;);&lt;br /&gt;
   Readln(I);&lt;br /&gt;
 until (I &amp;gt;= 0) and (I &amp;lt;= 9);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====while-Anweisungen====&lt;br /&gt;
&lt;br /&gt;
Eine &#039;&#039;&#039;while&#039;&#039;&#039;-Anweisung ähnelt in vielerlei Hinsicht einer &#039;&#039;&#039;repeat&#039;&#039;&#039;-Anweisung, doch wird die Bedingung bereits vor der ersten Ausführung der Anweisungsfolge ausgewertet. Wenn das Ergebnis der Bedingung False ist, wird die Anweisungsfolge nicht ausgeführt.&lt;br /&gt;
&lt;br /&gt;
Die Syntax einer &#039;&#039;&#039;while&#039;&#039;&#039;-Anweisung lautet:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; &#039;&#039;expression&#039;&#039; &#039;&#039;&#039;do&#039;&#039;&#039; &#039;&#039;statement&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;expression&#039;&#039; gibt einen &#039;&#039;&#039;booleschen&#039;&#039;&#039; Wert zurück. Bei &#039;&#039;statement&#039;&#039; kann es sich auch um eine Verbundanweisung handeln. Die &#039;&#039;&#039;while&#039;&#039;&#039;-Anweisung führt &#039;&#039;statement&#039;&#039; wiederholt aus und wertet vor jedem neuen Durchlauf &#039;&#039;expression&#039;&#039; aus. Solange &#039;&#039;expression&#039;&#039; den Wert &#039;&#039;&#039;True&#039;&#039;&#039; ergibt, wird die Ausführung fortgesetzt.&lt;br /&gt;
&lt;br /&gt;
Hier einige Bespiele für &#039;&#039;&#039;while&#039;&#039;&#039;-Anweisungen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 while Data[I] &amp;lt;&amp;gt; X do I := I + 1;&lt;br /&gt;
&lt;br /&gt;
 while I &amp;gt; 0 do&lt;br /&gt;
 begin&lt;br /&gt;
   if Odd(I) then Z := Z * X;&lt;br /&gt;
   I := I div 2;&lt;br /&gt;
   X := Sqr(X);&lt;br /&gt;
 end;&lt;br /&gt;
&lt;br /&gt;
 while not Eof(InputFile) do&lt;br /&gt;
 begin&lt;br /&gt;
   Readln(InputFile, Line);&lt;br /&gt;
   Process(Line);&lt;br /&gt;
 end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====for-Anweisungen====&lt;br /&gt;
&lt;br /&gt;
Im Gegensatz zu &#039;&#039;&#039;repeat&#039;&#039;&#039;- und &#039;&#039;&#039;while&#039;&#039;&#039;-Anweisungen wird bei &#039;&#039;&#039;for&#039;&#039;&#039;-Anweisungen angegeben, wie oft die Schleife durchlaufen werden soll. Die Syntax einer &#039;&#039;&#039;for&#039;&#039;&#039;-Anweisung lautet:&lt;br /&gt;
&lt;br /&gt;
  &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;counter&#039;&#039; := &#039;&#039;initialValue&#039;&#039; &#039;&#039;&#039;to&#039;&#039;&#039; &#039;&#039;finalValue&#039;&#039; &#039;&#039;&#039;do&#039;&#039;&#039; &#039;&#039;statement&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
oder:&lt;br /&gt;
&lt;br /&gt;
  &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;counter&#039;&#039; := &#039;&#039;initialValue&#039;&#039; &#039;&#039;&#039;downto&#039;&#039;&#039; &#039;&#039;finalValue&#039;&#039; &#039;&#039;&#039;do&#039;&#039;&#039; &#039;&#039;statement&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
wobei:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;counter&#039;&#039; eine lokale Variable ordinalen Typs ohne Qualifizierer ist. Sie wird in dem Block deklariert, in dem die &#039;&#039;&#039;for&#039;&#039;&#039;-Anweisung enthalten ist.&lt;br /&gt;
* &#039;&#039;initialValue&#039;&#039; und &#039;&#039;finalValue&#039;&#039; sind Ausdrücke, die zu &#039;&#039;counter&#039;&#039; zuweisungskompatibel sind.&lt;br /&gt;
* &#039;&#039;statement&#039;&#039; ist eine einfache oder eine strukturierte Anweisung, die den Wert von &#039;&#039;counter&#039;&#039; nicht ändert.&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;&#039;for&#039;&#039;&#039;-Anweisung weist &#039;&#039;counter&#039;&#039; den angegebenen &#039;&#039;initialValue&#039;&#039; zu und führt anschließend wiederholt &#039;&#039;statement&#039;&#039; aus. Abhängig von der verwendeten Syntax wird der Wert von &#039;&#039;counter&#039;&#039; bei jedem Durchlauf inkrementiert (&#039;&#039;&#039;for&#039;&#039;&#039;...&#039;&#039;&#039;to&#039;&#039;&#039;) oder dekrementiert (&#039;&#039;&#039;for&#039;&#039;&#039;...&#039;&#039;&#039;downto&#039;&#039;&#039;). Sobald der Wert von &#039;&#039;counter&#039;&#039; mit dem Wert von &#039;&#039;finalValue&#039;&#039; identisch ist, wird &#039;&#039;statement&#039;&#039; ein letztes Mal ausgeführt und anschließend die &#039;&#039;&#039;for&#039;&#039;&#039;-Anweisung beendet. &#039;&#039;statement&#039;&#039; wird also einmal für jeden Wert ausgeführt, der im Bereich von &#039;&#039;initialValue&#039;&#039; bis &#039;&#039;finalValue&#039;&#039; liegt. Ist &#039;&#039;initialValue&#039;&#039; mit &#039;&#039;finalValue&#039;&#039; identisch, wird &#039;&#039;statement&#039;&#039; genau einmal ausgeführt. Wenn &#039;&#039;initialValue&#039;&#039; in einer &#039;&#039;&#039;for&#039;&#039;&#039;...&#039;&#039;&#039;to&#039;&#039;&#039;-Anweisung größer als &#039;&#039;finalValue&#039;&#039; ist, wird &#039;&#039;statement&#039;&#039; nie ausgeführt. Dasselbe gilt für eine &#039;&#039;&#039;for&#039;&#039;&#039;...&#039;&#039;&#039;downto&#039;&#039;&#039;-Anweisung, in der der Anfangswert kleiner als &#039;&#039;finalValue&#039;&#039; ist. Nach der Beendigung der &#039;&#039;&#039;for&#039;&#039;&#039;-Anweisung ist der Wert von &#039;&#039;counter&#039;&#039; nicht definiert (vorausgesetzt, die Beendigung wurde nicht durch eine &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Break&amp;lt;/span&amp;gt;- oder &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Exit&amp;lt;/span&amp;gt;-Prozedur verursacht).&lt;br /&gt;
&lt;br /&gt;
: {{Warning|Die Iterationsvariable &#039;&#039;&#039;counter&#039;&#039;&#039; kann innerhalb der Schleife nicht verändert werden. Dies beinhaltet Zuweisungen und die Übergabe der Variable an einen &#039;&#039;&#039;var&#039;&#039;&#039;-Parameter einer Prozedur. Diese Operationen würden zu einer Compiler-Warnung führen.}}&lt;br /&gt;
&lt;br /&gt;
Die Ausdrücke &#039;&#039;initialValue&#039;&#039; und &#039;&#039;finalValue&#039;&#039; werden zur Steuerung der Schleifenausführung nur einmal ausgewertet, und zwar vor Beginn der Schleife. Daher hat die &#039;&#039;&#039;for&#039;&#039;&#039;...&#039;&#039;&#039;to&#039;&#039;&#039;-Anweisung starke Ähnlichkeit mit dem folgenden &#039;&#039;&#039;while&#039;&#039;&#039;-Konstrukt:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 begin&lt;br /&gt;
   counter := initialValue;&lt;br /&gt;
   while counter &amp;lt;= finalValue do&lt;br /&gt;
   begin&lt;br /&gt;
     ... {statement};&lt;br /&gt;
     counter := Succ(counter);&lt;br /&gt;
   end;&lt;br /&gt;
 end.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Im Unterschied zur &#039;&#039;&#039;for&#039;&#039;&#039;...&#039;&#039;&#039;to&#039;&#039;&#039;-Anweisung wird &#039;&#039;finalValue&#039;&#039; aber in der &#039;&#039;&#039;while&#039;&#039;&#039;-Schleife vor jedem Durchlauf erneut ausgewertet. Wenn &#039;&#039;finalValue&#039;&#039; ein komplexer Ausdruck ist, kann dies eine Verlangsamung der Ausführungsgeschwindigkeit zur Folge haben. Außerdem können sich von &#039;&#039;statement&#039;&#039; verursachte Änderungen an &#039;&#039;finalValue&#039;&#039; auf die Ausführung der Schleife auswirken.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiele für for-Anweisungen&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 for I := 2 to 63 do&lt;br /&gt;
   if Data[I] &amp;gt; Max then&lt;br /&gt;
     Max := Data[I];&lt;br /&gt;
&lt;br /&gt;
 for I := ListBox1.Items.Count - 1 downto 0 do&lt;br /&gt;
   ListBox1.Items[I] := UpperCase(ListBox1.Items[I]);&lt;br /&gt;
&lt;br /&gt;
 for I := 1 to 10 do&lt;br /&gt;
   for J := 1 to 10 do&lt;br /&gt;
   begin&lt;br /&gt;
     X := 0;&lt;br /&gt;
     for K := 1 to 10 do&lt;br /&gt;
       X := X + Mat1[I,K] * Mat2[K,J];&lt;br /&gt;
     Mat[I,J] := X;&lt;br /&gt;
    end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 for C := Red to Blue do Check(C);&lt;br /&gt;
&lt;br /&gt;
====Iteration durch Container mit for-Anweisungen====&lt;br /&gt;
&lt;br /&gt;
{{Delphi}} unterstützt die &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;for-Element-in-Kollektion&amp;lt;/span&amp;gt;-Iteration durch Container. Dabei werden die folgenden Iterationsmuster vom Compiler erkannt:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;for Element in ArrayAusdr do Anw;&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;for Element in StringAusdr do Anw;&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;for Element in SetAusdr do Anw;&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;for Element in KollektionsAusdr do Anw;&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;for Element in KollektionsAusdr do Anw;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Typ der Iterationsvariable &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Element&amp;lt;/span&amp;gt; muss mit dem Typ im Container übereinstimmen. Bei jedem Schleifendurchlauf enthält die Iterationsvariable das aktuelle Kollektionselement. Wie bei regulären &#039;&#039;&#039;for&#039;&#039;&#039;-Schleifen muss die Iterationsvariable in demselben Block wie die &#039;&#039;&#039;for&#039;&#039;&#039;-Anweisung deklariert werden.&lt;br /&gt;
&lt;br /&gt;
: {{Warning| Die Iterationsvariable kann innerhalb der Schleife nicht verändert werden. Dies beinhaltet Zuweisungen und die Übergabe der Variable an einen &#039;&#039;&#039;var&#039;&#039;&#039;-Parameter einer Prozedur. Diese Operationen würden zu einer Compiler-Warnung führen.}}&lt;br /&gt;
&lt;br /&gt;
Array-Ausdrücke können sich auf ein- oder mehrdimensionale Arrays, Arrays mit fester Länge oder dynamische Arrays beziehen. Das Array wird in aufsteigender Reihenfolge durchlaufen, beginnend mit der unteren Array-Grenze bis zur Array-Größe minus eins. Der folgende Code zeigt Beispiele der Iteration durch eindimensionale, mehrdimensionale und dynamische Arrays:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 type&lt;br /&gt;
   TIntArray        = array[0..9] of Integer;&lt;br /&gt;
   TGenericIntArray = array of Integer;&lt;br /&gt;
&lt;br /&gt;
 var&lt;br /&gt;
   IArray1: array[0..9] of Integer   = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10);&lt;br /&gt;
   IArray2: array[1..10] of Integer  = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10);&lt;br /&gt;
   IArray3: array[1..2] of TIntArray = ((11, 12, 13, 14, 15, 16, 17, 18, 19, 20),&lt;br /&gt;
                                        (21, 22, 23, 24, 25, 26, 27, 28, 29, 30));&lt;br /&gt;
   MultiDimTemp: TIntArray;&lt;br /&gt;
   DynArray: TGenericIntArray;&lt;br /&gt;
&lt;br /&gt;
   I: Integer;&lt;br /&gt;
&lt;br /&gt;
 begin&lt;br /&gt;
   for I in IArray1 do&lt;br /&gt;
   begin&lt;br /&gt;
     { Do something with I... }&lt;br /&gt;
   end;&lt;br /&gt;
&lt;br /&gt;
   { Indexing begins at lower array bound of 1. }&lt;br /&gt;
   for I in IArray2 do&lt;br /&gt;
   begin&lt;br /&gt;
     { Do something with I... }&lt;br /&gt;
   end;&lt;br /&gt;
&lt;br /&gt;
   { Iterating a multidimensional array }&lt;br /&gt;
   for MultiDimTemp in IArray3 do   // Indexing from 1..2&lt;br /&gt;
     for I in MultiDimTemp do       // Indexing from 0..9&lt;br /&gt;
     begin&lt;br /&gt;
       { Do something with I... }&lt;br /&gt;
     end;&lt;br /&gt;
&lt;br /&gt;
   { Iterating over a dynamic array }&lt;br /&gt;
   DynArray := TGenericIntArray.Create(1, 2, 3, 4);&lt;br /&gt;
&lt;br /&gt;
   for I in DynArray do&lt;br /&gt;
   begin&lt;br /&gt;
     { Do something with I... }&lt;br /&gt;
   end;&lt;br /&gt;
 end.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das folgende Beispiel zeigt die Iteration durch String-Ausdrücke:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 var&lt;br /&gt;
   C: Char;&lt;br /&gt;
   S1, S2: String;&lt;br /&gt;
   Counter: Integer;&lt;br /&gt;
&lt;br /&gt;
   OS1, OS2: ShortString;&lt;br /&gt;
   AC: AnsiChar;&lt;br /&gt;
&lt;br /&gt;
 begin&lt;br /&gt;
&lt;br /&gt;
   S1 := &#039;Now is the time for all good men to come to the aid of their country.&#039;;&lt;br /&gt;
   S2 := &#039;&#039;&#039;&#039;&#039;&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
   for C in S1 do&lt;br /&gt;
     S2 := S2 + C;&lt;br /&gt;
&lt;br /&gt;
   if S1 = S2 then&lt;br /&gt;
     Writeln(&#039;SUCCESS #1&#039;)&lt;br /&gt;
   else&lt;br /&gt;
     Writeln(&#039;FAIL #1&#039;);&lt;br /&gt;
&lt;br /&gt;
   OS1 := &#039;When in the course of human events it becomes necessary to dissolve...&#039;;&lt;br /&gt;
   OS2 := &#039;&#039;&#039;&#039;&#039;&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
   for AC in OS1 do&lt;br /&gt;
     OS2 := OS2 + AC;&lt;br /&gt;
&lt;br /&gt;
   if OS1 = OS2 then&lt;br /&gt;
     Writeln(&#039;SUCCESS #2&#039;)&lt;br /&gt;
   else&lt;br /&gt;
     Writeln(&#039;FAIL #2&#039;);&lt;br /&gt;
&lt;br /&gt;
 end.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Das folgende Beispiel zeigt die Iteration durch Mengen-Ausdrücke:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 type&lt;br /&gt;
&lt;br /&gt;
   TMyThing = (one, two, three);&lt;br /&gt;
   TMySet   = set of TMyThing;&lt;br /&gt;
   TCharSet = set of Char;&lt;br /&gt;
&lt;br /&gt;
 var&lt;br /&gt;
   MySet:   TMySet;&lt;br /&gt;
   MyThing: TMyThing;&lt;br /&gt;
&lt;br /&gt;
   CharSet: TCharSet;&lt;br /&gt;
   C: Char;&lt;br /&gt;
&lt;br /&gt;
 begin&lt;br /&gt;
&lt;br /&gt;
   MySet := [one, two, three];&lt;br /&gt;
   for MyThing in MySet do&lt;br /&gt;
    begin&lt;br /&gt;
     // Do something with MyThing...&lt;br /&gt;
    end;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   CharSet := [#0..#255];&lt;br /&gt;
   for C in CharSet do&lt;br /&gt;
     begin&lt;br /&gt;
       // Do something with C...&lt;br /&gt;
     end;&lt;br /&gt;
&lt;br /&gt;
 end.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Für die Verwendung von &#039;&#039;&#039;for&#039;&#039;&#039;-&#039;&#039;&#039;in&#039;&#039;&#039;-Schleifenkonstrukten bei Klassen muss die Klasse oder das Interface ein vorschriftsmäßiges Kollektionsmuster implementieren. Ein Typ, der Kollektionsmuster implementiert, muss die folgenden Attribute haben:&lt;br /&gt;
&lt;br /&gt;
* Die Klasse oder das Interface muss eine als public deklarierte Instanzmethode namens &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;GetEnumerator()&amp;lt;/span&amp;gt; enthalten. Die Methode &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;GetEnumerator()&amp;lt;/span&amp;gt; muss einen Klassen-, Interface- oder Record-Typ zurückgeben.&lt;br /&gt;
* Die von &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;GetEnumerator()&amp;lt;/span&amp;gt; zurückgegebene Klasse bzw. das Interface oder der Record muss eine als public deklarierte Instanzmethode namens &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;MoveNext()&amp;lt;/span&amp;gt; enthalten. Die Methode &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;MoveNext()&amp;lt;/span&amp;gt; muss einen &#039;&#039;&#039;booleschen&#039;&#039;&#039; Wert zurückgeben. Die &#039;&#039;&#039;for-in&#039;&#039;&#039;-Schleife ruft zuerst diese Methode auf, um sicherzustellen, dass der Container nicht leer ist.&lt;br /&gt;
* Die von &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;GetEnumerator()&amp;lt;/span&amp;gt; zurückgegebene Klasse bzw. das Interface oder der Record muss eine als public deklarierte, schreibgeschützte Instanzeigenschaft namens &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Current&amp;lt;/span&amp;gt; enthalten. Der Typ der Eigenschaft &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Current&amp;lt;/span&amp;gt; muss mit dem in der Kollektion enthaltenen Typ übereinstimmen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der folgende Code zeigt die Iteration durch einen Container in {{Delphi}}.&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
type&lt;br /&gt;
  TMyIntArray   = array of Integer;&lt;br /&gt;
  TMyContainerEnumerator = class;&lt;br /&gt;
&lt;br /&gt;
  TMyContainer  = class&lt;br /&gt;
  public&lt;br /&gt;
    Values: TMyIntArray;&lt;br /&gt;
    function GetEnumerator: TMyContainerEnumerator;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  TMyContainerEnumerator = class&lt;br /&gt;
    Container : TMyContainer;&lt;br /&gt;
    Index     : Integer;&lt;br /&gt;
  public&lt;br /&gt;
    constructor Create(AContainer : TMyContainer);&lt;br /&gt;
    function GetCurrent: Integer;&lt;br /&gt;
    function MoveNext:   Boolean;&lt;br /&gt;
    property Current:    Integer read GetCurrent;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
constructor TMyContainerEnumerator.Create(AContainer : TMyContainer);&lt;br /&gt;
begin&lt;br /&gt;
  inherited Create;&lt;br /&gt;
  Container := AContainer;&lt;br /&gt;
  Index     := - 1;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
function TMyContainerEnumerator.MoveNext: Boolean;&lt;br /&gt;
begin&lt;br /&gt;
  Result := Index &amp;lt; High(Container.Values);&lt;br /&gt;
  if Result then&lt;br /&gt;
    Inc(Index);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
function TMyContainerEnumerator.GetCurrent: Integer;&lt;br /&gt;
begin&lt;br /&gt;
  Result := Container.Values[Index];&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
function TMyContainer.GetEnumerator: TMyContainerEnumerator;&lt;br /&gt;
begin&lt;br /&gt;
  Result := TMyContainerEnumerator.Create(Self);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
var&lt;br /&gt;
  MyContainer : TMyContainer;&lt;br /&gt;
  I           : Integer;&lt;br /&gt;
  Counter     : Integer;&lt;br /&gt;
begin&lt;br /&gt;
  MyContainer        := TMyContainer.Create;&lt;br /&gt;
  MyContainer.Values := TMyIntArray.Create(100, 200, 300);&lt;br /&gt;
&lt;br /&gt;
  Counter := 0;&lt;br /&gt;
  for I in MyContainer do&lt;br /&gt;
    Inc(Counter, I);&lt;br /&gt;
&lt;br /&gt;
  Writeln(&#039;Counter = &#039;, Counter, &#039; (should be 600)&#039;);&lt;br /&gt;
  ReadLn;&lt;br /&gt;
end.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als Teil der Enumeratortypen für Sammlungen definiert RAD Studio den Enumeratorstatus explizit, wenn die Iteration abgeschlossen ist: &amp;quot;Der Enumeratorstatus ist nicht gültig, nachdem MoveNext False zurückgegeben hat und der Enumerator freigegeben oder neu erstellt werden muss, und es sollte nicht mehr darauf zugegriffen werden.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
====Iteration durch Datenmengen mit for-Anweisungen====&lt;br /&gt;
&lt;br /&gt;
{{Delphi}} unterstützt die &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;for-in&amp;lt;/span&amp;gt;-Syntaxkonstruktion für die Iteration durch Datenmengen. Der Compiler erkennt das folgende Iterationsmuster für Datenmengen:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;for Record in Dataset do Smth;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
wobei &amp;lt;code&amp;gt;Record&amp;lt;/code&amp;gt; die [[lib_de:Data.DB.TDataSet|TDataSet]]-API repräsentiert. Record kann problemlos mit Datenmenge gleichgesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Im folgenden Codefragment wird durch eine Datenmenge in {{Delphi}} iteriert. Der Beispielcode zeigt, wie die Werte der Spalte &amp;quot;Name&amp;quot; in ein Memo-Steuerelement ausgegeben werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var &lt;br /&gt;
 ds: TDataSet;&lt;br /&gt;
//&lt;br /&gt;
FQuery1.SQL.Text := &#039;SELECT Name FROM Table1&#039;; &lt;br /&gt;
Memo1.Lines.Clear;&lt;br /&gt;
for ds in FDQuery1 do &lt;br /&gt;
  Memo1.Lines.Add(ds.FieldByName(&#039;Name&#039;).AsString);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Note| In die Datenmengenaufzählung kann nicht erneut eingetreten werden. Das heißt, dass Sie für jede Datenmenge jeweils nur eine Aufzählung verwenden können. Wenn Sie mehrere &amp;lt;code&amp;gt;for-in&amp;lt;/code&amp;gt;-Schleifen für dieselbe Datenmenge gleichzeitig ausführen müssen, verwenden Sie stattdessen die Methode [[lib_de:Data.DB.TDataSet.View|TDataSet.View]] (siehe weiter unten in diesem Thema). In diesem Szenario ist in der &amp;lt;code&amp;gt;for-in&amp;lt;/code&amp;gt;-Schleife ein Record nicht unbedingt mit einer Datenmenge identisch.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das folgende Codefragment zeigt, wie die Methode [[lib_de:Data.DB.TDataSet.View|TDataSet.View]] zur Aufzählung einer Datenmenge verwendet wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
var&lt;br /&gt;
  ds: TDataSet;&lt;br /&gt;
//...&lt;br /&gt;
Memo1.Lines.Clear;&lt;br /&gt;
for ds in FDQuery1.View(dmAllowClone) do&lt;br /&gt;
  Memo1.Lines.Add(ds.FieldByName(&#039;name&#039;).AsString);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Liste der unterstützten Klassen====&lt;br /&gt;
&lt;br /&gt;
Die folgenden Klassen und ihre Nachkommen unterstützen die &#039;&#039;&#039;for&#039;&#039;&#039;-&#039;&#039;&#039;in&#039;&#039;&#039;-Syntax:&lt;br /&gt;
&lt;br /&gt;
* [[lib_de:System.Classes.TList|System.Classes.TList]]&lt;br /&gt;
* [[lib_de:System.Classes.TCollection|System.Classes.TCollection]]&lt;br /&gt;
* [[lib_de:System.Classes.TStrings|System.Classes.TStrings]]&lt;br /&gt;
* [[lib_de:System.Classes.TInterfaceList|System.Classes.TInterfaceList]]&lt;br /&gt;
* [[lib_de:System.Classes.TComponent|System.Classes.TComponent]] {{f|vcl|&lt;br /&gt;
* [[lib_de:Vcl.Menus.TMenuItem|Vcl.Menus.TMenuItem]]&lt;br /&gt;
* [[lib_de:Vcl.ActnList.TCustomActionList|Vcl.ActnList.TCustomActionList]]&lt;br /&gt;
* [[lib_de:Vcl.ComCtrls.TListItems|Vcl.ComCtrls.TListItems]]&lt;br /&gt;
* [[lib_de:Vcl.ComCtrls.TTreeNodes|Vcl.ComCtrls.TTreeNodes]]&lt;br /&gt;
* [[lib_de:Vcl.ComCtrls.TToolBar|Vcl.ComCtrls.TToolBar]] }}&lt;br /&gt;
* [[lib_de:Data.DB.TFields|Data.DB.TFields]]&lt;br /&gt;
* [[lib_de:Data.DB.TDataSet|Data.DB.TDataSet]]&lt;br /&gt;
&lt;br /&gt;
==Blöcke und Gültigkeitsbereich==&lt;br /&gt;
&lt;br /&gt;
Deklarationen und Anweisungen werden in &#039;&#039;Blöcken&#039;&#039; zusammengefasst. Alle in einem Block deklarierten Labels und Bezeichner sind für diesen Block lokal, das heißt, der Block stellt den &#039;&#039;Gültigkeitsbereich&#039;&#039; für diese Labels und Bezeichner dar. Blöcke ermöglichen es, einem Bezeichner (z. B. einem Variablennamen) in den einzelnen Programmabschnitten eine unterschiedliche Bedeutung zu geben. Ein Block ist immer Teil der Deklaration eines Programms, einer Funktion oder einer Prozedur. Umgekehrt verfügt jede Programm-, Funktions- oder Prozedurdeklaration über mindestens einen Block.&lt;br /&gt;
&lt;br /&gt;
===Blockanweisungen===&lt;br /&gt;
&lt;br /&gt;
Ein Block besteht aus Deklarationen und einer Verbundanweisung. Alle Deklarationen müssen zusammen am Anfang des Blocks stehen. Ein Block ist folgendermaßen aufgebaut:&lt;br /&gt;
&lt;br /&gt;
 {declarations}&lt;br /&gt;
 begin&lt;br /&gt;
   {statements}&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
Der Abschnitt &#039;&#039;declarations&#039;&#039; besteht aus Deklarationen von Variablen, Konstanten (einschließlich Ressourcenstrings), Typen, Prozeduren, Funktionen und Labels. In einem Programmblock können im &#039;&#039;declarations&#039;&#039;-Abschnitt auch eine oder mehrere &#039;&#039;&#039;exports&#039;&#039;&#039;-Klauseln enthalten sein (siehe [[Bibliotheken und Packages (Delphi)|Bibliotheken und Packages (Delphi)]].)&lt;br /&gt;
&lt;br /&gt;
In einer Funktionsdeklaration wie der folgenden:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 function UpperCase(const S: string): string;&lt;br /&gt;
 var&lt;br /&gt;
   Ch: Char;&lt;br /&gt;
   L: Integer;&lt;br /&gt;
   Source, Dest: PChar;&lt;br /&gt;
 begin&lt;br /&gt;
    ...&lt;br /&gt;
 end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
bildet die erste Zeile den Funktionskopf, die restliche Zeilen stellen den Block dar. &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Ch&amp;lt;/span&amp;gt;, &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;L&amp;lt;/span&amp;gt;, &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Source&amp;lt;/span&amp;gt; und &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Dest&amp;lt;/span&amp;gt; sind lokale Variablen. Ihre Deklarationen sind nur im Funktionsblock von &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;UpperCase&amp;lt;/span&amp;gt; gültig. Sie setzen in diesem Block (und nur hier) die Deklarationen aller Bezeichner gleichen Namens außer Kraft, die im &#039;&#039;&#039;program&#039;&#039;&#039;-Block bzw. im &#039;&#039;&#039;interface&#039;&#039;&#039;- oder &#039;&#039;&#039;implementation&#039;&#039;&#039;-Abschnitt einer Unit enthalten sind.&lt;br /&gt;
&lt;br /&gt;
===Gültigkeitsbereich===&lt;br /&gt;
&lt;br /&gt;
Ein Bezeichner, z. B. ein Variablen- oder Funktionsname, kann nur innerhalb des Gültigkeitsbereichs seiner Deklaration verwendet werden. Der Gültigkeitsbereich einer Deklaration hängt davon ab, wo die Deklaration stattfindet. Der Gültigkeitsbereich eines Bezeichners, der in der Deklaration eines Programms, einer Funktion oder einer Prozedur deklariert ist, beschränkt sich auf den Block, der die Deklaration enthält. Der Gültigkeitsbereich der im interface-Abschnitt einer Unit deklarierten Bezeichner erstreckt sich über alle Units und Programme, die diese Unit einbinden. Bezeichner mit eingeschränktem Gültigkeitsbereich (besonders solche, die in Funktionen und Prozeduren deklariert sind) werden lokale Bezeichner genannt. Bei Bezeichnern mit größerem Gültigkeitsbereich spricht man von globalen Bezeichnern.&lt;br /&gt;
&lt;br /&gt;
Die folgende Tabelle gibt einen Überblick über die Regeln für den Gültigkeitsbereich von Bezeichnern.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; frame=&amp;quot;hsides&amp;quot; rules=&amp;quot;rows&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039; Deklarationsort &#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039; Gültigkeitsbereich&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
Deklarationsabschnitt eines Programms, einer Funktion oder einer Prozedur&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
Von der Deklaration bis zum Ende des aktuellen Blocks, einschließlich aller verschachtelten Blöcke.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
interface-Abschnitt einer Unit&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
Von der Deklaration bis zum Ende der Unit sowie in allen anderen Units und Programmen, die diese Unit einbinden (siehe [[Programme und Units|Programme und Units (Delphi)]].)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
implementation-Abschnitt einer Unit, aber nicht innerhalb des Blocks einer Funktion oder Prozedur&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
Von der Deklaration bis zum Ende der Unit. Der Bezeichner ist für alle Funktionen und Prozeduren in der Unit verfügbar (einschließlich des initialization- und finalization-Abschnitts, falls vorhanden).&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
Definition eines Record-Typs (d. h. der Bezeichner ist der Name eines Record-Feldes)&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
Von der Deklaration bis zum Ende der Definition des Record-Typs (siehe &amp;quot;Records&amp;quot; in [[Strukturierte Typen (Delphi)|Stukturierte Typen (Delphi)]].)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
Definition einer Klasse (d. h. der Bezeichner ist der Name einer Datenfeldeigenschaft oder Methode der Klasse)&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
Von der Deklaration bis zum Ende der Klassentypdefinition sowie in allen Nachkommen der Klasse und den Blöcken aller in der Klasse definierten Methoden und deren Nachkommen (siehe [[Klassen und Objekte (Delphi)|Klassen und Objekte (Delphi)]].)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Namenskonflikte===&lt;br /&gt;
&lt;br /&gt;
Ein Block, der einen anderen einschließt, wird als äußerer Block bezeichnet, der eingeschlossene Block als innerer Block. Ein im äußeren Block deklarierter Bezeichner kann in einem inneren Block redeklariert werden. Die innere Deklaration setzt die äußere außer Kraft und bestimmt die Bedeutung, die der Bezeichner im inneren Block hat. Wenn Sie beispielsweise im &#039;&#039;&#039;interface&#039;&#039;&#039;-Abschnitt einer Unit eine Variable mit dem Namen &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;MaxValue&amp;lt;/span&amp;gt; und dann in dieser Unit eine weitere Variable gleichen Namens in einem Funktionsblock deklarieren, beziehen sich alle nicht qualifizierten Vorkommen von &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;MaxValue&amp;lt;/span&amp;gt; im Funktionsblock auf die lokale Deklaration. Ähnlich erzeugt eine Funktion, die innerhalb einer anderen Funktion deklariert wird, einen neuen, inneren Gültigkeitsbereich, in dem Bezeichner der äußeren Funktion lokal redeklariert werden können.&lt;br /&gt;
&lt;br /&gt;
Die Verwendung mehrerer Units kompliziert die Definition des Gültigkeitsbereichs. Jede Unit in einer &#039;&#039;&#039;uses&#039;&#039;&#039;-Klausel ergibt einen neuen Gültigkeitsbereich, der die anderen verwendeten Units und das &#039;&#039;&#039;Programm&#039;&#039;&#039; oder die &#039;&#039;&#039;Unit&#039;&#039;&#039; einschließt, die die &#039;&#039;&#039;uses&#039;&#039;&#039;-Klausel enthält. Die erste Unit in einer &#039;&#039;&#039;uses&#039;&#039;&#039;-Klausel entspricht dem äußersten, die letzte Unit dem innersten Gültigkeitsbereich. Ist derselbe Bezeichner in den &#039;&#039;&#039;interface&#039;&#039;&#039;-Abschnitten mehrerer Units deklariert, bezieht sich eine nicht qualifizierte Referenz auf den Bezeichner auf die Deklaration im innersten Gültigkeitsbereich, d. h. auf die Deklaration in der Unit, in der die Referenz selbst auftritt. Ist der Bezeichner nicht in dieser Unit deklariert, bezieht sich die Referenz auf die letzte Unit in der &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;uses&amp;lt;/span&amp;gt;-Klausel, die den Bezeichner deklariert.&lt;br /&gt;
&lt;br /&gt;
Die Units &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;System&amp;lt;/span&amp;gt; und &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;SysInit&amp;lt;/span&amp;gt; werden automatisch von jedem Programm und von jeder Unit verwendet. Für die in &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;System&amp;lt;/span&amp;gt; enthaltenen Deklarationen sowie für die vom Compiler automatisch erkannten vordefinierten Typen, Routinen und Konstanten gilt immer der äußerste Gültigkeitsbereich.&lt;br /&gt;
&lt;br /&gt;
Mit qualifizierten Bezeichnern (siehe &amp;quot;Qualifizierte Bezeichner&amp;quot; in [[Grundlegende syntaktische Elemente (Delphi)|Grundlegende syntaktische Elemente (Delphi)]]) oder mit &#039;&#039;&#039;with&#039;&#039;&#039;-Anweisungen (siehe &amp;quot;with-Anweisungen&amp;quot; weiter oben) können diese Regeln für den Gültigkeitsbereich außer Kraft gesetzt und lokale Deklarationen umgangen werden.&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
&lt;br /&gt;
*[[Grundlegende syntaktische Elemente (Delphi)|Grundlegende syntaktische Elemente (Delphi)]]&lt;br /&gt;
*[[Ausdrücke (Delphi)|Ausdrücke ({{Delphi}})]]&lt;br /&gt;
*[[Überblick über Datentypen (Delphi)|Überblick über Datentypen ({{Delphi}})]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Delphi]]&lt;br /&gt;
[[Category:Delphi-Sprachreferenz]]&lt;br /&gt;
[[Category:AMMigrate]]&lt;br /&gt;
&lt;br /&gt;
[[en:Declarations and Statements (Delphi)]]&lt;br /&gt;
[[fr:Déclarations et instructions (Delphi)]]&lt;br /&gt;
[[ja:宣言と文（Delphi）]]&lt;/div&gt;</summary>
		<author><name>Nicolas.rios</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Vorlage:CompilerVersion&amp;diff=218579</id>
		<title>Vorlage:CompilerVersion</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Vorlage:CompilerVersion&amp;diff=218579"/>
		<updated>2023-11-04T01:12:48Z</updated>

		<summary type="html">&lt;p&gt;Nicolas.rios: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ #switch: {{RadstudioVersion|{{{1|{{RadstudioVersion}}}}}}}&lt;br /&gt;
| {{Version|Olympus}} = 35&lt;br /&gt;
| {{Version|Denali}} = 34&lt;br /&gt;
| {{Version|Rio}} = 33&lt;br /&gt;
| {{Version|Carnival}} = 33&lt;br /&gt;
| {{Version|Tokyo}} = 32&lt;br /&gt;
| {{Version|Godzilla}} = 32&lt;br /&gt;
| {{Version|London}} = 31&lt;br /&gt;
| {{Version|Seattle}} = 30&lt;br /&gt;
| {{Version|XE8}} = 29&lt;br /&gt;
| {{Version|XE7}} = 28&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Datenvorlagen]]&lt;br /&gt;
[[Category:Durch Hauptversionsänderungen betroffene Vorlagen]]&lt;/div&gt;</summary>
		<author><name>Nicolas.rios</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Vorlage:FireMonkeyVersion&amp;diff=218578</id>
		<title>Vorlage:FireMonkeyVersion</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Vorlage:FireMonkeyVersion&amp;diff=218578"/>
		<updated>2023-11-04T01:11:38Z</updated>

		<summary type="html">&lt;p&gt;Nicolas.rios: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ #switch: {{RadstudioVersion|{{{1|{{RadstudioVersion}}}}}}}&lt;br /&gt;
| {{Version|Olympus}} = 280&lt;br /&gt;
| {{Version|Denali}} = 270&lt;br /&gt;
| {{Version|Rio}} = 260&lt;br /&gt;
| {{Version|Godzilla}} = 250&lt;br /&gt;
| {{Version|Berlin}} = 24&lt;br /&gt;
| {{Version|Seattle}} = 23&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Datenvorlagen]]&lt;br /&gt;
[[Category:Durch Hauptversionsänderungen betroffene Vorlagen]]&lt;/div&gt;</summary>
		<author><name>Nicolas.rios</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Vorlage:PackageVersion&amp;diff=218577</id>
		<title>Vorlage:PackageVersion</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Vorlage:PackageVersion&amp;diff=218577"/>
		<updated>2023-11-04T01:10:28Z</updated>

		<summary type="html">&lt;p&gt;Nicolas.rios: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ #switch: {{RadstudioVersion|{{{1|{{RadstudioVersion}}}}}}}&lt;br /&gt;
| {{Version|Seattle}} = 230&lt;br /&gt;
| {{Version|Berlin}} = 240&lt;br /&gt;
| {{Version|Godzilla}} = 250&lt;br /&gt;
| {{Version|Rio}} = 260&lt;br /&gt;
| {{Version|Denali}} = 270&lt;br /&gt;
| {{Version|Olympus}} = 280&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See [[rad_en:Compiler Versions]].&lt;br /&gt;
&lt;br /&gt;
[[Category:Datenvorlagen]]&lt;br /&gt;
[[Category:Durch Hauptversionsänderungen betroffene Vorlagen]]&lt;/div&gt;</summary>
		<author><name>Nicolas.rios</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Vorlage:RTLVersion&amp;diff=218576</id>
		<title>Vorlage:RTLVersion</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Vorlage:RTLVersion&amp;diff=218576"/>
		<updated>2023-11-04T01:09:42Z</updated>

		<summary type="html">&lt;p&gt;Nicolas.rios: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ #switch: {{RadstudioVersion|{{{1|{{RadstudioVersion}}}}}}}&lt;br /&gt;
| {{Version|XE7}} = 28&lt;br /&gt;
| {{Version|XE8}} = 29&lt;br /&gt;
| {{Version|Seattle}} = 30&lt;br /&gt;
| {{Version|Berlin}} = 31&lt;br /&gt;
| {{Version|Godzilla}} = 32&lt;br /&gt;
| {{Version|Tokyo}} = 32&lt;br /&gt;
| {{Version|Carnival}} = 33&lt;br /&gt;
| {{Version|Rio}} = 33&lt;br /&gt;
| {{Version|Denali}} = 34&lt;br /&gt;
| {{Version|Olympus}} = 35&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Datenvorlagen]]&lt;br /&gt;
[[Category:Durch Hauptversionsänderungen betroffene Vorlagen]]&lt;/div&gt;</summary>
		<author><name>Nicolas.rios</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Unicode_in_RAD_Studio&amp;diff=218572</id>
		<title>Unicode in RAD Studio</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Unicode_in_RAD_Studio&amp;diff=218572"/>
		<updated>2023-10-12T20:10:44Z</updated>

		<summary type="html">&lt;p&gt;Nicolas.rios: RS-119900&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
{{Parent|Einführung in RAD Studio}}&lt;br /&gt;
&lt;br /&gt;
In {{Product}} werden Unicode-basierte Strings verwendet: der Typ &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; ist nun ein Unicode-String ([[lib_de:System.UnicodeString|System.UnicodeString]]) anstatt eines ANSI-Strings. Dieses Thema beschreibt die korrekte Behandlung von Strings.&lt;br /&gt;
&lt;br /&gt;
Mit den Typen [[lib_de:System.AnsiStringT|AnsiString]] und [[lib_de:System.WideString|WideString]] werden ANSI- bzw. Wide-Strings verwendet.&lt;br /&gt;
&lt;br /&gt;
{{Product}} ist vollständig Unicode-kompatibel, und für diejenigen Teile Ihres Quelltextes, die die String-Behandlung betreffen, sind einige Änderungen möglicherweise erforderlich. Es wurde aber versucht, diese Änderungen auf ein Minimum zu beschränken. Es wurden zwar neue Datentypen eingeführt, aber vorhandene Datentypen wurden beibehalten und arbeiten genauso wie bisher. Ausgehend von dem mit der Unicode-Konvertierung im eigenen Haus gemachten Erfahrungen, sollten vorhandene Anwendungen ziemlich reibungslos migriert werden können.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weitere Ressourcen:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* [https://www.embarcadero.com/images/dm/technical-papers/delphi-unicode-migration.pdf {{Delphi}} Unicode Migration for Mere Mortals: Stories and Advice from the Front Lines von Cary Jensen (EN)]&lt;br /&gt;
* [https://www.embarcadero.com/rad-in-action/migration-upgrade-center#unicode Unicode Migration Resources for Delphi, C++Builder and RAD Studio (EN)]&lt;br /&gt;
&lt;br /&gt;
==Vorhandene String-Typen==&lt;br /&gt;
&lt;br /&gt;
Die bereits vorhandenen Datentypen &amp;lt;code&amp;gt;[[lib_de:System.AnsiStringT|AnsiString]]&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;[[lib_de:System.WideString|System.WideString]]&amp;lt;/code&amp;gt; arbeiten genauso wie bisher.&lt;br /&gt;
&lt;br /&gt;
Bei kurzen Strings gibt es hinsichtlich der Funktionalität ebenfalls keine Änderungen. Beachten Sie bitte, dass kurze Strings auf 255 Zeichen beschränkt sind und nur einen Zeichenzähler und Einzelbyte-Zeichendaten enthalten. Sie umfassen keine Codeseiteninformationen. Ein kurzer String kann in Ausnahmenfällen UTF-8-Daten für eine bestimmte Anwendung enthalten.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;AnsiString&amp;lt;/code&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;string&#039;&#039;&#039; war früher ein Alias für [[lib_de:System.AnsiString|AnsiString]]. Die folgende Tabelle zeigt die Position der Felder im früheren Format von &amp;lt;code&amp;gt;AnsiString&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Früheres Format des Datentyps &amp;lt;code&amp;gt;AnsiString&amp;lt;/code&amp;gt;: &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; frame=&amp;quot;hsides&amp;quot; rules=&amp;quot;rows&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;Referenzzähler &#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Länge &#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;String-Daten (auf Byte-Größe) &#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039; Nullterminiert&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
 -8&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
 -4&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
 0&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
 Length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In {{Product}} wurde das Format von [[lib_de:System.AnsiString|AnsiString]] geändert. Zwei neue Felder (&amp;lt;code&amp;gt;CodePage&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;ElemSize&amp;lt;/code&amp;gt;) wurden hinzugefügt. Dadurch ist das Format von [[lib_de:System.AnsiString|AnsiString]] identisch mit dem neuen Typ [[lib_de:System.UnicodeString|UnicodeString]]. (Weitere Informationen zum neuen Format finden Sie unter [[Interne Datenformate (Delphi)#Lange String-Typen|Lange String-Typen]].)&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;WideString&amp;lt;/code&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[[lib_de:System.WideString|System.WideString]]&amp;lt;/code&amp;gt; wurde früher für Unicode-Zeichendaten verwendet. Das Format von &amp;lt;code&amp;gt;WideString&amp;lt;/code&amp;gt; entspricht im Wesentlichen dem von Windows &amp;lt;code&amp;gt;BSTR&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;WideString&amp;lt;/code&amp;gt; sollte weiterhin in COM-Anwendungen verwendet werden.&lt;br /&gt;
&lt;br /&gt;
==Neuer String-Typ: UnicodeString==&lt;br /&gt;
&lt;br /&gt;
Der &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt;-Typ in {{Product}} ist der Typ &amp;lt;code&amp;gt;[[lib_de:System.UnicodeString|UnicodeString]]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In {{Delphi}} sind &amp;lt;code&amp;gt;Char&amp;lt;/code&amp;gt;- und &amp;lt;code&amp;gt;PChar&amp;lt;/code&amp;gt;-Typen jetzt &amp;lt;code&amp;gt;WideChar&amp;lt;/code&amp;gt;- bzw. &amp;lt;code&amp;gt;PWideChar&amp;lt;/code&amp;gt;-Typen.&lt;br /&gt;
&lt;br /&gt;
{{Note|Dies ist ein Unterschied zu Versionen vor 2009. In früheren Versionen war &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; ein Alias für &amp;lt;code&amp;gt;AnsiString&amp;lt;/code&amp;gt;, und die Typen &amp;lt;code&amp;gt;Char&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;PChar&amp;lt;/code&amp;gt; waren &amp;lt;code&amp;gt;AnsiChar&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;PAnsiChar&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
In C++ steuert die Option &#039;&#039;&#039;[[C++ (Gemeinsame Optionen)|_TCHAR entspricht]]&#039;&#039;&#039; die Definition von &amp;lt;code&amp;gt;_TCHAR&amp;lt;/code&amp;gt;, das entweder &amp;lt;code&amp;gt;wchar_t&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;char&amp;lt;/code&amp;gt; sein kann.&lt;br /&gt;
&lt;br /&gt;
[[Frameworks und Bibliotheken|{{Product}} Frameworks und Bibliotheken]] verwenden jetzt den Typ &amp;lt;code&amp;gt;UnicodeString&amp;lt;/code&amp;gt; und repräsentiert String-Werte nicht mehr als Einzelbyte- oder MBCS-Strings.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format des Datentyps &amp;lt;code&amp;gt;UnicodeString&amp;lt;/code&amp;gt;: &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; frame=&amp;quot;hsides&amp;quot; rules=&amp;quot;rows&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;Codeseite&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Elementgröße&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Referenzzähler &#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Länge &#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;String-Daten (auf Elementgröße) &#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039; Nullterminiert&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
 -12&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
 -10&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
 -8&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
 -4&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
 0&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
 Length * elementsize&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;UnicodeString&amp;lt;/code&amp;gt; kann als die folgende {{Delphi}}-Struktur dargestellt werden:&lt;br /&gt;
&lt;br /&gt;
 type StrRec = record&lt;br /&gt;
       CodePage: Word;&lt;br /&gt;
       ElemSize: Word;&lt;br /&gt;
       refCount: Integer;&lt;br /&gt;
       Len: Integer;&lt;br /&gt;
       case Integer of&lt;br /&gt;
           1: array[0..0] of AnsiChar;&lt;br /&gt;
           2: array[0..0] of WideChar;&lt;br /&gt;
 end;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;UnicodeString&amp;lt;/code&amp;gt; fügt die Felder für die Codeseite &amp;lt;code&amp;gt;CodePage&amp;lt;/code&amp;gt; und die Elementgröße &amp;lt;code&amp;gt;ElemSize&amp;lt;/code&amp;gt; hinzu, die den Inhalt des Strings beschreiben. &amp;lt;code&amp;gt;UnicodeString&amp;lt;/code&amp;gt; ist zu allen anderen String-Typen zuweisungskompatibel. Zuweisungen zwischen &amp;lt;code&amp;gt;AnsiString&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;UnicodeString&amp;lt;/code&amp;gt; führen aber weiterhin die entsprechenden Auf- oder Abkonvertierungen durch. Bitte beachten Sie, dass eine Zuweisung eines &amp;lt;code&amp;gt;UnicodeString&amp;lt;/code&amp;gt;-Typs zu einem &amp;lt;code&amp;gt;AnsiString&amp;lt;/code&amp;gt;-Typ nicht empfohlen wird und zu Datenverlusten führen kann.&lt;br /&gt;
&lt;br /&gt;
Beachten Sie, dass &amp;lt;code&amp;gt;AnsiString&amp;lt;/code&amp;gt; ebenfalls über die Felder &amp;lt;code&amp;gt;CodePage&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;ElemSize&amp;lt;/code&amp;gt; verfügt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;UnicodeString&amp;lt;/code&amp;gt;-Daten sind aus folgenden Gründen in UTF-16 codiert:&lt;br /&gt;
&lt;br /&gt;
* UTF-16 entspricht dem zugrunde liegenden Format des Betriebssystems.&lt;br /&gt;
* UTF-16 reduziert zusätzliche explizite/implizite Konvertierungen.&lt;br /&gt;
* Es bietet bei Aufrufen der Windows-API eine bessere Performanz.&lt;br /&gt;
* Es müssen keine Betriebssystem Konvertierungen mit UTF-16 durchgeführt werden.&lt;br /&gt;
* Der Basic Multilingual Plane (BMP) enthält bereits die Schriftzeichen fast aller aktiven Sprachen der Welt und passt in ein einzelnes UTF-16 &amp;lt;code&amp;gt;Char&amp;lt;/code&amp;gt; (16 Bits).&lt;br /&gt;
* Unicode-Surrogatpaare entsprechen dem Multibyte-Zeichensatz (MBCS), sind aber berechenbarer und Standard.&lt;br /&gt;
* &amp;lt;code&amp;gt;UnicodeString&amp;lt;/code&amp;gt; kann für das Marshalling von COM-Interfaces verlustlose implizite Konvertierungen in und aus &amp;lt;code&amp;gt;WideString&amp;lt;/code&amp;gt; bereitstellen.&lt;br /&gt;
&lt;br /&gt;
Zeichen in UTF-16 können 2 oder 4 Byte groß sein, daher ist die Anzahl der Elemente in einem String nicht notwendigerweise gleich der Anzahl der Zeichen. Wenn der String nur aus BMP-Zeichen besteht, ist die Anzahl der Zeichen und der Elemente identisch.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;UnicodeString&amp;lt;/code&amp;gt; bietet die folgenden Vorteile:&lt;br /&gt;
&lt;br /&gt;
* UnicodeString verfügt über einen Referenzzähler.&lt;br /&gt;
* UnicodeString löst ein Problem von Altanwendungen in {{CBuilder}}.&lt;br /&gt;
* Durch die Aufnahme von Codierungsinformationen (Codeseite) in &amp;lt;code&amp;gt;AnsiString&amp;lt;/code&amp;gt; wird das Risiko eines möglichen Datenverlustes bei impliziten Typumwandlungen reduziert.&lt;br /&gt;
* Der Compiler stellt sicher, dass die Daten korrekt sind, bevor die Daten verändert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;WideString&amp;lt;/code&amp;gt; verfügt über keinen Referenzzähler, deshalb ist &amp;lt;code&amp;gt;UnicodeString&amp;lt;/code&amp;gt; für die meisten Anwendungstypen flexibler und effizienter (&amp;lt;code&amp;gt;WideString&amp;lt;/code&amp;gt; eignet sich eher für COM).&lt;br /&gt;
&lt;br /&gt;
===Indizierung===&lt;br /&gt;
&lt;br /&gt;
Instanzen von &amp;lt;code&amp;gt;UnicodeString&amp;lt;/code&amp;gt; können Zeichen indizieren. Die Indizierung ist 1-basiert, genau wie bei &amp;lt;code&amp;gt;AnsiString&amp;lt;/code&amp;gt;. Sehen Sie sich den folgenden Quelltext an:&lt;br /&gt;
&lt;br /&gt;
 var C: Char;&lt;br /&gt;
     S: string;&lt;br /&gt;
     begin&lt;br /&gt;
         ...&lt;br /&gt;
         C := S[1];&lt;br /&gt;
         ...&lt;br /&gt;
     end;&lt;br /&gt;
&lt;br /&gt;
In einem Fall, wie dem oben dargestellten, muss der Compiler sicher stellen, dass die Daten in &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; in einem geeigneten Format vorliegen. Der Compiler erzeugt entsprechenden Code, damit Zuweisungen zu String-Elementen den richtigen Typ haben und die Instanz eindeutig ist (d.h., dass sie einen Referenzzähler von 1 hat). Dies geschieht über einen Aufruf der Funktion &amp;lt;code&amp;gt;UniqueString&amp;lt;/code&amp;gt;. Für den obigen Quelltext muss der Compiler, weil der String Unicode-Daten enthalten könnte, vor der Indizierung im Zeichen-Array auch die passende &amp;lt;code&amp;gt;UniqueString&amp;lt;/code&amp;gt;-Funktion aufrufen.&lt;br /&gt;
{{f|vcl|&lt;br /&gt;
&lt;br /&gt;
==={{CBuilder}}===&lt;br /&gt;
&lt;br /&gt;
Die Klasse &amp;lt;code&amp;gt;UnicodeString&amp;lt;/code&amp;gt; in {{CBuilder}} ermöglicht eine {{Delphi}}-ähnliche automatische Konvertierungssemantik. Bei vorhandenen VCL-Ereignisbehandlungsroutinen, die &amp;lt;code&amp;gt;AnsiString&amp;lt;/code&amp;gt;-Parameter erwarten, ist dies ziemlich transparent, weil Konvertierungen bei Bedarf ausgeführt werden. So können Anwender allmählich, nach ihrem eigenen Zeitplan, zu vollständigem Unicode migrieren.&lt;br /&gt;
&lt;br /&gt;
In manchen Situationen führt diese automatische Konvertierung aber zu unerwünschten Ergebnissen. Der VCL-String-Typ ist jetzt &amp;lt;code&amp;gt;UnicodeString&amp;lt;/code&amp;gt; und nicht mehr &amp;lt;code&amp;gt;AnsiString&amp;lt;/code&amp;gt;. Aus Gründen der Abwärtskompatibilität gibt die Methode &amp;lt;code&amp;gt;UnicodeString::t_str()&amp;lt;/code&amp;gt; &#039;const char* anstelle von &amp;lt;code&amp;gt;const wchar_t*&amp;lt;/code&amp;gt; zurück, indem die Größe der Wide-Daten der &amp;lt;code&amp;gt;UnicodeString&amp;lt;/code&amp;gt;-Instanz reduziert wird. Dies kann zu unerwartetem Verhalten führen, weil der Quellcode einen Aufruf von &amp;lt;code&amp;gt;t_str()&amp;lt;/code&amp;gt; nicht akzeptieren könnte, da die zugrunde liegenden Daten fehlerhaft werden könnten. Dieses Verhalten wird in Quellcode deutlich, der die zugrunde liegenden Daten in der Benutzeroberfläche, wie z.B. in &amp;lt;code&amp;gt;TListItem&amp;lt;/code&amp;gt;, anzeigt.&lt;br /&gt;
&lt;br /&gt;
In dem folgenden Beispiel sind die nach dem Aufruf von &amp;lt;code&amp;gt;t_str()&amp;lt;/code&amp;gt; in der letzten Zeile der Methode in &amp;lt;code&amp;gt;TListView&amp;lt;/code&amp;gt; angezeigten Daten fehlerhaft:&lt;br /&gt;
&lt;br /&gt;
 void ProcessSelectedItem(const char* item);&lt;br /&gt;
 &lt;br /&gt;
 void __fastcall TForm6::ListView1DblClick(TObject *Sender)&lt;br /&gt;
 {&lt;br /&gt;
     int index = ListView1-&amp;amp;gt;Selected-&amp;amp;gt;Index;&lt;br /&gt;
     TListItem *ClassItem = ListView1-&amp;amp;gt;Items-&amp;amp;gt;Item[index];&lt;br /&gt;
     ProcessSelectedItem(ClassItem-&amp;amp;gt;Caption.t_str());&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Compilerbedingungen==&lt;br /&gt;
&lt;br /&gt;
In {{Delphi}} als auch in {{CBuilder}} können Sie Bedingungen setzen, um im selben Quelltext Unicode- und Nicht-Unicode-Code zuzulassen.&lt;br /&gt;
&lt;br /&gt;
==={{Delphi}}===&lt;br /&gt;
&lt;br /&gt;
 {$IFDEF UNICODE}&lt;br /&gt;
&lt;br /&gt;
==={{CBuilder}}===&lt;br /&gt;
&lt;br /&gt;
 #ifdef _DELPHI_STRING_UNICODE &lt;br /&gt;
&lt;br /&gt;
==Überblick über die Änderungen==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; wird nun &amp;lt;code&amp;gt;UnicodeString&amp;lt;/code&amp;gt; und nicht &amp;lt;code&amp;gt;AnsiString&amp;lt;/code&amp;gt; zugeordnet.&lt;br /&gt;
* &amp;lt;code&amp;gt;Char&amp;lt;/code&amp;gt; wird nun &amp;lt;code&amp;gt;WideChar&amp;lt;/code&amp;gt; (2 Byte, nicht 1 Byte) zugeordnet und ist ein UTF-16-Zeichen.&lt;br /&gt;
* &amp;lt;code&amp;gt;PChar&amp;lt;/code&amp;gt; wird nun &amp;lt;code&amp;gt;PWideChar&amp;lt;/code&amp;gt; zugeordnet.&lt;br /&gt;
* In C++ wird &amp;lt;code&amp;gt;System::String&amp;lt;/code&amp;gt; nun der Klasse &amp;lt;code&amp;gt;UnicodeString&amp;lt;/code&amp;gt; zugeordnet.&lt;br /&gt;
&lt;br /&gt;
==Überblick über Unverändertes==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;AnsiString&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;WideString&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;AnsiChar&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PAnsiChar&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;WideChar&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PWideChar&amp;lt;/code&amp;gt;&lt;br /&gt;
* Implizite Konvertierungen funktionieren weiterhin.&lt;br /&gt;
* &amp;lt;code&amp;gt;AnsiString&amp;lt;/code&amp;gt; verwendet die aktive Codeseite des Benutzers.&lt;br /&gt;
&lt;br /&gt;
==Von der Zeichengröße unabhängige Quelltextkonstrukte==&lt;br /&gt;
&lt;br /&gt;
Die folgenden Operationen sind von der Zeichengröße unabhängig:&lt;br /&gt;
&lt;br /&gt;
* String-Verkettung:&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;amp;lt;string var&amp;amp;gt; + &amp;amp;lt;string var&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;amp;lt;string var&amp;amp;gt; + &amp;amp;lt;literal&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;amp;lt;literal&amp;amp;gt; + &amp;amp;lt;literal&amp;amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;Concat(&amp;amp;lt;string&amp;amp;gt; , &amp;amp;lt;string&amp;amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Standard-String-Funktionen:&lt;br /&gt;
** &amp;lt;code&amp;gt;Length(&amp;amp;lt;string&amp;amp;gt;)&amp;lt;/code&amp;gt; gibt die Anzahl der char-Elemente zurück. Diese Anzahl muss nicht unbedingt gleich der Anzahl der Byte sein. Beachten Sie bitte, dass die Funktion &amp;lt;code&amp;gt;SizeOf&amp;lt;/code&amp;gt; die Anzahl der Byte zurückgibt, was bedeutet, dass sich der Rückgabewert für &amp;lt;code&amp;gt;SizeOf&amp;lt;/code&amp;gt; von &amp;lt;code&amp;gt;Length&amp;lt;/code&amp;gt; unterscheiden kann.&lt;br /&gt;
** &amp;lt;code&amp;gt;Copy(&amp;amp;lt;String&amp;amp;gt;, &amp;amp;lt;Start&amp;amp;gt;, &amp;amp;lt;Länge&amp;amp;gt;)&amp;lt;/code&amp;gt; gibt einen Teilstring in &amp;lt;code&amp;gt;Char&amp;lt;/code&amp;gt;-Elementen zurück.&lt;br /&gt;
** &amp;lt;code&amp;gt;Pos(&amp;amp;lt;Teilstring&amp;amp;gt;, &amp;amp;lt;String&amp;amp;gt;)&amp;lt;/code&amp;gt; gibt den Index des ersten &amp;lt;code&amp;gt;Char&amp;lt;/code&amp;gt;-Elements zurück.&lt;br /&gt;
&lt;br /&gt;
* Operatoren:&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;amp;lt;String&amp;amp;gt; &amp;amp;lt;Vergleichsoperator&amp;amp;gt; &amp;amp;lt;String&amp;amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;CompareStr() &amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;CompareText() &amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt; ... &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;code&amp;gt;FillChar(&amp;amp;lt;Struktur oder Arbeitsspeicher&amp;amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;FillChar(Rect, SizeOf(Rect), #0)&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;FillChar(WndClassEx, SizeOf(TWndClassEx), #0)&amp;lt;/code&amp;gt;.  Bitte beachten: &amp;lt;code&amp;gt;WndClassEx.cbSize&amp;amp;nbsp;:= SizeOf(TWndClassEx);&amp;lt;/code&amp;gt;&lt;br /&gt;
* Windows-API&lt;br /&gt;
** Bei API-Aufrufen werden standardmäßig deren &amp;lt;code&amp;gt;WideString&amp;lt;/code&amp;gt;-(“W”)-Versionen verwendet.&lt;br /&gt;
** Die &amp;lt;code&amp;gt;PChar(&amp;amp;lt;String&amp;amp;gt;)&amp;lt;/code&amp;gt;-Typumwandlung hat eine identische Semantik.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel für &amp;lt;code&amp;gt;GetModuleFileName&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 function ModuleFileName(Handle: HMODULE): string;&lt;br /&gt;
     var Buffer: array[0..MAX_PATH] of Char;&lt;br /&gt;
         begin&lt;br /&gt;
             SetString(Result, Buffer, &lt;br /&gt;
                       GetModuleFileName(Handle, Buffer, Length(Buffer)));&lt;br /&gt;
         end;&lt;br /&gt;
&lt;br /&gt;
Beispiel für &amp;lt;code&amp;gt;GetWindowText&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 function WindowCaption(Handle: HWND): string;&lt;br /&gt;
       begin&lt;br /&gt;
           SetLength(Result, 1024);&lt;br /&gt;
           SetLength(Result, &lt;br /&gt;
                     GetWindowText(Handle, PChar(Result), Length(Result)));&lt;br /&gt;
       end;&lt;br /&gt;
&lt;br /&gt;
Beispiel für die Zeichenindizierung von Strings:&lt;br /&gt;
&lt;br /&gt;
 function StripHotKeys(const S: string): string;&lt;br /&gt;
     var I, J: Integer;&lt;br /&gt;
     LastChar: Char;&lt;br /&gt;
     begin&lt;br /&gt;
         SetLength(Result, Length(S));&lt;br /&gt;
         J := 0;&lt;br /&gt;
         LastChar := #0;&lt;br /&gt;
         for I := 1 to Length(S) do&lt;br /&gt;
         begin&lt;br /&gt;
           if (S[I] &amp;amp;lt;&amp;amp;gt; &#039;&amp;amp;amp;&#039;) or (LastChar = &#039;&amp;amp;amp;&#039;) then&lt;br /&gt;
           begin&lt;br /&gt;
               Inc(J);&lt;br /&gt;
               Result[J] := S[I];&lt;br /&gt;
           end;&lt;br /&gt;
           LastChar := S[I];&lt;br /&gt;
     end;&lt;br /&gt;
     SetLength(Result, J);&lt;br /&gt;
 end;&lt;br /&gt;
&lt;br /&gt;
==Von der Zeichengröße abhängige Quelltextkonstrukte==&lt;br /&gt;
&lt;br /&gt;
Einige Operationen sind von der Zeichengröße abhängig. Die Funktionen und Features in der folgenden Liste enthalten - sofern möglich - auch eine “portierbare” Version. Sie können Ihren Quelltext auch in der portierbaren Version neu schreiben, er funktioniert sowohl mit &amp;lt;code&amp;gt;AnsiString&amp;lt;/code&amp;gt;- als auch mit &amp;lt;code&amp;gt;UnicodeString&amp;lt;/code&amp;gt;-Variablen.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;SizeOf(&amp;amp;lt;Char-Array&amp;amp;gt;)&amp;lt;/code&amp;gt; - portierbare Version: &amp;lt;code&amp;gt;Length(&amp;amp;lt;Char-Array&amp;amp;gt;)&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;Move(&amp;amp;lt;Char-Puffer&amp;amp;gt;... CharCount)&amp;lt;/code&amp;gt; - portierbare Version: &amp;lt;code&amp;gt;Move(&amp;amp;lt;Char-Puffer&amp;amp;gt; ... CharCount * SizeOf(Char))&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Stream Read/Write - portierbare Version: &amp;lt;code&amp;gt;AnsiString&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SizeOf(Char)&amp;lt;/code&amp;gt; oder die Klasse &amp;lt;code&amp;gt;TEncoding&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;FillChar(&amp;amp;lt;Char-Array&amp;amp;gt;, &amp;amp;lt;Größe&amp;amp;gt;, &amp;amp;lt;AnsiChar&amp;amp;gt;)&amp;lt;/code&amp;gt; - verwenden Sie zum Auffüllen mit &amp;lt;code&amp;gt;#0&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;*SizeOf(Char)&amp;lt;/code&amp;gt; oder die portierbare &amp;lt;code&amp;gt;StringOfChar&amp;lt;/code&amp;gt;-Funktion.&lt;br /&gt;
* &amp;lt;code&amp;gt;GetProcAddress(&amp;amp;lt;Modul&amp;amp;gt;, &amp;amp;lt;PAnsiChar&amp;amp;gt;)&amp;lt;/code&amp;gt; - verwenden Sie die überladene Funktion, die ein &amp;lt;code&amp;gt;PWideChar&amp;lt;/code&amp;gt; übernimmt.&lt;br /&gt;
* Typumwandlung oder die Verwendung von &amp;lt;code&amp;gt;PChar&amp;lt;/code&amp;gt; für die Zeigerarithmetik - fügen Sie am Beginn der Datei &amp;lt;code&amp;gt;{IFDEF PByte = PChar}&amp;lt;/code&amp;gt; ein, wenn Sie &amp;lt;code&amp;gt;PChar&amp;lt;/code&amp;gt; für die Zeigerarithmetik verwenden. Oder verwenden Sie die {{Delphi}}-Compiler-Direktive &amp;lt;code&amp;gt;{POINTERMATH &amp;amp;lt;ON|OFF&amp;amp;gt;}&amp;lt;/code&amp;gt;, um die Zeigerarithmetik für alle typisierten Zeiger zu aktivieren, damit das Inkrementieren/Dekrementieren nach Elementgröße ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
==Set of Char-Konstrukte==&lt;br /&gt;
&lt;br /&gt;
Sie müssen diese Konstrukte wahrscheinlich ändern.&lt;br /&gt;
&lt;br /&gt;
* &amp;amp;lt;Char&amp;amp;gt; in &amp;amp;lt;set of &amp;lt;code&amp;gt;AnsiChar&amp;lt;/code&amp;gt;&amp;amp;gt; - Codeerzeugung ist korrekt (&amp;lt;code&amp;gt;&amp;amp;gt;#255&amp;lt;/code&amp;gt;-Zeichen sind nie in der Menge enthalten). Der Compiler gibt die Warnung &amp;lt;code&amp;gt;WideChar in Set-Operationen verkürzt&amp;lt;/code&amp;gt; aus. Abhängig von Ihrem Quelltext können Sie die Warnung gefahrlos deaktivieren. Verwenden Sie als Alternative die Funktion &amp;lt;code&amp;gt;CharinSet&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;amp;lt;Char&amp;amp;gt; in &amp;lt;code&amp;gt;LeadBytes&amp;lt;/code&amp;gt; - die globale Menge &amp;lt;code&amp;gt;LeadBytes&amp;lt;/code&amp;gt; ist für MBCS-ANSI-Gebietseinstellungen vorgesehen. UTF-16 arbeitet weiterhin mit einem &amp;quot;Führungszeichen&amp;quot; (lead char) (&amp;lt;code&amp;gt;#$D800 - #$DBFF&amp;lt;/code&amp;gt; sind hohe Surrogate, &amp;lt;code&amp;gt;#$DC00 - #$DFFF&amp;lt;/code&amp;gt; niedrige Surrogate). Verwenden Sie, um dies zu ändern, die überladene Funktion &amp;lt;code&amp;gt;IsLeadChar&amp;lt;/code&amp;gt;. Die ANSI-Version prüft auf &amp;lt;code&amp;gt;LeadBytes&amp;lt;/code&amp;gt;. Die &amp;lt;code&amp;gt;WideChar&amp;lt;/code&amp;gt;-Version prüft, ob es sich um ein hohes/niedriges Surrogat handelt.&lt;br /&gt;
* Zeichenklassifikation - verwenden Sie die statische Klasse &amp;lt;code&amp;gt;TCharacter&amp;lt;/code&amp;gt;. Die Unit &amp;lt;code&amp;gt;[[lib_de:System.Character|Character]]&amp;lt;/code&amp;gt; enthält Funktionen für die Klassifikation von Zeichen: &amp;lt;code&amp;gt;IsDigit&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IsLetter&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IsLetterOrDigit&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IsSymbol&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IsWhiteSpace&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IsSurrogatePair&amp;lt;/code&amp;gt; usw. Diese Funktionen basieren auf Tabellendaten der Unicode.org.&lt;br /&gt;
&lt;br /&gt;
==Achtung bei diesen Konstrukten==&lt;br /&gt;
&lt;br /&gt;
Sie sollten die folgenden problematischen Codekonstrukte untersuchen:&lt;br /&gt;
&lt;br /&gt;
* Typumwandlungen, die den Typ verbergen:&lt;br /&gt;
** &amp;lt;code&amp;gt;AnsiString(Pointer(foo))&amp;lt;/code&amp;gt;&lt;br /&gt;
** Überprüfen Sie, was beabsichtigt war.&lt;br /&gt;
* Verdächtige Typumwandlungen erzeugen eine Warnung:&lt;br /&gt;
** &amp;lt;code&amp;gt;PChar(&amp;amp;lt;AnsiString var&amp;amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;PAnsiChar(&amp;amp;lt;UnicodeString var&amp;amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
* Direktes Erstellen, Manipulieren oder Zugreifen auf interne Strukturen. Einige dieser Strukturen, wie z.B. &amp;lt;code&amp;gt;AnsiString&amp;lt;/code&amp;gt;, wurden intern verändert, daher sind diese Aktionen unsicher. Verwenden Sie die Funktionen &amp;lt;code&amp;gt;StringRefCount&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;StringCodePage&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;StringElementSize&amp;lt;/code&amp;gt; und andere, um String-Informationen zu ermitteln.&lt;br /&gt;
&lt;br /&gt;
==Laufzeitbibliothek==&lt;br /&gt;
&lt;br /&gt;
* Überladungen. Für Funktionen, die &amp;lt;code&amp;gt;PChar&amp;lt;/code&amp;gt; übernehmen, gibt es jetzt &amp;lt;code&amp;gt;PAnsiChar&amp;lt;/code&amp;gt;- und &amp;lt;code&amp;gt;PWideChar&amp;lt;/code&amp;gt;-Versionen, damit die richtige Funktion aufgerufen wird.&lt;br /&gt;
*&amp;lt;code&amp;gt;AnsiXXX&amp;lt;/code&amp;gt;-Funktionen sind möglich:&lt;br /&gt;
**&amp;lt;code&amp;gt;[[lib_de:System.SysUtils|SysUtils.AnsiXXXX]]&amp;lt;/code&amp;gt;-Funktionen, wie z.B. &amp;lt;code&amp;gt;[[lib_de:System.SysUtils.AnsiCompareStr|AnsiCompareStr]]&amp;lt;/code&amp;gt;:&lt;br /&gt;
*** Werden weiterhin mit &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; deklariert und verwenden &amp;lt;code&amp;gt;[[lib_de:System.UnicodeString|UnicodeString]]&amp;lt;/code&amp;gt;.&lt;br /&gt;
*** Bieten eine bessere Abwärtskompatibilität (Quelltext muss nicht geändert werden).&lt;br /&gt;
** Die &amp;lt;code&amp;gt;AnsiXXXX&amp;lt;/code&amp;gt;-Funktionen der Unit &amp;lt;code&amp;gt;[[lib_de:System.AnsiStrings|AnsiStrings]]&amp;lt;/code&amp;gt; bieten dieselben Möglichkeiten wie die &amp;lt;code&amp;gt;[[lib_de:System.SysUtils|SysUtils.AnsiXXXX]]&amp;lt;/code&amp;gt;-Funktionen, arbeiten aber nur mit &amp;lt;code&amp;gt;AnsiString&amp;lt;/code&amp;gt;. Die &amp;lt;code&amp;gt;AnsiStrings.AnsiXXXX&amp;lt;/code&amp;gt;-Funktionen bieten auch eine bessere Performanz für einen &amp;lt;code&amp;gt;[[lib_de:System.AnsiStringT|AnsiString]]&amp;lt;/code&amp;gt; als die &amp;lt;code&amp;gt;SysUtils.AnsiXXXX&amp;lt;/code&amp;gt;-Funktionen, die sowohl mit &amp;lt;code&amp;gt;[[lib_de:System.AnsiStringT|AnsiString]]&amp;lt;/code&amp;gt; als auch mit &amp;lt;code&amp;gt;[[lib_de:System.UnicodeString|UnicodeString]]&amp;lt;/code&amp;gt; arbeiten, weil keine impliziten Konvertierungen ausgeführt werden.&lt;br /&gt;
*&amp;lt;code&amp;gt;[[lib_de:System.Write|Write]]/[[lib_de:System.Writeln|Writeln]]&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;[[lib_de:System.Read|Read]]/[[lib_de:System.Readln|Readln]]&amp;lt;/code&amp;gt;:&lt;br /&gt;
** Konvertieren weiterhin in/aus ANSI/OEM-Codeseiten.&lt;br /&gt;
** Die Konsole ist meist sowieso ANSI oder OEM.&lt;br /&gt;
** Bieten eine bessere Kompatibilität zu Altanwendungen.&lt;br /&gt;
** TFDD (Gerätetreiber für Textdateien):&lt;br /&gt;
*** &amp;lt;code&amp;gt;[[lib_de:System.TTextRec|TTextRec]]&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;[[lib_de:System.TFileRec|TFileRec]]&amp;lt;/code&amp;gt;.&lt;br /&gt;
*** Dateinamen sind &amp;lt;code&amp;gt;WideChar&amp;lt;/code&amp;gt;, aber wie oben sind die Daten ANSI/OEM.&lt;br /&gt;
** Verwenden Sie &amp;lt;code&amp;gt;[[lib_de:System.SysUtils.TEncoding|TEncoding]]&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;[[lib_de:System.Classes.TStrings|TStrings]]&amp;lt;/code&amp;gt; für die Unicode-Dateieingabe-/ausgabe.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;PByte&amp;lt;/code&amp;gt; - deklariert mit &amp;lt;code&amp;gt;[[Zeigermathematik (Delphi)|$POINTERMATH ON]]&amp;lt;/code&amp;gt;. Dadurch wird die Array-Indizierung und die Zeigermathematik wie bei &amp;lt;code&amp;gt;PAnsiChar&amp;lt;/code&amp;gt; ermöglicht.&lt;br /&gt;
&lt;br /&gt;
* String-Informationsfunktionen:&lt;br /&gt;
** &amp;lt;code&amp;gt;[[lib_de:System.StringElementSize|StringElementSize]]&amp;lt;/code&amp;gt; gibt die aktuelle Datengröße zurück.&lt;br /&gt;
** &amp;lt;code&amp;gt;[[lib_de:System.StringCodePage|StringCodePage]]&amp;lt;/code&amp;gt; gibt die Codeseite von String-Daten zurück.&lt;br /&gt;
** &amp;lt;code&amp;gt;[[lib_de:System.StringRefCount|System.StringRefCount]]&amp;lt;/code&amp;gt; gibt den Referenzzähler zurück.&lt;br /&gt;
&lt;br /&gt;
* Die RTL stellt Hilfsfunktionen bereit, mit denen Anwender explizite Konvertierungen zwischen Codeseiten und Elementgrößenumwandlungen vornehmen können. Wenn Entwickler die Funktion &amp;lt;code&amp;gt;Move&amp;lt;/code&amp;gt; für ein Zeichen-Array verwenden, können sie keine Annahme über die Elementgröße machen. Dieses Problem kann reduziert werden, indem sichergestellt wird, dass alle R-Wert-Referenzen korrekte Aufrufe der RTL erzeugen, um korrekte Elementgrößen zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
==Komponenten und Klassen==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;TStrings&amp;lt;/code&amp;gt;: Speichert &amp;lt;code&amp;gt;UnicodeString&amp;lt;/code&amp;gt; intern (bleibt als &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; deklariert).&lt;br /&gt;
* &amp;lt;code&amp;gt;TWideStrings&amp;lt;/code&amp;gt; (wird eventuell bald nicht mehr unterstützt) ist unverändert. Verwendet &amp;lt;code&amp;gt;WideString&amp;lt;/code&amp;gt; (BSTR) intern.&lt;br /&gt;
*&amp;lt;code&amp;gt;TStringStream&amp;lt;/code&amp;gt;&lt;br /&gt;
** Wurde neu geschrieben – hat per Vorgabe die ANSI-Standardcodierung für interne Speicherung.&lt;br /&gt;
** Die Codierung kann überschrieben werden.&lt;br /&gt;
** Ziehen Sie zum Erstellen eines Strings aus verschiedenen Teilen &amp;lt;code&amp;gt;TStringBuilder&amp;lt;/code&amp;gt; anstelle von &amp;lt;code&amp;gt;TStringStream&amp;lt;/code&amp;gt; in Betracht.&lt;br /&gt;
*&amp;lt;code&amp;gt;[[lib_de:System.SysUtils.TEncoding|TEncoding]]&amp;lt;/code&amp;gt;&lt;br /&gt;
** Verwendet standardmäßig die aktive Codeseite des Anwenders.&lt;br /&gt;
** Unterstützt UTF-8.&lt;br /&gt;
** Unterstützt UTF-16, Big und Little Endian.&lt;br /&gt;
** Unterstützt Byte Order Mark (BOM).&lt;br /&gt;
** Sie können für benutzerspezifische Codierungen abgeleitete Klassen erstellen.&lt;br /&gt;
&lt;br /&gt;
* Komponenten-Streaming (Text-DFM-Dateien):&lt;br /&gt;
** Sind vollständig abwärtskompatibel.&lt;br /&gt;
** Verwenden für das Streaming nur UTF-8, wenn der Komponententyp, die Eigenschaft oder der Name keine ASCII-7-Zeichen enthält.&lt;br /&gt;
** String-Eigenschaftswerte werden weiterhin mit dem “#”-Escaped-Format in den Stream gestellt.&lt;br /&gt;
** Lassen auch Werte als UTF-8 zu (noch nicht geklärtes Problem).&lt;br /&gt;
** Nur die Änderung im Binärformat ist für UTF-8-Daten für Komponentennamen, Eigenschaften und Typnamen möglich.&lt;br /&gt;
&lt;br /&gt;
==Byte Order Mark==&lt;br /&gt;
&lt;br /&gt;
Das Byte Order Mark (BOM) sollte zur Angabe der Codierung Dateien hinzugefügt werden:&lt;br /&gt;
&lt;br /&gt;
* UTF-8 verwendet &amp;lt;code&amp;gt;EF BB BF&amp;lt;/code&amp;gt;.&lt;br /&gt;
* UTF-16 Little Endian verwendet &amp;lt;code&amp;gt;FF FE&amp;lt;/code&amp;gt;.&lt;br /&gt;
* UTF-16 Big Endian verwendet &amp;lt;code&amp;gt;FE FF&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Schritte zum Aktivieren von Unicode in Anwendungen==&lt;br /&gt;
&lt;br /&gt;
Sie müssen die folgenden Schritte ausführen:&lt;br /&gt;
&lt;br /&gt;
# Überprüfen von Char- und String-bezogenen Funktionen&lt;br /&gt;
# Neu erzeugen der Anwendung&lt;br /&gt;
# Überprüfen von Surrogatpaaren&lt;br /&gt;
# Überprüfen der String-Nutzdaten&lt;br /&gt;
&lt;br /&gt;
Weitere Einzelheiten finden Sie unter [[Anwendungen für Unicode anpassen|Anwendungen für Unicode anpassen]].&lt;br /&gt;
&lt;br /&gt;
==Neue Warnungen des {{Delphi}}-Compilers==&lt;br /&gt;
&lt;br /&gt;
Dem {{Delphi}}-Compiler wurden neue Warnungen hinzugefügt, die sich auf mögliche Fehler bei der Typumwandlung beziehen (z.B. beim Umwandeln eines &amp;lt;code&amp;gt;UnicodeString&amp;lt;/code&amp;gt;- oder &amp;lt;code&amp;gt;WideString&amp;lt;/code&amp;gt;-Strings in &amp;lt;code&amp;gt;AnsiString&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;AnsiChar&amp;lt;/code&amp;gt;). Wenn Sie eine Anwendung nach Unicode konvertieren, sollten Sie die Warnungen 1057 und 1058 aktivieren, die Sie beim Auffinden von Problembereichen in Ihrem Quelltext unterstützen.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[[W1050 In Set-Ausdruck WideChar auf Byte-Char verringert (Delphi)|W1050: WideChar in Set-Ausdrücken auf ByteChar verkürzt (Delphi)]]&#039;&#039;&#039;. &amp;quot;Set of char&amp;quot; definiert in Win32 eine Menge über den gesamten Bereich des Char-Typs. Da Char in Win32 ein Typ auf Byte-Größe ist, wird dadurch eine Menge mit maximaler Größe und mit 256 Elementen definiert. In .NET ist Char ein Typ auf Word-Größe, dessen Bereich (0..65535) die Kapazität des Mengen-Typs überschreitet.&lt;br /&gt;
* &#039;&#039;&#039;[[W1057 Implizite String-Umwandlung von &#039;%s&#039; zu &#039;%s&#039; (Delphi)|W1057: Implizite String-Umwandlung von &#039;%s&#039; zu &#039;%s&#039; (IMPLICIT_STRING_CAST)]]&#039;&#039;&#039; Wird ausgegeben, wenn der Compiler einen Fall findet, bei dem ein &amp;lt;code&amp;gt;AnsiString&amp;lt;/code&amp;gt; (oder ein &amp;lt;code&amp;gt;AnsiChar&amp;lt;/code&amp;gt;) in eine Form von Unicode (einen &amp;lt;code&amp;gt;UnicodeString&amp;lt;/code&amp;gt; oder einen &amp;lt;code&amp;gt;WideString&amp;lt;/code&amp;gt;) implizit konvertiert werden muss. (HINWEIS: Diese Warnung ist eventuell per Vorgabe aktiviert).&lt;br /&gt;
* &#039;&#039;&#039;[[W1058 Implizite String-Umwandlung mit potenziellem Datenverlust von &#039;%s&#039; zu &#039;%s&#039; (Delphi)|W1058: Implizite String-Umwandlung mit potenziellem Datenverlust von &#039;%s&#039; zu &#039;%s&#039; (IMPLICIT_STRING_CAST_LOSS)]]&#039;&#039;&#039; Wird ausgegeben, wenn der Compiler einen Fall findet, bei dem eine Form von Unicode (ein &amp;lt;code&amp;gt;UnicodeString&amp;lt;/code&amp;gt; oder ein &amp;lt;code&amp;gt;WideString&amp;lt;/code&amp;gt;) in einen &amp;lt;code&amp;gt;AnsiString&amp;lt;/code&amp;gt; (oder ein &amp;lt;code&amp;gt;AnsiChar&amp;lt;/code&amp;gt;) implizit konvertiert werden muss. Dies ist eine potenziell verlustreiche Umwandlung, weil es Zeichen in dem String geben kann, die auf der Codeseite, in die der String umgewandelt wird, nicht repräsentiert werden können. (HINWEIS: Diese Warnung ist eventuell per Vorgabe aktiviert).&lt;br /&gt;
* &#039;&#039;&#039;[[W1059 Explizite String-Umwandlung von &#039;%s&#039; zu &#039;%s&#039; (Delphi)|W1059: Explizite String-Umwandlung von &#039;%s&#039; zu &#039;%s&#039; (EXPLICIT_STRING_CAST)]]&#039;&#039;&#039; Wird ausgegeben, wenn der Compiler auf einen Fall trifft, bei dem der Programmierer explizit einen &amp;lt;code&amp;gt;AnsiString&amp;lt;/code&amp;gt; (oder ein &amp;lt;code&amp;gt;AnsiChar&amp;lt;/code&amp;gt;) in eine Form von Unicode (&amp;lt;code&amp;gt;UnicodeString&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;WideString&amp;lt;/code&amp;gt;) umwandelt. (HINWEIS: Diese Warnung ist standardmäßig deaktiviert und sollte nur zum Auffinden eventueller Probleme verwendet werden.)&lt;br /&gt;
* &#039;&#039;&#039;[[W1060 Explizite String-Umwandlung mit potenziellem Datenverlust von &#039;%s&#039; zu &#039;%s&#039; (Delphi)|W1060: Explizite String-Umwandlung mit potenziellem Datenverlust von &#039;%s&#039; zu &#039;%s&#039; (EXPLICIT_STRING_CAST_LOSS)]]&#039;&#039;&#039; Wird ausgegeben, wenn der Compiler einen Fall findet, bei dem der Programmierer explizit eine Form von Unicode (&amp;lt;code&amp;gt;UnicodeString&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;WideString&amp;lt;/code&amp;gt;) in einen &amp;lt;code&amp;gt;AnsiString&amp;lt;/code&amp;gt; (oder ein &amp;lt;code&amp;gt;AnsiChar&amp;lt;/code&amp;gt;) konvertiert. Dies ist eine potenziell verlustreiche Umwandlung, weil es Zeichen in dem String geben kann, die auf der Codeseite, in die der String umgewandelt wird, nicht repräsentiert werden können. (HINWEIS: Diese Warnung ist standardmäßig deaktiviert und sollte nur zum Auffinden eventueller Probleme verwendet werden.)&lt;br /&gt;
&lt;br /&gt;
==Empfehlungen==&lt;br /&gt;
&lt;br /&gt;
* Belassen Sie die Quelltextdaten im UTF-8-Format:&lt;br /&gt;
** Dateien können im ANSI-Format bleiben, wenn der Quelltext mit der korrekten Codeseite compiliert wird. Wählen Sie ({{Menu|Projekt &amp;amp;gt; Optionen &amp;amp;gt; C++-Compiler &amp;amp;gt; [[C++-Compiler Erweitert|Erweitert]]}} und verwenden Sie die Option &amp;quot;Codeseite&amp;quot; unter &#039;&#039;&#039;Weitere Optionen&#039;&#039;&#039;, um die korrekte Codeseite festzulegen.&lt;br /&gt;
** Schreiben Sie in die Quelltextdatei ein UTF-8 BOM. Stellen Sie sicher, dass Ihr Versionsverwaltungssystem diese Dateien unterstützt.&lt;br /&gt;
* Führen Sie in der IDE ein Refactoring durch, wenn der Quelltext &amp;lt;code&amp;gt;AnsiString&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;AnsiChar&amp;lt;/code&amp;gt; sein muss (der Quelltext ist weiterhin portierbar).&lt;br /&gt;
* Statische Überprüfung des Quelltextes:&lt;br /&gt;
** Gibt der Quelltext Daten nur weiter?&lt;br /&gt;
** Führt der Quelltext eine einfache Zeichenindizierung durch?&lt;br /&gt;
* Beachten Sie alle Warnungen (es könnten Fehler daraus werden):&lt;br /&gt;
** Verdächtige Zeigerumwandlungen.&lt;br /&gt;
** Implizite/explizite Umwandlungen.&lt;br /&gt;
* Bestimmen Sie den Zweck des Quelltextes.&lt;br /&gt;
** Verwendet der Quelltext einen String (&amp;lt;code&amp;gt;AnsiString&amp;lt;/code&amp;gt;) als ein dynamisches Byte-Array? Wenn ja, dann setzen Sie stattdessen den portierbaren Typ &amp;lt;code&amp;gt;TBytes&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;Byte&amp;lt;/code&amp;gt;-Array) ein.&lt;br /&gt;
** Wird mit einer &amp;lt;code&amp;gt;PChar&amp;lt;/code&amp;gt;-Umwandlung die Zeigerarithmetik aktiviert? Wenn ja, wandeln Sie stattdessen in &amp;lt;code&amp;gt;PByte&amp;lt;/code&amp;gt; um, und aktivieren Sie &amp;lt;code&amp;gt;$POINTERMATH ON&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
&lt;br /&gt;
* [[UTF-8-Konvertierungsroutinen|UTF-8-Konvertierungsroutinen]]&lt;br /&gt;
* [http://www.embarcadero.com/images/dm/technical-papers/delphi-unicode-migration.pdf {{Delphi}} Unicode Migration for Mere Mortals: Stories and Advice from the Front Lines von Cary Jensen (EN)]&lt;br /&gt;
* [http://edn.embarcadero.com/article/38437 {{Delphi}} in a Unicode World Part I: What is Unicode, Why do you need it, and How do you work with it in {{Delphi}}? (EN)]&lt;br /&gt;
* [http://edn.embarcadero.com/article/38498 {{Delphi}} in a Unicode World Part II: New RTL Features and Classes to Support Unicode (EN)]&lt;br /&gt;
* [http://www.embarcadero.com/rad-studio-2010-migration-center {{Product}} 2010 Migration Center (EN)]&lt;br /&gt;
* [[Anwendungen für Unicode anpassen|Anwendungen für Unicode anpassen]]&lt;br /&gt;
* [[C++-Anwendungen für Unicode anpassen|C++-Anwendungen für Unicode anpassen]]&lt;br /&gt;
* [[TCHAR-Zuordnung|_TCHAR-Zuordnung (C++)]]&lt;br /&gt;
* [[Verwendung von Unicode in der Befehlskonsole|Verwendung von Unicode in der Befehlskonsole]] {{f|vcl|&lt;br /&gt;
* [[Verwendung von TEncoding für Unicode-Dateien|Verwendung von TEncoding für Unicode-Dateien]] }}&lt;br /&gt;
* [[Behandlung der AnsiString-Codeseitenspezifikation in C++|Behandlung der AnsiString-Codeseitenspezifikation in C++]]&lt;br /&gt;
* [[lib_de:System.UnicodeString|System.UnicodeString]]&lt;br /&gt;
* [[lib_de:System.AnsiString|System.AnsiString]][[Category:Mit RAD Studio arbeiten]]&lt;br /&gt;
[[Category:AMMigrate]]&lt;br /&gt;
&lt;br /&gt;
[[en:Unicode in RAD Studio]]&lt;br /&gt;
[[fr:Unicode dans RAD Studio]]&lt;br /&gt;
[[ja:RAD Studio における Unicode]]&lt;/div&gt;</summary>
		<author><name>Nicolas.rios</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Unicode_in_RAD_Studio&amp;diff=218571</id>
		<title>Unicode in RAD Studio</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Unicode_in_RAD_Studio&amp;diff=218571"/>
		<updated>2023-10-12T19:13:05Z</updated>

		<summary type="html">&lt;p&gt;Nicolas.rios: RS-119900&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
{{Parent|Einführung in RAD Studio}}&lt;br /&gt;
&lt;br /&gt;
In {{Product}} werden Unicode-basierte Strings verwendet: der Typ &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; ist nun ein Unicode-String ([[lib_de:System.UnicodeString|System.UnicodeString]]) anstatt eines ANSI-Strings. Dieses Thema beschreibt die korrekte Behandlung von Strings.&lt;br /&gt;
&lt;br /&gt;
Mit den Typen [[lib_de:System.AnsiStringT|AnsiString]] und [[lib_de:System.WideString|WideString]] werden ANSI- bzw. Wide-Strings verwendet.&lt;br /&gt;
&lt;br /&gt;
{{Product}} ist vollständig Unicode-kompatibel, und für diejenigen Teile Ihres Quelltextes, die die String-Behandlung betreffen, sind einige Änderungen möglicherweise erforderlich. Es wurde aber versucht, diese Änderungen auf ein Minimum zu beschränken. Es wurden zwar neue Datentypen eingeführt, aber vorhandene Datentypen wurden beibehalten und arbeiten genauso wie bisher. Ausgehend von dem mit der Unicode-Konvertierung im eigenen Haus gemachten Erfahrungen, sollten vorhandene Anwendungen ziemlich reibungslos migriert werden können.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weitere Ressourcen:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* [https://www.embarcadero.com/images/dm/technical-papers/delphi-unicode-migration.pdf {{Delphi}} Unicode Migration for Mere Mortals: Stories and Advice from the Front Lines von Cary Jensen (EN)]&lt;br /&gt;
* [https://www.embarcadero.com/rad-in-action/migration-upgrade-center#unicode Unicode Migration Resources for Delphi, C++Builder and RAD Studio (EN)]&lt;br /&gt;
&lt;br /&gt;
==Vorhandene String-Typen==&lt;br /&gt;
&lt;br /&gt;
Die bereits vorhandenen Datentypen &amp;lt;code&amp;gt;[[lib_de:System.AnsiStringT|AnsiString]]&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;[[lib_de:System.WideString|System.WideString]]&amp;lt;/code&amp;gt; arbeiten genauso wie bisher.&lt;br /&gt;
&lt;br /&gt;
Bei kurzen Strings gibt es hinsichtlich der Funktionalität ebenfalls keine Änderungen. Beachten Sie bitte, dass kurze Strings auf 255 Zeichen beschränkt sind und nur einen Zeichenzähler und Einzelbyte-Zeichendaten enthalten. Sie umfassen keine Codeseiteninformationen. Ein kurzer String kann in Ausnahmenfällen UTF-8-Daten für eine bestimmte Anwendung enthalten.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;AnsiString&amp;lt;/code&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;string&#039;&#039;&#039; war früher ein Alias für [[lib_de:System.AnsiString|AnsiString]]. Die folgende Tabelle zeigt die Position der Felder im früheren Format von &amp;lt;code&amp;gt;AnsiString&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Früheres Format des Datentyps &amp;lt;code&amp;gt;AnsiString&amp;lt;/code&amp;gt;: &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; frame=&amp;quot;hsides&amp;quot; rules=&amp;quot;rows&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;Referenzzähler &#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Länge &#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;String-Daten (auf Byte-Größe) &#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039; Nullterminiert&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
 -8&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
 -4&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
 0&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
 Length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In {{Product}} wurde das Format von [[lib_de:System.AnsiString|AnsiString]] geändert. Zwei neue Felder (&amp;lt;code&amp;gt;CodePage&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;ElemSize&amp;lt;/code&amp;gt;) wurden hinzugefügt. Dadurch ist das Format von [[lib_de:System.AnsiString|AnsiString]] identisch mit dem neuen Typ [[lib_de:System.UnicodeString|UnicodeString]]. (Weitere Informationen zum neuen Format finden Sie unter [[Interne Datenformate (Delphi)#Lange String-Typen|Lange String-Typen]].)&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;WideString&amp;lt;/code&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[[lib_de:System.WideString|System.WideString]]&amp;lt;/code&amp;gt; wurde früher für Unicode-Zeichendaten verwendet. Das Format von &amp;lt;code&amp;gt;WideString&amp;lt;/code&amp;gt; entspricht im Wesentlichen dem von Windows &amp;lt;code&amp;gt;BSTR&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;WideString&amp;lt;/code&amp;gt; sollte weiterhin in COM-Anwendungen verwendet werden.&lt;br /&gt;
&lt;br /&gt;
==Neuer String-Typ: UnicodeString==&lt;br /&gt;
&lt;br /&gt;
Der &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt;-Typ in {{Product}} ist der Typ &amp;lt;code&amp;gt;[[lib_de:System.UnicodeString|UnicodeString]]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In {{Delphi}} sind &amp;lt;code&amp;gt;Char&amp;lt;/code&amp;gt;- und &amp;lt;code&amp;gt;PChar&amp;lt;/code&amp;gt;-Typen jetzt &amp;lt;code&amp;gt;WideChar&amp;lt;/code&amp;gt;- bzw. &amp;lt;code&amp;gt;PWideChar&amp;lt;/code&amp;gt;-Typen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Hinweis: &#039;&#039;&#039;Dies ist ein Unterschied zu Versionen vor 2009. In früheren Versionen war &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; ein Alias für &amp;lt;code&amp;gt;AnsiString&amp;lt;/code&amp;gt;, und die Typen &amp;lt;code&amp;gt;Char&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;PChar&amp;lt;/code&amp;gt; waren &amp;lt;code&amp;gt;AnsiChar&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;PAnsiChar&amp;lt;/code&amp;gt;.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In C++ steuert die Option &#039;&#039;&#039;[[C++ (Gemeinsame Optionen)|_TCHAR entspricht]]&#039;&#039;&#039; die Definition von &amp;lt;code&amp;gt;_TCHAR&amp;lt;/code&amp;gt;, das entweder &amp;lt;code&amp;gt;wchar_t&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;char&amp;lt;/code&amp;gt; sein kann.&lt;br /&gt;
&lt;br /&gt;
[[Frameworks und Bibliotheken|{{Product}} Frameworks und Bibliotheken]] verwenden jetzt den Typ &amp;lt;code&amp;gt;UnicodeString&amp;lt;/code&amp;gt; und repräsentiert String-Werte nicht mehr als Einzelbyte- oder MBCS-Strings.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format des Datentyps &amp;lt;code&amp;gt;UnicodeString&amp;lt;/code&amp;gt;: &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; frame=&amp;quot;hsides&amp;quot; rules=&amp;quot;rows&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;Codeseite&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Elementgröße&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Referenzzähler &#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Länge &#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;String-Daten (auf Elementgröße) &#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039; Nullterminiert&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
 -12&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
 -10&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
 -8&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
 -4&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
 0&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
 Length * elementsize&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;UnicodeString&amp;lt;/code&amp;gt; kann als die folgende {{Delphi}}-Struktur dargestellt werden:&lt;br /&gt;
&lt;br /&gt;
 type StrRec = record&lt;br /&gt;
       CodePage: Word;&lt;br /&gt;
       ElemSize: Word;&lt;br /&gt;
       refCount: Integer;&lt;br /&gt;
       Len: Integer;&lt;br /&gt;
       case Integer of&lt;br /&gt;
           1: array[0..0] of AnsiChar;&lt;br /&gt;
           2: array[0..0] of WideChar;&lt;br /&gt;
 end;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;UnicodeString&amp;lt;/code&amp;gt; fügt die Felder für die Codeseite &amp;lt;code&amp;gt;CodePage&amp;lt;/code&amp;gt; und die Elementgröße &amp;lt;code&amp;gt;ElemSize&amp;lt;/code&amp;gt; hinzu, die den Inhalt des Strings beschreiben. &amp;lt;code&amp;gt;UnicodeString&amp;lt;/code&amp;gt; ist zu allen anderen String-Typen zuweisungskompatibel. Zuweisungen zwischen &amp;lt;code&amp;gt;AnsiString&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;UnicodeString&amp;lt;/code&amp;gt; führen aber weiterhin die entsprechenden Auf- oder Abkonvertierungen durch. Bitte beachten Sie, dass eine Zuweisung eines &amp;lt;code&amp;gt;UnicodeString&amp;lt;/code&amp;gt;-Typs zu einem &amp;lt;code&amp;gt;AnsiString&amp;lt;/code&amp;gt;-Typ nicht empfohlen wird und zu Datenverlusten führen kann.&lt;br /&gt;
&lt;br /&gt;
Beachten Sie, dass &amp;lt;code&amp;gt;AnsiString&amp;lt;/code&amp;gt; ebenfalls über die Felder &amp;lt;code&amp;gt;CodePage&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;ElemSize&amp;lt;/code&amp;gt; verfügt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;UnicodeString&amp;lt;/code&amp;gt;-Daten sind aus folgenden Gründen in UTF-16 codiert:&lt;br /&gt;
&lt;br /&gt;
* UTF-16 entspricht dem zugrunde liegenden Format des Betriebssystems.&lt;br /&gt;
* UTF-16 reduziert zusätzliche explizite/implizite Konvertierungen.&lt;br /&gt;
* Es bietet bei Aufrufen der Windows-API eine bessere Performanz.&lt;br /&gt;
* Es müssen keine Betriebssystem Konvertierungen mit UTF-16 durchgeführt werden.&lt;br /&gt;
* Der Basic Multilingual Plane (BMP) enthält bereits die Schriftzeichen fast aller aktiven Sprachen der Welt und passt in ein einzelnes UTF-16 &amp;lt;code&amp;gt;Char&amp;lt;/code&amp;gt; (16 Bits).&lt;br /&gt;
* Unicode-Surrogatpaare entsprechen dem Multibyte-Zeichensatz (MBCS), sind aber berechenbarer und Standard.&lt;br /&gt;
* &amp;lt;code&amp;gt;UnicodeString&amp;lt;/code&amp;gt; kann für das Marshalling von COM-Interfaces verlustlose implizite Konvertierungen in und aus &amp;lt;code&amp;gt;WideString&amp;lt;/code&amp;gt; bereitstellen.&lt;br /&gt;
&lt;br /&gt;
Zeichen in UTF-16 können 2 oder 4 Byte groß sein, daher ist die Anzahl der Elemente in einem String nicht notwendigerweise gleich der Anzahl der Zeichen. Wenn der String nur aus BMP-Zeichen besteht, ist die Anzahl der Zeichen und der Elemente identisch.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;UnicodeString&amp;lt;/code&amp;gt; bietet die folgenden Vorteile:&lt;br /&gt;
&lt;br /&gt;
* UnicodeString verfügt über einen Referenzzähler.&lt;br /&gt;
* UnicodeString löst ein Problem von Altanwendungen in {{CBuilder}}.&lt;br /&gt;
* Durch die Aufnahme von Codierungsinformationen (Codeseite) in &amp;lt;code&amp;gt;AnsiString&amp;lt;/code&amp;gt; wird das Risiko eines möglichen Datenverlustes bei impliziten Typumwandlungen reduziert.&lt;br /&gt;
* Der Compiler stellt sicher, dass die Daten korrekt sind, bevor die Daten verändert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;WideString&amp;lt;/code&amp;gt; verfügt über keinen Referenzzähler, deshalb ist &amp;lt;code&amp;gt;UnicodeString&amp;lt;/code&amp;gt; für die meisten Anwendungstypen flexibler und effizienter (&amp;lt;code&amp;gt;WideString&amp;lt;/code&amp;gt; eignet sich eher für COM).&lt;br /&gt;
&lt;br /&gt;
===Indizierung===&lt;br /&gt;
&lt;br /&gt;
Instanzen von &amp;lt;code&amp;gt;UnicodeString&amp;lt;/code&amp;gt; können Zeichen indizieren. Die Indizierung ist 1-basiert, genau wie bei &amp;lt;code&amp;gt;AnsiString&amp;lt;/code&amp;gt;. Sehen Sie sich den folgenden Quelltext an:&lt;br /&gt;
&lt;br /&gt;
 var C: Char;&lt;br /&gt;
     S: string;&lt;br /&gt;
     begin&lt;br /&gt;
         ...&lt;br /&gt;
         C := S[1];&lt;br /&gt;
         ...&lt;br /&gt;
     end;&lt;br /&gt;
&lt;br /&gt;
In einem Fall, wie dem oben dargestellten, muss der Compiler sicher stellen, dass die Daten in &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; in einem geeigneten Format vorliegen. Der Compiler erzeugt entsprechenden Code, damit Zuweisungen zu String-Elementen den richtigen Typ haben und die Instanz eindeutig ist (d.h., dass sie einen Referenzzähler von 1 hat). Dies geschieht über einen Aufruf der Funktion &amp;lt;code&amp;gt;UniqueString&amp;lt;/code&amp;gt;. Für den obigen Quelltext muss der Compiler, weil der String Unicode-Daten enthalten könnte, vor der Indizierung im Zeichen-Array auch die passende &amp;lt;code&amp;gt;UniqueString&amp;lt;/code&amp;gt;-Funktion aufrufen.&lt;br /&gt;
{{f|vcl|&lt;br /&gt;
&lt;br /&gt;
==={{CBuilder}}===&lt;br /&gt;
&lt;br /&gt;
Die Klasse &amp;lt;code&amp;gt;UnicodeString&amp;lt;/code&amp;gt; in {{CBuilder}} ermöglicht eine {{Delphi}}-ähnliche automatische Konvertierungssemantik. Bei vorhandenen VCL-Ereignisbehandlungsroutinen, die &amp;lt;code&amp;gt;AnsiString&amp;lt;/code&amp;gt;-Parameter erwarten, ist dies ziemlich transparent, weil Konvertierungen bei Bedarf ausgeführt werden. So können Anwender allmählich, nach ihrem eigenen Zeitplan, zu vollständigem Unicode migrieren.&lt;br /&gt;
&lt;br /&gt;
In manchen Situationen führt diese automatische Konvertierung aber zu unerwünschten Ergebnissen. Der VCL-String-Typ ist jetzt &amp;lt;code&amp;gt;UnicodeString&amp;lt;/code&amp;gt; und nicht mehr &amp;lt;code&amp;gt;AnsiString&amp;lt;/code&amp;gt;. Aus Gründen der Abwärtskompatibilität gibt die Methode &amp;lt;code&amp;gt;UnicodeString::t_str()&amp;lt;/code&amp;gt; &#039;const char* anstelle von &amp;lt;code&amp;gt;const wchar_t*&amp;lt;/code&amp;gt; zurück, indem die Größe der Wide-Daten der &amp;lt;code&amp;gt;UnicodeString&amp;lt;/code&amp;gt;-Instanz reduziert wird. Dies kann zu unerwartetem Verhalten führen, weil der Quellcode einen Aufruf von &amp;lt;code&amp;gt;t_str()&amp;lt;/code&amp;gt; nicht akzeptieren könnte, da die zugrunde liegenden Daten fehlerhaft werden könnten. Dieses Verhalten wird in Quellcode deutlich, der die zugrunde liegenden Daten in der Benutzeroberfläche, wie z.B. in &amp;lt;code&amp;gt;TListItem&amp;lt;/code&amp;gt;, anzeigt.&lt;br /&gt;
&lt;br /&gt;
In dem folgenden Beispiel sind die nach dem Aufruf von &amp;lt;code&amp;gt;t_str()&amp;lt;/code&amp;gt; in der letzten Zeile der Methode in &amp;lt;code&amp;gt;TListView&amp;lt;/code&amp;gt; angezeigten Daten fehlerhaft:&lt;br /&gt;
&lt;br /&gt;
 void ProcessSelectedItem(const char* item);&lt;br /&gt;
 &lt;br /&gt;
 void __fastcall TForm6::ListView1DblClick(TObject *Sender)&lt;br /&gt;
 {&lt;br /&gt;
     int index = ListView1-&amp;amp;gt;Selected-&amp;amp;gt;Index;&lt;br /&gt;
     TListItem *ClassItem = ListView1-&amp;amp;gt;Items-&amp;amp;gt;Item[index];&lt;br /&gt;
     ProcessSelectedItem(ClassItem-&amp;amp;gt;Caption.t_str());&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Compilerbedingungen==&lt;br /&gt;
&lt;br /&gt;
In {{Delphi}} als auch in {{CBuilder}} können Sie Bedingungen setzen, um im selben Quelltext Unicode- und Nicht-Unicode-Code zuzulassen.&lt;br /&gt;
&lt;br /&gt;
==={{Delphi}}===&lt;br /&gt;
&lt;br /&gt;
 {$IFDEF UNICODE}&lt;br /&gt;
&lt;br /&gt;
==={{CBuilder}}===&lt;br /&gt;
&lt;br /&gt;
 #ifdef _DELPHI_STRING_UNICODE &lt;br /&gt;
&lt;br /&gt;
==Überblick über die Änderungen==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; wird nun &amp;lt;code&amp;gt;UnicodeString&amp;lt;/code&amp;gt; und nicht &amp;lt;code&amp;gt;AnsiString&amp;lt;/code&amp;gt; zugeordnet.&lt;br /&gt;
* &amp;lt;code&amp;gt;Char&amp;lt;/code&amp;gt; wird nun &amp;lt;code&amp;gt;WideChar&amp;lt;/code&amp;gt; (2 Byte, nicht 1 Byte) zugeordnet und ist ein UTF-16-Zeichen.&lt;br /&gt;
* &amp;lt;code&amp;gt;PChar&amp;lt;/code&amp;gt; wird nun &amp;lt;code&amp;gt;PWideChar&amp;lt;/code&amp;gt; zugeordnet.&lt;br /&gt;
* In C++ wird &amp;lt;code&amp;gt;System::String&amp;lt;/code&amp;gt; nun der Klasse &amp;lt;code&amp;gt;UnicodeString&amp;lt;/code&amp;gt; zugeordnet.&lt;br /&gt;
&lt;br /&gt;
==Überblick über Unverändertes==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;AnsiString&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;WideString&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;AnsiChar&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PAnsiChar&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;WideChar&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PWideChar&amp;lt;/code&amp;gt;&lt;br /&gt;
* Implizite Konvertierungen funktionieren weiterhin.&lt;br /&gt;
* &amp;lt;code&amp;gt;AnsiString&amp;lt;/code&amp;gt; verwendet die aktive Codeseite des Benutzers.&lt;br /&gt;
&lt;br /&gt;
==Von der Zeichengröße unabhängige Quelltextkonstrukte==&lt;br /&gt;
&lt;br /&gt;
Die folgenden Operationen sind von der Zeichengröße unabhängig:&lt;br /&gt;
&lt;br /&gt;
* String-Verkettung:&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;amp;lt;string var&amp;amp;gt; + &amp;amp;lt;string var&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;amp;lt;string var&amp;amp;gt; + &amp;amp;lt;literal&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;amp;lt;literal&amp;amp;gt; + &amp;amp;lt;literal&amp;amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;Concat(&amp;amp;lt;string&amp;amp;gt; , &amp;amp;lt;string&amp;amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Standard-String-Funktionen:&lt;br /&gt;
** &amp;lt;code&amp;gt;Length(&amp;amp;lt;string&amp;amp;gt;)&amp;lt;/code&amp;gt; gibt die Anzahl der char-Elemente zurück. Diese Anzahl muss nicht unbedingt gleich der Anzahl der Byte sein. Beachten Sie bitte, dass die Funktion &amp;lt;code&amp;gt;SizeOf&amp;lt;/code&amp;gt; die Anzahl der Byte zurückgibt, was bedeutet, dass sich der Rückgabewert für &amp;lt;code&amp;gt;SizeOf&amp;lt;/code&amp;gt; von &amp;lt;code&amp;gt;Length&amp;lt;/code&amp;gt; unterscheiden kann.&lt;br /&gt;
** &amp;lt;code&amp;gt;Copy(&amp;amp;lt;String&amp;amp;gt;, &amp;amp;lt;Start&amp;amp;gt;, &amp;amp;lt;Länge&amp;amp;gt;)&amp;lt;/code&amp;gt; gibt einen Teilstring in &amp;lt;code&amp;gt;Char&amp;lt;/code&amp;gt;-Elementen zurück.&lt;br /&gt;
** &amp;lt;code&amp;gt;Pos(&amp;amp;lt;Teilstring&amp;amp;gt;, &amp;amp;lt;String&amp;amp;gt;)&amp;lt;/code&amp;gt; gibt den Index des ersten &amp;lt;code&amp;gt;Char&amp;lt;/code&amp;gt;-Elements zurück.&lt;br /&gt;
&lt;br /&gt;
* Operatoren:&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;amp;lt;String&amp;amp;gt; &amp;amp;lt;Vergleichsoperator&amp;amp;gt; &amp;amp;lt;String&amp;amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;CompareStr() &amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;CompareText() &amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt; ... &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;code&amp;gt;FillChar(&amp;amp;lt;Struktur oder Arbeitsspeicher&amp;amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;FillChar(Rect, SizeOf(Rect), #0)&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;FillChar(WndClassEx, SizeOf(TWndClassEx), #0)&amp;lt;/code&amp;gt;.  Bitte beachten: &amp;lt;code&amp;gt;WndClassEx.cbSize&amp;amp;nbsp;:= SizeOf(TWndClassEx);&amp;lt;/code&amp;gt;&lt;br /&gt;
* Windows-API&lt;br /&gt;
** Bei API-Aufrufen werden standardmäßig deren &amp;lt;code&amp;gt;WideString&amp;lt;/code&amp;gt;-(“W”)-Versionen verwendet.&lt;br /&gt;
** Die &amp;lt;code&amp;gt;PChar(&amp;amp;lt;String&amp;amp;gt;)&amp;lt;/code&amp;gt;-Typumwandlung hat eine identische Semantik.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel für &amp;lt;code&amp;gt;GetModuleFileName&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 function ModuleFileName(Handle: HMODULE): string;&lt;br /&gt;
     var Buffer: array[0..MAX_PATH] of Char;&lt;br /&gt;
         begin&lt;br /&gt;
             SetString(Result, Buffer, &lt;br /&gt;
                       GetModuleFileName(Handle, Buffer, Length(Buffer)));&lt;br /&gt;
         end;&lt;br /&gt;
&lt;br /&gt;
Beispiel für &amp;lt;code&amp;gt;GetWindowText&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 function WindowCaption(Handle: HWND): string;&lt;br /&gt;
       begin&lt;br /&gt;
           SetLength(Result, 1024);&lt;br /&gt;
           SetLength(Result, &lt;br /&gt;
                     GetWindowText(Handle, PChar(Result), Length(Result)));&lt;br /&gt;
       end;&lt;br /&gt;
&lt;br /&gt;
Beispiel für die Zeichenindizierung von Strings:&lt;br /&gt;
&lt;br /&gt;
 function StripHotKeys(const S: string): string;&lt;br /&gt;
     var I, J: Integer;&lt;br /&gt;
     LastChar: Char;&lt;br /&gt;
     begin&lt;br /&gt;
         SetLength(Result, Length(S));&lt;br /&gt;
         J := 0;&lt;br /&gt;
         LastChar := #0;&lt;br /&gt;
         for I := 1 to Length(S) do&lt;br /&gt;
         begin&lt;br /&gt;
           if (S[I] &amp;amp;lt;&amp;amp;gt; &#039;&amp;amp;amp;&#039;) or (LastChar = &#039;&amp;amp;amp;&#039;) then&lt;br /&gt;
           begin&lt;br /&gt;
               Inc(J);&lt;br /&gt;
               Result[J] := S[I];&lt;br /&gt;
           end;&lt;br /&gt;
           LastChar := S[I];&lt;br /&gt;
     end;&lt;br /&gt;
     SetLength(Result, J);&lt;br /&gt;
 end;&lt;br /&gt;
&lt;br /&gt;
==Von der Zeichengröße abhängige Quelltextkonstrukte==&lt;br /&gt;
&lt;br /&gt;
Einige Operationen sind von der Zeichengröße abhängig. Die Funktionen und Features in der folgenden Liste enthalten - sofern möglich - auch eine “portierbare” Version. Sie können Ihren Quelltext auch in der portierbaren Version neu schreiben, er funktioniert sowohl mit &amp;lt;code&amp;gt;AnsiString&amp;lt;/code&amp;gt;- als auch mit &amp;lt;code&amp;gt;UnicodeString&amp;lt;/code&amp;gt;-Variablen.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;SizeOf(&amp;amp;lt;Char-Array&amp;amp;gt;)&amp;lt;/code&amp;gt; - portierbare Version: &amp;lt;code&amp;gt;Length(&amp;amp;lt;Char-Array&amp;amp;gt;)&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;Move(&amp;amp;lt;Char-Puffer&amp;amp;gt;... CharCount)&amp;lt;/code&amp;gt; - portierbare Version: &amp;lt;code&amp;gt;Move(&amp;amp;lt;Char-Puffer&amp;amp;gt; ... CharCount * SizeOf(Char))&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Stream Read/Write - portierbare Version: &amp;lt;code&amp;gt;AnsiString&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SizeOf(Char)&amp;lt;/code&amp;gt; oder die Klasse &amp;lt;code&amp;gt;TEncoding&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;FillChar(&amp;amp;lt;Char-Array&amp;amp;gt;, &amp;amp;lt;Größe&amp;amp;gt;, &amp;amp;lt;AnsiChar&amp;amp;gt;)&amp;lt;/code&amp;gt; - verwenden Sie zum Auffüllen mit &amp;lt;code&amp;gt;#0&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;*SizeOf(Char)&amp;lt;/code&amp;gt; oder die portierbare &amp;lt;code&amp;gt;StringOfChar&amp;lt;/code&amp;gt;-Funktion.&lt;br /&gt;
* &amp;lt;code&amp;gt;GetProcAddress(&amp;amp;lt;Modul&amp;amp;gt;, &amp;amp;lt;PAnsiChar&amp;amp;gt;)&amp;lt;/code&amp;gt; - verwenden Sie die überladene Funktion, die ein &amp;lt;code&amp;gt;PWideChar&amp;lt;/code&amp;gt; übernimmt.&lt;br /&gt;
* Typumwandlung oder die Verwendung von &amp;lt;code&amp;gt;PChar&amp;lt;/code&amp;gt; für die Zeigerarithmetik - fügen Sie am Beginn der Datei &amp;lt;code&amp;gt;{IFDEF PByte = PChar}&amp;lt;/code&amp;gt; ein, wenn Sie &amp;lt;code&amp;gt;PChar&amp;lt;/code&amp;gt; für die Zeigerarithmetik verwenden. Oder verwenden Sie die {{Delphi}}-Compiler-Direktive &amp;lt;code&amp;gt;{POINTERMATH &amp;amp;lt;ON|OFF&amp;amp;gt;}&amp;lt;/code&amp;gt;, um die Zeigerarithmetik für alle typisierten Zeiger zu aktivieren, damit das Inkrementieren/Dekrementieren nach Elementgröße ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
==Set of Char-Konstrukte==&lt;br /&gt;
&lt;br /&gt;
Sie müssen diese Konstrukte wahrscheinlich ändern.&lt;br /&gt;
&lt;br /&gt;
* &amp;amp;lt;Char&amp;amp;gt; in &amp;amp;lt;set of &amp;lt;code&amp;gt;AnsiChar&amp;lt;/code&amp;gt;&amp;amp;gt; - Codeerzeugung ist korrekt (&amp;lt;code&amp;gt;&amp;amp;gt;#255&amp;lt;/code&amp;gt;-Zeichen sind nie in der Menge enthalten). Der Compiler gibt die Warnung &amp;lt;code&amp;gt;WideChar in Set-Operationen verkürzt&amp;lt;/code&amp;gt; aus. Abhängig von Ihrem Quelltext können Sie die Warnung gefahrlos deaktivieren. Verwenden Sie als Alternative die Funktion &amp;lt;code&amp;gt;CharinSet&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;amp;lt;Char&amp;amp;gt; in &amp;lt;code&amp;gt;LeadBytes&amp;lt;/code&amp;gt; - die globale Menge &amp;lt;code&amp;gt;LeadBytes&amp;lt;/code&amp;gt; ist für MBCS-ANSI-Gebietseinstellungen vorgesehen. UTF-16 arbeitet weiterhin mit einem &amp;quot;Führungszeichen&amp;quot; (lead char) (&amp;lt;code&amp;gt;#$D800 - #$DBFF&amp;lt;/code&amp;gt; sind hohe Surrogate, &amp;lt;code&amp;gt;#$DC00 - #$DFFF&amp;lt;/code&amp;gt; niedrige Surrogate). Verwenden Sie, um dies zu ändern, die überladene Funktion &amp;lt;code&amp;gt;IsLeadChar&amp;lt;/code&amp;gt;. Die ANSI-Version prüft auf &amp;lt;code&amp;gt;LeadBytes&amp;lt;/code&amp;gt;. Die &amp;lt;code&amp;gt;WideChar&amp;lt;/code&amp;gt;-Version prüft, ob es sich um ein hohes/niedriges Surrogat handelt.&lt;br /&gt;
* Zeichenklassifikation - verwenden Sie die statische Klasse &amp;lt;code&amp;gt;TCharacter&amp;lt;/code&amp;gt;. Die Unit &amp;lt;code&amp;gt;[[lib_de:System.Character|Character]]&amp;lt;/code&amp;gt; enthält Funktionen für die Klassifikation von Zeichen: &amp;lt;code&amp;gt;IsDigit&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IsLetter&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IsLetterOrDigit&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IsSymbol&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IsWhiteSpace&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IsSurrogatePair&amp;lt;/code&amp;gt; usw. Diese Funktionen basieren auf Tabellendaten der Unicode.org.&lt;br /&gt;
&lt;br /&gt;
==Achtung bei diesen Konstrukten==&lt;br /&gt;
&lt;br /&gt;
Sie sollten die folgenden problematischen Codekonstrukte untersuchen:&lt;br /&gt;
&lt;br /&gt;
* Typumwandlungen, die den Typ verbergen:&lt;br /&gt;
** &amp;lt;code&amp;gt;AnsiString(Pointer(foo))&amp;lt;/code&amp;gt;&lt;br /&gt;
** Überprüfen Sie, was beabsichtigt war.&lt;br /&gt;
* Verdächtige Typumwandlungen erzeugen eine Warnung:&lt;br /&gt;
** &amp;lt;code&amp;gt;PChar(&amp;amp;lt;AnsiString var&amp;amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;PAnsiChar(&amp;amp;lt;UnicodeString var&amp;amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
* Direktes Erstellen, Manipulieren oder Zugreifen auf interne Strukturen. Einige dieser Strukturen, wie z.B. &amp;lt;code&amp;gt;AnsiString&amp;lt;/code&amp;gt;, wurden intern verändert, daher sind diese Aktionen unsicher. Verwenden Sie die Funktionen &amp;lt;code&amp;gt;StringRefCount&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;StringCodePage&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;StringElementSize&amp;lt;/code&amp;gt; und andere, um String-Informationen zu ermitteln.&lt;br /&gt;
&lt;br /&gt;
==Laufzeitbibliothek==&lt;br /&gt;
&lt;br /&gt;
* Überladungen. Für Funktionen, die &amp;lt;code&amp;gt;PChar&amp;lt;/code&amp;gt; übernehmen, gibt es jetzt &amp;lt;code&amp;gt;PAnsiChar&amp;lt;/code&amp;gt;- und &amp;lt;code&amp;gt;PWideChar&amp;lt;/code&amp;gt;-Versionen, damit die richtige Funktion aufgerufen wird.&lt;br /&gt;
*&amp;lt;code&amp;gt;AnsiXXX&amp;lt;/code&amp;gt;-Funktionen sind möglich:&lt;br /&gt;
**&amp;lt;code&amp;gt;[[lib_de:System.SysUtils|SysUtils.AnsiXXXX]]&amp;lt;/code&amp;gt;-Funktionen, wie z.B. &amp;lt;code&amp;gt;[[lib_de:System.SysUtils.AnsiCompareStr|AnsiCompareStr]]&amp;lt;/code&amp;gt;:&lt;br /&gt;
*** Werden weiterhin mit &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; deklariert und verwenden &amp;lt;code&amp;gt;[[lib_de:System.UnicodeString|UnicodeString]]&amp;lt;/code&amp;gt;.&lt;br /&gt;
*** Bieten eine bessere Abwärtskompatibilität (Quelltext muss nicht geändert werden).&lt;br /&gt;
** Die &amp;lt;code&amp;gt;AnsiXXXX&amp;lt;/code&amp;gt;-Funktionen der Unit &amp;lt;code&amp;gt;[[lib_de:System.AnsiStrings|AnsiStrings]]&amp;lt;/code&amp;gt; bieten dieselben Möglichkeiten wie die &amp;lt;code&amp;gt;[[lib_de:System.SysUtils|SysUtils.AnsiXXXX]]&amp;lt;/code&amp;gt;-Funktionen, arbeiten aber nur mit &amp;lt;code&amp;gt;AnsiString&amp;lt;/code&amp;gt;. Die &amp;lt;code&amp;gt;AnsiStrings.AnsiXXXX&amp;lt;/code&amp;gt;-Funktionen bieten auch eine bessere Performanz für einen &amp;lt;code&amp;gt;[[lib_de:System.AnsiStringT|AnsiString]]&amp;lt;/code&amp;gt; als die &amp;lt;code&amp;gt;SysUtils.AnsiXXXX&amp;lt;/code&amp;gt;-Funktionen, die sowohl mit &amp;lt;code&amp;gt;[[lib_de:System.AnsiStringT|AnsiString]]&amp;lt;/code&amp;gt; als auch mit &amp;lt;code&amp;gt;[[lib_de:System.UnicodeString|UnicodeString]]&amp;lt;/code&amp;gt; arbeiten, weil keine impliziten Konvertierungen ausgeführt werden.&lt;br /&gt;
*&amp;lt;code&amp;gt;[[lib_de:System.Write|Write]]/[[lib_de:System.Writeln|Writeln]]&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;[[lib_de:System.Read|Read]]/[[lib_de:System.Readln|Readln]]&amp;lt;/code&amp;gt;:&lt;br /&gt;
** Konvertieren weiterhin in/aus ANSI/OEM-Codeseiten.&lt;br /&gt;
** Die Konsole ist meist sowieso ANSI oder OEM.&lt;br /&gt;
** Bieten eine bessere Kompatibilität zu Altanwendungen.&lt;br /&gt;
** TFDD (Gerätetreiber für Textdateien):&lt;br /&gt;
*** &amp;lt;code&amp;gt;[[lib_de:System.TTextRec|TTextRec]]&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;[[lib_de:System.TFileRec|TFileRec]]&amp;lt;/code&amp;gt;.&lt;br /&gt;
*** Dateinamen sind &amp;lt;code&amp;gt;WideChar&amp;lt;/code&amp;gt;, aber wie oben sind die Daten ANSI/OEM.&lt;br /&gt;
** Verwenden Sie &amp;lt;code&amp;gt;[[lib_de:System.SysUtils.TEncoding|TEncoding]]&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;[[lib_de:System.Classes.TStrings|TStrings]]&amp;lt;/code&amp;gt; für die Unicode-Dateieingabe-/ausgabe.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;PByte&amp;lt;/code&amp;gt; - deklariert mit &amp;lt;code&amp;gt;[[Zeigermathematik (Delphi)|$POINTERMATH ON]]&amp;lt;/code&amp;gt;. Dadurch wird die Array-Indizierung und die Zeigermathematik wie bei &amp;lt;code&amp;gt;PAnsiChar&amp;lt;/code&amp;gt; ermöglicht.&lt;br /&gt;
&lt;br /&gt;
* String-Informationsfunktionen:&lt;br /&gt;
** &amp;lt;code&amp;gt;[[lib_de:System.StringElementSize|StringElementSize]]&amp;lt;/code&amp;gt; gibt die aktuelle Datengröße zurück.&lt;br /&gt;
** &amp;lt;code&amp;gt;[[lib_de:System.StringCodePage|StringCodePage]]&amp;lt;/code&amp;gt; gibt die Codeseite von String-Daten zurück.&lt;br /&gt;
** &amp;lt;code&amp;gt;[[lib_de:System.StringRefCount|System.StringRefCount]]&amp;lt;/code&amp;gt; gibt den Referenzzähler zurück.&lt;br /&gt;
&lt;br /&gt;
* Die RTL stellt Hilfsfunktionen bereit, mit denen Anwender explizite Konvertierungen zwischen Codeseiten und Elementgrößenumwandlungen vornehmen können. Wenn Entwickler die Funktion &amp;lt;code&amp;gt;Move&amp;lt;/code&amp;gt; für ein Zeichen-Array verwenden, können sie keine Annahme über die Elementgröße machen. Dieses Problem kann reduziert werden, indem sichergestellt wird, dass alle R-Wert-Referenzen korrekte Aufrufe der RTL erzeugen, um korrekte Elementgrößen zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
==Komponenten und Klassen==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;TStrings&amp;lt;/code&amp;gt;: Speichert &amp;lt;code&amp;gt;UnicodeString&amp;lt;/code&amp;gt; intern (bleibt als &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; deklariert).&lt;br /&gt;
* &amp;lt;code&amp;gt;TWideStrings&amp;lt;/code&amp;gt; (wird eventuell bald nicht mehr unterstützt) ist unverändert. Verwendet &amp;lt;code&amp;gt;WideString&amp;lt;/code&amp;gt; (BSTR) intern.&lt;br /&gt;
*&amp;lt;code&amp;gt;TStringStream&amp;lt;/code&amp;gt;&lt;br /&gt;
** Wurde neu geschrieben – hat per Vorgabe die ANSI-Standardcodierung für interne Speicherung.&lt;br /&gt;
** Die Codierung kann überschrieben werden.&lt;br /&gt;
** Ziehen Sie zum Erstellen eines Strings aus verschiedenen Teilen &amp;lt;code&amp;gt;TStringBuilder&amp;lt;/code&amp;gt; anstelle von &amp;lt;code&amp;gt;TStringStream&amp;lt;/code&amp;gt; in Betracht.&lt;br /&gt;
*&amp;lt;code&amp;gt;[[lib_de:System.SysUtils.TEncoding|TEncoding]]&amp;lt;/code&amp;gt;&lt;br /&gt;
** Verwendet standardmäßig die aktive Codeseite des Anwenders.&lt;br /&gt;
** Unterstützt UTF-8.&lt;br /&gt;
** Unterstützt UTF-16, Big und Little Endian.&lt;br /&gt;
** Unterstützt Byte Order Mark (BOM).&lt;br /&gt;
** Sie können für benutzerspezifische Codierungen abgeleitete Klassen erstellen.&lt;br /&gt;
&lt;br /&gt;
* Komponenten-Streaming (Text-DFM-Dateien):&lt;br /&gt;
** Sind vollständig abwärtskompatibel.&lt;br /&gt;
** Verwenden für das Streaming nur UTF-8, wenn der Komponententyp, die Eigenschaft oder der Name keine ASCII-7-Zeichen enthält.&lt;br /&gt;
** String-Eigenschaftswerte werden weiterhin mit dem “#”-Escaped-Format in den Stream gestellt.&lt;br /&gt;
** Lassen auch Werte als UTF-8 zu (noch nicht geklärtes Problem).&lt;br /&gt;
** Nur die Änderung im Binärformat ist für UTF-8-Daten für Komponentennamen, Eigenschaften und Typnamen möglich.&lt;br /&gt;
&lt;br /&gt;
==Byte Order Mark==&lt;br /&gt;
&lt;br /&gt;
Das Byte Order Mark (BOM) sollte zur Angabe der Codierung Dateien hinzugefügt werden:&lt;br /&gt;
&lt;br /&gt;
* UTF-8 verwendet &amp;lt;code&amp;gt;EF BB BF&amp;lt;/code&amp;gt;.&lt;br /&gt;
* UTF-16 Little Endian verwendet &amp;lt;code&amp;gt;FF FE&amp;lt;/code&amp;gt;.&lt;br /&gt;
* UTF-16 Big Endian verwendet &amp;lt;code&amp;gt;FE FF&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Schritte zum Aktivieren von Unicode in Anwendungen==&lt;br /&gt;
&lt;br /&gt;
Sie müssen die folgenden Schritte ausführen:&lt;br /&gt;
&lt;br /&gt;
# Überprüfen von Char- und String-bezogenen Funktionen&lt;br /&gt;
# Neu erzeugen der Anwendung&lt;br /&gt;
# Überprüfen von Surrogatpaaren&lt;br /&gt;
# Überprüfen der String-Nutzdaten&lt;br /&gt;
&lt;br /&gt;
Weitere Einzelheiten finden Sie unter [[Anwendungen für Unicode anpassen|Anwendungen für Unicode anpassen]].&lt;br /&gt;
&lt;br /&gt;
==Neue Warnungen des {{Delphi}}-Compilers==&lt;br /&gt;
&lt;br /&gt;
Dem {{Delphi}}-Compiler wurden neue Warnungen hinzugefügt, die sich auf mögliche Fehler bei der Typumwandlung beziehen (z.B. beim Umwandeln eines &amp;lt;code&amp;gt;UnicodeString&amp;lt;/code&amp;gt;- oder &amp;lt;code&amp;gt;WideString&amp;lt;/code&amp;gt;-Strings in &amp;lt;code&amp;gt;AnsiString&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;AnsiChar&amp;lt;/code&amp;gt;). Wenn Sie eine Anwendung nach Unicode konvertieren, sollten Sie die Warnungen 1057 und 1058 aktivieren, die Sie beim Auffinden von Problembereichen in Ihrem Quelltext unterstützen.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[[W1050 In Set-Ausdruck WideChar auf Byte-Char verringert (Delphi)|W1050: WideChar in Set-Ausdrücken auf ByteChar verkürzt (Delphi)]]&#039;&#039;&#039;. &amp;quot;Set of char&amp;quot; definiert in Win32 eine Menge über den gesamten Bereich des Char-Typs. Da Char in Win32 ein Typ auf Byte-Größe ist, wird dadurch eine Menge mit maximaler Größe und mit 256 Elementen definiert. In .NET ist Char ein Typ auf Word-Größe, dessen Bereich (0..65535) die Kapazität des Mengen-Typs überschreitet.&lt;br /&gt;
* &#039;&#039;&#039;[[W1057 Implizite String-Umwandlung von &#039;%s&#039; zu &#039;%s&#039; (Delphi)|W1057: Implizite String-Umwandlung von &#039;%s&#039; zu &#039;%s&#039; (IMPLICIT_STRING_CAST)]]&#039;&#039;&#039; Wird ausgegeben, wenn der Compiler einen Fall findet, bei dem ein &amp;lt;code&amp;gt;AnsiString&amp;lt;/code&amp;gt; (oder ein &amp;lt;code&amp;gt;AnsiChar&amp;lt;/code&amp;gt;) in eine Form von Unicode (einen &amp;lt;code&amp;gt;UnicodeString&amp;lt;/code&amp;gt; oder einen &amp;lt;code&amp;gt;WideString&amp;lt;/code&amp;gt;) implizit konvertiert werden muss. (HINWEIS: Diese Warnung ist eventuell per Vorgabe aktiviert).&lt;br /&gt;
* &#039;&#039;&#039;[[W1058 Implizite String-Umwandlung mit potenziellem Datenverlust von &#039;%s&#039; zu &#039;%s&#039; (Delphi)|W1058: Implizite String-Umwandlung mit potenziellem Datenverlust von &#039;%s&#039; zu &#039;%s&#039; (IMPLICIT_STRING_CAST_LOSS)]]&#039;&#039;&#039; Wird ausgegeben, wenn der Compiler einen Fall findet, bei dem eine Form von Unicode (ein &amp;lt;code&amp;gt;UnicodeString&amp;lt;/code&amp;gt; oder ein &amp;lt;code&amp;gt;WideString&amp;lt;/code&amp;gt;) in einen &amp;lt;code&amp;gt;AnsiString&amp;lt;/code&amp;gt; (oder ein &amp;lt;code&amp;gt;AnsiChar&amp;lt;/code&amp;gt;) implizit konvertiert werden muss. Dies ist eine potenziell verlustreiche Umwandlung, weil es Zeichen in dem String geben kann, die auf der Codeseite, in die der String umgewandelt wird, nicht repräsentiert werden können. (HINWEIS: Diese Warnung ist eventuell per Vorgabe aktiviert).&lt;br /&gt;
* &#039;&#039;&#039;[[W1059 Explizite String-Umwandlung von &#039;%s&#039; zu &#039;%s&#039; (Delphi)|W1059: Explizite String-Umwandlung von &#039;%s&#039; zu &#039;%s&#039; (EXPLICIT_STRING_CAST)]]&#039;&#039;&#039; Wird ausgegeben, wenn der Compiler auf einen Fall trifft, bei dem der Programmierer explizit einen &amp;lt;code&amp;gt;AnsiString&amp;lt;/code&amp;gt; (oder ein &amp;lt;code&amp;gt;AnsiChar&amp;lt;/code&amp;gt;) in eine Form von Unicode (&amp;lt;code&amp;gt;UnicodeString&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;WideString&amp;lt;/code&amp;gt;) umwandelt. (HINWEIS: Diese Warnung ist standardmäßig deaktiviert und sollte nur zum Auffinden eventueller Probleme verwendet werden.)&lt;br /&gt;
* &#039;&#039;&#039;[[W1060 Explizite String-Umwandlung mit potenziellem Datenverlust von &#039;%s&#039; zu &#039;%s&#039; (Delphi)|W1060: Explizite String-Umwandlung mit potenziellem Datenverlust von &#039;%s&#039; zu &#039;%s&#039; (EXPLICIT_STRING_CAST_LOSS)]]&#039;&#039;&#039; Wird ausgegeben, wenn der Compiler einen Fall findet, bei dem der Programmierer explizit eine Form von Unicode (&amp;lt;code&amp;gt;UnicodeString&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;WideString&amp;lt;/code&amp;gt;) in einen &amp;lt;code&amp;gt;AnsiString&amp;lt;/code&amp;gt; (oder ein &amp;lt;code&amp;gt;AnsiChar&amp;lt;/code&amp;gt;) konvertiert. Dies ist eine potenziell verlustreiche Umwandlung, weil es Zeichen in dem String geben kann, die auf der Codeseite, in die der String umgewandelt wird, nicht repräsentiert werden können. (HINWEIS: Diese Warnung ist standardmäßig deaktiviert und sollte nur zum Auffinden eventueller Probleme verwendet werden.)&lt;br /&gt;
&lt;br /&gt;
==Empfehlungen==&lt;br /&gt;
&lt;br /&gt;
* Belassen Sie die Quelltextdaten im UTF-8-Format:&lt;br /&gt;
** Dateien können im ANSI-Format bleiben, wenn der Quelltext mit der korrekten Codeseite compiliert wird. Wählen Sie ({{Menu|Projekt &amp;amp;gt; Optionen &amp;amp;gt; C++-Compiler &amp;amp;gt; [[C++-Compiler Erweitert|Erweitert]]}} und verwenden Sie die Option &amp;quot;Codeseite&amp;quot; unter &#039;&#039;&#039;Weitere Optionen&#039;&#039;&#039;, um die korrekte Codeseite festzulegen.&lt;br /&gt;
** Schreiben Sie in die Quelltextdatei ein UTF-8 BOM. Stellen Sie sicher, dass Ihr Versionsverwaltungssystem diese Dateien unterstützt.&lt;br /&gt;
* Führen Sie in der IDE ein Refactoring durch, wenn der Quelltext &amp;lt;code&amp;gt;AnsiString&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;AnsiChar&amp;lt;/code&amp;gt; sein muss (der Quelltext ist weiterhin portierbar).&lt;br /&gt;
* Statische Überprüfung des Quelltextes:&lt;br /&gt;
** Gibt der Quelltext Daten nur weiter?&lt;br /&gt;
** Führt der Quelltext eine einfache Zeichenindizierung durch?&lt;br /&gt;
* Beachten Sie alle Warnungen (es könnten Fehler daraus werden):&lt;br /&gt;
** Verdächtige Zeigerumwandlungen.&lt;br /&gt;
** Implizite/explizite Umwandlungen.&lt;br /&gt;
* Bestimmen Sie den Zweck des Quelltextes.&lt;br /&gt;
** Verwendet der Quelltext einen String (&amp;lt;code&amp;gt;AnsiString&amp;lt;/code&amp;gt;) als ein dynamisches Byte-Array? Wenn ja, dann setzen Sie stattdessen den portierbaren Typ &amp;lt;code&amp;gt;TBytes&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;Byte&amp;lt;/code&amp;gt;-Array) ein.&lt;br /&gt;
** Wird mit einer &amp;lt;code&amp;gt;PChar&amp;lt;/code&amp;gt;-Umwandlung die Zeigerarithmetik aktiviert? Wenn ja, wandeln Sie stattdessen in &amp;lt;code&amp;gt;PByte&amp;lt;/code&amp;gt; um, und aktivieren Sie &amp;lt;code&amp;gt;$POINTERMATH ON&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
&lt;br /&gt;
* [[UTF-8-Konvertierungsroutinen|UTF-8-Konvertierungsroutinen]]&lt;br /&gt;
* [http://www.embarcadero.com/images/dm/technical-papers/delphi-unicode-migration.pdf {{Delphi}} Unicode Migration for Mere Mortals: Stories and Advice from the Front Lines von Cary Jensen (EN)]&lt;br /&gt;
* [http://edn.embarcadero.com/article/38437 {{Delphi}} in a Unicode World Part I: What is Unicode, Why do you need it, and How do you work with it in {{Delphi}}? (EN)]&lt;br /&gt;
* [http://edn.embarcadero.com/article/38498 {{Delphi}} in a Unicode World Part II: New RTL Features and Classes to Support Unicode (EN)]&lt;br /&gt;
* [http://www.embarcadero.com/rad-studio-2010-migration-center {{Product}} 2010 Migration Center (EN)]&lt;br /&gt;
* [[Anwendungen für Unicode anpassen|Anwendungen für Unicode anpassen]]&lt;br /&gt;
* [[C++-Anwendungen für Unicode anpassen|C++-Anwendungen für Unicode anpassen]]&lt;br /&gt;
* [[TCHAR-Zuordnung|_TCHAR-Zuordnung (C++)]]&lt;br /&gt;
* [[Verwendung von Unicode in der Befehlskonsole|Verwendung von Unicode in der Befehlskonsole]] {{f|vcl|&lt;br /&gt;
* [[Verwendung von TEncoding für Unicode-Dateien|Verwendung von TEncoding für Unicode-Dateien]] }}&lt;br /&gt;
* [[Behandlung der AnsiString-Codeseitenspezifikation in C++|Behandlung der AnsiString-Codeseitenspezifikation in C++]]&lt;br /&gt;
* [[lib_de:System.UnicodeString|System.UnicodeString]]&lt;br /&gt;
* [[lib_de:System.AnsiString|System.AnsiString]][[Category:Mit RAD Studio arbeiten]]&lt;br /&gt;
[[Category:AMMigrate]]&lt;br /&gt;
&lt;br /&gt;
[[en:Unicode in RAD Studio]]&lt;br /&gt;
[[fr:Unicode dans RAD Studio]]&lt;br /&gt;
[[ja:RAD Studio における Unicode]]&lt;/div&gt;</summary>
		<author><name>Nicolas.rios</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Drucken_aus_FireMonkey-Anwendungen&amp;diff=218570</id>
		<title>Drucken aus FireMonkey-Anwendungen</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Drucken_aus_FireMonkey-Anwendungen&amp;diff=218570"/>
		<updated>2023-09-27T13:07:48Z</updated>

		<summary type="html">&lt;p&gt;Nicolas.rios: RS-111641&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Parent|FireMonkey-Anwendungshandbuch}}&lt;br /&gt;
&lt;br /&gt;
Sie können auf &#039;&#039;&#039;Windows&#039;&#039;&#039; oder &#039;&#039;&#039;macOS&#039;&#039;&#039; aus einer {{FM}}-Anwendung drucken.&lt;br /&gt;
&lt;br /&gt;
=={{FM}}-API zum Drucken==&lt;br /&gt;
&lt;br /&gt;
Das Objekt [[lib_de:FMX.Printer.TPrinter|FMX.Printer.TPrinter]] kapselt die Funktionalität für den Zugriff auf einen Drucker und das Drucken auf einem Drucker, der an einem Computer für Windows oder macOS angeschlossen ist. Mit dem Objekt [[lib_de:FMX.Printer.TPrinter|FMX.Printer.TPrinter]] können Sie alle Druckoperationen einer Anwendung verwalten. Durch Aufruf der globalen Funktion [[lib_de:FMX.Printer.Printer|FMX.Printer.Printer]] können Sie eine Instanz von [[lib_de:FMX.Printer.TPrinter|FMX.Printer.TPrinter]] abrufen.&lt;br /&gt;
&lt;br /&gt;
[[lib_de:FMX.Printer.TPrinter|FMX.Printer.TPrinter]] enthält eine Liste der [[lib_de:FMX.Printer.TPrinterDevice|TPrinterDevice]]-Objekte, die jeweils einen Drucker repräsentieren. Jeder Drucker enthält eine eigene Liste mit Druckauflösungen DPI (Dots Per Inch, Punkte pro Zoll). In der Eigenschaft [[lib_de:FMX.Printer.TPrinterDevice.DPICount|DPICount]] ist die Anzahl der Auflösungen enthalten, die von dem Drucker unterstützt werden. Die indizierte Eigenschaft [[lib_de:FMX.Printer.TPrinterDevice.DPI|DPI]] kann zum Ermitteln der tatsächlichen Auflösungen durchlaufen werden. [[lib_de:FMX.Printer.TPrinterDevice.ActiveDPIIndex|ActiveDPIIndex]] ist ein nullbasierter Index für die indizierte Eigenschaft [[lib_de:FMX.Printer.TPrinterDevice.DPI|DPI]], die die Druckauflösung auf dem Drucker darstellt.&lt;br /&gt;
&lt;br /&gt;
==Aktivieren der Druckfunktion in {{FM}}-Anwendungen==&lt;br /&gt;
&lt;br /&gt;
In den folgenden Schritten wird gezeigt, wie das Drucken aus einer {{FM}}-Anwendung durchgeführt wird.&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Beziehen Sie [[lib_de:FMX.Printer|FMX.Printer]] in das Formular ein, in dem der Druckauftrag verwendet werden soll.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;l s=&amp;quot;delphi&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
&#039;&#039;&#039;{{Delphi}}:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 uses FMX.Printer;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;l e=&amp;quot;delphi&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;l s=&amp;quot;cpp&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;C++:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 #include &amp;quot;FMX.Printer.hpp&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;l e=&amp;quot;cpp&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Verwenden Sie immer die [[lib_de:FMX.Printer.TPrinter.Canvas|Zeichenfläche des Druckers]] oder die Zeichenfläche einer grafischen Komponente (z.B. die Zeichenfläche eines Bildes) anstelle der Zeichenfläche des Formulars. Beginnen Sie den Druckvorgang immer mit [[lib_de:FMX.Graphics.TCanvas.BeginScene|BeginScene]] und beenden Sie den Druckauftrag mit [[lib_de:FMX.Graphics.TCanvas.EndScene|EndScene]], wenn Sie die [[lib_de:FMX.Printer.TPrinter.Canvas|Zeichenfläche des Druckers]] nicht verwenden.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Setzen Sie zuerst zur vollständigen Kontrolle über die Druckqualität (Auflösung der und Portabilität der [[lib_de:FMX.Printer.TPrinter.Canvas|Zeichenfläche]]) [[lib_de:FMX.Printer.TPrinterDevice.ActiveDPIIndex|ActiveDPIIndex]] durch Zuweisen eines Wertes oder durch Aufruf der Methode [[lib_de:FMX.Printer.TPrinterDevice.SelectDPI|SelectDPI]] (empfohlenes Vorgehen).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;l s=&amp;quot;delphi&amp;quot;/&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
&#039;&#039;&#039;{{Delphi}}:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 Printer.ActivePrinter.SelectDPI(1200, 1200); { one way }&lt;br /&gt;
 Printer.ActivePrinter.ActiveDPIIndex := 1; { another way }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;	&lt;br /&gt;
&amp;lt;l e=&amp;quot;delphi&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;l s=&amp;quot;cpp&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;C++:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 Printer-&amp;gt;ActivePrinter-&amp;gt;SelectDPI(1200, 1200); /* one way */&lt;br /&gt;
 Printer-&amp;gt;ActivePrinter-&amp;gt;ActiveDPIIndex = 1; /* another way */&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;l e=&amp;quot;cpp&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Starten Sie den eigentlichen Druckauftrag mit [[lib_de:FMX.Printer.TPrinter.BeginDoc|BeginDoc]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;l s=&amp;quot;delphi&amp;quot;/&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
&#039;&#039;&#039;{{Delphi}}:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 Printer.BeginDoc;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;l e=&amp;quot;delphi&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;l s=&amp;quot;cpp&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;C++:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 Printer-&amp;gt;BeginDoc();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;l e=&amp;quot;cpp&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Beenden Sie den eigentlichen Druckauftrag mit [[lib_de:FMX.Printer.TPrinter.EndDoc|EndDoc]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;l s=&amp;quot;delphi&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;{{Delphi}}:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 Printer.EndDoc;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;l e=&amp;quot;delphi&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;l s=&amp;quot;cpp&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;C++:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 Printer-&amp;gt;EndDoc();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;l e=&amp;quot;cpp&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Ändern Sie während eines Druckauftrags nie die Eigenschaft [[lib_de:FMX.Printer.TPrinterDevice.ActiveDPIIndex|ActiveDPIIndex]].&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DPI- und Treiberunterstützung==&lt;br /&gt;
&lt;br /&gt;
Die Treiberunterstützung für Drucker ist auf verschiedenen Plattformen (Windows, macOS) unterschiedlich. Deshalb sollten Sie sich nicht darauf verlassen, dass die Anzahl oder die Reihenfolge der unterstützten Auflösungen im Array [[lib_de:FMX.Printer.TPrinterDevice.DPI|DPI]] unter Windows und macOS identisch sind. Unter macOS gibt es beispielsweise für den HP-Laserdrucker 3 unterstützte Auflösungen, für Windows hingegen 7. Bei Anwendungen mit Druckfunktionen für Windows und macOS müssen Sie zusätzlichen Code hinzufügen (hauptsächlich zur Angabe der DPI), damit die Druckausgabe auf beiden Plattformen annähernd gleich ist.&lt;br /&gt;
&lt;br /&gt;
Als &#039;&#039;&#039;bestes Verfahren&#039;&#039;&#039; hat sich erwiesen, die DPI immer durch Setzen der Eigenschaft [[lib_de:FMX.Printer.TPrinterDevice.ActiveDPIIndex|ActiveDPIIndex]] oder durch Aufruf der Methode [[lib_de:FMX.Printer.TPrinterDevice.SelectDPI|SelectDPI]] vor dem Drucken, wie oben erwähnt, festzulegen.&lt;br /&gt;
&lt;br /&gt;
[[lib_de:FMX.Printer.TPrinterDevice.ActiveDPIIndex|ActiveDPIIndex]] wird für einen gegebenen Drucker &#039;&#039;&#039;nicht&#039;&#039;&#039; auf die Standard-DPI gesetzt. Ein [[lib_de:FMX.Printer.TPrinterDevice|TPrinterDevice]]-Objekt unterstützt keine Standard-DPI, insbesondere weil die Standard-DPI von einigen macOS-Druckertreibern nicht angegeben wird. Deshalb wird beim Start der Anwendung [[lib_de:FMX.Printer.TPrinterDevice.ActiveDPIIndex|ActiveDPIIndex]] für alle [[lib_de:FMX.Printer.TPrinterDevice|TPrinterDevice]]-Objekte auf -1 gesetzt. Der Wert -1 bedeutet, dass entweder die letzte Druck-DPI oder die Standard-DPI verwendet wird. Die Standard-DPI ist nur nach dem Start der Anwendung verfügbar, wenn Sie [[lib_de:FMX.Printer.TPrinterDevice.ActiveDPIIndex|ActiveDPIIndex]] nicht in einen anderen Indexwert geändert und [[lib_de:FMX.Printer.TPrinter.BeginDoc|BeginDoc]] nicht aufgerufen haben.&lt;br /&gt;
&lt;br /&gt;
Andererseits können Sie [[lib_de:FMX.Printer.TPrinterDevice.ActiveDPIIndex|ActiveDPIIndex]] auf -1 setzen, und die letzte DPI des zuvor festgelegten Druckers wird von der Anwendung verwendet. Denken Sie immer daran, einen Wert für [[lib_de:FMX.Printer.TPrinterDevice.ActiveDPIIndex|ActiveDPIIndex]] zu setzen, bevor Sie [[lib_de:FMX.Printer.TPrinter.BeginDoc|BeginDoc]] aufrufen, wenn Sie dieselbe Größe der [[lib_de:FMX.Printer.TPrinter.Canvas|Zeichenfläche]] für Windows und macOS verwenden möchten.&lt;br /&gt;
&lt;br /&gt;
Mit der Methode [[lib_de:FMX.Printer.TPrinterDevice.SelectDPI|SelectDPI]] kann durch ein [[lib_de:FMX.Printer.TPrinter|TPrinter]]-Objekt sehr einfach die Ihrem Drucker ähnlichste Auflösung auf Basis der an [[lib_de:FMX.Printer.TPrinterDevice.SelectDPI|SelectDPI]] übergebenen Parameter ausgewählt werden. Es ist einfacher festzulegen; anstatt die Eigenschaft [[lib_de:FMX.Printer.TPrinterDevice.ActiveDPIIndex|ActiveDPIIndex]] direkt zu setzen, können Sie beispielsweise den Wert zur Laufzeit ändern:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;l s=&amp;quot;delphi&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;{{Delphi}}:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Printer.ActivePrinter.Select(600, 600);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;l e=&amp;quot;delphi&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;l s=&amp;quot;cpp&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;C++:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Printer-&amp;gt;ActivePrinter-&amp;gt;Select(600, 600);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;l e=&amp;quot;cpp&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In Anbetracht der Tatsache, dass unter Windows die Anzahl der vom Treiber angegebenen Druckerauflösungen von denen, die der macOS-Druckertreiber liefert, abweicht, könnte der Index nicht verfügbar sein.&lt;br /&gt;
&lt;br /&gt;
Zusammengefasst stellt die Verwendung von [[lib_de:FMX.Printer.TPrinterDevice.SelectDPI|SelectDPI]] zum Setzen der Druck-DPI die &#039;&#039;&#039;weitaus praktischere Methode&#039;&#039;&#039; dar.&lt;br /&gt;
&lt;br /&gt;
==Druckerzeichenfläche==&lt;br /&gt;
&lt;br /&gt;
Es gibt einige Unterschiede bei der Verwendung einer &#039;&#039;&#039;Druckerzeichenfläche&#039;&#039;&#039; im Vergleich zu einer &#039;&#039;&#039;Bildschirm- oder Fenster-(Formular-)Zeichenfläche&#039;&#039;&#039;:	&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
* Für Druckerzeichenflächen müssen Sie die Farb- und Fülleinstellungen mit [[lib_de:FMX.Graphics.TCanvas.Fill|Canvas.Fill]] festlegen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;l s=&amp;quot;delphi&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;{{Delphi}}:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Canvas.Fill.Color := claXXX;&lt;br /&gt;
Canvas.Fill.Kind := TBrushKind.Solid;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;l e=&amp;quot;delphi&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;l s=&amp;quot;cpp&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;C++:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Canvas-&amp;gt;Fill-&amp;gt;Color = claXXX;&lt;br /&gt;
Canvas-&amp;gt;Fill-&amp;gt;Kind = TBrushKind.Solid;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;l e=&amp;quot;cpp&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Für Bildschirm- oder Fensterzeichenflächen müssen Sie die Farb- und Fülleinstellungen mit [[lib_de:FMX.Graphics.TCanvas.Stroke|Canvas.Stroke]] festlegen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;l s=&amp;quot;delphi&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;{{Delphi}}:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Canvas.Stroke.Color := claXXX;&lt;br /&gt;
Canvas.Stroke.Kind := TBrushKind.Solid;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;l e=&amp;quot;delphi&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;l s=&amp;quot;cpp&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;C++:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Canvas-&amp;gt;Stroke-&amp;gt;Color = claXXX;&lt;br /&gt;
Canvas-&amp;gt;Stroke-&amp;gt;Kind = TBrushKind.Solid;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;l e=&amp;quot;cpp&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beachten Sie, dass:&lt;br /&gt;
* Sie beim Drucken von Text, dessen Farbe Sie ändern möchten, [[lib_de:FMX.Graphics.TCanvas.Fill|Canvas.Fill]] verwenden müssen.&lt;br /&gt;
* Sie beim Drucken anderer Elemente – außer Text – [[lib_de:FMX.Graphics.TCanvas.Stroke|Canvas.Stroke]] verwenden müssen.&lt;br /&gt;
&lt;br /&gt;
Der Parameter &amp;lt;code&amp;gt;Opacity&amp;lt;/code&amp;gt; übernimmt bei allen Routinen, die diesen Parameter unterstützen (wie [[lib_de:FMX.Graphics.TCanvas.FillRect|FMX.Graphics.TCanvas.FillRect]]) Gleitkommawerte im Bereich von &amp;lt;code&amp;gt;0..1&amp;lt;/code&amp;gt; (0 ist transparent und 1 ist undurchsichtig). Verwenden Sie keine Werte außerhalb dieses Bereichs.&lt;br /&gt;
&lt;br /&gt;
==Beispiel für programmgesteuertes Drucken==&lt;br /&gt;
&lt;br /&gt;
Im folgenden Beispiel wird ein Bild und eine Schaltfläche verwendet. Bei jedem Klicken auf die Schaltfläche wird das Bild auf dem Drucker ausgegeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;l s=&amp;quot;delphi&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;{{Delphi}}:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
var&lt;br /&gt;
  SrcRect, DestRect: TRectF;&lt;br /&gt;
begin&lt;br /&gt;
  { Set the default DPI for the printer. The SelectDPI routine defaults&lt;br /&gt;
    to the closest available resolution as reported by the driver. }&lt;br /&gt;
  Printer.ActivePrinter.SelectDPI(1200, 1200);&lt;br /&gt;
  { Start printing. }&lt;br /&gt;
  Printer.BeginDoc;&lt;br /&gt;
 &lt;br /&gt;
  if Printer.Canvas.BeginScene then&lt;br /&gt;
  try&lt;br /&gt;
    { Set canvas filling style. }&lt;br /&gt;
    Printer.Canvas.Fill.Color := claBlack;&lt;br /&gt;
    Printer.Canvas.Fill.Kind := TBrushKind.Solid;&lt;br /&gt;
 &lt;br /&gt;
    { Set the Source and Destination TRects. }&lt;br /&gt;
    SrcRect := Image1.LocalRect;&lt;br /&gt;
    DestRect := TRectF.Create(0, 0, Printer.PageWidth, Printer.PageHeight);&lt;br /&gt;
 &lt;br /&gt;
    { Print the picture on all the surfaces of the page and all opaque. }&lt;br /&gt;
    Printer.Canvas.DrawBitmap(Image1.Bitmap, SrcRect, DestRect, 1);&lt;br /&gt;
  finally&lt;br /&gt;
    Printer.Canvas.EndScene;&lt;br /&gt;
  end;&lt;br /&gt;
 &lt;br /&gt;
  { Finish printing job. }&lt;br /&gt;
  Printer.EndDoc;&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;l e=&amp;quot;delphi&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;l s=&amp;quot;cpp&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;C++&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
TRectF SrcRect, DestRect;&lt;br /&gt;
  TPrinter *Printer = Printer;&lt;br /&gt;
 &lt;br /&gt;
  /* Set the default DPI for the printer. The SelectDPI routine defaults&lt;br /&gt;
		 to the closest available resolution as reported by the driver. */&lt;br /&gt;
  Printer-&amp;gt;ActivePrinter-&amp;gt;SelectDPI(1200, 1200);&lt;br /&gt;
 &lt;br /&gt;
  /* Start printing. */&lt;br /&gt;
  Printer-&amp;gt;BeginDoc();&lt;br /&gt;
 &lt;br /&gt;
  if (Printer-&amp;gt;Canvas-&amp;gt;BeginScene()) {&lt;br /&gt;
	  try&lt;br /&gt;
	  {&lt;br /&gt;
		/* Set canvas filling style. */&lt;br /&gt;
		  Printer-&amp;gt;Canvas-&amp;gt;Fill-&amp;gt;Color = claBlack;&lt;br /&gt;
		  Printer-&amp;gt;Canvas-&amp;gt;Fill-&amp;gt;Kind = TBrushKind(1);&lt;br /&gt;
 &lt;br /&gt;
		  /* Set the Source and Destination TRects. */&lt;br /&gt;
		  SrcRect = Image1-&amp;gt;LocalRect;&lt;br /&gt;
		  DestRect = TRectF(0, 0, Printer-&amp;gt;PageWidth, Printer-&amp;gt;PageHeight);&lt;br /&gt;
 &lt;br /&gt;
		  /* Print the picture on all the surface of the page and all opaque. */&lt;br /&gt;
		  Printer-&amp;gt;Canvas-&amp;gt;DrawBitmap(Image1-&amp;gt;Bitmap, SrcRect, DestRect, 1);&lt;br /&gt;
	  }&lt;br /&gt;
	   __finally&lt;br /&gt;
	  {&lt;br /&gt;
		Printer-&amp;gt;Canvas-&amp;gt;EndScene();&lt;br /&gt;
	  }&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  /* Finish the printing job. */&lt;br /&gt;
  Printer-&amp;gt;EndDoc();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;l e=&amp;quot;cpp&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen bezüglich der Druck-API finden Sie in der API-Dokumentation in der [[lib_de:FMX.Printer|Unit FMX.Printer]].&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
&lt;br /&gt;
* [[lib_de:FMX.Printer|FMX.Printer (Unit)]]&lt;br /&gt;
&lt;br /&gt;
==Codebeispiele==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;l s=&amp;quot;delphi&amp;quot;/&amp;gt;&lt;br /&gt;
* [[samp_en:FMXPrinting_({{Delphi}})|Drucken aus {{FM}} ({{Delphi}})]]&lt;br /&gt;
&amp;lt;l e=&amp;quot;delphi&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;l s=&amp;quot;cpp&amp;quot;/&amp;gt;&lt;br /&gt;
* [[samp_en:FMXPrinting_(C++)|Drucken aus {{FM}} (C++)]]&lt;br /&gt;
&amp;lt;l e=&amp;quot;cpp&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:XE2]]&lt;br /&gt;
[[Category:FMX]]&lt;br /&gt;
[[Category:AMMigrate]]&lt;br /&gt;
&lt;br /&gt;
[[en:Printing from a FireMonkey Application]]&lt;br /&gt;
[[fr:Impression depuis une application FireMonkey]]&lt;br /&gt;
[[ja:FireMonkey アプリケーションからの印刷]]&lt;/div&gt;</summary>
		<author><name>Nicolas.rios</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Symboldeklarationen_und_Querverweise_(Delphi)&amp;diff=218567</id>
		<title>Symboldeklarationen und Querverweise (Delphi)</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Symboldeklarationen_und_Querverweise_(Delphi)&amp;diff=218567"/>
		<updated>2023-09-21T21:11:17Z</updated>

		<summary type="html">&lt;p&gt;Nicolas.rios: {{Note|&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Parent|Liste der Delphi-Compiler-Direktiven - Index}}&lt;br /&gt;
&amp;lt;ideTag id=&amp;quot;FHXR21630&amp;quot;&amp;gt;&amp;lt;/ideTag&amp;gt;&lt;br /&gt;
&amp;lt;ideTag id=&amp;quot;SymbolDeclarationAndCrossReferenceInformation&amp;quot;&amp;gt;&amp;lt;/ideTag&amp;gt;&lt;br /&gt;
&amp;lt;ideTag id=&amp;quot;CompilerDirectivesTopics&amp;quot;&amp;gt;&amp;lt;/ideTag&amp;gt;&lt;br /&gt;
&amp;lt;ideTag id=&amp;quot;$Y&amp;quot;&amp;gt;&amp;lt;/ideTag&amp;gt;&lt;br /&gt;
&amp;lt;ideTag id=&amp;quot;$REFERENCEINFO&amp;quot;&amp;gt;&amp;lt;/ideTag&amp;gt;&lt;br /&gt;
&amp;lt;ideTag id=&amp;quot;$DEFINITIONINFO&amp;quot;&amp;gt;&amp;lt;/ideTag&amp;gt;&lt;br /&gt;
&amp;lt;ideTag id=&amp;quot;Y&amp;quot;&amp;gt;&amp;lt;/ideTag&amp;gt;&lt;br /&gt;
&amp;lt;ideTag id=&amp;quot;REFERENCEINFO&amp;quot;&amp;gt;&amp;lt;/ideTag&amp;gt;&lt;br /&gt;
&amp;lt;ideTag id=&amp;quot;DEFINITIONINFO&amp;quot;&amp;gt;&amp;lt;/ideTag&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; frame=&amp;quot;hsides&amp;quot; rules=&amp;quot;rows&amp;quot;&lt;br /&gt;
| align=&amp;quot;left&amp;quot; valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&#039;&#039;&#039;Typ&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;left&amp;quot; valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
Option&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&#039;&#039;&#039;Syntax&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;left&amp;quot; valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
{$Y+}, {$Y-}, oder {$YD}; {$REFERENCEINFO ON}, {DEFINITIONINFO OFF} oder {$REFERENCEINFO OFF}, oder {DEFINITIONINFO ON}&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&#039;&#039;&#039;Vorgabe&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;left&amp;quot; valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
{$YD} {$DEFINITIONINFO ON}&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&#039;&#039;&#039;Bereich&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;left&amp;quot; valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
Global&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bemerkungen&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Direktive $Y steuert die Generierung von Symbolinformationen, die von der Projektverwaltung, vom Code-Explorer und vom Quelltext-Editor verwendet werden. Diese Informationen bestehen aus Tabellen, in denen die Zeilennummern des Quelltextes für alle Deklarationen der Bezeichner und (im Status {$Y+} ) auch für alle Verweise auf die Bezeichner in einem Modul enthalten sind. Bei Units sind die Informationen zusammen mit dem Objektquelltext der Unit in der .dcu-Datei enthalten. Symbolinformationen vergrößern die .dcu-Dateien, haben aber keine Auswirkungen auf die Größe oder Schnelligkeit des ausführbaren Programms.&lt;br /&gt;
&lt;br /&gt;
Wenn ein Programm oder eine Unit im Standardstatus {$YD} (oder {DEFINITIONINFO ON}) compiliert wird, so zeichnet der Compiler Informationen über die Stelle auf, an der die einzelnen Bezeichner definiert sind. Bei den meisten Bezeichnern (Variablen, Konstanten, Klassen usw.) zeichnet der Compiler die Stelle auf, an der die jeweilige Deklaration steht. Bei Prozeduren, Funktionen und Methoden wird die Stelle aufgezeichnet, an der sich die Implementierung befindet. Dies ermöglicht das Suchen im Quelltext.&lt;br /&gt;
&lt;br /&gt;
Wird ein Programm oder eine Unit im Status {$Y+} (oder {REFERENCEINFO ON}) compiliert, so zeichnet der Compiler Informationen darüber auf, wo die einzelnen Bezeichner verwendet werden und wo sie definiert sind. Dies ermöglicht die Verwendung der Seite Referenz im Projekt-Browser.&lt;br /&gt;
&lt;br /&gt;
Wenn ein Programm oder eine Unit im Status {$Y-} (oder {DEFINITIONINFO OFF} bzw. {REFERENCEINFO OFF}) compiliert wird, so werden keine Symbolinformationen aufgezeichnet. Damit ist es nicht möglich, im Quelltext zu suchen oder auf die Seite Referenz des Projekt-Browsers zuzugreifen.&lt;br /&gt;
&lt;br /&gt;
Der Schalter $Y wird normalerweise zusammen mit den Schaltern $D und $L eingesetzt, die die Generierung von Debug-Informationen bzw. von lokalen Symbolinformationen steuern. Die Direktive $Y wirkt sich nur aus, wenn die Schalter $D und $L aktiviert sind.&lt;br /&gt;
&lt;br /&gt;
{{Note| Die Generierung von Kreuzreferenz-Informationen ({$Y+}) kann die Compilier- und Linkzeiten beträchtlich erhöhen. Sie sollten diese Option daher nur aktivieren, wenn Sie die Seite &#039;&#039;&#039;Referenz&#039;&#039;&#039; der Projektverwaltung benötigen.}}&lt;br /&gt;
[[Category:{{Delphi}}]]&lt;br /&gt;
&lt;br /&gt;
[[en:Symbol declaration and cross-reference information (Delphi)]]&lt;br /&gt;
[[fr:Déclaration de symboles et informations de référence croisée (Delphi)]]&lt;br /&gt;
[[ja:シンボルの宣言とクロスリファレンスの情報（Delphi）]]&lt;/div&gt;</summary>
		<author><name>Nicolas.rios</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Konsolenanwendungen&amp;diff=218566</id>
		<title>Konsolenanwendungen</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Konsolenanwendungen&amp;diff=218566"/>
		<updated>2023-09-15T20:13:37Z</updated>

		<summary type="html">&lt;p&gt;Nicolas.rios: {{Note|&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Parent|Anwendungen erstellen}}&lt;br /&gt;
Konsolenanwendungen sind 32-Bit-Programme, die in einem Konsolenfenster ohne grafische Oberfläche auf einer [[Übersicht über Zielplattformen|Zielplattform]] ausgeführt werden. Diese Anwendungen benötigen in der Regel wenig Benutzereingaben und verfügen über einen begrenzten Funktionsumfang. Obwohl in Konsolenanwendungen keine visuellen Komponenten angezeigt werden können, sind alle Typen und Funktionen der RTL (Laufzeitbibliothek) in einer Konsolenanwendung einsetzbar.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;l s=&amp;quot;delphi&amp;quot; /&amp;gt;&lt;br /&gt;
Alle Anwendungen, die den folgenden Code enthält, öffnen ein eigenes Konsolenfenster:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;{$APPTYPE CONSOLE}&amp;lt;/source&amp;gt;&amp;lt;l e=&amp;quot;delphi&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;l s=&amp;quot;delphi&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===So erstellen Sie eine neue {{Delphi}}-Konsolenanwendung:===&lt;br /&gt;
&lt;br /&gt;
# Klicken Sie auf &amp;lt;font color=&amp;quot;#598527&amp;quot;&amp;gt; &#039;&#039;&#039;Datei &amp;amp;gt; Neu &amp;amp;gt; Weitere &amp;amp;gt; {{Delphi}}-Projekte&#039;&#039;&#039;&amp;lt;/font&amp;gt;.&lt;br /&gt;
# Doppelklicken Sie auf &#039;&#039;&#039;Konsolenanwendung&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Die IDE erstellt eine Projektdatei für diesen Quelldateityp und zeigt den &#039;&#039;&#039;[[Quelltext-Editor|Quelltext-Editor]]&#039;&#039;&#039; an.&lt;br /&gt;
&amp;lt;l e=&amp;quot;delphi&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;l s=&amp;quot;cpp&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===So erstellen Sie eine neue C++-Konsolenanwendung:===&lt;br /&gt;
&lt;br /&gt;
# Klicken Sie auf &amp;lt;span style=&amp;quot;color: #598527&amp;quot;&amp;gt;&#039;&#039;&#039;Datei &amp;amp;gt; Neu &amp;amp;gt; Weitere &amp;amp;gt; {{CBuilder}}-Projekte&#039;&#039;&#039;&amp;lt;/span&amp;gt;, und doppelklicken Sie auf &#039;&#039;&#039;Konsolenanwendung&#039;&#039;&#039;. Das Dialogfeld [[Neue Konsolenanwendung (C++)|Neue Konsolenanwendung (C++)]] wird geöffnet.&lt;br /&gt;
# Wählen Sie den Quelltyp (C oder C++) für das Hauptmodul des Projekts aus, oder aktivieren Sie &#039;&#039;&#039;Angabe der Projektquelle&#039;&#039;&#039;, und geben Sie die bereits vorhandene Datei an, die eine &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;- oder &amp;lt;code&amp;gt;winmain&amp;lt;/code&amp;gt;-Funktion enthält.&lt;br /&gt;
# Geben Sie für C++ in der Gruppe &#039;&#039;&#039;Ziel-Framework&#039;&#039;&#039; den Anwendungstyp an, wenn Ihre Anwendung visuelle Komponenten anzeigen soll:&lt;br /&gt;
# Geben Sie für C++ in der Gruppe &amp;quot;Ziel-Framework&amp;quot; den Anwendungstyp an, wenn Ihre Anwendung visuelle Komponenten anzeigen soll:  &lt;br /&gt;
#* &#039;&#039;&#039;FireMonkey&#039;&#039;&#039;: Zum Erstellen einer FireMonkey-Anwendung&lt;br /&gt;
#* &#039;&#039;&#039;VCL&#039;&#039;&#039;: Zum Erstellen einer VCL-Anwendung&lt;br /&gt;
#* &#039;&#039;&#039;Keine&#039;&#039;&#039;: Ein Standard-Framework&lt;br /&gt;
#: &#039;&#039; {{Note| Obwohl in Konsolenanwendungen keine visuellen Komponenten angezeigt werden können, kann eine Konsolenanwendung visuelle Dateien einer Bibliothek (z. B. Symbole, Bitmaps, Video usw.) verarbeiten. Falls Sie beispielsweise im Experten nicht angeben, dass Sie die VCL verwenden möchten, können Sie keine VCL-Klassen in der Anwendung verwenden. Wenn Sie dies dennoch versuchen, werden Linker-Fehler produziert.}}&lt;br /&gt;
#: [[File:Console application.png|Neue Konsolenanwendung]]&lt;br /&gt;
# Klicken Sie auf &#039;&#039;&#039;OK&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Die IDE erstellt eine Projektdatei für diesen Quelldateityp und zeigt den &#039;&#039;&#039;[[Quelltext-Editor|Quelltext-Editor]]&#039;&#039;&#039; an.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;l e=&amp;quot;cpp&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Konsolenanwendungen müssen alle Exceptions behandeln==&lt;br /&gt;
&lt;br /&gt;
Bei Konsolenanwendungen müssen Sie sicherstellen, dass keine Exceptions außerhalb des Gültigkeitsbereichs des Programms auftreten. Ansonsten öffnet das Betriebssystem bei Programmende ein Dialogfeld mit Exception-Informationen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;l s=&amp;quot;cpp&amp;quot; /&amp;gt;&lt;br /&gt;
C++-Konsolenanwendungen sollten alle Exceptions behandeln, damit die Zielplattform nicht versucht, ein Dialogfeld bei der Ausführung der Konsolenanwendung anzuzeigen. Weitere Informationen finden Sie unter [[Exception-Behandlung in C++Builder|Exception-Behandlung in C++Builder]].&lt;br /&gt;
&amp;lt;l e=&amp;quot;cpp&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;l s=&amp;quot;delphi&amp;quot; /&amp;gt;&lt;br /&gt;
Beispielsweise sollte Ihre {{Delphi}}-Anwendung eine Exception-Behandlung wie im nachfolgenden Beispiel beinhalten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
program ConsoleExceptionHandling;&lt;br /&gt;
{$APPTYPE CONSOLE}&lt;br /&gt;
&lt;br /&gt;
uses&lt;br /&gt;
  SysUtils;&lt;br /&gt;
&lt;br /&gt;
procedure ExecuteProgram;&lt;br /&gt;
begin&lt;br /&gt;
  // Program does something&lt;br /&gt;
  raise Exception.Create(&#039;Unforeseen exception&#039;);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  try&lt;br /&gt;
    ExecuteProgram;&lt;br /&gt;
  except&lt;br /&gt;
    // Handle error condition&lt;br /&gt;
    WriteLn(&#039;Program terminated due to an exception&#039;);&lt;br /&gt;
    // Set ExitCode &amp;lt;&amp;gt; 0 to flag error condition (by convention)&lt;br /&gt;
    ExitCode := 1;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
end.&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;l e=&amp;quot;delphi&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Beenden der Konsolenanwendung==&lt;br /&gt;
&lt;br /&gt;
Konsolenanwendungen können folgendermaßen beendet werden:&lt;br /&gt;
&lt;br /&gt;
* Durch Klicken auf die Schaltfläche &#039;&#039;&#039;X (Schließen)&#039;&#039;&#039;.&lt;br /&gt;
* Mit der Tastenkombination &amp;lt;code&amp;gt;Strg+C&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Mit der Tastenkombination &amp;lt;code&amp;gt;Strg+Pause&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Durch Abmelden.&lt;br /&gt;
&lt;br /&gt;
Verwenden Sie zur Behandlung der Beendigungsanforderung durch den Benutzer die Windows-API-Funktion &#039;&#039;[http://msdn.microsoft.com/en-us/library/ms686016(v=vs.85).aspx SetConsoleCtrlHandler]&#039;&#039;. Je nach gewählter Methode wird die Anwendung evtl. erfolgreich geschlossen, der Prozess nicht sauber beendet und der finalization-Abschnitt nicht ausgeführt.&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
&lt;br /&gt;
* [[Service-Anwendungen|Service-Anwendungen]]&lt;br /&gt;
* [[lib_de:Vcl.Forms.TApplication|Vcl.Forms.TApplication]]&lt;br /&gt;
* [http://msdn.microsoft.com/en-us/library/ms686016(v=vs.85).aspx SetConsoleCtrlHandler]&lt;br /&gt;
* [[Exception-Behandlung in C++Builder|Exception-Behandlung in C++Builder]]&lt;br /&gt;
* [[Neue Konsolenanwendung (C++)|Neue Konsolenanwendung (C++)]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Windows-Entwicklerhandbuch]]&lt;br /&gt;
[[Category:Delphi]]&lt;br /&gt;
[[Category:C++]]&lt;br /&gt;
[[Category:FMX]]&lt;br /&gt;
&lt;br /&gt;
[[en:Console Applications]]&lt;br /&gt;
[[fr:Applications console]]&lt;br /&gt;
[[ja:コンソール アプリケーション]]&lt;/div&gt;</summary>
		<author><name>Nicolas.rios</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Neue_Datens%C3%A4tze_hinzuf%C3%BCgen&amp;diff=218565</id>
		<title>Neue Datensätze hinzufügen</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Neue_Datens%C3%A4tze_hinzuf%C3%BCgen&amp;diff=218565"/>
		<updated>2023-08-22T14:23:40Z</updated>

		<summary type="html">&lt;p&gt;Nicolas.rios: {{Note|&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Parent|Daten ändern}}&lt;br /&gt;
&lt;br /&gt;
Damit eine Anwendung Datensätze hinzufügen kann, muss sich die Datenmenge im Modus &#039;&#039;dsInsert&#039;&#039; befinden. Sie können im Quelltext die Methoden [[lib_de:Data.DB.TDataSet.Insert|Insert]] oder [[lib_de:Data.DB.TDataSet.Append|Append]] verwenden, um eine Datenmenge in den Status &#039;&#039;dsInsert&#039;&#039; zu versetzen, falls die Nur-Lesen-Eigenschaft [[lib_de:Data.DB.TDataSet.CanModify|CanModify]] der Datenmenge den Wert &#039;&#039;True&#039;&#039; hat.&lt;br /&gt;
&lt;br /&gt;
Beim Übergang einer Datenmenge in den Modus &#039;&#039;dsInsert&#039;&#039; empfängt diese ein Ereignis vom Typ &#039;&#039;BeforeInsert&#039;&#039;. Nachdem dieser Übergang erfolgreich abgeschlossen wurde, empfängt die Datenmenge zunächst ein Ereignis vom Typ &#039;&#039;OnNewRecord&#039;&#039; und danach eines vom Typ &#039;&#039;AfterInsert&#039;&#039;. Diese Ereignisse können z.B. zum Eintragen von Anfangswerten in neu eingefügte Datensätze verwendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 procedure TForm1.OrdersTableNewRecord(DataSet: TDataSet);&lt;br /&gt;
 begin&lt;br /&gt;
   DataSet.FieldByName(&#039;OrderDate&#039;).AsDateTime := Date;&lt;br /&gt;
 end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 void __fastcall TForm1::OrdersTableNewRecord(TDataSet *DataSet)&lt;br /&gt;
 {&lt;br /&gt;
   DataSet-&amp;gt;FieldByName(&amp;quot;OrderDate&amp;quot;)-&amp;gt;AsDateTime = Date();&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In Formularen einer Anwendung können datensensitive Gitter- und Navigator-Steuerelemente eine Datenmenge unter folgenden Voraussetzungen in den Status &#039;&#039;dsInsert&#039;&#039; versetzen:&lt;br /&gt;
&lt;br /&gt;
* Die Eigenschaft &#039;&#039;ReadOnly&#039;&#039; des Steuerelements ist auf &#039;&#039;False&#039;&#039; gesetzt (Voreinstellung);&lt;br /&gt;
* &#039;&#039;CanModify&#039;&#039; hat für die Datenmenge den Wert &#039;&#039;True&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{{Note| Selbst wenn sich eine Datenmenge im Status &#039;&#039;dsInsert&#039;&#039; befindet, kann das Hinzufügen von Datensätzen bei SQL-Datenbanken dennoch scheitern, wenn der Benutzer der Anwendung nicht über die geeigneten SQL-Zugriffsberechtigungen verfügt.}}&lt;br /&gt;
&lt;br /&gt;
Wenn sich eine Datenmenge im Modus &#039;&#039;dsInsert&#039;&#039; befindet, kann ein Benutzer oder eine Anwendung Werte in die Felder des neuen Datensatzes eingeben. Außer bei Gittern und Navigatoren gibt es für den Benutzer keinen sichtbaren Unterschied zwischen &#039;&#039;Insert&#039;&#039; und &#039;&#039;Append&#039;&#039;. Bei einem Aufruf von &#039;&#039;Insert&#039;&#039; erscheint im Gitter über dem vorher aktuellen Datensatz eine leere Zeile. Ein Aufruf von &#039;&#039;Append&#039;&#039; hat einen Bildlauf zum letzten Datensatz im Gitter zur Folge. Am unteren Ende des Gitters wird eine leere Zeile eingefügt, und in allen mit der Datenmenge verbundenen Navigator-Komponenten werden die Schaltflächen [[lib_de:Data.DB.TDataSet.Next|Next]] und [[lib_de:Data.DB.TDataSet.Last|Last]] deaktiviert.&lt;br /&gt;
&lt;br /&gt;
Im Einfügemodus rufen datensensitive Steuerelemente automatisch die Methode [[lib_de:Data.DB.TDataSet.Post|Post]] auf, wenn ein Benutzer eine Aktion ausführt, die den aktuellen Datensatz wechselt. Dies ist z.B. der Fall, wenn eine Bewegung zu einem anderen Datensatz im Gitter erfolgt. Ansonsten muss zum Eintragen der Änderungen &#039;&#039;Post&#039;&#039; aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Post&#039;&#039; schreibt den neuen Datensatz in die Datenbank. Wenn die aktualisierten Datensätze in einem Cache zwischengespeichert werden, werden die Änderungen zunächst in einen temporären Puffer geschrieben. Rufen Sie die Methode &#039;&#039;ApplyUpdates&#039;&#039; auf, um im Cache zwischengespeicherte eingefügte und angehängte Datensätze in die Datenbank zu schreiben.&lt;br /&gt;
&lt;br /&gt;
==Datensätze einfügen==&lt;br /&gt;
&lt;br /&gt;
Die Methode [[lib_de:Data.DB.TDataSet.Insert|Insert]] öffnet vor dem aktuellen Datensatz einen neuen, leeren Datensatz. Dieser neue Datensatz wird gleichzeitig zum aktuellen Datensatz, so dass die Eingabe von Feldwerten durch den Benutzer oder die Anwendung möglich ist.&lt;br /&gt;
&lt;br /&gt;
Wenn eine Anwendung die Methode [[lib_de:Data.DB.TDataSet.Post|Post]] (bzw. &#039;&#039;ApplyUpdates&#039;&#039;, wenn die Aktualisierungen im Cache zwischengespeichert werden) aufruft, wird ein neu eingefügter Datensatz auf folgende Weise in die Datenbank geschrieben:&lt;br /&gt;
&lt;br /&gt;
* Bei indizierten Paradox- und dBASE-Tabellen wird der Datensatz an der Position in die Datenmenge eingefügt, die sich anhand seines Index ergibt.&lt;br /&gt;
* Bei nicht indizierten Paradox- und dBASE-Tabellen wird der Datensatz an seiner aktuellen Position in die Datenmenge eingefügt.&lt;br /&gt;
* Bei SQL-Datenbanken ist die Einfügeposition von der Implementierung abhängig. Wenn die Tabelle indiziert ist, wird der Index mit der neuen Datensatzinformation aktualisiert.&lt;br /&gt;
&lt;br /&gt;
==Datensätze anhängen==&lt;br /&gt;
&lt;br /&gt;
Die Methode [[lib_de:Data.DB.TDataSet.Append|Append]] öffnet am Ende der Datenmenge einen neuen leeren Datensatz und macht ihn zum aktuellen Datensatz. Der Benutzer oder eine Anwendung können dann Feldwerte in diesen Datensatz eingeben.&lt;br /&gt;
&lt;br /&gt;
Wenn eine Anwendung die Methode [[lib_de:Data.DB.TDataSet.Post|Post]] (bzw. &#039;&#039;ApplyUpdates&#039;&#039;, wenn die Aktualisierungen im Cache zwischengespeichert werden) aufruft, wird ein an die Datenmenge angehängter Datensatz auf folgende Weise in die Datenbank geschrieben:&lt;br /&gt;
&lt;br /&gt;
* Bei indizierten Paradox- und dBASE-Tabellen wird der Datensatz an der Position in die Datenmenge eingefügt, die sich anhand seines Index ergibt.&lt;br /&gt;
* Bei nicht indizierten Paradox- und dBASE-Tabellen wird der Datensatz am Ende der Datenmenge hinzugefügt.&lt;br /&gt;
* Bei SQL-Datenbanken ist die physikalische Position des Datensatzes von der jeweiligen Implementierung abhängig. Wenn die Tabelle indiziert ist, wird der Index mit der neuen Datensatzinformation aktualisiert.&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
&lt;br /&gt;
* [[Datensätze bearbeiten|Datensätze bearbeiten]]&lt;br /&gt;
* [[Datensätze löschen|Datensätze löschen]]&lt;br /&gt;
* [[Geänderte Daten in die Datenbank zurückschreiben|Geänderte Daten in die Datenbank zurückschreiben]]&lt;br /&gt;
* [[Änderungen abbrechen|Änderungen abbrechen]]&lt;br /&gt;
* [[Komplette Datensätze bearbeiten|Komplette Datensätze bearbeiten]]&lt;br /&gt;
&lt;br /&gt;
==Codebeispiele==&lt;br /&gt;
&lt;br /&gt;
* [[samp_en:AfterInsert (Delphi)|AfterInsert ({{Delphi}})]]&lt;br /&gt;
&lt;br /&gt;
{{DEFAULTSORT:Neue Datensatze hinzufugen}}&lt;br /&gt;
[[Category:Windows-Entwicklerhandbuch]]&lt;br /&gt;
[[Category:Delphi]]&lt;br /&gt;
[[Category:C++]]&lt;br /&gt;
&lt;br /&gt;
[[en:Adding New Records]]&lt;br /&gt;
[[fr:Ajout de nouveaux enregistrements]]&lt;br /&gt;
[[ja:新規レコードの追加]]&lt;/div&gt;</summary>
		<author><name>Nicolas.rios</name></author>
	</entry>
</feed>