Difference between revisions of "Code Conversion Guide/sk"

From Lazarus wiki
Jump to navigationJump to search
m (Fixed syntax highlighting)
 
(25 intermediate revisions by 5 users not shown)
Line 1: Line 1:
Konverzia a prenos zdrojového kódu Delphi pre Lazarus
+
{{Code Conversion Guide}}
  
== About ==
+
Cieľom tejto príručky je zdokumentovať niektoré zo špecifických rozdielov , ktoré sa najčastejšie vyskytujú pri konverii počas prekladu existujúceho kódu z Delphi do Lazarus.
  
Tento článok je o konverzii existujúceho zdrojového kódu Delphi tak, aby pracoval s prekladačom [[Free Pascal]] Compiler a IDE Lazarus. Keďže Lazarus a Free Pascal majú spoločné črty s Delphi a Kylix, nejedná sa o klony. Existuje veľa rozdielov vo volaní knižníc a konvenčných rozdielov... a v niektorých oblastiach je Free Pascal rozšírený a môže byť viac náročný na správnu syntax. Pozrite si príručku [[Lazarus For Delphi Users/sk | Lazarus pre užívateľov Delphi]], v ktorej nájdete popis niektorých funkčných rozdielov.  
+
Tento článok je o konverzii existujúceho zdrojového kódu Delphi alebo Kylix tak, aby pracoval s prekladačom [[Free Pascal]] a IDE Lazarus. Hoci majú Lazarus a Free Pascal spoločné črty s Delphi a Kylix, nejedná sa o ich klony. Existuje veľa rozdielov vo volaní knižníc a konvencii... a v niektorých oblastiach je Free Pascal rozšírený a môže byť náročnejší na správnu syntax. Pozrite si príručku [[Lazarus For Delphi Users/sk|Lazarus pre používateľov Delphi]], v ktorej nájdete popis niektorých funkčných rozdielov.  
  
 
Cieľom tejto príručky je zdokumentovať niektoré zo špecifických rozdielov, s ktorými sa často stretnete počas procesu konverzie kódu pri prekladaní existujúceho kódu z Delphi na Lazarus.
 
Cieľom tejto príručky je zdokumentovať niektoré zo špecifických rozdielov, s ktorými sa často stretnete počas procesu konverzie kódu pri prekladaní existujúceho kódu z Delphi na Lazarus.
Line 15: Line 15:
 
