<?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=Rrivero</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=Rrivero"/>
	<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/de/Spezial:Beitr%C3%A4ge/Rrivero"/>
	<updated>2026-09-02T02:23:53Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Methoden_(Delphi)&amp;diff=218528</id>
		<title>Methoden (Delphi)</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Methoden_(Delphi)&amp;diff=218528"/>
		<updated>2023-05-24T14:06:51Z</updated>

		<summary type="html">&lt;p&gt;Rrivero: RS-114150. Added static to Binding Methods enumeration&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Parent|Klassen und Objekte - Index}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&amp;lt;ideTag id=&amp;quot;reintroduce&amp;quot;&amp;gt;&amp;lt;/ideTag&amp;gt;&lt;br /&gt;
&amp;lt;ideTag id=&amp;quot;overload&amp;quot;&amp;gt;&amp;lt;/ideTag&amp;gt;&lt;br /&gt;
&amp;lt;ideTag id=&amp;quot;abstract&amp;quot;&amp;gt;&amp;lt;/ideTag&amp;gt;&lt;br /&gt;
&amp;lt;ideTag id=&amp;quot;virtual&amp;quot;&amp;gt;&amp;lt;/ideTag&amp;gt;&lt;br /&gt;
&amp;lt;ideTag id=&amp;quot;dynamic&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;pascal&amp;quot;&amp;gt;&amp;lt;/ideTag&amp;gt;&lt;br /&gt;
&amp;lt;ideTag id=&amp;quot;cdecl&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;safecall&amp;quot;&amp;gt;&amp;lt;/ideTag&amp;gt;&lt;br /&gt;
&amp;lt;ideTag id=&amp;quot;platform&amp;quot;&amp;gt;&amp;lt;/ideTag&amp;gt;&lt;br /&gt;
&amp;lt;ideTag id=&amp;quot;deprecated&amp;quot;&amp;gt;&amp;lt;/ideTag&amp;gt;&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;inherited&amp;quot;&amp;gt;&amp;lt;/ideTag&amp;gt;&lt;br /&gt;
&amp;lt;ideTag id=&amp;quot;Self&amp;quot;&amp;gt;&amp;lt;/ideTag&amp;gt;&lt;br /&gt;
&amp;lt;ideTag id=&amp;quot;static&amp;quot;&amp;gt;&amp;lt;/ideTag&amp;gt;&lt;br /&gt;
&amp;lt;ideTag id=&amp;quot;override&amp;quot;&amp;gt;&amp;lt;/ideTag&amp;gt;&lt;br /&gt;
&amp;lt;ideTag id=&amp;quot;final&amp;quot;&amp;gt;&amp;lt;/ideTag&amp;gt;&lt;br /&gt;
&amp;lt;ideTag id=&amp;quot;class&amp;quot;&amp;gt;&amp;lt;/ideTag&amp;gt;&lt;br /&gt;
&amp;lt;ideTag id=&amp;quot;read&amp;quot;&amp;gt;&amp;lt;/ideTag&amp;gt;&lt;br /&gt;
&amp;lt;ideTag id=&amp;quot;write&amp;quot;&amp;gt;&amp;lt;/ideTag&amp;gt;&lt;br /&gt;
&amp;lt;ideTag id=&amp;quot;constructor&amp;quot;&amp;gt;&amp;lt;/ideTag&amp;gt;&lt;br /&gt;
&amp;lt;ideTag id=&amp;quot;nill&amp;quot;&amp;gt;&amp;lt;/ideTag&amp;gt;&lt;br /&gt;
&amp;lt;ideTag id=&amp;quot;if&amp;quot;&amp;gt;&amp;lt;/ideTag&amp;gt;&lt;br /&gt;
&amp;lt;ideTag id=&amp;quot;destructor&amp;quot;&amp;gt;&amp;lt;/ideTag&amp;gt;&lt;br /&gt;
&amp;lt;ideTag id=&amp;quot;message&amp;quot;&amp;gt;&amp;lt;/ideTag&amp;gt;&lt;br /&gt;
&amp;lt;ideTag id=&amp;quot;DefaultHandler&amp;quot;&amp;gt;&amp;lt;/ideTag&amp;gt;&lt;br /&gt;
&amp;lt;ideTag id=&amp;quot;Dispatch&amp;quot;&amp;gt;&amp;lt;/ideTag&amp;gt;&lt;br /&gt;
Eine Methode ist eine Prozedur oder Funktion, die zu einer bestimmten Klasse gehört. Daher wird beim Aufruf einer Methode das Objekt (bzw. bei einer Klassenmethode die Klasse) angegeben, mit dem die Operation durchgeführt werden soll. &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;SomeObject.Free&amp;lt;/span&amp;gt; ruft beispielsweise die Methode &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Free&amp;lt;/span&amp;gt; in &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;SomeObject&amp;lt;/span&amp;gt; auf.&lt;br /&gt;
&lt;br /&gt;
In diesem Thema wird Folgendes behandelt:&lt;br /&gt;
&lt;br /&gt;
* Methodendeklarationen und -implementierungen&lt;br /&gt;
* Methodenbindung&lt;br /&gt;
* Methoden überladen&lt;br /&gt;
* Konstruktoren und Destruktoren&lt;br /&gt;
* Botschaftsmethoden&lt;br /&gt;
&lt;br /&gt;
==Allgemeines zu Methoden==&lt;br /&gt;
&lt;br /&gt;
Methoden werden in der Deklaration einer Klasse als Prozedur- und Funktionsköpfe angegeben, die wie Vorwärtsdeklarationen (&#039;&#039;&#039;forward&#039;&#039;&#039;) arbeiten. Die jeweilige Methode muss dann nach der Klassendefinition in demselben Modul durch eine definierende Deklaration implementiert werden. Die Deklaration der Klasse &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;TMyClass&amp;lt;/span&amp;gt; im folgenden Beispiel enthält eine Methode mit dem Namen &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;DoSomething&amp;lt;/span&amp;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;
    TMyClass = class(TObject)&lt;br /&gt;
       ...&lt;br /&gt;
       procedure DoSomething;&lt;br /&gt;
       ...&lt;br /&gt;
    end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weiter unten in demselben Modul wird die definierende Deklaration für &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;DoSomething&amp;lt;/span&amp;gt; implementiert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 procedure TMyClass.DoSomething;&lt;br /&gt;
 begin&lt;br /&gt;
      ...&lt;br /&gt;
 end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Während eine Klasse im interface- oder implementation-Abschnitt einer Unit deklariert werden kann, müssen die definierenden Deklarationen ihrer Methoden im implementation-Abschnitt stehen.&lt;br /&gt;
&lt;br /&gt;
Im Kopf einer definierenden Deklaration wird der Name der Methode immer mit der Klasse qualifiziert, zu der die Methode gehört. Optional kann auch die Parameterliste aus der Klassendeklaration wiederholt werden, doch müssen in diesem Fall Reihenfolge, Typ und Namen der Parameter genau übereinstimmen. Bei einer Funktion muss auch der Rückgabewert identisch sein.&lt;br /&gt;
&lt;br /&gt;
Methodendeklarationen können spezielle Direktiven enthalten, die in anderen Funktionen oder Prozeduren nicht verwendet werden. Direktiven müssen in der Klassendeklaration enthalten sein (nicht in der definierenden Deklaration) und in der folgenden Reihenfolge angegeben werden:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;reintroduce&#039;&#039;&#039;; &#039;&#039;&#039;overload&#039;&#039;&#039;; [[#Methodenbindung|Bindung]]; [[Prozeduren und Funktionen (Delphi)#Aufrufkonventionen|Aufrufkonvention]]; &#039;&#039;&#039;abstract&#039;&#039;&#039;; [[Deklarationen und Anweisungen (Delphi)#Hinweis-Direktiven|Warnung]]&lt;br /&gt;
&lt;br /&gt;
Beschreibung:&lt;br /&gt;
&lt;br /&gt;
* [[#Methodenbindung|Bindung]] ist &#039;&#039;&#039;static&#039;&#039;&#039;, &#039;&#039;&#039;virtual&#039;&#039;&#039;, &#039;&#039;&#039;dynamic&#039;&#039;&#039; oder &#039;&#039;&#039;override&#039;&#039;&#039;.&lt;br /&gt;
* Die [[Prozeduren und Funktionen (Delphi)#Aufrufkonventionen|Aufrufkonvention]] lautet &#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; oder &#039;&#039;&#039;safecall&#039;&#039;&#039;;&lt;br /&gt;
* [[Deklarationen und Anweisungen (Delphi)#Hinweis-Direktiven|Warnung]] ist &#039;&#039;&#039;platform&#039;&#039;&#039;, &#039;&#039;&#039;deprecated&#039;&#039;&#039; oder &#039;&#039;&#039;library&#039;&#039;&#039;. Weitere Informationen zu diesen Warnungs-Direktiven finden Sie unter [[Deklarationen und Anweisungen (Delphi)#Hinweis-Direktiven|Hinweis-Direktiven]].  &lt;br /&gt;
&lt;br /&gt;
Alle {{Delphi}}-Direktiven sind unter [[Grundlegende syntaktische Elemente (Delphi)#Direktiven|Direktiven]] aufgelistet.&lt;br /&gt;
&lt;br /&gt;
===Inherited===&lt;br /&gt;
&lt;br /&gt;
Das reservierte Wort &#039;&#039;&#039;inherited&#039;&#039;&#039; ist für die Implementierung von polymorphem Verhalten von großer Bedeutung. Es kann in Methodendefinitionen (mit oder ohne nachfolgendem Bezeichner) angegeben werden.&lt;br /&gt;
&lt;br /&gt;
Folgt auf &#039;&#039;&#039;inherited&#039;&#039;&#039; ein Member-Name, entspricht dies einem normalen Methodenaufruf bzw. einer Referenz auf eine Eigenschaft oder ein Feld. Der einzige Unterschied besteht darin, dass die Suche nach dem referenzierten Member bei dem direkten Vorfahren der Klasse beginnt, zu der die Methode gehört. Wenn Sie beispielsweise&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 inherited Create(...);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
in der Definition einer Methode angeben, wird die geerbte Methode &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Create&amp;lt;/span&amp;gt; aufgerufen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;inherited&#039;&#039;&#039; ohne Bezeichner verweist auf die geerbte Methode mit demselben Namen wie die aufrufende Methode. Handelt es sich bei der aufrufenden Methode um eine Botschaftsbehandlung, verweist diese auf die geerbte Botschaftsbehandlung für dieselbe Botschaft. In diesem Fall übernimmt &#039;&#039;&#039;inherited&#039;&#039;&#039; keine expliziten Parameter, sondern der geerbten Methode werden einfach die Parameter der aufrufenden Methode übergeben. Zum Beispiel wird&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 inherited;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
häufig in der Implementierung von Konstruktoren verwendet. Der geerbte Konstruktor wird mit den Parametern aufgerufen, die an die abgeleitete Klasse übergeben wurden.&lt;br /&gt;
&lt;br /&gt;
===Self===&lt;br /&gt;
&lt;br /&gt;
Der Bezeichner &#039;&#039;&#039;Self&#039;&#039;&#039; verweist in der Implementierung einer Methode auf das Objekt, in dem die Methode aufgerufen wird. Das folgende Beispiel zeigt die Methode &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Add&amp;lt;/span&amp;gt; der Klasse TCollection in der Unit &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Classes&amp;lt;/span&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 function TCollection.Add: TCollectionItem;&lt;br /&gt;
 begin&lt;br /&gt;
     Result := FItemClass.Create(Self);&lt;br /&gt;
 end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Add&amp;lt;/span&amp;gt; ruft die Methode &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Create&amp;lt;/span&amp;gt; der Klasse auf, die das Feld &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;FItemClass&amp;lt;/span&amp;gt; referenziert (ist immer ein Nachkomme von TCollectionItem). Da an &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;TCollectionItem.Create&amp;lt;/span&amp;gt; ein einzelner Parameter des Typs TCollection übergeben wird, übergibt &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Add&amp;lt;/span&amp;gt; die Instanz von TCollection, in der &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Add&amp;lt;/span&amp;gt; aufgerufen wird. Der folgende Code veranschaulicht dies:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 var MyCollection: TCollection;&lt;br /&gt;
     ...&lt;br /&gt;
     MyCollection.Add   // MyCollection is passed to the &lt;br /&gt;
                        // TCollectionItem.Create method&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Self&#039;&#039;&#039; ist in vielen Situationen hilfreich. So kann beispielsweise ein Member-Bezeichner, der in einem Klassentyp deklariert ist, in einer Methode dieser Klasse erneut deklariert werden. In diesem Fall kann mit &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Self.Identifier&amp;lt;/span&amp;gt; auf den ursprünglichen Member-Bezeichner zugegriffen werden.&lt;br /&gt;
&lt;br /&gt;
Informationen zu &#039;&#039;&#039;Self&#039;&#039;&#039; in Klassenmethoden finden Sie unter &amp;quot;Klassenoperatoren&amp;quot; in [[Klassenreferenzen|Klassenreferenzen]].&lt;br /&gt;
&lt;br /&gt;
==Methodenbindung==&lt;br /&gt;
&lt;br /&gt;
Methodenbindungen können &#039;&#039;&#039;static&#039;&#039;&#039; (statisch, Standard), &#039;&#039;&#039;virtual&#039;&#039;&#039; (virtuell) oder &#039;&#039;&#039;dynamic&#039;&#039;&#039; (dynamisch) sein. Virtuelle und dynamische Methoden können überschrieben werden, und sie können abstrakt sein. Diese Angaben spielen eine Rolle, wenn eine Variable eines bestimmten Klassentyps eine Instanz einer abgeleiteten Klasse enthält. Sie bestimmen dann, welche Implementierung beim Aufruf der Methode aktiviert wird.&lt;br /&gt;
&lt;br /&gt;
===Statische Methoden===&lt;br /&gt;
&lt;br /&gt;
Methoden sind standardmäßig statisch. Beim Aufruf bestimmt der deklarierte Typ (also der Typ zur Compilierzeit) der im Aufruf verwendeten Klassen- bzw. Objektvariable, welche Implementierung aktiviert wird. Die &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Draw&amp;lt;/span&amp;gt;-Methoden im folgenden Beispiel sind statisch:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 type&lt;br /&gt;
     TFigure = class&lt;br /&gt;
       procedure Draw;&lt;br /&gt;
     end;&lt;br /&gt;
 &lt;br /&gt;
     TRectangle = class(TFigure)&lt;br /&gt;
       procedure Draw;&lt;br /&gt;
     end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ausgehend von diesen Deklarationen zeigt das folgende Beispiel, wie sich Aufrufe statischer Methoden auswirken. Im zweiten Aufruf von &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Figure.Draw&amp;lt;/span&amp;gt; referenziert die Variable &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Figure&amp;lt;/span&amp;gt; ein Objekt der Klasse &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;TRectangle&amp;lt;/span&amp;gt;. Es wird jedoch die &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Draw&amp;lt;/span&amp;gt;-Implementierung in &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;TFigure&amp;lt;/span&amp;gt; aufgerufen, weil &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Figure&amp;lt;/span&amp;gt; als &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;TFigure&amp;lt;/span&amp;gt; deklariert ist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 var&lt;br /&gt;
     Figure: TFigure;&lt;br /&gt;
     Rectangle: TRectangle;&lt;br /&gt;
 &lt;br /&gt;
     begin&lt;br /&gt;
             Figure := TFigure.Create;&lt;br /&gt;
             Figure.Draw;              // calls TFigure.Draw&lt;br /&gt;
             Figure.Destroy;&lt;br /&gt;
             Figure := TRectangle.Create;&lt;br /&gt;
             Figure.Draw;              // calls TFigure.Draw&lt;br /&gt;
 &lt;br /&gt;
             TRectangle(Figure).Draw;  // calls TRectangle.Draw&lt;br /&gt;
 &lt;br /&gt;
             Figure.Destroy;&lt;br /&gt;
             Rectangle := TRectangle.Create;&lt;br /&gt;
             Rectangle.Draw;          // calls TRectangle.Draw&lt;br /&gt;
             Rectangle.Destroy;&lt;br /&gt;
     end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Virtuelle und dynamische Methoden===&lt;br /&gt;
&lt;br /&gt;
Mithilfe der Direktiven &#039;&#039;&#039;virtual&#039;&#039;&#039; und &#039;&#039;&#039;dynamic&#039;&#039;&#039; können Methoden als &#039;&#039;&#039;virtual&#039;&#039;&#039; oder &#039;&#039;&#039;dynamic&#039;&#039;&#039; deklariert werden. Virtuelle und dynamische Methoden können im Gegensatz zu statischen Methoden in abgeleiteten Klassen überschrieben werden. Beim Aufrufen einer überschriebenen Methode bestimmt nicht der deklarierte, sondern der aktuelle Typ (also der Typ zur Laufzeit) der im Aufruf verwendeten Klassen- bzw. Objektvariable, welche Implementierung aktiviert wird.&lt;br /&gt;
&lt;br /&gt;
Um eine Methode zu überschreiben, wird sie mit der Direktive &#039;&#039;&#039;override&#039;&#039;&#039; erneut deklariert. Bei einer &#039;&#039;&#039;override&#039;&#039;&#039;-Deklaration müssen Reihenfolge und Typ der Parameter sowie der Typ des Rückgabewertes (falls vorhanden) mit der Deklaration in der Vorfahrklasse übereinstimmen.&lt;br /&gt;
&lt;br /&gt;
Im folgenden Beispiel wird die in der Klasse &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;TFigure&amp;lt;/span&amp;gt; deklarierte Methode &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Draw&amp;lt;/span&amp;gt; in zwei abgeleiteten Klassen überschrieben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 type&lt;br /&gt;
     TFigure = class&lt;br /&gt;
       procedure Draw; virtual;&lt;br /&gt;
     end;&lt;br /&gt;
 &lt;br /&gt;
     TRectangle = class(TFigure)&lt;br /&gt;
       procedure Draw; override;&lt;br /&gt;
     end;&lt;br /&gt;
 &lt;br /&gt;
     TEllipse = class(TFigure)&lt;br /&gt;
       procedure Draw; override;&lt;br /&gt;
     end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ausgehend von diesen Deklarationen zeigt der folgende Programmcode, wie sich der Aufruf einer virtuellen Methode durch eine Variable auswirkt, deren aktueller Typ zur Laufzeit geändert 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;
    Figure: TFigure;&lt;br /&gt;
 &lt;br /&gt;
    begin&lt;br /&gt;
      Figure := TRectangle.Create;&lt;br /&gt;
      Figure.Draw;      // calls TRectangle.Draw&lt;br /&gt;
      Figure.Destroy;&lt;br /&gt;
      Figure := TEllipse.Create;&lt;br /&gt;
      Figure.Draw;      // calls TEllipse.Draw&lt;br /&gt;
      Figure.Destroy;&lt;br /&gt;
    end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nur &#039;&#039;&#039;virtuelle&#039;&#039;&#039; und &#039;&#039;&#039;dynamische&#039;&#039;&#039; Methoden können überschrieben werden. Alle Methoden können jedoch überladen werden (siehe [[#Methoden überladen|Methoden überladen]].&lt;br /&gt;
&lt;br /&gt;
====Finale Methoden====&lt;br /&gt;
&lt;br /&gt;
Der {{Delphi}}-Compiler unterstützt auch das Konzept der &#039;&#039;&#039;finalen&#039;&#039;&#039; virtuellen und dynamischen Methoden. Deklarationen der finalen Methoden haben die Form:&lt;br /&gt;
&lt;br /&gt;
 function|procedure FunctionName; virtual|dynamic; final; &lt;br /&gt;
&lt;br /&gt;
Hier wird mit der Syntax &amp;lt;code&amp;gt;virtual|dynamic&amp;lt;/code&amp;gt; (zwei Schlüsselwörter und das Pipe-Zeichen &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt; dazwischen) festgelegt, dass nur eins der Schlüsselwörter &#039;&#039;&#039;virtual&#039;&#039;&#039; oder &#039;&#039;&#039;dynamic&#039;&#039;&#039; verwendet werden sollte. Nur die Schlüsselwörter &#039;&#039;&#039;virtual&#039;&#039;&#039; oder &#039;&#039;&#039;dynamic&#039;&#039;&#039; sind bedeutend; das Pipe-Zeichen selbst sollte gelöscht werden. &lt;br /&gt;
&lt;br /&gt;
Durch das Schlüsselwort &#039;&#039;&#039;final&#039;&#039;&#039; bei einer virtuellen oder dynamischen Methode kann verhindert werden, dass diese von einer abgeleiteten Klasse überschrieben wird. Mit dem Schlüsselwort &#039;&#039;&#039;final&#039;&#039;&#039; wird gleichzeitig dokumentiert, auf welche Weise die Klasse verwendet werden soll. Außerdem ermöglicht es dem Compiler eine Optimierung des generierten Codes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Die Schlüsselwörter &#039;&#039;&#039;virtual&#039;&#039;&#039; oder &#039;&#039;&#039;dynamic&#039;&#039;&#039; müssen vor dem Schlüsselwort &#039;&#039;&#039;final&#039;&#039;&#039; geschrieben werden.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
type&lt;br /&gt;
  Base = class&lt;br /&gt;
    procedure TestProcedure; virtual;&lt;br /&gt;
    procedure TestFinalProcedure; virtual; final;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  Derived = class(Base)&lt;br /&gt;
    procedure TestProcedure; override;&lt;br /&gt;
       //Ill-formed: E2352 Cannot override a final method&lt;br /&gt;
    procedure TestFinalProcedure; override;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Unterschiede zwischen virtuellen und dynamischen Methoden====&lt;br /&gt;
&lt;br /&gt;
In {{Delphi}} für Win32 sind virtuelle und dynamische Methoden von der Semantik her identisch. Sie unterscheiden sich aber bei der Implementierung der Aufrufweiterleitung zur Laufzeit: Virtuelle Methoden werden hinsichtlich der Geschwindigkeit, dynamische Methoden hinsichtlich der Codegröße optimiert.&lt;br /&gt;
&lt;br /&gt;
Im Allgemeinen kann mit virtuellen Methoden polymorphes Verhalten am effizientesten implementiert werden. Dynamische Methoden sind hilfreich, wenn in einer Basisklasse eine große Anzahl überschreibbarer Methoden deklariert ist, die von vielen abgeleiteten Klassen geerbt, aber nur selten überschrieben werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Verwenden Sie dynamische Methoden nur, wenn sich daraus ein nachweisbarer Nutzen ergibt. Im Allgemein sollten Sie eher virtuelle Methoden verwenden.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Unterschiede zwischen Überschreiben und Verdecken====&lt;br /&gt;
&lt;br /&gt;
Wenn in einer Methodendeklaration dieselbe Bezeichner- und Parametersignatur wie bei einer geerbten Methode ohne die Anweisung &#039;&#039;&#039;override&#039;&#039;&#039; angegeben wird, wird die geerbte Methode durch die neue Deklaration nur verdeckt, nicht überschrieben. Beide Methoden sind jedoch in der abgeleiteten Klasse vorhanden, in der der Methodenname statisch gebunden wird. 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;
    T1 = class(TObject)&lt;br /&gt;
       procedure Act; virtual;&lt;br /&gt;
    end;&lt;br /&gt;
 &lt;br /&gt;
    T2 = class(T1)&lt;br /&gt;
       procedure Act;   // Act is redeclared, but not overridden&lt;br /&gt;
    end;&lt;br /&gt;
 &lt;br /&gt;
 var&lt;br /&gt;
    SomeObject: T1;&lt;br /&gt;
 &lt;br /&gt;
 begin&lt;br /&gt;
    SomeObject := T2.Create;&lt;br /&gt;
    SomeObject.Act;    // calls T1.Act&lt;br /&gt;
 end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Reintroduce====&lt;br /&gt;
&lt;br /&gt;
Die Direktive &#039;&#039;&#039;reintroduce&#039;&#039;&#039; unterdrückt Compiler-Warnungen, wenn zuvor deklarierte virtuelle Methoden verdeckt werden. Zum Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 procedure DoSomething; reintroduce; // The ancestor class also &lt;br /&gt;
                                     // has a DoSomething method&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verwenden Sie &#039;&#039;&#039;reintroduce&#039;&#039;&#039;, wenn eine geerbte virtuelle Methode durch eine neue Deklaration verdeckt werden soll.&lt;br /&gt;
&lt;br /&gt;
====Abstrakte Methoden====&lt;br /&gt;
&lt;br /&gt;
Eine abstrakte Methode ist eine virtuelle oder dynamische Methode, die nicht in der Klasse implementiert ist, in der sie deklariert wird. Die Implementierung wird erst später in einer abgeleiteten Klasse durchgeführt. Bei der Deklaration abstrakter Methoden muss die Anweisung &#039;&#039;&#039;abstract&#039;&#039;&#039; nach &#039;&#039;&#039;virtual&#039;&#039;&#039; oder &#039;&#039;&#039;dynamic&#039;&#039;&#039; angegeben werden. Zum Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 procedure DoSomething; virtual; abstract;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine &#039;&#039;&#039;abstrakte&#039;&#039;&#039; Methode kann nur in einer Klasse oder Instanz einer Klasse aufgerufen werden, in der sie überschrieben wurde.&lt;br /&gt;
&lt;br /&gt;
==Klassenmethoden==&lt;br /&gt;
&lt;br /&gt;
Die meisten Methoden werden Instanzmethoden genannt, weil sie mit einer einzelnen Instanz eines Objekts arbeiten. Eine Klassenmethode ist eine Methode, die nicht mit Objekten, sondern mit Klassen arbeitet. Es gibt zwei Typen von Klassenmethoden: reguläre Klassenmethoden und klassenstatische Methoden.&lt;br /&gt;
&lt;br /&gt;
===Reguläre Klassenmethoden===&lt;br /&gt;
&lt;br /&gt;
Die Definition muss mit dem reservierten Wort &#039;&#039;&#039;class&#039;&#039;&#039; beginnen. 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;
   TFigure = class&lt;br /&gt;
   public&lt;br /&gt;
      class function Supports(Operation: string): Boolean; virtual;&lt;br /&gt;
      class procedure GetInfo(var Info: TFigureInfo); virtual;&lt;br /&gt;
      ...&lt;br /&gt;
   end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auch die definierende Deklaration einer Klassenmethode muss mit &#039;&#039;&#039;class&#039;&#039;&#039; eingeleitet werden. Zum Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 class procedure TFigure.GetInfo(var Info: TFigureInfo);&lt;br /&gt;
 begin&lt;br /&gt;
     ...&lt;br /&gt;
 end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der definierenden Deklaration einer Klassenmethode kann mit dem Bezeichner &#039;&#039;&#039;Self&#039;&#039;&#039; auf die Klasse zugegriffen werden, in der die Methode aufgerufen wird (dies kann auch ein Nachkomme der Klasse sein, in der sie definiert ist). Wird die Methode beispielsweise in der Klasse &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;C&amp;lt;/span&amp;gt; aufgerufen, hat &#039;&#039;&#039;Self&#039;&#039;&#039; den Typ &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;class of C&amp;lt;/span&amp;gt;. Daher können mit &#039;&#039;&#039;Self&#039;&#039;&#039; nicht auf Instanzfelder, Instanzeigenschaften und normale (Objekt-)Methoden zugreifen, sondern &#039;&#039;&#039;Self&#039;&#039;&#039; kann nur für Aufrufe von Konstruktoren und anderen Klassenmethoden oder für den Zugriff auf Klasseneigenschaften und Klassenfelder verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Eine Klassenmethode kann über eine Klassenreferenz oder eine Objektreferenz aufgerufen werden. Bei einer Objektreferenz erhält &#039;&#039;&#039;Self&#039;&#039;&#039; als Wert die Klasse des betreffenden Objekts.&lt;br /&gt;
&lt;br /&gt;
===Klassenstatische Methoden===&lt;br /&gt;
&lt;br /&gt;
Auf klassenstatische Methoden kann, wie auf Klassenmethoden, ohne Objektreferenz zugegriffen werden. Im Gegensatz zu regulären Klassenmethoden haben klassenstatische Methoden keinen &#039;&#039;&#039;Self&#039;&#039;&#039;-Parameter. Sie können außerdem auf keine Instanz-Member zugreifen. (Sie können aber auf Klassenfelder, Klasseneigenschaften und Klassenmethoden zugreifen.) Wiederum im Gegensatz zu Klassenmethoden können klassenstatische Methoden nicht als &#039;&#039;&#039;virtual&#039;&#039;&#039; deklariert werden.&lt;br /&gt;
&lt;br /&gt;
Um eine Methode als klassenstatisch zu deklarieren, fügen Sie das Wort &#039;&#039;&#039;static&#039;&#039;&#039; an die Deklaration an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 type&lt;br /&gt;
    TMyClass = class&lt;br /&gt;
      strict private&lt;br /&gt;
        class var&lt;br /&gt;
          FX: Integer;&lt;br /&gt;
 &lt;br /&gt;
      strict protected&lt;br /&gt;
        // Note: Accessors for class properties&lt;br /&gt;
        // must be declared class static.&lt;br /&gt;
        class function GetX: Integer; static;&lt;br /&gt;
        class procedure SetX(val: Integer); static;&lt;br /&gt;
 &lt;br /&gt;
      public&lt;br /&gt;
        class property X: Integer read GetX write SetX;&lt;br /&gt;
        class procedure StatProc(s: String); static;&lt;br /&gt;
    end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wie eine Klassenmethode kann eine klassenstatische Methode über den Klassentyp (also ohne Objektreferenz) aufgerufen werden, z. B.:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 TMyClass.X := 17;&lt;br /&gt;
 TMyClass.StatProc(&#039;Hello&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Methoden überladen==&lt;br /&gt;
&lt;br /&gt;
Eine Methode kann mit der Direktive &#039;&#039;&#039;overload&#039;&#039;&#039; neu deklariert werden. Wenn sich die Parametersignatur von der ihres Vorfahren unterscheidet, wird die geerbte Methode überladen, ohne dass sie dadurch verdeckt wird. Bei einem Aufruf der Methode in einer abgeleiteten Klasse wird dann diejenige Implementierung aktiviert, bei der die Parameter übereinstimmen.&lt;br /&gt;
&lt;br /&gt;
Verwenden Sie beim Überladen einer virtuellen Methode die Direktive &#039;&#039;&#039;reintroduce&#039;&#039;&#039;, wenn die Methode in einer abgeleiteten Klasse neu deklariert wird. 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;
   T1 = class(TObject)&lt;br /&gt;
     procedure Test(I: Integer); overload; virtual;&lt;br /&gt;
   end;&lt;br /&gt;
 &lt;br /&gt;
   T2 = class(T1)&lt;br /&gt;
     procedure Test(S: string); reintroduce; overload;&lt;br /&gt;
   end;&lt;br /&gt;
   ...&lt;br /&gt;
 &lt;br /&gt;
 SomeObject := T2.Create;&lt;br /&gt;
 SomeObject.Test(&#039;Hello!&#039;);       // calls T2.Test&lt;br /&gt;
 SomeObject.Test(7);              // calls T1.Test&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Innerhalb einer Klasse dürfen nicht mehrere überladene Methoden mit demselben Namen als published deklariert werden. Zur Pflege von Laufzeit-Typinformationen wird für jeden als &#039;&#039;&#039;published&#039;&#039;&#039; deklarierten Member ein eindeutiger Name benötigt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 type&lt;br /&gt;
     TSomeClass = class&lt;br /&gt;
       published&lt;br /&gt;
         function Func(P: Integer): Integer;&lt;br /&gt;
         function Func(P: Boolean): Integer;   // error&lt;br /&gt;
           ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Methoden, die als &#039;&#039;&#039;read&#039;&#039;&#039;- oder &#039;&#039;&#039;write&#039;&#039;&#039;-Bezeichner für Eigenschaften dienen, können nicht überladen werden.&lt;br /&gt;
&lt;br /&gt;
Bei der Implementierung einer überladenen Methode muss die Parameterliste aus der Klassendeklaration wiederholt werden. Weitere Informationen zum Überladen finden Sie unter [[Prozeduren und Funktionen (Delphi)#Prozeduren und Funktionen überladen|Prozeduren und Funktionen überladen]] in [[Prozeduren und Funktionen (Delphi)|Prozeduren und Funktionen (Delphi)]].&lt;br /&gt;
&lt;br /&gt;
==Konstruktoren==&lt;br /&gt;
&lt;br /&gt;
Ein Konstruktor ist eine spezielle Methode, mit der Instanzobjekte erstellt und initialisiert werden. Die Deklaration gleicht einer normalen Prozedurdeklaration, beginnt aber mit dem Wort &#039;&#039;&#039;constructor&#039;&#039;&#039;. Beispiele:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 constructor Create;&lt;br /&gt;
 constructor Create(AOwner: TComponent);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für Konstruktoren muss die Standard-Aufrufkonvention &#039;&#039;&#039;register&#039;&#039;&#039; verwendet werden. Obwohl die Deklaration keinen Rückgabewert enthält, gibt ein Konstruktor immer einen Verweis auf das Objekt zurück, das er erstellt bzw. in dem er aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
Eine Klasse kann auch mehrere Konstruktoren haben. Im Normalfall ist jedoch nur einer vorhanden. Konstruktoren heißen normalerweise immer &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Create&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Das folgende Beispiel zeigt, wie Sie ein Objekt durch einen Aufruf des Konstruktors eines Klassentyps erstellen können:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 MyObject := TMyClass.Create;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Anweisung reserviert zuerst Speicher für das neue Objekt. Anschließend wird allen Ordinalfeldern der Wert null, allen Zeigern und Klassentypfeldern der Wert &#039;&#039;&#039;nil&#039;&#039;&#039; und allen String-Feldern ein leerer String zugewiesen. Danach werden die weiteren Aktionen in der Implementierung des Konstruktors ausgeführt (z. B. Initialisieren der Objekte mit den als Parameter übergebenen Werten). Am Ende gibt der Konstruktor eine Referenz auf das neu erstellte und initialisierte Objekt zurück. Der Typ entspricht dem im Aufruf angegebenen Klassentyp.&lt;br /&gt;
&lt;br /&gt;
Tritt in einem mit einer Klassenreferenz aufgerufenen Konstruktor eine Exception auf, wird das unvollständige Objekt automatisch durch einen Aufruf des Destruktors &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Destroy&amp;lt;/span&amp;gt; freigegeben.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie einen Konstruktor mit einer Objektreferenz (anstatt mit einer Klassenreferenz) aufrufen, wird kein Objekt erstellt. Stattdessen werden, wie bei einer normalen Routine, die angegebenen Anweisungen mit dem Objekt ausgeführt, und es wird eine Referenz auf das Objekt zurückgegeben. Beim Aufruf mit einer Objektreferenz wird normalerweise der geerbte Konstruktor mit &#039;&#039;&#039;inherited&#039;&#039;&#039; ausgeführt.&lt;br /&gt;
&lt;br /&gt;
Das folgende Beispiel zeigt einen Klassentyp und den zugehörigen Konstruktor:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
  type&lt;br /&gt;
    TShape = class(TGraphicControl)&lt;br /&gt;
      private&lt;br /&gt;
        FPen: TPen;&lt;br /&gt;
        FBrush: TBrush;&lt;br /&gt;
        procedure PenChanged(Sender: TObject);&lt;br /&gt;
        procedure BrushChanged(Sender: TObject);&lt;br /&gt;
      public&lt;br /&gt;
        constructor Create(Owner: TComponent); override;&lt;br /&gt;
        destructor Destroy; override;&lt;br /&gt;
        ...&lt;br /&gt;
    end;&lt;br /&gt;
 &lt;br /&gt;
 constructor TShape.Create(Owner: TComponent);&lt;br /&gt;
 begin&lt;br /&gt;
     inherited Create(Owner);     // Initialize inherited parts&lt;br /&gt;
     Width := 65;          // Change inherited properties&lt;br /&gt;
     Height := 65;&lt;br /&gt;
     FPen := TPen.Create;  // Initialize new fields&lt;br /&gt;
     FPen.OnChange := PenChanged;&lt;br /&gt;
     FBrush := TBrush.Create;&lt;br /&gt;
     FBrush.OnChange := BrushChanged;&lt;br /&gt;
 end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als erste Anweisung wird in der Regel immer der geerbte Konstruktor aufgerufen, um die geerbten Felder zu initialisieren. Danach werden den in der abgeleiteten Klasse deklarierten Feldern Werte zugewiesen. Da der Konstruktor grundsätzlich den Speicherbereich bereinigt, der dem neuen Objekt zugewiesen wird, erhalten alle Felder automatisch den Anfangswert null (Ordinaltypen), &#039;&#039;&#039;nil&#039;&#039;&#039; (Zeiger und Klassentypen), einen leeren String (String-Typen) oder Unassigned (Varianten). Aus diesem Grund brauchen nur solche Felder explizit initialisiert zu werden, denen ein Anfangswert ungleich null (bzw. kein leerer String) zugewiesen werden soll.&lt;br /&gt;
&lt;br /&gt;
Ein als &#039;&#039;&#039;virtual&#039;&#039;&#039; deklarierter Konstruktor, der mit einem Klassentypbezeichner aufgerufen wird, entspricht einem statischen Konstruktor. In Verbindung mit Klassenreferenztypen können jedoch durch virtuelle Konstruktoren Objekte polymorph erstellt werden (d. h. der Objekttyp ist beim Compilieren noch nicht bekannt). Weitere Informationen finden Sie unter [[Klassenreferenzen|Klassenreferenzen]].&lt;br /&gt;
&lt;br /&gt;
==Destruktoren==&lt;br /&gt;
&lt;br /&gt;
Ein Destruktor ist eine spezielle Methode, die ein Objekt im Speicher freigibt. Die Deklaration gleicht einer Prozedurdeklaration, beginnt aber mit dem Wort &#039;&#039;&#039;destructor&#039;&#039;&#039;. Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 destructor SpecialDestructor(SaveData: Boolean);&lt;br /&gt;
 destructor Destroy; override;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In Win32 muss für Destruktoren die Standard-Aufrufkonvention &#039;&#039;&#039;register&#039;&#039;&#039; verwendet werden. Obwohl in einer Klasse mehrere Destruktoren implementiert werden können, ist es ratsam, nur die geerbte Methode &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Destroy&amp;lt;/span&amp;gt; zu überschreiben und keine weiteren Destruktoren zu deklarieren.&lt;br /&gt;
&lt;br /&gt;
Ein Destruktor kann nur über ein Instanzobjekt aufgerufen werden. Zum Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 MyObject.Destroy;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim Aufruf eines Destruktors werden zuerst die in der Implementierung angegebenen Aktionen ausgeführt. Normalerweise werden hier untergeordnete Objekte und zugewiesene Ressourcen freigegeben. Danach wird der durch das Objekt belegte Speicherplatz freigegeben.&lt;br /&gt;
&lt;br /&gt;
Das folgende Beispiel zeigt eine typische Destruktorimplementierung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 destructor TShape.Destroy;&lt;br /&gt;
 begin&lt;br /&gt;
     FBrush.Free;&lt;br /&gt;
     FPen.Free;&lt;br /&gt;
     inherited Destroy;&lt;br /&gt;
 end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die letzte Anweisung ruft den geerbten Destruktor auf, der die geerbten Felder freigibt.&lt;br /&gt;
&lt;br /&gt;
Wenn beim Erstellen eines Objekts eine Exception auftritt, wird das unvollständige Objekt automatisch durch einen Aufruf von Destroy freigegeben. &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Destroy&amp;lt;/span&amp;gt; muss daher auch in der Lage sein, Objekte freizugeben, die nur teilweise erstellt wurden. Da im Konstruktor alle Felder eines neuen Objekts zuerst mit null oder leeren Werten initialisiert werden, haben Klassen- und Zeigerfelder in einer unvollständigen Instanz immer den Wert &#039;&#039;&#039;nil&#039;&#039;&#039;. Testen Sie solche Felder im Destruktor immer auf den Wert &#039;&#039;&#039;nil&#039;&#039;&#039;, bevor Sie Operationen mit ihnen durchführen. Wenn Sie Objekte nicht mit &#039;&#039;&#039;Destroy&#039;&#039;&#039;, sondern mit der Methode &#039;&#039;&#039;Free&#039;&#039;&#039; (in &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;TObject&amp;lt;/span&amp;gt; definiert) freigeben, wird diese Prüfung automatisch durchgeführt.&lt;br /&gt;
&lt;br /&gt;
==Klassenkonstruktoren==&lt;br /&gt;
&lt;br /&gt;
Ein Klassenkonstruktor ist eine spezielle Klassenmethode, auf die von Entwicklern nicht zugegriffen werden kann. Aufrufe von Klassenkonstruktoren werden automatisch vom Compiler in den initialization-Abschnitt der Unit eingefügt, in der die Klasse definiert ist. In der Regel werden mit Klassenkonstruktoren die statischen Felder der Klasse initialisiert oder Initialisierungen ausgeführt, die erforderlich sind, damit die Klasse oder eine Klasseninstanz ordnungsgemäß arbeiten kann. Dasselbe Ergebnis kann zwar auch durch Einfügen des Klasseninitialisierungscodes in den &#039;&#039;initialization&#039;&#039;-Abschnitt erzielt werden, aber Klassenkonstruktoren unterstützen den Compiler bei der Entscheidung, welche Klassen in die endgültige Binärdatei aufgenommen und welche daraus entfernt werden sollen.&lt;br /&gt;
&lt;br /&gt;
Das nächste Beispiel zeigt eine normale Initialisierung von Klassenfeldern:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 type&lt;br /&gt;
   TBox = class&lt;br /&gt;
   private&lt;br /&gt;
     class var FList: TList&amp;lt;Integer&amp;gt;;&lt;br /&gt;
   end;&lt;br /&gt;
 &lt;br /&gt;
 implementation&lt;br /&gt;
 &lt;br /&gt;
 initialization&lt;br /&gt;
   { Initialize the static FList member }&lt;br /&gt;
   TBox.FList := TList&amp;lt;Integer&amp;gt;.Create();&lt;br /&gt;
 &lt;br /&gt;
 end.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieses Vorgehen hat einen entscheidenden Nachteil: Auch wenn eine Anwendung die Unit einbeziehen kann, in der &#039;&#039;&#039;TBox&#039;&#039;&#039; deklariert ist, kann es sein, dass die Klasse &#039;&#039;&#039;TBox&#039;&#039;&#039; tatsächlich nie verwendet wird. Im obigen Beispiel wird die Klasse TBox in die resultierende Binärdatei einbezogen, weil sie im initialization-Abschnitt referenziert wird. Mit Klassenkonstruktoren kann dieses Problem umgangen werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 type&lt;br /&gt;
   TBox = class&lt;br /&gt;
   private&lt;br /&gt;
     class var FList: TList&amp;lt;Integer&amp;gt;;&lt;br /&gt;
     class constructor Create;&lt;br /&gt;
   end;&lt;br /&gt;
 &lt;br /&gt;
 implementation&lt;br /&gt;
 &lt;br /&gt;
 class constructor TBox.Create;&lt;br /&gt;
 begin&lt;br /&gt;
   { Initialize the static FList member }&lt;br /&gt;
   FList := TList&amp;lt;Integer&amp;gt;.Create();&lt;br /&gt;
 end;&lt;br /&gt;
 &lt;br /&gt;
 end.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel überprüft der Compiler, ob TBox tatsächlich in der Anwendung verwendet wird. Falls ja, wird automatisch ein Aufruf des Klassenkonstruktors dem initialization-Abschnitt der Unit hinzugefügt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; In der Regel sorgt der Compiler für die richtige Reihenfolge der Initialisierung von Klassen, in einigen komplexen Szenarien könnte die Reihenfolge aber zufällig werden. Und zwar dann, wenn der Klassenkonstruktor einer Klasse vom Status einer anderen Klasse abhängig ist, der wiederum von der ersten Klasse abhängt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Der Klassenkonstruktor für eine generische Klasse oder einen Record kann mehrfach ausgeführt werden. Die genaue Anzahl der Ausführungen des Klassenkonstruktors hängt in diesem Fall von der Anzahl der spezialisierten Versionen des generischen Typs ab. Der Klassenkonstruktor für eine spezialisierte &#039;&#039;TList&amp;amp;lt;String&amp;amp;gt;&#039;&#039;-Klasse kann beispielsweise mehrfach in derselben Anwendung ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
==Klassendestruktoren==&lt;br /&gt;
&lt;br /&gt;
Klassendestruktoren sind das Gegenteil von Klassenkonstruktoren, und zwar weil sie die Finalisierung der Klasse vornehmen. Klassendestruktoren bieten dieselben Vorteile wie Klassenkonstruktoren, nur dass sie die &#039;&#039;Finalisierung&#039;&#039; vornehmen.&lt;br /&gt;
&lt;br /&gt;
Das folgende Beispiel baut auf dem Beispiel für Klassenkonstruktoren auf und führt die Finalisierungsroutine ein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 type&lt;br /&gt;
   TBox = class&lt;br /&gt;
   private&lt;br /&gt;
     class var FList: TList&amp;lt;Integer&amp;gt;;&lt;br /&gt;
     class constructor Create;&lt;br /&gt;
     class destructor Destroy;&lt;br /&gt;
   end;&lt;br /&gt;
 &lt;br /&gt;
 implementation&lt;br /&gt;
 &lt;br /&gt;
 class constructor TBox.Create;&lt;br /&gt;
 begin&lt;br /&gt;
   { Initialize the static FList member }&lt;br /&gt;
   FList := TList&amp;lt;Integer&amp;gt;.Create();&lt;br /&gt;
 end;&lt;br /&gt;
 &lt;br /&gt;
 class destructor TBox.Destroy;&lt;br /&gt;
 begin&lt;br /&gt;
   { Finalize the static FList member }&lt;br /&gt;
   FList.Free;&lt;br /&gt;
 end;&lt;br /&gt;
 &lt;br /&gt;
 end.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Der Klassendestruktor für eine generische Klasse oder einen Record kann mehrfach ausgeführt werden. Die genaue Anzahl der Ausführungen des Klassendestruktors hängt in diesem Fall von der Anzahl der spezialisierten Versionen des generischen Typs ab. Der Klassendestruktor für eine spezialisierte &#039;&#039;TList&amp;amp;lt;String&amp;amp;gt;&#039;&#039;-Klasse kann beispielsweise mehrfach in derselben Anwendung ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
==Botschaftsmethoden==&lt;br /&gt;
&lt;br /&gt;
In Botschaftsmethoden können Reaktionen auf dynamisch weitergeleitete Botschaften implementiert werden. Die Syntax für Botschaftsmethoden wird auf allen Plattformen unterstützt.  &amp;lt;f s=&amp;quot;vcl&amp;quot; t=&amp;quot;span&amp;quot; /&amp;gt; In der VCL werden Botschaftsmethoden verwendet, um auf Windows-Botschaften zu antworten. &amp;lt;f e=&amp;quot;vcl&amp;quot; t=&amp;quot;span&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sie erstellen eine Botschaftsmethode, indem Sie die Direktive &#039;&#039;&#039;message&#039;&#039;&#039; gefolgt von einer Integer-Konstante von 1 bis 49151 (der sogenannten Botschafts-ID) in eine Methodendeklaration aufnehmen.  &amp;lt;f s=&amp;quot;vcl&amp;quot; t=&amp;quot;span&amp;quot; /&amp;gt; In Botschaftsmethoden für VCL-Steuerelemente kann als Integer-Konstante eine der Botschafts-IDs von Win32 verwendet werden, die (zusammen mit den entsprechenden Record-Typen) in der Unit &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Messages&amp;lt;/span&amp;gt; definiert sind. &amp;lt;f e=&amp;quot;vcl&amp;quot; t=&amp;quot;span&amp;quot; /&amp;gt; Eine Botschaftsmethode muss eine Prozedur mit einem einzelnen &#039;&#039;&#039;var&#039;&#039;&#039;-Parameter sein.&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;
 type&lt;br /&gt;
     TTextBox = class(TCustomControl)&lt;br /&gt;
       private&lt;br /&gt;
        procedure WMChar(var Message: TWMChar); message WM_CHAR;&lt;br /&gt;
        ...&lt;br /&gt;
     end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In einer Botschaftsmethode muss die Direktive &#039;&#039;&#039;override&#039;&#039;&#039; nicht angegeben werden, um eine geerbte Botschaftsmethode zu überschreiben. Es muss nicht einmal derselbe Methodenname oder Parametertyp wie bei der zu überschreibenden Methode verwendet werden. Allein die Botschafts-ID bestimmt, auf welche Botschaft die Methode reagiert, und ob die Methode überschrieben wird.&lt;br /&gt;
&lt;br /&gt;
===Botschaftsmethoden implementieren===&lt;br /&gt;
&lt;br /&gt;
In der Implementierung einer Botschaftsmethode kann die geerbte Botschaftsmethode wie im folgenden Beispiel aufgerufen werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 procedure TTextBox.WMChar(var Message: TWMChar);&lt;br /&gt;
 begin&lt;br /&gt;
    if Message.CharCode = Ord(#13) then&lt;br /&gt;
       ProcessEnter&lt;br /&gt;
    else&lt;br /&gt;
       inherited;&lt;br /&gt;
 end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Anweisung &#039;&#039;&#039;inherited&#039;&#039;&#039; durchsucht die Klassenhierarchie nach oben und ruft die erste Botschaftsmethode mit derselben ID wie die aktuelle Methode auf. Dabei wird automatisch der Botschafts-Record übergeben. Ist in keiner Vorfahrklasse eine Botschaftsmethode mit dieser ID implementiert, ruft &#039;&#039;&#039;inherited&#039;&#039;&#039; die ursprünglich in TObject definierte Methode &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;DefaultHandler&amp;lt;/span&amp;gt; auf.&lt;br /&gt;
&lt;br /&gt;
Die Implementierung von &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;DefaultHandler&amp;lt;/span&amp;gt; in TObject gibt einfach die Steuerung zurück, ohne eine Aktion auszuführen. Durch Überschreiben von &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;DefaultHandler&amp;lt;/span&amp;gt; kann in einer Klasse eine eigene Standardbehandlung für Botschaften implementiert werden. In Win32 ruft die &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;DefaultHandler&amp;lt;/span&amp;gt;-Methode für Steuerelemente die &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;DefWindowProc&amp;lt;/span&amp;gt;-Funktion der Win32-API auf.&lt;br /&gt;
&lt;br /&gt;
===Botschaftsweiterleitung===&lt;br /&gt;
&lt;br /&gt;
Botschaftsmethoden werden normalerweise nicht direkt aufgerufen. Stattdessen werden Botschaften mithilfe der von TObject geerbten Methode &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Dispatch&amp;lt;/span&amp;gt; an ein Objekt weitergeleitet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 procedure Dispatch(var Message);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der an &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Dispatch&amp;lt;/span&amp;gt; übergebene Parameter &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Message&amp;lt;/span&amp;gt; muss ein Record sein, dessen erstes Element ein &#039;&#039;&#039;Word&#039;&#039;&#039;-Feld mit einer Botschafts-ID enthält.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Dispatch&amp;lt;/span&amp;gt; durchsucht die Klassenhierarchie nach oben (beginnend bei der Klasse des Objekts, in dem sie aufgerufen wird) und ruft die erste für die übergebene ID gefundene Botschaftsmethode auf. Wird keine solche Methode gefunden, ruft &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Dispatch&amp;lt;/span&amp;gt; die Methode &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;DefaultHandler&amp;lt;/span&amp;gt; auf.&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
&lt;br /&gt;
*[[Klassen und Objekte (Delphi)|Klassen und Objekte (Delphi)]]&lt;br /&gt;
*[[Felder (Delphi)|Felder (Delphi)]]&lt;br /&gt;
*[[Eigenschaften (Delphi)|Eigenschaften (Delphi)]]&lt;br /&gt;
*[[Verschachtelte Typdeklarationen|Verschachtelte Typdeklarationen]]&lt;br /&gt;
*[[Klassenreferenzen|Klassenreferenzen]]&lt;br /&gt;
*[[Exceptions (Delphi)|Exceptions (Delphi)]]&lt;br /&gt;
*[[Überladene Operatoren (Delphi)|Überladene Operatoren (Delphi)]]&lt;br /&gt;
*[[Unterstützende Klassen und Records (Delphi)|Unterstützende Klassen und Records (Delphi)]]&lt;br /&gt;
* [[Prozeduren und Funktionen (Delphi)|Prozeduren und Funktionen (Delphi)]]&lt;br /&gt;
* [[Ablaufsteuerung (Delphi)|Ablaufsteuerung (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:Methods (Delphi)]]&lt;br /&gt;
[[fr:Méthodes (Delphi)]]&lt;br /&gt;
[[ja:メソッド（Delphi）]]&lt;/div&gt;</summary>
		<author><name>Rrivero</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Formular-Designer&amp;diff=218034</id>
		<title>Formular-Designer</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Formular-Designer&amp;diff=218034"/>
		<updated>2022-12-19T15:32:27Z</updated>

		<summary type="html">&lt;p&gt;Rrivero: RS-115132. Removed HTML Designer Section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Parent|Einführung in RAD Studio}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;f s=&amp;quot;radstudio&amp;quot; /&amp;gt;&lt;br /&gt;
Der &#039;&#039;&#039;Formular-Designer&#039;&#039;&#039; (oder Designer) wird automatisch angezeigt, wenn Sie ein Formular, wie z. B. eine {{f|radstudio|[[VCL-Formularanwendung|VCL-Formularanwendung]] oder eine}} [[Geräteübergreifende HD-Anwendung|geräteübergreifende HD-Anwendung]], erstellen oder bearbeiten.&lt;br /&gt;
Der &#039;&#039;&#039;Formular-Designer&#039;&#039;&#039; wird automatisch ausgeführt, wenn Sie eine grafische Anwendung erstellen, die auf einer Formulardatei (entweder &amp;lt;code&amp;gt;.dfm&amp;lt;/code&amp;gt;- oder &amp;lt;code&amp;gt;.fmx&amp;lt;/code&amp;gt;-Datei) beruht.&lt;br /&gt;
&amp;lt;f e=&amp;quot;radstudio&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;f s=&amp;quot;appmethod&amp;quot; /&amp;gt;&lt;br /&gt;
Der &#039;&#039;&#039;Formular-Designer&#039;&#039;&#039; (oder Designer) wird automatisch angezeigt, wenn Sie ein Formular, wie z. B. eine [[Geräteübergreifende HD-Anwendung|geräteübergreifende HD-Anwendung]], erstellen oder bearbeiten.&lt;br /&gt;
Der &#039;&#039;&#039;Formular-Designer&#039;&#039;&#039; wird automatisch ausgeführt, wenn Sie eine grafische Anwendung erstellen, die auf einer Formulardatei (&amp;lt;code&amp;gt;.fmx&amp;lt;/code&amp;gt;-Datei) beruht.&lt;br /&gt;
&amp;lt;f e=&amp;quot;appmethod&amp;quot; /&amp;gt;&lt;br /&gt;
Um den Fokus für ein in der IDE geöffnetes visuelles Projekt in den &#039;&#039;&#039;Formular-Designer&#039;&#039;&#039; zu setzen, klicken Sie am unteren Rand des Hauptbearbeitungsfensters auf das Register &#039;&#039;&#039;Design&#039;&#039;&#039;:&lt;br /&gt;
[[Image:CodeDesignHistoryTabs.jpg|link=|Registerkarten &amp;quot;Code&amp;quot;, &amp;quot;Design&amp;quot; und &amp;quot;Historie&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
{{Note|Sie können das Fenster des [[Quelltext-Editor|Quelltext-Editors]] und des Formular-Designers gleichzeitg für dieselbe Unit mit [[Neues Editierfenster|Neues Editierfenster]] öffnen. Wenn Sie im Objektinspektor ein Ereignis erstellen oder auf eine Ereignisbehandlungsroutine doppelklicken, wird der Inhalt des Quelltext-Editorfensters an die Position des Ereignisses verschoben und das Fenster des Formular-Designers verbleibt unverändert.}}&lt;br /&gt;
&lt;br /&gt;
Der Typ des Formulars bestimmt das Aussehen und die Funktionalität des Designers. Wenn Sie beispielsweise ein HTML-Element verwenden, können Sie den [[Mit dem HTML-Tag-Editor arbeiten|HTML-Tag-Editor]] im Designer durch Auswahl von &amp;lt;font color=&amp;quot;#598527&amp;quot;&amp;gt; &#039;&#039;&#039;Ansicht &amp;amp;gt; Tag-Editor&#039;&#039;&#039;&amp;lt;/font&amp;gt; anzeigen.&lt;br /&gt;
&lt;br /&gt;
==Fenster des Formular-Designers==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;f s=&amp;quot;radstudio&amp;quot; /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;{{FM}} und die VCL verwenden unterschiedliche Formular-Designer und unterschiedliche Formulare:&amp;lt;br /&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
Die folgende Abbildung zeigt das &#039;&#039;&#039;geräteübergreifende Formular (FireMonkey)&#039;&#039;&#039; und das &#039;&#039;&#039;VCL-Formular&#039;&#039;&#039;, wie sie im &#039;&#039;&#039;Formular-Designer&#039;&#039;&#039; beim Erstellen einer [[Geräteübergreifende Anwendung|geräteübergreifenden Anwendung]] bzw. [[VCL-Formularanwendung|VCL-Formularanwendung]] erscheinen:&lt;br /&gt;
&lt;br /&gt;
&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;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&#039;&#039;&#039;Geräteübergreifendes Formular&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
[[Image:multidevice form.png|link=|Geräteübergreifendes Formular]]&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&#039;&#039;&#039;VCL-Formular&#039;&#039;&#039;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&lt;br /&gt;
[[Image:vcl form.png|link=|VCL-Formular]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die beiden Formulare unterscheiden sich, weil ein VCL-Formular ein natives Windows-Formular ist, während ein geräteübergreifendes Formular plattformunabhängig ist und von den {{FM}}-Tools gezeichnet wird. In einem VCL-Formular werden beispielsweise die Windows-Standardschaltflächen für die Befehle &amp;quot;Minimieren&amp;quot;, &amp;quot;Größe ändern&amp;quot; und &amp;quot;Schließen&amp;quot; angezeigt. Ein geräteübergreifendes Formular wird standardmäßig in der &#039;&#039;&#039;Master&#039;&#039;&#039;-Ansicht dargestellt, die plattformunabhängig ist. Eine geräteübergreifende Anwendung kann auf allen verfügbaren Plattformen ausgeführt werden, eine VCL-Anwendung dagegen nur auf Windows.&lt;br /&gt;
&lt;br /&gt;
Trotz dieser visuellen Unterschiede arbeitet der &#039;&#039;&#039;Formular-Designer&#039;&#039;&#039; für {{FM}} und für die VCL fast auf dieselbe Weise. Ein Unterschied ist, dass einige unterschiedliche [[#Kontextmenü|Kontextmenübefehle]] für {{FM}} und die VCL unterstützt werden.&lt;br /&gt;
&amp;lt;f e=&amp;quot;radstudio&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;f s=&amp;quot;appmethod&amp;quot; /&amp;gt;&lt;br /&gt;
So wird ein &#039;&#039;&#039;geräteübergreifendes Formular&#039;&#039;&#039; im &#039;&#039;&#039;Formular-Designer&#039;&#039;&#039; angezeigt, wenn Sie eine [[Geräteübergreifende Anwendung|geräteübergreifende Anwendung]] erstellen:&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;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&#039;&#039;&#039;Geräteübergreifendes Formular&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
[[Image:FireMonkeyForm.png|link=|Geräteübergreifendes Formular]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;f e=&amp;quot;appmethod&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Stilauswahl==&lt;br /&gt;
&lt;br /&gt;
[[File:Style selector.png|link=]]&lt;br /&gt;
&lt;br /&gt;
Der geräteübergreifende Formular-Designer enthält eine &#039;&#039;&#039;Stilauswahl&#039;&#039;&#039; zur Auswahl des grundlegenden Plattformstils, der in der &#039;&#039;&#039;Master&#039;&#039;&#039;-Ansicht beim Entwurf verwendet wird. Die Stile basieren auf den Plattformen, auf denen eine geräteübergreifende Anwendung ausgeführt werden kann:&lt;br /&gt;
&lt;br /&gt;
* Windows&lt;br /&gt;
* macOS&lt;br /&gt;
* iOS&lt;br /&gt;
* Android&lt;br /&gt;
&lt;br /&gt;
Wählen Sie den Stil der &#039;&#039;&#039;Master&#039;&#039;&#039;-Ansicht zur Entwurfszeit aus, um alle Eigenschaften für den ausgewählten Stil/die ausgewählte Plattform anzuzeigen. Wenn Sie beispielsweise die Eigenschaft &#039;&#039;&#039;StyleLookup&#039;&#039;&#039; für [[lib_de:FMX.StdCtrls.TButton|TButton]] für ein Android-Gerät festlegen möchten, wählen Sie den Stil &#039;&#039;&#039;Android&#039;&#039;&#039; aus. Daraufhin enthält das Dropdown-Menü des &#039;&#039;&#039;[[Objektinspektor|Objektinspektors]]&#039;&#039;&#039; für die Eigenschaft &#039;&#039;&#039;StyleLookup&#039;&#039;&#039; die für das Android-Gerät verfügbaren Optionen.&lt;br /&gt;
&lt;br /&gt;
==Ansichtsauswahl==&lt;br /&gt;
&lt;br /&gt;
Der geräteübergreifende &#039;&#039;&#039;Formular-Designer&#039;&#039;&#039; enthält eine &#039;&#039;&#039;Ansichtsauswahl&#039;&#039;&#039;, ein Dropdown-Menü, das alle &#039;&#039;&#039;verfügbaren&#039;&#039;&#039; Ansichten enthält, die verschiedene Geräte, wie spezielle iOS-, Android-, Windows- und OS X-Geräte, repräsentieren. Nach Auswahl von Ansichten aus der Liste &#039;&#039;&#039;Verfügbar&#039;&#039;&#039; für Ihr Projekt werden die Ansichten der Liste &#039;&#039;&#039;Erstellt&#039;&#039;&#039; hinzugefügt. Siehe &#039;&#039;&#039;[[Verwenden von FireMonkey-Ansichten|Verwenden von {{FM}}-Ansichten]]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
[[File:View selector.png|link=]]&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;&#039;Ansichtsauswahl&#039;&#039;&#039; enthält die folgenden Steuerelemente:&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; Symbol &#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; |&lt;br /&gt;
[[File:ViewSelectorMenu.png|link=]]&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
Wählt das aktuelle Ansicht aus einer Dropdown-Liste mit Ansichten aus.&lt;br /&gt;
Sie können Ihrem Projekt eine oder mehrere Ansichten hinzufügen, indem Sie einfach in der Liste &#039;&#039;&#039;Verfügbar&#039;&#039;&#039; auf die gewünschte Ansicht klicken. Siehe [[Hinzufügen von Ansichten zu einem geräteübergreifenden Projekt|Hinzufügen von Ansichten zu einem geräteübergreifenden Projekt]].&lt;br /&gt;
Sie können auch angepasste Ansichten erstellen und sie der &#039;&#039;&#039;Ansichtsauswahl&#039;&#039;&#039; hinzufügen.  Siehe [[Hinzufügen einer angepassten Ansicht zur Ansichtsauswahl|Hinzufügen einer angepassten Ansicht zur Ansichtsauswahl]].&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
[[File:RemoveViewIcon.png|link=]] &#039;&#039;&#039;Ansicht entfernen&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
Entfernt die aktuelle Ansicht. Das Dialogfeld &#039;&#039;&#039;Bestätigen&#039;&#039;&#039; wird angezeigt.&lt;br /&gt;
Die Ansicht wird aus dem Quelltext entfernt.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
[[File:RotateCurrentView.png|link=]] &#039;&#039;&#039;Aktuelle Ansicht drehen&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
Dreht die aktuelle Ansicht im Uhrzeigersinn um 90 Grad. Nur für mobile Ansichten (nicht für Desktop-Ansichten) verfügbar.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
[[File:HideShowFormFrame.png|link=]] &#039;&#039;&#039;Formularrahmen aus- oder einblenden&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
Blendet den Rahmen einer ausgewählten Ansicht aus (oder blendet einen zuvor ausgeblendeten Rahmen ein).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Visuelle Komponenten==&lt;br /&gt;
&lt;br /&gt;
Sie können einem {{f|appmethod|geräteübergreifenden}} {{f|radstudio|geräteübergreifenden oder VCL-}}Formular visuelle Komponenten hinzufügen, indem Sie ausgewählte Komponenten aus der &#039;&#039;&#039;[[Tool-Palette|Tool-Palette]]&#039;&#039;&#039; unten rechts in der IDE in das Formular ziehen. Unter visuellen Komponenten versteht man die Elemente, die für den Endbenutzer zur Laufzeit sichtbar sind. Die in der &#039;&#039;&#039;Tool-Palette&#039;&#039;&#039; verfügbaren Objekte ändern sich dynamisch je nach dem Typ der erstellten Anwendung bzw. des erstellten Formulars.&lt;br /&gt;
&lt;br /&gt;
Für jede der zahlreichen Tool-Kategorien enthält die &#039;&#039;&#039;[[Tool-Palette|Tool-Palette]]&#039;&#039;&#039; Steuerelemente, wie z. B. Schaltflächen, Beschriftungen, Symbolleisten und Listenfelder. Während der Arbeit auf Projektebene stehen verschiedene Anwendungstypen zur Auswahl (z. B. DLL-Experten und Konsolen- bzw. Logo-Anwendungen). Wenn Sie eine Webanwendung erstellen, sind Web-Steuerelemente, HTML-Elemente und Datenkomponenten verfügbar.&lt;br /&gt;
&lt;br /&gt;
Eigenschaften und Ereignisse für visuelle und nicht-visuelle Komponenten können Sie im Formular-Designer mit dem &#039;&#039;&#039;[[Objektinspektor|Objektinspektor]]&#039;&#039;&#039; anzeigen und festlegen.&lt;br /&gt;
&lt;br /&gt;
==Nicht-visuelle Komponenten==&lt;br /&gt;
&lt;br /&gt;
Nicht-visuelle Komponenten, wie z. B. [[lib_de:FMX.Types.TCustomTouchManager.GestureManager|GestureManager]], werden dem Formular während des Entwurfs hinzugefügt, sind aber zur Laufzeit für den Endbenutzer nicht sichtbar. Die nicht-visuellen Komponenten lassen sich für die Wiederverwendung von Datenbankgruppen und Systemobjekten einsetzen, um jene Teile einer Anwendung zu isolieren, die die Datenbankverbindung und die Geschäftsregeln behandeln.&lt;br /&gt;
&lt;br /&gt;
In der IDE können Sie nicht-visuelle Komponenten beim Entwurf [[Nicht-visuelle Komponenten ausblenden|ein- oder ausblenden]].&lt;br /&gt;
&lt;br /&gt;
==Kontextmenü==&lt;br /&gt;
&lt;br /&gt;
Wenn Sie im &#039;&#039;&#039;Formular-Designer&#039;&#039;&#039; mit der rechten Maustaste auf ein Formular klicken, wird das Kontextmenü angezeigt. {{f|radstudio|Sofern nicht anders in der Tabelle angegeben, sind die Kontextmenübefehle für die VCL und {{FM}} verfügbar.}}&lt;br /&gt;
&lt;br /&gt;
{{Note|In diesem Abschnitt werden nur Kontextmenübefehle für das Bearbeiten von Formularen beschrieben. Informationen zum Kontextmenü von Datenmodulen finden Sie unter [[Standard-Datenmodule erstellen und bearbeiten#Kontextmenü für Datenmodule|Kontextmenü für Datenmodule]].}}&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;
Eintrags-Editor&lt;br /&gt;
(bestimmte {{FM}}-Komponenten)&lt;br /&gt;
|&lt;br /&gt;
Öffnet den &#039;&#039;&#039;Eintrags-Designer&#039;&#039;&#039; mit dem Fokus auf dem ausgewählten Steuerelement.&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
Eintrag hinzufügen&lt;br /&gt;
(bestimmte {{FM}}-Komponenten)&lt;br /&gt;
|&lt;br /&gt;
Ermöglicht das Hinzufügen eines Eintrags zu dem auf dem Formular ausgewählten Steuerelement. Wenn Sie z. B. einem geräteübergreifenden Formular ein [[lib_de:FMX.Edit.TEdit|TEdit]]-Steuerelement hinzufügen, können Sie mit der rechten Maustaste auf das TEdit-Steuerelement klicken, &#039;&#039;&#039;Eintrag hinzufügen&#039;&#039;&#039; auswählen, und eine eingebettete Glyphe, wie TPasswordEditButton, hinzufügen.&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
Bearbeiten&lt;br /&gt;
|&lt;br /&gt;
Das Untermenü enthält die folgenden Bearbeitungsbefehle:&lt;br /&gt;
* Rückgängig&lt;br /&gt;
* Ausschneiden&lt;br /&gt;
* Kopieren&lt;br /&gt;
* Einfügen&lt;br /&gt;
* Löschen&lt;br /&gt;
* Alles markieren&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
Element&lt;br /&gt;
|&lt;br /&gt;
Steuert die Hintergrund-/Vordergrundebenen des ausgewählten Steuerelements. Das Untermenü enthält die folgenden Befehle:&lt;br /&gt;
* [[Nach vorne setzen|Nach vorne setzen]]&lt;br /&gt;
* [[Nach hinten setzen|Nach hinten setzen]]&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
[[LiveBindings-Experte|LiveBindings-Experte]]&lt;br /&gt;
(nur wenn in &amp;lt;font color=&amp;quot;#598527&amp;quot;&amp;gt;&#039;&#039;&#039;Tools&amp;amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;Optionen&amp;amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;LiveBindings&#039;&#039;&#039;&amp;lt;/font&amp;gt; aktiviert)&lt;br /&gt;
|&lt;br /&gt;
Öffnet den &#039;&#039;&#039;[[LiveBindings-Experte|LiveBindings-Experten]]&#039;&#039;&#039;.&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
[[LiveBindings-Designer|Visuell binden...]]&lt;br /&gt;
|&lt;br /&gt;
Öffnet den &#039;&#039;&#039;[[LiveBindings-Designer|LiveBindings-Designer]]&#039;&#039;&#039;.&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
Position&lt;br /&gt;
|&lt;br /&gt;
Legt die Ausrichtung, Größe und Skalierung des ausgewählten Steuerelements fest. Das Untermenü enthält die folgenden Befehle:&lt;br /&gt;
* [[Am Raster ausrichten|Am Raster ausrichten]].&lt;br /&gt;
* Ausrichten. Öffnet das Dialogfeld [[Ausrichtung (Formular-Designer)|Ausrichtung]].&lt;br /&gt;
* Größe. Öffnet das Dialogfeld [[Größe|Größe]].  {{f|radstudio|&lt;br /&gt;
* Skalierung. Öffnet das Dialogfeld [[Skalierung|Skalierung]] (nur für VCL-Formulare verfügbar). }}&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
[[Untergeordnete Elemente vertauschen|Untergeordnete Elemente vertauschen]]&lt;br /&gt;
|&lt;br /&gt;
Vertauscht rechts und links. Das Untermenü enthält die folgenden Befehle:&lt;br /&gt;
* Alle – Vertauscht alle Elemente in dem Formular.&lt;br /&gt;
* Ausgewählte – Vertauscht nur die ausgewählten Elemente.&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
Tabulatorreihenfolge&lt;br /&gt;
|&lt;br /&gt;
Öffnet das Dialogfeld [[Tabulatorreihenfolge bearbeiten|Tabulatorreihenfolge bearbeiten]].&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
Erstellungsfolge&lt;br /&gt;
(nicht-visuelle Komponenten)&lt;br /&gt;
|&lt;br /&gt;
Öffnet das Dialogfeld [[Erstellungsfolge|Erstellungsfolge]].&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
[[Nicht-visuelle Komponenten ausblenden|Nicht-visuelle Komponenten ausblenden]]&lt;br /&gt;
|&lt;br /&gt;
Ermöglicht die [[Nicht-visuelle Komponenten ausblenden|Ein- oder Ausblendung]] der nicht-visuellen Komponenten beim Entwurf.&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
[[Geerbte Einstellungen wiederherstellen|Geerbte Einstellungen wiederherstellen]]&lt;br /&gt;
|&lt;br /&gt;
Setzt die Eigenschaften, Methoden und Ereignisse des ausgewählten Steuerelements auf die Werte der Basisklasse des Steuerelements zurück. Siehe [[Geerbte Einstellungen wiederherstellen|Geerbte Einstellungen wiederherstellen]].&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
Der Objektablage hinzufügen&lt;br /&gt;
|&lt;br /&gt;
Öffnet das Dialogfeld [[Der Objektablage hinzufügen|Der Objektablage hinzufügen]].&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
[[Ansicht als Text|Ansicht als Text]]&lt;br /&gt;
|&lt;br /&gt;
Öffnet die aktuelle Formulardatei im [[Quelltext-Editor|Quelltext-Editor]] als Text. Siehe [[Ansicht als Text|Ansicht als Text]].&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
[[Text-DFM oder Text-FMX|Text-FMX]]{{f|vcl|&amp;lt;br /&amp;gt;&lt;br /&gt;
(geräteübergreifende Formulare)&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Text-DFM oder Text-FMX|Text-DFM]]&amp;lt;br /&amp;gt;&lt;br /&gt;
(VCL-Formulare)}}&lt;br /&gt;
|&lt;br /&gt;
Speichert die Formulardatei entweder in der Textform (aktiviert) oder in der Binärform (deaktiviert). Siehe [[Text-DFM oder Text-FMX|Text-DFM oder Text-FMX]].&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
Standardstil bearbeiten&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Benutzerdefinierten Stil bearbeiten&lt;br /&gt;
({{FM}}-Desktop-Steuerelemente)&lt;br /&gt;
|&lt;br /&gt;
Öffnet den &#039;&#039;&#039;[[FireMonkey-Stil-Designer|FireMonkey-Stil-Designer]].&#039;&#039;&#039;&lt;br /&gt;
Weitere Informationen dazu finden Sie unter [[Anpassen von FireMonkey-Anwendungen mit Stilen|Anpassen von FireMonkey-Anwendungen mit Stilen]].&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot; {{fr|vcl}}&lt;br /&gt;
|&lt;br /&gt;
Testdialog&lt;br /&gt;
(nur VCL)&lt;br /&gt;
|&lt;br /&gt;
Testet modale VCL-Dialogfelder. Wenn Sie im Formular-Designer mit der rechten Maustaste auf eine OpenDialog-Komponente klicken, und &#039;&#039;&#039;Testdialog&#039;&#039;&#039; auswählen, wird das Standarddialogfeld &amp;quot;Datei öffnen&amp;quot; angezeigt.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Tastenkombinationen im Formular-Designer==&lt;br /&gt;
&lt;br /&gt;
Mit den folgenden Tastenkombinationen können Sie die Komponenten im Formular-Designer verschieben und deren Größe ändern.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
!&#039;&#039;&#039;Tastenkombination&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Aktion&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;STRG + Mausauswahlbereich&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
Markiert alle untergeordneten Steuerelemente eines übergeordneten Steuerelements, die innerhalb des mit der Maus ausgewählten Bereichs liegen.&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;UMSCHALT + Mausauwahl&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
Markiert verschiedene Steuerelemente gleichzeitig. Halten Sie die Umschalt-Taste gedrückt, während Sie auf verschiedene Steuerelemente zur Auswahl klicken.&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;STRG+Pfeiltaste&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
Verschiebt die markierte Komponente langsam&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;STRG+UMSCHALT+Pfeiltaste&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
Verschiebt die Komponente schneller&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Pfeiltaste&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
Verschiebt den Fokus zwischen den Komponenten&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;UMSCHALT+Pfeiltaste &amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
Ändert die Größe der Komponente&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;ESC &amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
Markiert die übergeordnete Komponente&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;STRG+TAB &amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
Wechselt zur nächsten Bearbeitungsregisterkarte&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;STRG+UMSCHALT+TAB&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
Wechselt zur vorherigen Bearbeitungsregisterkarte&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Neue Richtlinien und Funktionen==&lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;&#039;FireMonkey-Stil-Designer&#039;&#039;&#039; erhielt in Olympus Richtlinien und andere Funktionen, die im VCL-Designer mit einer anderen Implementierung vorhanden sind. Dazu zählen:&lt;br /&gt;
&lt;br /&gt;
1. Hinweise zu Komponenten werden angezeigt, wenn Sie diese verschieben oder deren Größe ändern.&lt;br /&gt;
&lt;br /&gt;
[[File:Components olympus 1.png|300px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Für Steuerelemente sind Richtlinien für die seitliche Ausrichtung vorhanden (eine Basistextausrichtung ist nicht geplant, da die Textpositionierung für mit Stilen versehene Steuerelemente sehr komplex ist):&lt;br /&gt;
&lt;br /&gt;
[[File:Components olympus 2.png|300px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Für Steuerelemente wird der Standardrandabstand mit einer Querlinie und einer Abstandsangabe angezeigt, wenn dies mit dem Rand- oder Innenabstand übereinstimmt:&lt;br /&gt;
&lt;br /&gt;
[[File:Components olympus 3.png|200px]] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. Die Steuerelemente für die Größenanpassung von Formularen und Komponenten (Griffe, wenn ein Steuerelement ausgewählt ist, und der Designrand des Formulars oder Frames, dessen Größe geändert werden soll) wurden so geändert, dass sie das gleiche Erscheinungsbild wie im VCL-Formular-Designer haben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
&lt;br /&gt;
* [[Optionen für den Formular-Designer|Optionen für den Formular-Designer]].&lt;br /&gt;
* [[High DPI|High DPI]]&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;
&lt;br /&gt;
&amp;lt;f s=&amp;quot;appmethod&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* [[Ein erster Blick auf die IDE - Index (IDE-Tutorial)|Ein erster Blick auf die IDE]]&lt;br /&gt;
* [[Hinzufügen von Komponenten im Formular-Designer (IDE-Tutorial)|Komponenten in ein Formular einfügen]]&lt;br /&gt;
* [[Quelltext-Editor|Quelltext-Editor]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;f e=&amp;quot;appmethod&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* [[Verwenden von FireMonkey-Ansichten|Verwenden von FireMonkey-Ansichten]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;f s=&amp;quot;radstudio&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* [[Ein erster Blick auf die IDE|Ein erster Blick auf die IDE]]&lt;br /&gt;
* [[Quelltext-Editor|Quelltext-Editor]]&lt;br /&gt;
* [[Neues Editierfenster|Neues Editierfenster]]&lt;br /&gt;
* [[Ein Projekt starten - Überblick|Ein Projekt starten - Überblick]]&lt;br /&gt;
* [[Komponenten in ein Formular einfügen|Komponenten in ein Formular einfügen]]&lt;br /&gt;
* [[Eigenschaften und Ereignisse festlegen|Eigenschaften und Ereignisse festlegen]]&lt;br /&gt;
* [[Designrichtlinien (Nur VCL)|Designrichtlinien (Nur VCL)]]&lt;br /&gt;
* [[Designer-Richtlinien für VCL-Komponenten verwenden|Designer-Richtlinien für VCL-Komponenten verwenden]]&lt;br /&gt;
* [[Momentaufnahmen von Formularen erstellen (Nur VCL)|Momentaufnahmen von Formularen erstellen (Nur VCL)]]&lt;br /&gt;
* [[Formularvorschau|Formularvorschau]] &lt;br /&gt;
&lt;br /&gt;
&amp;lt;f e=&amp;quot;radstudio&amp;quot; /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
* [[Geräteübergreifende Vorschau|Geräteübergreifende Vorschau]]&lt;br /&gt;
* [https://www.youtube.com/watch?v=XELph3rB25Y&amp;amp;index=8&amp;amp;list=PLwUPJvR9mZHikVu-FgmXg2ajAagF8OPgh YouTube: FireUI Multi-Device Designer (EN)]&lt;br /&gt;
&lt;br /&gt;
[[Category:Delphi]]&lt;br /&gt;
[[Category:C++]]&lt;br /&gt;
[[Category:Mit RAD Studio arbeiten]]&lt;br /&gt;
[[Category:AMMigrate]]&lt;br /&gt;
&lt;br /&gt;
[[en:Form Designer]]&lt;br /&gt;
[[fr:Concepteur de fiches]]&lt;br /&gt;
[[ja:フォーム デザイナ]]&lt;/div&gt;</summary>
		<author><name>Rrivero</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=FireMonkey_3D&amp;diff=217921</id>
		<title>FireMonkey 3D</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=FireMonkey_3D&amp;diff=217921"/>
		<updated>2022-09-30T19:28:54Z</updated>

		<summary type="html">&lt;p&gt;Rrivero: RS-78784. Removed TVideo3D component&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Parent|FireMonkey-Anwendungshandbuch}}&lt;br /&gt;
&lt;br /&gt;
==3D-Einführung==&lt;br /&gt;
&lt;br /&gt;
{{FM}} enthält 2D-Ansichten von Objekten im 3D-Raum. In einem [[lib_de:FMX.Viewport3D.TViewport3D|TViewport3D]] wird 3D-Inhalt in einem eigentlichen 2D-Formular angezeigt, wohingegen ein [[lib_de:FMX.Forms3D.TForm3D|TForm3D]] mit 3D-Inhalt beginnt. 2D und 3D können [[#Mischen von 2D und 3D|verschachtelt]] werden.&lt;br /&gt;
&lt;br /&gt;
Für {{FM}} 3D werden die folgenden plattformspezifischen Bibliotheken verwendet:&lt;br /&gt;
&lt;br /&gt;
* Für Windows die Bibliothek &#039;&#039;&#039;Direct3D&#039;&#039;&#039; (Bestandteil von DirectX; enthalten im Unit-Gültigkeitsbereich [[lib_de:Winapi|Winapi]])&lt;br /&gt;
* Für den Mac die Bibliothek &#039;&#039;&#039;OpenGL&#039;&#039;&#039; (enthalten im Unit-Gültigkeitsbereich Macapi)&lt;br /&gt;
&lt;br /&gt;
===3D-Objekte===&lt;br /&gt;
&lt;br /&gt;
{{FM}} stellt mehrere Arten von 3D-Objekten bereit:&lt;br /&gt;
&lt;br /&gt;
* Grundlegende 3D-Formen wie [[lib_de:FMX.Objects3D.TCube|TCube]], [[lib_de:FMX.Objects3D.TSphere|TSphere]] und [[lib_de:FMX.Objects3D.TCone|TCone]].&lt;br /&gt;
* [[lib_de:FMX.Objects3D.TMesh|TMesh]] für komplexe 3D-Objekte.&lt;br /&gt;
* In 3D extrudierte 2D-Objekte, wie [[lib_de:FMX.Objects3D.TText3D|TText3D]]. Diese Objekte haben drei Seiten: Die Vorderseite mit der ursprünglichen 2D-Form, die Rückseite, ein Spiegelbild dieser Form und die &#039;&#039;Achse&#039;&#039; der Extrusion zwischen diesen beiden.&lt;br /&gt;
* Flache 2D-Objekte im 3D-Raum, wie [[lib_de:FMX.Layers3D.TImage3D|TImage3D]] und [[lib_de:FMX.Layers3D.TTextLayer3D|TTextLayer3D]].&lt;br /&gt;
&lt;br /&gt;
Objekte werden mit den X-, Y- und Z-Koordinaten mithilfe von [[lib_de:FMX.Types3D.TPosition3D|TPosition3D]] im 3D-Raum positioniert. Zusätzlich zur Höhe (Height) und Breite (Width) verfügen diese Objekte auch über eine Tiefe ([[lib_de:FMX.Controls3D.TControl3D.Depth|Depth]]). Flache 2D-Objekte im 3D-Raum sind extrem dünn mit einer fest codierten Tiefe von 0,01. 3D-Objekte verfügen über eine [[lib_de:FMX.Controls3D.TControl3D.RotationAngle|3D-Drehung]] und [[lib_de:FMX.Controls3D.TControl3D.Scale|Skalierung]]. Position, Größe, Drehung und Skalierung beziehen sich auf den Mittelpunkt des Objekts.&lt;br /&gt;
&lt;br /&gt;
Wie 2D-Steuerelemente können 3D-Steuerelemente in {{FM}} jedem beliebigen anderen 3D-Steuerelement übergeordnet sein. Die Position und Drehung eines untergeordneten Objekts sind relativ zu seinem übergeordneten Objekt. Durch Bewegen oder Drehen eines übergeordneten Objekts wird die Hierarchie seiner Komponenten neu angeordnet. [[lib_de:FMX.Layers3D.TLayout3D|TLayout3D]] kann als sonst funktionsloses übergeordnetes Objekt zum Anordnen anderer Objekte verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Auf einer 2D-Oberfläche angeordnete 2D-Objekte benötigen zur Festlegung ihrer Schichtung eine Z-Reihenfolge, Objekte im 3D-Raum sind dagegen inhärent angeordnet, so dass von einem gegebenen Punkt aus betrachtet nähere Objekte weiter entferntere in derselben Sichtlinie verdecken.&lt;br /&gt;
&lt;br /&gt;
===Kameras===&lt;br /&gt;
&lt;br /&gt;
Jede Ansicht des 3D-Raums wird von einer &#039;&#039;Kamera&#039;&#039; gesteuert. Die Position und Orientierung (3D-Drehung) der Kamera legt fest, was Sie sehen. Die &#039;&#039;Designkamera&#039;&#039; ist immer vorhanden; sie wird im Formular-Designer und standardmäßig zur Laufzeit verwendet. Sie befindet sich direkt über der negativen Z-Achse (in Richtung der negativen Y-Achse), senkrecht zur X-Z-Ebene, leicht nach unten abgewinkelt, so dass sich die Position 0,0,0 in der Mitte der Ansicht befindet. Setzen Sie für eine andere Kamera die Eigenschaft &#039;&#039;UsingDesignCamera&#039;&#039; von [[lib_de:FMX.Viewport3D.TViewport3D.UsingDesignCamera|TViewport3D]] oder [[lib_de:FMX.Forms3D.TCustomForm3D.UsingDesignCamera|TForm3D]] auf False, und weisen Sie der Eigenschaft &#039;&#039;Camera&#039;&#039; ein [[lib_de:FMX.Controls3D.TCamera|TCamera]]-Objekt zu. Eine Szene kann mehrere Kameras haben. Nach dem Zuweisen einer anderen Kamera zu der Eigenschaft &#039;&#039;Camera&#039;&#039; müssen Sie &#039;&#039;Repaint&#039;&#039; manuell aufrufen.&lt;br /&gt;
&lt;br /&gt;
Der sichtbare Rauminhalt ist ein &#039;&#039;Pyramidenstumpf&#039;&#039; mit der vorderen Ebene kurz vor der Kamera. Alles zwischen der Kamera und dieser vorderen Ebene ist nicht in der Ansicht enthalten. Der Winkel des &#039;&#039;Sichtfeldes&#039;&#039; ist vertikal fest: durch Vergrößern der Höhe des Bildausschnitts/Formulars wird alles größer, durch Vergrößern der Breite wird dagegen mehr von den Seitenbereichen sichtbar. Die Einheiten für Position und Größe sind relativ zur Skalierung des Sichtfeldes.&lt;br /&gt;
&lt;br /&gt;
====Bildschirmprojektion====&lt;br /&gt;
&lt;br /&gt;
Zusätzlich zu der Ansicht eines Objekts (oder des Nichtvorhandenseins in der Ansicht), die durch die Kamera festgelgt wird, kann ein Objekt auch so eingerichtet werden, dass es unabhängig von den Kamerapunkten immer sichtbar ist, wie feste Statusindikatoren in 3D-Spielen. Dies erfolgt durch Ändern des Standardwerts &#039;&#039;&#039;Camera&#039;&#039;&#039; der Eigenschaft [[lib_de:FMX.Controls3D.TControl3D.Projection|Projection]] in &#039;&#039;&#039;Screen&#039;&#039;&#039; mit folgendem Ergebnis:&lt;br /&gt;
&lt;br /&gt;
* An Position.Z null:&lt;br /&gt;
** XY 0,0 ist die linke obere Ecke, genau wie in 2D. (Die 3D-Position gibt weiterhin die Position der Mitte des Objekts wieder, nicht seine linke, obere Ecke wie in 2D.)&lt;br /&gt;
** Die Dimensionen Höhe (Height), Breite (Width) und Tiefe (Depth) sind – unabhängig von der Skalierung des Sichtfeldes – in Pixel angegeben.&lt;br /&gt;
** Weil die Einheiten als Pixel gerendert werden, müssen die Dimensionen eines Objekts mit Bildschirmprojektion deutlich größer sein als bei der Kameraprojektion, um in derselben Größe zu erscheinen.&lt;br /&gt;
** Das Objekt erscheint etwas hinter der vorderen Clipping-Ebene des Pyramidenstumpfs. Objekte, die die Kameraprojektion verwenden, haben eine schmale Lücke, in der sie vor auf dem Bildschirm projizierten Objekten erscheinen können, bevor sie durch die vordere Ebene abgeschnitten werden.&lt;br /&gt;
* An Position.Z größer als null (vom Betrachter weg):&lt;br /&gt;
** Die gerenderte Größe ist kleiner.&lt;br /&gt;
** Durch Verkleinern der Ansicht wird das Objekt weiter in den Hintergrund verlagert, und es erscheint noch kleiner.&lt;br /&gt;
** Durch Vergrößern der Ansicht wird das Objekt weiter in den Vordergrund verlagert, und es erscheint größer.&lt;br /&gt;
* An Position.Z kleiner als null (zum Betrachter hin):&lt;br /&gt;
** Die gerenderte Größe ist größer.&lt;br /&gt;
** Durch Verkleinern der Ansicht wird das Objekt weiter in den Vordergrund verlagert, und es erscheint noch größer.&lt;br /&gt;
** Durch eine zu weite Verlagerung des Objekts in den Vordergrund – entweder durch Verkleinerung der Ansicht oder direkte Angabe von Position.Z – wird das Objekt vor die vordere Ebene des Pyramidenstumpfs verlagert und verschwindet dadurch aus der Ansicht.&lt;br /&gt;
** Durch Vergrößern der Ansicht wird das Objekt weiter in den Hintergrund verlagert, und es erscheint kleiner.&lt;br /&gt;
&lt;br /&gt;
Durch Ändern der Projektion eines Objekts im Formular-Designer wird dessen Position neu berechnet, damit es nicht verschoben wird, sowie dessen Größe angepasst.&lt;br /&gt;
&lt;br /&gt;
====Kamerakran====&lt;br /&gt;
&lt;br /&gt;
Das vom Benutzer gesteuerte Anzeigen eines Objekts oder einer Szene aus allen Richtungen ist eine häufige 3D-Anwendung. Obwohl Sie die Position und Ausrichtung für den korrekten Kamerawinkel berechnen können, ist es einfacher, einen virtuellen Kamerakran zu erstellen:&lt;br /&gt;
&lt;br /&gt;
# Erstellen Sie an derselben Position wie das betreffende Objekt oder in der Mitte der Szene ein unsichtbares Objekt, wie z.B. ein [[lib_de:FMX.Objects3D.TDummy|TDummy]].&lt;br /&gt;
# Erstellen Sie ein TCamera-Objekt als untergeordnetes Element des Objekts.&lt;br /&gt;
## Setzen Sie dessen Position auf den gewünschten Abstand auf einer der Achsen.&lt;br /&gt;
## Setzen Sie bei Bedarf die Eigenschaft &#039;&#039;&#039;RotationAngle&#039;&#039;&#039;, damit die Kamera entlang der Achse zurück auf die Position zeigt. Stellen Sie sicher, dass die Kamera nicht verkehrt herum aufgestellt ist.&lt;br /&gt;
# Jetzt können Sie durch einfaches Ändern der Eigenschaft &#039;&#039;&#039;RotationAngle&#039;&#039;&#039; des Dummy-Objekts die Kamera um das Objekt drehen. Die Kamera behält den exakten Abstand bei und zeigt automatisch direkt auf die Mitte.&lt;br /&gt;
# Durch Hinzufügen von Licht als untergeordnetes Element der Kamera wird der Abstand und die Ausrichtung des Lichtes beim Bewegen der Kamera beibehalten.&lt;br /&gt;
&lt;br /&gt;
===Licht===&lt;br /&gt;
&lt;br /&gt;
Im Allgemeinen ist ein 3D-Objekt eine strukturlose schwarze Masse, außer wenn es von Licht beschienen wird. Ein oder mehrere [[lib_de:FMX.Controls3D.TLight|TLight]]-Objekte definieren abhängig von ihrer Eigenschaft [[lib_de:FMX.Controls3D.TLight.LightType|LightType]] Licht im 3D-Raum:&lt;br /&gt;
&lt;br /&gt;
; Directional&lt;br /&gt;
: Direktionales Licht ist aus einem gegebenen Winkel konstant. Licht von der Sonne ist eine allgemeine Analogie dazu: es kommt von sehr weit her, daher werden für jeden beliebigen festgelegten Ort auf der Erde – Meter im Durchmesser, nicht Kilometer – alle Elemente gleich beleuchtet. Die Position von direktionalem Licht ist für seinen Effekt irrelevant. (Seine Position ist relevant, wenn Sie versuchen, im Formular-Designer darauf zu klicken.) Wichtig ist die Richtung, in der das Licht scheint, was von seinem &#039;&#039;&#039;RotationAngle&#039;&#039;&#039; und dem &#039;&#039;&#039;RotationAngle&#039;&#039;&#039; des übergeordneten Objekts definiert wird.&lt;br /&gt;
; Point&lt;br /&gt;
: Punktlicht ist mit einer nackten Glühbirne vergleichbar. Es strahlt in alle Richtungen und nimmt mit der Entfernung ab. Sein &#039;&#039;&#039;RotationAngle&#039;&#039;&#039; hat keine Auswirkung. Wichtig ist seine Position, die von der Position und Drehung seiner übergeordneten Objekte beeinflusst wird.&lt;br /&gt;
; Spot&lt;br /&gt;
: Scheinwerferlicht ist von der Position und Drehung abhängig und nimmt mit der Entfernung ab.&lt;br /&gt;
&lt;br /&gt;
Flache 2D-Objekte im 3D-Raum benötigen weder Licht noch werden sie von Licht beeinflusst. Sie werden in der Regel mit einer hinzugefügten 3D-Perspektive angezeigt.&lt;br /&gt;
&lt;br /&gt;
===Materialien===&lt;br /&gt;
&lt;br /&gt;
Die Oberfläche eines {{FM}}-3D-Objekts wird durch sein &#039;&#039;Material&#039;&#039; definiert. {{FM}}-3D-Materialien basieren auf Schattierern. Dies ermöglicht eine unbegrenzte Variation von Licht und Materialien in einer Anwendung. Die Liste der verfügbaren Materialien befindet sich in der [[Tool-Palette|Tool-Palette]] in der Kategorie &#039;&#039;&#039;Materialien&#039;&#039;&#039;. Jedes {{FM}}-3D-Objekt verfügt über die Eigenschaft [[lib_de:FMX.Objects3D.TShape3D.MaterialSource|MaterialSource]], die eine Materialquelle mit dem aktuellen Objekt verknüpft. Mit [[lib_de:FMX.MaterialSources.TMaterialBook|TMaterialBook]] können Sie eine Bibliothek mit Materialen erstellen und verwalten. Zur Verwendung eines Materials können Sie die Quelle mit beliebig vielen Objekten verknüpfen.&lt;br /&gt;
&lt;br /&gt;
Extrudierte Objekte haben die zusätzlichen Eigenschaften [[lib_de:FMX.Objects3D.TExtrudedShape3D.MaterialShaftSource|MaterialShaftSource]] und [[lib_de:FMX.Objects3D.TExtrudedShape3D.MaterialBackSource|MaterialBackSource]]. Diese Eigenschaften haben den Typ [[lib_de:FMX.MaterialSources.TMaterialSource|TMaterialSource]].&lt;br /&gt;
&lt;br /&gt;
Um zu steuern, wie ein Objekt unter dem Einfluss von Licht erscheint, verknüpfen Sie es mit einem [[lib_de:FMX.MaterialSources.TLightMaterialSource|TLightMaterialSource]]-Objekt:&lt;br /&gt;
&lt;br /&gt;
* Eine [[lib_de:FMX.MaterialSources.TLightMaterialSource.Emissive|ausstrahlende (Emissive)]] Farbe bestimmt, ob eine Oberfläche eigenes Licht abgibt oder leuchtet. Der Standardwert ist null (keine Opazität, schwarz): Objekte leuchten normalerweise nicht und erfordern Licht, damit sie gesehen werden. Durch Setzen einer Farbe erscheinen Oberflächen ohne Licht in dieser Farbe. Wenn sie beleuchtet werden, wird die ausstrahlende Farbe mit den anderen aus dem Licht resultierenden Farben überblendet.&lt;br /&gt;
* Eine [[lib_de:FMX.MaterialSources.TLightMaterialSource.Ambient|umgebende (Ambient)]] Farbe soll eine Grundfarbe für Oberflächen bereitstellen, damit sie gesehen werden können. In der realen Welt wird Licht von vielen Richtungen auf eine Oberfläche reflektiert; aber in der 3D-Szene wäre es äußerst schwierig all dieses Licht zu definieren. Daher wird die umgebende Farbe von jedem beliebigen Licht im Raum aktiviert. (Ohne Licht hat sie keine Auswirkung.) Die Oberfläche wird völlig gleichförmig in dieser Farbe dargestellt. Mit direktionalem Licht – das nicht auf die Oberfläche gerichtet sein muss – würde alles flach aussehen. Mit Punkt- oder Scheinwerferlicht werden die Farben mit der Entfernung schwächer.&lt;br /&gt;
* Eine [[lib_de:FMX.MaterialSources.TLightMaterialSource.Diffuse|diffuse (Diffuse)]] Farbe interagiert direkt mit Licht und mit dem Einfallswinkel des Lichts. Ohne Licht hat sie keine Auswirkung. In der Regel werden &#039;&#039;&#039;Ambient&#039;&#039;&#039; und &#039;&#039;&#039;Diffuse&#039;&#039;&#039; auf dieselbe Farbe gesetzt.&lt;br /&gt;
* Eine [[lib_de:FMX.MaterialSources.TLightMaterialSource.Specular|reflektierende (Specular)]] Farbe simuliert eine glänzende Oberfläche, indem in einem bestimmten Winkel einfallendes Licht reflektiert wird, anstatt Licht in vielen Winkeln zu vermischen. Ohne Licht hat &#039;&#039;&#039;Specular&#039;&#039;&#039; keine Auswirkung. Die Vorgabe ist weiß, damit das Licht ohne Verändern seiner Farbe reflektiert werden kann.&lt;br /&gt;
&lt;br /&gt;
==Mischen von 2D und 3D==&lt;br /&gt;
&lt;br /&gt;
3D-Objekte müssen in einen 3D-Container platziert werden. Ein 3D-Objekt (wie TCube) wird nicht gerendert, wenn es direkt in einen 2D-Container (wie TForm) gesetzt wird, aber es wird in der [[Strukturansicht|Strukturansicht]] als untergeordnetes Steuerelement angezeigt. Umgekehrt werden 2D-Objekte (wie TButton) nicht gerendert, wenn sie direkt in einen 3D-Container (wie TForm3D) platziert werden, aber sie werden in der [[Strukturansicht|Strukturansicht]] als untergeordnete Steuerelemente angezeigt. Zwei Klassen ermöglichen ein verschachteltes Mischen von 2D- und 3D-Inhalt:&lt;br /&gt;
&lt;br /&gt;
* [[lib_de:FMX.Layers3D.TLayer3D|TLayer3D]] ist ein 3D-Objekt mit 2D-Inhalt. Es entspricht einer rechteckigen Glasscheibe im 3D-Raum.&lt;br /&gt;
* [[lib_de:FMX.Viewport3D.TViewport3D|TViewport3D]] ist ein 2D-Objekt mit 3D-Inhalt. Wie TForm3D ist es ein &amp;quot;Fenster&amp;quot; in den 3D-Raum.&lt;br /&gt;
&lt;br /&gt;
Sie können diese Container verschachteln. Sie können z.B. eine Objekthierarchie wie die folgende erstellen:&lt;br /&gt;
&lt;br /&gt;
* TForm3D&lt;br /&gt;
** TCube&lt;br /&gt;
** TLayer3D&lt;br /&gt;
*** TButton&lt;br /&gt;
*** TViewport3D&lt;br /&gt;
**** TCube&lt;br /&gt;
&lt;br /&gt;
Darüber hinaus gibt es einige 3D-Klassen, die 2D-Inhalt aufnehmen:&lt;br /&gt;
&lt;br /&gt;
* TTextLayer3D zeigt Text an.&lt;br /&gt;
* TImage3D zeigt Bitmap-Bilder an.&lt;br /&gt;
&lt;br /&gt;
==Importieren von 3D-Modellen==&lt;br /&gt;
&lt;br /&gt;
Das {{FM}}-Framework unterstützt den Import von 3D-Modellen. 3D-Modelle können nur in 3D-Containern gerendert werden. Verwenden Sie zum Importieren eines 3D-Modells [[lib_de:FMX.Objects3D.TModel3D|TModel3D]]-Objekte. [[lib_de:FMX.Objects3D.TModel3D|TModel3D]] befindet sich in der [[Tool-Palette|Tool-Palette]]. Verwenden Sie zum Laden eines Objekts die Eigenschaft [[lib_de:FMX.Objects3D.TModel3D.MeshCollection|MeshCollection]] von [[lib_de:FMX.Objects3D.TModel3D|TModel3D]]. Folgende 3D-Dateien werden unterstützt: &#039;&#039;&#039;.obj&#039;&#039;&#039;, &#039;&#039;&#039;.dae&#039;&#039;&#039; und &#039;&#039;&#039;.ase&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Die Modelle werden mit Textur importiert und angezeigt. Wenn in der Szene kein Licht vorhanden ist, ist die Textur nicht sichtbar. Grundlegende Merkmale von importierten Modellen können, wie bei jedem anderen 3D-Objekt, bearbeitet werden (drehen, verschieben, skalieren und Größe ändern).&lt;br /&gt;
&lt;br /&gt;
Die korrekte Anzeige von geladenen Modellen hängt von der Beschaffenheit und Korrektur der geladenen Datei ab.&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
&lt;br /&gt;
* [[FireMonkey-Anwendungsdesign|FireMonkey-Anwendungsdesign]]&lt;br /&gt;
* [[Geräteübergreifende 3D-Anwendung|{{FM}} 3D-Anwendungsexperte]]&lt;br /&gt;
* [[Tutorial: Erstellen einer FireMonkey 3D-Anwendung|Tutorial: Erstellen einer FireMonkey 3D-Anwendung]]&lt;br /&gt;
* [[Tutorial: Verwenden von Kameras in einer FireMonkey 3D-Anwendung|Tutorial: Verwenden von Kameras in einer FireMonkey 3D-Anwendung]]&lt;br /&gt;
* [[Experten zum Erstellen von geräteübergreifenden FireMonkey-Anwendungen und -Komponenten|Experten zum Erstellen von geräteübergreifenden FireMonkey-Anwendungen und -Komponenten]]&lt;br /&gt;
* [[FireMonkey Quick Start - Erstellen von 3D-Anwendungen|FireMonkey Quick Start - Erstellen von 3D-Anwendungen]]&lt;br /&gt;
&lt;br /&gt;
==Codebeispiele==&lt;br /&gt;
&lt;br /&gt;
* [[samp_en:FMX.AnimationDemoHD Sample|{{FM}} HD Animation]] (Beispiel)&lt;br /&gt;
* [[samp_en:FMX.AnimationDemo3D Sample|{{FM}} 3D Animation]] (Beispiel)&lt;br /&gt;
* [[samp_en:FMX.Gyroscope Sample|{{FM}} Gyroscope]] (Beispiel)&lt;br /&gt;
* [[samp_en:FMX.Arrows3D Sample|{{FM}} 3D Arrows]] (Beispiel)&lt;br /&gt;
* [[samp_en:FMX.FirstApp3D Sample|{{FM}} First App3D]] (Beispiel)&lt;br /&gt;
* [[samp_en:OpenGL Multicolor Tetrahedron (C++)|OpenGL Multicolor Tetrahedron (C++)]] (Beispiel)&lt;br /&gt;
&lt;br /&gt;
[[Category:XE3]]&lt;br /&gt;
[[Category:FMX]]&lt;br /&gt;
[[Category:AMMigrate]]&lt;br /&gt;
&lt;br /&gt;
[[en:FireMonkey 3D]]&lt;br /&gt;
[[fr:FireMonkey 3D]]&lt;br /&gt;
[[ja:FireMonkey 3D]]&lt;/div&gt;</summary>
		<author><name>Rrivero</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Mobile-Tutorial:_Konfigurieren_der_Entwicklungsumgebung_auf_dem_Windows-PC_(iOS)&amp;diff=217318</id>
		<title>Mobile-Tutorial: Konfigurieren der Entwicklungsumgebung auf dem Windows-PC (iOS)</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Mobile-Tutorial:_Konfigurieren_der_Entwicklungsumgebung_auf_dem_Windows-PC_(iOS)&amp;diff=217318"/>
		<updated>2022-08-17T20:28:37Z</updated>

		<summary type="html">&lt;p&gt;Rrivero: RS-114036. Updated screenshots and path names (Aktualisierte Screenshots und Pfadnamen)&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 mit diesem Tutorial beginnen, sollten Sie das folgende Tutorial durcharbeiten:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[[Mobile-Tutorial: Konfigurieren der Entwicklungsumgebung auf dem Mac (iOS)|Mobile-Tutorial: Konfigurieren der Entwicklungsumgebung auf dem Mac (iOS)]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
{{FM}}-Anwendungen für die iOS-Zielplattform können mit dem &#039;&#039;&#039;iOS-Simulator&#039;&#039;&#039; auf dem Mac getestet werden. Im zweiten Teil des Tests wird die Zielplattform &#039;&#039;&#039;iOS-Gerät&#039;&#039;&#039; verwendet, für die aber ein Test-iOS-Gerät am Mac angeschlossen sein muss.&lt;br /&gt;
&lt;br /&gt;
: {{Note| Auf iOS-Geräten können Sie {{Delphi}}- und C++-Anwendungen ausführen. Der &#039;&#039;&#039;iOS-Simulator&#039;&#039;&#039; wird allerdings nicht von &#039;&#039;&#039;BCCIOSARM&#039;&#039;&#039; unterstützt, daher werden nur iOS-Geräte für C++ unterstützt.}}&lt;br /&gt;
&lt;br /&gt;
Für die Bereitstellung einer iOS-Anwendung auf einem iOS-Gerät oder dem iOS-Simulator zum Debuggen und Testen verwendet {{Product}} den &#039;&#039;&#039;[[PAServer: Die Platform Assistant Server-Anwendung|Platform Assistant]]&#039;&#039;&#039;, den Sie auf dem Mac [[Installieren des Platform Assistant auf dem Mac|installieren]] und [[Ausführen des Platform Assistant auf dem Mac|ausführen]] müssen. Ihre Hardware- und Software-Entwicklungsumgebung sollte wie in der folgenden Abbildung dargestellt konfiguriert sein. {{Product}} wird auf einem Windows-PC ausgeführt. Ihr PC muss mit einem Mac verbunden sein, auf dem der &#039;&#039;&#039;[[PAServer: Die Platform Assistant Server-Anwendung|Platform Assistant]]&#039;&#039;&#039; ausgeführt wird und die geeigneten Versionen von &#039;&#039;&#039;[[Installieren von Xcode auf einem Mac|Xcode]]&#039;&#039;&#039; und dem iOS SDK (für die iOS-Entwicklung) installiert sind. Um iOS-Apps auf einem iOS-Gerät auszuführen, muss das iOS-Gerät über ein USB-Kabel an den Mac angeschlossen sein. &lt;br /&gt;
&lt;br /&gt;
[[File:Win2Mac2iOSDevice.png|650px]]&lt;br /&gt;
&lt;br /&gt;
In diesem Abschnitt werden die Schritte zum Einrichten der Entwicklungsumgebung &#039;&#039;&#039;nach&#039;&#039;&#039; der Konfiguration der Umgebung auf dem Mac beschrieben. &lt;br /&gt;
&lt;br /&gt;
==Konfigurieren der {{Product}}-Umgebung==&lt;br /&gt;
&lt;br /&gt;
Führen Sie die folgenden Konfigurationsschritte aus, um die iOS-Entwicklung mit {{Product}} vorzubereiten.&lt;br /&gt;
&lt;br /&gt;
===[[Verbindungsprofil erstellen|Erstellen eines Verbindungsprofils]] für den Mac===&lt;br /&gt;
&lt;br /&gt;
# Wählen Sie in der {{Product}}-IDE &amp;lt;font color=&amp;quot;#598527&amp;quot;&amp;gt;&#039;&#039;&#039;Tools &amp;amp;gt; Optionen &amp;amp;gt; Bereitstellung &amp;amp;gt; [[Verbindungsprofil-Manager|Verbindungsprofil-Manager]]&#039;&#039;&#039;&amp;lt;/font&amp;gt; aus.&lt;br /&gt;
# Klicken Sie auf &#039;&#039;&#039;Hinzufügen&#039;&#039;&#039;:&lt;br /&gt;
#:[[Datei:Connection profile manager.png|500px]] &amp;lt;br&amp;gt;&amp;lt;br&amp;gt; &lt;br /&gt;
# Der Experte [[Verbindungsprofil erstellen|Verbindungsprofil erstellen]] wird angezeigt.  Legen Sie einen Namen für das Verbindungsprofil fest, z. B. &amp;quot;My Mac&amp;quot;. &amp;lt;br /&amp;gt;&lt;br /&gt;
Wählen Sie als Plattform &#039;&#039;&#039;macOS&#039;&#039;&#039; aus, und klicken Sie dann auf &#039;&#039;&#039;Weiter&#039;&#039;&#039;:&lt;br /&gt;
#: [[Datei:Create a connection profile.png|500px]]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
# Geben Sie auf der Seite &#039;&#039;&#039;Informationen zum Remote-Computer&#039;&#039;&#039; den Namen oder die IP-Adresse des Host-Macs, eine Port-Nummer (der Standard-Port 64211 funktioniert in der Regel) und ein optionales Passwort (wenn Sie eins verwenden möchten) an. &lt;br /&gt;
#: [[Datei:Remote machine information.png|500px]]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
# Klicken Sie auf &#039;&#039;&#039;Verbindung testen&#039;&#039;&#039;, und überprüfen Sie, ob das Verbindungsprofil ohne Fehler ausgeführt wird (die Meldung &#039;&#039;&#039;&amp;quot;Verbindung zu &amp;amp;lt;Hostname&amp;amp;gt; auf Port &amp;amp;lt;Portnummer&amp;amp;gt; erfolgreich ausgeführt&amp;quot;&#039;&#039;&#039; sollte angezeigt werden).&lt;br /&gt;
# Wenn der &#039;&#039;&#039;Verbindungstest&#039;&#039;&#039; erfolgreich durchgeführt wurde, klicken Sie auf die Schaltfläche &#039;&#039;&#039;Fertig stellen&#039;&#039;&#039;. Falls nicht, überprüfen Sie die Einstellungen, und versuchen Sie es erneut.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===[[Hinzufügen von SDKs für macOS oder iOS|Hinzufügen eines SDK]] zum Entwicklungssystem für das an den Mac angeschlossene iOS-Gerät===&lt;br /&gt;
&lt;br /&gt;
# Öffnen Sie {{menu | Tools &amp;amp;gt; Optionen &amp;amp;gt; Bereitstellung &amp;amp;gt; [[SDK-Manager|SDK-Manager]]}}:&lt;br /&gt;
#: [[Datei:Add sdk.png|500px]]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
# Klicken Sie auf &#039;&#039;&#039;Hinzufügen&#039;&#039;&#039;.&lt;br /&gt;
# Wählen Sie im Dialogfeld &#039;&#039;&#039;Neues SDK hinzufügen&#039;&#039;&#039; als Plattform &#039;&#039;&#039;iOS-Gerät - 32 Bit&#039;&#039;&#039; oder &#039;&#039;&#039;iOS-Gerät - 64 Bit&#039;&#039;&#039; aus.&lt;br /&gt;
#: [[Datei:Add new SDK.png]]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
# Nach der Plattformauswahl füllt die IDE ein Profil (wie z. B. &amp;quot;My Mac&amp;quot;) und das Kombinationsfeld &amp;quot;SDK-Version&amp;quot; mit der Liste der auf dem Computer, auf dem der &amp;quot;Platform Assistant&amp;quot;-Server ausgeführt wird, verfügbaren SDK-Versionen:&lt;br /&gt;
#: [[Datei:SDK profile selection.png]]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
# Klicken Sie auf &#039;&#039;&#039;OK&#039;&#039;&#039;, um die ausgewählte SDK-Version hinzuzufügen. &lt;br /&gt;
# Nachdem die Operation abgeschlossen wurde, klicken Sie auf &#039;&#039;&#039;Schließen&#039;&#039;&#039;, um das Dialogfeld zu schließen.&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
&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: Konfigurieren der Entwicklungsumgebung auf dem Mac (iOS)|Mobile-Tutorial: Konfigurieren der Entwicklungsumgebung auf dem Mac (iOS)]]&lt;br /&gt;
* [[Arbeiten mit einem Mac und einem PC|Arbeiten mit einem Mac und einem PC]]&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;
* [[Ausführen von iOS-Anwendungen auf dem iOS-Simulator|Ausführen von iOS-Anwendungen auf dem iOS-Simulator]]&lt;br /&gt;
* [[Plattformvoraussetzungen für FireMonkey|Plattformvoraussetzungen für FireMonkey]]&lt;br /&gt;
* [[Erstellen von iOS-Apps|Erstellen von iOS-Apps]]&lt;br /&gt;
* [[MacOS-Anwendungsentwicklung|MacOS-Anwendungsentwicklung]]&lt;br /&gt;
* [[Erstellen einer FireMonkey-Anwendung|Erstellen einer FireMonkey-Anwendung]]&lt;br /&gt;
* Seiten auf &amp;quot;Apple developer.apple.com&amp;quot;&lt;br /&gt;
** [http://developer.apple.com/library/ios/navigation/ iOS Developer Library]&lt;br /&gt;
** [http://developer.apple.com/library/ios/navigation/index.html?section=Resource+Types&amp;amp;topic=Getting+Started iOS Developer Library: Getting Started]&lt;br /&gt;
** [http://developer.apple.com/devcenter/ios/index.action iOS Dev Center]&lt;br /&gt;
** [https://developer.apple.com/library/ios/documentation/IDEs/Conceptual/AppDistributionGuide/LaunchingYourApponDevices/LaunchingYourApponDevices.html Launching Your App on Devices]&lt;br /&gt;
** [https://developer.apple.com/library/ios/documentation/IDEs/Conceptual/AppDistributionGuide/Introduction/Introduction.html Preparing Your iOS App for Distribution in the App Store]&lt;br /&gt;
** [http://developer.apple.com/iad/ iAd Network]&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:AMMigrate]]&lt;br /&gt;
&lt;br /&gt;
[[en:Mobile Tutorial: Set Up Your Development Environment on Windows PC (iOS)]]&lt;br /&gt;
[[fr:Tutoriel mobile : Définition de votre environnement de développement sur un PC Windows (iOS)]]&lt;br /&gt;
[[ja:モバイル チュートリアル：Windows PC に開発環境をセットアップする（iOS）]]&lt;/div&gt;</summary>
		<author><name>Rrivero</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Datei:SDK_profile_selection.png&amp;diff=217317</id>
		<title>Datei:SDK profile selection.png</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Datei:SDK_profile_selection.png&amp;diff=217317"/>
		<updated>2022-08-17T20:27:19Z</updated>

		<summary type="html">&lt;p&gt;Rrivero: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;SDK profile selection screenshot&lt;/div&gt;</summary>
		<author><name>Rrivero</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Datei:Add_new_SDK.png&amp;diff=217316</id>
		<title>Datei:Add new SDK.png</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Datei:Add_new_SDK.png&amp;diff=217316"/>
		<updated>2022-08-17T20:26:33Z</updated>

		<summary type="html">&lt;p&gt;Rrivero: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Add new SDK profile selection screenshot&lt;/div&gt;</summary>
		<author><name>Rrivero</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Datei:Add_sdk.png&amp;diff=217315</id>
		<title>Datei:Add sdk.png</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Datei:Add_sdk.png&amp;diff=217315"/>
		<updated>2022-08-17T20:25:16Z</updated>

		<summary type="html">&lt;p&gt;Rrivero: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Add SDK screenshot&lt;/div&gt;</summary>
		<author><name>Rrivero</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Datei:Remote_machine_information.png&amp;diff=217314</id>
		<title>Datei:Remote machine information.png</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Datei:Remote_machine_information.png&amp;diff=217314"/>
		<updated>2022-08-17T20:22:35Z</updated>

		<summary type="html">&lt;p&gt;Rrivero: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Remote machine information screenshot&lt;/div&gt;</summary>
		<author><name>Rrivero</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Datei:Create_a_connection_profile.png&amp;diff=217313</id>
		<title>Datei:Create a connection profile.png</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Datei:Create_a_connection_profile.png&amp;diff=217313"/>
		<updated>2022-08-17T20:21:30Z</updated>

		<summary type="html">&lt;p&gt;Rrivero: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Create a connection profile screenshot&lt;/div&gt;</summary>
		<author><name>Rrivero</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Datei:Connection_profile_manager.png&amp;diff=217312</id>
		<title>Datei:Connection profile manager.png</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/d/index.php?title=Datei:Connection_profile_manager.png&amp;diff=217312"/>
		<updated>2022-08-17T20:17:25Z</updated>

		<summary type="html">&lt;p&gt;Rrivero: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Connection profile manager screenshot&lt;/div&gt;</summary>
		<author><name>Rrivero</name></author>
	</entry>
</feed>