Sign in Join
Wiki copytemporary

Code Conversion Guide/pt: what changed

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

OldNewLine
11Guia de conversão do Delphi para o Lazarus
22
33## Sobre
44
55Esta página é sobre como converter um código para poder usá-lo no compilador [[Free Pascal]] e a IDE do Lazarus. O Lazarus e o Free Pascal tem aspectos em comum com o Delphi e Kylix, porém, não são clones. Há várias diferenças nos códigos e convenções... e em algumas áreas, o FPC pode exigir uma sintaxe mais correta. Por favor veja o guia [[Lazarus For Delphi Users]] para uma descrição de algumas das diferenças funcionais.
66
77O propósito deste guia é documentar algumas das diferenças específicas que freqüentemente são encontradas durante o processo de conversão de código ao traduzir código existente de Delphi para Lazarus.
88
99Este documento foi colocado na área de conhecimento-base de wiki para que assim pudesse ser ampliado facilmente por qualquer um que tenha encontrado um problema e gostaria de postar isto para outros estarem atentos
1010
1111## Selecionando um componente ou biblioteca para conversão
1212
1313### Onde achar conteúdo para converter
1414
1515Há MUITOS códigos possíveis na internet de serem convertidos para serem usados com o FPC e o Lazarus. Aqui tem uma [[Page Of Code Sites]] por onde você pode começar. Por favor adicione outro link se encontrar algum outro local. TurboPower Software recentemente seus produtos comerciais sob a MPL. Uma lista de packages disponíveis pode ser encontrado [aqui](http://sourceforge.net/users/tpsfadmin/).
1616
1717Para evitar retrabalho, packages que foram convertidas estão listadas em [[Components and Code examples]] Se você converteu uma package ou está convertendo, por favor adicione uma nota na página [[Current conversion projects]]
1818
1919### Licenciamento
2020
2121Licenças para a faixa de domínio de código existente freeware/domínio público para versões restritivas que proíbem a modificação, re-distribuição e uso comercial. Antes de converter qualquer pacote, é uma boa idéia analisar seu licenciamento e ter a certeza que ele vai ser compatível com o Lazarus e o compilador Free Pascal. Verificação de licença é especialmente importante com componentes, de vez que ao incorporar um a um formulário, isso pode impor a necessidade de obter uma licença, o que pode ser indesejável ​​ou incompatível para o aplicativo inteiro.
2222
2323Ao converter componentes, por favor, respeite os desejos do autor original e mantenha todos os direitos autorais e cabeçalhos de licenciamento junto com endereços de e-mail e url's. É cortês e, muitas vezes útil para informar o autor que a sua componente está sendo (ou foi) convertida... especialmente se o componente está sob uma licença restritiva. Novo interesse em um antigo ou esquecido componente, pode às vezes inspirar autores a revisar seus originais e excessivo licenciamento restritivo.
2424
2525Em geral, Domínio Público (freeware), e o LGPL/MPL são as formas de licenciamento mais flexível para a distribuição de componentes. Para mais informações, o site [Open Source Definition](http://www.opensource.org/docs/definition.php) é um bom lugar para iniciar. Há também diversas comparações disponíveis para ajudar a esclarecer como os vários tipos de licenças de trabalho e qual o impacto que terá sobre o código que está sendo vinculado. Procure por "open source license comparison"
2626
2727### Dependências
2828
2929Outro passo antes de começar a trabalhar em uma conversão é verificar se o código não tem dependências profundas de outros pacotes que podem não estar disponíveis ou representam um desafio considerável de conversão. Algumas ofertas de freeware obrigam ou se estendem a pacotes proprietários que freqüentemente não estão disponíveis ou vêm com licenças inadequadas.
3030
3131### Questões de Compilador
3232
3333Atualmente a versão estável 1.0.x do compilador Free Pascal não suporta interfaces, threads ou registros Variant. Se o código que você está convertendo necessita desses construtores, você terá que usar o ramo de desenvolvimento 1.1 do compilador ... que não é sempre garantido para trabalhar com Lazarus.
3434
3535Veja também:
3636
3737- [Problemas conhecidos](http://www.freepascal.org/probs.html)
3838- [Unfixed bugs](http://www.freepascal.org/bugs/db.php3?statusfield=Unfixed)
3939
4040### SO e problemas de plataforma
4141
4242Lazarus e o compilador Free Pascal são cross-platform e ferramentas de desenvolvimento para serem usadas também em vários sistemas operacionais. Em contraste, a maioria dos códigos escritos em Delphi são especificamente escritos para rodar em um processador Intel sob Win32. Se o seu canditado a componente possui muito código específico da plataforma Win32, seria sábio procurar uma alternativa independente da plataforma. Mas não desista... é verdadeiramente incrível o suporte LCL.
4343
4444## Fazendo a conversão
4545
4646### Montando o ambiente de Lazarus para um projeto de conversão
4747
4848#### Crie um projeto teste
4949
5050- Coloque o código a ser convertido em um subdiretório (ex: c:\convertdir)
5151- Abra-o com o Lazarus
5252- File-\>Save All para o subdiretório c:\convertdir. Os nomes para o Projeto e a Unit Default são opcionais.
5353- Abra em c:\convertdir a unit "main" para ser convertida * Adicione-a ao projeto: Project-\>Add Active Unit to Project
5454- Clique em Tools-\>Quick Syntax Check ou em Run-\>Build All para começar.
5555
5656#### Termos iniciais para se cuidar
5757
5858- Nomes de arquivos são sensíveis ao letras maiúsculas e minúsculas nos compiladores da série 1.0.x Se você estiver trabalhando com uma versão como essa, faça com que todos os seus arquivos sejam escritos em minúsculas, pois do contrário, você terá como frase de erro "File not found" - arquivo não encontrado.
5959
6060#### Fontes Delphi VCL, Kylix CLX no Lazarus
6161
6262Ao converter fontes de Delphi/Kylix, é freqüentemente útil fazer uma declaração sobre o que uma função específica está fazendo. A IDE Lazarus pode analisar as fontes de Delphi/Kylix. Para isto, é necessário indicar o local dos arquivos para o compilador. Pode-se conseguir isso através do menu Environment-\>CodeTools Defines Editor-\>Insert Template
6363
6464### Problemas de conversão e soluções
6565
6666#### Arquivos Delphi / Kylix equivalentes no Lazarus
6767
6868| | | |
6969|----|----|----|
7070| Delphi / Kylix | Lazarus | Descrição |
7171| .pas .dfm / .xfm .dcu / .dpu .dpr .res .dof / .kof --- --- --- | .pas, .pp .lfm .o .lpr --- --- .lrs .lpi .ppu | Arquivo unit de Pascal Arquivos de dados do form Arquivo da unit compilada Arquivo do Projeto Arquivo de recursos Arquivo de opções do projeto Arquivo de recursos do Lazarus Arquivo de informações do projeto Arquivo de descrição de unit FPC |
7272
7373#### Contentendo projetos/forms/units Delphi para Lazarus
7474
7575Renomeie ou copie o arquivo .dpr para um arquivo .lpr. Comente ou remova a diretiva
7676
7777{\$R *.res}
7878
7979e adicione
8080
8181{\$mode delphi}{\$H+}
8282
8383ou
8484
8585{\$mode objfpc}{\$H+}
8686
8787no arquivo .lpr. A IDE do Lazarus pode através do menu Tools no item "Convert Delphi Project to Lazarus Project". Ele solicita um arquivo .dpr (Delphi Project) e o converte para um .lpr; mais tarde, também cria um .lpi.
8888
8989Existe várias maneiras de converter forms do Delphi através da IDE do Lazarus que realiza o trabalho da conversão do .dfm para o .lfm. Isso pode ser encontrado como item do menu Tools com o sob o nome "Convert DFM file to LFM". Clique nele, e na caixa de dialogo escolha seu arquivo .dmf e o conversor fará o resto.
9090
9191Se você precisa converter a unit inteira (com ou sem um form), o Lazarus também inclui a opção de converter uma unit Delphi para uma Unit Lazarus, através do item "Convert Delphi unit to Lazarus unit" que fará o seguinte:
9292
93931. renomeiará os arquivos .pas and .dfm para minúsculas.
94942. converterá .dfm para .lfm file (atualmente sem a verificação da validade do conteúdo; somente o formato)
95953. criará um arquivo .lrs vazio (o conteúdo será adicionado mais tarde)
96964. adicionará a diretiva
9797 {\$mode delphi}
98985. substituirá as unidades Windows por LCLIntf
99996. adicionará units LResources se necessário (i.e., se o unit.lrs for usado;
100100 o uso de LResources
101101
102102 pode ser implementado a parte)
1031037. removerá variáveis da unit
1041048. removerá a diretiva
105105 {\$R *.dfm}
1061069. adicionará a seção de inicialização e a diretiva
107107 {\$i unit.lrs}
108108
109109Isto fará uma conversão rápida e fácil da maioria das Units Delphi ao formato do Lazarus. Isto não checa a validade, ou muda a sintaxe automática. Assim, qualquer mudança na sintaxe, mudanças adicionais nos nomes das Units, mudanças necessárias por causa de diferenças nos objetos/controles, você terá que fazer manualmente.
110110
111111#### Selecting the right compiler mode
112112
113113The [[Free Pascal]] Compiler supports 5 different pascal modes. For example TP for turbo pascal, lets you compile turbo pascal units. There is also a DELPHI compatibility mode that can be set to make existing code easier to convert. Lazarus prefers the OBJFPC mode, which almost equals the DELPHI mode, but is less ambigious than the Delphi syntax. Here are the important points:
114114
115115The mode can be selected at command line or at the start of the source. Using the command line has the advantage, that you don't need to change the source, but the disadvantage, that others must be told.
116116
117117Most Delphi units can be compiled by the [[Free Pascal]] compiler by adding
118118
119-```
119+```text
120120{$IFDEF FPC}
121121 {$MODE DELPHI}
122122{$ENDIF}
123123```
124124
125125right after the unit name.
126126
127127For more details about [[Free Pascal]] modes see the [Free Pascal Documentation](http://www.freepascal.org/docs-html/prog/progap4.html#progse62.html)
128128
129129#### Cross-Platform considerations
130130
131131- Inline assembler is always a problem because it will bind the code to the Intel architecture. Some developers do algorithm prototypes in Pascal and ifdef the their optimized assembler. Fortunately TurboPower did this in numerous places with their code. If this is the case with the package you're converting, throw the switch back to Pascal.
132132- Don't reference specific memory location like the BIOS data area. Find out what the code needs and try to find a cross platform alternative.
133133- Don't do processor specific tricks (like using the Intel TSC) without enclosing your code in an ifdef for the platform the code needs... and providing an alternative for environments that don't have the hardware capability.
134134- If you need some OS specific code, then you can use IFDEFs. See below for a list of macros.
135135
136136#### Useful compiler variables
137137
138138To write code, that behaves on different systems differently, you can use the
139139
140140{\$IFDEF Name}
141141
142142directives.
143143
144144- {\$IfDef LCL}
145145
146146This variable is defined, when using the LCL package. Useful to write code, that works with the LCL and Delphi.
147147
148148- {\$IfDef FPC}
149149
150150This variable is defined, when using the FPC compiler. Useful to write code, that works with FPC and Delphi.
151151
152152- {\$IfDef Unix}
153153
154154 ,
155155
156156 {\$IfDef Win32}
157157
158158 , ...
159159
160160Defined by FPC for the current Target OS. Delphi defines "Linux", "Win32" and "MSWindows". [[Free Pascal]] runs on much more platforms and so it is recommended to use the more general items. For example "Unix" is defined for Linux, FreeBSD, NetBSD and OpenBSD, where Lazarus already runs. Use
161161
162-```
162+```text
163163{$IfDef Linux}
164164 {$Define Unix}
165165{$EndIf}
166166```
167167
168168to work around this for Kylix.
169169
170170For more details see the [Free Pascal Documentation](http://www.freepascal.org/docs-html/prog/prog.html#QQ2-23-21).
171171
172172#### Finding a missing identifier
173173
174174There are differences in how the LCL is organized when compared to the Delphi VCL. If you get a "not found" compiler error about a major class or identifier, the chances are good that it's in a different unit. A complete cross reference can be found by grep'ing lazarus/docs/xml or the lcl subdirectory.
175175
176176For example the commonly used tbutton typically throws an error in Delphi code because it's located in a unit named buttons.pp. The following command finds the correct unit very quickly (in the lazarus source directory):
177177
178-```
178+```text
179179 grep -in ' tbutton =' lcl/*
180180```
181181
182182#### Major unit differences between Lazarus and Delphi
183183
184184- - Please add to this topic! **
185185
186186- Windows-\>Interfaces, LCLIntf, LCLType, LCLProc, VCLGlobals, ...)
187187
188188As the LCL is not windows specific, the code that is in the Delphi Windows unit for directly accessing the Win32 API is abstracted into seperate interfaces, which can be accessed from the LCLIntf unit. Keep in mind, that Lazarus does not emulate win32, so many functions are missing and some do not work as their win32 counterparts. These functions only exist for Delphi compatibility and should only be used for quick & dirty porting. LCL also breaks out many of the types, so often LCLType, and sometimes VCLGlobals are required. LCLProc also contains a few functions which can be useful for lower level handling such as "FreeThenNil" as is in Delphi 5 and higher, "DeleteAmpersands" to remove additional ampersands from a string for controls(& vs && etc). The Interfaces unit needs to be included in the .lpr file to initialize the appropriate widgetset.
189189
190190- Messages-\>LMessages
191191
192192TControl Messages for win32 event callbacks of the format WM_CALLBACK and the structs associated with them are often found in the Messages unit in Delphi. In the LCL these types of messages and there structs are usually found in LMessages, usually with name changes of WM to LM, so for instance WM_MOUSEENTER becomes LM_MOUSEENTER, and TWMMouse becomes TLMMouse.
193193
194194- Graphics, Controls-\>GraphTypes, GraphMath, Graphics, Controls
195195
196196To simplify some things and break complexity of circles between units, a few types have been abstracted into a shared unit called GraphType, which includes things, which in Delphi are located in Graphics or Controls, for instance the bvNone etc of panels. So sometimes you have to include it. Also a unit which, although incompatible with Delphi, adds other useful functionality is GraphMath, which adds a TFloatPoint for precision, misc routines for dealing with beziers, lines, and arcs, as well as some operator overloading for use with TPoints and TRect, such as for instance Point1 := Point2 + Point3, and comparing two rects like if (rect1 = rect2) then ...
197197
198198- Mask-\>MaskEdit
199199
200200For more intelligent naming considerations, the unit for TMaskEdit is called \[MaskEdit\|\] instead of the slightly more nebulous Mask as in many versions of Delphi.
201201
202202- StdCtrls-\>StdCtrls,Buttons
203203
204204In many version of Delphi TButton is located in StdCtrls, while TSpeedButton and TBitBtn are in Buttons. For consistency and simplicity the LCL puts all button types in Buttons, which can occasionally break code conversion, so it is always a good idea to include.
205205
206206#### Property and method differences Delphi -\> FPC/LCL
207207
208208- TBitmap contains a canvas in the LCL
209209
210210#### Syntax differences
211211
212212**Please add to this topic!**
213213
214214Because of the inherent strictness in FPC, some syntax changes are necessary, even though
215215
216216{\$Mode Delphi}
217217
218218does allow more laziness like Delphi does. For this reason complying as much with the syntax rules of
219219
220220{\$Mode ObjFPC}
221221
222222as possible is highly recommended, even when the codebase is still going to be shared between Delphi and the LCL. Some of these are simply better coding practices, and sometimes because Delphi mode is not entirely accurate, or in a few instances Delphi acceptible code does not function as expected with FPC, even though it might compile. To that end even though not all such are strictly required, the following list of changes should be considered mandatory :
223223
224224When assigning an event handling entry point, prefix it with an "@"
225225
226226For instance, you might assign a button callback manually
227227
228228Delphi
229229
230230FPC
231231
232232begin
233233
234234if not
235235
236236Assigned(MyButton.OnClick)
237237
238238then
239239
240240`    MyButton.OnClick:= SomeFunction; `
241241
242242//@ not required
243243
244244//more code...
245245
246246end
247247
248248;
249249
250250begin
251251
252252if not
253253
254254Assigned(MyButton.OnClick)
255255
256256then
257257
258258`    MyButton.OnClick:= @SomeFunction; `
259259
260260//@ IS required
261261
262262//more code...
263263
264264end
265265
266266;
267267
268268When calling a procedure variable use this syntax
269269theprocname()
270270
271271In Delphi there is no difference between a function result and a variable, however there is in FPC, so to call a function, even if it has no parameters, you must append parenthesis. For Example -
272272
273273Delphi
274274
275275FPC
276276
277277With
278278
279279(SomeObject)
280280
281281do begin
282282
283283If
284284
285285Assigned(OnMyCallback)
286286
287287then
288288
289289`    OnMyCallback; `
290290
291291//parenthesis not required
292292
293293end
294294
295295;
296296
297297With
298298
299299(SomeObject)
300300
301301do begin
302302
303303If
304304
305305Assigned(OnMyCallback)
306306
307307then
308308
309309`    OnMyCallback(); `
310310
311311//parenthesis required
312312
313313end
314314
315315;
316316
317317When accessing values in a pointer to a record you must dereference first
318318
319319In Delphi it is not required to de-reference a pointer to a record to access values within it, it can, in fact, be treated just like the record itself, or any other object. In FPC it must be first de-referenced. As an example,
320320
321321Delphi
322322
323323FPC
324324
325325Function
326326
327327GetSomeValue(ARecord: PMyRecord)
328328
329329
330330Integer;
331331
332332begin
333333
334334If
335335
336336Assigned(ARecord)
337337
338338then
339339
340340`    Result`
341341
342342
343343=
344344
345345ARecord.SomeValue
346346
347347else
348348
349349`    Result:= `
350350
3513510
352352
353353;
354354
355355end
356356
357357;
358358
359359Function
360360
361361GetSomeValue(ARecord: PMyRecord)
362362
363363
364364Integer;
365365
366366begin
367367
368368If
369369
370370Assigned(ARecord)
371371
372372then
373373
374374`    Result`
375375
376376
377377=
378378
379379ARecord^.SomeValue
380380
381381else
382382
383383`    Result:= `
384384
3853850
386386
387387;
388388
389389end
390390
391391;
392392
393393When accessing chars of an indexed string Property of an object, it must be enclosed in parentheses
394394
395395With Delphi it is possible to treat a Property exactly like some other const or var, even to accessing for instance individual chars of a string directly, while this is not always possible in FPC, specifically for indexed properties. Instead it must be enclosed in parentheses, to make distinct. While this may not always hold true it is probably a good practice to consider anyway. For example
396396
397397Delphi
398398
399399FPC
400400
401401Type
402402
403403TSomeComponent=
404404
405405class
406406
407407(TComponent)
408408
409409//More code...
410410
411411Published
412412
413413Property
414414
415415MyString:
416416
417417String
418418
419419index
420420
4214213
422422
423423read
424424
425425GetMyString;
426426
427427//More code...
428428
429429End
430430
431431;
432432
433433var
434434
435435`  MyChar`
436436
437437
438438char;
439439
440440begin
441441
442442If
443443
444444Length(MyString)\>
445445
4464462
447447
448448then
449449
450450//no parenthesis needed
451451
452452`    MyChar:= MyString[`
453453
4544543
455455
456456\];
457457
458458//More code...
459459
460460end
461461
462462;
463463
464464Type
465465
466466TSomeComponent=
467467
468468class
469469
470470(TComponent)
471471
472472//More code...
473473
474474Published
475475
476476Property
477477
478478MyString:
479479
480480String
481481
482482index
483483
4844843
485485
486486read
487487
488488GetMyString;
489489
490490//More code...
491491
492492End
493493
494494;
495495
496496var
497497
498498`  MyChar`
499499
500500
501501char;
502502
503503begin
504504
505505If
506506
507507Length(MyString)\>
508508
5095092
510510
511511then
512512
513513//parenthesis sometimes needed
514514
515515`    MyChar:= (MyString)[`
516516
5175173
518518
519519\];
520520
521521//More code...
522522
523523end
524524
525525;
526526
527527You must typecast pointers to actual type when using with var or function of that type
528528
529529Sometimes in Delphi you will have a null pointer variable representing an object. While it might seem a complex situation, it is oddly quite common especially in large component packs as a method of preventing too many circular includes between objects in different units. In Delphi it is then possible to send this null pointer to a function expecting that object, without bothering to typecast to actual type, in fpc you must typecast.
530530
531531For example -
532532
533533Delphi
534534
535535FPC
536536
537537Unit 1
538538
539539Type
540540
541541TSomeObject=
542542
543543class
544544
545545(TComponent)
546546
547547//More code...
548548
549549End
550550
551551;
552552
553553Procedure
554554
555555DoSomething(Value: TSomeObject);
556556
557557Function
558558
559559GetSomeObject: TSomeObject;
560560
561561Unit 2
562562
563563Type
564564
565565TSomeComponent=
566566
567567class
568568
569569(TComponent)
570570
571571//More code...
572572
573573Published
574574
575575`  SomeObject: Pointer`
576576
577577;
578578
579579//More code...
580580
581581End
582582
583583;
584584
585585Application
586586
587587var
588588
589589`  MyComponent: TSomeComponent`
590590
591591;
592592
593593begin
594594
595595`  MyComponent.SomeObject`
596596
597597
598598=
599599
600600GetSomeObject;
601601
602602//More code...
603603
604604`  DoSomething(MyComponent.SomeObject)`
605605
606606;
607607
608608end
609609
610610;
611611
612612Unit 1
613613
614614Type
615615
616616TSomeObject=
617617
618618class
619619
620620(TComponent)
621621
622622//More code...
623623
624624End
625625
626626;
627627
628628Procedure
629629
630630DoSomething(Value: TSomeObject);
631631
632632Function
633633
634634GetSomeObject: TSomeObject;
635635
636636Unit 2
637637
638638Type
639639
640640TSomeComponent=
641641
642642class
643643
644644(TComponent)
645645
646646//More code...
647647
648648Published
649649
650650`  SomeObject: Pointer`
651651
652652;
653653
654654//More code...
655655
656656End
657657
658658;
659659
660660Application
661661
662662var
663663
664664` MyComponent: TSomeComponent`
665665
666666;
667667
668668begin
669669
670670`  MyComponent.SomeObject`
671671
672672
673673=
674674
675675Pointer(GetSomeObject);
676676
677677//More code...
678678
679679`  DoSomething(TSomeObject(MyComponent.SomeObject))`
680680
681681;
682682
683683end
684684
685685;
686686
687687#### Resources
688688
689689Delphi resource files are win32 specific and not compatible with Lazarus, so you'll have to recreate and compile them using the lazres. Lazres can be found in the lazarus/tools subdirectory. If you've downloaded the Lazarus sources, you'll need to compile it first.
690690
691691- cd lazarus/tools
692692- make install
693693
694694To add a resource to your application:
695695
696696- lazres myresource.lrs mypix.xpm anotherpix.xpm
697697- Add the LResources unit to your Uses clause
698698- Include the .lrs file you created under the initialization block
699699
700700Example:
701701
702702function
703703
704704TForm1.LoadGlyph(
705705
706706const
707707
708708GlyphName:
709709
710710String
711711
712712): TBitMap;
713713
714714begin
715715
716716`  Result:= TPixmap.Create`
717717
718718;
719719
720720`  Result.LoadFromLazarusResource(GlyphName)`
721721
722722;
723723
724724end
725725
726726;
727727
728728//More code...
729729
730730begin
731731
732732`  Speedbutton1.glyph:= LoadGlyph('mypix')`
733733
734734;
735735
736736//More code...
737737
738738end
739739
740740;
741741
742742initialization
743743
744744{\$I unit1.lrs}
745745
746746{\$I myresource.lrs}
747747
748748end
749749
750750.
751751
752752### Another method to convert a Delphi or Kylix project to Lazarus
753753
754754- Rename or copy all .dfm or .xfm files to .lfm (Early Delphi versions do not produce a text-based .dfm file. The convert utility, if present in the \bin folder can be used to covert the .dfm first))
755755- Rename or copy .dpr file to .lpr
756756- Make necessary changes to .lpr file:
757757
7587581. Add {\$mode delphi}{\$H+} or {\$mode objfpc}{H+} directives
7597592. Add 'Interfaces' to uses clause
7607603. Comment out or delete {\$R *.res} or directive
761761
762762- Make necessary changes to all .pas unit files:
763763
7647641. Add {\$mode delphi}{\$H+} or {\$mode objfpc}{H+} directives
7657652. Add 'LResources', and if the form has buttons, add 'Buttons' to uses clause
7667663. Comment out or delete {\$R *.dfm} or {\$R *.xfm} directive
7677674. Add 'Initialization' section at the end of each unit file, and add {\$I unitname.lrs} directive in it
768768
769769- Select Project-\>New Project form file
770770- Select the .lpr file
771771- At 'Create a new project' window, choose 'Application'
772772- Build project and make further necessary corrections to get proper compilation, at this point the .lpi file is generated automaticaly. You may also get 'Error reading Form' messages, click on 'Continue Loading' if you do.
773773- Save all, and you have a Lazarus project :-)
774774
775775## Getting Help
776776
777777If you encounter a problem during conversion that you just can't solve, there are a wide variety of places to get help. For pure Object Pascal and FPC issues, the best place to start is the Free Pascal [Documentation](http://www.freepascal.org/docs-html/) by Michaël Van Canneyt and Florian Klämpfl. For more Lazarus oriented problems, the Lazarus Project Documentation in the Lazarus-CCR Knowledgebase \[Main Page\] is the next place to look. Finally you can post a question on any of the [mailing lists for the Free Pascal Compiler](http://www.freepascal.org/maillist.html) or the [FPC forums](http://community.freepascal.org:10000/bboard/) where a lot of experts are subscribed.
778778
779779There are some outstanding search and knowledge bases online that can also be a great help for learning new techniques and solving problems. Tamarack Associates operates a fast [search](http://www.tamaracka.com/search.htm) engine specifically for the Borland usenet archives. Mer Systems Inc. provides a similar search [engine](http://www.mers.com/searchsite.html). Another outstanding source of information along with a sitewide [search](http://www.efg2.com/Lab/search.htm) capability is Earl F. Glynn's Computer Lab and Reference [Library](http://www.efg2.com/).
780780
781781## Packaging and Releasing your component
782782
783783### Creating a Lazarus package for your component(s)
784784
785785Creating a package makes installing the code you've converted a much easier process... especially if you're providing more then one component. Mattias Gärtner has written an overview of [[Lazarus Packages]] that should be read before beginning this process.
786786
787787### Documentation
788788
789789The purpose of this site and the wiki format is to make the generation of professional documentation an easy and quick process. The wiki also makes it possible to see the results of your posting immediately and make any changes you'd like in real time.
790790
791791Using the Lazarus-CCR wiki to create nice looking documentation is very easy. If you've never used wiki markup before, you can get familiar with it in the [[Sand Box]] practice area.
792792
793793### Creating a Code Release Page
794794
795795The Code Release Page contains vital information about your component that a potential downloader will need to know, such as license, intended platform, status (alpha, beta, stable...), where to download it, who wrote it, is support available... etc.
796796
797797The following procedure will let you create a Code Release Page with your browser:
798798
799799- Edit the [[Components and Code examples]] page and add a project name wiki link entry for your component in the "Released Components" section. Save the modified page.
800800
801801- Go to the [[Component Release Template]], select all and copy. Hit the back button on your browser to return to the [[Components and Code examples]] page.
802802- Click on your new wiki component name entry and paste the release template into the blank edit box.
803803- Edit the template accordingly and hit save.
804804- Do edit-saves until your document looks the way you want it to.
805805
806806### Submitting the component
807807
808808If you're a release technician on the project, upload your component to the SourceForge File Release System and add it to the list of release packages. Otherwise send it to one of the project administrators (Tom Lisjac or Vincent Snijders) and we'll add it to the repository.
809809
810810If you think you need to continue to develop on the component, we can also put it into CVS so you'll continue to have access to it.
811811
812812## Contributors and Changes
813813
814814This page has been converted from the epikwiki [version](http://lazarus-ccr.sourceforge.net/index.php?wiki=CodeConversionGuide).
815815
816816- Initial version by Tom Lisjac and Mattias Gärtner - 9/22/2003 VlxAdmin
817817- Moved Getting help from the main page. T. Lisjac - 9/24/2003 VlxAdmin
818818- Added documentation templates, procedure and links. 9/25/2003 VlxAdmin
819819- LCLLinux was renamed to LCLIntf, Jesus Reyes, 9/27/2003
820820- added more information on Unit changes, [AndrewJohnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 9/27/2003
821821- Updated Syntax differences, including some examples, [AndrewJohnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 9/27/2003
822822- FPC 1.0.x doesn't support interfaces, Vincent Snijders 9/28/2003
823823- Fixed some of the examples per new WikiWord definition, 9/28/2003 VlxAdmin
824824- Made code more consistant to remove last accidental Pascal WikiWord definitions, [AndrewJohnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 9/27/2003
825825- Use tables for code examples for nice blocks, and easy side by side view of Delphi-\>FPC differences, [AndrewJohnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 10/17/2003
826826- Use pascal stylesheet to make example code more readable, [AndrewJohnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 10/18/2003
827827- Some translations and small corrections in translations exist -\> User: jrxds 12/01/2012
828828
829829---
830830*From the Free Pascal wiki, page "Code Conversion Guide/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