Na nete je dostupného veľa kódu, ktorý môže byť konvertovaný pre použitie s FreePascal a Lazarus. Tu je [[Page Of Code Sites | Stránka kódov]], ktorá je dobrým začiatkom. Prosím vás, pridajte na do nej, ak poznáte nejaký iný dobrý odkaz. Turbo-Power Software uvoľnil ich celú ponuku pod MPL. Zoznam dostupných balíčkov môžete nájsť na [http://sourceforge.net/users/tpsfadmin/ Sourceforge].
 
Na nete je dostupného veľa kódu, ktorý môže byť konvertovaný pre použitie s FreePascal a Lazarus. Tu je [[Page Of Code Sites | Stránka kódov]], ktorá je dobrým začiatkom. Prosím vás, pridajte na do nej, ak poznáte nejaký iný dobrý odkaz. Turbo-Power Software uvoľnil ich celú ponuku pod MPL. Zoznam dostupných balíčkov môžete nájsť na [http://sourceforge.net/users/tpsfadmin/ Sourceforge].
  
Aby sme predišli duplicitným snahám, balíčky, ktoré už sú konvertované sú vypísané na stránke [[Code And Components]]. Ak ste prekonvertovali balíček alebo na nejakom pracujete, pridajteprosím poznámku na stránku [Current Projects].
+
Aby sme predišli duplicitným snahám, balíčky, ktoré už sú konvertované sú vypísané na stránke [[Components and Code examples]]. Ak ste prekonvertovali balíček alebo na nejakom pracujete, pridajteprosím poznámku na stránku [Current Projects].
  
 
===Licencovanie===
 
===Licencovanie===
Line 23: Line 23:
 
Keď konvertujete komponenty, rešopektujte prosím elanie pôvodného autora a ponechajte všetky copyrighty a licenčné hlavičky spolu s emailovou adresou a url. Je slušné a často i užitočné informovať autora, že jeho komponent je konvertovaný... hlavne ak je komponent pod obmedzujúcou licenciou. Nový záujem o staré alebo zabudnuté komponenty môže často podnietiť autora na revíziu originálu a zmeniť reštriktívnu licenciu.
 
Keď konvertujete komponenty, rešopektujte prosím elanie pôvodného autora a ponechajte všetky copyrighty a licenčné hlavičky spolu s emailovou adresou a url. Je slušné a často i užitočné informovať autora, že jeho komponent je konvertovaný... hlavne ak je komponent pod obmedzujúcou licenciou. Nový záujem o staré alebo zabudnuté komponenty môže často podnietiť autora na revíziu originálu a zmeniť reštriktívnu licenciu.
  
Vo všeobecnosti, Public Domain (freeware) a LGPL/MPL sú najprispôsobiteľnejšie pre distribúciu komponentov. Ďalšie informácie môžete nájsť na [http://www.opensource.org/docs/definition.php Definícii Open Source] a je dobrým začiatkom. Existuje tiež niekoľko porovnaní, ktoré môžu pomôcť objasniť ako rôzne typy licencií pracujú a aký budú mať dosah na kód, ku ktorému patria. Hľadajte "open source license comparison".
+
Vo všeobecnosti, Public Domain (freeware) a LGPL/MPL sú najprispôsobiteľnejšie pre distribúciu komponentov. Dobrým začiatkom pre nájdenie ďalších informácií môže byť [http://www.opensource.org/docs/definition.php definícia Open Source]. Existuje niekoľko porovnaní, ktoré môžu pomôcť objasniť ako pracujú rôzne typy licencií a aký budú mať dosah na kód, ku ktorému patria. Hľadajte "open source license comparison".
  
 
===Závislosti ===
 
===Závislosti ===
Line 31: Line 31:
 
===Poznámky k prekladaču===
 
===Poznámky k prekladaču===
  
Momentálne stabilná verzia 1.0.x Free Pascalnepodporuje rozhrania, vlákna a variantné záznamy. Ak vami konvertovaný kód vyžaduje tieto konštrukcie, budete musieť použiť 1.1 vývojovú vetvu prekladača... ktorý nie vždy garantuje spoluprácu s Lazarus.
+
Viz:
 +
* [http://www.freepascal.org/probs.html Známe problémy]
 +
* [http://www.freepascal.org/bugs/db.php3?statusfield=Unfixed Neopravené chyby]
  
 
===Poznámky k platforme a OS===
 
===Poznámky k platforme a OS===
  
Lazarus a Free Pascal sú nadplatformové a nadarchitektúrne vývojové nástroje. V kontraste, väčšina existujúceho kódu Delphi bola špecificky navrhnutá pre beh na rpocesore Intel a s Win32. Ak váš komponent má eľa špecifického kódu Win32, bude možno múdrejšie skúsiť nájsť alternatívu, ktorá je menej závislá na platforme. Ale nenechajte sa tým zastaviť... to je pravé prekvapenie, čo Lazaruspodporuje!
+
Lazarus a Free Pascal sú nadplatformové a nadarchitektúrne vývojové nástroje. Naopak, väčšina existujúceho kódu Delphi bola špecificky navrhnutá pre beh na procesore Intel a s Win32. Ak má Váš komponent veľa špecifického kódu Win32, bude možno múdrejšie skúsiť nájsť alternatívu, ktorá je menej závislá na platforme. Ale nenechajte sa tým zastaviť... je naozaj prekvapujúce čo všetko LCL podporuje!
  
 
==Konverzia ==
 
==Konverzia ==
Line 43: Line 45:
 
====Vytvorenie skúšobného projektu====
 
====Vytvorenie skúšobného projektu====
 
* Umiestnite konvertovaný kód do podadresára (napr: convertdir)
 
* Umiestnite konvertovaný kód do podadresára (napr: convertdir)
* Vyvolajte Lazarus
+
* Spusťte Lazarus
* '''File->Save All''' do adresára convertdir. Významné mená pre Project a predvolenú jednotku sú voliteľné.
+
* '''File->Save All''' do adresára convertdir. Zmysluplné mená pre Project a predvolenú jednotku sú voliteľné.
 
* Otvorte "základnú" konvertovanú jednotku v convertdir
 
* Otvorte "základnú" konvertovanú jednotku v convertdir
 
* Pridajte ju do projektu: '''Project->Add Active Unit to Project'''
 
* Pridajte ju do projektu: '''Project->Add Active Unit to Project'''
* Spusťte '''Tools->Quick Syntax Check''' alebo '''Run->Build All''' na začatie.
+
* Spusťte '''Tools->Quick Syntax Check''' alebo '''Run->Build All''', čím začnete.
 +
 
 
====Na čo treba dať pozor====
 
====Na čo treba dať pozor====
 
* Mená súborov sú citlivé na veľkosť pri prekladačoch série 1.0.x. Ak pracujete s touto verziou, premenujte všetky súbory malými písmenami. Ak to neurobíte, ľahko dostanete chybové hlásenie '''File not found'''.
 
* Mená súborov sú citlivé na veľkosť pri prekladačoch série 1.0.x. Ak pracujete s touto verziou, premenujte všetky súbory malými písmenami. Ak to neurobíte, ľahko dostanete chybové hlásenie '''File not found'''.
 
====Zdrojové kódy Delphi VCL a Kylix CLX v Lazarus====
 
====Zdrojové kódy Delphi VCL a Kylix CLX v Lazarus====
Pri konverzii zdrojových kódov Delphi/Kylix, je často užitočné použiť '''Find declaration''', aby ste sapresvedčili, či daná funkcia existuje. IDE Lazarus môže analyzovať zdrojové kódy Delphi/Kylix. Na to potrebujete nastaviť niektoré cesty a nastaveniaprekladača. Jednoducho to môžete nastaviť pomocou '''Environment->CodeTools Defines Editor->Insert Template'''.
+
Pri konverzii zdrojových kódov Delphi/Kylix, je často užitočné použiť '''Find declaration''', aby ste sa presvedčili, či daná funkcia funguje. IDE Lazarus môže analyzovať zdrojové kódy Delphi/Kylix. Na to potrebujete nastaviť niektoré cesty a nastavenia prekladača. Jednoducho to môžete nastaviť pomocou '''Environment->CodeTools Defines Editor->Insert Template'''.
 +
 
 +
===Problémy konverzie a ich riešenie ===
 +
 
 +
==== Ekvivalenty Delphi/Kylix súborov v Lazarus ====
 +
 
 +
{|border="1" width="800" 
 +
! Delphi / Kylix !! Popis !! Lazarus !! Popis
 +
|-
 +
|valign="top"| .pas
 +
 +
.dfm/.xfm,
 +
 
 +
.dcu/.dpu,
 +
 
 +
.dpr(main project file),
 +
 
 +
.res,
 +
 
 +
.dof/.kof
 +
 
 +
---
 +
 
 +
---
 +
 
 +
---
 +
 
 +
|valign="top"| súbor zdrojového kódu Delphi,
 +
 
 +
formulár Delphi,
 +
 
 +
preložená jednotka Delphi,
 +
 
 +
projekt Delphi,
 +
 
 +
Resource súbor Windows,
 +
 
 +
súbor volieb Delphi
 +
 
 +
|valign="top"| .pas, .pp
 +
.lfm,
 +
 
 +
.o,
 +
 
 +
.lpr
 +
 
 +
---
 +
 
 +
---
 +
 
 +
.lrs,
 +
 
 +
.lpi(hlavný súbor projketu),
 +
 
 +
.ppu
 +
 
 +
|valign="top"| súbor jednotky Pascal,
 +
 
 +
dátový súbor formulára,
 +
 
 +
súbor preloženej jednotky,
 +
 
 +
súbor projektu,
 +
 
 +
Resource súbor,
 +
 
 +
súbor volieb projektu,
 +
 
 +
Resource súbor Lazarus,
 +
 
 +
informačný súbor projektu Lazarus,
 +
 
 +
popisný súbor jednotky FPC
 +
|}
 +
 
 +
Teda súbor Delphi .dcu zhruba korenšponduje so súbormi FPC .o a .ppu spolu v jednom súbore. Súbor .PPU je prevažne hlavičková (interface) časť, the .o prevažne časť implementation. Hlavnou výnimkou sú inlined funkcie, ktoré vo forme to-be-inlined v .ppu.
 +
 
 +
====Konverzia projektov/formulárov/jednotiek Delphi do Lazarus====
  
===Problémy a riešenia konverzie===
+
Premenujte alebo prekopírujte súbor .dpr na súbor .lpr. Zakomentujte alebo odstráňte direktívu
 +
{$R *.res}
 +
a pridajte direktívu
 +
{$mode delphi}{$H+}
 +
alebo
 +
{$mode objfpc}{$H+}
 +
do súboru .lpr.
  
====Konvertovanie formulárov a jednotiek Delphi do Lazarus====
+
S touto konverziou Vám môže pomôcť Lazarus IDE prostredníctvom položky menu '''Tools menu>Convert Delphi Project to Lazarus Project'''. Vyžiada si zadanie súboru .dpr (projekt Delphi) a skonvertuje ho na .lpr, ďalej vytvorí súbor .lpi a skonveruje všetky jednotky.
  
 
Mnoho existujúcich formulárov Delphi môžete konvertovať pomocou IDE Lazarus pomocou zabudovaného konvertora formulárov DFM na LFM. Nájdete ho v menu '''Tools->Convert DFM file to LFM'''. Vyvolajte súborový dialóg, vyberte *.dfm a konvertor urobí zvyšok.
 
Mnoho existujúcich formulárov Delphi môžete konvertovať pomocou IDE Lazarus pomocou zabudovaného konvertora formulárov DFM na LFM. Nájdete ho v menu '''Tools->Convert DFM file to LFM'''. Vyvolajte súborový dialóg, vyberte *.dfm a konvertor urobí zvyšok.
  
 
Ak potrebujete konvertovať celú jednotku (s alebo bez formulára), Lazarus má tiež zabudovaný nástroj: '''Convert Delphi unit to Lazarus unit''', ktorý urobí nasledujúce:
 
Ak potrebujete konvertovať celú jednotku (s alebo bez formulára), Lazarus má tiež zabudovaný nástroj: '''Convert Delphi unit to Lazarus unit''', ktorý urobí nasledujúce:
# premenuje súbory .pas a .dfm malými písmenami.
+
 
# prekonvertuje súbor .dfm na súbor .lfm (aktuálne bez kontroly obsahu, len formát)
+
# upraví veľkosť písmen v sekciách uses a iclude.
 +
# konvertuje súbory .dfm na súbory .lfm (bez kontroly obsahu, len formát)
 
# vytvorí prázdny súbor .lrs (obsah bude pridaný neskôr)
 
# vytvorí prázdny súbor .lrs (obsah bude pridaný neskôr)
# pridá direktívu <div class="dir">{$mode delphi}</div>
+
# pridá direktívu
 +
{$mode delphi}
 
# nahradí jednotku Windows jednotkou LCLIntf
 
# nahradí jednotku Windows jednotkou LCLIntf
 
# ak je to potrebné, pridá jednotku LResources
 
# ak je to potrebné, pridá jednotku LResources
 
# odoberie jednotku Variants
 
# odoberie jednotku Variants
# odoberie direktívu<div class="dir">{$R *.dfm}</div>
+
# odoberie direktívu
# pridá sekciu <div class="key">initialization</div> a direktívu <div class="dir">{$i unit.lrs}</div>
+
{$R *.dfm}
 +
# pridá do sekcie initialization direktívu  
 +
{$i unit.lrs}
  
 
Toto umožní rýchlu a ľahkú konverziu väčšiny jednotiek z formátu Delphi do formátu Lazarus. Tento nástroj nevykonáva žiadnu kontrolu platnosti alebo automatické zmeny syntaxe, tak všetky potrebné zmeny syntaxe, dodatočné zmeny jednotiek, alebo zmeny dfm/pas pre rozdiely v prvkoch/komponentoch, musíte urobiť manuálne, pomocou niekoľkých sprievodcov, ktorý vám pomôžu niektoré kroky, hlavne opravovanie konvertovaných formulárov (lfm).
 
Toto umožní rýchlu a ľahkú konverziu väčšiny jednotiek z formátu Delphi do formátu Lazarus. Tento nástroj nevykonáva žiadnu kontrolu platnosti alebo automatické zmeny syntaxe, tak všetky potrebné zmeny syntaxe, dodatočné zmeny jednotiek, alebo zmeny dfm/pas pre rozdiely v prvkoch/komponentoch, musíte urobiť manuálne, pomocou niekoľkých sprievodcov, ktorý vám pomôžu niektoré kroky, hlavne opravovanie konvertovaných formulárov (lfm).
Line 76: Line 166:
 
Prekladač [[Free Pascal]] podporuje 5 rôznych módov Pascalu. Napríklad TP pre Turbo Pascal, vám dovolí prekladať jednotky Turbo Pascal. Má i mód pre kompatibilitu s DELPHI, ktorý môžete nastaviť na uľahčenie konverzie kódu. Lazarus preferuje mód OBJFPC, ktorý je skoro ako mód DELPHI, ale bez mnohoznačnosti syntaxe Delphi. Tu sú dôležité body:
 
Prekladač [[Free Pascal]] podporuje 5 rôznych módov Pascalu. Napríklad TP pre Turbo Pascal, vám dovolí prekladať jednotky Turbo Pascal. Má i mód pre kompatibilitu s DELPHI, ktorý môžete nastaviť na uľahčenie konverzie kódu. Lazarus preferuje mód OBJFPC, ktorý je skoro ako mód DELPHI, ale bez mnohoznačnosti syntaxe Delphi. Tu sú dôležité body:
  
Mód môže byť zvolený na príkazovom riadku alebo na začiatku zdrojového kódu. Použitie príkazového riadku má výhody, ktoré nevyužijete na zmenu zdrojového kódu, ale i nevýhody, ktoré musia byť povedané tiež.
+
Mód môže byť zvolený na príkazovom riadku alebo na začiatku zdrojového kódu. Použitie príkazového riadku má výhodu, že nemusíte meniť zdrojový kód, ale i nevýhody, ktoré musia vysvetliť iní.
  
 
Väčšinu jednotiek Delphi môžete jednoducho preložiť pomocou [[Free Pascal]] pridaním tejto konštrukcie, hneď za meno jednotky
 
Väčšinu jednotiek Delphi môžete jednoducho preložiť pomocou [[Free Pascal]] pridaním tejto konštrukcie, hneď za meno jednotky
Line 83: Line 173:
 
  {$ENDIF}
 
  {$ENDIF}
  
Ďalšie podrobnosti o módoch [[Free Pascal]] môôžete nájsť v [http://www.freepascal.org/docs-html/prog/progap4.html#progse62.html Dokumentácii Free Pascal].
+
Ďalšie podrobnosti o módoch [[Free Pascal]] nájdete v [http://www.freepascal.org/docs-html/prog/progap4.html#progse62.html dokumentácii Free Pascal].
  
====Cezplatformové poznámky====
+
====Viac-platformové poznámky====
* Zahrnutý assembler býva vždy problémom, pretože zväzuje kód s architektúrou Intel. Niektorí vývojári robia prototypy algoritmov v Pascale a pomocou '''ifdef''' vklasajú oprimizovaný assembler. Našťastie Turbo-Power toto urobil na mnohých miestach svojho kódu. Ak je toto prípad balíčka, ktorý chcete konvertovať, prepnite ho späť do Pascalu.
+
* Zahrnutý assembler býva vždy problémom, pretože zväzuje kód s architektúrou Intel. Niektorí vývojári robia prototypy algoritmov v Pascale a pomocou '''ifdef''' vkladajú oprimizovaný assembler. Našťastie Turbo-Power toto urobil na mnohých miestach svojho kódu. Ak je toto prípad balíčka, ktorý chcete konvertovať, prepnite ho späť do Pascalu.
 
* Neodkazujte na špecifické pamäťové miesto, ako dátová oblasť BIOS. Zistite čo kód potrebuje a skúste nájsť cezplatformovú alternatívu.
 
* Neodkazujte na špecifické pamäťové miesto, ako dátová oblasť BIOS. Zistite čo kód potrebuje a skúste nájsť cezplatformovú alternatívu.
 
* Nepoužívajte triky, ktoré sú špecifické pre procesor (ako použitie Intel TSC) bez zatvorenia svojho kódu do '''ifdef''' pre platformu potrebnú pre kód... a poskytnutia alternatívy pre prostredia, ktoré nie sú hardvérovo kompatibilné.
 
* Nepoužívajte triky, ktoré sú špecifické pre procesor (ako použitie Intel TSC) bez zatvorenia svojho kódu do '''ifdef''' pre platformu potrebnú pre kód... a poskytnutia alternatívy pre prostredia, ktoré nie sú hardvérovo kompatibilné.
Line 93: Line 183:
 
====Užitočné premenné prekladača====
 
====Užitočné premenné prekladača====
  
Pre písanie kódu, ktorý má bežať na rôznych systémoch rôzne, môžete použiť direktívy <div class="dir">{$IFDEF Name}</div>.
+
Pre písanie kódu, ktorý sa správať na rôznych systémoch rôzne, môžete použiť direktívy
 
+
{$IFDEF Name}
* <div class="dir">{$IfDef LCL}</div>
+
Pričom Name môže byť
: Táto premenná je definovaná pri použití balíčka LCL a je užitočná pre písanie kódu, ktorý pracuje s LCL a Delphi.
+
*'''LCL''' - táto premenná je definovaná pri použití balíčka LCL a je vhodná pre písanie kódu, ktorý pracuje s LCL a Delphi.
* <div class="dir">{$IfDef FPC}</div>
+
{$IfDef LCL}
: Táto premenná je definovaná pri použití prekladača Free Pascal a je užitočná pre písanie kódu, ktorý pracuje s Free Pascal a Delphi.
+
*'''FPC''' - táto premenná je definovaná pri použití prekladača Free Pascal a je vhodná pre písanie kódu, ktorý pracuje s Free Pascal a Delphi.
* <div class="dir">{$IfDef Unix}</div>, <div class="dir">{$IfDef Win32}</div>, ...
+
{$IfDef FPC}
: Tieto sú definované pre cieľový OS. Delphi definuje '''Linux''', '''Win32''' a '''MSWindows'''. [[Free Pascal]] beží na oveľa väčšom počte platforiem a tak je vhodné použiť oveľa všeobecnejšie položky. Napríklad '''Unix''' je definované pre Linux, FreeBSD, NetBSD a OpenBSD, na ktorých už Lazarus beží.
+
*'''LCLGtk''', '''LCLWin32''', '''LCLQt''', ... - tieto premenné sú definované keď je použitý balíček LCL a špecifický WidgetSet. Užitočné pre písanie kódu, pracuje s LCL na určitej platforme.
: Použite nasledujúcu konštrukciu pre prácu v Kylix:
+
{$IfDef LCLGtk}
 +
{$IfDef LCLWin32}
 +
{$IfDef LCLQt}
 +
...
 +
*'''Unix''', '''Win32''',... -  tieto sú definované pre cieľový OS. Delphi definuje '''Linux''', '''Win32''' a '''MSWindows'''. [[Free Pascal]] beží na oveľa väčšom počte platforiem a tak je vhodné použiť oveľa všeobecnejšie položky. Napríklad '''Unix''' je definované pre Linux, FreeBSD, NetBSD a OpenBSD, na ktorých už Lazarus beží.
 +
{$IfDef Unix}
 +
{$IfDef Win32}
 +
...
 +
: Pre prácu v Kylix použite nasledujúcu konštrukciu:
 
  {$IfDef Linux}
 
  {$IfDef Linux}
 
   {$Define Unix}
 
   {$Define Unix}
 
  {$EndIf}
 
  {$EndIf}
 +
*'''ENDIAN_BIG''' - táto premenná je definovaná na procesoreoch ako PowerPC (napr. staré počítače Apple, tj. do MacOSX 10.2), ktoré majú obrátené poradie ako Intel kompatibilné procesory.
 +
{$IfDef ENDIAN_BIG}
  
 
Ďalšie podrobnosti nájdete v [http://www.freepascal.org/docs-html/prog/prog.html#QQ2-23-21 dokumentácii Free Pascal].
 
Ďalšie podrobnosti nájdete v [http://www.freepascal.org/docs-html/prog/prog.html#QQ2-23-21 dokumentácii Free Pascal].
 +
 +
==== Podpora 32bit/64bit ====
 +
 +
Ukazovatele pod 64bit potrebujú 8 bajtov namiesto 4 na 32bit. Typ 'Integer' zostáva pre kompatibilitu s 32bit. To znamená, že už nepotrebujete pretypovanie ukazovatele na integer a naopak. FPC definuje dva nové typy:
 +
*'''PtrInt''' je 32bit Integer so znamienkom na 32bit platformách a 64bit Integer sp znamienkom na 64bit platformách.
 +
*'''PtrUInt''', je rovnaké ako predchádzajúce s tým rozdielom, že sa jedná o Integer bez znamienka.
 +
 +
Pre kód, ktorý má pracovať s Delphi a FPC použite:
 +
  {$IFNDEF FPC}
 +
  type
 +
    PtrInt = integer;
 +
    PtrUInt = cardinal;
 +
  {$ENDIF}
 +
 +
Nahrďte všetky
 +
integer(SomePointerOrObject)
 +
týmto
 +
PtrInt(SomePointerOrObject)
  
 
====Hľadanie chýbajúcich identifikátorov====
 
====Hľadanie chýbajúcich identifikátorov====
Line 118: Line 236:
 
====Rozdiely v dôležitých jednotkách Lazarus a Delphi ====
 
====Rozdiely v dôležitých jednotkách Lazarus a Delphi ====
  
** Please add to this topic! **
+
;Prosím dopĺňajte túto časť!;
 +
 
 +
* Windows -> LCLIntf, LCLType, LCLProc, VCLGlobals, ...
  
* Windows->LCLIntf, LCLType, LCLProc, VCLGlobals, ...)
+
Keďže LCL nie je špecificky Windowsová knižnica, kód, ktorý je v jednotke Windows z Delphi pre priamy prístup k Win32 API je  abstrahovaný do samostatných rozhraní, do ktorých môžete pristupovať z jednotky '''LCLIntf'''. Majte na pamäti, že Lazarus neemuluje Win32, tak veľa funkcií cýba a niektoré nepracujú ako ich Win32 náprotivky. Tieto funkcie existujú len pre kompatibiltu s Delphi a sú určené len pre rýchly a (s)prostý prenos. LCL tiež tiež nemá mnoho z typov, tak je často potrebná jednotka '''LCLType''' a niekedy aj '''VCLGlobals'''. '''LCLProc''' tiež obsahuje niekoľko funkcií, ktoré môžu byť užitočné pre najnižšiu úroveň obslúh ako '''FreeThenNil''', '''DeleteAmpersands''' na odstránenie dodatočných ampersandov z reťazcov pre ovládacie prvky (& - && atď).
  
Keďže LCL nei je špecificky Windowsová knižnica, kód, ktorý je v jednotke Windows v Delphi, pre priamy prístup k Win32 API je  abstrahovaný do samostatných rozhraní, do ktorých môžete pristupovať z jednotky '''LCLIntf'''. Majte na pamäti, že Lazarus neemuluje Win32, tak veľa funkcií cýba a niektoré nepracujú ako ich Win32 náprotivky. Tieto funkcie existujú len pre kompatibiltu s Delphi a sú určené len pre rýchly a (s)prostý prenos. LCL tiež tiež nemá mnoho z typov, tak je často potrebná jednotka '''LCLType''' a niekedy aj '''VCLGlobals'''. '''LCLProc''' tiež obsahuje niekoľko funkcií, ktoré môžu byť užitočné pre najnižšiu úroveň obslúh ako '''FreeThenNil''', '''DeleteAmpersands''' na odstránenie dodatočných ampersandov z reťazcov pre prvky (& - && atď).
+
Jednotka '''Interfaces''' musí byť zahrnutá v súbore .lpr file pre správnu inicializáciu príslušného WidgetSet.
  
 
* Messages->LMessages
 
* Messages->LMessages
  
TControl Messages pre spätné (callbacks) udalosti Win32 vo formáte WM_CALLBACK a ich príslušná štruktúra je väčšinou umiestnená v jednotke Messages v Delphi. V LCL tieto typ a štruktúry zvyčajne nájdete v LMessages, zvyčajne premenované z WM_ na LM_, tak sa napríklad WM_MOUSEENTER stáva LM_MOUSEENTER, a TWMMouse sa stáva TLMMouse.
+
Správy TControl pre spätné volania (callbacks) udalostí Win32 vo formáte WM_CALLBACK a ich príslušná štruktúra je väčšinou umiestnená v jednotke Messages v Delphi. V LCL tieto typy správ a ich štruktúry zvyčajne nájdete v LMessages, zvyčajne premenované z WM_ na LM_, tak sa napríklad WM_MOUSEENTER stáva '''LM_MOUSEENTER''', a TWMMouse sa stáva '''TLMMouse'''.
  
 
* Graphics, Controls->GraphTypes, GraphMath, Graphics, Controls
 
* Graphics, Controls->GraphTypes, GraphMath, Graphics, Controls
  
Na zjednodušenie niektorých vecí a prerušenie zložitosti krúženia medzi jednotkami, sú abstrahované niektoré typy do zdieľanej jednotky, zvanej GraphType, ktorá zahŕňa potreby, ktoré sú v Delphi umiestnené v jednotkách '''Graphics''' alebo '''Controls'''. Tak ju niekedy budete potrebovať zahrnúť. Rovnako ako jednotku '''GraphMath''', ktorá, hoci nekompatibilne s Delphi, pridáva ďalšie užitčné funkcie, ako TFloatPoint pre presnosť, rôzne rutiny pre spolprácu s bezériovými krivkami, čiarami a oblúkmi, ako aj perťažené operátory pre použitie s typmi TPoints a TRect, ako napr.
+
Na zjednodušenie niektorých vecí a prerušenie zložitosti krúženia medzi jednotkami, sú abstrahované niektoré typy do zdieľanej jednotky, zvanej GraphType, ktorá zahŕňa potreby, ktoré sú v Delphi umiestnené v jednotkách '''Graphics''' alebo '''Controls'''. Tak ju niekedy budete potrebovať zahrnúť, rovnako ako jednotku '''GraphMath''', ktorá, hoci nekompatibilne s Delphi, pridáva ďalšie užitočné funkcie, ako TFloatPoint pre presnosť, užitožné rutiny pre spoluprácu s bezériovými krivkami, čiarami a oblúkmi, ako aj perťažené operátory pre použitie s typmi TPoints a TRect, ako napr.
  
 
  Point1 := Point2 + Point3
 
  Point1 := Point2 + Point3
Line 148: Line 268:
 
====Rozdiely vo vlastnostiach a metódach Delphi -> FPC/LCL ====
 
====Rozdiely vo vlastnostiach a metódach Delphi -> FPC/LCL ====
 
* v LCL je Canvas obsahnutý v TBitmap
 
* v LCL je Canvas obsahnutý v TBitmap
==== Syntaxové rozdiely ====
+
====Sémantické rozdiely ====
 +
 
 +
===== Poradie vyhodnocovania parametrov =====
 +
 
 +
Delphi garantuje, že všetky parametre sú vyhodnocované z ľava do prava. FPC takúto garanciu neposkytuje a môže vyhodnocovať parametre v ľubovoľnom poradí, kvôli generovaniu optimálneho kódu.
 +
 
 +
===== Vnorené procedúry/funkcie sú procedurálne premenné =====
 +
 
 +
Delphi posiela framepointer rodičovskej procedúry vždy do zásobníka a vždy volá ich opätovné odstránenie. To znamená, že ak pokiaľ nepristupujute k premenným rodičovskej procedúry, môžete poslať adresu vnorenej procedúry do inej funkcie, ktorá ich potom môže volať ako každú procedurálnu premennú.
 +
 
 +
FPC vždy posiela framepointer rodičovskej procedúry ako skrytý prvý parameter, podľa aktuálnej konvecie volania, čiže ak voláte vnorenú procedúru ako bežnú procedurálnu premennú, všetky parametre budú posunuté o jednu pozíciu.
 +
 
 +
Inými slovami, nevolajte vnorené procedúry pomocou procedurálnych premenných.
 +
 
 +
==== Syntaktické rozdiely ====
  
'''Please add to this topic!'''
+
;Prosím dopĺňajte túto kapitolu!
  
Kvôli zdedenej prísnosti FPC, budú potrebné niektoré syntaktické zmeny, napriek direktíve <div class="dir">{$Mode Delphi}</div> pracuje oveľa pomalšie ako Delphi. Pre tento dôvod oveľa viac vyhovujú pravidlá syntaxe <div class="dir">{$Mode ObjFPC}</div>  ak je to možné, vrelo doporučujem, iba keď bude kód zdieľaný medzi Delphi a LCL. Niektoré z týchto sú jednoducho lepšie praktiky kódovania a niekedy pretože mód Delphi nie je celkom presný, alebo v niektorých prípadoch kód akceptovaný Delphi nefunguje podľa očakávania s Free Pascal, hoci môže byť preložený. Tkže nakoniec nie všetky sú presne vyžadované, nasledujúci zoznam zmien vždy zvážte:
+
Kvôli zdedenej prísnosti FPC, budú potrebné niektoré syntaktické zmeny, napriek direktíve
 +
{$Mode Delphi}
 +
pracuje oveľa pomalšie ako Delphi. Kvôli tomu oveľa viac vyhovujú pravidlá syntaxe
 +
{$Mode ObjFPC}
 +
ak je to možné, vrelo doporučujem, dokonca i keď bude kód zdieľaný medzi Delphi a LCL.
  
;Inicializácia premenných v FPC 1.0.x
+
Niektoré z týchto sú jednoducho lepšie praktiky kódovania a niekedy pretože mód Delphi nie je celkom presný, alebo v niektorých prípadoch kód akceptovaný Delphi nefunguje podľa očakávania s Free Pascal, hoci môže byť preložený. Tkže nakoniec nie všetky sú presne vyžadované, nasledujúci zoznam zmien vždy zvážte:
  
V Delphi je možné (a celkom bežné) inicializovať premennú v jej deklarácii, avšak toto nie je možné vo Free Pascal 1.0.x, namiesto toho musíte použiť konštanty, alebo vo väčšine prípadov je lepšia inicializácia niekde inde, pred použitím premennej (napr. časť <div class="key">initialization</div> jednotky).
+
=====Pri priraďovaní vstupného bodu obsluhy udalosti, pridajte predponu "@"=====
  
Napríklad:
+
Napríklad, môžete manuálne priradiť udalosť tlačítka
{| class="code"
+
{| border="1" width="800"
|- 
+
! Delphi !! OBJFPC
| class="header" | Delphi || class="header" | FPC
+
|-
|- class="code"
+
|<syntaxhighlight lang="pascal">
| class="code" | <div class="key">var</div>
+
begin
  MyObject: TSomeObject= <div class="key">nil</div>;
+
  if not Assigned(MyButton.OnClick) then
  <div class="cmt">//Nejaký kód...</div>
+
    MyButton.OnClick:= SomeFunction;
<div class="key">implementation</div>
+
    //@ nie je vyžadované
  <div class="cmt">//Nejaký kód...</div>
+
    //ďalší kód...
<div class="key">initialization</div>
+
end;
  <div class="cmt">//Nejaký kód...</div>
+
</syntaxhighlight>
<div class="key">end</div>.
+
|<syntaxhighlight lang="pascal">
| class="code" | <div class="key">var</div>
+
begin
  MyObject<div class="symbol">:</div> TSomeObject;
+
  if not Assigned(MyButton.OnClick) then
  <div class="cmt">//Nejaký kód...</div>
+
    MyButton.OnClick:= @SomeFunction;
<div class="key">implementation</div>
+
    //@ je vyžadované
  <div class="cmt">//Nejaký kód...</div>
+
    //ďalší kód...
<div class="key">initialization</div>
+
end;
  MyObject:= <div class="key">nil</div>;
+
</syntaxhighlight>
  <div class="cmt">//Nejaký kód...</div>
 
<div class="key">end</div>.
 
 
|}
 
|}
  
;Pri priraďovaní obsluhy udalosti, používajte predponu "'''@'''"
+
=====Pri volaní procedurálnej premennej používajte túto syntax: theprocname()=====
  
Napríklad môžete manuálne priradiť obsluhu tlačítka:
+
V Delphi nie je rozdiel medzi výsledkom funkcie a premennou, ale v FPC je. Preto volanie function, hoci aj nemá parametre, musí obsahovať zátvorky. Napríklad
{| class="code"
+
{| border="1" width="800"
|- 
+
! Delphi !! OBJFPC
| class="header" | Delphi || class="header" | FPC
+
|-
|- class="code"
+
|<syntaxhighlight lang="pascal">
| class="code" | <div class="key">begin</div>
+
With (SomeObject) do
  <div class="key">if not</div> Assigned(MyButton.OnClick) <div class="key">then</div>
+
begin
    MyButton.OnClick:= SomeFunction; <div class="cmt">//@ nie je vyžadované</div>
+
  If Assigned(OnMyCallback) then
  <div class="cmt">//Nejaký kód...</div>
+
    OnMyCallback;
<div class="key">end</div>;
+
    //zátvorky nie vyžadované
| class="code" | <div class="key">begin</div>
+
end;
  <div class="key">if not</div> Assigned(MyButton.OnClick) <div class="key">then</div>
+
</syntaxhighlight>
    MyButton.OnClick:= @SomeFunction; <div class="cmt">//@ je vyžadované</div>
+
|<syntaxhighlight lang="pascal">
  <div class="cmt">//Nejaký kód...</div>
+
With (SomeObject) do
<div class="key">end</div>;
+
begin
 +
  If Assigned(OnMyCallback) then
 +
    OnMyCallback();
 +
    //zátvorky sú vyžadované
 +
end;
 +
</syntaxhighlight>
 
|}
 
|}
  
;Pri volaní procedurálnej premennej používajte túto syntax: theprocname()
+
===== Pri pristupovaní k hodnotám v ukazovateli na záznam ho musíte najprv dereferencovať =====
 +
 
 +
V Delphi nie je nutné dereferencovať ukazovateľ na záznam pre prístup k hodnotám v ňom, môže byť spracovaný presne ako záznam samotný, či iný objekt.
  
V Delphi nie je rozdiel medzi procedúrou a procedurálnou premennou, ale v FPC áno, takže pri volaní procedúry, hoci táto nemá parametre, musíte pripojiť zátvorky. Napríklad:
+
V FPC musí byť najprv dereferencovaný, napríklad:
{| class="code"
+
{| border="1" width="800"
|- 
+
! Delphi !! OBJFPC
| class="header" | Delphi || class="header" | FPC
+
|-
|- class="code"
+
|<syntaxhighlight lang="pascal">
| class="code" | <div class="key">With</div> (SomeObject) <div class="key">do begin</div>
+
Function GetSomeValue(ARecord: PMyRecord):Integer;
  <div class="key">If</div> Assigned(OnMyCallback) <div class="key">then</div>
+
begin
    OnMyCallback; <div class="cmt">//parenthesis not required</div>
+
  If Assigned(ARecord) then
<div class="key">end</div>;
+
    Result:=ARecord.SomeValue
| class="code" |  <div class="key">With</div> (SomeObject) <div class="key">do begin</div>
+
  else
  <div class="key">If</div> Assigned(OnMyCallback) <div class="key">then</div>
+
    Result:=0;
    OnMyCallback(); <div class="cmt">//parenthesis  required</div>
+
end;
<div class="key">end</div>;
+
</syntaxhighlight>
 +
|<syntaxhighlight lang="pascal">
 +
Function GetSomeValue(ARecord: PMyRecord):Integer;
 +
begin
 +
  If Assigned(ARecord) then
 +
    Result:=ARecord^.SomeValue
 +
  else
 +
    Result:=0;
 +
end;
 +
</syntaxhighlight>
 
|}
 
|}
  
;Pri pristupovaní k hodnotám v ukazovateli na záznam, musíte ho najprv dereferencovať
+
=====Pri pristupovaní znakov indexovaného reťazca Vlastnosti objektu, musí byť najprv uzatvorený v zátvorkách =====
 +
 
 +
V Delphi je možné spracovať Vlastnosť priamo ako každú inú konštantu alebo premennú, dokonca i pre prístup k jednotlivým znakom reťazca priamo.
 +
 
 +
V FPC toto nie je možné, hlavne pre indexované vlastnosti. Namiesto toho to musí byť uzatvorené v zátvorkách , kvôli jednoznačnosti. Hoci to nie je vždypravda, je to dobrý zvyk na zváženie. Napríklad
 +
{| border="1" width="800"
 +
! Delphi !! OBJFPC
 +
|-
 +
|<syntaxhighlight lang="pascal">
 +
Type TSomeComponent=class(TComponent)
 +
  //Ďalší kód...
 +
Published
 +
Property MyString:String index 3 read GetMyString;
 +
//Ďalší kód...
 +
End;
 +
 
 +
var
 +
  MyChar:char;
 +
begin
 +
  If Length(MyString)>2 then
 +
    //nie sú potrebné zátvorky
 +
    MyChar:= MyString[3];
 +
    //Ďalší kód...
 +
end;
 +
</syntaxhighlight>
 +
|<syntaxhighlight lang="pascal">
 +
Type TSomeComponent=class(TComponent)
 +
//Ďalší kód...
 +
Published
 +
Property MyString:String index 3 read GetMyString;
 +
//Ďalší kód...
 +
End;
  
V Delphi nie je vyžadovaná dereferencia ukazovateľa na záznam pri pristupovaní k jeho hodnotám, ten môže byť  skutočnosti spracovaný ako záznam samotný alebo akýkoľvek iný objekt. V FPC musí byť najprv dereferencovaný. Napríklad:
+
var
{| class="code"
+
  MyChar:char;
|- 
+
begin
| class="header" | Delphi || class="header" | FPC
+
  If Length(MyString)>2 then
|- class="code"
+
    //niekedy sú potrebné zátvorky
| class="code" | <div class="key">Function</div> GetSomeValue(ARecord: PMyRecord)
+
    MyChar:= (MyString)[3];
  <div class="symbol">:</div> Integer;
+
    //Ďalší kód...
<div class="key">begin</div>
+
end;
  <div class="key">If</div> Assigned(ARecord) <div class="key">then</div>
+
</syntaxhighlight>
    Result<div class="symbol">:=</div> ARecord.SomeValue
 
  <div class="key">else</div>
 
    Result:= <div class="int">0</div>;
 
<div class="key">end</div>;
 
| class="code" | <div class="key">Function</div> GetSomeValue(ARecord: PMyRecord)  
 
  <div class="symbol">:</div> Integer;
 
<div class="key">begin</div>
 
  <div class="key">If</div> Assigned(ARecord) <div class="key">then</div>
 
    Result<div class="symbol">:=</div> ARecord^.SomeValue
 
  <div class="key">else</div>
 
    Result:= <div class="int">0</div>;
 
<div class="key">end</div>;
 
 
|}
 
|}
  
;Pri pristupovaní k znakom indexovanej reťazcovej vlastnosti  objektu, musí byť uzatvorený v zátvorkách
+
=====Pri použití ukazovateľov s premennými alebo funkciami, musíte ich najprv pretypovať na príslušný typ =====
 +
 
 +
Niekedy máte v Delphi prázdnu ukazovateľovú premennú , reprezentujúcu objekt. Hoci to možno vyzerá ako komplexná situácia, je to nezvyčajne bežné, najmä vo veľkých komponentových balíčkoch, ako metóda predcdhádzajúca mnohým kruhovým includes medzi objektmi v rôznych jednotkách.
 +
 
 +
V Delphi je potom možné polať tento prázdny ukazovateľ do funkcie očakávajúcej objekt, bez trápenia sa nad jeho aktuálnym typom, v FPC ho musíte najprv pretypovať. Napríklad
 +
 
 +
{| border="1" width="800"
 +
! Delphi !! OBJFPC
 +
|-
 +
|<syntaxhighlight lang="pascal">
 +
Unit 1
 +
  Type
 +
    TSomeObject=class(TComponent)
 +
      //Ďalší kód...
 +
    End;
 +
 
 +
  Procedure DoSomething(Value: TSomeObject);
 +
  Function GetSomeObject: TSomeObject;
  
V Delphi je možné pracovať s vlastosťami presne ako s inými konštantami alebo premennými, dokonca aj pri priamom pristupovaní, napríklad, k samostatným znakom reťazca, ale toto nie je možné v FPC, hlavne v indexovaných vlastnostiach. Narozdiel od Delphi, toto musí byť uzatvorené v zátvorkách, kvôli odlíšeniu. Hoci toto nemusí byť vždy pravda, je dobrým zvykom toto vždy na to myslieť. Napríklad
+
Unit 2
{| class="code"
+
  Type  
|- 
+
    TSomeComponent=class(TComponent)
| class="header" | Delphi || class="header" | FPC
+
    //Ďalší kód...
|- class="code"
+
    Published SomeObject: Pointer;
| class="code" | <div class="key">Type</div> TSomeComponent= <div class="key">class</div>(TComponent)
+
    //Ďalší kód...
  <div class="cmt">//More code...</div>
+
  End;
<div class="key">Published</div>
 
  <div class="key">Property</div> MyString: <div class="key">String</div> <div class="key">index</div> <div class="int">3</div>
 
    <div class="key">read</div> GetMyString;
 
  <div class="cmt">//More code...</div>
 
<div class="key">End</div>;
 
<div></div>
 
<div class="key">var</div>
 
  MyChar<div class="symbol">:</div> char;
 
<div class="key">begin</div>
 
  <div class="key">If</div> Length(MyString)> <div class="int">2</div> <div class="key">then</div>
 
    <div class="cmt">//no parenthesis needed</div>
 
    MyChar:= MyString[<div class="int">3</div>];
 
  <div class="cmt">//More code...</div>
 
<div class="key">end</div>;
 
| class="code" | <div class="key">Type</div> TSomeComponent= <div class="key">class</div>(TComponent)
 
  <div class="cmt">//More code...</div>
 
<div class="key">Published</div>
 
  <div class="key">Property</div> MyString: <div class="key">String</div> <div class="key">index</div> <div class="int">3</div>
 
    <div class="key">read</div> GetMyString;
 
  <div class="cmt">//More code...</div>
 
<div class="key">End</div>;
 
<div></div>
 
<div class="key">var</div>
 
  MyChar<div class="symbol">:</div> char;
 
<div class="key">begin</div>
 
  <div class="key">If</div> Length(MyString)> <div class="int">2</div> <div class="key">then</div>
 
    <div class="cmt">//parenthesis sometimes needed</div>
 
    MyChar:= (MyString)[<div class="int">3</div>];
 
  <div class="cmt">//More code...</div>
 
<div class="key">end</div>;
 
|}
 
  
 +
Application
 +
var
 +
  MyComponent: TSomeComponent;
 +
begin
 +
  MyComponent.SomeObject:=GetSomeObject;
 +
  //Ďalší kód...
 +
  DoSomething(MyComponent.SomeObject);
 +
end;
 +
</syntaxhighlight>
 +
|<syntaxhighlight lang="pascal">
 +
Unit 1
 +
  Type
 +
    TSomeObject=class(TComponent)
 +
  //Ďalší kód...
 +
  End;
  
;Ukazovatele musíte pretypovať na požadovaný typ, pri použití s premennou alebo funkciou daného typu
+
  Procedure DoSomething(Value: TSomeObject);
 +
  Function GetSomeObject: TSomeObject;
  
Sometimes 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.  
+
Unit 2
 +
  Type
 +
    TSomeComponent=class(TComponent)
 +
    //Ďalší kód...
 +
    Published SomeObject: Pointer;
 +
    //Ďalší kód...
 +
  End;
  
For example -
+
Application
{| class="code"
+
var  
|- 
+
  MyComponent: TSomeComponent;
| class="header" | Delphi || class="header" | FPC
+
begin
|- class="code"
+
   MyComponent.SomeObject:=Pointer(GetSomeObject);
| class="code" |Unit 1
+
  //Ďalší kód...
<div class="key">Type</div> TSomeObject= <div class="key">class</div>(TComponent)
+
  DoSomething(TSomeObject(MyComponent.SomeObject));
  <div class="cmt">//More code...</div>
+
end;
<div class="key">End</div>;
+
</syntaxhighlight>
<div></div>
 
<div class="key">Procedure</div> DoSomething(Value: TSomeObject);
 
<div class="key">Function</div> GetSomeObject: TSomeObject;
 
<div></div>
 
<div class="symbol">Unit 2</div>
 
<div class="key">Type</div> TSomeComponent= <div class="key">class</div>(TComponent)
 
  <div class="cmt">//More code...</div>
 
<div class="key">Published</div>
 
  SomeObject: Pointer<div class="symbol">;</div>
 
  <div class="cmt">//More code...</div>
 
<div class="key">End</div>;
 
<div></div>
 
<div class="symbol">Application</div>
 
<div class="key">var</div>
 
  MyComponent: TSomeComponent<div class="symbol">;</div>
 
<div class="key">begin</div>
 
  MyComponent.SomeObject<div class="symbol">:=</div> GetSomeObject;
 
  <div class="cmt">//More code...</div>
 
  DoSomething(MyComponent.SomeObject)<div class="symbol">;</div>
 
<div class="key">end</div>;
 
| class="code" |Unit 1
 
<div class="key">Type</div> TSomeObject= <div class="key">class</div>(TComponent)
 
  <div class="cmt">//More code...</div>
 
<div class="key">End</div>;
 
<div></div>
 
<div class="key">Procedure</div> DoSomething(Value: TSomeObject);
 
<div class="key">Function</div> GetSomeObject: TSomeObject;
 
<div></div>
 
<div class="symbol">Unit 2</div>
 
<div class="key">Type</div> TSomeComponent= <div class="key">class</div>(TComponent)
 
  <div class="cmt">//More code...</div>
 
<div class="key">Published</div>
 
  SomeObject: Pointer<div class="symbol">;</div>
 
  <div class="cmt">//More code...</div>
 
<div class="key">End</div>;
 
<div></div>
 
<div class="symbol">Application</div>
 
<div class="key">var</div>
 
   MyComponent: TSomeComponent<div class="symbol">;</div>
 
<div class="key">begin</div>
 
  MyComponent.SomeObject<div class="symbol">:=</div> Pointer(GetSomeObject);
 
  <div class="cmt">//More code...</div>
 
  DoSomething(TSomeObject(MyComponent.SomeObject))<div class="symbol">;</div>
 
<div class="key">end</div>;
 
 
|}
 
|}
  
 
==== Resources ====
 
==== Resources ====
  
Delphi 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.
+
Súbory zdrojov Delphi sú špecifické pre Win32 a nie sú kompatibilné s Lazarus, takže ich budete musieť znova vytvoriť a preložiť pomocou '''lazres'''. '''Lazres''' nájdete v podadresári lazarus/tools. Ak máte stiahnutý zdrojový kód Lazarus, najprv ho musíte preložiť:
* cd lazarus/tools
+
cd lazarus/tools
* make install
+
make install
To add a resource to your application:
+
Pre pridanie resource do svojej aplikácie spusťte:
* lazres myresource.lrs mypix.xpm anotherpix.xpm
+
lazres myresource.lrs mypix.xpm anotherpix.xpm
* Add the LResources unit to your Uses clause
+
A potom
* Include the .lrs file you created under the initialization block
+
* pridajte jednotku '''LResources''' do sekcie '''Uses'''
Example:
+
* zahrňte vami vytvorený súbor .lrs do bloku ''initialization''
{| class="code"
+
 
|- class="code"
+
;Príklad:
| class="code" | <div class="key">function</div> TForm1.LoadGlyph(<div class="key">const</div> GlyphName: <div class="key">String</div>): TBitMap;
+
<syntaxhighlight lang="pascal">
<div class="key">begin</div>
+
function TForm1.LoadGlyph(const GlyphName: String): TBitMap;
  Result:= TPixmap.Create<div class="symbol">;</div>
+
    begin
  Result.LoadFromLazarusResource(GlyphName)<div class="symbol">;</div>
+
      Result:= TPixmap.Create;
<div class="key">end</div>;  
+
      Result.LoadFromLazarusResource(GlyphName);
  <div class="cmt">//More code...</div>
+
    end;
  <div class="key">begin</div>
+
    //Ďalší kód...
   Speedbutton1.glyph:= LoadGlyph('mypix')<div class="symbol">;</div>
+
  begin
   <div class="cmt">//More code...</div>
+
   Speedbutton1.glyph:= LoadGlyph('mypix');
  <div class="key">end</div>;
+
   //Ďalší kód...
<div></div>
+
  end
  <div class="key">initialization</div>
+
   <div class="dir">{$I unit1.lrs}</div>
+
  initialization
   <div class="dir">{$I myresource.lrs}</div>
+
   {$I unit1.lrs}
  <div class="key">end</div>.
+
   {$I myresource.lrs}
|}
+
  end.
 +
</syntaxhighlight>
  
== Getting Help ==
+
=== Iná metóda konverzie projektu Delphi/Kylix do Lazarus ===
  
If 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 [http://www.freepascal.org/docs-html/ Documentation] 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 [http://www.freepascal.org/maillist.html mailing lists for the Free Pascal Compiler] or the [http://community.freepascal.org:10000/bboard/ FPC forums] where a lot of experts are subscribed.
+
* premenujte alebo prekopírujte všetky súbory .dfm alebo .xfm na .lfm (skoršie verzie Delphi neposkytovali textový súbor .dfm, konverzný nástroj, by mal byť v adresári \bin a možno ho použiť na konverziu .dfm)
 +
* premeujte súbor .dpr na '''.lpr'''
 +
* urobte potrebné zmeny súboru '''.lpr''':
 +
# pridajte direktívy '''{$mode delphi}{$H+}''' alebo '''{$mode objfpc}{H+}'''
 +
# pridajte jednotku '''Interfaces''' do sekcie uses
 +
# zakomentujte alebo zmažte direktívu {$R *.res}
 +
* urobte potrebné zmeny vo všetkých súboroch jednotiek '''.pas''':
 +
# pridajte direktívu '''{$mode delphi}{$H+}''' alebo '''{$mode objfpc}{H+}'''
 +
# pridajte '''LResources''' a, ak má formulár tlačítka, aj '''Buttons''' do sekcie uses
 +
# zakomentujte alebo zmažte direktívu {$R *.dfm} alebo {$R *.xfm}
 +
# pridajte sekciu '''Initialization''' nakoniec každého súboru jednotky a pridajte do nej direktívu '''{$I unitname.lrs}'''
 +
* vyberte '''Project->New Project from file'''
 +
* zvoľte súbor '''.lpr'''
 +
* v okne 'Create a new project' zvoľte 'Application'
 +
* vybudujte projekt a zaistite ďalšie potrebné opravy, v tomto okamžiku je automaticky vygenerovaný súbor .lpi.
 +
**Môžete sa stretnúť so správou 'Error reading Form', ak to nastane kliknite na 'Continue Loading'
 +
* všetko uložte a máte projekt Lazarus :-)
  
There 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 [http://www.tamaracka.com/search.htm search] engine specifically for the Borland usenet archives. Mer Systems Inc. provides a similar search [http://www.mers.com/searchsite.html engine]. Another outstanding source of information along with a sitewide [http://www.efg2.com/Lab/search.htm search] capability is Earl F. Glynn's Computer Lab and Reference [http://www.efg2.com/ Library].
+
== Získanie nápovedy ==
  
== Packaging and Releasing your component ==
+
Ak sa počas konverzie stretnete sproblémom, ktorý neviete vyriešiť, sú široké možnosti ako získať pomoc:
  
=== Creating a Lazarus package for your component(s) ===
+
=== Documentation ===
  
Creating 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.
+
* Pre čisto Object Pascal a FPC problémy, jen ajlepšie začať s [http://www.freepascal.org/docs-html/ Dokumentáciou Free Pascal] od Michaëla Van Canneyta a Floriana Klämpfla.
 +
* Pre problémy viac orientované na Lazarus, hľadajte aj v [[Main Page|Dokumentácii projektu Lazarus]].
  
=== Documentation ===
+
=== Partnerská podpora ===
  
The 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.
+
* Mailing listy - otázky môžete posielať do niektorého z [http://www.freepascal.org/maillist.html mailing listov pre Free Pascal Compiler] alebo [http://community.freepascal.org:10000/bboard/ FPC fór], kde je prihlásených veľa odborníkov.
 +
* IRC - na irc.freenode.net: [irc://irc.freenode.net/fpc #fpc] rpe FPC alebo [irc://irc.freenode.net/lazarus-ide #lazarus-ide] pre Lazarus
  
Using 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.
+
=== Vedomostné bázy ===
  
=== Creating a Code Release Page ===
+
Existujú aj online vyhľadávacie a vedomostné bázy, ktoré tiež môžu poskytnúť významnú pomoc pre učení sa nových techník a riešení problémov:
 +
* Tamarack Associates poskytuej rýchly [<!--http://www.tamaracka.com/search.htm-->http://codenewsfast.com/ vyhľadávací] stroj špecifické pre archívy Borland usenet.
 +
* Mer Systems Inc. poskytuje podobný vyhľadávací [http://www.mers.com/searchsite.html stroj].
 +
* Ďalšie zdroje informácií spolu s s možnosťou [http://www.efg2.com/Lab/search.htm hľadania] je Earl F. Glynn's Computer Lab and Reference [http://www.efg2.com/ knižnica].
  
The 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.
+
== Balíčkovanie a Uvoľňovanie komponentov ==
  
The following procedure will let you create a Code Release Page with your browser:
+
=== Vytvorenie Lazarus balíčka s vašim komponentom ===
  
* Edit the [[Code And Components]] page and add a project name wiki link entry for your component in the "Released Components" section. Save the modified page.
+
Vytvorenie balíčka výrazne zjednodušuje inštaláciu Vymi skonvertovaného kódu... hlavne ak poskytujete viac ako jeden komponent. Mattias Gärtner má napísaný prehľad [[Lazarus Packages/sk|Balíčky Lazarus]], ktorý si musíte prečítať najprv.
  
* Go to the [[Component Release Template]], select all and copy. Hit the back button on your browser to return to the [[Code And Components]] page.
+
=== Dokumentácia ===
* Click on your new wiki component name entry and paste the release template into the blank edit box.
 
* Edit the template accordingly and hit save.
 
* Do edit-saves until your document looks the way you want it to.
 
  
=== Creating a Comment Page for your component ===
+
Cieľom tejto stránky a formátu wiki je vytvoriť profesionálnu dokumentáciu ľahko a rýchlo. wiki tiež umožňuje ihneď vidieť výsledok Vašich príspevkov a robiť zmeny v reálnom čase.
  
When your component is posted to the Sourceforge File Release System, the Lazarus-CCR admins will lock your code release page to prevent the unlikely event of someone changing your license, name or other release info.
+
Použitie Lazarus wiki pre vytváranie vzhľadnej dokumentácie je veľmi jednoduché. Ak ste ešte wiki nepoužívali, oboznámte sa s ňou pomocou [[Sand Box/sk|pieskoviska]] - cvičnej oblasti.
  
While you're building your code release page, you have the option to create another wiki link to a "news and comments" page for your component that will always be writable. This is called a ComponentCommentTemplate. The link to it should be added to the bottom of the code release template where there's a topic heading and a brief howto. The wiki name link should be your wiki component name with a Comments suffix like [[EpikTimer Comments]] or [[JpegLazarus Comments]] . The comments page will remain writable to collect feedback from users and for you to post updated information.
+
=== Tvorba Code Release stránky ===
  
A comment page can be added like this:
+
Stránka Code Release obsahuje informácie o vašom komponente, ktoré má prípadný sťahovač vedieť, ako licencia, zamýšľaná polatforma, stav (alpha, beta, stable...), odkiaľ sťahovať, kto ho napísal, či je odstupná podpora, atď.
  
* Edit your component release page and add the wiki comment link (in the format described above). Save the modified page.
+
Pre vytvorenie svojej stránky Code Release vo svojom prehliadači:
* Go to the [[Component Comment Template]] , select all and copy. Hit the back button on your browser to return to your component release page.
 
* Click on the comment entry entry you created and paste the comment template into the edit box.
 
* Edit the template accordingly and hit save.
 
* Do edit-saves until your comment page looks the way you want it to.
 
  
While the Lazarus-CCR admins initially lock code release pages, any member of the project can use their shell acount to unlock, edit and re-lock their pages.
+
* prejdite na [[Release new component]]
 +
* napíšte meno komponentu do editačného poľa a kliknite na ''Create Article''
 +
* vyplňte šablónu a stlačte uložiť.
 +
* upravte stránku [[Components and Code examples]] pridaním odkazu na svoju novo vytvorenú stránku do sekcie "Uvoľnené komponenty" a ulože upravenú stránku.
  
 +
=== Poslanie komponentu ===
  
=== Submitting the component ===
+
Ak ste technik uvoľňovania (''release technician'') projektu, uploadnite svoj komponent do SourceForge File Release System a pridajte ho na zoznam uvoľnených balíčkov. Inak ho pošlite niektorému z administrátorov projektu ([[User:Tom |Tom Lisjac]] alebo [[User:Vincent |Vincent Snijders]]) a budep ridaný do úložiska. Pred uploadom do SourceForge, majte vytvorenú ''stránku Code Release'' s popisom komponentu, podľa predchádzajúceho popisu.
  
If 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 and we'll add it to the repository. We'll also put it into CVS so you'll continue to have access to it.
+
Ak si myslíte, že potrebujete pokračovať s vývojom komponentu, môžeme ho tiež uložiť do SVN, aby ste k nemu mali stále prístup. Ak nás unavia úpravy z poslaných patcheov, poskytneme Vám prístup so zápisom do SVN, aby ste mohli odovzdávať svoje patche sami. Detaily nájdete v [[Using the Lazarus-ccr SVN repository|Použitie SVN úložiska Lazarus]].
  
 
== Contributors and Changes ==
 
== Contributors and Changes ==

Latest revision as of 01:32, 11 February 2020

Deutsch (de) English (en) español (es) français (fr) 日本語 (ja) português (pt) русский (ru) slovenčina (sk)

Cieľom tejto príručky je zdokumentovať niektoré zo špecifických rozdielov , ktoré sa najčastejšie vyskytujú pri konverii počas prekladu existujúceho kódu z Delphi do Lazarus.

Tento článok je o konverzii existujúceho zdrojového kódu Delphi alebo Kylix tak, aby pracoval s prekladačom Free Pascal a IDE Lazarus. Hoci majú Lazarus a Free Pascal spoločné črty s Delphi a Kylix, nejedná sa o ich klony. Existuje veľa rozdielov vo volaní knižníc a konvencii... a v niektorých oblastiach je Free Pascal rozšírený a môže byť náročnejší na správnu syntax. Pozrite si príručku Lazarus pre používateľov Delphi, v ktorej nájdete popis niektorých funkčných rozdielov.

Cieľom tejto príručky je zdokumentovať niektoré zo špecifických rozdielov, s ktorými sa často stretnete počas procesu konverzie kódu pri prekladaní existujúceho kódu z Delphi na Lazarus.

Tento dokument bol umiestnený na Wiki aby mohol byť jednoducho rozšírený každým, kto sa stretol s unikátnym problémom a zverejní ho aj pre ostatných.

Výber komponentov alebo knižnice pre konverziu

Kde hľadať kód na konverziu

Na nete je dostupného veľa kódu, ktorý môže byť konvertovaný pre použitie s FreePascal a Lazarus. Tu je Stránka kódov, ktorá je dobrým začiatkom. Prosím vás, pridajte na do nej, ak poznáte nejaký iný dobrý odkaz. Turbo-Power Software uvoľnil ich celú ponuku pod MPL. Zoznam dostupných balíčkov môžete nájsť na Sourceforge.

Aby sme predišli duplicitným snahám, balíčky, ktoré už sú konvertované sú vypísané na stránke Components and Code examples. Ak ste prekonvertovali balíček alebo na nejakom pracujete, pridajteprosím poznámku na stránku [Current Projects].

Licencovanie

Licencie existujúceho kódu siahajú od freeware/public domain po reštriktívne verzie, ktoré bránia modifikácii, redistribúcii a komerčnému použitiu. Pred konverziou každého balíčka, je dobré preskúmať jeho licenciu a zaistiť, že je kompatibilná s Lazarus a Free Pascal. Výber licencie je veľmi dôležitý pri komponentoch, pretože umiestnenie jedného na formulár môže navodiť nechcenú alebo nekompatibilnú licenciu na celú aplikáciu.

Keď konvertujete komponenty, rešopektujte prosím elanie pôvodného autora a ponechajte všetky copyrighty a licenčné hlavičky spolu s emailovou adresou a url. Je slušné a často i užitočné informovať autora, že jeho komponent je konvertovaný... hlavne ak je komponent pod obmedzujúcou licenciou. Nový záujem o staré alebo zabudnuté komponenty môže často podnietiť autora na revíziu originálu a zmeniť reštriktívnu licenciu.

Vo všeobecnosti, Public Domain (freeware) a LGPL/MPL sú najprispôsobiteľnejšie pre distribúciu komponentov. Dobrým začiatkom pre nájdenie ďalších informácií môže byť definícia Open Source. Existuje niekoľko porovnaní, ktoré môžu pomôcť objasniť ako pracujú rôzne typy licencií a aký budú mať dosah na kód, ku ktorému patria. Hľadajte "open source license comparison".

Závislosti

Ďalším krokom pred začatím práce na konverzii je overiť si, že kód nie je závislý na na iných balíčkoch, ktoré možno nemáte alebo predstavujú veľkú výzvu pre konverziu. Niektoré ponuky freeware sú obmedzené alebo rozšírené vlastnené balíčky, ktoré často nie sú dostupné alebo prichádzajú s nevhodnou licenciou.

Poznámky k prekladaču

Viz:

Poznámky k platforme a OS

Lazarus a Free Pascal sú nadplatformové a nadarchitektúrne vývojové nástroje. Naopak, väčšina existujúceho kódu Delphi bola špecificky navrhnutá pre beh na procesore Intel a s Win32. Ak má Váš komponent veľa špecifického kódu Win32, bude možno múdrejšie skúsiť nájsť alternatívu, ktorá je menej závislá na platforme. Ale nenechajte sa tým zastaviť... je naozaj prekvapujúce čo všetko LCL podporuje!

Konverzia

Nastavenie IDE Lazarus pre konverziu projektu

Vytvorenie skúšobného projektu

  • Umiestnite konvertovaný kód do podadresára (napr: convertdir)
  • Spusťte Lazarus
  • File->Save All do adresára convertdir. Zmysluplné mená pre Project a predvolenú jednotku sú voliteľné.
  • Otvorte "základnú" konvertovanú jednotku v convertdir
  • Pridajte ju do projektu: Project->Add Active Unit to Project
  • Spusťte Tools->Quick Syntax Check alebo Run->Build All, čím začnete.

Na čo treba dať pozor

  • Mená súborov sú citlivé na veľkosť pri prekladačoch série 1.0.x. Ak pracujete s touto verziou, premenujte všetky súbory malými písmenami. Ak to neurobíte, ľahko dostanete chybové hlásenie File not found.

Zdrojové kódy Delphi VCL a Kylix CLX v Lazarus

Pri konverzii zdrojových kódov Delphi/Kylix, je často užitočné použiť Find declaration, aby ste sa presvedčili, či daná funkcia funguje. IDE Lazarus môže analyzovať zdrojové kódy Delphi/Kylix. Na to potrebujete nastaviť niektoré cesty a nastavenia prekladača. Jednoducho to môžete nastaviť pomocou Environment->CodeTools Defines Editor->Insert Template.

Problémy konverzie a ich riešenie

Ekvivalenty Delphi/Kylix súborov v Lazarus

Delphi / Kylix Popis Lazarus Popis
.pas

.dfm/.xfm,

.dcu/.dpu,

.dpr(main project file),

.res,

.dof/.kof

---

---

---

súbor zdrojového kódu Delphi,

formulár Delphi,

preložená jednotka Delphi,

projekt Delphi,

Resource súbor Windows,

súbor volieb Delphi

.pas, .pp

.lfm,

.o,

.lpr

---

---

.lrs,

.lpi(hlavný súbor projketu),

.ppu

súbor jednotky Pascal,

dátový súbor formulára,

súbor preloženej jednotky,

súbor projektu,

Resource súbor,

súbor volieb projektu,

Resource súbor Lazarus,

informačný súbor projektu Lazarus,

popisný súbor jednotky FPC

Teda súbor Delphi .dcu zhruba korenšponduje so súbormi FPC .o a .ppu spolu v jednom súbore. Súbor .PPU je prevažne hlavičková (interface) časť, the .o prevažne časť implementation. Hlavnou výnimkou sú inlined funkcie, ktoré vo forme to-be-inlined v .ppu.

Konverzia projektov/formulárov/jednotiek Delphi do Lazarus

Premenujte alebo prekopírujte súbor .dpr na súbor .lpr. Zakomentujte alebo odstráňte direktívu

{$R *.res}

a pridajte direktívu

{$mode delphi}{$H+}

alebo

{$mode objfpc}{$H+}

do súboru .lpr.

S touto konverziou Vám môže pomôcť Lazarus IDE prostredníctvom položky menu Tools menu>Convert Delphi Project to Lazarus Project. Vyžiada si zadanie súboru .dpr (projekt Delphi) a skonvertuje ho na .lpr, ďalej vytvorí súbor .lpi a skonveruje všetky jednotky.

Mnoho existujúcich formulárov Delphi môžete konvertovať pomocou IDE Lazarus pomocou zabudovaného konvertora formulárov DFM na LFM. Nájdete ho v menu Tools->Convert DFM file to LFM. Vyvolajte súborový dialóg, vyberte *.dfm a konvertor urobí zvyšok.

Ak potrebujete konvertovať celú jednotku (s alebo bez formulára), Lazarus má tiež zabudovaný nástroj: Convert Delphi unit to Lazarus unit, ktorý urobí nasledujúce:

  1. upraví veľkosť písmen v sekciách uses a iclude.
  2. konvertuje súbory .dfm na súbory .lfm (bez kontroly obsahu, len formát)
  3. vytvorí prázdny súbor .lrs (obsah bude pridaný neskôr)
  4. pridá direktívu
{$mode delphi}
  1. nahradí jednotku Windows jednotkou LCLIntf
  2. ak je to potrebné, pridá jednotku LResources
  3. odoberie jednotku Variants
  4. odoberie direktívu
{$R *.dfm}
  1. pridá do sekcie initialization direktívu
{$i unit.lrs}

Toto umožní rýchlu a ľahkú konverziu väčšiny jednotiek z formátu Delphi do formátu Lazarus. Tento nástroj nevykonáva žiadnu kontrolu platnosti alebo automatické zmeny syntaxe, tak všetky potrebné zmeny syntaxe, dodatočné zmeny jednotiek, alebo zmeny dfm/pas pre rozdiely v prvkoch/komponentoch, musíte urobiť manuálne, pomocou niekoľkých sprievodcov, ktorý vám pomôžu niektoré kroky, hlavne opravovanie konvertovaných formulárov (lfm).

Výber správneho módu prekladača

Prekladač Free Pascal podporuje 5 rôznych módov Pascalu. Napríklad TP pre Turbo Pascal, vám dovolí prekladať jednotky Turbo Pascal. Má i mód pre kompatibilitu s DELPHI, ktorý môžete nastaviť na uľahčenie konverzie kódu. Lazarus preferuje mód OBJFPC, ktorý je skoro ako mód DELPHI, ale bez mnohoznačnosti syntaxe Delphi. Tu sú dôležité body:

Mód môže byť zvolený na príkazovom riadku alebo na začiatku zdrojového kódu. Použitie príkazového riadku má výhodu, že nemusíte meniť zdrojový kód, ale i nevýhody, ktoré musia vysvetliť iní.

Väčšinu jednotiek Delphi môžete jednoducho preložiť pomocou Free Pascal pridaním tejto konštrukcie, hneď za meno jednotky

{$IFDEF FPC}
  {$MODE DELPHI}
{$ENDIF}

Ďalšie podrobnosti o módoch Free Pascal nájdete v dokumentácii Free Pascal.

Viac-platformové poznámky

  • Zahrnutý assembler býva vždy problémom, pretože zväzuje kód s architektúrou Intel. Niektorí vývojári robia prototypy algoritmov v Pascale a pomocou ifdef vkladajú oprimizovaný assembler. Našťastie Turbo-Power toto urobil na mnohých miestach svojho kódu. Ak je toto prípad balíčka, ktorý chcete konvertovať, prepnite ho späť do Pascalu.
  • Neodkazujte na špecifické pamäťové miesto, ako dátová oblasť BIOS. Zistite čo kód potrebuje a skúste nájsť cezplatformovú alternatívu.
  • Nepoužívajte triky, ktoré sú špecifické pre procesor (ako použitie Intel TSC) bez zatvorenia svojho kódu do ifdef pre platformu potrebnú pre kód... a poskytnutia alternatívy pre prostredia, ktoré nie sú hardvérovo kompatibilné.
  • Ak potrebujete nejaký kód, špecifický pre OS, používajte IFDEF. Viz zoznam makier neskôr.

Užitočné premenné prekladača

Pre písanie kódu, ktorý sa má správať na rôznych systémoch rôzne, môžete použiť direktívy

{$IFDEF Name}

Pričom Name môže byť

  • LCL - táto premenná je definovaná pri použití balíčka LCL a je vhodná pre písanie kódu, ktorý pracuje s LCL a Delphi.
{$IfDef LCL}
  • FPC - táto premenná je definovaná pri použití prekladača Free Pascal a je vhodná pre písanie kódu, ktorý pracuje s Free Pascal a Delphi.
{$IfDef FPC}
  • LCLGtk, LCLWin32, LCLQt, ... - tieto premenné sú definované keď je použitý balíček LCL a špecifický WidgetSet. Užitočné pre písanie kódu, pracuje s LCL na určitej platforme.
{$IfDef LCLGtk}
{$IfDef LCLWin32}
{$IfDef LCLQt}
... 
  • Unix, Win32,... - tieto sú definované pre cieľový OS. Delphi definuje Linux, Win32 a MSWindows. Free Pascal beží na oveľa väčšom počte platforiem a tak je vhodné použiť oveľa všeobecnejšie položky. Napríklad Unix je definované pre Linux, FreeBSD, NetBSD a OpenBSD, na ktorých už Lazarus beží.
{$IfDef Unix}
{$IfDef Win32}
...
Pre prácu v Kylix použite nasledujúcu konštrukciu:
{$IfDef Linux}
  {$Define Unix}
{$EndIf}
  • ENDIAN_BIG - táto premenná je definovaná na procesoreoch ako PowerPC (napr. staré počítače Apple, tj. do MacOSX 10.2), ktoré majú obrátené poradie ako Intel kompatibilné procesory.
{$IfDef ENDIAN_BIG}

Ďalšie podrobnosti nájdete v dokumentácii Free Pascal.

Podpora 32bit/64bit

Ukazovatele pod 64bit potrebujú 8 bajtov namiesto 4 na 32bit. Typ 'Integer' zostáva pre kompatibilitu s 32bit. To znamená, že už nepotrebujete pretypovanie ukazovatele na integer a naopak. FPC definuje dva nové typy:

  • PtrInt je 32bit Integer so znamienkom na 32bit platformách a 64bit Integer sp znamienkom na 64bit platformách.
  • PtrUInt, je rovnaké ako predchádzajúce s tým rozdielom, že sa jedná o Integer bez znamienka.

Pre kód, ktorý má pracovať s Delphi a FPC použite:

 {$IFNDEF FPC}
 type
   PtrInt = integer;
   PtrUInt = cardinal;
 {$ENDIF}

Nahrďte všetky

integer(SomePointerOrObject)

týmto

PtrInt(SomePointerOrObject)

Hľadanie chýbajúcich identifikátorov

V organizácii LCL, v porovnaní s Delphi VCL, sú rozdiely. Ak sa stretnete s chybovým hlásením prekladača not found pri významných triedach alebo identifikátoroch, je veľká šanca, že je v inej jednotke. Úplný rížový odkaz môžete nájsť pomocou programu grep na lazarus/docs/xml alebo na podadresár lcl.

Napríklad bežne používaný TButton vyvoláva v kóde Delphi chybu, pretože je umiestnený v jednotke buttons.pp. Tento príkaz nájde správnu jednotku veľmi rýchlo (v adresári zdrojového kódu Lazarus):

 grep -in ' tbutton =' lcl/*

Rozdiely v dôležitých jednotkách Lazarus a Delphi

Prosím dopĺňajte túto časť!;
  • Windows -> LCLIntf, LCLType, LCLProc, VCLGlobals, ...

Keďže LCL nie je špecificky Windowsová knižnica, kód, ktorý je v jednotke Windows z Delphi pre priamy prístup k Win32 API je abstrahovaný do samostatných rozhraní, do ktorých môžete pristupovať z jednotky LCLIntf. Majte na pamäti, že Lazarus neemuluje Win32, tak veľa funkcií cýba a niektoré nepracujú ako ich Win32 náprotivky. Tieto funkcie existujú len pre kompatibiltu s Delphi a sú určené len pre rýchly a (s)prostý prenos. LCL tiež tiež nemá mnoho z typov, tak je často potrebná jednotka LCLType a niekedy aj VCLGlobals. LCLProc tiež obsahuje niekoľko funkcií, ktoré môžu byť užitočné pre najnižšiu úroveň obslúh ako FreeThenNil, DeleteAmpersands na odstránenie dodatočných ampersandov z reťazcov pre ovládacie prvky (& - && atď).

Jednotka Interfaces musí byť zahrnutá v súbore .lpr file pre správnu inicializáciu príslušného WidgetSet.

  • Messages->LMessages

Správy TControl pre spätné volania (callbacks) udalostí Win32 vo formáte WM_CALLBACK a ich príslušná štruktúra je väčšinou umiestnená v jednotke Messages v Delphi. V LCL tieto typy správ a ich štruktúry zvyčajne nájdete v LMessages, zvyčajne premenované z WM_ na LM_, tak sa napríklad WM_MOUSEENTER stáva LM_MOUSEENTER, a TWMMouse sa stáva TLMMouse.

  • Graphics, Controls->GraphTypes, GraphMath, Graphics, Controls

Na zjednodušenie niektorých vecí a prerušenie zložitosti krúženia medzi jednotkami, sú abstrahované niektoré typy do zdieľanej jednotky, zvanej GraphType, ktorá zahŕňa potreby, ktoré sú v Delphi umiestnené v jednotkách Graphics alebo Controls. Tak ju niekedy budete potrebovať zahrnúť, rovnako ako jednotku GraphMath, ktorá, hoci nekompatibilne s Delphi, pridáva ďalšie užitočné funkcie, ako TFloatPoint pre presnosť, užitožné rutiny pre spoluprácu s bezériovými krivkami, čiarami a oblúkmi, ako aj perťažené operátory pre použitie s typmi TPoints a TRect, ako napr.

Point1 := Point2 + Point3

či porovnanie dvoch pravouholníkov ako

if (rect1 = rect2) then ...
  • Mask->MaskEdit

Kvôli inteligentnejšej názvovej úvahe, je jednotka pre TMaskEdit nazvaná [Mask Edit] na rozdiel od tochu nešikovného Mask, ako tomu je v mnohých verziách Delphi.

  • StdCtrls->StdCtrls,Buttons

V mnohých verziách Delphi je TButton umiestnený v StdCtrls, zatiaľ čo TSpeedButton a TBitBtn sú v Buttons. Pre zjednodušenie vkladá LCL všetky tlačítka do Buttons, čo môže niekedy sťažiť konverziu, preto je vhodné túto jednotku vždy zahrnúť.

Rozdiely vo vlastnostiach a metódach Delphi -> FPC/LCL

  • v LCL je Canvas obsahnutý v TBitmap

Sémantické rozdiely

Poradie vyhodnocovania parametrov

Delphi garantuje, že všetky parametre sú vyhodnocované z ľava do prava. FPC takúto garanciu neposkytuje a môže vyhodnocovať parametre v ľubovoľnom poradí, kvôli generovaniu optimálneho kódu.

Vnorené procedúry/funkcie sú procedurálne premenné

Delphi posiela framepointer rodičovskej procedúry vždy do zásobníka a vždy volá ich opätovné odstránenie. To znamená, že ak pokiaľ nepristupujute k premenným rodičovskej procedúry, môžete poslať adresu vnorenej procedúry do inej funkcie, ktorá ich potom môže volať ako každú procedurálnu premennú.

FPC vždy posiela framepointer rodičovskej procedúry ako skrytý prvý parameter, podľa aktuálnej konvecie volania, čiže ak voláte vnorenú procedúru ako bežnú procedurálnu premennú, všetky parametre budú posunuté o jednu pozíciu.

Inými slovami, nevolajte vnorené procedúry pomocou procedurálnych premenných.

Syntaktické rozdiely

Prosím dopĺňajte túto kapitolu!

Kvôli zdedenej prísnosti FPC, budú potrebné niektoré syntaktické zmeny, napriek direktíve

{$Mode Delphi}

pracuje oveľa pomalšie ako Delphi. Kvôli tomu oveľa viac vyhovujú pravidlá syntaxe {$Mode ObjFPC} ak je to možné, vrelo doporučujem, dokonca i keď bude kód zdieľaný medzi Delphi a LCL.

Niektoré z týchto sú jednoducho lepšie praktiky kódovania a niekedy pretože mód Delphi nie je celkom presný, alebo v niektorých prípadoch kód akceptovaný Delphi nefunguje podľa očakávania s Free Pascal, hoci môže byť preložený. Tkže nakoniec nie všetky sú presne vyžadované, nasledujúci zoznam zmien vždy zvážte:

Pri priraďovaní vstupného bodu obsluhy udalosti, pridajte predponu "@"

Napríklad, môžete manuálne priradiť udalosť tlačítka

Delphi OBJFPC
begin
  if not Assigned(MyButton.OnClick) then 
    MyButton.OnClick:= SomeFunction;
    //@ nie je vyžadované
    //ďalší kód...
end;
begin
  if not Assigned(MyButton.OnClick) then
    MyButton.OnClick:= @SomeFunction;
    //@ je vyžadované
    //ďalší kód...
end;
Pri volaní procedurálnej premennej používajte túto syntax: theprocname()

V Delphi nie je rozdiel medzi výsledkom funkcie a premennou, ale v FPC je. Preto volanie function, hoci aj nemá parametre, musí obsahovať zátvorky. Napríklad

Delphi OBJFPC
With (SomeObject) do 
begin
  If Assigned(OnMyCallback) then
    OnMyCallback;
    //zátvorky nie sú vyžadované
end;
With (SomeObject) do 
begin
  If Assigned(OnMyCallback) then
    OnMyCallback();
    //zátvorky sú vyžadované
end;
Pri pristupovaní k hodnotám v ukazovateli na záznam ho musíte najprv dereferencovať

V Delphi nie je nutné dereferencovať ukazovateľ na záznam pre prístup k hodnotám v ňom, môže byť spracovaný presne ako záznam samotný, či iný objekt.

V FPC musí byť najprv dereferencovaný, napríklad:

Delphi OBJFPC
Function GetSomeValue(ARecord: PMyRecord):Integer;
begin
  If Assigned(ARecord) then
    Result:=ARecord.SomeValue
  else
    Result:=0;
end;
Function GetSomeValue(ARecord: PMyRecord):Integer;
begin
  If Assigned(ARecord) then
    Result:=ARecord^.SomeValue
  else
    Result:=0;
end;
Pri pristupovaní znakov indexovaného reťazca Vlastnosti objektu, musí byť najprv uzatvorený v zátvorkách

V Delphi je možné spracovať Vlastnosť priamo ako každú inú konštantu alebo premennú, dokonca i pre prístup k jednotlivým znakom reťazca priamo.

V FPC toto nie je možné, hlavne pre indexované vlastnosti. Namiesto toho to musí byť uzatvorené v zátvorkách , kvôli jednoznačnosti. Hoci to nie je vždypravda, je to dobrý zvyk na zváženie. Napríklad

Delphi OBJFPC
Type TSomeComponent=class(TComponent)
  //Ďalší kód...
Published
Property MyString:String index 3 read GetMyString;
//Ďalší kód...
End;

var
  MyChar:char;
begin
  If Length(MyString)>2 then
    //nie sú potrebné zátvorky
    MyChar:= MyString[3];
    //Ďalší kód...
end;
Type TSomeComponent=class(TComponent)
//Ďalší kód...
Published
Property MyString:String index 3 read GetMyString;
//Ďalší kód...
End;

var
  MyChar:char;
begin
  If Length(MyString)>2 then
    //niekedy sú potrebné zátvorky
    MyChar:= (MyString)[3];
    //Ďalší kód...
end;
Pri použití ukazovateľov s premennými alebo funkciami, musíte ich najprv pretypovať na príslušný typ

Niekedy máte v Delphi prázdnu ukazovateľovú premennú , reprezentujúcu objekt. Hoci to možno vyzerá ako komplexná situácia, je to nezvyčajne bežné, najmä vo veľkých komponentových balíčkoch, ako metóda predcdhádzajúca mnohým kruhovým includes medzi objektmi v rôznych jednotkách.

V Delphi je potom možné polať tento prázdny ukazovateľ do funkcie očakávajúcej objekt, bez trápenia sa nad jeho aktuálnym typom, v FPC ho musíte najprv pretypovať. Napríklad

Delphi OBJFPC
Unit 1
  Type 
    TSomeObject=class(TComponent)
      //Ďalší kód...
    End;

  Procedure DoSomething(Value: TSomeObject);
  Function GetSomeObject: TSomeObject;

Unit 2
  Type 
    TSomeComponent=class(TComponent)
    //Ďalší kód...
    Published SomeObject: Pointer;
    //Ďalší kód...
  End;

Application
var 
  MyComponent: TSomeComponent;
begin
  MyComponent.SomeObject:=GetSomeObject;
  //Ďalší kód...
  DoSomething(MyComponent.SomeObject);
end;
Unit 1
  Type 
    TSomeObject=class(TComponent)
   //Ďalší kód...
  End;

  Procedure DoSomething(Value: TSomeObject);
  Function GetSomeObject: TSomeObject;

Unit 2
  Type
    TSomeComponent=class(TComponent)
    //Ďalší kód...
    Published SomeObject: Pointer;
    //Ďalší kód...
  End;

Application
var 
  MyComponent: TSomeComponent;
begin
  MyComponent.SomeObject:=Pointer(GetSomeObject);
  //Ďalší kód...
  DoSomething(TSomeObject(MyComponent.SomeObject));
end;

Resources

Súbory zdrojov Delphi sú špecifické pre Win32 a nie sú kompatibilné s Lazarus, takže ich budete musieť znova vytvoriť a preložiť pomocou lazres. Lazres nájdete v podadresári lazarus/tools. Ak máte stiahnutý zdrojový kód Lazarus, najprv ho musíte preložiť:

cd lazarus/tools
make install

Pre pridanie resource do svojej aplikácie spusťte:

lazres myresource.lrs mypix.xpm anotherpix.xpm

A potom

  • pridajte jednotku LResources do sekcie Uses
  • zahrňte vami vytvorený súbor .lrs do bloku initialization
Príklad
 function TForm1.LoadGlyph(const GlyphName: String): TBitMap;
    begin
      Result:= TPixmap.Create;
      Result.LoadFromLazarusResource(GlyphName);
    end;
    //Ďalší kód...
 begin
   Speedbutton1.glyph:= LoadGlyph('mypix');
   //Ďalší kód...
 end
 
 initialization
   {$I unit1.lrs}
   {$I myresource.lrs}
 end.

Iná metóda konverzie projektu Delphi/Kylix do Lazarus

  • premenujte alebo prekopírujte všetky súbory .dfm alebo .xfm na .lfm (skoršie verzie Delphi neposkytovali textový súbor .dfm, konverzný nástroj, by mal byť v adresári \bin a možno ho použiť na konverziu .dfm)
  • premeujte súbor .dpr na .lpr
  • urobte potrebné zmeny súboru .lpr:
  1. pridajte direktívy {$mode delphi}{$H+} alebo {$mode objfpc}{H+}
  2. pridajte jednotku Interfaces do sekcie uses
  3. zakomentujte alebo zmažte direktívu {$R *.res}
  • urobte potrebné zmeny vo všetkých súboroch jednotiek .pas:
  1. pridajte direktívu {$mode delphi}{$H+} alebo {$mode objfpc}{H+}
  2. pridajte LResources a, ak má formulár tlačítka, aj Buttons do sekcie uses
  3. zakomentujte alebo zmažte direktívu {$R *.dfm} alebo {$R *.xfm}
  4. pridajte sekciu Initialization nakoniec každého súboru jednotky a pridajte do nej direktívu {$I unitname.lrs}
  • vyberte Project->New Project from file
  • zvoľte súbor .lpr
  • v okne 'Create a new project' zvoľte 'Application'
  • vybudujte projekt a zaistite ďalšie potrebné opravy, v tomto okamžiku je automaticky vygenerovaný súbor .lpi.
    • Môžete sa stretnúť so správou 'Error reading Form', ak to nastane kliknite na 'Continue Loading'
  • všetko uložte a máte projekt Lazarus :-)

Získanie nápovedy

Ak sa počas konverzie stretnete sproblémom, ktorý neviete vyriešiť, sú široké možnosti ako získať pomoc:

Documentation

Partnerská podpora

Vedomostné bázy

Existujú aj online vyhľadávacie a vedomostné bázy, ktoré tiež môžu poskytnúť významnú pomoc pre učení sa nových techník a riešení problémov:

  • Tamarack Associates poskytuej rýchly vyhľadávací stroj špecifické pre archívy Borland usenet.
  • Mer Systems Inc. poskytuje podobný vyhľadávací stroj.
  • Ďalšie zdroje informácií spolu s s možnosťou hľadania je Earl F. Glynn's Computer Lab and Reference knižnica.

Balíčkovanie a Uvoľňovanie komponentov

Vytvorenie Lazarus balíčka s vašim komponentom

Vytvorenie balíčka výrazne zjednodušuje inštaláciu Vymi skonvertovaného kódu... hlavne ak poskytujete viac ako jeden komponent. Mattias Gärtner má napísaný prehľad Balíčky Lazarus, ktorý si musíte prečítať najprv.

Dokumentácia

Cieľom tejto stránky a formátu wiki je vytvoriť profesionálnu dokumentáciu ľahko a rýchlo. wiki tiež umožňuje ihneď vidieť výsledok Vašich príspevkov a robiť zmeny v reálnom čase.

Použitie Lazarus wiki pre vytváranie vzhľadnej dokumentácie je veľmi jednoduché. Ak ste ešte wiki nepoužívali, oboznámte sa s ňou pomocou pieskoviska - cvičnej oblasti.

Tvorba Code Release stránky

Stránka Code Release obsahuje informácie o vašom komponente, ktoré má prípadný sťahovač vedieť, ako licencia, zamýšľaná polatforma, stav (alpha, beta, stable...), odkiaľ sťahovať, kto ho napísal, či je odstupná podpora, atď.

Pre vytvorenie svojej stránky Code Release vo svojom prehliadači:

  • prejdite na Release new component
  • napíšte meno komponentu do editačného poľa a kliknite na Create Article
  • vyplňte šablónu a stlačte uložiť.
  • upravte stránku Components and Code examples pridaním odkazu na svoju novo vytvorenú stránku do sekcie "Uvoľnené komponenty" a ulože upravenú stránku.

Poslanie komponentu

Ak ste technik uvoľňovania (release technician) projektu, uploadnite svoj komponent do SourceForge File Release System a pridajte ho na zoznam uvoľnených balíčkov. Inak ho pošlite niektorému z administrátorov projektu (Tom Lisjac alebo Vincent Snijders) a budep ridaný do úložiska. Pred uploadom do SourceForge, majte vytvorenú stránku Code Release s popisom komponentu, podľa predchádzajúceho popisu.

Ak si myslíte, že potrebujete pokračovať s vývojom komponentu, môžeme ho tiež uložiť do SVN, aby ste k nemu mali stále prístup. Ak nás unavia úpravy z poslaných patcheov, poskytneme Vám prístup so zápisom do SVN, aby ste mohli odovzdávať svoje patche sami. Detaily nájdete v Použitie SVN úložiska Lazarus.

Contributors and Changes

This page has been converted from the epikwiki version.

  • Initial version by Tom Lisjac and Mattias Gärtner - 9/22/2003 VlxAdmin
  • Moved Getting help from the main page. T. Lisjac - 9/24/2003 VlxAdmin
  • Added documentation templates, procedure and links. 9/25/2003 VlxAdmin
  • LCLLinux was renamed to LCLIntf, Jesus Reyes, 9/27/2003
  • added more information on Unit changes, AndrewJohnson 9/27/2003
  • Updated Syntax differences, including some examples, AndrewJohnson 9/27/2003
  • FPC 1.0.x doesn't support interfaces, Vincent Snijders 9/28/2003
  • Fixed some of the examples per new WikiWord definition, 9/28/2003 VlxAdmin
  • Made code more consistant to remove last accidental Pascal WikiWord definitions, AndrewJohnson 9/27/2003
  • Use tables for code examples for nice blocks, and easy side by side view of Delphi->FPC differences, AndrewJohnson 10/17/2003
  • Use pascal stylesheet to make example code more readable, AndrewJohnson 10/18/2003