Sign in Join
Wiki copytemporary

Code Conversion Guide/sk: what changed

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

OldNewLine
11Cieľ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.
22
33Tento č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.
44
55Cieľ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.
66
77Tento 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.
88
99## Výber komponentov alebo knižnice pre konverziu
1010
1111### Kde hľadať kód na konverziu
1212
1313Na 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 [Sourceforge](http://sourceforge.net/users/tpsfadmin/).
1414
1515Aby 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\].
1616
1717### Licencovanie
1818
1919Licencie 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.
2020
2121Keď 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.
2222
2323Vo 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](http://www.opensource.org/docs/definition.php). 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".
2424
2525### Závislosti
2626
2727Ď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.
2828
2929### Poznámky k prekladaču
3030
3131Viz:
3232
3333- [Známe problémy](http://www.freepascal.org/probs.html)
3434- [Neopravené chyby](http://www.freepascal.org/bugs/db.php3?statusfield=Unfixed)
3535
3636### Poznámky k platforme a OS
3737
3838Lazarus 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!
3939
4040## Konverzia
4141
4242### Nastavenie IDE Lazarus pre konverziu projektu
4343
4444#### Vytvorenie skúšobného projektu
4545
4646- Umiestnite konvertovaný kód do podadresára (napr: convertdir)
4747- Spusťte Lazarus
4848- **File-\>Save All** do adresára convertdir. Zmysluplné mená pre Project a predvolenú jednotku sú voliteľné.
4949- Otvorte "základnú" konvertovanú jednotku v convertdir
5050- Pridajte ju do projektu: **Project-\>Add Active Unit to Project**
5151- Spusťte **Tools-\>Quick Syntax Check** alebo **Run-\>Build All**, čím začnete.
5252
5353#### Na čo treba dať pozor
5454
5555- 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**.
5656
5757#### Zdrojové kódy Delphi VCL a Kylix CLX v Lazarus
5858
5959Pri 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**.
6060
6161### Problémy konverzie a ich riešenie
6262
6363#### Ekvivalenty Delphi/Kylix súborov v Lazarus
6464
65-<table>
66-<thead>
67-<tr>
68-<th><p>Delphi / Kylix</p></th>
69-<th><p>Popis</p></th>
70-<th><p>Lazarus</p></th>
71-<th><p>Popis</p></th>
72-</tr>
73-</thead>
74-<tbody>
75-<tr>
76-<td data-valign="top"><p>.pas</p>
77-<p>.dfm/.xfm,</p>
78-<p>.dcu/.dpu,</p>
79-<p>.dpr(main project file),</p>
80-<p>.res,</p>
81-<p>.dof/.kof</p>
82-<p>---</p>
83-<p>---</p>
84-<p>---</p></td>
85-<td data-valign="top"><p>súbor zdrojového kódu Delphi,</p>
86-<p>formulár Delphi,</p>
87-<p>preložená jednotka Delphi,</p>
88-<p>projekt Delphi,</p>
89-<p>Resource súbor Windows,</p>
90-<p>súbor volieb Delphi</p></td>
91-<td data-valign="top"><p>.pas, .pp .lfm,</p>
92-<p>.o,</p>
93-<p>.lpr</p>
94-<p>---</p>
95-<p>---</p>
96-<p>.lrs,</p>
97-<p>.lpi(hlavný súbor projketu),</p>
98-<p>.ppu</p></td>
99-<td data-valign="top"><p>súbor jednotky Pascal,</p>
100-<p>dátový súbor formulára,</p>
101-<p>súbor preloženej jednotky,</p>
102-<p>súbor projektu,</p>
103-<p>Resource súbor,</p>
104-<p>súbor volieb projektu,</p>
105-<p>Resource súbor Lazarus,</p>
106-<p>informačný súbor projektu Lazarus,</p>
107-<p>popisný súbor jednotky FPC</p></td>
108-</tr>
109-</tbody>
110-</table>
65+**Delphi / Kylix**
11166
67+**Popis**
68+
69+**Lazarus**
70+
71+**Popis**
72+
73+.pas
74+
75+.dfm/.xfm,
76+
77+.dcu/.dpu,
78+
79+.dpr(main project file),
80+
81+.res,
82+
83+.dof/.kof
84+
85+---
86+
87+---
88+
89+---
90+
91+súbor zdrojového kódu Delphi,
92+
93+formulár Delphi,
94+
95+preložená jednotka Delphi,
96+
97+projekt Delphi,
98+
99+Resource súbor Windows,
100+
101+súbor volieb Delphi
102+
103+.pas, .pp .lfm,
104+
105+.o,
106+
107+.lpr
108+
109+---
110+
111+---
112+
113+.lrs,
114+
115+.lpi(hlavný súbor projketu),
116+
117+.ppu
118+
119+súbor jednotky Pascal,
120+
121+dátový súbor formulára,
122+
123+súbor preloženej jednotky,
124+
125+súbor projektu,
126+
127+Resource súbor,
128+
129+súbor volieb projektu,
130+
131+Resource súbor Lazarus,
132+
133+informačný súbor projektu Lazarus,
134+
135+popisný súbor jednotky FPC
136+
112137Teda 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.
113138
114139#### Konverzia projektov/formulárov/jednotiek Delphi do Lazarus
115140
116141Premenujte alebo prekopírujte súbor .dpr na súbor .lpr. Zakomentujte alebo odstráňte direktívu
117142
118143`{$R *.res}`
119144
120145a pridajte direktívu
121146
122147`{$mode delphi}{$H+}`
123148
124149alebo
125150
126151`{$mode objfpc}{$H+}`
127152
128153do súboru .lpr.
129154
130155S 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.
131156
132157Mnoho 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.
133158
134159Ak 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:
135160
1361611. upraví veľkosť písmen v sekciách uses a iclude.
1371622. konvertuje súbory .dfm na súbory .lfm (bez kontroly obsahu, len formát)
1381633. vytvorí prázdny súbor .lrs (obsah bude pridaný neskôr)
1391644. pridá direktívu
140165
141166`{$mode delphi}`
142167
1431681. nahradí jednotku Windows jednotkou LCLIntf
1441692. ak je to potrebné, pridá jednotku LResources
1451703. odoberie jednotku Variants
1461714. odoberie direktívu
147172
148173`{$R *.dfm}`
149174
1501751. pridá do sekcie initialization direktívu
151176
152177`{$i unit.lrs}`
153178
154179Toto 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).
155180
156181#### Výber správneho módu prekladača
157182
158183Prekladač [[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:
159184
160185Mó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í.
161186
162187Väčšinu jednotiek Delphi môžete jednoducho preložiť pomocou [[Free Pascal]] pridaním tejto konštrukcie, hneď za meno jednotky
163188
164189`{$IFDEF FPC}`\
165190`  {$MODE DELPHI}`\
166191`{$ENDIF}`
167192
168193Ďalšie podrobnosti o módoch [[Free Pascal]] nájdete v [dokumentácii Free Pascal](http://www.freepascal.org/docs-html/prog/progap4.html#progse62.html).
169194
170195#### Viac-platformové poznámky
171196
172197- 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.
173198- Neodkazujte na špecifické pamäťové miesto, ako dátová oblasť BIOS. Zistite čo kód potrebuje a skúste nájsť cezplatformovú alternatívu.
174199- 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é.
175200- Ak potrebujete nejaký kód, špecifický pre OS, používajte **IFDEF**. Viz zoznam makier neskôr.
176201
177202#### Užitočné premenné prekladača
178203
179204Pre písanie kódu, ktorý sa má správať na rôznych systémoch rôzne, môžete použiť direktívy
180205
181206`{$IFDEF Name}`
182207
183208Pričom Name môže byť
184209
185210- **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.
186211
187212`{$IfDef LCL}`
188213
189214- **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.
190215
191216`{$IfDef FPC}`
192217
193218- **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.
194219
195220`{$IfDef LCLGtk}`\
196221`{$IfDef LCLWin32}`\
197222`{$IfDef LCLQt}`\
198223`... `
199224
200225- **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ží.
201226
202227`{$IfDef Unix}`\
203228`{$IfDef Win32}`\
204229`...`
205230
206231
207232Pre prácu v Kylix použite nasledujúcu konštrukciu:
208233
209234`{$IfDef Linux}`\
210235`  {$Define Unix}`\
211236`{$EndIf}`
212237
213238- **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.
214239
215240`{$IfDef ENDIAN_BIG}`
216241
217242Ďalšie podrobnosti nájdete v [dokumentácii Free Pascal](http://www.freepascal.org/docs-html/prog/prog.html#QQ2-23-21).
218243
219244#### Podpora 32bit/64bit
220245
221246Ukazovatele 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:
222247
223248- **PtrInt** je 32bit Integer so znamienkom na 32bit platformách a 64bit Integer sp znamienkom na 64bit platformách.
224249- **PtrUInt**, je rovnaké ako predchádzajúce s tým rozdielom, že sa jedná o Integer bez znamienka.
225250
226251Pre kód, ktorý má pracovať s Delphi a FPC použite:
227252
228253` {$IFNDEF FPC}`\
229254` type`\
230255`   PtrInt = integer;`\
231256`   PtrUInt = cardinal;`\
232257` {$ENDIF}`
233258
234259Nahrďte všetky
235260
236261`integer(SomePointerOrObject)`
237262
238263týmto
239264
240265`PtrInt(SomePointerOrObject)`
241266
242267#### Hľadanie chýbajúcich identifikátorov
243268
244269V 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.
245270
246271Naprí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):
247272
248273` grep -in ' tbutton =' lcl/*`
249274
250275#### Rozdiely v dôležitých jednotkách Lazarus a Delphi
251276
252277Prosím dopĺňajte túto časť!;
253278
254279- Windows -\> LCLIntf, LCLType, LCLProc, VCLGlobals, ...
255280
256281Keďž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ď).
257282
258283Jednotka **Interfaces** musí byť zahrnutá v súbore .lpr file pre správnu inicializáciu príslušného WidgetSet.
259284
260285- Messages-\>LMessages
261286
262287Sprá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**.
263288
264289- Graphics, Controls-\>GraphTypes, GraphMath, Graphics, Controls
265290
266291Na 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.
267292
268293`Point1 := Point2 + Point3`
269294
270295či porovnanie dvoch pravouholníkov ako
271296
272297`if (rect1 = rect2) then ...`
273298
274299- Mask-\>MaskEdit
275300
276301Kvô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.
277302
278303- StdCtrls-\>StdCtrls,Buttons
279304
280305V 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úť.
281306
282307#### Rozdiely vo vlastnostiach a metódach Delphi -\> FPC/LCL
283308
284309- v LCL je Canvas obsahnutý v TBitmap
285310
286311#### Sémantické rozdiely
287312
288313##### Poradie vyhodnocovania parametrov
289314
290315Delphi 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.
291316
292317##### Vnorené procedúry/funkcie sú procedurálne premenné
293318
294319Delphi 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ú.
295320
296321FPC 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.
297322
298323Inými slovami, nevolajte vnorené procedúry pomocou procedurálnych premenných.
299324
300325#### Syntaktické rozdiely
301326
302327Prosím dopĺňajte túto kapitolu!
303328
304329Kvôli zdedenej prísnosti FPC, budú potrebné niektoré syntaktické zmeny, napriek direktíve
305330
306331`{$Mode Delphi}`
307332
308333pracuje 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.
309334
310335Niektoré 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:
311336
312337##### Pri priraďovaní vstupného bodu obsluhy udalosti, pridajte predponu "@"
313338
314339Napríklad, môžete manuálne priradiť udalosť tlačítka
315340
316-<table>
317-<thead>
318-<tr>
319-<th><p>Delphi</p></th>
320-<th><p>OBJFPC</p></th>
321-</tr>
322-</thead>
323-<tbody>
324-<tr>
325-<td><div class="sourceCode" id="cb1"><pre class="sourceCode pascal"><code class="sourceCode pascal"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="kw">begin</span></span>
326-<span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a> <span class="kw">if</span> <span class="kw">not</span> Assigned(MyButton.OnClick) <span class="kw">then</span> </span>
327-<span id="cb1-3"><a href="#cb1-3" aria-hidden="true" tabindex="-1"></a> MyButton.OnClick:= SomeFunction;</span>
328-<span id="cb1-4"><a href="#cb1-4" aria-hidden="true" tabindex="-1"></a> <span class="co">//@ nie je vyžadované</span></span>
329-<span id="cb1-5"><a href="#cb1-5" aria-hidden="true" tabindex="-1"></a> <span class="co">//ďalší kód...</span></span>
330-<span id="cb1-6"><a href="#cb1-6" aria-hidden="true" tabindex="-1"></a><span class="kw">end</span>;</span></code></pre></div></td>
331-<td><div class="sourceCode" id="cb2"><pre class="sourceCode pascal"><code class="sourceCode pascal"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a><span class="kw">begin</span></span>
332-<span id="cb2-2"><a href="#cb2-2" aria-hidden="true" tabindex="-1"></a> <span class="kw">if</span> <span class="kw">not</span> Assigned(MyButton.OnClick) <span class="kw">then</span></span>
333-<span id="cb2-3"><a href="#cb2-3" aria-hidden="true" tabindex="-1"></a> MyButton.OnClick:= @SomeFunction;</span>
334-<span id="cb2-4"><a href="#cb2-4" aria-hidden="true" tabindex="-1"></a> <span class="co">//@ je vyžadované</span></span>
335-<span id="cb2-5"><a href="#cb2-5" aria-hidden="true" tabindex="-1"></a> <span class="co">//ďalší kód...</span></span>
336-<span id="cb2-6"><a href="#cb2-6" aria-hidden="true" tabindex="-1"></a><span class="kw">end</span>;</span></code></pre></div></td>
337-</tr>
338-</tbody>
339-</table>
341+**Delphi**
340342
343+**OBJFPC**
344+
345+``` pascal
346+begin
347+ if not Assigned(MyButton.OnClick) then
348+ MyButton.OnClick:= SomeFunction;
349+ //@ nie je vyžadované
350+ //ďalší kód...
351+end;
352+```
353+
354+``` pascal
355+begin
356+ if not Assigned(MyButton.OnClick) then
357+ MyButton.OnClick:= @SomeFunction;
358+ //@ je vyžadované
359+ //ďalší kód...
360+end;
361+```
362+
341363##### Pri volaní procedurálnej premennej používajte túto syntax: theprocname()
342364
343365V 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
344366
345-<table>
346-<thead>
347-<tr>
348-<th><p>Delphi</p></th>
349-<th><p>OBJFPC</p></th>
350-</tr>
351-</thead>
352-<tbody>
353-<tr>
354-<td><div class="sourceCode" id="cb1"><pre class="sourceCode pascal"><code class="sourceCode pascal"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="kw">With</span> (SomeObject) <span class="kw">do</span> </span>
355-<span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a><span class="kw">begin</span></span>
356-<span id="cb1-3"><a href="#cb1-3" aria-hidden="true" tabindex="-1"></a> <span class="kw">If</span> Assigned(OnMyCallback) <span class="kw">then</span></span>
357-<span id="cb1-4"><a href="#cb1-4" aria-hidden="true" tabindex="-1"></a> OnMyCallback;</span>
358-<span id="cb1-5"><a href="#cb1-5" aria-hidden="true" tabindex="-1"></a> <span class="co">//zátvorky nie sú vyžadované</span></span>
359-<span id="cb1-6"><a href="#cb1-6" aria-hidden="true" tabindex="-1"></a><span class="kw">end</span>;</span></code></pre></div></td>
360-<td><div class="sourceCode" id="cb2"><pre class="sourceCode pascal"><code class="sourceCode pascal"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a><span class="kw">With</span> (SomeObject) <span class="kw">do</span> </span>
361-<span id="cb2-2"><a href="#cb2-2" aria-hidden="true" tabindex="-1"></a><span class="kw">begin</span></span>
362-<span id="cb2-3"><a href="#cb2-3" aria-hidden="true" tabindex="-1"></a> <span class="kw">If</span> Assigned(OnMyCallback) <span class="kw">then</span></span>
363-<span id="cb2-4"><a href="#cb2-4" aria-hidden="true" tabindex="-1"></a> OnMyCallback();</span>
364-<span id="cb2-5"><a href="#cb2-5" aria-hidden="true" tabindex="-1"></a> <span class="co">//zátvorky sú vyžadované</span></span>
365-<span id="cb2-6"><a href="#cb2-6" aria-hidden="true" tabindex="-1"></a><span class="kw">end</span>;</span></code></pre></div></td>
366-</tr>
367-</tbody>
368-</table>
367+**Delphi**
369368
369+**OBJFPC**
370+
371+``` pascal
372+With (SomeObject) do
373+begin
374+ If Assigned(OnMyCallback) then
375+ OnMyCallback;
376+ //zátvorky nie sú vyžadované
377+end;
378+```
379+
380+``` pascal
381+With (SomeObject) do
382+begin
383+ If Assigned(OnMyCallback) then
384+ OnMyCallback();
385+ //zátvorky sú vyžadované
386+end;
387+```
388+
370389##### Pri pristupovaní k hodnotám v ukazovateli na záznam ho musíte najprv dereferencovať
371390
372391V 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.
373392
374393V FPC musí byť najprv dereferencovaný, napríklad:
375394
376-<table>
377-<thead>
378-<tr>
379-<th><p>Delphi</p></th>
380-<th><p>OBJFPC</p></th>
381-</tr>
382-</thead>
383-<tbody>
384-<tr>
385-<td><div class="sourceCode" id="cb1"><pre class="sourceCode pascal"><code class="sourceCode pascal"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="kw">Function</span> GetSomeValue(ARecord: PMyRecord):<span class="dt">Integer</span>;</span>
386-<span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a><span class="kw">begin</span></span>
387-<span id="cb1-3"><a href="#cb1-3" aria-hidden="true" tabindex="-1"></a> <span class="kw">If</span> Assigned(ARecord) <span class="kw">then</span></span>
388-<span id="cb1-4"><a href="#cb1-4" aria-hidden="true" tabindex="-1"></a> Result:=ARecord.SomeValue</span>
389-<span id="cb1-5"><a href="#cb1-5" aria-hidden="true" tabindex="-1"></a> <span class="kw">else</span></span>
390-<span id="cb1-6"><a href="#cb1-6" aria-hidden="true" tabindex="-1"></a> Result:=<span class="dv">0</span>;</span>
391-<span id="cb1-7"><a href="#cb1-7" aria-hidden="true" tabindex="-1"></a><span class="kw">end</span>;</span></code></pre></div></td>
392-<td><div class="sourceCode" id="cb2"><pre class="sourceCode pascal"><code class="sourceCode pascal"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a><span class="kw">Function</span> GetSomeValue(ARecord: PMyRecord):<span class="dt">Integer</span>;</span>
393-<span id="cb2-2"><a href="#cb2-2" aria-hidden="true" tabindex="-1"></a><span class="kw">begin</span></span>
394-<span id="cb2-3"><a href="#cb2-3" aria-hidden="true" tabindex="-1"></a> <span class="kw">If</span> Assigned(ARecord) <span class="kw">then</span></span>
395-<span id="cb2-4"><a href="#cb2-4" aria-hidden="true" tabindex="-1"></a> Result:=ARecord^.SomeValue</span>
396-<span id="cb2-5"><a href="#cb2-5" aria-hidden="true" tabindex="-1"></a> <span class="kw">else</span></span>
397-<span id="cb2-6"><a href="#cb2-6" aria-hidden="true" tabindex="-1"></a> Result:=<span class="dv">0</span>;</span>
398-<span id="cb2-7"><a href="#cb2-7" aria-hidden="true" tabindex="-1"></a><span class="kw">end</span>;</span></code></pre></div></td>
399-</tr>
400-</tbody>
401-</table>
395+**Delphi**
402396
397+**OBJFPC**
398+
399+``` pascal
400+Function GetSomeValue(ARecord: PMyRecord):Integer;
401+begin
402+ If Assigned(ARecord) then
403+ Result:=ARecord.SomeValue
404+ else
405+ Result:=0;
406+end;
407+```
408+
409+``` pascal
410+Function GetSomeValue(ARecord: PMyRecord):Integer;
411+begin
412+ If Assigned(ARecord) then
413+ Result:=ARecord^.SomeValue
414+ else
415+ Result:=0;
416+end;
417+```
418+
403419##### Pri pristupovaní znakov indexovaného reťazca Vlastnosti objektu, musí byť najprv uzatvorený v zátvorkách
404420
405421V 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.
406422
407423V 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
408424
409-<table>
410-<thead>
411-<tr>
412-<th><p>Delphi</p></th>
413-<th><p>OBJFPC</p></th>
414-</tr>
415-</thead>
416-<tbody>
417-<tr>
418-<td><div class="sourceCode" id="cb1"><pre class="sourceCode pascal"><code class="sourceCode pascal"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="kw">Type</span> TSomeComponent=<span class="kw">class</span>(TComponent)</span>
419-<span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a> <span class="co">//Ďalší kód...</span></span>
420-<span id="cb1-3"><a href="#cb1-3" aria-hidden="true" tabindex="-1"></a><span class="kw">Published</span></span>
421-<span id="cb1-4"><a href="#cb1-4" aria-hidden="true" tabindex="-1"></a><span class="kw">Property</span> MyString:<span class="dt">String</span> index <span class="dv">3</span> <span class="kw">read</span> GetMyString;</span>
422-<span id="cb1-5"><a href="#cb1-5" aria-hidden="true" tabindex="-1"></a><span class="co">//Ďalší kód...</span></span>
423-<span id="cb1-6"><a href="#cb1-6" aria-hidden="true" tabindex="-1"></a><span class="kw">End</span>;</span>
424-<span id="cb1-7"><a href="#cb1-7" aria-hidden="true" tabindex="-1"></a></span>
425-<span id="cb1-8"><a href="#cb1-8" aria-hidden="true" tabindex="-1"></a><span class="kw">var</span></span>
426-<span id="cb1-9"><a href="#cb1-9" aria-hidden="true" tabindex="-1"></a> MyChar:<span class="dt">char</span>;</span>
427-<span id="cb1-10"><a href="#cb1-10" aria-hidden="true" tabindex="-1"></a><span class="kw">begin</span></span>
428-<span id="cb1-11"><a href="#cb1-11" aria-hidden="true" tabindex="-1"></a> <span class="kw">If</span> Length(MyString)&gt;<span class="dv">2</span> <span class="kw">then</span></span>
429-<span id="cb1-12"><a href="#cb1-12" aria-hidden="true" tabindex="-1"></a> <span class="co">//nie sú potrebné zátvorky</span></span>
430-<span id="cb1-13"><a href="#cb1-13" aria-hidden="true" tabindex="-1"></a> MyChar:= MyString[<span class="dv">3</span>];</span>
431-<span id="cb1-14"><a href="#cb1-14" aria-hidden="true" tabindex="-1"></a> <span class="co">//Ďalší kód...</span></span>
432-<span id="cb1-15"><a href="#cb1-15" aria-hidden="true" tabindex="-1"></a><span class="kw">end</span>;</span></code></pre></div></td>
433-<td><div class="sourceCode" id="cb2"><pre class="sourceCode pascal"><code class="sourceCode pascal"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a><span class="kw">Type</span> TSomeComponent=<span class="kw">class</span>(TComponent)</span>
434-<span id="cb2-2"><a href="#cb2-2" aria-hidden="true" tabindex="-1"></a><span class="co">//Ďalší kód...</span></span>
435-<span id="cb2-3"><a href="#cb2-3" aria-hidden="true" tabindex="-1"></a><span class="kw">Published</span></span>
436-<span id="cb2-4"><a href="#cb2-4" aria-hidden="true" tabindex="-1"></a><span class="kw">Property</span> MyString:<span class="dt">String</span> index <span class="dv">3</span> <span class="kw">read</span> GetMyString;</span>
437-<span id="cb2-5"><a href="#cb2-5" aria-hidden="true" tabindex="-1"></a><span class="co">//Ďalší kód...</span></span>
438-<span id="cb2-6"><a href="#cb2-6" aria-hidden="true" tabindex="-1"></a><span class="kw">End</span>;</span>
439-<span id="cb2-7"><a href="#cb2-7" aria-hidden="true" tabindex="-1"></a></span>
440-<span id="cb2-8"><a href="#cb2-8" aria-hidden="true" tabindex="-1"></a><span class="kw">var</span></span>
441-<span id="cb2-9"><a href="#cb2-9" aria-hidden="true" tabindex="-1"></a> MyChar:<span class="dt">char</span>;</span>
442-<span id="cb2-10"><a href="#cb2-10" aria-hidden="true" tabindex="-1"></a><span class="kw">begin</span></span>
443-<span id="cb2-11"><a href="#cb2-11" aria-hidden="true" tabindex="-1"></a> <span class="kw">If</span> Length(MyString)&gt;<span class="dv">2</span> <span class="kw">then</span></span>
444-<span id="cb2-12"><a href="#cb2-12" aria-hidden="true" tabindex="-1"></a> <span class="co">//niekedy sú potrebné zátvorky</span></span>
445-<span id="cb2-13"><a href="#cb2-13" aria-hidden="true" tabindex="-1"></a> MyChar:= (MyString)[<span class="dv">3</span>];</span>
446-<span id="cb2-14"><a href="#cb2-14" aria-hidden="true" tabindex="-1"></a> <span class="co">//Ďalší kód...</span></span>
447-<span id="cb2-15"><a href="#cb2-15" aria-hidden="true" tabindex="-1"></a><span class="kw">end</span>;</span></code></pre></div></td>
448-</tr>
449-</tbody>
450-</table>
425+**Delphi**
451426
427+**OBJFPC**
428+
429+``` pascal
430+Type TSomeComponent=class(TComponent)
431+ //Ďalší kód...
432+Published
433+Property MyString:String index 3 read GetMyString;
434+//Ďalší kód...
435+End;
436+
437+var
438+ MyChar:char;
439+begin
440+ If Length(MyString)>2 then
441+ //nie sú potrebné zátvorky
442+ MyChar:= MyString[3];
443+ //Ďalší kód...
444+end;
445+```
446+
447+``` pascal
448+Type TSomeComponent=class(TComponent)
449+//Ďalší kód...
450+Published
451+Property MyString:String index 3 read GetMyString;
452+//Ďalší kód...
453+End;
454+
455+var
456+ MyChar:char;
457+begin
458+ If Length(MyString)>2 then
459+ //niekedy sú potrebné zátvorky
460+ MyChar:= (MyString)[3];
461+ //Ďalší kód...
462+end;
463+```
464+
452465##### Pri použití ukazovateľov s premennými alebo funkciami, musíte ich najprv pretypovať na príslušný typ
453466
454467Niekedy 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.
455468
456469V 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
457470
458-<table>
459-<thead>
460-<tr>
461-<th><p>Delphi</p></th>
462-<th><p>OBJFPC</p></th>
463-</tr>
464-</thead>
465-<tbody>
466-<tr>
467-<td><div class="sourceCode" id="cb1"><pre class="sourceCode pascal"><code class="sourceCode pascal"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="kw">Unit</span> <span class="dv">1</span></span>
468-<span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a> <span class="kw">Type</span> </span>
469-<span id="cb1-3"><a href="#cb1-3" aria-hidden="true" tabindex="-1"></a> TSomeObject=<span class="kw">class</span>(TComponent)</span>
470-<span id="cb1-4"><a href="#cb1-4" aria-hidden="true" tabindex="-1"></a> <span class="co">//Ďalší kód...</span></span>
471-<span id="cb1-5"><a href="#cb1-5" aria-hidden="true" tabindex="-1"></a> <span class="kw">End</span>;</span>
472-<span id="cb1-6"><a href="#cb1-6" aria-hidden="true" tabindex="-1"></a></span>
473-<span id="cb1-7"><a href="#cb1-7" aria-hidden="true" tabindex="-1"></a> <span class="kw">Procedure</span> DoSomething(Value: TSomeObject);</span>
474-<span id="cb1-8"><a href="#cb1-8" aria-hidden="true" tabindex="-1"></a> <span class="kw">Function</span> GetSomeObject: TSomeObject;</span>
475-<span id="cb1-9"><a href="#cb1-9" aria-hidden="true" tabindex="-1"></a></span>
476-<span id="cb1-10"><a href="#cb1-10" aria-hidden="true" tabindex="-1"></a><span class="kw">Unit</span> <span class="dv">2</span></span>
477-<span id="cb1-11"><a href="#cb1-11" aria-hidden="true" tabindex="-1"></a> <span class="kw">Type</span> </span>
478-<span id="cb1-12"><a href="#cb1-12" aria-hidden="true" tabindex="-1"></a> TSomeComponent=<span class="kw">class</span>(TComponent)</span>
479-<span id="cb1-13"><a href="#cb1-13" aria-hidden="true" tabindex="-1"></a> <span class="co">//Ďalší kód...</span></span>
480-<span id="cb1-14"><a href="#cb1-14" aria-hidden="true" tabindex="-1"></a> <span class="kw">Published</span> SomeObject: <span class="dt">Pointer</span>;</span>
481-<span id="cb1-15"><a href="#cb1-15" aria-hidden="true" tabindex="-1"></a> <span class="co">//Ďalší kód...</span></span>
482-<span id="cb1-16"><a href="#cb1-16" aria-hidden="true" tabindex="-1"></a> <span class="kw">End</span>;</span>
483-<span id="cb1-17"><a href="#cb1-17" aria-hidden="true" tabindex="-1"></a></span>
484-<span id="cb1-18"><a href="#cb1-18" aria-hidden="true" tabindex="-1"></a>Application</span>
485-<span id="cb1-19"><a href="#cb1-19" aria-hidden="true" tabindex="-1"></a><span class="kw">var</span> </span>
486-<span id="cb1-20"><a href="#cb1-20" aria-hidden="true" tabindex="-1"></a> MyComponent: TSomeComponent;</span>
487-<span id="cb1-21"><a href="#cb1-21" aria-hidden="true" tabindex="-1"></a><span class="kw">begin</span></span>
488-<span id="cb1-22"><a href="#cb1-22" aria-hidden="true" tabindex="-1"></a> MyComponent.SomeObject:=GetSomeObject;</span>
489-<span id="cb1-23"><a href="#cb1-23" aria-hidden="true" tabindex="-1"></a> <span class="co">//Ďalší kód...</span></span>
490-<span id="cb1-24"><a href="#cb1-24" aria-hidden="true" tabindex="-1"></a> DoSomething(MyComponent.SomeObject);</span>
491-<span id="cb1-25"><a href="#cb1-25" aria-hidden="true" tabindex="-1"></a><span class="kw">end</span>;</span></code></pre></div></td>
492-<td><div class="sourceCode" id="cb2"><pre class="sourceCode pascal"><code class="sourceCode pascal"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a><span class="kw">Unit</span> <span class="dv">1</span></span>
493-<span id="cb2-2"><a href="#cb2-2" aria-hidden="true" tabindex="-1"></a> <span class="kw">Type</span> </span>
494-<span id="cb2-3"><a href="#cb2-3" aria-hidden="true" tabindex="-1"></a> TSomeObject=<span class="kw">class</span>(TComponent)</span>
495-<span id="cb2-4"><a href="#cb2-4" aria-hidden="true" tabindex="-1"></a> <span class="co">//Ďalší kód...</span></span>
496-<span id="cb2-5"><a href="#cb2-5" aria-hidden="true" tabindex="-1"></a> <span class="kw">End</span>;</span>
497-<span id="cb2-6"><a href="#cb2-6" aria-hidden="true" tabindex="-1"></a></span>
498-<span id="cb2-7"><a href="#cb2-7" aria-hidden="true" tabindex="-1"></a> <span class="kw">Procedure</span> DoSomething(Value: TSomeObject);</span>
499-<span id="cb2-8"><a href="#cb2-8" aria-hidden="true" tabindex="-1"></a> <span class="kw">Function</span> GetSomeObject: TSomeObject;</span>
500-<span id="cb2-9"><a href="#cb2-9" aria-hidden="true" tabindex="-1"></a></span>
501-<span id="cb2-10"><a href="#cb2-10" aria-hidden="true" tabindex="-1"></a><span class="kw">Unit</span> <span class="dv">2</span></span>
502-<span id="cb2-11"><a href="#cb2-11" aria-hidden="true" tabindex="-1"></a> <span class="kw">Type</span></span>
503-<span id="cb2-12"><a href="#cb2-12" aria-hidden="true" tabindex="-1"></a> TSomeComponent=<span class="kw">class</span>(TComponent)</span>
504-<span id="cb2-13"><a href="#cb2-13" aria-hidden="true" tabindex="-1"></a> <span class="co">//Ďalší kód...</span></span>
505-<span id="cb2-14"><a href="#cb2-14" aria-hidden="true" tabindex="-1"></a> <span class="kw">Published</span> SomeObject: <span class="dt">Pointer</span>;</span>
506-<span id="cb2-15"><a href="#cb2-15" aria-hidden="true" tabindex="-1"></a> <span class="co">//Ďalší kód...</span></span>
507-<span id="cb2-16"><a href="#cb2-16" aria-hidden="true" tabindex="-1"></a> <span class="kw">End</span>;</span>
508-<span id="cb2-17"><a href="#cb2-17" aria-hidden="true" tabindex="-1"></a></span>
509-<span id="cb2-18"><a href="#cb2-18" aria-hidden="true" tabindex="-1"></a>Application</span>
510-<span id="cb2-19"><a href="#cb2-19" aria-hidden="true" tabindex="-1"></a><span class="kw">var</span> </span>
511-<span id="cb2-20"><a href="#cb2-20" aria-hidden="true" tabindex="-1"></a> MyComponent: TSomeComponent;</span>
512-<span id="cb2-21"><a href="#cb2-21" aria-hidden="true" tabindex="-1"></a><span class="kw">begin</span></span>
513-<span id="cb2-22"><a href="#cb2-22" aria-hidden="true" tabindex="-1"></a> MyComponent.SomeObject:=<span class="dt">Pointer</span>(GetSomeObject);</span>
514-<span id="cb2-23"><a href="#cb2-23" aria-hidden="true" tabindex="-1"></a> <span class="co">//Ďalší kód...</span></span>
515-<span id="cb2-24"><a href="#cb2-24" aria-hidden="true" tabindex="-1"></a> DoSomething(TSomeObject(MyComponent.SomeObject));</span>
516-<span id="cb2-25"><a href="#cb2-25" aria-hidden="true" tabindex="-1"></a><span class="kw">end</span>;</span></code></pre></div></td>
517-</tr>
518-</tbody>
519-</table>
471+**Delphi**
472+
473+**OBJFPC**
474+
475+``` pascal
476+Unit 1
477+ Type
478+ TSomeObject=class(TComponent)
479+ //Ďalší kód...
480+ End;
481+
482+ Procedure DoSomething(Value: TSomeObject);
483+ Function GetSomeObject: TSomeObject;
484+
485+Unit 2
486+ Type
487+ TSomeComponent=class(TComponent)
488+ //Ďalší kód...
489+ Published SomeObject: Pointer;
490+ //Ďalší kód...
491+ End;
492+
493+Application
494+var
495+ MyComponent: TSomeComponent;
496+begin
497+ MyComponent.SomeObject:=GetSomeObject;
498+ //Ďalší kód...
499+ DoSomething(MyComponent.SomeObject);
500+end;
501+```
502+
503+``` pascal
504+Unit 1
505+ Type
506+ TSomeObject=class(TComponent)
507+ //Ďalší kód...
508+ End;
509+
510+ Procedure DoSomething(Value: TSomeObject);
511+ Function GetSomeObject: TSomeObject;
512+
513+Unit 2
514+ Type
515+ TSomeComponent=class(TComponent)
516+ //Ďalší kód...
517+ Published SomeObject: Pointer;
518+ //Ďalší kód...
519+ End;
520+
521+Application
522+var
523+ MyComponent: TSomeComponent;
524+begin
525+ MyComponent.SomeObject:=Pointer(GetSomeObject);
526+ //Ďalší kód...
527+ DoSomething(TSomeObject(MyComponent.SomeObject));
528+end;
529+```
520530
521531#### Resources
522532
523533Sú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ť:
524534
525535`cd lazarus/tools`\
526536`make install`
527537
528538Pre pridanie resource do svojej aplikácie spusťte:
529539
530540`lazres myresource.lrs mypix.xpm anotherpix.xpm`
531541
532542A potom
533543
534544- pridajte jednotku **LResources** do sekcie **Uses**
535545- zahrňte vami vytvorený súbor .lrs do bloku *initialization*
536546
537547Príklad
538548
539549``` pascal
540550 function TForm1.LoadGlyph(const GlyphName: String): TBitMap;
541551 begin
542552 Result:= TPixmap.Create;
543553 Result.LoadFromLazarusResource(GlyphName);
544554 end;
545555 //Ďalší kód...
546556 begin
547557 Speedbutton1.glyph:= LoadGlyph('mypix');
548558 //Ďalší kód...
549559 end
550560
551561 initialization
552562 {$I unit1.lrs}
553563 {$I myresource.lrs}
554564 end.
555565```
556566
557567### Iná metóda konverzie projektu Delphi/Kylix do Lazarus
558568
559569- 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)
560570- premeujte súbor .dpr na **.lpr**
561571- urobte potrebné zmeny súboru **.lpr**:
562572
5635731. pridajte direktívy **{\$mode delphi}{\$H+}** alebo **{\$mode objfpc}{H+}**
5645742. pridajte jednotku **Interfaces** do sekcie uses
5655753. zakomentujte alebo zmažte direktívu {\$R *.res}
566576
567577- urobte potrebné zmeny vo všetkých súboroch jednotiek **.pas**:
568578
5695791. pridajte direktívu **{\$mode delphi}{\$H+}** alebo **{\$mode objfpc}{H+}**
5705802. pridajte **LResources** a, ak má formulár tlačítka, aj **Buttons** do sekcie uses
5715813. zakomentujte alebo zmažte direktívu {\$R *.dfm} alebo {\$R *.xfm}
5725824. pridajte sekciu **Initialization** nakoniec každého súboru jednotky a pridajte do nej direktívu **{\$I unitname.lrs}**
573583
574584- vyberte **Project-\>New Project from file**
575585- zvoľte súbor **.lpr**
576586- v okne 'Create a new project' zvoľte 'Application'
577587- vybudujte projekt a zaistite ďalšie potrebné opravy, v tomto okamžiku je automaticky vygenerovaný súbor .lpi.
578588 - Môžete sa stretnúť so správou 'Error reading Form', ak to nastane kliknite na 'Continue Loading'
579589- všetko uložte a máte projekt Lazarus :-)
580590
581591## Získanie nápovedy
582592
583593Ak sa počas konverzie stretnete sproblémom, ktorý neviete vyriešiť, sú široké možnosti ako získať pomoc:
584594
585595### Documentation
586596
587597- Pre čisto Object Pascal a FPC problémy, jen ajlepšie začať s [Dokumentáciou Free Pascal](http://www.freepascal.org/docs-html/) od Michaëla Van Canneyta a Floriana Klämpfla.
588598- Pre problémy viac orientované na Lazarus, hľadajte aj v [[Main Page|Dokumentácii projektu Lazarus]].
589599
590600### Partnerská podpora
591601
592602- Mailing listy - otázky môžete posielať do niektorého z [mailing listov pre Free Pascal Compiler](http://www.freepascal.org/maillist.html) alebo [FPC fór](http://community.freepascal.org:10000/bboard/), kde je prihlásených veľa odborníkov.
593603- IRC - na irc.freenode.net: [\#fpc](irc://irc.freenode.net/fpc) rpe FPC alebo [\#lazarus-ide](irc://irc.freenode.net/lazarus-ide) pre Lazarus
594604
595605### Vedomostné bázy
596606
597607Existujú 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:
598608
599609- Tamarack Associates poskytuej rýchly \[ <http://codenewsfast.com/> vyhľadávací\] stroj špecifické pre archívy Borland usenet.
600610- Mer Systems Inc. poskytuje podobný vyhľadávací [stroj](http://www.mers.com/searchsite.html).
601611- Ďalšie zdroje informácií spolu s s možnosťou [hľadania](http://www.efg2.com/Lab/search.htm) je Earl F. Glynn's Computer Lab and Reference [knižnica](http://www.efg2.com/).
602612
603613## Balíčkovanie a Uvoľňovanie komponentov
604614
605615### Vytvorenie Lazarus balíčka s vašim komponentom
606616
607617Vytvorenie 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.
608618
609619### Dokumentácia
610620
611621Cieľ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.
612622
613623Použ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.
614624
615625### Tvorba Code Release stránky
616626
617627Strá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ď.
618628
619629Pre vytvorenie svojej stránky Code Release vo svojom prehliadači:
620630
621631- prejdite na [[Release new component]]
622632- napíšte meno komponentu do editačného poľa a kliknite na *Create Article*
623633- vyplňte šablónu a stlačte uložiť.
624634- 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.
625635
626636### Poslanie komponentu
627637
628638Ak 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.
629639
630640Ak 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]].
631641
632642## Contributors and Changes
633643
634644This page has been converted from the epikwiki [version](http://lazarus-ccr.sourceforge.net/index.php?wiki=CodeConversionGuide).
635645
636646- Initial version by Tom Lisjac and Mattias Gärtner - 9/22/2003 VlxAdmin
637647- Moved Getting help from the main page. T. Lisjac - 9/24/2003 VlxAdmin
638648- Added documentation templates, procedure and links. 9/25/2003 VlxAdmin
639649- LCLLinux was renamed to LCLIntf, Jesus Reyes, 9/27/2003
640650- added more information on Unit changes, [AndrewJohnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 9/27/2003
641651- Updated Syntax differences, including some examples, [AndrewJohnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 9/27/2003
642652- FPC 1.0.x doesn't support interfaces, Vincent Snijders 9/28/2003
643653- Fixed some of the examples per new WikiWord definition, 9/28/2003 VlxAdmin
644654- Made code more consistant to remove last accidental Pascal WikiWord definitions, [AndrewJohnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 9/27/2003
645655- 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
646656- Use pascal stylesheet to make example code more readable, [AndrewJohnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 10/18/2003
647657
648658---
649659*From the Free Pascal wiki, page "Code Conversion Guide/sk", as it stood on 2020-02-10 after a change by Trev, 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