Sign in Join
Wiki copytemporary

Lazarus For Delphi Users/pt: what changed

Revision 2 to 3. 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
3737procedure
3838
3939TForm1.DoSomething;
4040
4141begin
4242
4343` i:= `
4444
45453
4646
4747;
4848
4949end
5050
5151;
5252
5353Posicionando o cursor sobre o identificador "i" e precionando Ctrl+Shift+C pegará:
5454
5555procedure
5656
5757TForm1.DoSomething;
5858
5959var
6060
6161i: Integer;
6262
6363begin
6464
6565` i:= `
6666
67673
6868
6969;
7070
7171end
7272
7373;
7474
7575#### Exemplo para Completar Associação de Evento
7676
7777Um ótimo recurso do Object Inspector é automaticamente criar métodos. O mesmo você pode pegar no editor de fonte.\
7878Por Exemplo:
7979
8080
8181Button1.OnClick:=
8282
8383Posicione o cursor atrás do operador de atribuição ":=" e precione Ctrl+Shift+C.
8484
8585#### "Completar Palavras" Ctrl+W
8686
8787Este 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.
8888
8989#### Suporte a Inclusão de Arquivos
9090
9191Delphi 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.
9292
9393Por exemplo: método pulando, Completar Classe, encontrar declaração, ... todos trabalham com arquivos incluídos.
9494
9595Há muitas opções para as características do código.
9696
9797### Designer
9898
9999\- Guidelines
100100
101101#### Inspetor de Objetos
102102
103103Nos 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:
104104
1051051. 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"
1061062. 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
1071073. 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)".
1081084. 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
109109
110110#### Pacotes
111111
112112O Lazarus pode instalar e usar pacotes do Delphi ?
113113
114114Não, porque eles requerem a magia do compilador Delphi.
115115
116116Nós necessitamos que sejam feitos especialmente para Lazarus?
117117
118118Sim. 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:
119119
120120\- docs/Packages.txt nos fontes do lazarus.
121121
122122### VCL -\> LCL
123123
124124Mesmo 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]] .
125125
126126Adicionalmente 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.
127127
128128O 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.
129129
130130#### TControl.Font/TControl.ParentFont
131131
132132Na 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.
133133
134134Isto 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.
135135
136136Isto 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.
137137
138138#### Control Dragging/Docking
139139
140140Na 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.
141141
142142Esta 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.
143143
144144Isto atualmente significa que nenhum controle vai herdar ou usar as seguintes funções, procedimentos, propriedades ou eventos:
145145
146146Protected
147147
148148function
149149
150150GetDockEdge(MousePos: TPoint): TAlign;
151151
152152function
153153
154154GetDragImages: TDragImageList;
155155
156156function
157157
158158GetFloating: Boolean;
159159
160160function
161161
162162GetFloatingDockSiteClass: TWinControlClass;
163163
164164procedure
165165
166166DoEndDrag(Target:TObject); X, Y: Integer);
167167
168168procedure
169169
170170DockTrackNoTarget(Source: TDragDockObject; X, Y: Integer);
171171
172172procedure
173173
174174DoEndDock(Target: TObject; X, Y: Integer);
175175
176176procedure
177177
178178DoDock(NewDockSite: TWinControl;
179179
180180var
181181
182182ARect: TRect);
183183
184184procedure
185185
186186DoStartDock(
187187
188188var
189189
190190DragObject: TDragObject);
191191
192192procedure
193193
194194DragCanceled;
195195
196196procedure
197197
198198DragOver(Source: TObject; X, Y: Integer; State: TDragState;
199199
200200var
201201
202202Accept: Boolean);
203203
204204procedure
205205
206206DoEndDrag(Target: TObject; X, Y: Integer);
207207
208208procedure
209209
210210DoStartDrag(
211211
212212var
213213
214214DragObject: TDragObject);
215215
216216procedure
217217
218218DrawDragDockImage(DragDockObject: TDragDockObject);
219219
220220procedure
221221
222222EraseDragDockImage(DragDockObject: TDragDockObject);
223223
224224procedure
225225
226226PositionDockRect(DragDockObject: TDragDockObject);
227227
228228procedure
229229
230230SetDragMode(Value: TDragMode);
231231
232232property
233233
234234DragKind: TDragKind;
235235
236236property
237237
238238DragCursor: TCursor;
239239
240240property
241241
242242DragMode: TDragMode;
243243
244244property
245245
246246OnDragDrop: TDragDropEvent;
247247
248248property
249249
250250OnDragOver: TDragOverEvent;
251251
252252property
253253
254254OnEndDock: TEndDragEvent;
255255
256256property
257257
258258OnEndDrag: TEndDragEvent;
259259
260260property
261261
262262OnStartDock: TStartDockEvent;
263263
264264property
265265
266266OnStartDrag: TStartDragEvent;
267267
268268public
269269
270270function
271271
272272Dragging: Boolean;
273273
274274function
275275
276276ManualDock(NewDockSite: TWinControl; DropControl: TControl;
277277
278278ControlSide: TAlign): Boolean;
279279
280280function
281281
282282ManualFloat(ScreenPos: TRect): Boolean;
283283
284284function
285285
286286ReplaceDockedControl(Control: TControl; NewDockSite: TWinControl;
287287
288288DropControl: TControl; ControlSide: TAlign): Boolean;
289289
290290procedure
291291
292292BeginDrag(Immediate: Boolean; Threshold: Integer);
293293
294294procedure
295295
296296Dock(NewDockSite: TWinControl; ARect: TRect);
297297
298298procedure
299299
300300DragDrop(Source: TObject; X, Y: Integer);
301301
302302procedure
303303
304304EndDrag(Drop: Boolean);
305305
306306property
307307
308308DockOrientation: TDockOrientation;
309309
310310property
311311
312312Floating: Boolean;
313313
314314property
315315
316316FloatingDockSiteClass: TWinControlClass;
317317
318318property
319319
320320HostDockSite: TWinControl;
321321
322322property
323323
324324LRDockWidth: Integer;
325325
326326property
327327
328328TBDockHeight: Integer;
329329
330330property
331331
332332UndockHeight: Integer;
333333
334334property
335335
336336UndockWidth: Integer;
337337
338338que as seguintes classes não existem ou não são utilizáveis:
339339
340340TDragImageList =
341341
342342class
343343
344344(TCustomImageList)
345345
346346`TDockZone = `
347347
348348class
349349
350350`TDockTree = `
351351
352352class
353353
354354(TInterfacedObject, IDockManager)
355355
356356`TDragObject = `
357357
358358class
359359
360360(TObject)
361361
362362`TBaseDragControlObject = `
363363
364364class
365365
366366(TDragObject)
367367
368368`TDragControlObject = `
369369
370370class
371371
372372(TBaseDragControlObject)
373373
374374`TDragDockObject = `
375375
376376class
377377
378378(TBaseDragControlObject)
379379
380380e que as seguintes funções são inutilizáveis ou incompatíveis:
381381
382382function
383383
384384FindDragTarget(
385385
386386const
387387
388388Pos: TPoint;
389389
390390AllowDisabled: Boolean) : TControl;
391391
392392procedure
393393
394394CancelDrag;
395395
396396function
397397
398398IsDragObject(sender: TObject): Boolean;
399399
400400#### TEdit/TCustomEdit
401401
402402Os controles Edit, ainda que funcionem essencialmente do mesmo modo na LCL como na VCL, não tem alguns itens que facilitariam a conversão
403403
4044041. 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.
4054052. Os eventos OnDrag e OnDock não estão implementados ainda. Para mais informações veja a seção anterior Control Dragging/Docking.
4064063. Propriedades de fonte são ignorada por consitência com interface, para uma explanação detalhada veja TControl.Font/TControl.ParentFont
407407
408408### (optional) TSplitter -\> TPairSplitter
409409
410410**Please Improve Me**
411411
412412Existe agora um controle TSplitter na LCL, não é mais necessário convertê-lo.
413413
414414No entanto, se você o quiser, ele está explicado aqui:
415415
416416O 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):
417417
418418Na 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.
419419
420420A 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.
421421
422422Então o que são exatamente essas diferenças?
423423
424424Well 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.
425425
426426On 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.
427427
428428The 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,
429429
430430In 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.
431431
432432For 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 :
433433
434-`PairSplitter.Position := PairSplitter.Width - PairSplitter.Position; `
434+``` pascal
435+PairSplitter.Position := PairSplitter.Width - PairSplitter.Position;
436+```
435437
436438Então como posso converter um código existente usando TSplitter para TPairSplitter?
437439
438440If 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 -
439441
440442VCL
441443
442444LCL
443445
444446var
445447
446448`  BottomPanel: TPanel`
447449
448450;
449451
450452`  VerticalSplitter: TSplitter`
451453
452454;
453455
454456`  LeftPanel: TPanel`
455457
456458;
457459
458460`  HorizontalSplitter: TSplitter`
459461
460462;
461463
462464`  MainPanel: TPanel`
463465
464466;
465467
466468begin
467469
468470`  BottomPanel:= TPanel.Create(Self)`
469471
470472;
471473
472474with
473475
474476(BottomPanel)
475477
476478do
477479
478480begin
479481
480482`    Parent:= Self`
481483
482484;
483485
484486`    Height:= `
485487
48648875
487489
488490;
489491
490492`    Align:= alBottom`
491493
492494;
493495
494496end
495497
496498;
497499
498500`  VerticalSplitter:= TSplitter.Create(Self)`
499501
500502;
501503
502504with
503505
504506(VerticalSplitter)
505507
506508do
507509
508510begin
509511
510512`    Parent:= Self`
511513
512514;
513515
514516`    Align:= alBottom`
515517
516518;
517519
518520end
519521
520522;
521523
522524`  HorizontalSplitter:= TSplitter.Create(Self)`
523525
524526;
525527
526528with
527529
528530(HorizontalSplitter)
529531
530532do
531533
532534begin
533535
534536`    Parent:= Self`
535537
536538;
537539
538540`    align:= alLeft`
539541
540542;
541543
542544end
543545
544546;
545547
546548`  LeftPanel:= TPanel.Create(Self)`
547549
548550;
549551
550552with
551553
552554(LeftPanel)
553555
554556do
555557
556558begin
557559
558560`    Parent:= Self`
559561
560562;
561563
562564`    Width:= `
563565
564566125
565567
566568;
567569
568570`    Align:= alLeft`
569571
570572;
571573
572574end
573575
574576;
575577
576578`  MainPanel:= TPanel.Create(Self)`
577579
578580;
579581
580582with
581583
582584(MainPanel)
583585
584586do
585587
586588begin
587589
588590`    Parent:= Self`
589591
590592;
591593
592594`    Align:= alClient`
593595
594596;
595597
596598`    Caption:= `
597599
598600'Hello'
599601
600602;
601603
602604end
603605
604606;
605607
606608end
607609
608610;
609611
610612var
611613
612614`  BottomPanel: TPanel`
613615
614616;
615617
616618`  VerticalSplitter: TPairSplitter`
617619
618620;
619621
620622`  LeftPanel: TPanel`
621623
622624;
623625
624626`  HorizontalSplitter: TPairSplitter`
625627
626628;
627629
628630`  MainPanel: TPanel`
629631
630632;
631633
632634begin
633635
634636`  VerticalSplitter:= TPairSplitter.Create(Self)`
635637
636638;
637639
638640with
639641
640642(VerticalSplitter)
641643
642644do
643645
644646begin
645647
646648`    Parent:= Self`
647649
648650;
649651
650652`    Align:= alClient`
651653
652654;
653655
654656`    Width:= Self.Width`
655657
656658;
657659
658660`    Height:= Self.Height`
659661
660662;
661663
662664`    SplitterType:= pstVertical`
663665
664666;
665667
666668`    Position:= Height - `
667669
66867075
669671
670672;
671673
672674`    Sides[`
673675
6746760
675677
676678\].Width:= Width
677679
678680;
679681
680682`    Sides[`
681683
6826840
683685
684686\].Height:= Position
685687
686688;
687689
688690end
689691
690692;
691693
692694`  HorizontalSplitter:= TPairSplitter.Create(Self)`
693695
694696;
695697
696698with
697699
698700(HorizontalSplitter)
699701
700702do
701703
702704begin
703705
704706`    Parent:= VerticalSplitter.Sides[`
705707
7067080
707709
708710\]
709711
710712;
711713
712714`    Width:= Self.Width`
713715
714716;
715717
716718`    Height:= VerticalSplitter.Position`
717719
718720;
719721
720722`    align:= alClient`
721723
722724;
723725
724726`    SplitterType:= pstHorizontal`
725727
726728;
727729
728730`    Position:= `
729731
730732125
731733
732734;
733735
734736end
735737
736738;
737739
738740`  LeftPanel:= TPanel.Create(Self)`
739741
740742;
741743
742744with
743745
744746(LeftPanel)
745747
746748do
747749
748750begin
749751
750752`    Parent:= HorizontalSplitter.Sides[`
751753
7527540
753755
754756\]
755757
756758;
757759
758760`    Align:= alClient`
759761
760762;
761763
762764end
763765
764766;
765767
766768`  MainPanel:= TPanel.Create(Self)`
767769
768770;
769771
770772with
771773
772774(MainPanel)
773775
774776do
775777
776778begin
777779
778780`    Parent:= HorizontalSplitter.Sides[`
779781
7807821
781783
782784\]
783785
784786;
785787
786788`    Align:= alClient`
787789
788790;
789791
790792`    Caption:= `
791793
792794'Hello'
793795
794796;
795797
796798end
797799
798800;
799801
800802`  BottomPanel:= TPanel.Create(Self)`
801803
802804;
803805
804806with
805807
806808(BottomPanel)
807809
808810do
809811
810812begin
811813
812814`    Parent:= VerticalSplitter.Sides[`
813815
8148161
815817
816818\]
817819
818820;
819821
820822`    Align:= alClient`
821823
822824;
823825
824826end
825827
826828;
827829
828830end
829831
830832;
831833
832834So 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.
833835
834836So the above example would be something like -
835837
836838Delphi DFM
837839
838840(extraneous values removed)
839841
840842Lazarus LFM
841843
842844(most width, height, etc. removed)
843845
844846object
845847
846848VerticalSplitter: TSplitter
847849
848850` Height `
849851
850852=
851853
8528543
853855
854856` Cursor `
855857
856858=
857859
858860crVSplit
859861
860862` Align `
861863
862864=
863865
864866alBottom
865867
866868end
867869
868870object
869871
870872HorizontalSplitter: TSplitter
871873
872874` Width `
873875
874876=
875877
8768783
877879
878880` Align `
879881
880882=
881883
882884alLeft
883885
884886end
885887
886888object
887889
888890BottomPanel: TPanel
889891
890892` Height `
891893
892894=
893895
89489675
895897
896898` Align `
897899
898900=
899901
900902alBottom
901903
902904end
903905
904906object
905907
906908LeftPanel: TPanel
907909
908910` Width `
909911
910912=
911913
912914125
913915
914916` Align `
915917
916918=
917919
918920alLeft
919921
920922end
921923
922924object
923925
924926MainPanel: TPanel
925927
926928` Align `
927929
928930=
929931
930932alClient
931933
932934end
933935
934936object
935937
936938VerticalSplitter: TPairSplitter
937939
938940` Align `
939941
940942=
941943
942944alClient
943945
944946` SplitterType `
945947
946948=
947949
948950pstVertical
949951
950952` Position `
951953
952954=
953955
954956225
955957
956958` Height `
957959
958960=
959961
960962300
961963
962964` Width `
963965
964966=
965967
966968400
967969
968970object
969971
970972Pairsplitterside1: TPairSplitterIde
971973
972974object
973975
974976HorizontalSplitter: TPairSplitter
975977
976978`     Align `
977979
978980=
979981
980982alClient
981983
982984`     Position `
983985
984986=
985987
986988125
987989
988990object
989991
990992Pairsplitterside3: TPairSplitterIde
991993
992994`       Width `
993995
994996=
995997
996998125
997999
9981000object
9991001
10001002LeftPanel: TPanel
10011003
10021004`         Align `
10031005
10041006=
10051007
10061008alClient
10071009
10081010`         Width `
10091011
10101012=
10111013
10121014125
10131015
10141016end
10151017
10161018end
10171019
10181020object
10191021
10201022Pairsplitterside4: TPairSplitterIde
10211023
10221024object
10231025
10241026MainPanel: TPanel
10251027
10261028`         Align `
10271029
10281030=
10291031
10301032alClient
10311033
10321034end
10331035
10341036end
10351037
10361038end
10371039
10381040end
10391041
10401042object
10411043
10421044Pairsplitterside2: TPairSplitterIde
10431045
10441046object
10451047
10461048BottomPanel: TPanel
10471049
10481050`     Align `
10491051
10501052=
10511053
10521054alClient
10531055
10541056`     Height `
10551057
10561058=
10571059
1058106075
10591061
10601062end
10611063
10621064end
10631065
10641066end
10651067
10661068### TCustomTreeView/TTreeView
10671069
10681070Ambas, 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 -
10691071
10701072**Incomplete list, also update to include TCustomTreeView Mark functions and protected methods**
10711073
107210741. 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:
10731075 - tvoAllowMultiselect - enables multi node select mode, equivalent to enabling TCustomTreeView.MultiSelect in the D6 VCL
10741076 - tvoAutoExpand - Auto Expand nodes, equivalent to enabling TCustomTreeView.AutoExpand
10751077 - tvoAutoInsertMark - Update the Drag preview on mouse move.
10761078 - tvoAutoItemHeight - Adjust the item heights automatically.
10771079 - tvoHideSelection - Do not mark the selected item.
10781080 - tvoHotTrack - use Hot Tracking, equivalent to enabling TCustomTreeview.HotTrack
10791081 - tvoKeepCollapsedNodes - When shrinking/folding nodes, keep the child nodes
10801082 - tvoReadOnly - make Treeview read only, equivalent to enabling TCustomTreeview.ReadOnly
10811083 - tvoRightClickSelect - allow using Mouse Right Clicks to select nodes, equivalent to enabling TCustomTreeView.RightClickSelect
10821084 - tvoRowSelect - allow selecting rows, equivalent to enabling TCustomTreeView.RowSelect
10831085 - tvoShowButtons - show buttons, equivalent to enabling TCustomTreeView.ShowButtons
10841086 - tvoShowLines - show node lines, equivalent to enabling TCustomTreeView.ShowLines
10851087 - tvoShowRoot - show root note, equivalent to enabling TCustomTreeView.ShowRoot
10861088 - tvoShowSeparators - show seperators
10871089 - tvoToolTips - show tooltips for individual nodes
108810902. The LCL provides additional properties:
10891091 - TCustomTreeView.OnSelectionChange event
10901092 - TCustomTreeView.DefaultItems, for the default number of Items
10911093 - TCustomTreeView.ExpandSignType to determine sign used on expandable/collapsible nodes
109210943. 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.
10931095
10941096### Messages / Events
10951097
10961098The 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).
10971099
10981100## Original Contributors and changes
10991101
11001102This page has been converted from the epikwiki [version](http://lazarus-ccr.sourceforge.net/index.php?wiki=LazarusForDelphiUsers).
11011103
11021104- Initial import and formatting - VlxAdmin 9/26/2003
11031105- Begin VCL -\> LCL with a section on TSplitter -\> TPairSplitter - [Andrew Johnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 9/30/2003
11041106- Add TControl.Font/TControl.ParentFont to VCL -\> LCL - [Andrew Johnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 9/30/2003
11051107- Update TEdit/TCustomEdit section in VCL -\> LCL - [Andrew Johnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 10/1/2003
11061108- Add Control Dragging/Docking to VCL -\> LCL - [Andrew Johnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 10/1/2003
11071109- Added "Object Inspector" to Delphi IDE -\> Lazarus IDE - [Andrew Johnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 10/1/2003
11081110- Added initial "TCustomTreeView/TTreeView" to VCL -\> LCL - [Andrew Johnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 10/1/2003
11091111- Added introduction to VCL -\> LCL - [Andrew Johnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 10/1/2003
11101112- Fixed some typos - Vincent 10/2/2003
11111113- Fixed Typo User:Kirkpatc 20 May 2004
11121114- Portuguese translation and small corrections - User: jrxds 12/01/2012
11131115
11141116## See Also
11151117
11161118[[Code Conversion Guide|Code Conversion Guide (from Delphi & Kylix)]]
11171119
11181120[[Compile With Delphi]]
11191121
11201122---
11211123*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