Sign in Join
Wiki copytemporary

Lazarus For Delphi Users/es: what changed

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

OldNewLine
11Este escrito está dirigido a usuarios interesados en Lazarus que conocen Delphi, ya que describe las diferencias entre ambos.
22
33## Delphi -\> Lazarus
44
55   Lazarus es una herramienta de desarrollo rápido de aplicaciones, al igual que Delphi. Esto significa que dispone de una biblioteca de componentes visuales y de un entorno de desarrollo integrado (IDE). La librería de componentes de Lazarus (LCL) es muy similar a la VCL de Delphi. Muchas unidades, clases y propiedades tienen el mismo nombre e idéntica funcionalidad. Esto hace que el paso de uno o otro sea fácil. Pero Lazarus **no** es un *clon Delphi* de fuentes libres. No esperes por tanto una compatibilidad total.
66
77### La mayor diferencia
88
99   Lazarus es completamente libre, está escrito para ser independiente de la plataforma y utiliza el potente compilador [[Free Pascal]] (FPC). FPC está disponible para más de 15 plataformas. No obstante lo anterior, no todas las librerías y paquetes están disponibles en todas ellas, Lazarus a día de hoy funciona en Linux (i386, x86_64), FreeBSD (i386), MacOSX (powerpc, i386) y Windows (i386, x86_64).
1010
1111**   Lazarus no está terminado del todo, y del mismo modo, tampoco este texto. Se buscan nuevos programadores, escritores de paquetes, traductores, escritores de documentación, ...**
1212
1313### Lo primero que hay que hacer al convertir un proyecto de Delphi
1414
1515   Teniendo Lazarus en ejecución, tienes que ir a **Herramientas** y después a **Convertir proyecto Delphi a proyecto Lazarus**. Esto no lo hace todo, pero te facilitará la conversión. Tenga en cuenta que las herramientas disponibles en el IDE son unidireccionales. Si se necesita conservar la compatibilidad, para poder compilar indistintamente en Delphi y en Lazarus, considera convertir tus archivos utilizando [XDev Toolkit](http://wiki.lazarus.freepascal.org/XDev_Toolkit).
1616
1717### Soporte para Unicode
1818
1919   Delphi, incluida la versión 2007, no da soporte para Unicode, utilizando la codificación ANSI de Windows. Delphi da soporte a Unicode utilizando codificación de cadenas en UTF-16 a partir de la versión 2009.
2020
2121   Por su lado Lazarus ha comenzado a dar soporte a Unicode con anterioridad y utiliza codificación de cadenas UTF-8. Para más información ver [[LCL Unicode Support|Soporte LCL para Unicode]].
2222
2323## Delphi IDE -\> Lazarus IDE
2424
2525### Proyectos
2626
2727   El archivo de extensión .dpr es el principal de una aplicación Delphi. El archivo principal de un proyecto Lazarus es el de extensión *.lpi* (Información de proyecto Lazarus). El archivo *.dpr* es también el archivo principal de código y en el mismo el IDE almacena información sobre las opciones de compilación y las unidades que utiliza el proyecto. Una aplicación Lazarus también tiene un archivo *.lpr*, que es el archivo principal de código. El resto de la información se almacena en el *.lpi*. Por lo tanto el *.lpi* es el archivo más importante del proyecto.
2828
2929   Por ejemplo:
3030
3131   Delphi guarda las rutas a las unidades en el archivo *.dpr*. Como esta, *unidad1 in 'ruta/Unidad1.pas*'. El *in* es específico de Delphi y no es entendido por Lazarus. No lo utilices, en su lugar usa las opciones de unidades y rutas de configuración del compilador.
3232
3333   Delphi guarda las opciones del compilador, como {\$APPTYPE CONSOLE}, en el archivo *.dpr*, que son ignoradas por Lazarus. No lo utilices, en su lugar usa las opciones del compilador.
3434
3535#### Una cuestión importante: *Siempre* hay un proyecto.
3636
3737   La única forma de "cerrar" un proyecto es cerrando Lazarus o abriendo otro proyecto. Esto es así, porque un proyecto Lazarus es así mismo una "sesión". Esto significa que la configuración actual del IDE se guarda en el archivo *.lpi* y es restaurada al reabrir el proyecto. Por ejemplo: estás depurando una aplicación, pones una serie de puntos de parada y marcas. Puedes guardar el proyecto, cerrar Lazarus o abrir otro proyecto. Cuándo reabras el proyecto, incluso en otra máquina, todos los puntos de parada, marcadores, archivos abiertos en el editor, posición de los cursores, historia de saltos, y demás, serán restaurados.
3838
3939### Editor de Código
4040
4141   Casi todas las funciones asignadas a teclas y los accesos directos se puede definir en *Entorno -\> Opciones del editor -\> Accesos rápidos*.
4242
4343   El IDE de Lazarus tiene una gran cantidad de herramientas para trabajar con el código fuente. Muchas son parecidas y trabajan de forma similar a las de Delphi. Pero hay una diferencia importante, Lazarus no utiliza el compilador para obtener información del código, analiza el código fuente directamente. Esto tiene un montón de ventajas importantes:
4444
4545   El editor trabaja con "comentarios". Para Delphi los comentarios son simplemente espacios entre el código. Ninguna característica del código trabaja aquí y si se inserta automáticamente nuevo código, los comentarios se desplazan. Con Lazarus se puede encontrar una declaración de código incluso dentro de los comentarios. Aunque esto no es completamente fiable, normalmente funciona. Cuando se inserta nuevo código el IDE utiliza heurística para mantener los comentarios y el código juntos. Por ejemplo, no separará la línea:
4646
4747``` pascal
4848 letra: char; // comentario
4949```
5050
5151   La función de *Completar código* de Delphi (Ctrl+Space) se denomina *Completar identificador* (*Identifier Completion*) en Lazarus. El término Lazarus *Completar código* (*Code Completion*) es una funcionalidad que combina *Completar Clase automáticamente* (*Automatic Class Completion* igual que en Delphi), *Completar variable local* (*Local Variable Completion*) y *Completar asignación de evento* (*Event Assignment Completion*. Todas ellas se activan mediante *Ctrl+Shift+C* y el IDE determina cuál ejecutaraá en función del código presente en la posición del cursor.
5252
5353#### Ejemplo de *Completar variable local*
5454
5555   Supongamos que acabas de crear un nuevo método y escribes la sentencia "i:=3;"
5656
5757``` pascal
5858 procedure TForm1.HacerAlgo;
5959 begin
6060 i := 3;
6161 end;
6262```
6363
6464   Coloca el cursor justo de delante del identificador "i" y presiona Ctrl+Shift+C para obtener la declaración de la variable:
6565
6666``` pascal
6767 procedure TForm1.HacerAlgo;
6868 var i: Integer;
6969 begin
7070 i := 3;
7171 end;
7272```
7373
7474#### Ejemplo *Completar asignación de evento*
7575
7676   Una buena característica del inspector de objetos es crear métodos automáticamente. Se puede hacer lo mismo en el editor de código.\
7777   Por ejemplo:
7878
7979``` pascal
8080 btnCancelar.OnClick:=
8181```
8282
8383   Sitúa el cursor tras el operador de asignación ":=" y presiona Ctrl+Shift+C, y se generará el esqueleto de la función de respuesta al evento.
8484
8585``` pascal
8686//...
8787 btnCancelar.OnClick:=@btnCancelarClick;
8888//...
8989
9090 procedure Form1.btnCancelarClick(Sender : TObject);
9191 begin
9292
9393 end;
9494```
9595
9696#### Ejemplo de *Completar llamada a Procedimiento*
9797
9898   Supongamos que acabamos de escribir la sentencia "HacerAlgo(Ancho);" en este código
9999
100100``` pascal
101101 procedure UnProcedimiento;
102102 var
103103 Ancho: integer;
104104 begin
105105 Ancho:=3;
106106 HacerAlgo(Ancho);
107107 end;
108108```
109109
110110   Sitúa el cursor sobre el identificador "HacerAlgo" y presiona las teclas Ctrl+Shift+C para obtener:
111111
112112``` pascal
113113 procedure HacerAlgo(aAncho: LongInt);
114114 begin
115115
116116 end;
117117
118118//...
119119
120120 procedure UnProcedimiento;
121121 var
122122 Ancho: integer;
123123 begin
124124 Ancho:=3;
125125 HacerAlgo(Ancho);
126126 end;
127127```
128128
129129   **Nota** del traductor: lo descrito más arriba no funciona (da un error: Ya fue definido el identificador UnProcedimiento); sin embargo si el cursor está dentro del código de "UnProcedimiento", cómo en el ejemplo:
130130
131131``` pascal
132132 type
133133 UnaClase = Class(TObject)
134134 end;
135135//...
136136 procedure UnaClase.UnProcedimiento;
137137 begin
138138 //...
139139 end;
140140```
141141
142142   Al pulsar Ctrl+Shift+C obtendremos la definición de UnProcedimiento como miembro de la clase "UnaClase".
143143
144144``` pascal
145145 type
146146 UnaClase = Class(TObject)
147147 private
148148 procedure UnProcedimiento;
149149 end;
150150//...
151151 procedure UnaClase.UnProcedimiento;
152152```
153153
154154#### "Completar palabras" Ctrl+W
155155
156156   Trabaja de forma parecida a *Completar identificador*, sólo que no trabaja con identificadores pascal, sino con cualquier palabra. Busca en los ficheros abiertos todas las palabras que comienzan con las letras precedentes.
157157
158158#### Borrar hasta el final de la línea: Ctrl+T
159159
160160#### Borrar la línea completa: Ctrl+Y
161161
162162#### [[IDE Window: Code Templates|Acceder a las plantillas de código: Ctrl+J]]
163163
164164#### Permite archivos de inclusión (*include*)
165165
166166    Mediante la directiva *{\$i acrchivo.inc}*. Delphi también permite usarlos (comprobado en D3 y D7, en D/ además se utiliza), aunque que probablemente no has creado muchos archivos de inclusión. Estos archivos tienen una gran ventaja: permiten escribir código (in)dependiente de la plataforma sin llenar el código de directivas IFDEF. Por ejemplo: Saltar al procedimiento (*procedure jump*), Completar clase, buscar declaración, ... funcionan con los archivos de inclusión.
167167
168168   Hay otras muchas opciones para trabajar con el código.
169169
170170### Diseñador
171171
172172- Directrices
173173
174174#### Inspector de Objetos
175175
176176   En Delphi y Lazarus el Inspector de Objetos se utiliza para editar las propiedades de los componentes y la asignación de los eventos. Estas son lagunas de las pequeñas diferencias que hay entre ambos:
177177
1781781. Con Delphi 5 apareció una vista jerarquizada en árbol de los componentes (*Object Treeview*), que se podía usar para moverse por los objetos y seleccionarlos, además de la tradicional lista desplegable del Inspector. En Lazarus esta vista de árbol está integrada en el Inspector y se utiliza en sustitución de la lista desplegable. Se puede activar o desactivar su utilización mediante la opción *Mostrar Árbol de componentes* del [menú contextual del Inspector](http://wiki.lazarus.freepascal.org/images/1/1f/Lazarus_Arbol_Inspector_Objetos.png) .
1791792. En Delphi haciendo doble clic en un evento vacío se crea este y se abre el Editor con el cursos en el mismo, en Lazarus, además de lo anterior, existe un botón al lado de la lista desplegable que hace lo mismo.
1801803. En Delphi se puede borrar manualmente el nombre de un evento para deshacer el enlace, en Lazarus, además podemos seleccionar *(none)* en la lista desplegable.
1811814. De forma similar, con doble clic en propiedades corrientes, cómo un lógico cambia su valor, además podemos seleccionarlo con la lista desplegable. Si la propiedad requiere de editor especializado, aparecerá este, al igual que si usamos el botón con los puntos suspensivos.
182182
183183#### Paquetes
184184
185185   ¿Se pueden instalar y usar paquetes Delphi en Lazarus?
186186
187187   No de forma directa, porque necesitan *la magia* del compilador de Delphi.
188188
189189   ¿Necesitamos entonces paquetes específicos para Lazarus ?
190190
191191   Sí, para ello:
192192
193193   Crea un nuevo paquete, guárdalo en el direcorio donde residen los archivos fuente (normalmente el mismo directorio del archivo *.dpk*), añade la LCL cómo paquete necesario y finalmente los archivos *.pas*. Ya puedes instalarlo o utilizarlo en tus proyectos. Hay algunas diferencias entre los paquetes de Lazarus y Delphi, leete el archivo docs/Packages.txt que se encuentra en el directorio de fuentes de Lazarus.
194194
195195   Ver tambien la [[Code Conversion Guide/es|Guía de conversión de código entre Delphi y Lazarus]]
196196
197197### VCL -\> LCL
198198
199199   Aunque laVCL y la LCL sirven en gran parte para el mismo propósito, una jerarquía de componentes orientada a objetos enfocada especialmente hacia el desarrollo rápido de aplicaciones, no son idénticas. Por ejemplo mientras que la VCL proporciona muchos componentes no visuales, el LCL procura proveer solamente componentes visuales, mientras que la mayoría de los componentes no visuales (tales como el acceso a BD) son proporcionados por la FCL, incluida con [[Free Pascal]].
200200
201201   Así mismo la LCL no tiene de algunos controles disponibles en la VCL o al contrario, o cuándo tiene el mismo control estos no son idénticos, y por tanto hay que realizar cambios en aplicaciones, componentes y controles al migrar.
202202
203203   Lo que sigue es una tentativa de proporcionar descripciones bastante completas de la diferencias principales o de incompatibilidades entre los dos para el usuario de Delphi. Se cubren las diferencias primordialmente con la VCL de D4, aunque ocasionalmente también con las de D5, D6, o D7 ; y con la LCL actual, tal como está en el CVS. No podemos asegurar la coincidencia con la LCL de que cada uno dispone, ni cuál es la versión de Delphi de la que cada uno viene, por lo que si se ven discrepancias se es libre de añadir o modificar lo que sea necesario con el fin de mantener este documento tan comprensible como sea posible para todo el mundo.
204204
205205#### TControl.Font/TControl.ParentFont
206206
207207   En la VCL es muy común y normal utilizar un tipo de letra y propiedades de fuente, como negrita y cursiva para los controles y se espera que este valor sea usado siempre. Más adelante se proporciona la característica de TControl.ParentFont que se asegura de que un control siga siempre la fuente de *su padre*. Otra vez se asume que estos valores serán seguidos siempre, incluso ignorando los ajustes de en la apariencia de Windows.
208208
209209   Esto no es siempre cierto en la LCL, ni lo puede ser. La LCL que es por naturaleza múltiplataforma-multiinterfaz prefiere hacer una acercamiento equilibrado, y en su lugar intentará siempre utilizar los ajustes nativos de la apariencia del escritorio y el tema utilizado en los controles. Por ejemplo si usa un interfaz de GTK, y el tema del gtk dispone una fuente específica para los botones, los botones de la LCL procurarán siempre utilizar esta fuente.
210210
211211   Esto significa que la mayoría de los controles de LCL no tienen el mismo nivel de ajuste del diseño que se espera a menudo en el VCL, solamente los controles personalizados que sean dibujados en el lienzo (*canvas*) y no creados por la interfaz pueden modificar consistentemente este interfaz asignado, sin importar cual sea el interfaz usado.
212212
213213#### Arrastre y colocación de controles
214214
215215   En la VCL muchos (win)controles tienen métodos y funciones de retrollamada para habilitar el arrastre y colocación de los mismos, v.g. arrastrar un control desde un panel y colocarlo en otro panel en tiempo de ejecución.
216216
217217   Esta funcionalidad no está implementada y está inacabada normalmente en la LCL,aunque está actualmente en las etapas iniciales de estudio, y debe aportar un cierto nivel de compatibilidad para este tipo de comportamiento, aunque no exactamente de la misma manera.
218218
219219   Esto significa actualmente que ningún control hereda/utiliza las funciones, procedimientos, propiedades o eventos de TControl siguientes:
220220
221221``` pascal
222222 Protected
223223 function GetDockEdge(MousePos: TPoint): TAlign;
224224 function GetDragImages: TDragImageList;
225225 function GetFloating: Boolean;
226226 function GetFloatingDockSiteClass: TWinControlClass;
227227 procedure DoEndDrag(Target:TObject); X, Y: Integer);
228228 procedure DockTrackNoTarget(Source: TDragDockObject; X, Y: Integer);
229229 procedure DoEndDock(Target: TObject; X, Y: Integer);
230230 procedure DoDock(NewDockSite: TWinControl; var ARect: TRect);
231231 procedure DoStartDock(var DragObject: TDragObject);
232232 procedure DragCanceled;
233233 procedure DragOver(Source: TObject; X, Y: Integer; State: TDragState;
234234 var Accept: Boolean);
235235 procedure DoEndDrag(Target: TObject; X, Y: Integer);
236236 procedure DoStartDrag(var DragObject: TDragObject);
237237 procedure DrawDragDockImage(DragDockObject: TDragDockObject);
238238 procedure EraseDragDockImage(DragDockObject: TDragDockObject);
239239 procedure PositionDockRect(DragDockObject: TDragDockObject);
240240 procedure SetDragMode(Value: TDragMode);
241241 property DragKind: TDragKind;
242242 property DragCursor: TCursor;
243243 property DragMode: TDragMode;
244244 property OnDragDrop: TDragDropEvent;
245245 property OnDragOver: TDragOverEvent;
246246 property OnEndDock: TEndDragEvent;
247247 property OnEndDrag: TEndDragEvent;
248248 property OnStartDock: TStartDockEvent;
249249 property OnStartDrag: TStartDragEvent;
250250 public
251251 function Dragging: Boolean;
252252 function ManualDock(NewDockSite: TWinControl; DropControl: TControl;
253253 ControlSide: TAlign): Boolean;
254254 function ManualFloat(ScreenPos: TRect): Boolean;
255255 function ReplaceDockedControl(Control: TControl; NewDockSite: TWinControl;
256256 DropControl: TControl; ControlSide: TAlign): Boolean;
257257 procedure BeginDrag(Immediate: Boolean; Threshold: Integer);
258258 procedure Dock(NewDockSite: TWinControl; ARect: TRect);
259259 procedure DragDrop(Source: TObject; X, Y: Integer);
260260 procedure EndDrag(Drop: Boolean);
261261 property DockOrientation: TDockOrientation;
262262 property Floating: Boolean;
263263 property FloatingDockSiteClass: TWinControlClass;
264264 property HostDockSite: TWinControl;
265265 property LRDockWidth: Integer;
266266 property TBDockHeight: Integer;
267267 property UndockHeight: Integer;
268268 property UndockWidth: Integer;
269269```
270270
271271   que las clases siguientes no existen/o no son utilizables
272272
273273``` pascal
274274 TDragImageList = class(TCustomImageList)
275275 TDockZone = class
276276 TDockTree = class(TInterfacedObject, IDockManager)
277277 TDragObject = class(TObject)
278278 TBaseDragControlObject = class(TDragObject)
279279 TDragControlObject = class(TBaseDragControlObject)
280280 TDragDockObject = class(TBaseDragControlObject)
281281```
282282
283283   y que las siguientes funciones no son utilizables o son incompablibles
284284
285285``` pascal
286286 function FindDragTarget(const Pos: TPoint;
287287 AllowDisabled: Boolean) : TControl;
288288 procedure CancelDrag;
289289 function IsDragObject(sender: TObject): Boolean;
290290```
291291
292292   El inicio del controlador de ajuste se describe aquí: [[Anchor Docking]]
293293
294294#### TEdit/TCustomEdit
295295
296296   Los controles *Edit*, funcionan esencialmente de la misma forma en la LCL y en la VCL, aunque tienen algunas cuestiones de las que ser conscientes a la hora de convertir.
297297
2982981. Debido a restricciones en los interfaces, *TEdit.PasswordChar* no trabaja en todos los interfaces (con el tiempo puede que sí), en su lugar se puede utilizar emPassword de *TCustomEdit.EchoMode* para el texto que necesite ser ocultado.
2992992. Los eventos *Drag/Dock*no están implementados. Para más información ver la sección Arrastre y colocación de controles.
3003003. Las propiedades de Font son normalmente ignoradas para consistencia del interfaz, para una explicación detallada ver la sección TControl.Font/TControl.ParentFont
301301
302302### (optional) TSplitter -\> TPairSplitter
303303
304304**Mejórame, por favor**
305305
306306   Ya existe un control *TSplitter* en la LCL, por lo que no es necesaria la conversión. Sin embargo, si usted quiere hacerlo, aquí se explica cómo:
307307
308308   Lo que sigue se basa libremente en preguntas de Vincent Snijders en la lista de correo, y en las respuestas de [Andrew Johnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson):
309309
310310   En la VCL el control "repartidor", que es como un [tirador](http://buscon.rae.es/draeI/SrvltGUIBusUsual?TIPO_HTML=2&TIPO_BUS=3&LEMA=tirador) que se coloca entre dos componentes para distribuir el espacio entre ambos, está representado por *TSplitter*. Esto se ve a menudo, por ejemplo en el IDE de Delphi entre el explorador del código y el visor de código fuente.
311311
312312   La LCL proporciona su propio control llamado *TPairSplitter*, que sirve para el mismo propósito, no obstante no es compatible, será necesario "reparar" el código de los DFM de Delphi convertidos, aunque gran parte es compartido entre los dos.
313313
314314   **¿Cuales son exactamente las diferencias?**
315315
316316   La mayor diferencia es que el *TSplitter* de la VCL no tiene *hijos*, en vez de ello se coloca entre los dos controles alineados apropiadamente y modifica sus dimensiones en tiempo de ejecución. Es necesario tener dos controles alineados para cualquier cosa. Un ejemplo sencillo es un formulario con un Panel alineado a la izquierda (*Aling := alLeft*), un *Splitter* alineado a la izquierda y un segundo panel alineado al área cliente (*Aling := alClient*). Durante la ejecución puede ajustar el espacio entre los dos paneles arrastrando el tirador que provee el control *Splitter*.
317317
318318   En la LCL, por su parte, un *TPairSplitter* es un tipo especial de control con dos paneles, y aunque es útil únicamente si los controles que se reparten el espacio están en ellos, realiza su cometido estando vacios. Siguiendo con el ejemplo anterior, tendríamos un formulario con un TPairSplitter alineado al área cliente (Aling := alClient) y sendos paneles, igualmente alineados al área cliente (Aling := alClient) a los lados.
319319
320320   La otra diferencia importante es que en la VCL, puesto que el *TSplitter* es su propio *TControl*, la posición se guarda relativa a los otros controles al hacer el reparto, así que en cierto momento un panel del cliente crecerá mientras que los otros paneles no, así la posición de la *frontera* es relativa a la alineación de los controles participantes.
321321
322322   En la LCL puesto que los paneles laterales están separados el control *TPairSplitter* tiene su propiedad de posición es absoluta, y al realizar la redistribución no cambia su posición según el contenido, por lo que hay que hacer una *retrollamada* para asegurar que se mantiene el ratio, en caso de ser importante.
323323
324324   Por ejemplo, si el lado derecho de una distribución vertical necesita comportase como si estuviera *alineado al cliente* será necesario añadir al evento *OnResize* del formulario código cómo este:
325325
326326``` pascal
327327 PairSplitter.Position := PairSplitter.Width - PairSplitter.Position;
328328```
329329
330330   ¿Cómo puedo convertir código existente que utiliza TSplitter a TPairSplitter?
331331
332332   Si el repartidor y los controles se crean dentro de una función (como *OnCreate* del formulario), la conversión será más difícil, se reorganiza primero el código para crear los controles en el orden adecuado según la nueva jerarquía y para fijar a los padres de los controles *hijo* a repartir de izquierda/arriba y a la derecha/abajo del *PairSplitter*. Un ejemplo de los cambios necesarios:
333333
334-<table>
335-<tbody>
336-<tr>
337-<td class="header"><p><strong>VCL</strong></p></td>
338-<td class="header"><p><strong>LCL</strong></p></td>
339-</tr>
340-<tr>
341-<td class="code"><div class="sourceCode" id="cb1"><pre class="sourceCode pascal"><code class="sourceCode pascal"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a> <span class="kw">var</span> </span>
342-<span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a> BottomPanel: TPanel;</span>
343-<span id="cb1-3"><a href="#cb1-3" aria-hidden="true" tabindex="-1"></a> VerticalSplitter: TSplitter;</span>
344-<span id="cb1-4"><a href="#cb1-4" aria-hidden="true" tabindex="-1"></a> LeftPanel: TPanel;</span>
345-<span id="cb1-5"><a href="#cb1-5" aria-hidden="true" tabindex="-1"></a> HorizontalSplitter: TSplitter;</span>
346-<span id="cb1-6"><a href="#cb1-6" aria-hidden="true" tabindex="-1"></a> MainPanel: TPanel;</span>
347-<span id="cb1-7"><a href="#cb1-7" aria-hidden="true" tabindex="-1"></a></span>
348-<span id="cb1-8"><a href="#cb1-8" aria-hidden="true" tabindex="-1"></a><span class="kw">begin</span></span>
349-<span id="cb1-9"><a href="#cb1-9" aria-hidden="true" tabindex="-1"></a> BottomPanel:= TPanel.Create(<span class="kw">Self</span>);</span>
350-<span id="cb1-10"><a href="#cb1-10" aria-hidden="true" tabindex="-1"></a> <span class="kw">with</span> (BottomPanel) <span class="kw">do</span></span>
351-<span id="cb1-11"><a href="#cb1-11" aria-hidden="true" tabindex="-1"></a> <span class="kw">begin</span></span>
352-<span id="cb1-12"><a href="#cb1-12" aria-hidden="true" tabindex="-1"></a> Parent:= <span class="kw">Self</span>;</span>
353-<span id="cb1-13"><a href="#cb1-13" aria-hidden="true" tabindex="-1"></a> Height:= <span class="dv">75</span>;</span>
354-<span id="cb1-14"><a href="#cb1-14" aria-hidden="true" tabindex="-1"></a> Align:= alBottom;</span>
355-<span id="cb1-15"><a href="#cb1-15" aria-hidden="true" tabindex="-1"></a> <span class="kw">end</span>;</span>
356-<span id="cb1-16"><a href="#cb1-16" aria-hidden="true" tabindex="-1"></a></span>
357-<span id="cb1-17"><a href="#cb1-17" aria-hidden="true" tabindex="-1"></a> VerticalSplitter:= TSplitter.Create(<span class="kw">Self</span>);</span>
358-<span id="cb1-18"><a href="#cb1-18" aria-hidden="true" tabindex="-1"></a> <span class="kw">with</span> (VerticalSplitter) <span class="kw">do</span></span>
359-<span id="cb1-19"><a href="#cb1-19" aria-hidden="true" tabindex="-1"></a> <span class="kw">begin</span></span>
360-<span id="cb1-20"><a href="#cb1-20" aria-hidden="true" tabindex="-1"></a> Parent:= <span class="kw">Self</span>;</span>
361-<span id="cb1-21"><a href="#cb1-21" aria-hidden="true" tabindex="-1"></a> Align:= alBottom;</span>
362-<span id="cb1-22"><a href="#cb1-22" aria-hidden="true" tabindex="-1"></a> <span class="kw">end</span>;</span>
363-<span id="cb1-23"><a href="#cb1-23" aria-hidden="true" tabindex="-1"></a></span>
364-<span id="cb1-24"><a href="#cb1-24" aria-hidden="true" tabindex="-1"></a> HorizontalSplitter:= TSplitter.Create(<span class="kw">Self</span>);</span>
365-<span id="cb1-25"><a href="#cb1-25" aria-hidden="true" tabindex="-1"></a> <span class="kw">with</span> (HorizontalSplitter) <span class="kw">do</span></span>
366-<span id="cb1-26"><a href="#cb1-26" aria-hidden="true" tabindex="-1"></a> <span class="kw">begin</span></span>
367-<span id="cb1-27"><a href="#cb1-27" aria-hidden="true" tabindex="-1"></a> Parent:= <span class="kw">Self</span>;</span>
368-<span id="cb1-28"><a href="#cb1-28" aria-hidden="true" tabindex="-1"></a> align:= alLeft;</span>
369-<span id="cb1-29"><a href="#cb1-29" aria-hidden="true" tabindex="-1"></a> <span class="kw">end</span>;</span>
370-<span id="cb1-30"><a href="#cb1-30" aria-hidden="true" tabindex="-1"></a></span>
371-<span id="cb1-31"><a href="#cb1-31" aria-hidden="true" tabindex="-1"></a> LeftPanel:= TPanel.Create(<span class="kw">Self</span>);</span>
372-<span id="cb1-32"><a href="#cb1-32" aria-hidden="true" tabindex="-1"></a> <span class="kw">with</span> (LeftPanel) <span class="kw">do</span></span>
373-<span id="cb1-33"><a href="#cb1-33" aria-hidden="true" tabindex="-1"></a> <span class="kw">begin</span></span>
374-<span id="cb1-34"><a href="#cb1-34" aria-hidden="true" tabindex="-1"></a> Parent:= <span class="kw">Self</span>;</span>
375-<span id="cb1-35"><a href="#cb1-35" aria-hidden="true" tabindex="-1"></a> Width:= <span class="dv">125</span>;</span>
376-<span id="cb1-36"><a href="#cb1-36" aria-hidden="true" tabindex="-1"></a> Align:= alLeft;</span>
377-<span id="cb1-37"><a href="#cb1-37" aria-hidden="true" tabindex="-1"></a> <span class="kw">end</span>;</span>
378-<span id="cb1-38"><a href="#cb1-38" aria-hidden="true" tabindex="-1"></a></span>
379-<span id="cb1-39"><a href="#cb1-39" aria-hidden="true" tabindex="-1"></a> MainPanel:= TPanel.Create(<span class="kw">Self</span>);</span>
380-<span id="cb1-40"><a href="#cb1-40" aria-hidden="true" tabindex="-1"></a> <span class="kw">with</span> (MainPanel) <span class="kw">do</span></span>
381-<span id="cb1-41"><a href="#cb1-41" aria-hidden="true" tabindex="-1"></a> <span class="kw">begin</span></span>
382-<span id="cb1-42"><a href="#cb1-42" aria-hidden="true" tabindex="-1"></a> Parent:= <span class="kw">Self</span>;</span>
383-<span id="cb1-43"><a href="#cb1-43" aria-hidden="true" tabindex="-1"></a> Align:= alClient;</span>
384-<span id="cb1-44"><a href="#cb1-44" aria-hidden="true" tabindex="-1"></a> Caption:= <span class="st">&#39;Hello&#39;</span>;</span>
385-<span id="cb1-45"><a href="#cb1-45" aria-hidden="true" tabindex="-1"></a> <span class="kw">end</span>;</span>
386-<span id="cb1-46"><a href="#cb1-46" aria-hidden="true" tabindex="-1"></a><span class="kw">end</span>; </span></code></pre></div></td>
387-<td class="code"><div class="sourceCode" id="cb2"><pre class="sourceCode pascal"><code class="sourceCode pascal"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a> <span class="kw">var</span></span>
388-<span id="cb2-2"><a href="#cb2-2" aria-hidden="true" tabindex="-1"></a> BottomPanel: TPanel;</span>
389-<span id="cb2-3"><a href="#cb2-3" aria-hidden="true" tabindex="-1"></a> VerticalSplitter: TPairSplitter;</span>
390-<span id="cb2-4"><a href="#cb2-4" aria-hidden="true" tabindex="-1"></a> LeftPanel: TPanel;</span>
391-<span id="cb2-5"><a href="#cb2-5" aria-hidden="true" tabindex="-1"></a> HorizontalSplitter: TPairSplitter;</span>
392-<span id="cb2-6"><a href="#cb2-6" aria-hidden="true" tabindex="-1"></a> MainPanel: TPanel;</span>
393-<span id="cb2-7"><a href="#cb2-7" aria-hidden="true" tabindex="-1"></a></span>
394-<span id="cb2-8"><a href="#cb2-8" aria-hidden="true" tabindex="-1"></a><span class="kw">begin</span></span>
395-<span id="cb2-9"><a href="#cb2-9" aria-hidden="true" tabindex="-1"></a> VerticalSplitter:= TPairSplitter.Create(<span class="kw">Self</span>);</span>
396-<span id="cb2-10"><a href="#cb2-10" aria-hidden="true" tabindex="-1"></a> <span class="kw">with</span> (VerticalSplitter) <span class="kw">do</span></span>
397-<span id="cb2-11"><a href="#cb2-11" aria-hidden="true" tabindex="-1"></a> <span class="kw">begin</span></span>
398-<span id="cb2-12"><a href="#cb2-12" aria-hidden="true" tabindex="-1"></a> Parent:= <span class="kw">Self</span>;</span>
399-<span id="cb2-13"><a href="#cb2-13" aria-hidden="true" tabindex="-1"></a> Align:= alClient;</span>
400-<span id="cb2-14"><a href="#cb2-14" aria-hidden="true" tabindex="-1"></a> Width:= <span class="kw">Self</span>.Width;</span>
401-<span id="cb2-15"><a href="#cb2-15" aria-hidden="true" tabindex="-1"></a> Height:= <span class="kw">Self</span>.Height;</span>
402-<span id="cb2-16"><a href="#cb2-16" aria-hidden="true" tabindex="-1"></a> SplitterType:= pstVertical;</span>
403-<span id="cb2-17"><a href="#cb2-17" aria-hidden="true" tabindex="-1"></a> Position:= Height - <span class="dv">75</span>;</span>
404-<span id="cb2-18"><a href="#cb2-18" aria-hidden="true" tabindex="-1"></a> Sides[<span class="dv">0</span>].Width:= Width;</span>
405-<span id="cb2-19"><a href="#cb2-19" aria-hidden="true" tabindex="-1"></a> Sides[<span class="dv">0</span>].Height:= Position;</span>
406-<span id="cb2-20"><a href="#cb2-20" aria-hidden="true" tabindex="-1"></a> <span class="kw">end</span>;</span>
407-<span id="cb2-21"><a href="#cb2-21" aria-hidden="true" tabindex="-1"></a></span>
408-<span id="cb2-22"><a href="#cb2-22" aria-hidden="true" tabindex="-1"></a> HorizontalSplitter:= TPairSplitter.Create(<span class="kw">Self</span>);</span>
409-<span id="cb2-23"><a href="#cb2-23" aria-hidden="true" tabindex="-1"></a> <span class="kw">with</span> (HorizontalSplitter) <span class="kw">do</span></span>
410-<span id="cb2-24"><a href="#cb2-24" aria-hidden="true" tabindex="-1"></a> <span class="kw">begin</span></span>
411-<span id="cb2-25"><a href="#cb2-25" aria-hidden="true" tabindex="-1"></a> Parent:= VerticalSplitter.Sides[<span class="dv">0</span>];</span>
412-<span id="cb2-26"><a href="#cb2-26" aria-hidden="true" tabindex="-1"></a> Width:= <span class="kw">Self</span>.Width;</span>
413-<span id="cb2-27"><a href="#cb2-27" aria-hidden="true" tabindex="-1"></a> Height:= VerticalSplitter.Position;</span>
414-<span id="cb2-28"><a href="#cb2-28" aria-hidden="true" tabindex="-1"></a> align:= alClient;</span>
415-<span id="cb2-29"><a href="#cb2-29" aria-hidden="true" tabindex="-1"></a> SplitterType:= pstHorizontal;</span>
416-<span id="cb2-30"><a href="#cb2-30" aria-hidden="true" tabindex="-1"></a> Position:= <span class="dv">125</span>;</span>
417-<span id="cb2-31"><a href="#cb2-31" aria-hidden="true" tabindex="-1"></a> <span class="kw">end</span>;</span>
418-<span id="cb2-32"><a href="#cb2-32" aria-hidden="true" tabindex="-1"></a></span>
419-<span id="cb2-33"><a href="#cb2-33" aria-hidden="true" tabindex="-1"></a> LeftPanel:= TPanel.Create(<span class="kw">Self</span>);</span>
420-<span id="cb2-34"><a href="#cb2-34" aria-hidden="true" tabindex="-1"></a> <span class="kw">with</span> (LeftPanel) <span class="kw">do</span></span>
421-<span id="cb2-35"><a href="#cb2-35" aria-hidden="true" tabindex="-1"></a> <span class="kw">begin</span></span>
422-<span id="cb2-36"><a href="#cb2-36" aria-hidden="true" tabindex="-1"></a> Parent:= HorizontalSplitter.Sides[<span class="dv">0</span>];</span>
423-<span id="cb2-37"><a href="#cb2-37" aria-hidden="true" tabindex="-1"></a> Align:= alClient;</span>
424-<span id="cb2-38"><a href="#cb2-38" aria-hidden="true" tabindex="-1"></a> <span class="kw">end</span>;</span>
425-<span id="cb2-39"><a href="#cb2-39" aria-hidden="true" tabindex="-1"></a></span>
426-<span id="cb2-40"><a href="#cb2-40" aria-hidden="true" tabindex="-1"></a> MainPanel:= TPanel.Create(<span class="kw">Self</span>);</span>
427-<span id="cb2-41"><a href="#cb2-41" aria-hidden="true" tabindex="-1"></a> <span class="kw">with</span> (MainPanel) <span class="kw">do</span></span>
428-<span id="cb2-42"><a href="#cb2-42" aria-hidden="true" tabindex="-1"></a> <span class="kw">begin</span></span>
429-<span id="cb2-43"><a href="#cb2-43" aria-hidden="true" tabindex="-1"></a> Parent:= HorizontalSplitter.Sides[<span class="dv">1</span>];</span>
430-<span id="cb2-44"><a href="#cb2-44" aria-hidden="true" tabindex="-1"></a> Align:= alClient;</span>
431-<span id="cb2-45"><a href="#cb2-45" aria-hidden="true" tabindex="-1"></a> Caption:= <span class="st">&#39;Hello&#39;</span>;</span>
432-<span id="cb2-46"><a href="#cb2-46" aria-hidden="true" tabindex="-1"></a> <span class="kw">end</span>;</span>
433-<span id="cb2-47"><a href="#cb2-47" aria-hidden="true" tabindex="-1"></a></span>
434-<span id="cb2-48"><a href="#cb2-48" aria-hidden="true" tabindex="-1"></a> BottomPanel:= TPanel.Create(<span class="kw">Self</span>);</span>
435-<span id="cb2-49"><a href="#cb2-49" aria-hidden="true" tabindex="-1"></a> <span class="kw">with</span> (BottomPanel) <span class="kw">do</span></span>
436-<span id="cb2-50"><a href="#cb2-50" aria-hidden="true" tabindex="-1"></a> <span class="kw">begin</span></span>
437-<span id="cb2-51"><a href="#cb2-51" aria-hidden="true" tabindex="-1"></a> Parent:= VerticalSplitter.Sides[<span class="dv">1</span>];</span>
438-<span id="cb2-52"><a href="#cb2-52" aria-hidden="true" tabindex="-1"></a> Align:= alClient;</span>
439-<span id="cb2-53"><a href="#cb2-53" aria-hidden="true" tabindex="-1"></a> <span class="kw">end</span>;</span>
440-<span id="cb2-54"><a href="#cb2-54" aria-hidden="true" tabindex="-1"></a><span class="kw">end</span>; </span></code></pre></div></td>
441-</tr>
442-</tbody>
443-</table>
334+**VCL**
444335
336+**LCL**
337+
338+``` pascal
339+ var
340+ BottomPanel: TPanel;
341+ VerticalSplitter: TSplitter;
342+ LeftPanel: TPanel;
343+ HorizontalSplitter: TSplitter;
344+ MainPanel: TPanel;
345+
346+begin
347+ BottomPanel:= TPanel.Create(Self);
348+ with (BottomPanel) do
349+ begin
350+ Parent:= Self;
351+ Height:= 75;
352+ Align:= alBottom;
353+ end;
354+
355+ VerticalSplitter:= TSplitter.Create(Self);
356+ with (VerticalSplitter) do
357+ begin
358+ Parent:= Self;
359+ Align:= alBottom;
360+ end;
361+
362+ HorizontalSplitter:= TSplitter.Create(Self);
363+ with (HorizontalSplitter) do
364+ begin
365+ Parent:= Self;
366+ align:= alLeft;
367+ end;
368+
369+ LeftPanel:= TPanel.Create(Self);
370+ with (LeftPanel) do
371+ begin
372+ Parent:= Self;
373+ Width:= 125;
374+ Align:= alLeft;
375+ end;
376+
377+ MainPanel:= TPanel.Create(Self);
378+ with (MainPanel) do
379+ begin
380+ Parent:= Self;
381+ Align:= alClient;
382+ Caption:= 'Hello';
383+ end;
384+end;
385+```
386+
387+``` pascal
388+ var
389+ BottomPanel: TPanel;
390+ VerticalSplitter: TPairSplitter;
391+ LeftPanel: TPanel;
392+ HorizontalSplitter: TPairSplitter;
393+ MainPanel: TPanel;
394+
395+begin
396+ VerticalSplitter:= TPairSplitter.Create(Self);
397+ with (VerticalSplitter) do
398+ begin
399+ Parent:= Self;
400+ Align:= alClient;
401+ Width:= Self.Width;
402+ Height:= Self.Height;
403+ SplitterType:= pstVertical;
404+ Position:= Height - 75;
405+ Sides[0].Width:= Width;
406+ Sides[0].Height:= Position;
407+ end;
408+
409+ HorizontalSplitter:= TPairSplitter.Create(Self);
410+ with (HorizontalSplitter) do
411+ begin
412+ Parent:= VerticalSplitter.Sides[0];
413+ Width:= Self.Width;
414+ Height:= VerticalSplitter.Position;
415+ align:= alClient;
416+ SplitterType:= pstHorizontal;
417+ Position:= 125;
418+ end;
419+
420+ LeftPanel:= TPanel.Create(Self);
421+ with (LeftPanel) do
422+ begin
423+ Parent:= HorizontalSplitter.Sides[0];
424+ Align:= alClient;
425+ end;
426+
427+ MainPanel:= TPanel.Create(Self);
428+ with (MainPanel) do
429+ begin
430+ Parent:= HorizontalSplitter.Sides[1];
431+ Align:= alClient;
432+ Caption:= 'Hello';
433+ end;
434+
435+ BottomPanel:= TPanel.Create(Self);
436+ with (BottomPanel) do
437+ begin
438+ Parent:= VerticalSplitter.Sides[1];
439+ Align:= alClient;
440+ end;
441+end;
442+```
443+
445444Hay que ser consistente con la jerarquía de los controles. Y si se está familiarizado con los DFM' s, los cambios necesarios para la conversión DFM-\>LFM serán obvios cómo los anteriores, pues son del mismo tipo para las propiedades P*arent/Owner*, etc. El ejemplo sería algo así:
446445
447-<table>
448-<tbody>
449-<tr>
450-<td class="header"><p><strong>Delphi DFM</strong></p>
451-<div style="font-weight: normal">
452-<p><strong>(valores ajenos elliminados)</strong></p></td>
453-<td class="header"><p><strong>Lazarus LFM</strong></p>
454-<div style="font-weight: normal">
455-<p><strong>(algunos <em>width</em>, <em>height</em>, etc. eliminados)</strong></p></td>
456-</tr>
457-<tr>
458-<td class="code"><div class="sourceCode" id="cb1"><pre class="sourceCode pascal"><code class="sourceCode pascal"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a> <span class="kw">object</span> RepartidorVertical: TSplitter</span>
459-<span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a> Height = <span class="dv">3</span></span>
460-<span id="cb1-3"><a href="#cb1-3" aria-hidden="true" tabindex="-1"></a> Cursor = crVSplit</span>
461-<span id="cb1-4"><a href="#cb1-4" aria-hidden="true" tabindex="-1"></a> Align = alBottom</span>
462-<span id="cb1-5"><a href="#cb1-5" aria-hidden="true" tabindex="-1"></a> <span class="kw">end</span></span>
463-<span id="cb1-6"><a href="#cb1-6" aria-hidden="true" tabindex="-1"></a> <span class="kw">object</span> RepartidorHorizontal: TSplitter</span>
464-<span id="cb1-7"><a href="#cb1-7" aria-hidden="true" tabindex="-1"></a> Width = <span class="dv">3</span></span>
465-<span id="cb1-8"><a href="#cb1-8" aria-hidden="true" tabindex="-1"></a> Align = alLeft</span>
466-<span id="cb1-9"><a href="#cb1-9" aria-hidden="true" tabindex="-1"></a> <span class="kw">end</span></span>
467-<span id="cb1-10"><a href="#cb1-10" aria-hidden="true" tabindex="-1"></a> <span class="kw">object</span> Panel_Inferior: TPanel</span>
468-<span id="cb1-11"><a href="#cb1-11" aria-hidden="true" tabindex="-1"></a> Height = <span class="dv">75</span></span>
469-<span id="cb1-12"><a href="#cb1-12" aria-hidden="true" tabindex="-1"></a> Align = alBottom</span>
470-<span id="cb1-13"><a href="#cb1-13" aria-hidden="true" tabindex="-1"></a> <span class="kw">end</span></span>
471-<span id="cb1-14"><a href="#cb1-14" aria-hidden="true" tabindex="-1"></a> <span class="kw">object</span> Panel_Izquierdo: TPanel</span>
472-<span id="cb1-15"><a href="#cb1-15" aria-hidden="true" tabindex="-1"></a> Width = <span class="dv">125</span></span>
473-<span id="cb1-16"><a href="#cb1-16" aria-hidden="true" tabindex="-1"></a> Align = alLeft</span>
474-<span id="cb1-17"><a href="#cb1-17" aria-hidden="true" tabindex="-1"></a> <span class="kw">end</span></span>
475-<span id="cb1-18"><a href="#cb1-18" aria-hidden="true" tabindex="-1"></a> <span class="kw">object</span> Panel_Principal: TPanel</span>
476-<span id="cb1-19"><a href="#cb1-19" aria-hidden="true" tabindex="-1"></a> Align = alClient</span>
477-<span id="cb1-20"><a href="#cb1-20" aria-hidden="true" tabindex="-1"></a> <span class="kw">end</span> </span></code></pre></div></td>
478-<td class="code"><div class="sourceCode" id="cb2"><pre class="sourceCode pascal"><code class="sourceCode pascal"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a> <span class="kw">object</span> RepartidorVertical: TPairSplitter</span>
479-<span id="cb2-2"><a href="#cb2-2" aria-hidden="true" tabindex="-1"></a> Height = <span class="dv">154</span></span>
480-<span id="cb2-3"><a href="#cb2-3" aria-hidden="true" tabindex="-1"></a> Width = <span class="dv">362</span></span>
481-<span id="cb2-4"><a href="#cb2-4" aria-hidden="true" tabindex="-1"></a> Position = <span class="dv">45</span></span>
482-<span id="cb2-5"><a href="#cb2-5" aria-hidden="true" tabindex="-1"></a> SplitterType = pstVertical</span>
483-<span id="cb2-6"><a href="#cb2-6" aria-hidden="true" tabindex="-1"></a> <span class="kw">object</span> Panel_Superior: TPairSplitterSide</span>
484-<span id="cb2-7"><a href="#cb2-7" aria-hidden="true" tabindex="-1"></a> Height = <span class="dv">45</span></span>
485-<span id="cb2-8"><a href="#cb2-8" aria-hidden="true" tabindex="-1"></a> Width = <span class="dv">362</span></span>
486-<span id="cb2-9"><a href="#cb2-9" aria-hidden="true" tabindex="-1"></a> <span class="kw">end</span></span>
487-<span id="cb2-10"><a href="#cb2-10" aria-hidden="true" tabindex="-1"></a> <span class="kw">object</span> Panel_Inferior: TPairSplitterSide</span>
488-<span id="cb2-11"><a href="#cb2-11" aria-hidden="true" tabindex="-1"></a> Height = <span class="dv">103</span></span>
489-<span id="cb2-12"><a href="#cb2-12" aria-hidden="true" tabindex="-1"></a> Width = <span class="dv">362</span></span>
490-<span id="cb2-13"><a href="#cb2-13" aria-hidden="true" tabindex="-1"></a> ClientWidth = <span class="dv">362</span></span>
491-<span id="cb2-14"><a href="#cb2-14" aria-hidden="true" tabindex="-1"></a> ClientHeight = <span class="dv">103</span></span>
492-<span id="cb2-15"><a href="#cb2-15" aria-hidden="true" tabindex="-1"></a> <span class="kw">object</span> PairSplitter1: TPairSplitter</span>
493-<span id="cb2-16"><a href="#cb2-16" aria-hidden="true" tabindex="-1"></a> Height = <span class="dv">103</span></span>
494-<span id="cb2-17"><a href="#cb2-17" aria-hidden="true" tabindex="-1"></a> Width = <span class="dv">362</span></span>
495-<span id="cb2-18"><a href="#cb2-18" aria-hidden="true" tabindex="-1"></a> Align = alClient</span>
496-<span id="cb2-19"><a href="#cb2-19" aria-hidden="true" tabindex="-1"></a> Position = <span class="dv">45</span></span>
497-<span id="cb2-20"><a href="#cb2-20" aria-hidden="true" tabindex="-1"></a> <span class="kw">object</span> Panel_Izquierdo: TPairSplitterSide</span>
498-<span id="cb2-21"><a href="#cb2-21" aria-hidden="true" tabindex="-1"></a> Height = <span class="dv">103</span></span>
499-<span id="cb2-22"><a href="#cb2-22" aria-hidden="true" tabindex="-1"></a> Width = <span class="dv">45</span></span>
500-<span id="cb2-23"><a href="#cb2-23" aria-hidden="true" tabindex="-1"></a> <span class="kw">end</span></span>
501-<span id="cb2-24"><a href="#cb2-24" aria-hidden="true" tabindex="-1"></a> <span class="kw">object</span> Panel_Derecho: TPairSplitterSide</span>
502-<span id="cb2-25"><a href="#cb2-25" aria-hidden="true" tabindex="-1"></a> Height = <span class="dv">103</span></span>
503-<span id="cb2-26"><a href="#cb2-26" aria-hidden="true" tabindex="-1"></a> Width = <span class="dv">311</span></span>
504-<span id="cb2-27"><a href="#cb2-27" aria-hidden="true" tabindex="-1"></a> <span class="kw">end</span></span>
505-<span id="cb2-28"><a href="#cb2-28" aria-hidden="true" tabindex="-1"></a> <span class="kw">end</span></span>
506-<span id="cb2-29"><a href="#cb2-29" aria-hidden="true" tabindex="-1"></a> <span class="kw">end</span></span>
507-<span id="cb2-30"><a href="#cb2-30" aria-hidden="true" tabindex="-1"></a> <span class="kw">end</span> </span></code></pre></div></td>
508-</tr>
509-</tbody>
510-</table>
446+**Delphi DFM**
447+
448+**(valores ajenos elliminados)**
449+
450+**Lazarus LFM**
451+
452+**(algunos *width*, *height*, etc. eliminados)**
453+
454+``` pascal
455+ object RepartidorVertical: TSplitter
456+ Height = 3
457+ Cursor = crVSplit
458+ Align = alBottom
459+ end
460+ object RepartidorHorizontal: TSplitter
461+ Width = 3
462+ Align = alLeft
463+ end
464+ object Panel_Inferior: TPanel
465+ Height = 75
466+ Align = alBottom
467+ end
468+ object Panel_Izquierdo: TPanel
469+ Width = 125
470+ Align = alLeft
471+ end
472+ object Panel_Principal: TPanel
473+ Align = alClient
474+ end
475+```
476+
477+``` pascal
478+ object RepartidorVertical: TPairSplitter
479+ Height = 154
480+ Width = 362
481+ Position = 45
482+ SplitterType = pstVertical
483+ object Panel_Superior: TPairSplitterSide
484+ Height = 45
485+ Width = 362
486+ end
487+ object Panel_Inferior: TPairSplitterSide
488+ Height = 103
489+ Width = 362
490+ ClientWidth = 362
491+ ClientHeight = 103
492+ object PairSplitter1: TPairSplitter
493+ Height = 103
494+ Width = 362
495+ Align = alClient
496+ Position = 45
497+ object Panel_Izquierdo: TPairSplitterSide
498+ Height = 103
499+ Width = 45
500+ end
501+ object Panel_Derecho: TPairSplitterSide
502+ Height = 103
503+ Width = 311
504+ end
505+ end
506+ end
507+ end
508+```
511509
512510### TCustomTreeView/TTreeView
513511
514512   Tanto la VCL como la LCL disponen de un componente *TCustomTreeView/TTreeView*, utilizados para mostrar listas en forma de árboles estructurados con múltiples nodos, selección avanzada y lista de imágenes; y aunque las funcionalidades don comparables, no todas las propiedades son completamente compatibles. Las principales diferencias son estas:
515513
516514**La lista no está completa, es necesario actualizar para incluir las funciones *TCustomTreeView Mark*y los métodos protegridos**
517515
5185161. La LCL provee *TCustomTreeView.Options*, un conjunto de opciones con cuyos valores podemos cambiar el comportamiento y la apariencia del control. Estas opciones son:
519517 - *tvoAllowMultiselect*- habilita el modo de selección múltiple, equivalente a *TCustomTreeView.MultiSelect*en VCL de D6.
520518 - *tvoAutoExpand* - Expandir nodos automáticamente, equivalente a *TCustomTreeView.AutoExpand*.
521519 - *tvoAutoInsertMark* - Actualizar la vista de arrastre al mover el ratón.
522520 - *tvoAutoItemHeight* - Ajustar la altura de los elementos automáticamente.
523521 - tvoHideSelection'' - No marcar el elemento seleccionado.
524522 - "tvoHotTrack*- usar*Hot Tracking*, equivalente a*TCustomTreeview.HotTrack''
525523 - "tvoKeepCollapsedNodes'' - Mantener los nodos hijos al cerrar o abrir.
526524 - "tvoReadOnly*- Poner el componente en modo sólo lectura, equivalente a*TCustomTreeview.ReadOnly''
527525 - "tvoRightClickSelect*- habilitar la selección de nodos con el botón derecho del ratón, equivalente a*TCustomTreeView.RightClickSelect''.
528526 - "tvoRowSelect *- habilitar la selección de columnas, equivalente a*TCustomTreeView.RowSelect.''
529527 - "tvoShowButtons *- mostrar botones, equivalente a*TCustomTreeView.ShowButtons''.
530528 - "tvoShowLines*- mostrar líneas de nodos, equivalente a*TCustomTreeView.ShowLines''.
531529 - "tvoShowRoot *- mostrar nodo raíz, equivalente a*TCustomTreeView.ShowRoot''.
532530 - "tvoShowSeparators '' - mostrar separadores.
533531 - "tvoToolTips'' - mostrar ayudas para nodos individuales.
5345322. La LCL provee propiedades adicionales:
535533 - Evento *TCustomTreeView.OnSelectionChange*.
536534 - "tCustomTreeView.DefaultItems'', para el número de elementos predeterminados.
537535 - "tCustomTreeView.ExpandSignType'' para elegir el signo utilizado para indicar los nodos expandibles o contraibles.
5385363. La mayor parte de los eventos de Arrastrar y soltar (*Drag/Dock*) están disponibles en la LCL, aunque no funcionan. Para más información ver la sección precedente sobre Arrastre y colocación de controles.
539537
540538### Mensajes y Eventos
541539
542540   El orden y la frecuencia de los mensajes y eventos (*OnShow*, *OnActivate*, *OnEnter*, ...) de la LCL son diferentes de los de la VCL y dependen de la interfaz utilizada.
543541
544542   La LCL dispone de un subconjunto de mensajes similares a los de winAPI para hacer la migración desde Delphi sencilla, pero muchos mensajes de la LCL operan de forma diferente a sus pares de la VCL/winAPI. La mayor parte del código de Delphi utiliza mensajes winAPI,porque el VCL carece de esa característica o por razones de velocidad. Este tipo de código ráramente funcionará igual con la LCL, así que debe ser comprobado manualmente. Esto es así, ya que los mensajes de LCL se llaman por ejemplo *LM_SIZE* en vez de *WM_SIZE* (unidad lmessages).
545543
546544## Colaboradores originales y cambios
547545
548546   Esta página a sido convertida desde la [versión de la epikwiki](http://lazarus-ccr.sourceforge.net/index.php?wiki=LazarusForDelphiUsers).
549547
550548- Versión incial de la adaptación por VlxAdmin 9/26/2003
551549- Begin VCL -\> LCL with a section on TSplitter -\> TPairSplitter - [Andrew Johnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 9/30/2003
552550- Add TControl.Font/TControl.ParentFont to VCL -\> LCL - [Andrew Johnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 9/30/2003
553551- Update TEdit/TCustomEdit section in VCL -\> LCL - [Andrew Johnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 10/1/2003
554552- Add Control Dragging/Docking to VCL -\> LCL - [Andrew Johnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 10/1/2003
555553- Added "Object Inspector" to Delphi IDE -\> Lazarus IDE - [Andrew Johnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 10/1/2003
556554- Added initial "TCustomTreeView/TTreeView" to VCL -\> LCL - [Andrew Johnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 10/1/2003
557555- Added introduction to VCL -\> LCL - [Andrew Johnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 10/1/2003
558556- Fixed some typos - Vincent 10/2/2003
559557- Fixed Typo User:Kirkpatc 20 May 2004
560558- Versión en castellano (español) iskraelectrica (jldc) / junio de 2008.
561559
562560## Ver también
563561
564562[[Code Conversion Guide/es|Guía de conversión de código (desde Delphi y Kylix)]]
565563
566564[[Compile With Delphi|Compilar con Delphi]]
567565
568566---
569567*From the Free Pascal wiki, page "Lazarus For Delphi Users/es", 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).*
570568Category: Castellano
571569Category: Español

Back to history