Sign in Join
Wiki copytemporary

Lazarus For Delphi Users/pt: what changed

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

Title: Lazarus For Delphi Users/pt

OldNewLine
1+## Delphi -\> Lazarus
2+
3+Lazarus é 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.
4+
5+### As grandes diferenças
6+
7+Lazarus é 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.
8+
9+*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.*
10+
11+## Delphi IDE -\> Lazarus IDE
12+
13+### Projetos
14+
15+O 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 .
16+
17+Por exemplo:
18+
19+Delphi 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.
20+
21+Uma 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.
22+
23+### Editor de Código
24+
25+Aproximadamente todas as teclas e atalhos podem ser definidos em environment-\>editor options-\>key mappings
26+
27+A 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:
28+
29+O 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".
30+
31+Delphi 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.
32+
33+#### Exemplo para Completar Variável Local
34+
35+Assuma que você tenha criado um novo método e escrito o seguinte "i:=3;"
36+
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>
59+
60+Posicionando o cursor sobre o identificador "i" e precionando Ctrl+Shift+C pegará:
61+
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>
88+
89+#### Exemplo para Completar Associação de Evento
90+
91+Um ótimo recurso do Object Inspector é automaticamente criar métodos. O mesmo você pode pegar no editor de fonte.\
92+Por Exemplo:
93+
94+
95+Button1.OnClick:=
96+
97+Posicione o cursor atrás do operador de atribuição ":=" e precione Ctrl+Shift+C.
98+
99+#### "Completar Palavras" Ctrl+W
100+
101+Este 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.
102+
103+#### Suporte a Inclusão de Arquivos
104+
105+Delphi 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.
106+
107+Por exemplo: método pulando, Completar Classe, encontrar declaração, ... todos trabalham com arquivos incluídos.
108+
109+Há muitas opções para as características do código.
110+
111+### Designer
112+
113+\- Guidelines
114+
115+#### Inspetor de Objetos
116+
117+Nos 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:
118+
119+1. 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"
120+2. 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
121+3. 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)".
122+4. 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
123+
124+#### Pacotes
125+
126+O Lazarus pode instalar e usar pacotes do Delphi ?
127+
128+Não, porque eles requerem a magia do compilador Delphi.
129+
130+Nós necessitamos que sejam feitos especialmente para Lazarus?
131+
132+Sim. 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:
133+
134+\- docs/Packages.txt nos fontes do lazarus.
135+
136+### VCL -\> LCL
137+
138+Mesmo 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]] .
139+
140+Adicionalmente 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.
141+
142+O 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.
143+
144+#### TControl.Font/TControl.ParentFont
145+
146+Na 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.
147+
148+Isto 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.
149+
150+Isto 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.
151+
152+#### Control Dragging/Docking
153+
154+Na 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.
155+
156+Esta 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.
157+
158+Isto atualmente significa que nenhum controle vai herdar ou usar as seguintes funções, procedimentos, propriedades ou eventos:
159+
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>
362+
363+que as seguintes classes não existem ou não são utilizáveis:
364+
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>
405+
406+e que as seguintes funções são inutilizáveis ou incompatíveis:
407+
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>
433+
434+#### TEdit/TCustomEdit
435+
436+Os controles Edit, ainda que funcionem essencialmente do mesmo modo na LCL como na VCL, não tem alguns itens que facilitariam a conversão
437+
438+1. 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.
439+2. Os eventos OnDrag e OnDock não estão implementados ainda. Para mais informações veja a seção anterior Control Dragging/Docking.
440+3. Propriedades de fonte são ignorada por consitência com interface, para uma explanação detalhada veja TControl.Font/TControl.ParentFont
441+
442+### (optional) TSplitter -\> TPairSplitter
443+
444+**Please Improve Me**
445+
446+Existe agora um controle TSplitter na LCL, não é mais necessário convertê-lo.
447+
448+No entanto, se você o quiser, ele está explicado aqui:
449+
450+O 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):
451+
452+Na 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.
453+
454+A 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.
455+
456+Então o que são exatamente essas diferenças?
457+
458+Well 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.
459+
460+On 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.
461+
462+The 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,
463+
464+In 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.
465+
466+For 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 :
467+
468+`PairSplitter.Position := PairSplitter.Width - PairSplitter.Position; `
469+
470+Então como posso converter um código existente usando TSplitter para TPairSplitter?
471+
472+If 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 -
473+
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>
948+
949+So 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.
950+
951+So the above example would be something like -
952+
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>
1204+
1205+### TCustomTreeView/TTreeView
1206+
1207+Ambas, 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 -
1208+
1209+**Incomplete list, also update to include TCustomTreeView Mark functions and protected methods**
1210+
1211+1. 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:
1212+ - tvoAllowMultiselect - enables multi node select mode, equivalent to enabling TCustomTreeView.MultiSelect in the D6 VCL
1213+ - tvoAutoExpand - Auto Expand nodes, equivalent to enabling TCustomTreeView.AutoExpand
1214+ - tvoAutoInsertMark - Update the Drag preview on mouse move.
1215+ - tvoAutoItemHeight - Adjust the item heights automatically.
1216+ - tvoHideSelection - Do not mark the selected item.
1217+ - tvoHotTrack - use Hot Tracking, equivalent to enabling TCustomTreeview.HotTrack
1218+ - tvoKeepCollapsedNodes - When shrinking/folding nodes, keep the child nodes
1219+ - tvoReadOnly - make Treeview read only, equivalent to enabling TCustomTreeview.ReadOnly
1220+ - tvoRightClickSelect - allow using Mouse Right Clicks to select nodes, equivalent to enabling TCustomTreeView.RightClickSelect
1221+ - tvoRowSelect - allow selecting rows, equivalent to enabling TCustomTreeView.RowSelect
1222+ - tvoShowButtons - show buttons, equivalent to enabling TCustomTreeView.ShowButtons
1223+ - tvoShowLines - show node lines, equivalent to enabling TCustomTreeView.ShowLines
1224+ - tvoShowRoot - show root note, equivalent to enabling TCustomTreeView.ShowRoot
1225+ - tvoShowSeparators - show seperators
1226+ - tvoToolTips - show tooltips for individual nodes
1227+2. The LCL provides additional properties:
1228+ - TCustomTreeView.OnSelectionChange event
1229+ - TCustomTreeView.DefaultItems, for the default number of Items
1230+ - TCustomTreeView.ExpandSignType to determine sign used on expandable/collapsible nodes
1231+3. 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.
1232+
1233+### Messages / Events
1234+
1235+The 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).
1236+
1237+## Original Contributors and changes
1238+
1239+This page has been converted from the epikwiki [version](http://lazarus-ccr.sourceforge.net/index.php?wiki=LazarusForDelphiUsers).
1240+
1241+- Initial import and formatting - VlxAdmin 9/26/2003
1242+- Begin VCL -\> LCL with a section on TSplitter -\> TPairSplitter - [Andrew Johnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 9/30/2003
1243+- Add TControl.Font/TControl.ParentFont to VCL -\> LCL - [Andrew Johnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 9/30/2003
1244+- Update TEdit/TCustomEdit section in VCL -\> LCL - [Andrew Johnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 10/1/2003
1245+- Add Control Dragging/Docking to VCL -\> LCL - [Andrew Johnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 10/1/2003
1246+- Added "Object Inspector" to Delphi IDE -\> Lazarus IDE - [Andrew Johnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 10/1/2003
1247+- Added initial "TCustomTreeView/TTreeView" to VCL -\> LCL - [Andrew Johnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 10/1/2003
1248+- Added introduction to VCL -\> LCL - [Andrew Johnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 10/1/2003
1249+- Fixed some typos - Vincent 10/2/2003
1250+- Fixed Typo User:Kirkpatc 20 May 2004
1251+- Portuguese translation and small corrections - User: jrxds 12/01/2012
1252+
1253+## See Also
1254+
1255+[[Code Conversion Guide|Code Conversion Guide (from Delphi &amp; Kylix)]]
1256+
1257+[[Compile With Delphi]]
1258+
1259+---
1260+*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