Sign in Join
Wiki copytemporary

Lazarus For Delphi Users/pt: what changed

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

OldNewLine
11## Delphi -\> Lazarus
22
33Lazarus é uma ferramena de desevolvimento rápido de aplicações (RAD) como o Delphi. O que significa que ela contém uma biblioteca de componentes visuais e uma IDE. A biblioteca de componentes do Lazarus (LCL) é muito parecida com a do Delphi que é a VCL. Muitas unidades, classes e propriedades tem o mesmo nome e funcionalidade. Com isto converter entre eles é fácil. Mas Lazarus "não" é um 'clone do Delphi de código aberto'. Não espere 100% de compatibilidade.
44
55### As grandes diferenças
66
77Lazarus é um software completamente de código aberto, escrito independente de plataforma, que utiliza o compilador [[Free Pascal]] (FPC). O FPC funciona em mais de 15 plataformas. Dentre elas, podemos citar o Windows (32 bits), o Linux, o FreeBSD e o MacOSX, mas, nem todos os pacotes e bibliotecas estão portados.
88
99*ATENÇÃO!!! O Lazarus não está completo, como não está este texto. Nós sempre procuramos novos desenvolvedores, geradores de pacotes, portadores e escritores de documentação.*
1010
1111## Delphi IDE -\> Lazarus IDE
1212
1313### Projetos
1414
1515O arquivo principal de uma aplicação Delphi é o .dpr . Enquanto que para o Lazarus é o .lpi (Lazarus Project Information - informação do projeto do lazarus). Mas, um .dpr no Delphi contém o código fonte do programa principal, informações das unidades utilizadas e diretivas de compilação, enquanto que o arquivo .lpr no Lazarus contém o código fonte do programa principal e o restante fica na .lpi .
1616
1717Por exemplo:
1818
1919Delphi armazena os caminhos das unidades no arquivo .dpr . Pela instância: unit1 in 'path/Unit1.pas'. Este 'in' especifica os caminhos das unidades para o Delphi e não está pronto para ser usado na Lazarus IDE. Não o use. Use preferivelmente os trajetos (caminhos) da unidade nas opções do compilador.
2020
2121Uma importante regra: há *sempre* um projeto. Somente feche um projeto para sair do Lazarus ou abrir outro projeto. É porque um projeto Lazarus também é uma "sessão". Isto significa que o corrente editor indica também para armazenar no arquivo .lpi e são restaurados quando você reabre o projeto. Por exemplo, você está debugando um projeto, indica vários pontos de parada e marcadores. Você pode salvar o projeto a qualquer momento, fechar o Lazarus ou abrir outro projeto. Quando você reabrir o projeto, mesmo em outro computador, todos os seus pontos de parada, marcadores, arquivos abertos, posições do cursor, histórico de pulos, ... são restaurados.
2222
2323### Editor de Código
2424
2525Aproximadamente todas as teclas e atalhos podem ser definidos em environment-\>editor options-\>key mappings
2626
2727A IDE (ambiente de desenvolvimento) do Lazarus tem várias ferramentas para fontes. Muitas delas são parecidas e trabalham de forma similar ao Delphi. Mas há uma importante diferença: Lazarus não usa o compilador para pegar informação do código. Ele interpreta os fontes diretamente. Isto tem muitas vantagens:
2828
2929O editor de fonte trabalha com "comentários". Para Delphi os comentários no fonte são somente espaços entre o código. Nenhum comentário do código trabalha aqui e quando o código novo é automaticamente introduzido, seus comentários se perderão. Embora isto não seja completamente garantido, trabalha frequentemente. E quando o código novo é introduzido, o IDE usa algumas heuristicas para manter o comentário e codificá-lo junto. Por exemplo, isto não irá dividir a linha: "c:char; // comentário".
3030
3131Delphi tem "Completar Código"(Ctrl+Space) é chamado "Identificar Completar" sobre o Lazarus. O Lazarus termo "Completar Código" tem uma característica, combinando "Completar Automaticamente Classe"(mesmo sobre Delphi), "Completar Variável Local" e "Completar Associação de Evento". Todos deles são invocados por Ctrl+Shift+C e a IDE determina pela posição do cursor, o que significa.
3232
3333#### Exemplo para Completar Variável Local
3434
3535Assuma que você tenha criado um novo método e escrito o seguinte "i:=3;"
3636
37-<table>
38-<tbody>
39-<tr>
40-<td class="code"><div class="key">
41-<p>procedure</p>
42-</div>
43-<p>TForm1.DoSomething;</p>
44-<div class="key">
45-<p>begin</p>
46-</div>
47-<p><code> i:= </code></p>
48-<div class="int" style="inline">
49-<p>3</p>
50-</div>
51-<p>;</p>
52-<div class="key">
53-<p>end</p>
54-</div>
55-<p>;</p></td>
56-</tr>
57-</tbody>
58-</table>
37+procedure
5938
39+TForm1.DoSomething;
40+
41+begin
42+
43+` i:= `
44+
45+3
46+
47+;
48+
49+end
50+
51+;
52+
6053Posicionando o cursor sobre o identificador "i" e precionando Ctrl+Shift+C pegará:
6154
62-<table>
63-<tbody>
64-<tr>
65-<td class="code"><div class="key">
66-<p>procedure</p>
67-</div>
68-<p>TForm1.DoSomething;</p>
69-<div class="key">
70-<p>var</p>
71-</div>
72-<p>i: Integer;</p>
73-<div class="key">
74-<p>begin</p>
75-</div>
76-<p><code> i:= </code></p>
77-<div class="int">
78-<p>3</p>
79-</div>
80-<p>;</p>
81-<div class="key">
82-<p>end</p>
83-</div>
84-<p>;</p></td>
85-</tr>
86-</tbody>
87-</table>
55+procedure
8856
57+TForm1.DoSomething;
58+
59+var
60+
61+i: Integer;
62+
63+begin
64+
65+` i:= `
66+
67+3
68+
69+;
70+
71+end
72+
73+;
74+
8975#### Exemplo para Completar Associação de Evento
9076
9177Um ótimo recurso do Object Inspector é automaticamente criar métodos. O mesmo você pode pegar no editor de fonte.\
9278Por Exemplo:
9379
9480
9581Button1.OnClick:=
9682
9783Posicione o cursor atrás do operador de atribuição ":=" e precione Ctrl+Shift+C.
9884
9985#### "Completar Palavras" Ctrl+W
10086
10187Este trabalha igualmente ao "Identificar Completar", mas não trabalha em identificadores do Pascal, mas em todas as palavras. Deixa-o escolher de todas as palavras em todos os arquivos abertos que começam com as mesmas letras.
10288
10389#### Suporte a Inclusão de Arquivos
10490
10591Delphi não suporta isto, e você provavelmente não criará muitos arquivos incluídos ainda. Mas arquivos incluídos tem uma grande vantagem: Eles tornam possível escrever código (in)dependente de plataforma sem confundir com IFDEFs.
10692
10793Por exemplo: método pulando, Completar Classe, encontrar declaração, ... todos trabalham com arquivos incluídos.
10894
10995Há muitas opções para as características do código.
11096
11197### Designer
11298
11399\- Guidelines
114100
115101#### Inspetor de Objetos
116102
117103Nos ambientes de desenvolvimento do Delphi e do Lazarus temos o Inspetor de Objeto (Object Inspector) que é utilizado para editar e atribuir as propriedades, eventos, etc... do componente. Temos a seguir pequenas diferenças reparadas no uso:
118104
1191051. Começando no Delphi 5 há uma árvore de objeto(Object TreeView) que pode ser usada para navegar e selecionar objetos de acordo com a hierarquia adicionando ao tradicional arrastar e soltar no Inspetor de Objeto. No Lazarus é parte do Inspetor de Objeto e é usada no lugar do padrão arrastar e soltar, você pode selecionar para usar ou não isto através do clique do botão direito do mouse no menu "Show Component Tree"
1201062. No Delphi duplo clique em um evento em branco irá auto criar um e abrir o Editor de Código(Source Editor) na posição, no Lazarus há um botão à direita do listar(...) selecionado que executa esta ação preferivelmente
1211073. No Delphi você deve manualmente apagar o nome de um evento no editor para remover a ligação, no Lazarus você pode listar os eventos(...) e selecionar "(None)".
1221084. Igualmente a Eventos, duplo clique em propriedades como booleana não irá mudar o valor, você deve selecionar o valor da lista. E para abrir aqueles com um editor de formulário associado, você deve clicar o botão '...' à direita do editor/lista
123109
124110#### Pacotes
125111
126112O Lazarus pode instalar e usar pacotes do Delphi ?
127113
128114Não, porque eles requerem a magia do compilador Delphi.
129115
130116Nós necessitamos que sejam feitos especialmente para Lazarus?
131117
132118Sim. Crie um novo pacote, salve-o no diretório fonte do pacote (normalmente o mesmo diretório do .dpk(arquivo), adicion a LCL como pacote necessário e finalmente adicione os arquivos .pas . Você pode instalá-lo, ou usá-lo nos seus projetos agora. Há algumas diferenças entre pacotes do Lazarus e do Delphi, então por favor leia:
133119
134120\- docs/Packages.txt nos fontes do lazarus.
135121
136122### VCL -\> LCL
137123
138124Mesmo que a VCL e a LCL sirvam ao mesmo propósito - de uma Hierarquia de Componentes de Orientação a Objeto para RAD - elas não são idênticas. Por exemplo, enquanto a VCL provê muitos componentes não visuais, a LCL provê somente componentes visuais, pois a maioria dos componentes não visuais (como aceso a bancos de dados) são providos pela FCL, incluída no [[Free Pascal]] .
139125
140126Adicionalmente muitos controles da VCL podem não existir na LCL ou vice-versa, ou mesmo quando os controles existem em ambas, não são clones, e é necessário fazer modificações nas aplicações para portá-los.
141127
142128O que segue é uma tentativa de descrever as maiores diferenças ou incompatibilidades entre as duas para usuários Delphi. Cobre primariamente as diferenças com a VCL do Delphi 4, às vezes do Delphi 5 e Delphi 6 ou Delphi 7 também, e com a LCL atual, como está no CVS. Pode não coincidir com a versão da VCL que você usa, ou com a LCL que você tem. Se você observar disparidades com a LCL do CVS atual ou com o seu Delphi, esteja à vontade para acrescentar ou modificar de modo que fique compreensível para todos.
143129
144130#### TControl.Font/TControl.ParentFont
145131
146132Na VCL é muito comum e normal usar nomes ou propriedades de fontes específicas, como negrito ou itálico para controles e esperar que estes valores sejam semmpre seguidos. Também se provê a propriedade TControl.ParentFont que certifica que o controle vai seguir a fonte do seu Parent. A suposição implícita sendo a de que esses valores vão ser sempre seguidos, independente da configuração da aparência das janelas.
147133
148134Isto nem sempre é verdade na LCL, nem pode ser. Sendo a LCL cross-plataforma e cross-interface, naturalmente prefere fazer uma abordagem balanceada e vai procurar sempre usar Desktop/Aparência e Temas de Toolkit nativas de cada widget. Por exemplo, ao usar a interface GTK, o o GTK Theme supre uma fonte específica para botões, a LCL vai sempre procurar usar esta fonte.
149135
150136Isto quer dizer que a maioria dos controles da LCL não têm o mesmo controle nível de desing que é freqüentemente esperado da VCL, a não ser somente para os controles que são desenhados no Canvas em vez de alocados na interface e que podem ser consistentemente modificados indepententemente da interface usada.
151137
152138#### Control Dragging/Docking
153139
154140Na VCL a maioria dos WinControls implementam métodos e funções de callback para manejar dragging e docking de controles, por exemplo para arrastar um controle de um painel e soltar em outro em tempo de execução.
155141
156142Esta funcionalidade está atualmente não-implementada ou não-finalizada na LCL, em estágios iniciais de planejamento, e deve eventualmente dar suporte em algum nível de compatibilidade a este comportamento, se não da mesma maneira.
157143
158144Isto atualmente significa que nenhum controle vai herdar ou usar as seguintes funções, procedimentos, propriedades ou eventos:
159145
160-<table>
161-<tbody>
162-<tr>
163-<td class="code"><div class="key">
164-<p>Protected</p>
165-</div>
166-<div class="key">
167-<p>function</p>
168-</div>
169-<p>GetDockEdge(MousePos: TPoint): TAlign;</p>
170-<div class="key">
171-<p>function</p>
172-</div>
173-<p>GetDragImages: TDragImageList;</p>
174-<div class="key">
175-<p>function</p>
176-</div>
177-<p>GetFloating: Boolean;</p>
178-<div class="key">
179-<p>function</p>
180-</div>
181-<p>GetFloatingDockSiteClass: TWinControlClass;</p>
182-<div class="key">
183-<p>procedure</p>
184-</div>
185-<p>DoEndDrag(Target:TObject); X, Y: Integer);</p>
186-<div class="key">
187-<p>procedure</p>
188-</div>
189-<p>DockTrackNoTarget(Source: TDragDockObject; X, Y: Integer);</p>
190-<div class="key">
191-<p>procedure</p>
192-</div>
193-<p>DoEndDock(Target: TObject; X, Y: Integer);</p>
194-<div class="key">
195-<p>procedure</p>
196-</div>
197-<p>DoDock(NewDockSite: TWinControl;</p>
198-<div class="key">
199-<p>var</p>
200-</div>
201-<p>ARect: TRect);</p>
202-<div class="key">
203-<p>procedure</p>
204-</div>
205-<p>DoStartDock(</p>
206-<div class="key">
207-<p>var</p>
208-</div>
209-<p>DragObject: TDragObject);</p>
210-<div class="key">
211-<p>procedure</p>
212-</div>
213-<p>DragCanceled;</p>
214-<div class="key">
215-<p>procedure</p>
216-</div>
217-<p>DragOver(Source: TObject; X, Y: Integer; State: TDragState;</p>
218-<div class="key">
219-<p>var</p>
220-</div>
221-<p>Accept: Boolean);</p>
222-<div class="key">
223-<p>procedure</p>
224-</div>
225-<p>DoEndDrag(Target: TObject; X, Y: Integer);</p>
226-<div class="key">
227-<p>procedure</p>
228-</div>
229-<p>DoStartDrag(</p>
230-<div class="key">
231-<p>var</p>
232-</div>
233-<p>DragObject: TDragObject);</p>
234-<div class="key">
235-<p>procedure</p>
236-</div>
237-<p>DrawDragDockImage(DragDockObject: TDragDockObject);</p>
238-<div class="key">
239-<p>procedure</p>
240-</div>
241-<p>EraseDragDockImage(DragDockObject: TDragDockObject);</p>
242-<div class="key">
243-<p>procedure</p>
244-</div>
245-<p>PositionDockRect(DragDockObject: TDragDockObject);</p>
246-<div class="key">
247-<p>procedure</p>
248-</div>
249-<p>SetDragMode(Value: TDragMode);</p>
250-<div class="key">
251-<p>property</p>
252-</div>
253-<p>DragKind: TDragKind;</p>
254-<div class="key">
255-<p>property</p>
256-</div>
257-<p>DragCursor: TCursor;</p>
258-<div class="key">
259-<p>property</p>
260-</div>
261-<p>DragMode: TDragMode;</p>
262-<div class="key">
263-<p>property</p>
264-</div>
265-<p>OnDragDrop: TDragDropEvent;</p>
266-<div class="key">
267-<p>property</p>
268-</div>
269-<p>OnDragOver: TDragOverEvent;</p>
270-<div class="key">
271-<p>property</p>
272-</div>
273-<p>OnEndDock: TEndDragEvent;</p>
274-<div class="key">
275-<p>property</p>
276-</div>
277-<p>OnEndDrag: TEndDragEvent;</p>
278-<div class="key">
279-<p>property</p>
280-</div>
281-<p>OnStartDock: TStartDockEvent;</p>
282-<div class="key">
283-<p>property</p>
284-</div>
285-<p>OnStartDrag: TStartDragEvent;</p>
286-<div class="key">
287-<p>public</p>
288-</div>
289-<div class="key">
290-<p>function</p>
291-</div>
292-<p>Dragging: Boolean;</p>
293-<div class="key">
294-<p>function</p>
295-</div>
296-<p>ManualDock(NewDockSite: TWinControl; DropControl: TControl;</p>
297-<div class="key">
298-</div>
299-<p>ControlSide: TAlign): Boolean;</p>
300-<div class="key">
301-<p>function</p>
302-</div>
303-<p>ManualFloat(ScreenPos: TRect): Boolean;</p>
304-<div class="key">
305-<p>function</p>
306-</div>
307-<p>ReplaceDockedControl(Control: TControl; NewDockSite: TWinControl;</p>
308-<div class="key">
309-</div>
310-<p>DropControl: TControl; ControlSide: TAlign): Boolean;</p>
311-<div class="key">
312-<p>procedure</p>
313-</div>
314-<p>BeginDrag(Immediate: Boolean; Threshold: Integer);</p>
315-<div class="key">
316-<p>procedure</p>
317-</div>
318-<p>Dock(NewDockSite: TWinControl; ARect: TRect);</p>
319-<div class="key">
320-<p>procedure</p>
321-</div>
322-<p>DragDrop(Source: TObject; X, Y: Integer);</p>
323-<div class="key">
324-<p>procedure</p>
325-</div>
326-<p>EndDrag(Drop: Boolean);</p>
327-<div class="key">
328-<p>property</p>
329-</div>
330-<p>DockOrientation: TDockOrientation;</p>
331-<div class="key">
332-<p>property</p>
333-</div>
334-<p>Floating: Boolean;</p>
335-<div class="key">
336-<p>property</p>
337-</div>
338-<p>FloatingDockSiteClass: TWinControlClass;</p>
339-<div class="key">
340-<p>property</p>
341-</div>
342-<p>HostDockSite: TWinControl;</p>
343-<div class="key">
344-<p>property</p>
345-</div>
346-<p>LRDockWidth: Integer;</p>
347-<div class="key">
348-<p>property</p>
349-</div>
350-<p>TBDockHeight: Integer;</p>
351-<div class="key">
352-<p>property</p>
353-</div>
354-<p>UndockHeight: Integer;</p>
355-<div class="key">
356-<p>property</p>
357-</div>
358-<p>UndockWidth: Integer;</p></td>
359-</tr>
360-</tbody>
361-</table>
146+Protected
362147
148+function
149+
150+GetDockEdge(MousePos: TPoint): TAlign;
151+
152+function
153+
154+GetDragImages: TDragImageList;
155+
156+function
157+
158+GetFloating: Boolean;
159+
160+function
161+
162+GetFloatingDockSiteClass: TWinControlClass;
163+
164+procedure
165+
166+DoEndDrag(Target:TObject); X, Y: Integer);
167+
168+procedure
169+
170+DockTrackNoTarget(Source: TDragDockObject; X, Y: Integer);
171+
172+procedure
173+
174+DoEndDock(Target: TObject; X, Y: Integer);
175+
176+procedure
177+
178+DoDock(NewDockSite: TWinControl;
179+
180+var
181+
182+ARect: TRect);
183+
184+procedure
185+
186+DoStartDock(
187+
188+var
189+
190+DragObject: TDragObject);
191+
192+procedure
193+
194+DragCanceled;
195+
196+procedure
197+
198+DragOver(Source: TObject; X, Y: Integer; State: TDragState;
199+
200+var
201+
202+Accept: Boolean);
203+
204+procedure
205+
206+DoEndDrag(Target: TObject; X, Y: Integer);
207+
208+procedure
209+
210+DoStartDrag(
211+
212+var
213+
214+DragObject: TDragObject);
215+
216+procedure
217+
218+DrawDragDockImage(DragDockObject: TDragDockObject);
219+
220+procedure
221+
222+EraseDragDockImage(DragDockObject: TDragDockObject);
223+
224+procedure
225+
226+PositionDockRect(DragDockObject: TDragDockObject);
227+
228+procedure
229+
230+SetDragMode(Value: TDragMode);
231+
232+property
233+
234+DragKind: TDragKind;
235+
236+property
237+
238+DragCursor: TCursor;
239+
240+property
241+
242+DragMode: TDragMode;
243+
244+property
245+
246+OnDragDrop: TDragDropEvent;
247+
248+property
249+
250+OnDragOver: TDragOverEvent;
251+
252+property
253+
254+OnEndDock: TEndDragEvent;
255+
256+property
257+
258+OnEndDrag: TEndDragEvent;
259+
260+property
261+
262+OnStartDock: TStartDockEvent;
263+
264+property
265+
266+OnStartDrag: TStartDragEvent;
267+
268+public
269+
270+function
271+
272+Dragging: Boolean;
273+
274+function
275+
276+ManualDock(NewDockSite: TWinControl; DropControl: TControl;
277+
278+ControlSide: TAlign): Boolean;
279+
280+function
281+
282+ManualFloat(ScreenPos: TRect): Boolean;
283+
284+function
285+
286+ReplaceDockedControl(Control: TControl; NewDockSite: TWinControl;
287+
288+DropControl: TControl; ControlSide: TAlign): Boolean;
289+
290+procedure
291+
292+BeginDrag(Immediate: Boolean; Threshold: Integer);
293+
294+procedure
295+
296+Dock(NewDockSite: TWinControl; ARect: TRect);
297+
298+procedure
299+
300+DragDrop(Source: TObject; X, Y: Integer);
301+
302+procedure
303+
304+EndDrag(Drop: Boolean);
305+
306+property
307+
308+DockOrientation: TDockOrientation;
309+
310+property
311+
312+Floating: Boolean;
313+
314+property
315+
316+FloatingDockSiteClass: TWinControlClass;
317+
318+property
319+
320+HostDockSite: TWinControl;
321+
322+property
323+
324+LRDockWidth: Integer;
325+
326+property
327+
328+TBDockHeight: Integer;
329+
330+property
331+
332+UndockHeight: Integer;
333+
334+property
335+
336+UndockWidth: Integer;
337+
363338que as seguintes classes não existem ou não são utilizáveis:
364339
365-<table>
366-<tbody>
367-<tr>
368-<td class="code"><p>TDragImageList =</p>
369-<div class="key">
370-<p>class</p>
371-</div>
372-<p>(TCustomImageList)</p>
373-<p><code>TDockZone = </code></p>
374-<div class="key">
375-<p>class</p>
376-</div>
377-<p><code>TDockTree = </code></p>
378-<div class="key">
379-<p>class</p>
380-</div>
381-<p>(TInterfacedObject, IDockManager)</p>
382-<p><code>TDragObject = </code></p>
383-<div class="key">
384-<p>class</p>
385-</div>
386-<p>(TObject)</p>
387-<p><code>TBaseDragControlObject = </code></p>
388-<div class="key">
389-<p>class</p>
390-</div>
391-<p>(TDragObject)</p>
392-<p><code>TDragControlObject = </code></p>
393-<div class="key">
394-<p>class</p>
395-</div>
396-<p>(TBaseDragControlObject)</p>
397-<p><code>TDragDockObject = </code></p>
398-<div class="key">
399-<p>class</p>
400-</div>
401-<p>(TBaseDragControlObject)</p></td>
402-</tr>
403-</tbody>
404-</table>
340+TDragImageList =
405341
342+class
343+
344+(TCustomImageList)
345+
346+`TDockZone = `
347+
348+class
349+
350+`TDockTree = `
351+
352+class
353+
354+(TInterfacedObject, IDockManager)
355+
356+`TDragObject = `
357+
358+class
359+
360+(TObject)
361+
362+`TBaseDragControlObject = `
363+
364+class
365+
366+(TDragObject)
367+
368+`TDragControlObject = `
369+
370+class
371+
372+(TBaseDragControlObject)
373+
374+`TDragDockObject = `
375+
376+class
377+
378+(TBaseDragControlObject)
379+
406380e que as seguintes funções são inutilizáveis ou incompatíveis:
407381
408-<table>
409-<tbody>
410-<tr>
411-<td class="code"><div class="key">
412-<p>function</p>
413-</div>
414-<p>FindDragTarget(</p>
415-<div class="key">
416-<p>const</p>
417-</div>
418-<p>Pos: TPoint;</p>
419-<div class="key">
420-</div>
421-<p>AllowDisabled: Boolean) : TControl;</p>
422-<div class="key">
423-<p>procedure</p>
424-</div>
425-<p>CancelDrag;</p>
426-<div class="key">
427-<p>function</p>
428-</div>
429-<p>IsDragObject(sender: TObject): Boolean;</p></td>
430-</tr>
431-</tbody>
432-</table>
382+function
433383
384+FindDragTarget(
385+
386+const
387+
388+Pos: TPoint;
389+
390+AllowDisabled: Boolean) : TControl;
391+
392+procedure
393+
394+CancelDrag;
395+
396+function
397+
398+IsDragObject(sender: TObject): Boolean;
399+
434400#### TEdit/TCustomEdit
435401
436402Os controles Edit, ainda que funcionem essencialmente do mesmo modo na LCL como na VCL, não tem alguns itens que facilitariam a conversão
437403
4384041. Devido a restrições em Interfaces, TEdit.PasswordChar não funciona em todas as interfaces ainda (mas deverá funcionar), em lugar de TCustomEdit.EchoMode emPassword deve ser usado em eventos em que o texto precisa ser escondido.
4394052. Os eventos OnDrag e OnDock não estão implementados ainda. Para mais informações veja a seção anterior Control Dragging/Docking.
4404063. Propriedades de fonte são ignorada por consitência com interface, para uma explanação detalhada veja TControl.Font/TControl.ParentFont
441407
442408### (optional) TSplitter -\> TPairSplitter
443409
444410**Please Improve Me**
445411
446412Existe agora um controle TSplitter na LCL, não é mais necessário convertê-lo.
447413
448414No entanto, se você o quiser, ele está explicado aqui:
449415
450416O que segue é baseado em perguntas feitas por Vincent Snijders na mailing list, respondidas por [Andrew Johnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson):
451417
452418Na VCL, controles de splitting, que são um handle que pode ser arrastado entre dois componentes para dar mais ou menos espaço a um ou a outro, é realizado por um Splitter. Ele é visto por exemplo na IDE do Delphi entre o Code Explorer e o Source Viewer.
453419
454420A LCL fornece o seu próprio controle chamado TPairSplitter, que serve ao mesmo propósito, mas não é compatível, de modo que "reparar" código quebrado da VCL ou de arquivos DFM do Delphi será necessário para portar código, ainda que haja muito em comum entre os dois controles.
455421
456422Então o que são exatamente essas diferenças?
457423
458424Well the biggest differences are a VCL TSplitter has no children, instead it is placed between two controls aligned properly, and allows resizing between them at runtime, regardless its own size. It must have two controls aligned on each size to do anything. A simple example would be form with a Left Aligned Panel, a left aligned Splitter, and a second client aligned panel. On run time you could then realign the size given each panel by dragging on the handle provided by this Splitter control.
459425
460426On the LCL hand however, a TPairSplitter is a special kind of control, with two panels, and it can only be usefull if the controls to split are on these panels, but it will still perform a split between those panel whether or not anything is on them. So following the prior example, you would have a form with a TPairSplitter aligned client, and a panel aligned client on its left side, and a panel aligned client on its right side.
461427
462428The other important difference is that in the VCl, since the TSplitter is its own TControl, then the position is kept relative to the other controls on resize, so for instance a client panel will grow while the other panels will not, thus the split position is relative to the alignment of the split controls,
463429
464430In the LCL since the side panels are separate then the TPairSplitter has a Position property which is absolute relative to top or left. so on resize the actual position does not change according to contents, so a callback must be set to ensure the ratio is kept on resize if this is important.
465431
466432For example if the Right side of a vertical split needs to have alClient like behaviour, you need to add a form resize callback which does something like :
467433
468434`PairSplitter.Position := PairSplitter.Width - PairSplitter.Position; `
469435
470436Então como posso converter um código existente usando TSplitter para TPairSplitter?
471437
472438If the splitter and controls are created within an actual function(like form oncreate), conversion shouldn't be too difficult, primarily reorganize the code to create the controls in order of new hierarchy and set the parents of the child controls to split to the left/top and right/bottom portions of the PairSplitter. An example of the changes being -
473439
474-<table>
475-<tbody>
476-<tr>
477-<td class="header"><p>VCL</p></td>
478-<td class="header"><p>LCL</p></td>
479-</tr>
480-<tr>
481-<td class="code"><div class="key">
482-<p>var</p>
483-</div>
484-<p><code>  BottomPanel: TPanel</code></p>
485-<div class="symbol">
486-<p>;</p>
487-</div>
488-<div>
489-</div>
490-<p><code>  VerticalSplitter: TSplitter</code></p>
491-<div class="symbol">
492-<p>;</p>
493-</div>
494-<p><code>  LeftPanel: TPanel</code></p>
495-<div class="symbol">
496-<p>;</p>
497-</div>
498-<p><code>  HorizontalSplitter: TSplitter</code></p>
499-<div class="symbol">
500-<p>;</p>
501-</div>
502-<div>
503-</div>
504-<p><code>  MainPanel: TPanel</code></p>
505-<div class="symbol">
506-<p>;</p>
507-</div>
508-<div class="key">
509-<p>begin</p>
510-</div>
511-<p><code>  BottomPanel:= TPanel.Create(Self)</code></p>
512-<div class="symbol">
513-<p>;</p>
514-</div>
515-<div class="key">
516-<p>with</p>
517-</div>
518-<p>(BottomPanel)</p>
519-<div class="key">
520-<p>do</p>
521-</div>
522-<div class="key">
523-<p>begin</p>
524-</div>
525-<p><code>    Parent:= Self</code></p>
526-<div class="symbol">
527-<p>;</p>
528-</div>
529-<p><code>    Height:= </code></p>
530-<div class="int">
531-<p>75</p>
532-</div>
533-<div class="symbol">
534-<p>;</p>
535-</div>
536-<p><code>    Align:= alBottom</code></p>
537-<div class="symbol">
538-<p>;</p>
539-</div>
540-<div class="key">
541-<p>end</p>
542-</div>
543-<div class="symbol">
544-<p>;</p>
545-</div>
546-<div>
547-</div>
548-<p><code>  VerticalSplitter:= TSplitter.Create(Self)</code></p>
549-<div class="symbol">
550-<p>;</p>
551-</div>
552-<div class="key">
553-<p>with</p>
554-</div>
555-<p>(VerticalSplitter)</p>
556-<div class="key">
557-<p>do</p>
558-</div>
559-<div class="key">
560-<p>begin</p>
561-</div>
562-<p><code>    Parent:= Self</code></p>
563-<div class="symbol">
564-<p>;</p>
565-</div>
566-<p><code>    Align:= alBottom</code></p>
567-<div class="symbol">
568-<p>;</p>
569-</div>
570-<div class="key">
571-<p>end</p>
572-</div>
573-<div class="symbol">
574-<p>;</p>
575-</div>
576-<div>
577-</div>
578-<p><code>  HorizontalSplitter:= TSplitter.Create(Self)</code></p>
579-<div class="symbol">
580-<p>;</p>
581-</div>
582-<div class="key">
583-<p>with</p>
584-</div>
585-<p>(HorizontalSplitter)</p>
586-<div class="key">
587-<p>do</p>
588-</div>
589-<div class="key">
590-<p>begin</p>
591-</div>
592-<p><code>    Parent:= Self</code></p>
593-<div class="symbol">
594-<p>;</p>
595-</div>
596-<p><code>    align:= alLeft</code></p>
597-<div class="symbol">
598-<p>;</p>
599-</div>
600-<div class="key">
601-<p>end</p>
602-</div>
603-<div class="symbol">
604-<p>;</p>
605-</div>
606-<div>
607-</div>
608-<p><code>  LeftPanel:= TPanel.Create(Self)</code></p>
609-<div class="symbol">
610-<p>;</p>
611-</div>
612-<div class="key">
613-<p>with</p>
614-</div>
615-<p>(LeftPanel)</p>
616-<div class="key">
617-<p>do</p>
618-</div>
619-<div class="key">
620-<p>begin</p>
621-</div>
622-<p><code>    Parent:= Self</code></p>
623-<div class="symbol">
624-<p>;</p>
625-</div>
626-<p><code>    Width:= </code></p>
627-<div class="int">
628-<p>125</p>
629-</div>
630-<div class="symbol">
631-<p>;</p>
632-</div>
633-<p><code>    Align:= alLeft</code></p>
634-<div class="symbol">
635-<p>;</p>
636-</div>
637-<div class="key">
638-<p>end</p>
639-</div>
640-<div class="symbol">
641-<p>;</p>
642-</div>
643-<div>
644-</div>
645-<p><code>  MainPanel:= TPanel.Create(Self)</code></p>
646-<div class="symbol">
647-<p>;</p>
648-</div>
649-<div class="key">
650-<p>with</p>
651-</div>
652-<p>(MainPanel)</p>
653-<div class="key">
654-<p>do</p>
655-</div>
656-<div class="key">
657-<p>begin</p>
658-</div>
659-<p><code>    Parent:= Self</code></p>
660-<div class="symbol">
661-<p>;</p>
662-</div>
663-<p><code>    Align:= alClient</code></p>
664-<div class="symbol">
665-<p>;</p>
666-</div>
667-<p><code>    Caption:= </code></p>
668-<div class="str">
669-<p>'Hello'</p>
670-</div>
671-<div class="symbol">
672-<p>;</p>
673-</div>
674-<div class="key">
675-<p>end</p>
676-</div>
677-<div class="symbol">
678-<p>;</p>
679-</div>
680-<div class="key">
681-<p>end</p>
682-</div>
683-<p>;</p></td>
684-<td class="code"><div class="key">
685-<p>var</p>
686-</div>
687-<p><code>  BottomPanel: TPanel</code></p>
688-<div class="symbol">
689-<p>;</p>
690-</div>
691-<div>
692-</div>
693-<p><code>  VerticalSplitter: TPairSplitter</code></p>
694-<div class="symbol">
695-<p>;</p>
696-</div>
697-<p><code>  LeftPanel: TPanel</code></p>
698-<div class="symbol">
699-<p>;</p>
700-</div>
701-<p><code>  HorizontalSplitter: TPairSplitter</code></p>
702-<div class="symbol">
703-<p>;</p>
704-</div>
705-<div>
706-</div>
707-<p><code>  MainPanel: TPanel</code></p>
708-<div class="symbol">
709-<p>;</p>
710-</div>
711-<div class="key">
712-<p>begin</p>
713-</div>
714-<p><code>  VerticalSplitter:= TPairSplitter.Create(Self)</code></p>
715-<div class="symbol">
716-<p>;</p>
717-</div>
718-<div class="key">
719-<p>with</p>
720-</div>
721-<p>(VerticalSplitter)</p>
722-<div class="key">
723-<p>do</p>
724-</div>
725-<div class="key">
726-<p>begin</p>
727-</div>
728-<p><code>    Parent:= Self</code></p>
729-<div class="symbol">
730-<p>;</p>
731-</div>
732-<p><code>    Align:= alClient</code></p>
733-<div class="symbol">
734-<p>;</p>
735-</div>
736-<p><code>    Width:= Self.Width</code></p>
737-<div class="symbol">
738-<p>;</p>
739-</div>
740-<p><code>    Height:= Self.Height</code></p>
741-<div class="symbol">
742-<p>;</p>
743-</div>
744-<p><code>    SplitterType:= pstVertical</code></p>
745-<div class="symbol">
746-<p>;</p>
747-</div>
748-<p><code>    Position:= Height - </code></p>
749-<div class="int">
750-<p>75</p>
751-</div>
752-<div class="symbol">
753-<p>;</p>
754-</div>
755-<p><code>    Sides[</code></p>
756-<div class="int">
757-<p>0</p>
758-</div>
759-<p>].Width:= Width</p>
760-<div class="symbol">
761-<p>;</p>
762-</div>
763-<p><code>    Sides[</code></p>
764-<div class="int">
765-<p>0</p>
766-</div>
767-<p>].Height:= Position</p>
768-<div class="symbol">
769-<p>;</p>
770-</div>
771-<div class="key">
772-<p>end</p>
773-</div>
774-<div class="symbol">
775-<p>;</p>
776-</div>
777-<div>
778-</div>
779-<p><code>  HorizontalSplitter:= TPairSplitter.Create(Self)</code></p>
780-<div class="symbol">
781-<p>;</p>
782-</div>
783-<div class="key">
784-<p>with</p>
785-</div>
786-<p>(HorizontalSplitter)</p>
787-<div class="key">
788-<p>do</p>
789-</div>
790-<div class="key">
791-<p>begin</p>
792-</div>
793-<p><code>    Parent:= VerticalSplitter.Sides[</code></p>
794-<div class="int">
795-<p>0</p>
796-</div>
797-<p>]</p>
798-<div class="symbol">
799-<p>;</p>
800-</div>
801-<p><code>    Width:= Self.Width</code></p>
802-<div class="symbol">
803-<p>;</p>
804-</div>
805-<p><code>    Height:= VerticalSplitter.Position</code></p>
806-<div class="symbol">
807-<p>;</p>
808-</div>
809-<p><code>    align:= alClient</code></p>
810-<div class="symbol">
811-<p>;</p>
812-</div>
813-<p><code>    SplitterType:= pstHorizontal</code></p>
814-<div class="symbol">
815-<p>;</p>
816-</div>
817-<p><code>    Position:= </code></p>
818-<div class="int">
819-<p>125</p>
820-</div>
821-<div class="symbol">
822-<p>;</p>
823-</div>
824-<div class="key">
825-<p>end</p>
826-</div>
827-<div class="symbol">
828-<p>;</p>
829-</div>
830-<div>
831-</div>
832-<p><code>  LeftPanel:= TPanel.Create(Self)</code></p>
833-<div class="symbol">
834-<p>;</p>
835-</div>
836-<div class="key">
837-<p>with</p>
838-</div>
839-<p>(LeftPanel)</p>
840-<div class="key">
841-<p>do</p>
842-</div>
843-<div class="key">
844-<p>begin</p>
845-</div>
846-<p><code>    Parent:= HorizontalSplitter.Sides[</code></p>
847-<div class="int">
848-<p>0</p>
849-</div>
850-<p>]</p>
851-<div class="symbol">
852-<p>;</p>
853-</div>
854-<p><code>    Align:= alClient</code></p>
855-<div class="symbol">
856-<p>;</p>
857-</div>
858-<div class="key">
859-<p>end</p>
860-</div>
861-<div class="symbol">
862-<p>;</p>
863-</div>
864-<div>
865-</div>
866-<p><code>  MainPanel:= TPanel.Create(Self)</code></p>
867-<div class="symbol">
868-<p>;</p>
869-</div>
870-<div class="key">
871-<p>with</p>
872-</div>
873-<p>(MainPanel)</p>
874-<div class="key">
875-<p>do</p>
876-</div>
877-<div class="key">
878-<p>begin</p>
879-</div>
880-<p><code>    Parent:= HorizontalSplitter.Sides[</code></p>
881-<div class="int">
882-<p>1</p>
883-</div>
884-<p>]</p>
885-<div class="symbol">
886-<p>;</p>
887-</div>
888-<p><code>    Align:= alClient</code></p>
889-<div class="symbol">
890-<p>;</p>
891-</div>
892-<p><code>    Caption:= </code></p>
893-<div class="str">
894-<p>'Hello'</p>
895-</div>
896-<div class="symbol">
897-<p>;</p>
898-</div>
899-<div class="key">
900-<p>end</p>
901-</div>
902-<div class="symbol">
903-<p>;</p>
904-</div>
905-<div>
906-</div>
907-<p><code>  BottomPanel:= TPanel.Create(Self)</code></p>
908-<div class="symbol">
909-<p>;</p>
910-</div>
911-<div class="key">
912-<p>with</p>
913-</div>
914-<p>(BottomPanel)</p>
915-<div class="key">
916-<p>do</p>
917-</div>
918-<div class="key">
919-<p>begin</p>
920-</div>
921-<p><code>    Parent:= VerticalSplitter.Sides[</code></p>
922-<div class="int">
923-<p>1</p>
924-</div>
925-<p>]</p>
926-<div class="symbol">
927-<p>;</p>
928-</div>
929-<p><code>    Align:= alClient</code></p>
930-<div class="symbol">
931-<p>;</p>
932-</div>
933-<div class="key">
934-<p>end</p>
935-</div>
936-<div class="symbol">
937-<p>;</p>
938-</div>
939-<div class="key">
940-<p>end</p>
941-</div>
942-<div class="symbol">
943-<p>;</p>
944-</div></td>
945-</tr>
946-</tbody>
947-</table>
440+VCL
948441
442+LCL
443+
444+var
445+
446+`  BottomPanel: TPanel`
447+
448+;
449+
450+`  VerticalSplitter: TSplitter`
451+
452+;
453+
454+`  LeftPanel: TPanel`
455+
456+;
457+
458+`  HorizontalSplitter: TSplitter`
459+
460+;
461+
462+`  MainPanel: TPanel`
463+
464+;
465+
466+begin
467+
468+`  BottomPanel:= TPanel.Create(Self)`
469+
470+;
471+
472+with
473+
474+(BottomPanel)
475+
476+do
477+
478+begin
479+
480+`    Parent:= Self`
481+
482+;
483+
484+`    Height:= `
485+
486+75
487+
488+;
489+
490+`    Align:= alBottom`
491+
492+;
493+
494+end
495+
496+;
497+
498+`  VerticalSplitter:= TSplitter.Create(Self)`
499+
500+;
501+
502+with
503+
504+(VerticalSplitter)
505+
506+do
507+
508+begin
509+
510+`    Parent:= Self`
511+
512+;
513+
514+`    Align:= alBottom`
515+
516+;
517+
518+end
519+
520+;
521+
522+`  HorizontalSplitter:= TSplitter.Create(Self)`
523+
524+;
525+
526+with
527+
528+(HorizontalSplitter)
529+
530+do
531+
532+begin
533+
534+`    Parent:= Self`
535+
536+;
537+
538+`    align:= alLeft`
539+
540+;
541+
542+end
543+
544+;
545+
546+`  LeftPanel:= TPanel.Create(Self)`
547+
548+;
549+
550+with
551+
552+(LeftPanel)
553+
554+do
555+
556+begin
557+
558+`    Parent:= Self`
559+
560+;
561+
562+`    Width:= `
563+
564+125
565+
566+;
567+
568+`    Align:= alLeft`
569+
570+;
571+
572+end
573+
574+;
575+
576+`  MainPanel:= TPanel.Create(Self)`
577+
578+;
579+
580+with
581+
582+(MainPanel)
583+
584+do
585+
586+begin
587+
588+`    Parent:= Self`
589+
590+;
591+
592+`    Align:= alClient`
593+
594+;
595+
596+`    Caption:= `
597+
598+'Hello'
599+
600+;
601+
602+end
603+
604+;
605+
606+end
607+
608+;
609+
610+var
611+
612+`  BottomPanel: TPanel`
613+
614+;
615+
616+`  VerticalSplitter: TPairSplitter`
617+
618+;
619+
620+`  LeftPanel: TPanel`
621+
622+;
623+
624+`  HorizontalSplitter: TPairSplitter`
625+
626+;
627+
628+`  MainPanel: TPanel`
629+
630+;
631+
632+begin
633+
634+`  VerticalSplitter:= TPairSplitter.Create(Self)`
635+
636+;
637+
638+with
639+
640+(VerticalSplitter)
641+
642+do
643+
644+begin
645+
646+`    Parent:= Self`
647+
648+;
649+
650+`    Align:= alClient`
651+
652+;
653+
654+`    Width:= Self.Width`
655+
656+;
657+
658+`    Height:= Self.Height`
659+
660+;
661+
662+`    SplitterType:= pstVertical`
663+
664+;
665+
666+`    Position:= Height - `
667+
668+75
669+
670+;
671+
672+`    Sides[`
673+
674+0
675+
676+\].Width:= Width
677+
678+;
679+
680+`    Sides[`
681+
682+0
683+
684+\].Height:= Position
685+
686+;
687+
688+end
689+
690+;
691+
692+`  HorizontalSplitter:= TPairSplitter.Create(Self)`
693+
694+;
695+
696+with
697+
698+(HorizontalSplitter)
699+
700+do
701+
702+begin
703+
704+`    Parent:= VerticalSplitter.Sides[`
705+
706+0
707+
708+\]
709+
710+;
711+
712+`    Width:= Self.Width`
713+
714+;
715+
716+`    Height:= VerticalSplitter.Position`
717+
718+;
719+
720+`    align:= alClient`
721+
722+;
723+
724+`    SplitterType:= pstHorizontal`
725+
726+;
727+
728+`    Position:= `
729+
730+125
731+
732+;
733+
734+end
735+
736+;
737+
738+`  LeftPanel:= TPanel.Create(Self)`
739+
740+;
741+
742+with
743+
744+(LeftPanel)
745+
746+do
747+
748+begin
749+
750+`    Parent:= HorizontalSplitter.Sides[`
751+
752+0
753+
754+\]
755+
756+;
757+
758+`    Align:= alClient`
759+
760+;
761+
762+end
763+
764+;
765+
766+`  MainPanel:= TPanel.Create(Self)`
767+
768+;
769+
770+with
771+
772+(MainPanel)
773+
774+do
775+
776+begin
777+
778+`    Parent:= HorizontalSplitter.Sides[`
779+
780+1
781+
782+\]
783+
784+;
785+
786+`    Align:= alClient`
787+
788+;
789+
790+`    Caption:= `
791+
792+'Hello'
793+
794+;
795+
796+end
797+
798+;
799+
800+`  BottomPanel:= TPanel.Create(Self)`
801+
802+;
803+
804+with
805+
806+(BottomPanel)
807+
808+do
809+
810+begin
811+
812+`    Parent:= VerticalSplitter.Sides[`
813+
814+1
815+
816+\]
817+
818+;
819+
820+`    Align:= alClient`
821+
822+;
823+
824+end
825+
826+;
827+
828+end
829+
830+;
831+
949832So as you can see, farely consistant with most control hierarchy. And if you are familiar with DFM's, the changes needed for DFM-\>LFM conversion should be farely obvious from the above, as they are the same sort of changes in Parent/Owner etc.
950833
951834So the above example would be something like -
952835
953-<table>
954-<tbody>
955-<tr>
956-<td class="header"><p>Delphi DFM</p>
957-<div style="font-weight: normal">
958-<p>(extraneous values removed)</p>
959-</div></td>
960-<td class="header"><p>Lazarus LFM</p>
961-<div style="font-weight: normal">
962-<p>(most width, height, etc. removed)</p>
963-</div></td>
964-</tr>
965-<tr>
966-<td class="code"><div class="key">
967-<p>object</p>
968-</div>
969-<p>VerticalSplitter: TSplitter</p>
970-<p><code> Height </code></p>
971-<div class="symbol">
972-<p>=</p>
973-</div>
974-<div class="int">
975-<p>3</p>
976-</div>
977-<p><code> Cursor </code></p>
978-<div class="symbol">
979-<p>=</p>
980-</div>
981-<p>crVSplit</p>
982-<p><code> Align </code></p>
983-<div class="symbol">
984-<p>=</p>
985-</div>
986-<p>alBottom</p>
987-<div class="key">
988-<p>end</p>
989-</div>
990-<div class="key">
991-<p>object</p>
992-</div>
993-<p>HorizontalSplitter: TSplitter</p>
994-<p><code> Width </code></p>
995-<div class="symbol">
996-<p>=</p>
997-</div>
998-<div class="int">
999-<p>3</p>
1000-</div>
1001-<p><code> Align </code></p>
1002-<div class="symbol">
1003-<p>=</p>
1004-</div>
1005-<p>alLeft</p>
1006-<div class="key">
1007-<p>end</p>
1008-</div>
1009-<div class="key">
1010-<p>object</p>
1011-</div>
1012-<p>BottomPanel: TPanel</p>
1013-<p><code> Height </code></p>
1014-<div class="symbol">
1015-<p>=</p>
1016-</div>
1017-<div class="int">
1018-<p>75</p>
1019-</div>
1020-<p><code> Align </code></p>
1021-<div class="symbol">
1022-<p>=</p>
1023-</div>
1024-<p>alBottom</p>
1025-<div class="key">
1026-<p>end</p>
1027-</div>
1028-<div class="key">
1029-<p>object</p>
1030-</div>
1031-<p>LeftPanel: TPanel</p>
1032-<p><code> Width </code></p>
1033-<div class="symbol">
1034-<p>=</p>
1035-</div>
1036-<div class="int">
1037-<p>125</p>
1038-</div>
1039-<p><code> Align </code></p>
1040-<div class="symbol">
1041-<p>=</p>
1042-</div>
1043-<p>alLeft</p>
1044-<div class="key">
1045-<p>end</p>
1046-</div>
1047-<div class="key">
1048-<p>object</p>
1049-</div>
1050-<p>MainPanel: TPanel</p>
1051-<p><code> Align </code></p>
1052-<div class="symbol">
1053-<p>=</p>
1054-</div>
1055-<p>alClient</p>
1056-<div class="key">
1057-<p>end</p>
1058-</div></td>
1059-<td class="code"><div class="key">
1060-<p>object</p>
1061-</div>
1062-<p>VerticalSplitter: TPairSplitter</p>
1063-<p><code> Align </code></p>
1064-<div class="symbol">
1065-<p>=</p>
1066-</div>
1067-<p>alClient</p>
1068-<p><code> SplitterType </code></p>
1069-<div class="symbol">
1070-<p>=</p>
1071-</div>
1072-<p>pstVertical</p>
1073-<p><code> Position </code></p>
1074-<div class="symbol">
1075-<p>=</p>
1076-</div>
1077-<div class="int">
1078-<p>225</p>
1079-</div>
1080-<p><code> Height </code></p>
1081-<div class="symbol">
1082-<p>=</p>
1083-</div>
1084-<div class="int">
1085-<p>300</p>
1086-</div>
1087-<p><code> Width </code></p>
1088-<div class="symbol">
1089-<p>=</p>
1090-</div>
1091-<div class="int">
1092-<p>400</p>
1093-</div>
1094-<div class="key">
1095-<p>object</p>
1096-</div>
1097-<p>Pairsplitterside1: TPairSplitterIde</p>
1098-<div class="key">
1099-<p>object</p>
1100-</div>
1101-<p>HorizontalSplitter: TPairSplitter</p>
1102-<p><code>     Align </code></p>
1103-<div class="symbol">
1104-<p>=</p>
1105-</div>
1106-<p>alClient</p>
1107-<p><code>     Position </code></p>
1108-<div class="symbol">
1109-<p>=</p>
1110-</div>
1111-<div class="int">
1112-<p>125</p>
1113-</div>
1114-<div class="key">
1115-<p>object</p>
1116-</div>
1117-<p>Pairsplitterside3: TPairSplitterIde</p>
1118-<p><code>       Width </code></p>
1119-<div class="symbol">
1120-<p>=</p>
1121-</div>
1122-<div class="int">
1123-<p>125</p>
1124-</div>
1125-<div class="key">
1126-<p>object</p>
1127-</div>
1128-<p>LeftPanel: TPanel</p>
1129-<p><code>         Align </code></p>
1130-<div class="symbol">
1131-<p>=</p>
1132-</div>
1133-<p>alClient</p>
1134-<p><code>         Width </code></p>
1135-<div class="symbol">
1136-<p>=</p>
1137-</div>
1138-<div class="int">
1139-<p>125</p>
1140-</div>
1141-<div class="key">
1142-<p>end</p>
1143-</div>
1144-<div class="key">
1145-<p>end</p>
1146-</div>
1147-<div class="key">
1148-<p>object</p>
1149-</div>
1150-<p>Pairsplitterside4: TPairSplitterIde</p>
1151-<div class="key">
1152-<p>object</p>
1153-</div>
1154-<p>MainPanel: TPanel</p>
1155-<p><code>         Align </code></p>
1156-<div class="symbol">
1157-<p>=</p>
1158-</div>
1159-<p>alClient</p>
1160-<div class="key">
1161-<p>end</p>
1162-</div>
1163-<div class="key">
1164-<p>end</p>
1165-</div>
1166-<div class="key">
1167-<p>end</p>
1168-</div>
1169-<div class="key">
1170-<p>end</p>
1171-</div>
1172-<div class="key">
1173-<p>object</p>
1174-</div>
1175-<p>Pairsplitterside2: TPairSplitterIde</p>
1176-<div class="key">
1177-<p>object</p>
1178-</div>
1179-<p>BottomPanel: TPanel</p>
1180-<p><code>     Align </code></p>
1181-<div class="symbol">
1182-<p>=</p>
1183-</div>
1184-<p>alClient</p>
1185-<p><code>     Height </code></p>
1186-<div class="symbol">
1187-<p>=</p>
1188-</div>
1189-<div class="int">
1190-<p>75</p>
1191-</div>
1192-<div class="key">
1193-<p>end</p>
1194-</div>
1195-<div class="key">
1196-<p>end</p>
1197-</div>
1198-<div class="key">
1199-<p>end</p>
1200-</div></td>
1201-</tr>
1202-</tbody>
1203-</table>
836+Delphi DFM
837+
838+(extraneous values removed)
839+
840+Lazarus LFM
841+
842+(most width, height, etc. removed)
843+
844+object
845+
846+VerticalSplitter: TSplitter
847+
848+` Height `
849+
850+=
851+
852+3
853+
854+` Cursor `
855+
856+=
857+
858+crVSplit
859+
860+` Align `
861+
862+=
863+
864+alBottom
865+
866+end
867+
868+object
869+
870+HorizontalSplitter: TSplitter
871+
872+` Width `
873+
874+=
875+
876+3
877+
878+` Align `
879+
880+=
881+
882+alLeft
883+
884+end
885+
886+object
887+
888+BottomPanel: TPanel
889+
890+` Height `
891+
892+=
893+
894+75
895+
896+` Align `
897+
898+=
899+
900+alBottom
901+
902+end
903+
904+object
905+
906+LeftPanel: TPanel
907+
908+` Width `
909+
910+=
911+
912+125
913+
914+` Align `
915+
916+=
917+
918+alLeft
919+
920+end
921+
922+object
923+
924+MainPanel: TPanel
925+
926+` Align `
927+
928+=
929+
930+alClient
931+
932+end
933+
934+object
935+
936+VerticalSplitter: TPairSplitter
937+
938+` Align `
939+
940+=
941+
942+alClient
943+
944+` SplitterType `
945+
946+=
947+
948+pstVertical
949+
950+` Position `
951+
952+=
953+
954+225
955+
956+` Height `
957+
958+=
959+
960+300
961+
962+` Width `
963+
964+=
965+
966+400
967+
968+object
969+
970+Pairsplitterside1: TPairSplitterIde
971+
972+object
973+
974+HorizontalSplitter: TPairSplitter
975+
976+`     Align `
977+
978+=
979+
980+alClient
981+
982+`     Position `
983+
984+=
985+
986+125
987+
988+object
989+
990+Pairsplitterside3: TPairSplitterIde
991+
992+`       Width `
993+
994+=
995+
996+125
997+
998+object
999+
1000+LeftPanel: TPanel
1001+
1002+`         Align `
1003+
1004+=
1005+
1006+alClient
1007+
1008+`         Width `
1009+
1010+=
1011+
1012+125
1013+
1014+end
1015+
1016+end
1017+
1018+object
1019+
1020+Pairsplitterside4: TPairSplitterIde
1021+
1022+object
1023+
1024+MainPanel: TPanel
1025+
1026+`         Align `
1027+
1028+=
1029+
1030+alClient
1031+
1032+end
1033+
1034+end
1035+
1036+end
1037+
1038+end
1039+
1040+object
1041+
1042+Pairsplitterside2: TPairSplitterIde
1043+
1044+object
1045+
1046+BottomPanel: TPanel
1047+
1048+`     Align `
1049+
1050+=
1051+
1052+alClient
1053+
1054+`     Height `
1055+
1056+=
1057+
1058+75
1059+
1060+end
1061+
1062+end
1063+
1064+end
12041065
12051066### TCustomTreeView/TTreeView
12061067
12071068Ambas, VCL e LCL, fornecem um componente TCustomTreeView/TTreeView, usado ​​para lista estruturada de árvore de dados com múltiplos nós e seleção avançada e, listas de imagens, e enquanto características reais são comparáveis, nem todas as propriedades são inteiramente compatíveis. As principais diferenças são as seguintes -
12081069
12091070**Incomplete list, also update to include TCustomTreeView Mark functions and protected methods**
12101071
121110721. A LCL provê para o componente TCustomTreeView.Options, um conjunto de opções que podem ser ajustadas no controle para mudar seu comportamento e aparência. Estas opções são:
12121073 - tvoAllowMultiselect - enables multi node select mode, equivalent to enabling TCustomTreeView.MultiSelect in the D6 VCL
12131074 - tvoAutoExpand - Auto Expand nodes, equivalent to enabling TCustomTreeView.AutoExpand
12141075 - tvoAutoInsertMark - Update the Drag preview on mouse move.
12151076 - tvoAutoItemHeight - Adjust the item heights automatically.
12161077 - tvoHideSelection - Do not mark the selected item.
12171078 - tvoHotTrack - use Hot Tracking, equivalent to enabling TCustomTreeview.HotTrack
12181079 - tvoKeepCollapsedNodes - When shrinking/folding nodes, keep the child nodes
12191080 - tvoReadOnly - make Treeview read only, equivalent to enabling TCustomTreeview.ReadOnly
12201081 - tvoRightClickSelect - allow using Mouse Right Clicks to select nodes, equivalent to enabling TCustomTreeView.RightClickSelect
12211082 - tvoRowSelect - allow selecting rows, equivalent to enabling TCustomTreeView.RowSelect
12221083 - tvoShowButtons - show buttons, equivalent to enabling TCustomTreeView.ShowButtons
12231084 - tvoShowLines - show node lines, equivalent to enabling TCustomTreeView.ShowLines
12241085 - tvoShowRoot - show root note, equivalent to enabling TCustomTreeView.ShowRoot
12251086 - tvoShowSeparators - show seperators
12261087 - tvoToolTips - show tooltips for individual nodes
122710882. The LCL provides additional properties:
12281089 - TCustomTreeView.OnSelectionChange event
12291090 - TCustomTreeView.DefaultItems, for the default number of Items
12301091 - TCustomTreeView.ExpandSignType to determine sign used on expandable/collapsible nodes
123110923. While most On Drag/Dock Events are available in the LCL they do not work. For more information please see earlier section on Control Dragging/Docking.
12321093
12331094### Messages / Events
12341095
12351096The order and frequency of messages and events (OnShow, OnActivate, OnEnter, ...) differ from the VCL and depend on the widgetset. The LCL provides a subset of WinAPI like messages to make porting of Delphi components easier, but almost all LCL messages work a little bit different than the VCL/WinAPI counterpart. The biggest part of Delphi code using WinAPI messages uses them, because the VCL lacks a feature or for speed reasons. Such things will seldom work the same under the LCL, so they must be checked manually. That's why LCL messages are called for example LM_SIZE instead of WM_SIZE (unit lmessages).
12361097
12371098## Original Contributors and changes
12381099
12391100This page has been converted from the epikwiki [version](http://lazarus-ccr.sourceforge.net/index.php?wiki=LazarusForDelphiUsers).
12401101
12411102- Initial import and formatting - VlxAdmin 9/26/2003
12421103- Begin VCL -\> LCL with a section on TSplitter -\> TPairSplitter - [Andrew Johnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 9/30/2003
12431104- Add TControl.Font/TControl.ParentFont to VCL -\> LCL - [Andrew Johnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 9/30/2003
12441105- Update TEdit/TCustomEdit section in VCL -\> LCL - [Andrew Johnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 10/1/2003
12451106- Add Control Dragging/Docking to VCL -\> LCL - [Andrew Johnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 10/1/2003
12461107- Added "Object Inspector" to Delphi IDE -\> Lazarus IDE - [Andrew Johnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 10/1/2003
12471108- Added initial "TCustomTreeView/TTreeView" to VCL -\> LCL - [Andrew Johnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 10/1/2003
12481109- Added introduction to VCL -\> LCL - [Andrew Johnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 10/1/2003
12491110- Fixed some typos - Vincent 10/2/2003
12501111- Fixed Typo User:Kirkpatc 20 May 2004
12511112- Portuguese translation and small corrections - User: jrxds 12/01/2012
12521113
12531114## See Also
12541115
12551116[[Code Conversion Guide|Code Conversion Guide (from Delphi &amp; Kylix)]]
12561117
12571118[[Compile With Delphi]]
12581119
12591120---
12601121*From the Free Pascal wiki, page "Lazarus For Delphi Users/pt", as it stood on 2012-01-12 after a change by Jrxds, 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