<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://docwiki.embarcadero.com/RADStudio/Athens/f/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Rrivero</id>
	<title>RAD Studio - Contributions [fr]</title>
	<link rel="self" type="application/atom+xml" href="https://docwiki.embarcadero.com/RADStudio/Athens/f/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Rrivero"/>
	<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Athens/fr/Sp%C3%A9cial:Contributions/Rrivero"/>
	<updated>2026-08-14T02:27:22Z</updated>
	<subtitle>Contributions</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Athens/f/index.php?title=M%C3%A9thodes_(Delphi)&amp;diff=216840</id>
		<title>Méthodes (Delphi)</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Athens/f/index.php?title=M%C3%A9thodes_(Delphi)&amp;diff=216840"/>
		<updated>2023-05-24T14:14:20Z</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|Classes et objets - 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;
Une méthode est une procédure ou une fonction associée à une classe. Un appel de méthode spécifie l&#039;objet (ou la classe si c&#039;est une méthode de classe) sur lequel la méthode agit. Par exemple, &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;SomeObject.Free&amp;lt;/span&amp;gt; appelle la méthode &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Free&amp;lt;/span&amp;gt; de &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;SomeObject&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Cette rubrique couvre les sujets suivants :&lt;br /&gt;
&lt;br /&gt;
* Déclarations et implémentations de méthodes&lt;br /&gt;
* Liaison de méthodes&lt;br /&gt;
* Surcharge de méthodes&lt;br /&gt;
* Constructeurs et destructeurs&lt;br /&gt;
* Méthodes de messages&lt;br /&gt;
&lt;br /&gt;
==A propos des méthodes==&lt;br /&gt;
&lt;br /&gt;
Au sein d&#039;une déclaration de classe, les méthodes apparaissent comme des en-têtes de procédures ou de fonctions qui fonctionnent comme les déclarations &#039;&#039;&#039;forward&#039;&#039;&#039;. Quelque part après la déclaration de classe, mais à l&#039;intérieur du même module, chaque méthode doit être implémentée par une déclaration de définition. Si; par exemple, la déclaration de &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;TMyClass&amp;lt;/span&amp;gt; contient une méthode appelée &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;
Une déclaration de définition pour &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;DoSomething&amp;lt;/span&amp;gt; doit apparaître plus loin dans le module :&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;
Si une classe peut être déclarée dans la section interface ou la section implementation d&#039;une unité, les déclarations de définition des méthodes de classe doivent se trouver dans la section implementation.&lt;br /&gt;
&lt;br /&gt;
Dans l&#039;en-tête d&#039;une déclaration de définition, le nom de la méthode est toujours qualifié par le nom de la classe à laquelle elle appartient. L&#039;en-tête peut répéter la liste de paramètres depuis la déclaration de classe ; si c&#039;est le cas, l&#039;ordre, le type et le nom des paramètres doivent correspondre exactement et, si la méthode est une fonction, la valeur de retour doit aussi correspondre.&lt;br /&gt;
&lt;br /&gt;
Les déclarations des méthodes peuvent inclure des directives spéciales qui ne sont pas utilisées par d&#039;autres fonctions ou procédures. Les directives doivent apparaître uniquement dans la déclaration de classe et pas dans la déclaration de définition, et doivent toujours être dans l&#039;ordre suivant :&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;reintroduce&#039;&#039;&#039;; &#039;&#039;&#039;overload&#039;&#039;&#039;; [[#Liaison de méthode|liaison]]; [[Procédures et fonctions (Delphi)#Conventions d&#039;appel|convention d&#039;appel]]; &#039;&#039;&#039;abstract&#039;&#039;&#039;; [[Déclarations et instructions (Delphi)#Directives de conseil|avertissement]]&lt;br /&gt;
&lt;br /&gt;
Où :&lt;br /&gt;
&lt;br /&gt;
* [[#Liaison de méthode|liaison]] correspond à &#039;&#039;&#039;static&#039;&#039;&#039;, &#039;&#039;&#039;virtual&#039;&#039;&#039;, &#039;&#039;&#039;dynamic&#039;&#039;&#039; ou &#039;&#039;&#039;override&#039;&#039;&#039; ;&lt;br /&gt;
* [[Procédures et fonctions (Delphi)#Conventions d&#039;appel|convention d&#039;appel]] correspond à &#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;, or &#039;&#039;&#039;safecall&#039;&#039;&#039;;&lt;br /&gt;
* [[Déclarations et instructions (Delphi)#Directives de conseil|avertissement]] correspond à &#039;&#039;&#039;platform&#039;&#039;&#039;, &#039;&#039;&#039;deprecated&#039;&#039;&#039; ou &#039;&#039;&#039;library&#039;&#039;&#039;. Pour plus d&#039;informations sur ces directives d&#039;avertissement (de conseil), voir [[Déclarations et instructions (Delphi)#Directives de conseil|Directives de conseil]].  &lt;br /&gt;
&lt;br /&gt;
Toutes les directives {{Delphi}} sont listées dans [[Eléments syntaxiques fondamentaux (Delphi)#Directives|Directives]].&lt;br /&gt;
&lt;br /&gt;
===Inherited===&lt;br /&gt;
&lt;br /&gt;
Le mot réservé &#039;&#039;&#039;inherited&#039;&#039;&#039; joue un rôle particulier dans l&#039;implémentation de comportements polymorphiques. Il peut apparaître dans une définition de méthode avec ou sans identificateur à la suite.&lt;br /&gt;
&lt;br /&gt;
Si &#039;&#039;&#039;inherited&#039;&#039;&#039; est suivi par le nom d&#039;un membre, il représente un appel de méthode normal ou une référence à une propriété ou à un champ, sauf que la recherche du membre référencé commence avec l&#039;ancêtre immédiat de la classe de la méthode englobante. Par exemple, quand l&#039;instruction :&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;
apparaît dans la définition d&#039;une méthode, elle appelle la méthode &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Create&amp;lt;/span&amp;gt; héritée.&lt;br /&gt;
&lt;br /&gt;
Quand &#039;&#039;&#039;inherited&#039;&#039;&#039; est utilisé sans être suivi d&#039;un identificateur, il désigne la méthode héritée portant le même nom que la méthode en cours ou, si la méthode en cours est un gestionnaire de message, le gestionnaire de message hérité pour le même message. Dans ce cas, &#039;&#039;&#039;inherited&#039;&#039;&#039; ne prend pas de paramètres explicites, mais transmet à la méthode héritée les paramètres utilisés pour l&#039;appel de la méthode englobante. Par exemple :&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;
apparaît fréquemment dans l&#039;implémentation des constructeurs. Cette instruction appelle le constructeur hérité avec les mêmes paramètres que ceux transmis au descendant.&lt;br /&gt;
&lt;br /&gt;
===Self===&lt;br /&gt;
&lt;br /&gt;
Au sein de l&#039;implémentation d&#039;une méthode, l&#039;identificateur &#039;&#039;&#039;Self&#039;&#039;&#039; référence l&#039;objet dans lequel la méthode est appelée. Voici, par exemple, l&#039;implémentation de la méthode &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Add&amp;lt;/span&amp;gt; de TCollection dans l&#039;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;
La méthode &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Add&amp;lt;/span&amp;gt; appelle la méthode &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Create&amp;lt;/span&amp;gt; de la classe référencée par le champ &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;FItemClass&amp;lt;/span&amp;gt;, qui est toujours un descendant de TCollectionItem. &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;TCollectionItem.Create&amp;lt;/span&amp;gt; ne prend qu&#039;un seul paramètre de type TCollection, donc &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Add&amp;lt;/span&amp;gt; le transmet à l&#039;objet instance de TCollection où &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Add&amp;lt;/span&amp;gt; est appelée. Cela est illustré dans le code suivant :&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; est utile pour diverses raisons. Par exemple, un identificateur de membre déclaré dans un type classe peut être redéclaré dans le bloc de l&#039;une des méthodes de la classe. Dans ce cas, vous pouvez accéder à l&#039;identificateur du membre d&#039;origine en utilisant &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Self.Identifier&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Pour plus d&#039;informations sur &#039;&#039;&#039;Self&#039;&#039;&#039; dans les méthodes de classe, voir &amp;quot;Opérateurs de classes&amp;quot; dans [[Références de classes|Références de classes]].&lt;br /&gt;
&lt;br /&gt;
==Liaison de méthode==&lt;br /&gt;
&lt;br /&gt;
Les liaisons de méthodes peuvent être &#039;&#039;&#039;statiques&#039;&#039;&#039; (par défaut), &#039;&#039;&#039;virtuelles&#039;&#039;&#039; ou &#039;&#039;&#039;dynamiques&#039;&#039;&#039;. Les méthodes virtuelles et dynamiques peuvent être redéfinies et elles peuvent être abstraites. Ces désignations jouent un rôle quand une variable d&#039;un type classe contient une valeur d&#039;un type classe descendant. Elles déterminent quelle implémentation est activée lors de l&#039;appel d&#039;une méthode.&lt;br /&gt;
&lt;br /&gt;
===Méthodes statiques===&lt;br /&gt;
&lt;br /&gt;
Par défaut les méthodes sont statiques. Quand une méthode statique est appelée, le type déclaré (à la compilation) de la variable classe ou objet utilisé dans l&#039;appel de la méthode détermine l&#039;implémentation à activer. Dans l&#039;exemple suivant, les méthodes &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Draw&amp;lt;/span&amp;gt; sont statiques :&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;
Etant donné ces déclarations, le code suivant illustre l&#039;effet de l&#039;appel d&#039;une méthode statique. Dans le second appel à &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Figure.Draw&amp;lt;/span&amp;gt;, la variable &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Figure&amp;lt;/span&amp;gt; référence un objet de classe &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;TRectangle&amp;lt;/span&amp;gt;, mais l&#039;appel invoque l&#039;implémentation de &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Draw&amp;lt;/span&amp;gt; dans &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;TFigure&amp;lt;/span&amp;gt;, car le type déclaré de la variable &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Figure&amp;lt;/span&amp;gt; est &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;TFigure&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;
 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;
===Méthodes virtuelles et dynamiques===&lt;br /&gt;
&lt;br /&gt;
Pour rendre une méthode &#039;&#039;&#039;virtuelle&#039;&#039;&#039; ou &#039;&#039;&#039;dynamique&#039;&#039;&#039;, incluez la directive &#039;&#039;&#039;virtual&#039;&#039;&#039; ou &#039;&#039;&#039;dynamic&#039;&#039;&#039; dans sa déclaration. Les méthodes dynamiques et virtuelles, à la différence des méthodes statiques, peuvent être redéfinies dans les classes descendantes. Quand une méthode redéfinie est appelée, le type réel (à l&#039;exécution) de la classe ou de l&#039;objet utilisé dans l&#039;appel de la méthode, et non pas le type déclaré de la variable, détermine l&#039;implémentation à activer.&lt;br /&gt;
&lt;br /&gt;
Pour redéfinir une méthode, redéclarez-la avec la directive &#039;&#039;&#039;override&#039;&#039;&#039;. Une déclaration &#039;&#039;&#039;override&#039;&#039;&#039; doit correspondre à la déclaration de l&#039;ancêtre dans l&#039;ordre et le type de ses paramètres, ainsi que dans son type de résultat (le cas échéant).&lt;br /&gt;
&lt;br /&gt;
Dans l&#039;exemple suivant, la méthode &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Draw&amp;lt;/span&amp;gt; déclarée dans &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;TFigure&amp;lt;/span&amp;gt; est redéfinie dans deux classes descendantes :&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;
Etant donné ces déclarations, le code suivant illustre l&#039;effet de l&#039;appel d&#039;une méthode virtuelle via une variable dont le type réel change à l&#039;exécution :&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;
Seules les méthodes &#039;&#039;&#039;virtuelles&#039;&#039;&#039; et &#039;&#039;&#039;dynamiques&#039;&#039;&#039; peuvent être redéfinies. Par contre, toutes les méthodes peuvent être surchargées ; voir [[#Surcharge des méthodes|Surcharge des méthodes]].&lt;br /&gt;
&lt;br /&gt;
====Méthodes finales====&lt;br /&gt;
&lt;br /&gt;
Le compilateur {{Delphi}} prend aussi en charge le concept de méthodes virtuelles et dynamiques &#039;&#039;&#039;finales&#039;&#039;&#039;. Les déclarations des méthodes finales ont la forme suivante :&lt;br /&gt;
&lt;br /&gt;
 function|procedure FunctionName; virtual|dynamic; final; &lt;br /&gt;
&lt;br /&gt;
Ici, la syntaxe &amp;lt;code&amp;gt;virtual|dynamic&amp;lt;/code&amp;gt; (deux mots clé et le symbole &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt; entre les mots clés) est utilisée pour spécifier qu&#039;un seul des mots clés &#039;&#039;&#039;virtual&#039;&#039;&#039; ou &#039;&#039;&#039;dynamic&#039;&#039;&#039; doit être utilisé.  Seul le mot clé &#039;&#039;&#039;virtual&#039;&#039;&#039; ou &#039;&#039;&#039;dynamic&#039;&#039;&#039; n&#039;a de sens; le symbole de tuyau lui-même doit être supprimé.&lt;br /&gt;
&lt;br /&gt;
Seul le mot clé &#039;&#039;&#039;final&#039;&#039;&#039; est appliqué à une méthode virtuelle ou dynamique, aucune classe descendante ne peut redéfinir cette methode. L&#039;usage du mot clé &#039;&#039;&#039;final&#039;&#039;&#039; est une décision de conception importante qui permet de définir l&#039;utilisation de la classe. Il peut aussi donner au compilateur des conseils lui permettant d&#039;optimiser le code produit.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Remarque :&#039;&#039;&#039; Les mots clés &#039;&#039;&#039;virtual&#039;&#039;&#039; ou &#039;&#039;&#039;dynamic&#039;&#039;&#039; doivent être écrits avant le mot clé &#039;&#039;&#039;final&#039;&#039;&#039;.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple&#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;
====Comparaison des méthodes virtuelles et des méthodes dynamiques====&lt;br /&gt;
&lt;br /&gt;
Dans {{Delphi}} pour Win32, d&#039;un point de vue sémantique, les méthodes virtuelles et les méthodes dynamiques sont équivalentes. Toutefois, elles diffèrent dans l&#039;implémentation de la répartition de l&#039;appel de méthode à l&#039;exécution : les méthodes virtuelles optimisent la rapidité alors que les méthodes dynamiques optimisent la taille du code.&lt;br /&gt;
&lt;br /&gt;
En général, les méthodes virtuelles constituent la manière la plus efficace d&#039;implémenter un comportement polymorphique. Les méthodes dynamiques sont utiles quand une classe de base déclare de nombreuses méthodes pouvant être redéfinies qui sont héritées par de nombreuses classes descendantes d&#039;une application, mais rarement redéfinies.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Remarque :&#039;&#039;&#039; N&#039;utilisez les méthodes dynamiques que s&#039;il existe un avantage clair et visible de le faire. Utilisez habituellement les méthodes virtuelles.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Redéfinition ou dissimulation====&lt;br /&gt;
&lt;br /&gt;
Si une déclaration de méthode spécifie le même identificateur de méthode et la même signature de paramètre qu&#039;une méthode héritée, sans spécifier &#039;&#039;&#039;override&#039;&#039;&#039;, la nouvelle déclaration masque ou dissimule simplement la méthode héritée sans la redéfinir. Les deux méthodes existent alors dans la classe descendante, où le nom de méthode est lié statiquement. Par exemple :&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;
La directive &#039;&#039;&#039;reintroduce&#039;&#039;&#039; supprime les avertissements du compilateur informant qu&#039;une méthode virtuelle précédemment déclarée est masquée. Par exemple :&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;
Utilisez &#039;&#039;&#039;reintroduce&#039;&#039;&#039; quand vous voulez masquer une méthode virtuelle héritée par une nouvelle méthode.&lt;br /&gt;
&lt;br /&gt;
====Méthodes abstraites====&lt;br /&gt;
&lt;br /&gt;
Une méthode abstraite est une méthode virtuelle ou dynamique n&#039;ayant pas d&#039;implémentation dans la classe où elle est déclarée. Son implémentation est déléguée à une classe descendante. Les méthodes abstraites doivent être déclarées en spécifiant la directive &#039;&#039;&#039;abstract&#039;&#039;&#039; après &#039;&#039;&#039;virtual&#039;&#039;&#039; ou &#039;&#039;&#039;dynamic&#039;&#039;&#039;. Par exemple :&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;
Vous ne pouvez appeler une méthode &#039;&#039;&#039;abstraite&#039;&#039;&#039; que dans une classe ou une instance d&#039;une classe dans laquelle la méthode a été redéfinie.&lt;br /&gt;
&lt;br /&gt;
==Méthodes de classe==&lt;br /&gt;
&lt;br /&gt;
La plupart des méthodes sont appelées méthodes d&#039;instance, car elles opèrent sur une instance individuelle d&#039;un objet. Une méthode de classe est une méthode (autre qu&#039;un constructeur) qui agit sur des classes et pas sur des objets. Il existe deux types de méthodes de classe : les méthodes de classe ordinaires et les méthodes statiques de classe.&lt;br /&gt;
&lt;br /&gt;
===Méthodes de classe ordinaires===&lt;br /&gt;
&lt;br /&gt;
La définition d&#039;une méthode de classe doit commencer par le mot réservé &#039;&#039;&#039;class&#039;&#039;&#039;. Par exemple :&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;
La déclaration de définition d&#039;une méthode de classe doit aussi commencer par &#039;&#039;&#039;class&#039;&#039;&#039;. Par exemple :&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;
Dans la déclaration de définition d&#039;une méthode de classe, l&#039;identificateur &#039;&#039;&#039;Self&#039;&#039;&#039; représente la classe où la méthode est appelée (ce peut être un descendant de la classe dans laquelle elle est définie). Si la méthode est appelée dans la classe &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;C&amp;lt;/span&amp;gt;, alors &#039;&#039;&#039;Self&#039;&#039;&#039; est de type class of &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;C&amp;lt;/span&amp;gt;. Vous ne pouvez donc pas utiliser &#039;&#039;&#039;Self&#039;&#039;&#039; pour accéder à des champs d&#039;instance, des propriétés d&#039;instance et des méthodes normales (objet). Vous pouvez utiliser &#039;&#039;&#039;Self&#039;&#039;&#039; pour appeler les constructeurs ou d&#039;autres méthodes de classe, ou pour accéder aux propriétés de classe et aux champs de classe.&lt;br /&gt;
&lt;br /&gt;
Une méthode de classe peut être appelée via une référence de classe ou une référence d&#039;objet. Quand elle est appelée via une référence d&#039;objet, la classe de l&#039;objet devient la valeur de &#039;&#039;&#039;Self&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
===Méthodes statiques de classe===&lt;br /&gt;
&lt;br /&gt;
Comme les méthodes de classe, les méthodes statiques de classe peuvent être accessibles sans une référence d&#039;objet. A la différence des méthodes de classe ordinaires, les méthodes statiques de classe n&#039;ont pas de paramètre &#039;&#039;&#039;Self&#039;&#039;&#039;. Elles ne peuvent pas accéder aux membres d&#039;instance. Elles peuvent toujours accéder aux champs de classe, aux propriétés de classe et aux méthodes de classe. En outre, contrairement aux méthodes de classe, les méthodes statiques de classe ne peuvent pas être déclarées &#039;&#039;&#039;virtual&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Pour rendre une méthode de classe statique, ajoutez le mot &#039;&#039;&#039;static&#039;&#039;&#039; à leur déclaration, par exemple :&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;
Comme pour une méthode de classe, vous pouvez appeler une méthode statique de classe par l&#039;intermédiaire du type de la classe (par exemple, sans référence d&#039;objet), comme suit :&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;
==Surcharge des méthodes==&lt;br /&gt;
&lt;br /&gt;
Une méthode peut être redéclarée en utilisant la directive &#039;&#039;&#039;overload&#039;&#039;&#039;. Dans ce cas, si la méthode redéclarée a une signature de paramètre différente de celle de son ancêtre, elle surcharge la méthode héritée sans la cacher. L&#039;appel de la méthode dans une classe descendante active l&#039;implémentation qui correspond aux paramètres de l&#039;appel.&lt;br /&gt;
&lt;br /&gt;
Si vous surchargez une méthode virtuelle, utilisez la directive &#039;&#039;&#039;reintroduce&#039;&#039;&#039; quand vous la redéclarez dans les classes descendantes. Par exemple :&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;
Dans une classe, vous ne pouvez pas publier plusieurs méthodes surchargées portant le même nom. La maintenance des informations de type à l&#039;exécution requiert un nom unique pour chaque membre &#039;&#039;&#039;publié&#039;&#039;&#039; :&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;
Les méthodes qui servent de spécificateurs de &#039;&#039;&#039;lecture&#039;&#039;&#039; ou d&#039;&#039;&#039;&#039;écriture&#039;&#039;&#039; de propriétés ne peuvent pas être surchargées.&lt;br /&gt;
&lt;br /&gt;
L&#039;implémentation d&#039;une méthode surchargée doit répéter la liste des paramètres depuis la déclaration de classe. Pour davantage d&#039;informations sur la surcharge, voir [[Procédures et fonctions (Delphi)#Surcharge de procédures et de fonctions|Surcharge de procédures et de fonctions]] dans [[Procédures et fonctions (Delphi)|Procédures et fonctions (Delphi)]].&lt;br /&gt;
&lt;br /&gt;
==Constructeurs==&lt;br /&gt;
&lt;br /&gt;
Un constructeur est une méthode spéciale qui crée et initialise des instances d&#039;objet. La déclaration d&#039;un constructeur ressemble à celle d&#039;une procédure, sauf qu&#039;elle commence par le mot &#039;&#039;&#039;constructor&#039;&#039;&#039;. Exemples :&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;
Les constructeurs doivent utiliser la convention d&#039;appel &#039;&#039;&#039;register&#039;&#039;&#039; par défaut. Bien que la déclaration ne spécifie pas de valeur de retour, un constructeur renvoie une référence à l&#039;objet qu&#039;il a créé ou qui est appelé.&lt;br /&gt;
&lt;br /&gt;
Une classe peut avoir plusieurs constructeurs mais doit en avoir au moins un. L&#039;habitude veut qu&#039;on appelle le constructeur &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Create&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Pour créer un objet, appelez la méthode constructeur sur un type classe. Par exemple :&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;
Cette instruction alloue le stockage pour le nouvel objet, définit la valeur de tous les champs ordinaux sur zéro, assigne &#039;&#039;&#039;nil&#039;&#039;&#039; à tous les champs de type pointeur ou de type classe, et une chaîne vide à tous les champs chaîne. Les autres actions spécifiées dans l&#039;implémentation du constructeur sont effectuées ensuite. Généralement, les objets sont initialisés en fonction des valeurs transmises comme paramètres au constructeur. Enfin, le constructeur renvoie une référence à l&#039;objet qui vient d&#039;être créé et initialisé. Le type de la valeur de retour est le même que le type classe spécifié dans l&#039;appel du constructeur.&lt;br /&gt;
&lt;br /&gt;
Si une exception est déclenchée lors de l&#039;exécution d&#039;un constructeur invoqué sur une référence de classe, le destructeur &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Destroy&amp;lt;/span&amp;gt; est appelé automatiquement pour détruire l&#039;objet inachevé.&lt;br /&gt;
&lt;br /&gt;
Quand un constructeur est appelé en utilisant une référence d&#039;objet (au lieu d&#039;une référence de classe), il ne crée pas d&#039;objet. Le constructeur agit à la place sur l&#039;objet spécifié, en n&#039;exécutant que les instructions de l&#039;implémentation du constructeur et renvoie ensuite une référence à l&#039;objet. Un constructeur est typiquement invoqué sur une référence d&#039;objet en conjonction avec le mot réservé &#039;&#039;&#039;inherited&#039;&#039;&#039; afin d&#039;exécuter un constructeur hérité.&lt;br /&gt;
&lt;br /&gt;
Voici un exemple du type classe et de son constructeur :&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;
Généralement, la première action d&#039;un constructeur est d&#039;appeler le constructeur hérité afin d&#039;initialiser les champs hérités de l&#039;objet. Le constructeur initialise ensuite les champs introduits dans la classe descendante. Comme un constructeur efface toujours le stockage alloué à un nouvel objet, tous les champs contiennent au départ zéro (pour les types ordinaux), &#039;&#039;&#039;nil&#039;&#039;&#039; (types pointeur et classe), chaîne vide (types chaîne) ou Unassigned (variants). Il n&#039;est donc pas nécessaire que l&#039;implémentation du constructeur initialise les champs sauf ceux devant contenir une valeur non nulle ou non vide.&lt;br /&gt;
&lt;br /&gt;
Quand il est invoqué par le biais d&#039;un identificateur de type classe, un constructeur déclaré comme &#039;&#039;&#039;virtual&#039;&#039;&#039; est équivalent à un constructeur statique. Quand ils sont combinés avec des types référence de classe, les constructeurs virtuels permettent une construction polymorphique des objets, c&#039;est-à-dire la construction d&#039;objets dont le type est inconnu à la compilation. (Voir [[Références de classes|Références de classes]].)&lt;br /&gt;
&lt;br /&gt;
==Destructeurs==&lt;br /&gt;
&lt;br /&gt;
Un destructeur est une méthode spéciale qui détruit l&#039;objet à l&#039;endroit de son appel et libère sa mémoire. La déclaration d&#039;un destructeur ressemble à celle d&#039;une procédure, mais elle commence par le mot &#039;&#039;&#039;destructor&#039;&#039;&#039;. Exemple :&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;
Les destructeurs sur Win32 doivent utiliser la convention d&#039;appel &#039;&#039;&#039;register&#039;&#039;&#039; par défaut. Même si une classe peut avoir plusieurs destructeurs, il est conseillé que chaque classe redéfinisse la méthode &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Destroy&amp;lt;/span&amp;gt; héritée et ne déclare pas d&#039;autres destructeurs.&lt;br /&gt;
&lt;br /&gt;
Pour appeler un destructeur, vous devez référencer une instance d&#039;objet. Par exemple :&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;
Lors de l&#039;appel d&#039;un destructeur, les actions spécifiées dans l&#039;implémentation du destructeur sont d&#039;abord exécutées. Typiquement, cela consiste à détruire les objets incorporés et à libérer les ressources allouées par l&#039;objet. Ensuite, le stockage alloué à l&#039;objet est libéré.&lt;br /&gt;
&lt;br /&gt;
Voici un exemple d&#039;implémentation d&#039;un destructeur :&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;
Typiquement, la dernière action de l&#039;implémentation d&#039;un destructeur est l&#039;appel du destructeur hérité afin de détruire les champs hérités de l&#039;objet.&lt;br /&gt;
&lt;br /&gt;
Quand une exception est déclenchée lors de la création d&#039;un objet, Destroy est appelée automatiquement afin de libérer l&#039;objet inachevé. Cela signifie que &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Destroy&amp;lt;/span&amp;gt; doit être préparé à libérer des objets partiellement construits. Comme un constructeur définit les champs d&#039;un nouvel objet sur zéro ou sur des valeurs vides avant d&#039;effectuer d&#039;autres actions, les champs de type classe ou pointeur d&#039;un objet partiellement construit sont toujours définis sur &#039;&#039;&#039;nil&#039;&#039;&#039;. Un destructeur doit donc tester les valeurs &#039;&#039;&#039;nil&#039;&#039;&#039; avant d&#039;agir sur des champs de type classe ou pointeur. L&#039;appel de la méthode &#039;&#039;&#039;Free&#039;&#039;&#039; (définie dans TObject) au lieu de &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Destroy&amp;lt;/span&amp;gt;, permet de tester facilement les valeurs &#039;&#039;&#039;nil&#039;&#039;&#039; avant de détruire un objet.&lt;br /&gt;
&lt;br /&gt;
==Constructeurs de classes==&lt;br /&gt;
&lt;br /&gt;
Un constructeur de classe est une méthode de classe spéciale qui n&#039;est pas accessible aux développeurs. Les appels des constructeurs de classes sont automatiquement insérés par le compilateur dans la section d&#039;initialisation de l&#039;unité où la classe est définie. Normalement, les constructeurs de classes sont utilisés pour initialiser les champs statiques de la classe ou effectuer un type d&#039;initialisation, nécessaire avant que la classe ou toute instance de classe puisse fonctionner correctement. Bien que le même résultat puisse être obtenu en plaçant le code d&#039;initialisation de la classe dans la section &#039;&#039;initialization&#039;&#039;, les constructeurs de classes ont l&#039;avantage d&#039;aider le compilateur à déterminer les classes qui doivent être incluses dans le fichier binaire final et celles qui doivent être retirées.&lt;br /&gt;
&lt;br /&gt;
L&#039;exemple suivant illustre la façon habituelle d&#039;initialiser les champs de classes :&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;
Cette méthode a un gros désavantage : même si une application peut inclure l&#039;unité dans laquelle &#039;&#039;&#039;TBox&#039;&#039;&#039; est déclaré, elle ne peut jamais réellement utiliser la classe &#039;&#039;&#039;TBox&#039;&#039;&#039;. Dans l&#039;exemple en cours, la classe TBox est incluse dans le binaire résultant, car elle est référencée dans la section initialization. Pour alléger ce problème, considérons l&#039;utilisation des constructeurs de classes :&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;
Dans ce cas, le compilateur vérifie si TBox est réellement utilisé quelque part dans l&#039;application, et en cas d&#039;utilisation, un appel au constructeur de classe est ajouté automatiquement à la section initialization de l&#039;unité.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarque :&#039;&#039;&#039; Même si le compilateur fait attention à l&#039;ordre d&#039;initialisation des classes, l&#039;ordre peut devenir aléatoire dans certains scénarios complexes. Cela se produit quand le constructeur d&#039;une classe dépend de l&#039;état d&#039;une autre classe qui, à son tour, dépend de la première classe.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarque :&#039;&#039;&#039; Le constructeur de classe relatif à un enregistrement ou une classe générique peut s&#039;exécuter plusieurs fois. Le nombre exact de fois que le constructeur de classe est exécuté dans ce cas dépend du nombre de versions spécialisées du type générique. Par exemple, le constructeur de classe pour une classe &#039;&#039;TList&amp;amp;lt;String&amp;amp;gt;&#039;&#039; spécialisée peut s&#039;exécuter plusieurs fois dans la même application.&lt;br /&gt;
&lt;br /&gt;
==Destructeurs de classes==&lt;br /&gt;
&lt;br /&gt;
Les destructeurs de classes sont l&#039;opposé des constructeurs de classes, dans le fait qu&#039;ils réalisent la finalisation de la classe. Les destructeurs de classes présentent les mêmes avantages que les constructeurs de classes, à l&#039;exception des fonctions de &#039;&#039;finalisation&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
L&#039;exemple suivant est construit sur l&#039;exemple présenté dans les constructeurs de classes et il introduit la routine de finalisation :&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;Remarque :&#039;&#039;&#039; Le destructeur de classe relatif à un enregistrement ou une classe générique peut s&#039;exécuter plusieurs fois. Le nombre exact de fois que le destructeur de classe est exécuté dans ce cas dépend du nombre de versions spécialisées du type générique. Par exemple, le destructeur de classe pour une classe &#039;&#039;TList&amp;amp;lt;String&amp;amp;gt;&#039;&#039; spécialisée peut s&#039;exécuter plusieurs fois dans la même application.&lt;br /&gt;
&lt;br /&gt;
==Méthodes de messages==&lt;br /&gt;
&lt;br /&gt;
Les méthodes de messages implémentent des réponses à des messages répartis dynamiquement. La syntaxe des méthodes de messages est supportée sur toutes les plates-formes.  &amp;lt;f s=&amp;quot;vcl&amp;quot; t=&amp;quot;span&amp;quot; /&amp;gt;La VCL utilise des méthodes de messages pour répondre aux messages Windows. &amp;lt;f e=&amp;quot;vcl&amp;quot; t=&amp;quot;span&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une méthode de message est créée en incluant la directive &#039;&#039;&#039;message&#039;&#039;&#039; dans une déclaration de méthode, suivie d&#039;une constante entière comprise entre 1 et 49151 qui spécifie l&#039;identificateur du message.  &amp;lt;f s=&amp;quot;vcl&amp;quot; t=&amp;quot;span&amp;quot; /&amp;gt; Pour les méthodes de messages des contrôles VCL, la constante entière peut être l&#039;un des identificateurs de messages Win32, avec les types d&#039;enregistrements correspondants, dans l&#039;unité &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Messages&amp;lt;/span&amp;gt;. &amp;lt;f e=&amp;quot;vcl&amp;quot; t=&amp;quot;span&amp;quot; /&amp;gt; Une méthode de message doit être une procédure qui n&#039;attend qu&#039;un seul paramètre &#039;&#039;&#039;var&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Par exemple :&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;
Une méthode de message n&#039;a pas besoin d&#039;inclure la directive &#039;&#039;&#039;override&#039;&#039;&#039; pour redéfinir une méthode de message héritée. En fait, il n&#039;est pas nécessaire de spécifier le même nom de méthode ou type de paramètre que la méthode qu&#039;elle redéfinit. L&#039;identificateur du message détermine seul les messages auxquels la méthode répond et s&#039;il s&#039;agit d&#039;une redéfinition.&lt;br /&gt;
&lt;br /&gt;
===Implémentation des méthodes de messages===&lt;br /&gt;
&lt;br /&gt;
L&#039;implémentation d&#039;une méthode de message peut appeler la méthode de message héritée, comme dans l&#039;exemple suivant :&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;
L&#039;instruction &#039;&#039;&#039;inherited&#039;&#039;&#039; effectue une recherche arrière dans la hiérarchie des classes et invoque la première méthode de message ayant le même identificateur que la méthode en cours, et lui transmet automatiquement l&#039;enregistrement message. Si aucune classe ancêtre n&#039;implémente de méthode de message pour l&#039;identificateur spécifié, &#039;&#039;&#039;inherited&#039;&#039;&#039; appelle la méthode &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;DefaultHandler&amp;lt;/span&amp;gt; définie initialement dans TObject.&lt;br /&gt;
&lt;br /&gt;
L&#039;implémentation de &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;DefaultHandler&amp;lt;/span&amp;gt; dans TObject rend simplement le contrôle sans rien faire. En redéfinissant &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;DefaultHandler&amp;lt;/span&amp;gt;, une classe peut implémenter sa propre gestion par défaut des messages. Sous Win32, la méthode &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;DefaultHandler&amp;lt;/span&amp;gt; pour les contrôles appelle &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;DefWindowProc&amp;lt;/span&amp;gt; de l&#039;API Win32.&lt;br /&gt;
&lt;br /&gt;
===Répartition des messages===&lt;br /&gt;
&lt;br /&gt;
Les gestionnaires de messages sont rarement appelés directement. A la place, les messages sont répartis sur un objet en utilisant la méthode &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Dispatch&amp;lt;/span&amp;gt; héritée de TObject :&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;
Le paramètre &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Message&amp;lt;/span&amp;gt; transmis à &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Dispatch&amp;lt;/span&amp;gt; doit être un enregistrement dont la première entrée est un champ de type &#039;&#039;&#039;Word&#039;&#039;&#039; contenant un identificateur de message.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Dispatch&amp;lt;/span&amp;gt; effectue une recherche arrière dans la hiérarchie des classes, en commençant par la classe de l&#039;objet où elle est appelée, et invoque la première méthode de message pour l&#039;identificateur qui lui a été transmis. Si aucune méthode de message n&#039;est trouvée pour l&#039;identificateur donné, &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;Dispatch&amp;lt;/span&amp;gt; appelle &amp;lt;span class=&amp;quot;codeInline&amp;quot;&amp;gt;DefaultHandler&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Voir aussi==&lt;br /&gt;
&lt;br /&gt;
*[[Classes et objets (Delphi)|Classes et objets (Delphi)]]&lt;br /&gt;
*[[Champs (Delphi)|Champs (Delphi)]]&lt;br /&gt;
*[[Propriétés (Delphi)|Propriétés (Delphi)]]&lt;br /&gt;
*[[Déclarations de types imbriqués|Déclarations de types imbriquées]]&lt;br /&gt;
*[[Références de classes|Références de classes]]&lt;br /&gt;
*[[Exceptions (Delphi)|Exceptions (Delphi)]]&lt;br /&gt;
*[[Surcharge d&#039;opérateurs (Delphi)|Surcharge d&#039;opérateurs (Delphi)]]&lt;br /&gt;
*[[Assistances de classes et d&#039;enregistrements (Delphi)|Assistances de classes et d&#039;enregistrements (Delphi)]]&lt;br /&gt;
* [[Procédures et fonctions (Delphi)|Procédures et fonctions (Delphi)]]&lt;br /&gt;
* [[Contrôle des programmes (Delphi)|Contrôle des programmes (Delphi)]]&lt;br /&gt;
&lt;br /&gt;
{{DEFAULTSORT:Methodes (Delphi)}}&lt;br /&gt;
[[Category:Delphi]]&lt;br /&gt;
[[Category:Guide du langage Delphi]]&lt;br /&gt;
[[Category:AMMigrate]]&lt;br /&gt;
&lt;br /&gt;
[[en:Methods (Delphi)]]&lt;br /&gt;
[[de:Methoden (Delphi)]]&lt;br /&gt;
[[ja:メソッド（Delphi）]]&lt;/div&gt;</summary>
		<author><name>Rrivero</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Athens/f/index.php?title=Concepteur_de_fiches&amp;diff=216288</id>
		<title>Concepteur de fiches</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Athens/f/index.php?title=Concepteur_de_fiches&amp;diff=216288"/>
		<updated>2022-12-19T15:17:22Z</updated>

		<summary type="html">&lt;p&gt;Rrivero : RS-115132. Removed HTML Designer Section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Parent|Introduction à RAD Studio}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;f s=&amp;quot;radstudio&amp;quot; /&amp;gt;&lt;br /&gt;
Le &#039;&#039;&#039;Concepteur de fiches&#039;&#039;&#039; (ou Concepteur) est affiché automatiquement quand vous créez ou éditez une fiche, telle qu&#039;une {{f|radstudio|[[Application Fiches VCL|application Fiches VCL]] ou une}} [[Application HD multi-périphérique|Application HD multi-périphérique]].&lt;br /&gt;
Le &#039;&#039;&#039;Concepteur de fiches&#039;&#039;&#039; s&#039;exécute automatiquement quand vous créez une application graphique qui utilise un fichier fiche : un fichier &amp;lt;code&amp;gt;.dfm&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;.fmx&amp;lt;/code&amp;gt;.&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;
Le &#039;&#039;&#039;Concepteur de fiches&#039;&#039;&#039; (ou Concepteur) est affiché automatiquement quand vous créez ou éditez une fiche, telle qu&#039;une [[Application HD multi-périphérique|Application HD multi-périphérique]].&lt;br /&gt;
Le &#039;&#039;&#039;Concepteur de fiches&#039;&#039;&#039; s&#039;exécute automatiquement quand vous créez une application graphique qui utilise un fichier fiche (un fichier &amp;lt;code&amp;gt;.fmx&amp;lt;/code&amp;gt;).&lt;br /&gt;
&amp;lt;f e=&amp;quot;appmethod&amp;quot; /&amp;gt;&lt;br /&gt;
Pour attribuer la focalisation au &#039;&#039;&#039;Concepteur de fiches&#039;&#039;&#039; quand un projet visuel est ouvert dans l&#039;EDI, cliquez sur l&#039;onglet &#039;&#039;&#039;Conception&#039;&#039;&#039;  en bas de la fenêtre d&#039;édition principale :&lt;br /&gt;
[[Image:CodeDesignHistoryTabs.jpg|Onglets Code, Conception et Historique]]&lt;br /&gt;
&lt;br /&gt;
L&#039;apparence et les fonctionnalités du Concepteur peuvent changer selon le type de fiche que vous créez ou éditez. Par exemple, si vous utilisez un élément HTML, vous pouvez afficher [[Utilisation de l&#039;éditeur de balise HTML|l&#039;éditeur de balise HTML]] dans le Concepteur en sélectionnant &amp;lt;font color=&amp;quot;#598527&amp;quot;&amp;gt; &#039;&#039;&#039;Voir &amp;amp;gt; Editeur de balise&#039;&#039;&#039;&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Fenêtre Concepteur de fiches==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;f s=&amp;quot;radstudio&amp;quot; /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;{{FM}} et la VCL ont des Concepteurs de fiches différents et des fiches différentes :&amp;lt;br /&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
Voici la &#039;&#039;&#039;fiche multi-périphérique (FireMonkey)&#039;&#039;&#039; et la &#039;&#039;&#039;fiche VCL&#039;&#039;&#039; telles qu&#039;elles apparaissent (séparément) dans le &#039;&#039;&#039;Concepteur de fiches&#039;&#039;&#039;, lorsque vous créez une [[Application multi-périphérique|application multi-périphérique]] ou une [[Application Fiches VCL|application Fiches VCL]] :&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;Fiche multi-périphérique&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
[[Image:multidevice form.png|link=|Fiche multi-périphérique]]&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&#039;&#039;&#039;Fiche VCL&#039;&#039;&#039;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&lt;br /&gt;
[[Image:vcl form.png|link=|Fiche VCL]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Les deux fiches semblent différentes, car une fiche VCL est une fiche Windows native, alors qu&#039;une fiche multi-périphérique est indépendante de la plate-forme et est dessinée de façon personnalisée par les outils {{FM}}. Par exemple, une fiche VCL affiche les boutons Windows standard pour les commandes Minimiser, Redimensionner et Fermer. Une fiche multi-périphérique apparaît par défaut avec la vue &#039;&#039;&#039;maître&#039;&#039;&#039;, qui est indépendante de la plate-forme. Une application multi-périphérique peut cibler toutes les plates-formes disponibles alors que la VCL cible uniquement Windows.&lt;br /&gt;
&lt;br /&gt;
Malgré ces différences visuelles, le &#039;&#039;&#039;Concepteur de fiches&#039;&#039;&#039; fonctionne presque de la même façon pour {{FM}} et la VCL. Voici une différence : certaines commandes de [[#Menu contextuel|menu contextuel]] diffèrent entre {{FM}} et la VCL.&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;
Voici une &#039;&#039;&#039;fiche multi-périphérique&#039;&#039;&#039; telle qu&#039;elle apparaît dans le &#039;&#039;&#039;Concepteur de fiches&#039;&#039;&#039;, lorsque vous créez une [[Application multi-périphérique|application multi-périphérique]] :&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;Fiche multi-périphérique&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
[[Image:FireMonkeyForm.png|Fiche multi-périphérique]]&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;
==Sélecteur de style==&lt;br /&gt;
&lt;br /&gt;
[[File:style selector.png|link=]]&lt;br /&gt;
&lt;br /&gt;
Le Concepteur de fiches multi-périphériques inclut un &#039;&#039;&#039;sélecteur de style&#039;&#039;&#039; qui choisit le style de plate-forme de conception de base utilisé dans la vue &#039;&#039;&#039;maître&#039;&#039;&#039;. Les styles sont basés sur les plates-formes qu&#039;une application multi-périphérique peut cibler :&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;
Sélectionnez le style de la vue &#039;&#039;&#039;maître&#039;&#039;&#039; à la conception pour afficher toutes les propriétés associées au style/plate-forme sélectionné. Par exemple, si vous voulez définir la propriété &#039;&#039;&#039;StyleLookup&#039;&#039;&#039; d&#039;un [[lib_fr:FMX.StdCtrls.TButton|TButton]] pour un périphérique Android, sélectionnez le style &#039;&#039;&#039;Android&#039;&#039;&#039; ; notez que les options disponibles dans le menu déroulant de &#039;&#039;&#039;[[Inspecteur d&#039;objets|l&#039;inspecteur d&#039;objets]]&#039;&#039;&#039; pour la propriété &#039;&#039;&#039;StyleLookup&#039;&#039;&#039; contiennent des sélections pour un périphérique Android.&lt;br /&gt;
&lt;br /&gt;
==Sélecteur de vue==&lt;br /&gt;
&lt;br /&gt;
Le &#039;&#039;&#039;Concepteur de fiches&#039;&#039;&#039; multi-périphérique inclut un &#039;&#039;&#039;sélecteur de vue&#039;&#039;&#039;, un menu déroulant montrant toutes les vues &#039;&#039;&#039;disponibles&#039;&#039;&#039; qui représentent différents périphériques, tels que des périphériques iOS, Android, Windows et macOS spécifiques. Dès que vous sélectionnez les vues dans la liste &#039;&#039;&#039;Disponibles&#039;&#039;&#039; pour votre projet, ces dernières sont ajoutées à la liste &#039;&#039;&#039;Créées&#039;&#039;&#039;. Voir &#039;&#039;&#039;[[Utilisation des vues FireMonkey|Utilisation des vues {{FM}}]]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
[[File:view selector.png|link=]]&lt;br /&gt;
&lt;br /&gt;
Le &#039;&#039;&#039;sélecteur de vue&#039;&#039;&#039; fournit les contrôles suivants :&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; Icône &#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039; Description &#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]]&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
Sélectionne la vue en cours à partir d&#039;une liste déroulante de vues.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez ajouter une ou plusieurs vues à votre projet en cliquant simplement sur les vues de la liste &#039;&#039;&#039;Disponibles&#039;&#039;&#039;. Voir [[Ajout de vues à votre projet multi-périphérique|Ajout de vues à votre projet multi-périphérique]].&lt;br /&gt;
&lt;br /&gt;
Vous pouvez également créer des vues personnalisées et les ajouter au &#039;&#039;&#039;sélecteur de vue&#039;&#039;&#039;.  Voir [[Ajout d&#039;une vue personnalisée au sélecteur de vue|Ajout d&#039;une vue personnalisée au sélecteur de vue]].&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
[[File:RemoveViewIcon.png]] &#039;&#039;&#039;Retirer une vue&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
Retire la vue en cours. Un dialogue de &#039;&#039;&#039;confirmation&#039;&#039;&#039; apparaît.&lt;br /&gt;
&lt;br /&gt;
La vue est retirée du code.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
[[File:RotateCurrentView.png]] &#039;&#039;&#039;Faire pivoter la vue en cours&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
Fait pivoter la vue en cours de 90 degrés dans le sens des aiguilles d&#039;une montre. Disponible uniquement pour les vues mobiles (indisponible pour les vues de bureau).&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
[[File:HideShowFormFrame.png]] &#039;&#039;&#039;Afficher ou masquer le cadre de la fiche&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;text-align: left; vertical-align: top;&amp;quot; |&lt;br /&gt;
Masque le cadre d&#039;une vue sélectionnée (ou affiche le cadre s&#039;il était auparavant masqué).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Composants visuels==&lt;br /&gt;
&lt;br /&gt;
Vous pouvez ajouter des composants visuels à votre fiche {{f|radstudio|multi-périphérique ou VCL}} {{f|appmethod|multi-périphérique}} en faisant glisser les composants sélectionnés de la &#039;&#039;&#039;[[Palette d&#039;outils|palette d&#039;outils]]&#039;&#039;&#039; (située dans la section inférieure droite de l&#039;EDI) sur la fiche. Ce sont les composants qui seront visibles par l&#039;utilisateur final au moment de l&#039;exécution. Les objets disponibles sur la &#039;&#039;&#039;palette d&#039;outils&#039;&#039;&#039; changent dynamiquement selon le type d&#039;application ou de fiche que vous concevez.&lt;br /&gt;
&lt;br /&gt;
La &#039;&#039;&#039;[[Palette d&#039;outils|palette d&#039;outils]]&#039;&#039;&#039; inclut des contrôles tels que des boutons, des libellés, des barres d&#039;outils et des zones de liste pour chacune des diverses catégories d&#039;outils ; des types d&#039;applications si vous travaillez au niveau projet, par exemple des experts DLL, des applications console ou logo ; des contrôles web, des éléments HTML et des composants de données quand vous travaillez sur une application web.&lt;br /&gt;
&lt;br /&gt;
Les propriétés et événements des composants visuels et non visuels du Concepteur de fiches peuvent être visualisés et définis en utilisant &#039;&#039;&#039;[[Inspecteur d&#039;objets|l&#039;inspecteur d&#039;objets]]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==Composants non visuels==&lt;br /&gt;
&lt;br /&gt;
Les composants non visuels tels qu&#039;un [[lib_fr:FMX.Types.TCustomTouchManager.GestureManager|GestureManager]] sont attachés à la fiche, mais ils ne sont visibles que pendant la conception ; ils ne sont pas visibles par l&#039;utilisateur final à l&#039;exécution. Vous pouvez utiliser les composants non visuels pour réutiliser des groupes d&#039;objets de base de données ou système ou pour isoler des parties de votre application qui gèrent la connexion de base de données ou des règles métier.&lt;br /&gt;
&lt;br /&gt;
L&#039;EDI vous permet de [[Masquer les composants non visuels|masquer ou d&#039;afficher]] les composants non visuels à la conception.&lt;br /&gt;
&lt;br /&gt;
==Menu contextuel==&lt;br /&gt;
&lt;br /&gt;
Lorsque vous cliquez avec le bouton droit sur une fiche dans le &#039;&#039;&#039;Concepteur de fiches&#039;&#039;&#039;, le menu contextuel est affiché. {{f|radstudio|Les commandes de menu contextuel sont disponibles à la fois pour la VCL et {{FM}}, sauf indication contraire dans le tableau suivant.}}&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Remarque :&#039;&#039;&#039; Cette section couvre seulement les éléments du menu contextuel disponibles lors de l&#039;édition d&#039;une fiche. Pour les modules de données, voir [[Création et modification de modules de données standard#Menu contextuel des modules de données|Menu contextuel des modules de données]].&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;Elément&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
Editeur d&#039;éléments&lt;br /&gt;
&lt;br /&gt;
(certains composants {{FM}})&lt;br /&gt;
|&lt;br /&gt;
Ouvre le &#039;&#039;&#039;Concepteur d&#039;éléments&#039;&#039;&#039; avec la focalisation sur le contrôle sélectionné.&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
Ajouter un élément&lt;br /&gt;
&lt;br /&gt;
(certains composants {{FM}})&lt;br /&gt;
|&lt;br /&gt;
Vous permet d&#039;ajouter un élément au contrôle sélectionné sur la fiche. Par exemple, si vous ajoutez un contrôle [[lib_fr:FMX.Edit.TEdit|TEdit]] sur une fiche multi-périphérique, vous pouvez cliquer avec le bouton droit sur le contrôle TEdit, sélectionner &#039;&#039;&#039;Ajouter un élément&#039;&#039;&#039; et ajouter un glyphe incorporé tel que TPasswordEditButton.&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
Edition&lt;br /&gt;
|&lt;br /&gt;
Effectuez une sélection parmi les sous-commandes d&#039;édition suivantes, qui s&#039;appliquent au contenu du Concepteur de fiches :&lt;br /&gt;
* Annuler&lt;br /&gt;
* Couper&lt;br /&gt;
* Copier&lt;br /&gt;
* Coller&lt;br /&gt;
* Supprimer&lt;br /&gt;
* Tout sélectionner&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
Contrôle&lt;br /&gt;
|&lt;br /&gt;
Contrôle les couches d&#039;avant-plan et d&#039;arrière-plan du contrôle sélectionné. Choisissez parmi les sous-commandes suivantes :&lt;br /&gt;
* [[Mettre en avant-plan|Mettre en avant-plan]]&lt;br /&gt;
* [[Mettre en arrière-plan|Mettre en arrière-plan]]&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
[[Expert LiveBindings|Expert LiveBindings]]&lt;br /&gt;
&lt;br /&gt;
(seulement si activé dans &amp;lt;font color=&amp;quot;#598527&amp;quot;&amp;gt;&#039;&#039;&#039;Outils&amp;amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;Options&amp;amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;LiveBindings&#039;&#039;&#039;&amp;lt;/font&amp;gt;)&lt;br /&gt;
|&lt;br /&gt;
Ouvre &#039;&#039;&#039;[[Expert LiveBindings|l&#039;expert LiveBindings]]&#039;&#039;&#039;.&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
[[Concepteur LiveBindings|Lier visuellement...]]&lt;br /&gt;
|&lt;br /&gt;
Ouvre le &#039;&#039;&#039;[[Concepteur LiveBindings|Concepteur LiveBindings]]&#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;
Définit l&#039;alignement, la taille et l&#039;échelle du contrôle sélectionné. Choisissez parmi les sous-commandes suivantes :&lt;br /&gt;
* [[Aligner sur la grille|Aligner sur la grille]].&lt;br /&gt;
* Aligner. Ouvre la boîte de dialogue [[Alignement (Concepteur de fiches)|Alignement]].&lt;br /&gt;
* Taille. Ouvre la boîte de dialogue [[Taille|Taille]].  {{f|radstudio|&lt;br /&gt;
* Echelle. Ouvre la boîte de dialogue [[Echelle|Echelle]] (disponible uniquement pour les fiches VCL). }}&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
[[Basculer les enfants|Basculer les enfants]]&lt;br /&gt;
|&lt;br /&gt;
Inverse les enfants de droite et de gauche. Choisissez parmi les sous-commandes suivantes :&lt;br /&gt;
* Tous -- inverse tous les éléments sur la fiche&lt;br /&gt;
* Sélectionnés -- inverse seulement les éléments sélectionnés&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
Ordre de tabulation&lt;br /&gt;
|&lt;br /&gt;
Invoque la boîte de dialogue [[Ordre de tabulation|Ordre de tabulation]].&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
Ordre de création&lt;br /&gt;
&lt;br /&gt;
(composants non visuels)&lt;br /&gt;
|&lt;br /&gt;
Ouvre la boîte de dialogue [[Ordre de création|Ordre de création]].&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
[[Masquer les composants non visuels|Masquer les composants non-visuels]]&lt;br /&gt;
|&lt;br /&gt;
Vous permet de [[Masquer les composants non visuels|masquer ou d&#039;afficher]] les composants non-visuels au moment de la conception.&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
[[Revenir aux valeurs héritées|Revenir aux valeurs héritées]]&lt;br /&gt;
|&lt;br /&gt;
Réinitialise les propriétés, les méthodes et les événements du contrôle sélectionné sur les valeurs du contrôle de la classe de base. Voir [[Revenir aux valeurs héritées|Revenir aux valeurs héritées]].&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
Ajouter au référentiel&lt;br /&gt;
|&lt;br /&gt;
Ouvre la boîte de dialogue [[Ajouter au référentiel|Ajouter au référentiel]].&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
[[Voir comme texte|Voir comme texte]]&lt;br /&gt;
|&lt;br /&gt;
Ouvre le fichier fiche en cours au format texte dans la fenêtre [[Editeur de code|Editeur de code]]. Voir [[Voir comme texte|Voir comme texte]].&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
[[DFM texte ou FMX texte|FMX texte]]{{f|vcl|&amp;lt;br /&amp;gt;&lt;br /&gt;
(fiches multi-périphériques)&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
[[DFM texte ou FMX texte|DFM texte]]&amp;lt;br /&amp;gt;&lt;br /&gt;
(fiches VCL)}}&lt;br /&gt;
|&lt;br /&gt;
Enregistre le fichier fiche au format texte (activé) ou au format binaire (désactivé). Voir [[DFM texte ou FMX texte|DFM texte ou FMX texte]].&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
Modifier le style par défaut&amp;lt;br /&amp;gt;&lt;br /&gt;
Modifier un style personnalisé&lt;br /&gt;
&lt;br /&gt;
(contrôles de bureau {{FM}})&lt;br /&gt;
|&lt;br /&gt;
Ouvre le &#039;&#039;&#039;[[Concepteur de styles FireMonkey|Concepteur de styles FireMonkey]].&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Pour de plus amples informations, voir [[Personnalisation des applications FireMonkey avec les styles|Personnalisation des applications FireMonkey avec les styles]].&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot; {{fr|vcl}}&lt;br /&gt;
|&lt;br /&gt;
Tester le dialogue&lt;br /&gt;
&lt;br /&gt;
(VCL seulement)&lt;br /&gt;
|&lt;br /&gt;
Pour tous les dialogues VCL modaux, teste le dialogue. Ainsi, si vous cliquez avec le bouton droit sur un OpenDialog sur le Concepteur de fiches et sélectionnez &#039;&#039;&#039;Tester le dialogue&#039;&#039;&#039;, la boîte de dialogue d&#039;ouverture de fichiers standard est affichée.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Touches de raccourci sur le Concepteur de fiches==&lt;br /&gt;
&lt;br /&gt;
Vous pouvez utiliser les touches de raccourci suivantes pour déplacer ou redimensionner les composants sur le Concepteur de fiches.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
!&#039;&#039;&#039;Raccourci&#039;&#039;&#039;&lt;br /&gt;
!&#039;&#039;&#039;Action&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;Ctrl + Zone de sélection de la souris&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
Sélectionne tous les contrôles enfant du contrôle parent qui sont localisés dans la zone sélectionnée avec la souris.&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;Maj + Sélection de la souris&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
Sélectionne plusieurs contrôles simultanément. Enfoncez la touche Maj lorsque vous cliquez sur les différents contrôles à sélectionner.&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;Ctrl + Touche fléchée&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
Déplace lentement le composant sélectionné&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;Ctrl + Maj + Touche fléchée&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
Déplace le composant plus rapidement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;Tab&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;Touche fléchée &amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
Modifie la focalisation parmi les composants&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;Maj + Touche fléchée &amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
Modifie la taille du composant&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;Echap &amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
Sélectionne le composant parent&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;Ctrl + Tab &amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
Accède à l&#039;onglet Edition suivant&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;Ctrl + Maj + Tab&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
Accède à l&#039;onglet Edition précédent&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Voir aussi==&lt;br /&gt;
&lt;br /&gt;
* [[Options du Concepteur de fiches|Options du Concepteur de fiches]]&lt;br /&gt;
* [[Tutoriel mobile : Utilisation d&#039;un composant Bouton avec différents styles (iOS et Android)|Tutoriel mobile : Utilisation d&#039;un composant Bouton avec différents styles (iOS et Android)]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;f s=&amp;quot;appmethod&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* [[Présentation de l&#039;EDI - Index (tutoriel de l&#039;EDI)|Présentation de l&#039;EDI]]&lt;br /&gt;
* [[Ajout de composants avec le Concepteur de fiches (tutoriel de l&#039;EDI)|Ajout de composants à une fiche]]&lt;br /&gt;
* [[Editeur de code|Editeur de code]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;f e=&amp;quot;appmethod&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* [[Utilisation des vues FireMonkey|Utilisation des vues FireMonkey]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;f s=&amp;quot;radstudio&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* [[Présentation de l&#039;EDI|Présentation de l&#039;EDI]]&lt;br /&gt;
* [[Editeur de code|Editeur de code]]&lt;br /&gt;
* [[Démarrage d&#039;un projet - Présentation|Démarrage d&#039;un projet - Présentation]]&lt;br /&gt;
* [[Ajout de composants à une fiche|Ajout de composants à une fiche]]&lt;br /&gt;
* [[Définition des propriétés et des événements|Définition des propriétés et des événements]]&lt;br /&gt;
* [[Directives de conception (VCL seulement)|Directives de conception (VCL seulement)]]&lt;br /&gt;
* [[Utilisation de directives du Concepteur avec des composants VCL|Utilisation de directives du Concepteur avec des composants VCL]]&lt;br /&gt;
* [[Prendre un instantané de votre fiche (VCL seulement)|Prendre un instantané de votre fiche (VCL seulement)]]&lt;br /&gt;
* [[Aperçu du positionneur de fiches|Aperçu du positionneur de fiches]] &lt;br /&gt;
&lt;br /&gt;
&amp;lt;f e=&amp;quot;radstudio&amp;quot; /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
* [[Aperçu multi-périphérique|Aperçu multi-périphérique]]&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:Utilisation de RAD Studio]]&lt;br /&gt;
[[Category:AMMigrate]]&lt;br /&gt;
&lt;br /&gt;
[[en:Form Designer]]&lt;br /&gt;
[[de:Formular-Designer]]&lt;br /&gt;
[[ja:フォーム デザイナ]]&lt;/div&gt;</summary>
		<author><name>Rrivero</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Athens/f/index.php?title=FireMonkey_3D&amp;diff=216111</id>
		<title>FireMonkey 3D</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Athens/f/index.php?title=FireMonkey_3D&amp;diff=216111"/>
		<updated>2022-09-30T19:27:17Z</updated>

		<summary type="html">&lt;p&gt;Rrivero : RS-78784. Removed TVideo3D component&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Parent|Guide des applications FireMonkey}}&lt;br /&gt;
&lt;br /&gt;
==Initiation au 3D==&lt;br /&gt;
&lt;br /&gt;
{{FM}} présente les vues 2D des objets en espace 3D. Un [[lib_fr:FMX.Viewport3D.TViewport3D|TViewport3D]] affiche le contenu 3D dans une autre forme 2D, tandis qu&#039;un [[lib_fr:FMX.Forms3D.TForm3D|TForm3D]] commence par le contenu 3D. 2D et 3D peuvent être [[#Mélange 2D et 3D|imbriqués]].&lt;br /&gt;
&lt;br /&gt;
{{FM}} 3D utilise les bibliothèques spécifiques aux plates-formes, comme suit&amp;amp;nbsp;:&lt;br /&gt;
&lt;br /&gt;
* Pour Windows, la bibliothèque &#039;&#039;&#039;Direct3D&#039;&#039;&#039; (partie de DirectX&amp;amp;nbsp;; fournie dans la portée d&#039;unité [[lib_fr:Winapi|Winapi]])&lt;br /&gt;
* Pour Mac, la bibliothèque &#039;&#039;&#039;OpenGL&#039;&#039;&#039; (fournie dans la portée d&#039;unité Macapi)&lt;br /&gt;
&lt;br /&gt;
===Objets 3D===&lt;br /&gt;
&lt;br /&gt;
{{FM}} fournit plusieurs types d&#039;objets 3D&amp;amp;nbsp;:&lt;br /&gt;
&lt;br /&gt;
* Formes 3D primitives comme [[lib_fr:FMX.Objects3D.TCube|TCube]], [[lib_fr:FMX.Objects3D.TSphere|TSphere]] et [[lib_fr:FMX.Objects3D.TCone|TCone]].&lt;br /&gt;
* [[lib_fr:FMX.Objects3D.TMesh|TMesh]] pour les objets 3D complexes.&lt;br /&gt;
* Objets 2D extrudés en 3D, comme [[lib_fr:FMX.Objects3D.TText3D|TText3D]]. Les objets extrudés ont trois côtés&amp;amp;nbsp;: l&#039;avant, avec la forme 2D originale&amp;amp;nbsp;; l&#039;arrière, une image miroir de cette forme, et &#039;&#039;l&#039;axe&#039;&#039; de l&#039;extrusion entre eux.&lt;br /&gt;
* Objets 2D plats en espace 3D, comme [[lib_fr:FMX.Layers3D.TImage3D|TImage3D]] et [[lib_fr:FMX.Layers3D.TTextLayer3D|TTextLayer3D]].&lt;br /&gt;
&lt;br /&gt;
Les objets sont positionnés en espace 3D avec les coordonnées X, Y et Z en utilisant un [[lib_fr:FMX.Types3D.TPosition3D|TPosition3D]]. En plus de la hauteur et de la largeur, ils ont aussi une [[lib_fr:FMX.Controls3D.TControl3D.Depth|profondeur]]. Les objets 2D plats en espace 3D sont arbitrairement fins avec une profondeur codée en dur de 0,01. Les objets 3D ont la [[lib_fr:FMX.Controls3D.TControl3D.RotationAngle|rotation 3D]] et la [[lib_fr:FMX.Controls3D.TControl3D.Scale|mise à l&#039;échelle]]. La position, la taille, la rotation et la mise à l&#039;échelle sont toutes relatives au point central de l&#039;objet.&lt;br /&gt;
&lt;br /&gt;
Comme avec les contrôles 2D, tout contrôle 3D de {{FM}} peut être le parent de tout autre contrôle 3D. La rotation et la position d&#039;un enfant sont relatives à son parent. Le déplacement ou la rotation d&#039;un parent repositionnera sa sous-arborescence de composants. [[lib_fr:FMX.Layers3D.TLayout3D|TLayout3D]] peut être utilisé comme un autre parent commun pour organiser les autres objets.&lt;br /&gt;
&lt;br /&gt;
Tandis que les objets 2D arrangés sur une surface 2D nécessitent la notion d&#039;ordre Z pour déterminer leur disposition, les objets de l&#039;espace 3D sont ordonnés intrinsèquement, ainsi quand ils sont vus à partir d&#039;un point d&#039;observation donné, les objets proches occluent les objets lointains dans la même ligne de vue.&lt;br /&gt;
&lt;br /&gt;
===Caméras===&lt;br /&gt;
&lt;br /&gt;
Chaque vue d&#039;espace 3D est contrôlée par une &#039;&#039;caméra&#039;&#039;. La position et l&#039;orientation (rotation 3D) de la caméra déterminent ce que vous voyez. Il y a toujours la &#039;&#039;caméra de conception&#039;&#039; utilisée dans le Concepteur de fiches, et par défaut à l&#039;exécution. Elle est directement située au-dessus de l&#039;axe Z négatif (vers l&#039;axe Y négatif), perpendiculaire au plan X-Z, avec un angle légèrement vers le bas, afin que la position 0,0,0 soit au centre de la vue. Pour utiliser une caméra différente, définissez la propriété UsingDesignCamera du [[lib_fr:FMX.Viewport3D.TViewport3D.UsingDesignCamera|TViewport3D]] ou du [[lib_fr:FMX.Forms3D.TCustomForm3D.UsingDesignCamera|TForm3D]] sur False, et assignez un [[lib_fr:FMX.Controls3D.TCamera|TCamera]] à la propriété Camera. Une scène peut avoir plusieurs caméras. Après l&#039;affectation d&#039;une autre caméra à la propriété Camera, vous devez appeler Repaint manuellement.&lt;br /&gt;
&lt;br /&gt;
Le volume visible est un &#039;&#039;champ de vue&#039;&#039;, avec le plan proche légèrement en face de la caméra. Toute chose entre la caméra et cet avant-plan est coupée de la vue. L&#039;angle du &#039;&#039;champ de vue&#039;&#039; est fixé verticalement&amp;amp;nbsp;: rendre la fenêtre&amp;amp;nbsp;/&amp;amp;nbsp;fiche plus haute rend chaque chose plus grande, tandis que la rendre plus large en montre plus sur les côtés. Les unités de la position et de la taille sont relatives à l&#039;échelle du champ de vue.&lt;br /&gt;
&lt;br /&gt;
====Projection d&#039;écran====&lt;br /&gt;
&lt;br /&gt;
En plus de la vue d&#039;un objet (ou de l&#039;absence de vue) déterminé par la caméra, un objet peut aussi être défini pour être vu quel que soit l&#039;endroit où la caméra pointe, comme les indicateurs de statut fixes dans les jeux 3D. Cela est réalisé en changeant la propriété [[lib_fr:FMX.Controls3D.TControl3D.Projection|Projection]] de la valeur par défaut &#039;&#039;&#039;Camera&#039;&#039;&#039; en &#039;&#039;&#039;Screen&#039;&#039;&#039;, afin que&amp;amp;nbsp;:&lt;br /&gt;
&lt;br /&gt;
* Avec Position.Z à zéro :&lt;br /&gt;
** XY 0,0 est le coin supérieur gauche, comme en 2D. La position 3D reflète toujours la position du centre de l&#039;objet, pas sa position supérieure gauche comme en 2D.&lt;br /&gt;
** Les dimensions Hauteur, Largeur et Profondeur sont rendues en pixels, peu importe comment le champ de vue est mis à l&#039;échelle.&lt;br /&gt;
** Puisque les unités sont rendues en pixels, les dimensions d&#039;un objet utilisant la projection d&#039;écran sont plus grandes que lors de l&#039;utilisation de la projection de caméra afin d&#039;apparaître à la même taille.&lt;br /&gt;
** L&#039;objet apparaît légèrement derrière l&#039;avant-plan de découpage du champ de vue. Les objets utilisant la projection de caméra ont un petit intervalle où ils peuvent apparaître devant les objets projetés à l&#039;écran avant d&#039;être découpés par l&#039;avant-plan.&lt;br /&gt;
* Avec Position.Z supérieur à zéro (loin de la visionneuse) :&lt;br /&gt;
** La taille rendue est plus petite.&lt;br /&gt;
** La réduction de la vue éloigne l&#039;objet, le rendant même plus petit.&lt;br /&gt;
** L&#039;agrandissement de la vue rapproche l&#039;objet, le rendant plus grand.&lt;br /&gt;
* Avec Position.Z inférieur à zéro (vers la visionneuse) :&lt;br /&gt;
** La taille rendue est plus grande.&lt;br /&gt;
** La réduction de la vue rapproche l&#039;objet, le rendant même plus grand.&lt;br /&gt;
** En le rapprochant trop (en réduisant la vue ou en définissant Position.Z directement), l&#039;objet se déplacera au-delà de l&#039;avant-plan du champ de vue, provoquant ainsi sa disparition.&lt;br /&gt;
** L&#039;agrandissement de la vue éloigne l&#039;objet, le rendant plus petit.&lt;br /&gt;
&lt;br /&gt;
Dans le Concepteur de fiches, changer la projection d&#039;un objet recalcule sa position afin qu&#039;il ne se déplace pas, et ajuste aussi la taille.&lt;br /&gt;
&lt;br /&gt;
====Perche de caméra====&lt;br /&gt;
&lt;br /&gt;
La visualisation d&#039;un objet ou d&#039;une scène à partir de n&#039;importe quelle direction, contrôlée par l&#039;utilisateur, est une application 3D courante. Bien que vous pouvez calculer la position et l&#039;orientation afin d&#039;obtenir l&#039;angle de caméra adéquat, il est plus facile de créer une perche de caméra virtuelle&amp;amp;nbsp;:&lt;br /&gt;
&lt;br /&gt;
# Créez un objet invisible, tel qu&#039;un [[lib_fr:FMX.Objects3D.TDummy|TDummy]], au même emplacement que l&#039;objet d&#039;intérêt, ou au centre de la scène.&lt;br /&gt;
# Créez le TCamera en tant qu&#039;enfant de l&#039;objet.&lt;br /&gt;
## Définissez sa Position sur la distance désirée sur l&#039;un des axes.&lt;br /&gt;
## Si nécessaire, définissez sa propriété RotationAngle afin que la caméra pointe le long de l&#039;axe vers l&#039;emplacement. Assurez-vous que la caméra n&#039;est pas à 180 degrés.&lt;br /&gt;
# Vous pouvez maintenant faire une rotation de la caméra autour de l&#039;objet, simplement en changeant la propriété RotationAngle de l&#039;objet dummy. La caméra maintient la distance exacte et pointe automatiquement directement vers le centre.&lt;br /&gt;
# L&#039;ajout d&#039;une lumière en tant qu&#039;enfant de la caméra maintiendra la distance et l&#039;orientation de la lumière quand la caméra se déplace.&lt;br /&gt;
&lt;br /&gt;
===Luminosité===&lt;br /&gt;
&lt;br /&gt;
En général, un objet 3D est une masse noire commune, à moins qu&#039;il ne comporte des lumières. Un ou plusieurs objets [[lib_fr:FMX.Controls3D.TLight|TLight]] définissent la lumière dans l&#039;espace 3D, selon leur propriété [[lib_fr:FMX.Controls3D.TLight.LightType|LightType]]&amp;amp;nbsp;:&lt;br /&gt;
&lt;br /&gt;
; Directional&lt;br /&gt;
: La lumière directionnelle est constante, à partir d&#039;un angle donné. La lumière du soleil est un peu analogue&amp;amp;nbsp;: elle provient de très loin, ainsi pour n&#039;importe quel endroit localisé sur la terre -- à quelques mètres près, pas des kilomètres -- tous les éléments sont éclairés de la même façon. La position d&#039;une lumière directionnelle n&#039;a pas de rapport avec son effet. Sa position est pertinente si vous essayez de cliquer dessus dans le Concepteur de fiches. Ce qui compte c&#039;est la direction des points de lumière, définie par sa propriété &#039;&#039;&#039;RotationAngle&#039;&#039;&#039;, et la propriété &#039;&#039;&#039;RotationAngle&#039;&#039;&#039; de ses parents.&lt;br /&gt;
; Point&lt;br /&gt;
: Une lumière ponctuelle ressemble à une ampoule nue. Il rayonne dans toutes les directions, et diminue d&#039;intensité avec la distance. Son &#039;&#039;&#039;RotationAngle&#039;&#039;&#039; est sans effet. Ce qui compte c&#039;est sa position, qui est affectée par la position et la rotation de ses parents.&lt;br /&gt;
; Spot&lt;br /&gt;
: Une lumière projetée dépend à la fois de la position et de la rotation, et diminue d&#039;intensité avec la distance.&lt;br /&gt;
&lt;br /&gt;
Les objets 2D plats en espace 3D ne nécessitent pas de lumière, et ne sont pas affectés par la lumière. Ils apparaissent comme d&#039;habitude avec une perspective 3D ajoutée.&lt;br /&gt;
&lt;br /&gt;
===Matériaux===&lt;br /&gt;
&lt;br /&gt;
La surface d&#039;un objet {{FM}} 3D est définie par sa propriété &#039;&#039;material&#039;&#039;. Les matériaux {{FM}} 3D sont basés sur les shaders. Cela permet une variation illimitée de luminosité et de matériaux dans une application. La liste des matériaux disponibles se trouve dans la [[Palette d&#039;outils|Palette d&#039;outils]] sous la catégorie &#039;&#039;&#039;Matériaux&#039;&#039;&#039;. Chaque objet {{FM}} 3D dispose de la propriété [[lib_fr:FMX.Objects3D.TShape3D.MaterialSource|MaterialSource]], qui lie une source de matériau à l&#039;objet en cours. Pour conserver une bibliothèque de matériaux, utilisez [[lib_fr:FMX.MaterialSources.TMaterialBook|TMaterialBook]]. Pour utiliser un matériau unique, la source peut être liée à autant d&#039;objets que nécessaire.&lt;br /&gt;
&lt;br /&gt;
Les objets extrudés ont les propriétés [[lib_fr:FMX.Objects3D.TExtrudedShape3D.MaterialShaftSource|MaterialShaftSource]] et [[lib_fr:FMX.Objects3D.TExtrudedShape3D.MaterialBackSource|MaterialBackSource]] supplémentaires. Chacune est de type [[lib_fr:FMX.MaterialSources.TMaterialSource|TMaterialSource]].&lt;br /&gt;
&lt;br /&gt;
Pour contrôler comment un matériau d&#039;objet apparaît sous l&#039;influence de la lumière, liez-le à un [[lib_fr:FMX.MaterialSources.TLightMaterialSource|TLightMaterialSource]]&amp;amp;nbsp;:&lt;br /&gt;
&lt;br /&gt;
* La couleur [[lib_fr:FMX.MaterialSources.TLightMaterialSource.Emissive|Emissive]] détermine si une surface émet sa propre lumière, ou brille. La valeur par défaut est null (noir, opacité zéro)&amp;amp;nbsp;: les objets ne brillent pas normalement, et requièrent la lumière pour être vus. En définissant une couleur, les surfaces sans lumière apparaissent avec cette couleur. En cas d&#039;éclairage, la couleur Emissive est mélangée aux autres couleurs résultant de la lumière.&lt;br /&gt;
* La couleur [[lib_fr:FMX.MaterialSources.TLightMaterialSource.Ambient|Ambient]] fournit une couleur de base aux surfaces afin qu&#039;elles puissent être vues. Dans le monde réel, la lumière se reflète sur une surface à partir de nombreuses directions&amp;amp;nbsp;; mais dans une scène 3D il serait difficile de définir toute cette lumière. Ainsi la couleur Ambient est activée par toute lumière de l&#039;espace. Sans lumière, elle est sans effet. La surface est coloriée de façon assez uniforme dans cette couleur. Avec une lumière directionnelle -- qui n&#039;a pas à pointer à la surface -- tout semble plat. Avec les lumières ponctuelles et projetées, la couleur s&#039;atténue avec la distance.&lt;br /&gt;
* La couleur [[lib_fr:FMX.MaterialSources.TLightMaterialSource.Diffuse|Diffuse]] interagit directement avec la lumière, y compris l&#039;angle de l&#039;incidence. Sans lumière, elle est sans effet. Il est courant de définir &#039;&#039;&#039;Ambient&#039;&#039;&#039; et &#039;&#039;&#039;Diffuse&#039;&#039;&#039; sur la même couleur.&lt;br /&gt;
* La couleur [[lib_fr:FMX.MaterialSources.TLightMaterialSource.Specular|Specular]] simule une surface brillante, en reflétant la lumière à un angle spécifique, au lieu de diffuser la lumière dans de nombreux angles. Sans lumière, &#039;&#039;&#039;Specular&#039;&#039;&#039; est sans effet. La valeur par défaut est la couleur blanche pour reflèter la lumière sans altérer sa couleur.&lt;br /&gt;
&lt;br /&gt;
==Mélange 2D et 3D==&lt;br /&gt;
&lt;br /&gt;
Les objets 3D doivent être placés dans un conteneur 3D. Un objet 3D (tel que TCube) ne sera pas rendu s&#039;il est placé directement dans un conteneur 2D (tel que TForm), mais il sera affiché dans la [[Vue Structure|vue Structure]] en tant que contrôle enfant. Inversement, un objet 2D (tel que TButton) ne sera pas rendu s&#039;il est placé directement dans un conteneur 3D (tel que TForm3D), mais il sera aussi affiché dans la [[Vue Structure|vue Structure]] en tant que contrôle enfant. Deux classes permettent le mélange imbriqué de contenus 2D et 3D&amp;amp;nbsp;:&lt;br /&gt;
&lt;br /&gt;
* [[lib_fr:FMX.Layers3D.TLayer3D|TLayer3D]] est un objet 3D qui contient un contenu 2D. Il ressemble à une feuille rectangulaire qui réside dans un espace 3D.&lt;br /&gt;
* [[lib_fr:FMX.Viewport3D.TViewport3D|TViewport3D]] est un objet 2D qui contient un contenu 3D. Comme TForm3D, c&#039;est une &amp;quot;fenêtre&amp;quot; dans un espace 3D.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez imbriquer ces conteneurs. Par exemple, vous pouvez avoir une hiérarchie d&#039;objets telle que&amp;amp;nbsp;:&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;
De plus, quelques classes hébergent directement du contenu 2D dans un espace 3D&amp;amp;nbsp;:&lt;br /&gt;
&lt;br /&gt;
* TTextLayer3D affiche du texte.&lt;br /&gt;
* TImage3D affiche des images bitmap.&lt;br /&gt;
&lt;br /&gt;
==Importation de modèles 3D==&lt;br /&gt;
&lt;br /&gt;
Le framework {{FM}} offre le support d&#039;importation des modèles 3D. Le modèle 3D peut être rendu seulement dans un conteneur 3D. Pour importer un modèle 3D, utilisez des objets [[lib_fr:FMX.Objects3D.TModel3D|TModel3D]]. Vous trouverez [[lib_fr:FMX.Objects3D.TModel3D|TModel3D]] dans la [[Palette d&#039;outils|Palette d&#039;outils]]. Pour charger un objet, utilisez la propriété [[lib_fr:FMX.Objects3D.TModel3D.MeshCollection|MeshCollection]] du [[lib_fr:FMX.Objects3D.TModel3D|TModel3D]]. Les fichiers 3D supportés sont &#039;&#039;&#039;.obj&#039;&#039;&#039;, &#039;&#039;&#039;.dae&#039;&#039;&#039; et &#039;&#039;&#039;.ase&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Les modèles sont importés et affichés avec la texture. En l&#039;absence de lumière sur la scène, la texture n&#039;est pas visible. Un modèle importé est manipulable d&#039;une façon élémentaire (rotation, déplacement, mise à l&#039;échelle et redimensionnement) comme tout autre objet 3D.&lt;br /&gt;
&lt;br /&gt;
L&#039;affichage correct d&#039;un modèle chargé dépend de la cohérence et de la correction du fichier chargé.&lt;br /&gt;
&lt;br /&gt;
==Voir aussi==&lt;br /&gt;
&lt;br /&gt;
* [[Conception d&#039;applications FireMonkey|Conception d&#039;applications FireMonkey]]&lt;br /&gt;
* [[Application 3D multi-périphérique|Expert Application {{FM}} 3D]]&lt;br /&gt;
* [[Tutoriel : Création d&#039;une application 3D FireMonkey|Tutoriel : Création d&#039;une application 3D FireMonkey]]&lt;br /&gt;
* [[Tutoriel : Comment utiliser les caméras dans une application FireMonkey 3D|Tutoriel : Comment utiliser les caméras dans une application FireMonkey 3D]]&lt;br /&gt;
* [[Experts de création de composants et d&#039;applications multi-périphériques FireMonkey|Experts de création de composants et d&#039;applications multi-périphériques FireMonkey]]&lt;br /&gt;
* [[Guide de prise en main FireMonkey - Création d&#039;une application 3D|Guide de prise en main FireMonkey - Création d&#039;une application 3D]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de code==&lt;br /&gt;
&lt;br /&gt;
* Exemple [[samp_en:FMX.AnimationDemoHD Sample|{{FM}} HD Animation]]&lt;br /&gt;
* Exemple [[samp_en:FMX.AnimationDemo3D Sample|{{FM}} 3D Animation]]&lt;br /&gt;
* Exemple [[samp_en:FMX.Gyroscope Sample|{{FM}} Gyroscope]]&lt;br /&gt;
* Exemple [[samp_en:FMX.Arrows3D Sample|{{FM}} 3D Arrows]]&lt;br /&gt;
* Exemple [[samp_en:FMX.FirstApp3D Sample|{{FM}} First App3D]]&lt;br /&gt;
* Exemple [[samp_en:OpenGL Multicolor Tetrahedron (C++)|OpenGL Multicolor Tetrahedron (C++)]]&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;
[[de: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/Athens/f/index.php?title=Tutoriel_mobile_:_D%C3%A9finition_de_votre_environnement_de_d%C3%A9veloppement_sur_un_PC_Windows_(iOS)&amp;diff=216036</id>
		<title>Tutoriel mobile : Définition de votre environnement de développement sur un PC Windows (iOS)</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Athens/f/index.php?title=Tutoriel_mobile_:_D%C3%A9finition_de_votre_environnement_de_d%C3%A9veloppement_sur_un_PC_Windows_(iOS)&amp;diff=216036"/>
		<updated>2022-08-17T19:46:11Z</updated>

		<summary type="html">&lt;p&gt;Rrivero : RS-114036. Updated screenshots and path names (Captures d&amp;#039;écran et noms de chemin mis à jour)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Parent|Tutoriels mobiles : Développement d&#039;applications mobiles (iOS et Android)}}&lt;br /&gt;
&lt;br /&gt;
Avant de commencer ce tutoriel, il est recommandé de lire et suivre le tutoriel suivant :&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[[Tutoriel mobile : Définition de votre environnement de développement sur le Mac (iOS)|Tutoriel mobile : Définition de votre environnement de développement sur le Mac (iOS)]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
Une application {{FM}} destinée à la plate-forme cible iOS peut être testée initialement sur le &#039;&#039;&#039;simulateur iOS&#039;&#039;&#039; disponible sur le Mac. La deuxième moitié du processus de test consiste à utiliser la plate-forme cible &#039;&#039;&#039;Périphérique iOS&#039;&#039;&#039; et requiert un périphérique iOS test connecté au Mac.&lt;br /&gt;
&lt;br /&gt;
: {{Note| Sur les périphériques iOS, vous pouvez exécuter à la fois des applications Delphi et C++. Toutefois, le &#039;&#039;&#039;simulateur iOS&#039;&#039;&#039; n&#039;étant pas pris en charge par &#039;&#039;&#039;BCCIOSARM&#039;&#039;&#039;, seuls les périphériques iOS sont supportés pour C++.}}&lt;br /&gt;
&lt;br /&gt;
Pour déployer une application iOS sur votre périphérique iOS ou sur un simulateur iOS à des fins de débogage et de test, {{Product}} utilise &#039;&#039;&#039;[[PAServer, l&#039;application serveur Platform Assistant|Platform Assistant]]&#039;&#039;&#039; ; vous devez [[Installation de Platform Assistant sur un Mac|l&#039;installer]] et [[Exécution de Platform Assistant sur un Mac|l&#039;exécuter]] sur le Mac. Votre environnement de développement matériel et logiciel doit présenter la configuration illustrée à la figure suivante. {{Product}} s&#039;exécute sur un PC sous Windows. Votre PC doit être connecté à un Mac exécutant &#039;&#039;&#039;[[PAServer, l&#039;application serveur Platform Assistant|Platform Assistant]]&#039;&#039;&#039; et équipé des versions appropriées de &#039;&#039;&#039;[[Installation de Xcode sur un Mac|Xcode]]&#039;&#039;&#039; et du SDK iOS (pour le développement iOS). Pour exécuter les apps iOS sur un périphérique iOS, ce dernier doit être connecté au Mac via un câble USB. &lt;br /&gt;
&lt;br /&gt;
[[File:Win2Mac2iOSDevice.png|650px]]&lt;br /&gt;
&lt;br /&gt;
Cette section décrit les étapes de configuration de votre environnement de développement &#039;&#039;&#039;après&#039;&#039;&#039; la configuration de votre environnement sur votre Mac. &lt;br /&gt;
&lt;br /&gt;
==Configuration de votre environnement {{Product}}==&lt;br /&gt;
&lt;br /&gt;
Vous devez exécuter les étapes de configuration suivantes pour préparer le développement iOS avec {{Product}}.&lt;br /&gt;
&lt;br /&gt;
===[[Créer un profil de connexion|Créer un profil de connexion]] pour le Mac===&lt;br /&gt;
&lt;br /&gt;
# Dans l&#039;EDI {{Product}}, ouvrez &amp;lt;font color=&amp;quot;#598527&amp;quot;&amp;gt;&#039;&#039;&#039;Outils &amp;amp;gt; Options &amp;amp;gt; Déploiement &amp;amp;gt; [[Gestionnaire de profils de connexion|Gestionnaire de profils de connexion]]&#039;&#039;&#039;&amp;lt;/font&amp;gt;:&lt;br /&gt;
# Cliquez sur &#039;&#039;&#039;Ajouter&#039;&#039;&#039; :&lt;br /&gt;
#: [[Fichier:Connection_profile_manager.png|500px]] &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
# Vous voyez maintenant l&#039;expert [[Créer un profil de connexion|Créer un profil de connexion]].  Définissez le nom du profil de connexion, par exemple &amp;quot;Mon Mac&amp;quot;.   &amp;lt;br /&amp;gt;Assurez-vous de sélectionner &#039;&#039;&#039;macOS&#039;&#039;&#039; comme plate-forme, puis cliquez sur &#039;&#039;&#039;Next&#039;&#039;&#039;:&lt;br /&gt;
#: [[Fichier:Create a connection profile.png|500px]] &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
# Dans la page &#039;&#039;&#039;Informations sur la machine distante&#039;&#039;&#039;, définissez le nom ou l&#039;adresse IP du Mac hôte, le numéro de port à utiliser (le port par défaut 64211 fonctionne en général) et un mot de passe facultatif (si vous souhaitez utiliser un mot de passe). &lt;br /&gt;
#: [[Fichier:Remote machine information.png|500px]]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
# Cliquez sur &#039;&#039;&#039;Tester connexion&#039;&#039;&#039; et assurez-vous que le profil de connexion fonctionne sans erreur (vous devez recevoir le message &#039;&#039;&#039;&amp;quot;La connexion à &amp;amp;lt;nom d&#039;hôte&amp;amp;gt; sur le port &amp;amp;lt;numéro de port&amp;amp;gt; a réussi&amp;quot;&#039;&#039;&#039;).&lt;br /&gt;
# Si l&#039;opération &#039;&#039;&#039;Tester connexion&#039;&#039;&#039; réussit, cliquez sur le bouton &#039;&#039;&#039;Terminer&#039;&#039;&#039;, sinon vérifiez les paramètres et essayez à nouveau.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===[[Ajout d&#039;un SDK macOS ou iOS|Ajouter un SDK]] au système de développement pour le périphérique iOS connecté au Mac===&lt;br /&gt;
&lt;br /&gt;
# Ouvrez {{Menu|Outils &amp;amp;gt; Options &amp;amp;gt; Déploiement &amp;amp;gt; [[Gestionnaire de SDK|Gestionnaire de SDK]]}}.&lt;br /&gt;
#: [[Fichier:Add sdk.png|500px]]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
# Cliquez sur &#039;&#039;&#039;Ajouter&#039;&#039;&#039;.&lt;br /&gt;
# Sur la boîte de dialogue &#039;&#039;&#039;Ajouter un nouveau SDK&#039;&#039;&#039;, sélectionnez &#039;&#039;&#039;Périphérique iOS 32 bits&#039;&#039;&#039; ou &#039;&#039;&#039;Périphérique iOS 64 bits&#039;&#039;&#039; comme plate-forme.&lt;br /&gt;
#: [[Fichier:Add new SDK.png]]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
# Une fois la plate-forme sélectionnée, l&#039;EDI remplit un profil (comme &amp;quot;Mon Mac&amp;quot;) et la zone de liste déroulante relative à la version SDK par la liste des versions SDK disponibles sur la machine exécutant le serveur Platform Assistant :&lt;br /&gt;
#: [[Fichier:SDK profile selection.png]]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
# Cliquez sur &#039;&#039;&#039;OK&#039;&#039;&#039; pour ajouter le nouveau SDK sélectionné. &lt;br /&gt;
# Une fois l&#039;opération terminée, cliquez sur &#039;&#039;&#039;Fermer&#039;&#039;&#039; pour fermer la boîte de dialogue.&lt;br /&gt;
&lt;br /&gt;
==Voir aussi==&lt;br /&gt;
&lt;br /&gt;
* [[Tutoriel mobile : Création d&#039;une application pour les plates-formes mobiles (iOS et Android)|Tutoriel mobile : Création d&#039;une application pour les plates-formes mobiles (iOS et Android)]]&lt;br /&gt;
* [[Tutoriel mobile : Définition de votre environnement de développement sur le Mac (iOS)|Tutoriel mobile : Définition de votre environnement de développement sur le Mac (iOS)]]&lt;br /&gt;
* [[Travailler avec un Mac et un PC|Travailler avec un Mac et un PC]]&lt;br /&gt;
* [[Exécution de votre application iOS sur un périphérique iOS|Exécution de votre application iOS sur un périphérique iOS]]&lt;br /&gt;
* [[Exécution de votre application iOS sur le simulateur iOS|Exécution de votre application iOS sur le simulateur iOS]]&lt;br /&gt;
* [[Prérequis de plate-forme FireMonkey|Prérequis de plate-forme FireMonkey]]&lt;br /&gt;
* [[Création d&#039;une app iOS|Création d&#039;une app iOS]]&lt;br /&gt;
* [[Développement d&#039;applications macOS|Développement d&#039;applications macOS]]&lt;br /&gt;
* [[Création d&#039;une application FireMonkey|Création d&#039;une application FireMonkey]]&lt;br /&gt;
* Pages Apple developer.apple.com&lt;br /&gt;
** [http://developer.apple.com/library/ios/navigation/ iOS Developer Library (EN)]&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 (EN)]&lt;br /&gt;
** [http://developer.apple.com/devcenter/ios/index.action iOS Dev Center (EN)] &lt;br /&gt;
** [https://developer.apple.com/library/ios/documentation/IDEs/Conceptual/AppDistributionGuide/LaunchingYourApponDevices/LaunchingYourApponDevices.html Lancement de votre app sur des périphériques (EN)]&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 (EN)] &lt;br /&gt;
** [http://developer.apple.com/iad/ iAd Network (EN)]&lt;br /&gt;
&lt;br /&gt;
{{DEFAULTSORT:Tutoriel mobile : Definition de votre environnement de developpement sur un PC Windows (iOS)}}&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;
[[de:Mobile-Tutorial: Konfigurieren der Entwicklungsumgebung auf dem Windows-PC (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/Athens/f/index.php?title=Fichier:SDK_profile_selection.png&amp;diff=216035</id>
		<title>Fichier:SDK profile selection.png</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Athens/f/index.php?title=Fichier:SDK_profile_selection.png&amp;diff=216035"/>
		<updated>2022-08-17T19:44:22Z</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/Athens/f/index.php?title=Fichier:Add_new_SDK.png&amp;diff=216034</id>
		<title>Fichier:Add new SDK.png</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Athens/f/index.php?title=Fichier:Add_new_SDK.png&amp;diff=216034"/>
		<updated>2022-08-17T19:43:03Z</updated>

		<summary type="html">&lt;p&gt;Rrivero : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Profile selection at new SDK screenshot&lt;/div&gt;</summary>
		<author><name>Rrivero</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Athens/f/index.php?title=Fichier:Add_sdk.png&amp;diff=216033</id>
		<title>Fichier:Add sdk.png</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Athens/f/index.php?title=Fichier:Add_sdk.png&amp;diff=216033"/>
		<updated>2022-08-17T19:34:47Z</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/Athens/f/index.php?title=Fichier:Remote_machine_information.png&amp;diff=216032</id>
		<title>Fichier:Remote machine information.png</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Athens/f/index.php?title=Fichier:Remote_machine_information.png&amp;diff=216032"/>
		<updated>2022-08-17T19:30:19Z</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/Athens/f/index.php?title=Fichier:Create_a_connection_profile.png&amp;diff=216031</id>
		<title>Fichier:Create a connection profile.png</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Athens/f/index.php?title=Fichier:Create_a_connection_profile.png&amp;diff=216031"/>
		<updated>2022-08-17T19:27:23Z</updated>

		<summary type="html">&lt;p&gt;Rrivero : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Createa connection profile screenshot&lt;/div&gt;</summary>
		<author><name>Rrivero</name></author>
	</entry>
	<entry>
		<id>https://docwiki.embarcadero.com/RADStudio/Athens/f/index.php?title=Fichier:Connection_profile_manager.png&amp;diff=216030</id>
		<title>Fichier:Connection profile manager.png</title>
		<link rel="alternate" type="text/html" href="https://docwiki.embarcadero.com/RADStudio/Athens/f/index.php?title=Fichier:Connection_profile_manager.png&amp;diff=216030"/>
		<updated>2022-08-17T19:19:05Z</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>