Sign in Join
Wiki copytemporary

Lazarus For Delphi Users/fr: what changed

Revision 2 to 3. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11Cette description est pour les personnes qui sont intéressées par Lazarus et connaissent déjà Delphi. Il décrit les différences entre les deux .
22
33## Delphi → Lazarus
44
55Lazarus est un outil de développement rapide d'applications (RAD) semblable à Delphi. Cela signifie qu'il incorpore une bibliothèque de composants visuels et un environnement de développement intégré (IDE). La bibliothèque de composants de Lazarus (LCL) est très semblable à la VCL de Delphi. La plupart des unités, classes et propriétés ont les mêmes noms et fonctionnalités. Ceci rend le portage aisé . Mais Lazarus n'est *pas* un "clone open source de Delphi". Ne vous attendez donc pas à 100% de compatibilité.
66
77### Différences les plus importantes
88
99Lazarus est une plate-forme indépendante entièrement *open source*, utilisant le puissant compilateur [[Free Pascal/fr|Free Pascal]] (FPC). FPC s'exécute sur plus de 15 plates-formes. Mais les paquets et bibliothèques ne sont pas tous portés, ainsi Lazarus s'exécute actuellement sur Linux (i386, x86_64), FreeBSD (i386), MacOSX (powerpc, i386) et Windows (i386, x86_64).
1010
1111**Lazarus n'est pas complet et, à ce propos, ce texte non plus. Nous recherchons toujours de nouveaux développeurs, créateurs de paquets, réalisateurs de portages, auteurs de documentation , ... .**
1212
1313### La première chose à faire en convertissant un projet Delphi
1414
1515Après avoir lancé Lazarus, vous devriez aller dans **Outils**→**Convertir un projet Delphi en projet Lazarus...**. Ceci ne fera pas tout à votre place, mais vous permettra néanmoins de faire une bonne partie du chemin.
1616
1717## Delphi IDE → Lazarus IDE
1818
1919### Projets
2020
2121Le fichier principal d'une application Delphi est le fichier .dpr. Le fichier principal d'un projet Lazarus est le fichier .lpi (Lazarus Project Information). Un fichier .dpr contient le code source principal du programme, et l'IDE de Delphi y stocke quelques informations sur les options et les unités du compilateur. Une application Lazarus a aussi un fichier .lpr, qui contient également le code source principal. Mais toute les autres informations sont stockées dans le fichier .lpi. Le fichier important d'un projet est donc le fichier .lpi.
2222
2323Par exemple :
2424
2525Delphi stocke les chemins des unités dans le fichier .dpr (ex. : unit1 in 'path/Unit1.pas'). Ces chemins précédés de 'in' sont spécifiques à Delphi et ne sont pas lus par l'IDE de Lazarus. Il ne faut pas les utiliser. À la place, les chemins des unités sont à définir dans "Projet→Options du compilateur...".
2626
2727Delphi stocke les options du compilateur dans le fichier .dpr. Par exemple {\$APPTYPE CONSOLE}. Les options définies de cette façon sont ignorées par l'IDE de Lazarus. Il ne faut pas les utiliser, et définir à la place les options dans "Projet→Options du compilateur...".
2828
2929Règle importante : il y a *toujours* un projet ouvert. Les seules façons de "fermer" un projet sont, soit de quitter Lazarus, soit d'ouvrir un autre projet. C'est parce qu'un projet Lazarus est également une "session". Ceci signifie que les paramètres courants de l'éditeur sont également stockés dans le fichier .lpi et sont restaurés quand vous réouvrez le projet. Par exemple : vous déboguez une application, placez beaucoup de points d'arrêts et de signets. Vous pouvez enregistrer le projet à tout moment, fermer Lazarus ou ouvrir un autre projet. Quand vous réouvrez le projet, même sur un autre ordinateur, tous vos points d'arrêts, signets, fichiers ouverts, positions de curseur, historiques de sauts, etc. sont restaurés .
3030
3131### Éditeur de Sources
3232
3333Presque toutes les touches et raccourcis peuvent être définis dans **Configuration→Options de l'éditeur→Assignation des touches**
3434
3535L'IDE de Lazarus incorpore de nombreux outils de manipulation des sources. Bon nombre d'entre eux sont similaires à ceux de Delphi, et travaillent de façon semblable. Mais il y a une différence importante : Lazarus n'utilise pas le compilateur pour obtenir de l'information sur le code. Il analyse les sources directement, et ceci a beaucoup d'avantages importants.
3636
3737L'éditeur de sources travaille avec des "commentaires". Delphi traite les commentaires dans le code source comme des espaces entre les instructions. Ces commentaires ne contiennent aucune fonctionnalité du code, et quand du nouveau code est automatiquement inséré, les commentaires se déplacent. Sous Lazarus, vous pouvez faire une recherche de déclaration même sur du code contenu dans des commentaires. Bien que ce ne soit pas parfaitement fiable, cela fonctionne souvent. Et quand du nouveau code est inséré, l'IDE emploie des méthodes heuristiques afin de conserver les liaisons entre le commentaire et le code. Par exemple : il ne dédoublera pas la ligne "c: char; // comment".
3838
3939"La complétion de code" de Delphi (Ctrl+Space) est appelée "complétion d'identificateur" sous Lazarus. Le terme Lazarus de "complétion de code" est une fonctionnalité pouvant signifier "complétion de classe automatique" (la même que sous Delphi), "complétion de variable locale" ou "complétion d'affectation d'évènement". Toutes sont invoquées par Ctrl+Shift+C et c'est en fonction de la position du curseur que l'IDE détermine l'opération à effectuer.
4040
4141#### Exemple de complétion de variable locale
4242
4343Supposons que vous veniez de créer une nouvelle méthode contenant l'instruction "i := 3;"
4444
4545``` pascal
4646procedure TForm1.FaireQuelqueChose;
4747 begin
4848 i := 3;
4949 end;
5050```
5151
5252Placez le curseur au-dessus de l'identificateur "i" et appuyez sur Ctrl+Shift+C pour obtenir :
5353
5454``` pascal
5555TForm1.FaireQuelqueChose;
5656 var
5757 i: Integer;
5858 begin
5959 i := 3;
6060 end;
6161```
6262
6363#### Exemple de complétion d'assignation d'évènement
6464
6565Une des fonctionnalités intéressantes de l'inspecteur d'objets est la création automatique de méthodes. Vous pouvez obtenir la même chose dans l'éditeur de sources. Par exemple :
6666
6767``` pascal
6868 Button1.OnClick :=
6969```
7070
7171Placez le curseur derrière l'opérateur d'assignation ":=" et appuyez sur Ctrl+Shift+C.
7272
7373#### Complétion de mot Ctrl+W
7474
7575Elle fonctionne de façon semblable à la "complétion d'identificateur", sauf qu'au lieu d'opérer sur les identificateurs Pascal, elle opère sur tous les mots. Vous choisissez dans une liste contenant tous les mots commençant par les mêmes lettres et contenus dans tous les fichiers ouverts.
7676
7777#### Support des fichiers Include
7878
7979Delphi ne les acceptait pas (NDT : faux, directive {\$I \<fichier\>}), et vous n'avez donc probablement pas encore créé beaucoup de fichiers "include". Mais les fichiers "include" ont un grand avantage : ils rendent possible l'écriture de code indépendant de la plate-forme sans le "polluer" avec des \$IFDEF. Par exemple : saut de méthode, complétion de classes, recherche de déclaration, etc. tout fonctionne avec des fichiers "include".
8080
8181De nombreuses options de manipulation du code sont disponibles.
8282
8383### Concepteur
8484
8585\- Directives
8686
8787#### Inspecteur d'objet
8888
8989Dans les environnements de développement de Delphi et de Lazarus, l'inspecteur d'objets sert à éditer les propriétés des composants, à leur assigner des évènements, etc. Voici quelques différences mineures qu'il faut noter :
9090
91911. Depuis Delphi 5, en complément de la traditionnelle liste déroulante, il existe une vue arborescente des composants de l'application, permettant de naviguer dans la hiérarchie et de sélectionner des objets. Dans Lazarus, cette vue arborescente fait partie intégrante de l'inspecteur d'objets et remplace la liste déroulante. Vous pouvez néanmoins choisir entre l'une ou l'autre par l'option "Afficher l'arbre du composant" du menu contextuel (clic droit).
92922. Dans Delphi, un double-clic sur un évènement vierge génère automatiquement un code associé à cet évènement, et ouvre l'éditeur de code source à la bonne position. Dans Lazarus, un petit bouton "..." situé à droite de la liste déroulante permet la même chose.
93933. Dans Delphi, on doit effacer manuellement le nom d'un évènement pour supprimer la liaison, dans Lazarus, on peut sélectionner "(Aucun)" dans la liste déroulante.
94944. De façon similaire, un double-clic sur une propriété de type simple ne change pas sa valeur, il faut sélectionner celle-ci dans la liste déroulante. Et pour les propriétés associées à un éditeur, il faut cliquer sur le petit bouton "..." situé à droite de cette propriété. (NDT : me semble obsolète pour les versions récentes de Lazarus...).
9595
9696#### Paquets
9797
9898Peut-on installer et utiliser des paquets Delphi sous Lazarus ?
9999
100100- Non, car ils nécessitent des fonctionnalités propres au compilateur de Delphi.
101101
102102Doit-on en créer un spécialement pour Lazarus ?
103103
104104- Oui. Créer un nouveau paquet, le sauvegarder dans le répertoire source du paquet original (en principe le répertoire du fichier .dpk), ajouter la LCL comme paquet requis (si ce n'est déjà fait), puis finalement ajouter les fichiers .pas. On peut alors l'installer ou l'utiliser dans un projet. Il existe des différences entre les paquets Delphi et les paquets Lazarus, se référer au fichier docs/Packages.txt pour plus de précisions.
105105
106106### VCL → LCL
107107
108108Bien que la VCL et la LCL aient le même objectif, c'est-à-dire d'être des hiérarchies de composants orientés objet spécifiquement conçues pour le développement rapide d'applications, elle ne sont pas identiques. Par exemple, alors que la VCL fournit un certain nombre de composants non visuels, la LCL ne fournit dans la mesure du possible que des composants visuels, les composants non-visuels (tels que ceux destinés aux manipulations de bases de données) étant fournis par la FCL de [[Free Pascal/fr|Free Pascal]] .
109109
110110En outre, certains composants de la VCL n'existent pas dans la LCL, et réciproquement, ou bien lorsqu'ils existent dans les deux, ne sont pas des «clones», et nécessitent des adaptations lors du portage d'applications, de composants ou de contrôles.
111111
112112Nous allons tenter de fournir une description suffisamment complète des différences ou incompatibilités majeures entre les deux, destinée au développeur Delphi. Ceci concerne en premier lieu les différences entre la VCL de Delphi 4 (mais par voie de conséquence également celles de Delphi 5, 6 ou 7...) et la LCL dans sa dernière version (CVS). Il se pourrait donc que ces explications ne soient pas exactement adaptées à votre version de Delphi, ni ne corresponde parfaitement à la LCL que vous utilisez actuellement. Si vous constatez des inexactitudes entre ce qui suit et la LCL dans sa dernière version (CVS), ou votre version de Delphi, n'hésitez pas à compléter ou modifier l'article de sorte qu'il reste compréhensible pour tout le monde.
113113
114114#### TControl.Font/TControl.ParentFont
115115
116116Dans la VCL, il est courant et normal d'utiliser le nom d'une police de caractères particulière, ou des propriétés de police telles que le gras ou l'italique pour les contrôles, et de s'attendre à ce que ces valeurs s'affichent correctement. En outre, on dispose de la propriété TControl.ParentFont qui permet de faire en sorte qu'un contrôle utilise la police de son parent, toujours en supposant implicitement que ces valeurs seront respectées, indépendamment des propriétés d'affichage de Windows.
117117
118118Ceci n'est pas toujours vrai, ni toujours possible, dans la LCL. Celle-ci, étant par nature multi-plate-forme et multi-interface, utilise une approche plus mesurée et essaiera plutôt, dans toutes les circonstances, d'utiliser les paramètres natifs du bureau, de la couche graphique, ou du thème sélectionné, quelle que soit l'interface utilisée («widgets»). Par exemple, si vous utilisez l'interface GTK, et que le thème GTK impose une police spécifique pour les boutons, la LCL utilisera toujours cette police.
119119
120120En conséquence de quoi, les contrôles de la LCL n'offrent en général pas les mêmes degrés de liberté à la conception que ceux qu'on attend souvent de la VCL. Seuls les contrôles personnalisés se dessinant eux-même dans un canevas, au lieu d'être de simples interfaces, peuvent logiquement être modifiés de cette manière, indépendamment de l'interface graphique utilisée.
121121
122122#### Glisser/déplacer
123123
124124Dans la VCL, la plupart des (Win)Controls implémentent des méthodes et des fonctions «callback» pour gérer le "glisser/déplacer" de contrôles, par exemple faire glisser un composant depuis un TPanel, et le déplacer dans un autre à l'exécution.
125125
126126Ces fonctionnalités sont actuellement non implémentées ou non terminées dans la LCL, bien qu'elles soient sur la feuille de route, et devraient sans doute bientôt fournir un certain degré de compatibilité pour ce type de fonctionnalité, si ce n'est une compatibilité totale.
127127
128128Ceci signifie qu'actuellement aucun contrôle n'hérite ni ne permet l'usage des fonctions, procédures, propriétés ou évènements suivants...
129129
130130``` pascal
131131Protected
132132 function GetDockEdge(MousePos: TPoint): TAlign;
133133 function GetDragImages: TDragImageList;
134134 function GetFloating: Boolean;
135135 function GetFloatingDockSiteClass: TWinControlClass;
136136 procedure DoEndDrag(Target:TObject); X, Y: Integer);
137137 procedure DockTrackNoTarget(Source: TDragDockObject; X, Y: Integer);
138138 procedure DoEndDock(Target: TObject; X, Y: Integer);
139139 procedure DoDock(NewDockSite: TWinControl;var ARect: TRect);
140140 procedure DoStartDock(var DragObject: TDragObject);
141141 procedure DragCanceled;
142142 procedure DragOver(Source: TObject; X, Y: Integer; State: TDragState;var Accept: Boolean);
143143 procedure DoEndDrag(Target: TObject; X, Y: Integer);
144144 procedure DoStartDrag(var DragObject: TDragObject);
145145 procedure DrawDragDockImage(DragDockObject: TDragDockObject);
146146 procedure EraseDragDockImage(DragDockObject: TDragDockObject);
147147 procedure PositionDockRect(DragDockObject: TDragDockObject);
148148 procedure SetDragMode(Value: TDragMode);
149149 property DragKind: TDragKind;
150150 property DragCursor: TCursor;
151151 property DragMode: TDragMode;
152152 property OnDragDrop: TDragDropEvent;
153153 property OnDragOver: TDragOverEvent;
154154 property OnEndDock: TEndDragEvent;
155155 property OnEndDrag: TEndDragEvent;
156156 property OnStartDock: TStartDockEvent;
157157 property OnStartDrag: TStartDragEvent;
158158
159159Public
160160 function Dragging: Boolean;
161161 function ManualDock(NewDockSite: TWinControl; DropControl: TControl;ControlSide: TAlign): Boolean;
162162 function ManualFloat(ScreenPos: TRect): Boolean;
163163 function ReplaceDockedControl(Control: TControl; NewDockSite: TWinControl;DropControl: TControl; ControlSide: TAlign): Boolean;
164164 procedure BeginDrag(Immediate: Boolean; Threshold: Integer);
165165 procedure Dock(NewDockSite: TWinControl; ARect: TRect);
166166 procedure DragDrop(Source: TObject; X, Y: Integer);
167167 procedure EndDrag(Drop: Boolean);
168168 property DockOrientation: TDockOrientation;
169169 property Floating: Boolean;
170170 property FloatingDockSiteClass: TWinControlClass;
171171 property HostDockSite: TWinControl;
172172 property LRDockWidth: Integer;
173173 property TBDockHeight: Integer;
174174 property UndockHeight: Integer;
175175 property UndockWidth: Integer;
176176```
177177
178178que les classes suivantes n'existent pas ou sont inutilisables...
179179
180180``` pascal
181181 TDragImageList = class(TCustomImageList)
182182 TDockZone = class
183183 TDockTree = class(TInterfacedObject, IDockManager)
184184 TDragObject = class(TObject)
185185 TBaseDragControlObject = class (TDragObject)
186186 TDragControlObject = class (TBaseDragControlObject)
187187 TDragDockObject = class(TBaseDragControlObject)
188188```
189189
190190et que les fonctions suivantes n'existent pas non plus, ou sont également inutilisables.
191191
192192``` pascal
193193function FindDragTarget(const Pos: TPoint;AllowDisabled: Boolean) : TControl;
194194procedure CancelDrag;
195195function IsDragObject(sender: TObject): Boolean;
196196```
197197
198198#### TEdit/TCustomEdit
199199
200200Les contrôles d'édition, bien que fonctionnant dans la LCL essentiellement de la même manière que dans la VCL, ont quelques particularités auxquelles il convient d'être attentif lors d'une conversion.
201201
2022021. À cause des restrictions dues aux interfaces, TEdit.PasswordChar ne fonctionne pas sur toutes les implémentations (mais *peut* parfois fonctionner). À la place, on donnera la valeur emPassword à la propriété TCustomEdit.EchoMode, dans les cas où le texte devra être caché.
2032032. Les évènements liés au glisser/déplacer ne sont pas encore implémentés. Pour plus d'information, se référer à la section précédente Glisser/déplacer.
2042043. Les propriétés de la police de caractères sont généralement ignorées pour des raisons de cohérence de l'interface. Pour des explications plus détaillées, voir TControl.Font/TControl.ParentFont
205205
206206### (optional) TSplitter → TPairSplitter
207207
208208**Améliorez-moi...**
209209
210210La LCL possède aujourd'hui son composant TSplitter, il n'est donc pas nécessaire d'effectuer une quelconque conversion.
211211
212212Néanmoins, si vous le désirez, voici quelques explications.
213213
214214Ce qui suit est librement inspiré des questions posées par Vincent Snijders sur la liste de diffusion, et des réponses apportées par [Andrew Johnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson).
215215
216216Dans la VCL, les contrôles de redimensionnement se présentent sous la forme de poignées que l'on peut faire glisser entre deux composants pour donner plus d'espace à l'un ou à l'autre, et qui s'obtiennent avec le contrôle TSplitter. On les rencontre fréquemment, y compris dans l'IDE de Delphi.
217217
218218La LCL fournit son propre contrôle, TPairSplitter, dont l'utilité est la même, mais qui n'est pas compatible. Il sera ainsi nécessaire de "réparer" les codes VCL ou les DFM Delphi devenus incorrects dans le cadre d'une adaptation, malgré le fait que beaucoup de choses soient communes entre les deux versions.
219219
220220Alors quelles sont exactement les différences ?
221221
222222Hé bien, les plus grandes différences sont que le TSplitter de la VCL n'a pas d'enfant, qu'il est placé entre deux contrôles alignés d'une certaine façon, et qu'il permet le redimensionnement indépendamment de sa propre taille. Il doit avoir deux contrôles alignés de chaque côté pour pouvoir fonctionner. Un exemple simple serait une fiche contenant un TPanel aligné à gauche (alLeft), un TSplitter aligné à gauche, et enfin un TPanel aligné sur la zone client (alClient). À l'exécution, vous pouvez alors modifier les dimensions des deux TPanel en faisant glisser la poignée fournie par le contrôle TSplitter.
223223
224224Côté LCL, par contre, le TPairSplitter est un type spécial de contrôle, possédant déjà deux panneaux, qui n'a d'utilité que s'il y a des composants à séparer sur ces panneaux, mais qui séparera quand même ces derniers, qu'il y ait quelque chose ou pas dessus. Ainsi, l'exemple précédent devient une fiche contenant un TPairSplitter aligné sur la zone client, et deux TPanel alignés aussi sur la zone client, l'un sur le panneau gauche, l'autre sur le panneau droit de ce TPairSplitter.
225225
226226L'autre différence importante est que dans la VCL, étant donné que le TSplitter est son propre contrôle, sa position est conservée relativement aux contrôles en cas de redimensionnement. Ainsi, par exemple, un TPanel aligné sur la zone client (alClient) grossira tandis que les autres TPanel resteront tels quels, donc la position de séparation dépend de la propriété d'alignement des contrôles séparés.
227227
228228Dans la LCL, comme les deux panneaux de chaque côté sont indépendants, le TPairSplitter possède une propriété Position qui est absolue par rapport au bord supérieur ou au bord gauche. Donc, en cas de redimensionnement, la position de la poignée ne change pas et si cela est important, il faut appeler une méthode en retour pour s'assurer que le rapport est conservé.
229229
230230(NDT: j'ai traduit ce qui suit conformément au texte original, mais à mon avis il y a une erreur, puisque le côté droit possède déjà un comportement de type alClient. En outre, le code d'exemple produit un résultat erratique, ce qui est normal puisque pour effectuer ce genre de redimensionnement, il faudrait avoir stocké quelque part l*'ancienne* valeur de la propriété Position...) Par exemple si le côté droit d'un séparateur vertical nécessite d'avoir un comportement de type alClient, vous devrez écrire une méthode de redimensionnement de fiche effectuant quelque chose comme :
231231
232232``` pascal
233233 PairSplitter.Position := PairSplitter.Width - PairSplitter.Position;
234234```
235235
236236Alors, comment puis-je transformer un code existant pour utiliser TPairSplitter au lieu de TSplitter ?
237237
238238Si les séparateurs et les contrôles sont créés dynamiquement (dans la méthode OnCreate de la fiche, par exemple), la conversion ne devrait pas poser trop de problèmes. Commencez par réorganiser la création des contrôles conformément à la nouvelle hiérarchie, en positionnant la propriété Parent des contrôles enfants aux deux panneaux, gauche et droite, ou haut et bas, du TPairSplitter. Voici un exemple de conversion.
239239
240240**VCL**
241241
242242**LCL**
243243
244244``` pascal
245245var
246246 BottomPanel: TPanel;
247247 VerticalSplitter: TSplitter;
248248 LeftPanel: TPanel;
249249 HorizontalSplitter: TSplitter;
250250 MainPanel: TPanel;
251251begin
252252 BottomPanel:= TPanel.Create(Self);
253253 with BottomPanel do
254254 begin
255255 Parent := Self;
256256 Height := 75;
257257 Align := alBottom;
258258 end;
259259 VerticalSplitter:= TSplitter.Create(Self);
260260 with VerticalSplitter do
261261 begin
262262 Parent := Self;
263263 Align := alBottom;
264264 end;
265265 HorizontalSplitter:= TSplitter.Create(Self);
266266 with HorizontalSplitter do
267267 begin
268268 Parent := Self;
269269 align := alLeft;
270270 end;
271271 LeftPanel:= TPanel.Create(Self);
272272 with LeftPanel do
273273 begin
274274 Parent := Self;
275275 Width := 125;
276276 Align := alLeft;
277277 end;
278278 MainPanel:= TPanel.Create(Self);
279279 with MainPanel do
280280 begin
281281 Parent := Self;
282282 Align := alClient;
283283 Caption := 'Hello';
284284 end;
285285end;
286286```
287287
288288``` pascal
289289var
290290 BottomPanel: TPanel;
291291 VerticalSplitter: TPairSplitter;
292292 LeftPanel: TPanel;
293293 HorizontalSplitter: TPairSplitter;
294294 MainPanel: TPanel;
295295begin
296296 VerticalSplitter:= TPairSplitter.Create(Self);
297297 with VerticalSplitter do
298298 begin
299299 Parent:= Self;
300300 Align:= alClient;
301301 Width:= Self.Width;
302302 Height:= Self.Height;
303303 SplitterType:= pstVertical;
304304 Position:= Height - 75;
305305 Sides[0].Width:= Width;
306306 Sides[0].Height:= Position;
307307 end;
308308 HorizontalSplitter:= TPairSplitter.Create(Self);
309309 with HorizontalSplitter do
310310 begin
311311 Parent:= VerticalSplitter.Sides[0];
312312 Width:= Self.Width;
313313 Height:= VerticalSplitter.Position;
314314 align:= alClient;
315315 SplitterType:= pstHorizontal;
316316 Position:=125;
317317 end;
318318 LeftPanel:= TPanel.Create(Self);
319319 with LeftPanel do
320320 begin
321321 Parent:= HorizontalSplitter.Sides[0];
322322 Align:= alClient;
323323 end;
324324 MainPanel:= TPanel.Create(Self);
325325 with MainPanel do
326326 begin
327327 Parent:= HorizontalSplitter.Sides[1];
328328 Align:= alClient;
329329 Caption:='Hello';
330330 end;
331331 BottomPanel:= TPanel.Create(Self);
332332 with BottomPanel do
333333 begin
334334 Parent:= VerticalSplitter.Sides[1];
335335 Align:= alClient;
336336 end;
337337 end;
338338```
339339
340340Comme vous pouvez le voir, c'est assez substantiel pour la plupart des hiérarchies de contrôles. Et si vous êtes familiers des fichiers DFM, les modifications nécessaires dans le cadre d'une conversion DFM→LFM devraient être assez évidentes d'après l'exemple qui précède, puisqu'elles suivent le même schéma que les changement dans les propriétés Parent, Owner, etc.
341341
342342Ainsi l'exemple que nous avons vu donnerait quelque chose comme :
343343
344344**DFM Delphi (valeurs pertinentes seulement)**
345345
346346**LFM Lazarus (plupart des propriétés Width, Height, etc. enlevées)**
347347
348-``` pascal
348+``` lfm
349349object VerticalSplitter: TSplitter
350350 Height = 3
351351 Cursor = crVSplit
352352 Align = alBottom
353353end
354354object HorizontalSplitter: TSplitter
355355 Width = 3
356356 Align = alLeft
357357end
358358object BottomPanel: TPanel
359359 Height = 75
360360 Align = alBottom
361361end
362362object LeftPanel: TPanel
363363 Width = 125
364364 Align = alLeft
365365end
366366object MainPanel: TPanel
367367 Align = alClient
368368end
369369```
370370
371-``` pascal
371+``` lfm
372372object VerticalSplitter: TPairSplitter
373373 Align = alClient
374374 SplitterType = pstVertical
375375 Position = 225
376376 Height = 300
377377 Width = 400
378378 object Pairsplitterside1: TPairSplitterIde
379379 object HorizontalSplitter: TPairSplitter
380380 Align = alClient
381381 Position = 125
382382 object Pairsplitterside3: TPairSplitterIde
383383 Width = 125
384384 object LeftPanel: TPanel
385385 Align = alClient
386386 Width = 125
387387 end
388388 end
389389 object Pairsplitterside4: TPairSplitterIde
390390 object MainPanel: TPanel
391391 Align = alClient
392392 end
393393 end
394394 end
395395 end
396396 object Pairsplitterside2: TPairSplitterIde
397397 object BottomPanel: TPanel
398398 Align = alClient
399399 Height = 75
400400 end
401401 end
402402end
403403```
404404
405405### TCustomTreeView/TTreeView
406406
407407La VCL et la LCL fournissent toutes deux des composants TCustomTreeView / TTreeView utilisés pour des listes de données arborescentes avec des nœuds, des méthodes de sélection et des listes d’images. Bien que comparables leurs propriétés respectives ne sont pas toutes entièrement compatibles. Les principales différences sont :
408408
409409**Incomplete list, also update to include TCustomTreeView Mark functions and protected methods**
410410
4114111. La LCL fournit un ensemble d’options au TCustomTreeView.afin de modifier et contrôler son comportement et son apparence. Ces options sont :
412412
413413\#* tvoAllowMultiselect –permet la sélection multiple de nœuds ; Correspond au MultiSelect du TCustomTreeView. de la VCL D6.
414414
415415\#* tvoAutoExpand –Développement automatique des noeuds; Correspond au AutoExpand du TCustomTreeView.
416416
417417\#* tvoAutoInsertMark – Met à jour (initialise) le Drag lors d’un mouvement de souris.
418418
419419\#* tvoAutoItemHeight – Ajuste automatiquement les hauteurs d’items.
420420
421421\#* tvoHideSelection – Ne met pas en évidence l’item sélectionné.
422422
423423\#* tvoHotTrack – active le Hot Tracking; Correspond au HotTrack du TcustomTreeview.
424424
425425\#* tvoKeepCollapsedNodes – Conserve les noeuds enfants lors du repli de noeuds.
426426
427427\#* tvoReadOnly – Place le Treeview en lecture seule; Correspond au ReadOnly du TcustomTreeview.
428428
429429\#* tvoRightClickSelect - allow using Mouse Right Clicks to select nodes, equivalent to enabling TCustomTreeView.RightClickSelect
430430
431431\#* tvoRowSelect – Permet la sélection de lignes, correspond au RowSelect du TCustomTreeView.
432432
433433\#* tvoShowButtons –Affiche les boutons , Correspond au ShowButtons du TCustomTreeView.
434434
435435\#* tvoShowLines – Affiche les lignes des noeuds ; Correspond au ShowLines du TCustomTreeView.
436436
437437\#* tvoShowRoot – Affiche la racine ; Correspond au ShowRoot du TcustomTreeView.
438438
439439\#* tvoShowSeparators – Affiche les séparateurs
440440
441441\#* tvoToolTips - show tooltips for individual nodes
442442
4434431. La LCL fournit des propriétés supplémentaires:
444444 - TCustomTreeView.OnSelectionChange Evénement se déclenchant lors d’un changement de sélection
445445 - TCustomTreeView.DefaultItems, Pour le nombre par défaut d’items.
446446 - TCustomTreeView.ExpandSignType Pour déterminer le signe utilisé lors Développement/Pliage de nœuds.
447447
448448Bien que la plupart des événements Drag/Dock (tirer/glisser) est disponible elle n’est pas fonctionnelle. Pour plus d’information voir le chapitre précédant sur le Control Dragging/Docking.
449449
450450### Messages / Evenements
451451
452452L’ordre, la fréquence des messages et des événements (OnShow, OnActivate, OnEnter, ...) diffèrent de la VCL et dépendent de l’ensemble des Widgets. La LCL fournit un sous ensemble de messages comparables aux API Windows afin de rendre le portage des composants Delphi plus simple. Cependant, la plupart des messages de la LCL fonctionne différemment. L’essentiel du code Delphi utilise les messages des API Windows car la VCL ne dispose pas de ces fonctionnalités, et pour une question de rapidité. Ceci sera rarement le cas dans la LCL , et nécessitera un contrôle manuel. C’est par exemple pour cette raison que les messages sont appelés LM_SIZE au lieu de WM_SIZE.
453453
454454## Original Contributors and changes
455455
456456This page has been converted from the epikwiki [version](http://lazarus-ccr.sourceforge.net/index.php?wiki=LazarusForDelphiUsers).
457457
458458- Initial import and formatting - VlxAdmin 9/26/2003
459459- Begin VCL -\> LCL with a section on TSplitter -\> TPairSplitter - [Andrew Johnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 9/30/2003
460460- Add TControl.Font/TControl.ParentFont to VCL -\> LCL - [Andrew Johnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 9/30/2003
461461- Update TEdit/TCustomEdit section in VCL -\> LCL - [Andrew Johnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 10/1/2003
462462- Add Control Dragging/Docking to VCL -\> LCL - [Andrew Johnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 10/1/2003
463463- Added "Object Inspector" to Delphi IDE -\> Lazarus IDE - [Andrew Johnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 10/1/2003
464464- Added initial "TCustomTreeView/TTreeView" to VCL -\> LCL - [Andrew Johnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 10/1/2003
465465- Added introduction to VCL -\> LCL - [Andrew Johnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 10/1/2003
466466- Fixed some typos - Vincent 10/2/2003
467467- Fixed Typo User:Kirkpatc 20 May 2004
468468
469469## See Also
470470
471471[[Code Conversion Guide|Code Conversion Guide (from Delphi &amp; Kylix)]]
472472
473473[[Compile With Delphi]]
474474
475475---
476476*From the Free Pascal wiki, page "Lazarus For Delphi Users/fr", as it stood on 2020-02-18 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history