https://wiki.freepascal.org/api.php?action=feedcontributions&user=Slavko&feedformat=atomLazarus wiki - User contributions [en]2024-03-28T08:10:47ZUser contributionsMediaWiki 1.35.6https://wiki.freepascal.org/index.php?title=Dialog_Examples/sk&diff=32041Dialog Examples/sk2008-11-17T20:01:23Z<p>Slavko: /* MessageDLG */ image correction</p>
<hr />
<div>{{Dialog Examples}}<br />
<br />
= Niektoré užitočné dialógy =<br />
Toto sú niektoré užitočné dialógy, ktoré nenájdete v Palete komonentov:<br />
<br />
* procedure ShowMessage (const Msg: string);<br />
* function MessageBox (Text, Caption : PChar; Flags: Word): Integer;<br />
* function MessageDlg (const Msg: string; AType: TMsgDlgType; AButtons: TMsgDlgButtons; HelpCtx: LongInt): Word;<br />
* function InputBox (const ACaption, APrompt, ADefault: string); string;<br />
* function InputQuery (const ACaption, APrompt: string; var Value: string): Boolean;<br />
* function PasswordBox(const ACaption, APrompt : String) : String;<br />
<br />
Každý z týchto komponentov zobrazuje malé vyskakovacie dialógové okno, ktoré obsahuje nejaké informácie a vyžaduje odozvu používateľa: stlačenie tlačítka, zadanie textu alebo oboje. Programátor má minimálnu kontrolu nad formátom, veľkosťou alebo pozíciou týchto vyskakovacích okien, ale môže ovplyvňovať ich textový obsah.<br><br />
Dôvodom prečo často existujú veľmi podobné alternatívy, je umožniť rôzne spôsoby volania komponentu, a získavania dát, z procedúr a funkcií.<br />
<br />
==Správové dialógy==<br />
Správové dialógy zobrazujú správu a čakajú na stlačenie klávesy alebo kliknutie myšou.<br />
===ShowMessage===<br />
<delphi> Procedure ShowMessage (const Msg: string);<br />
<br />
{ Defined in Dialogs.pp }</delphi><br />
<br />
Najjednoduchší správový dialóg: prijíma jednoduchý textový prarmeter, zobrazí ho v stereotypnom okne a pred vrátením, do volajúcej rutiny alebo programu, čaká na kliknutie myšou alebo kláves enter.<br><br />
Toto je modálne volanie procedúry, ktoré zobrazí okno, získa zameranie a tohoto sa nevzdá, pokiaľ nie je stlačené OK.<br />
<br />
Príklad:<br />
<delphi> Program LazMessage;<br />
Uses Dialogs;<br />
begin<br />
ShowMessage ('This is a message from Lazarus')<br />
end.</delphi><br />
<br />
===MessageBox===<br />
<delphi> Function Application.MessageBox (Text, Caption: PChar; Flags: longint) : Integer;<br />
<br />
{ Defined in Forms.pp as part of TApplication; hence must be called as Application.Messagebox () <br />
or using the 'with Application do ...' construct }</delphi><br />
<br />
Parametre:<br />
* '''Text''': reťazec, ktorý je v okne zobrazený ako otázka ale inštrukcia;<br />
* '''Caption''': textový štítok, ktorý je zobrazený na vrchu okna správy;<br />
* '''Flags''': longint - integer vytvorený sčítaním rôznych konštánt, ktorými je definovaný obsah a správanie okna, napríklad '''MB_ABORTRETRYIGNORE + MR_ICONQUESTION''' nastaví, že aplikácia zobrazí ikonu otázky (?) v okne s tromi tlačítkami: ABORT, RETRY a IGNORE.<br />
<br />
Funkcia vracia hodnotu integer, ktorá zodpovedá stlačenému tlačítku; jej hodnota je daná odkazom na konštanty [IDOK..IDHELP]<br />
<br />
Môže byť volaná ako procedúra (tj. formulácia 'MessageBox()' namiesto volania funkcie 'Variable := MessageBox()' – viz. príklad nižšie)<br />
<br />
Príklad:<br />
<delphi> Uses Forms, Dialogs, LCLType;<br />
<br />
Procedure DisplayMessageBox;<br />
var reply, boxstyle: integer;<br />
begin<br />
with application do begin<br />
boxstyle := MB_ICONQUESTION + MB_YESNO;<br />
reply := MessageBox ('Press either button', 'MessageBoxDemo', boxstyle);<br />
if reply = IDYES then MessageBox ('Yes ', 'Reply',MB_ICONINFORMATION)<br />
else MessageBox ('No ', 'Reply', MB_ICONHAND);<br />
end;</delphi><br />
<br />
Všimnite si, že v tomto príklade sú reťazce 'Yes' a 'No' doplnené medzerami; inak by okno nebolo dosť široké na správne zobrazenie titulku.<br />
<br />
<center>[[Image:MessageBoxDemo.png]] [[Image:ReplyYes.png]]</center><br />
<br />
===MessageDLG===<br />
<delphi> function MessageDlg(const aMsg: string; DlgType: TMsgDlgType; <br />
Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;<br />
function MessageDlg(const aCaption, aMsg: string; DlgType: TMsgDlgType; <br />
Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;</delphi><br />
<br />
Táto funkcia má dve verzie, teda prvý parameter 'Caption' je voliteľný, ak je vynechaný nie je zobrazený Titulok.<br />
<br />
Toto je najkomplexnejší a najprepracovanejší správový dialóg, ktorý poskytuje programátorovi značnú kontrolu nad vzhľadom dialógového okna. Parametre definujúce typ okna a jeho ikonu sú typy, namiesto konštánt a tlačítka môžu byť zadané ako množina v lomených zátvorkách, napr. '''[mbRetry, mbIgnore, mbAbort, mbCancel]'''. Parameter '''HelpCtx''' aktuálne nie je implementovaný a musí bať nastavený na nulu. Návratová hodnota funkcie je identická ako stlačené tlačítko, reprezentovaná ako integer (viz nasledujúcu definície, [mrNone..mrAll]).<br />
<br />
Príklad:<br />
<delphi> Uses forms, dialogs, lcltype, controls;<br />
<br />
procedure TryMessageDlg;<br />
begin<br />
if MessageDlg ('Question', 'Do you wish to Execute?', mtConfirmation, <br />
[mbYes, mbNo, mbIgnore], 0) = mrYes<br />
then <br />
{ Execute rest of Program };<br />
end;</delphi><br />
<br />
<center> [[Image:Question.png]] </center><br />
<br />
== Dialógy textového vstupu ==<br />
Dialógy textového vstupu, zobrazujú správu a dovoľujú používateľovi zadať požadovanú textovú hodnotu.<br />
<br />
===InputBox===<br />
<br />
<delphi>Function InputBox(const ACaption, APrompt, ADefault : String) : String;</delphi><br />
<br />
Zobrazuje okno s definovaným nadpisom, otázku a čaká na používateľský vstup v textovom poli. Voliteľne môže byť pre textové pole definovaný aj predvolený reťazec. Používateľom zadaný text alebo predvolený reťazec je vrátený ako výsledok funkcie.<br />
<br />
Príklad:<br />
<delphi> Uses forms, lcltype, dialogs, controls;<br />
<br />
procedure TryInputBox;<br />
var userstring: string;<br />
begin<br />
userstring := InputBox ('Get some text input', <br />
'Please type in some information', 'Some sample text');<br />
ShowMessage (userstring)<br />
end;</delphi><br />
<br />
===InputQuery===<br />
<delphi> Function InputQuery(const ACaption, APrompt : String;<br />
MaskInput : Boolean; var Value : String) : Boolean;<br />
Function InputQuery(const ACaption, APrompt : String;<br />
var Value : String) : Boolean;</delphi><br />
<br />
Dve verzie tejto funkcie, ktoré zobrazujú otázku a čakajú používateľský vstup textových dát; prvá verzia zahŕňa logický parameter '''MaskInput''', ktorý určuje, či má byť používateľský vstup v textovom poli maskovaný hviezdičkami (ako pri zadávaní hesla), zatiaľ čo druhá túto vlastnosť vynecháva. Používateľom zadaný text je vrátený v parametri 'Value'; výsledkom funkcie je logická hodnota, ktorá vracia '''TRUE''', ak bolo stlačené tlačítko OK alebo '''FALSE''', ak bolo okno zatvorené iným spôsobom (napríklad kliknutím na ikonu 'Zatvoriť' v lište okna). Vynechanie parametra MaskInput má rovnaký výsledok ako jeho nastavenie na FALSE.<br />
<br />
Príklad:<br />
<delphi> Uses forms, lcltype, dialogs, controls;<br />
<br />
procedure TryInputQuery;<br />
var QueryResult: boolean;<br />
userstring: string;<br />
begin<br />
if InputQuery ('Question', 'Type in some data', TRUE, userstring)<br />
then ShowMessage (userstring)<br />
else <br />
begin<br />
InputQuery ('Don''t be silly', 'Please try again', userstring);<br />
ShowMessage (userstring);<br />
end<br />
end;</delphi><br />
<br />
<center>[[Image:MessageDlgQuestion.png]] [[Image:DontBeSillly.png]]</center><br />
<br />
===PasswordBox===<br />
<delphi> Function PasswordBox(const ACaption, APrompt : String) : String;</delphi><br />
<br />
Správa sa veľmi podobne ako funkcia '''InputQuery''' s MaskInput = TRUE; rozdiel je, že heslo, ktoré bolo zadané je vrátené ako výsledok funkcie (ako '''InputBox''').<br />
<br />
==Konštanty a Typy v správových dialógoch ==<br />
<br />
Niektoré konštanty a typy, ktoré majú vzťah k použitiu v dialógových oknách a sú preddefinované v knižnici LCL:<br />
<br />
<delphi> const { Defined in LCLType.pp }</delphi><br />
<br />
Celočíslené konštanty pre definovanie typov tlačítiek a ikon pre zobrazenie v '''MessageBox'''<br />
<delphi> MB_OK = $00000000;<br />
MB_OKCANCEL = $00000001;<br />
MB_ABORTRETRYIGNORE = $00000002;<br />
MB_YESNOCANCEL = $00000003;<br />
MB_YESNO = $00000004;<br />
MB_RETRYCANCEL = $00000005;<br />
<br />
MB_ICONHAND = $00000010;<br />
MB_ICONQUESTION = $00000020;<br />
MB_ICONEXCLAMATION = $00000030;<br />
MB_ICONASTERICK = $00000040;<br />
MB_ICONWARNING = MB_ICONEXCLAMATION;<br />
MB_ICONERROR = MB_ICONHAND;<br />
MB_ICONINFORMATION = MB_ICONASTERICK;</delphi><br />
<br />
Celočíselné konštanty definujúce návratovú hodnotu z '''MessageBox''', v závislosti na stlačenom tlačítku<br />
<delphi> IDOK = 1; ID_OK = IDOK;<br />
IDCANCEL = 2; ID_CANCEL = IDCANCEL;<br />
IDABORT = 3; ID_ABORT = IDABORT;<br />
IDRETRY = 4; ID_RETRY = IDRETRY;<br />
IDIGNORE = 5; ID_IGNORE = IDIGNORE;<br />
IDYES = 6; ID_YES = IDYES;<br />
IDNO = 7; ID_NO = IDNO;<br />
IDCLOSE = 8; ID_CLOSE = IDCLOSE;<br />
IDHELP = 9; ID_HELP = IDHELP;</delphi><br />
<br />
Definuje, či je predvolené prvé, druhé alebo tretie tlačítko<br />
<br />
<delphi> MB_DEFBUTTON1 = $00000000;<br />
MB_DEFBUTTON2 = $00000100;<br />
MB_DEFBUTTON3 = $00000200;<br />
MB_DEFBUTTON4 = $00000300;</delphi><br />
<br />
Parameter '''Flags''' funkcie '''MessageBox''' je vytvorený pomocou súčtu konštánt tlačítiek '''[MB_OK..MB_RETRYCANCEL]''', voliteľnej konštanty ikony '''[MB_ICONHAND..MB_ICONINFORMATION]''' a voliteľnej konštanty predvoleného tlačítka '''[MB_DEFBUTTON1..MB_DEFBUTTON3]'''<br />
<br />
Typy prepoužitie v '''MessageDlg''', ktorý potrebuje parametre AType typu '''TMsgDlgType''' a AButtons typu '''TMSgDlgButtons'''<br />
<br />
<delphi> { Defined in Dialogs.pp }<br />
type<br />
TMsgDlgType = (mtWarning, mtError, mtInformation, mtConfirmation,<br />
mtCustom);<br />
TMsgDlgBtn = (mbYes, mbNo, mbOK, mbCancel, mbAbort, mbRetry, mbIgnore,<br />
mbAll, mbNoToAll, mbYesToAll, mbHelp, mbClose);<br />
TMsgDlgButtons = set of TMsgDlgBtn;<br />
<br />
const<br />
mbYesNoCancel = [mbYes, mbNo, mbCancel];<br />
mbOKCancel = [mbOK, mbCancel];<br />
mbAbortRetryIgnore = [mbAbort, mbRetry, mbIgnore];<br />
<br />
MsgDlgBtnToBitBtnKind: array[TMsgDlgBtn] of TBitBtnKind = (<br />
bkYes, bkNo, bkOK, bkCancel, bkAbort, bkRetry, bkIgnore,<br />
bkAll, bkNoToAll, bkYesToAll, bkHelp, bkClose<br />
);<br />
<br />
BitBtnKindToMsgDlgBtn: array[TBitBtnKind] of TMsgDlgBtn = (<br />
mbOk, mbOK, mbCancel, mbHelp, mbYes, mbNo,<br />
mbClose, mbAbort, mbRetry, mbIgnore, mbAll, mbNoToALl, mbYesToAll<br />
);</delphi><br />
<br />
<delphi> { Defined in Controls.pp }<br />
const<br />
mrNone = 0;<br />
mrOK = mrNone + 1;<br />
mrCancel = mrNone + 2;<br />
mrAbort = mrNone + 3;<br />
mrRetry = mrNone + 4;<br />
mrIgnore = mrNone + 5;<br />
mrYes = mrNone + 6;<br />
mrNo = mrNone + 7;<br />
mrAll = mrNone + 8;<br />
mrNoToAll = mrNone + 9;<br />
mrYesToAll = mrNone + 10;<br />
mrLast = mrYesToAll;</delphi><br />
<br />
----<br />
*Initial translation by --[[User:Slavko|Komunista]] 20:57, 17 November 2008 (CET)<br />
*This page has been imported from the epikwiki [http://lazarus-ccr.sourceforge.net/index.php?wiki=DialogExamples version].</div>Slavkohttps://wiki.freepascal.org/index.php?title=Dialog_Examples/sk&diff=32040Dialog Examples/sk2008-11-17T20:00:13Z<p>Slavko: /* Konštanty a Typy v správových dialógoch */ translation correction</p>
<hr />
<div>{{Dialog Examples}}<br />
<br />
= Niektoré užitočné dialógy =<br />
Toto sú niektoré užitočné dialógy, ktoré nenájdete v Palete komonentov:<br />
<br />
* procedure ShowMessage (const Msg: string);<br />
* function MessageBox (Text, Caption : PChar; Flags: Word): Integer;<br />
* function MessageDlg (const Msg: string; AType: TMsgDlgType; AButtons: TMsgDlgButtons; HelpCtx: LongInt): Word;<br />
* function InputBox (const ACaption, APrompt, ADefault: string); string;<br />
* function InputQuery (const ACaption, APrompt: string; var Value: string): Boolean;<br />
* function PasswordBox(const ACaption, APrompt : String) : String;<br />
<br />
Každý z týchto komponentov zobrazuje malé vyskakovacie dialógové okno, ktoré obsahuje nejaké informácie a vyžaduje odozvu používateľa: stlačenie tlačítka, zadanie textu alebo oboje. Programátor má minimálnu kontrolu nad formátom, veľkosťou alebo pozíciou týchto vyskakovacích okien, ale môže ovplyvňovať ich textový obsah.<br><br />
Dôvodom prečo často existujú veľmi podobné alternatívy, je umožniť rôzne spôsoby volania komponentu, a získavania dát, z procedúr a funkcií.<br />
<br />
==Správové dialógy==<br />
Správové dialógy zobrazujú správu a čakajú na stlačenie klávesy alebo kliknutie myšou.<br />
===ShowMessage===<br />
<delphi> Procedure ShowMessage (const Msg: string);<br />
<br />
{ Defined in Dialogs.pp }</delphi><br />
<br />
Najjednoduchší správový dialóg: prijíma jednoduchý textový prarmeter, zobrazí ho v stereotypnom okne a pred vrátením, do volajúcej rutiny alebo programu, čaká na kliknutie myšou alebo kláves enter.<br><br />
Toto je modálne volanie procedúry, ktoré zobrazí okno, získa zameranie a tohoto sa nevzdá, pokiaľ nie je stlačené OK.<br />
<br />
Príklad:<br />
<delphi> Program LazMessage;<br />
Uses Dialogs;<br />
begin<br />
ShowMessage ('This is a message from Lazarus')<br />
end.</delphi><br />
<br />
===MessageBox===<br />
<delphi> Function Application.MessageBox (Text, Caption: PChar; Flags: longint) : Integer;<br />
<br />
{ Defined in Forms.pp as part of TApplication; hence must be called as Application.Messagebox () <br />
or using the 'with Application do ...' construct }</delphi><br />
<br />
Parametre:<br />
* '''Text''': reťazec, ktorý je v okne zobrazený ako otázka ale inštrukcia;<br />
* '''Caption''': textový štítok, ktorý je zobrazený na vrchu okna správy;<br />
* '''Flags''': longint - integer vytvorený sčítaním rôznych konštánt, ktorými je definovaný obsah a správanie okna, napríklad '''MB_ABORTRETRYIGNORE + MR_ICONQUESTION''' nastaví, že aplikácia zobrazí ikonu otázky (?) v okne s tromi tlačítkami: ABORT, RETRY a IGNORE.<br />
<br />
Funkcia vracia hodnotu integer, ktorá zodpovedá stlačenému tlačítku; jej hodnota je daná odkazom na konštanty [IDOK..IDHELP]<br />
<br />
Môže byť volaná ako procedúra (tj. formulácia 'MessageBox()' namiesto volania funkcie 'Variable := MessageBox()' – viz. príklad nižšie)<br />
<br />
Príklad:<br />
<delphi> Uses Forms, Dialogs, LCLType;<br />
<br />
Procedure DisplayMessageBox;<br />
var reply, boxstyle: integer;<br />
begin<br />
with application do begin<br />
boxstyle := MB_ICONQUESTION + MB_YESNO;<br />
reply := MessageBox ('Press either button', 'MessageBoxDemo', boxstyle);<br />
if reply = IDYES then MessageBox ('Yes ', 'Reply',MB_ICONINFORMATION)<br />
else MessageBox ('No ', 'Reply', MB_ICONHAND);<br />
end;</delphi><br />
<br />
Všimnite si, že v tomto príklade sú reťazce 'Yes' a 'No' doplnené medzerami; inak by okno nebolo dosť široké na správne zobrazenie titulku.<br />
<br />
<center>[[Image:MessageBoxDemo.png]] [[Image:ReplyYes.png]]</center><br />
<br />
===MessageDLG===<br />
<delphi> function MessageDlg(const aMsg: string; DlgType: TMsgDlgType; <br />
Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;<br />
function MessageDlg(const aCaption, aMsg: string; DlgType: TMsgDlgType; <br />
Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;</delphi><br />
<br />
Táto funkcia má dve verzie, teda prvý parameter 'Caption' je voliteľný, ak je vynechaný nie je zobrazený Titulok.<br />
<br />
Toto je najkomplexnejší a najprepracovanejší správový dialóg, ktorý poskytuje programátorovi značnú kontrolu nad vzhľadom dialógového okna. Parametre definujúce typ okna a jeho ikonu sú typy, namiesto konštánt a tlačítka môžu byť zadané ako množina v lomených zátvorkách, napr. '''[mbRetry, mbIgnore, mbAbort, mbCancel]'''. Parameter '''HelpCtx''' aktuálne nie je implementovaný a musí bať nastavený na nulu. Návratová hodnota funkcie je identická ako stlačené tlačítko, reprezentovaná ako integer (viz nasledujúcu definície, [mrNone..mrAll]).<br />
<br />
Príklad:<br />
<delphi> Uses forms, dialogs, lcltype, controls;<br />
<br />
procedure TryMessageDlg;<br />
begin<br />
if MessageDlg ('Question', 'Do you wish to Execute?', mtConfirmation, <br />
[mbYes, mbNo, mbIgnore], 0) = mrYes<br />
then <br />
{ Execute rest of Program };<br />
end;</delphi><br />
<br />
<center> http://lazarus-ccr.sourceforge.net/kbdata/Question.png <br />
</center><br />
<br />
== Dialógy textového vstupu ==<br />
Dialógy textového vstupu, zobrazujú správu a dovoľujú používateľovi zadať požadovanú textovú hodnotu.<br />
<br />
===InputBox===<br />
<br />
<delphi>Function InputBox(const ACaption, APrompt, ADefault : String) : String;</delphi><br />
<br />
Zobrazuje okno s definovaným nadpisom, otázku a čaká na používateľský vstup v textovom poli. Voliteľne môže byť pre textové pole definovaný aj predvolený reťazec. Používateľom zadaný text alebo predvolený reťazec je vrátený ako výsledok funkcie.<br />
<br />
Príklad:<br />
<delphi> Uses forms, lcltype, dialogs, controls;<br />
<br />
procedure TryInputBox;<br />
var userstring: string;<br />
begin<br />
userstring := InputBox ('Get some text input', <br />
'Please type in some information', 'Some sample text');<br />
ShowMessage (userstring)<br />
end;</delphi><br />
<br />
===InputQuery===<br />
<delphi> Function InputQuery(const ACaption, APrompt : String;<br />
MaskInput : Boolean; var Value : String) : Boolean;<br />
Function InputQuery(const ACaption, APrompt : String;<br />
var Value : String) : Boolean;</delphi><br />
<br />
Dve verzie tejto funkcie, ktoré zobrazujú otázku a čakajú používateľský vstup textových dát; prvá verzia zahŕňa logický parameter '''MaskInput''', ktorý určuje, či má byť používateľský vstup v textovom poli maskovaný hviezdičkami (ako pri zadávaní hesla), zatiaľ čo druhá túto vlastnosť vynecháva. Používateľom zadaný text je vrátený v parametri 'Value'; výsledkom funkcie je logická hodnota, ktorá vracia '''TRUE''', ak bolo stlačené tlačítko OK alebo '''FALSE''', ak bolo okno zatvorené iným spôsobom (napríklad kliknutím na ikonu 'Zatvoriť' v lište okna). Vynechanie parametra MaskInput má rovnaký výsledok ako jeho nastavenie na FALSE.<br />
<br />
Príklad:<br />
<delphi> Uses forms, lcltype, dialogs, controls;<br />
<br />
procedure TryInputQuery;<br />
var QueryResult: boolean;<br />
userstring: string;<br />
begin<br />
if InputQuery ('Question', 'Type in some data', TRUE, userstring)<br />
then ShowMessage (userstring)<br />
else <br />
begin<br />
InputQuery ('Don''t be silly', 'Please try again', userstring);<br />
ShowMessage (userstring);<br />
end<br />
end;</delphi><br />
<br />
<center>[[Image:MessageDlgQuestion.png]] [[Image:DontBeSillly.png]]</center><br />
<br />
===PasswordBox===<br />
<delphi> Function PasswordBox(const ACaption, APrompt : String) : String;</delphi><br />
<br />
Správa sa veľmi podobne ako funkcia '''InputQuery''' s MaskInput = TRUE; rozdiel je, že heslo, ktoré bolo zadané je vrátené ako výsledok funkcie (ako '''InputBox''').<br />
<br />
==Konštanty a Typy v správových dialógoch ==<br />
<br />
Niektoré konštanty a typy, ktoré majú vzťah k použitiu v dialógových oknách a sú preddefinované v knižnici LCL:<br />
<br />
<delphi> const { Defined in LCLType.pp }</delphi><br />
<br />
Celočíslené konštanty pre definovanie typov tlačítiek a ikon pre zobrazenie v '''MessageBox'''<br />
<delphi> MB_OK = $00000000;<br />
MB_OKCANCEL = $00000001;<br />
MB_ABORTRETRYIGNORE = $00000002;<br />
MB_YESNOCANCEL = $00000003;<br />
MB_YESNO = $00000004;<br />
MB_RETRYCANCEL = $00000005;<br />
<br />
MB_ICONHAND = $00000010;<br />
MB_ICONQUESTION = $00000020;<br />
MB_ICONEXCLAMATION = $00000030;<br />
MB_ICONASTERICK = $00000040;<br />
MB_ICONWARNING = MB_ICONEXCLAMATION;<br />
MB_ICONERROR = MB_ICONHAND;<br />
MB_ICONINFORMATION = MB_ICONASTERICK;</delphi><br />
<br />
Celočíselné konštanty definujúce návratovú hodnotu z '''MessageBox''', v závislosti na stlačenom tlačítku<br />
<delphi> IDOK = 1; ID_OK = IDOK;<br />
IDCANCEL = 2; ID_CANCEL = IDCANCEL;<br />
IDABORT = 3; ID_ABORT = IDABORT;<br />
IDRETRY = 4; ID_RETRY = IDRETRY;<br />
IDIGNORE = 5; ID_IGNORE = IDIGNORE;<br />
IDYES = 6; ID_YES = IDYES;<br />
IDNO = 7; ID_NO = IDNO;<br />
IDCLOSE = 8; ID_CLOSE = IDCLOSE;<br />
IDHELP = 9; ID_HELP = IDHELP;</delphi><br />
<br />
Definuje, či je predvolené prvé, druhé alebo tretie tlačítko<br />
<br />
<delphi> MB_DEFBUTTON1 = $00000000;<br />
MB_DEFBUTTON2 = $00000100;<br />
MB_DEFBUTTON3 = $00000200;<br />
MB_DEFBUTTON4 = $00000300;</delphi><br />
<br />
Parameter '''Flags''' funkcie '''MessageBox''' je vytvorený pomocou súčtu konštánt tlačítiek '''[MB_OK..MB_RETRYCANCEL]''', voliteľnej konštanty ikony '''[MB_ICONHAND..MB_ICONINFORMATION]''' a voliteľnej konštanty predvoleného tlačítka '''[MB_DEFBUTTON1..MB_DEFBUTTON3]'''<br />
<br />
Typy prepoužitie v '''MessageDlg''', ktorý potrebuje parametre AType typu '''TMsgDlgType''' a AButtons typu '''TMSgDlgButtons'''<br />
<br />
<delphi> { Defined in Dialogs.pp }<br />
type<br />
TMsgDlgType = (mtWarning, mtError, mtInformation, mtConfirmation,<br />
mtCustom);<br />
TMsgDlgBtn = (mbYes, mbNo, mbOK, mbCancel, mbAbort, mbRetry, mbIgnore,<br />
mbAll, mbNoToAll, mbYesToAll, mbHelp, mbClose);<br />
TMsgDlgButtons = set of TMsgDlgBtn;<br />
<br />
const<br />
mbYesNoCancel = [mbYes, mbNo, mbCancel];<br />
mbOKCancel = [mbOK, mbCancel];<br />
mbAbortRetryIgnore = [mbAbort, mbRetry, mbIgnore];<br />
<br />
MsgDlgBtnToBitBtnKind: array[TMsgDlgBtn] of TBitBtnKind = (<br />
bkYes, bkNo, bkOK, bkCancel, bkAbort, bkRetry, bkIgnore,<br />
bkAll, bkNoToAll, bkYesToAll, bkHelp, bkClose<br />
);<br />
<br />
BitBtnKindToMsgDlgBtn: array[TBitBtnKind] of TMsgDlgBtn = (<br />
mbOk, mbOK, mbCancel, mbHelp, mbYes, mbNo,<br />
mbClose, mbAbort, mbRetry, mbIgnore, mbAll, mbNoToALl, mbYesToAll<br />
);</delphi><br />
<br />
<delphi> { Defined in Controls.pp }<br />
const<br />
mrNone = 0;<br />
mrOK = mrNone + 1;<br />
mrCancel = mrNone + 2;<br />
mrAbort = mrNone + 3;<br />
mrRetry = mrNone + 4;<br />
mrIgnore = mrNone + 5;<br />
mrYes = mrNone + 6;<br />
mrNo = mrNone + 7;<br />
mrAll = mrNone + 8;<br />
mrNoToAll = mrNone + 9;<br />
mrYesToAll = mrNone + 10;<br />
mrLast = mrYesToAll;</delphi><br />
<br />
----<br />
*Initial translation by --[[User:Slavko|Komunista]] 20:57, 17 November 2008 (CET)<br />
*This page has been imported from the epikwiki [http://lazarus-ccr.sourceforge.net/index.php?wiki=DialogExamples version].</div>Slavkohttps://wiki.freepascal.org/index.php?title=Dialog_Examples/sk&diff=32039Dialog Examples/sk2008-11-17T19:57:41Z<p>Slavko: /* Constants and Types used in message dialogs */ translation</p>
<hr />
<div>{{Dialog Examples}}<br />
<br />
= Niektoré užitočné dialógy =<br />
Toto sú niektoré užitočné dialógy, ktoré nenájdete v Palete komonentov:<br />
<br />
* procedure ShowMessage (const Msg: string);<br />
* function MessageBox (Text, Caption : PChar; Flags: Word): Integer;<br />
* function MessageDlg (const Msg: string; AType: TMsgDlgType; AButtons: TMsgDlgButtons; HelpCtx: LongInt): Word;<br />
* function InputBox (const ACaption, APrompt, ADefault: string); string;<br />
* function InputQuery (const ACaption, APrompt: string; var Value: string): Boolean;<br />
* function PasswordBox(const ACaption, APrompt : String) : String;<br />
<br />
Každý z týchto komponentov zobrazuje malé vyskakovacie dialógové okno, ktoré obsahuje nejaké informácie a vyžaduje odozvu používateľa: stlačenie tlačítka, zadanie textu alebo oboje. Programátor má minimálnu kontrolu nad formátom, veľkosťou alebo pozíciou týchto vyskakovacích okien, ale môže ovplyvňovať ich textový obsah.<br><br />
Dôvodom prečo často existujú veľmi podobné alternatívy, je umožniť rôzne spôsoby volania komponentu, a získavania dát, z procedúr a funkcií.<br />
<br />
==Správové dialógy==<br />
Správové dialógy zobrazujú správu a čakajú na stlačenie klávesy alebo kliknutie myšou.<br />
===ShowMessage===<br />
<delphi> Procedure ShowMessage (const Msg: string);<br />
<br />
{ Defined in Dialogs.pp }</delphi><br />
<br />
Najjednoduchší správový dialóg: prijíma jednoduchý textový prarmeter, zobrazí ho v stereotypnom okne a pred vrátením, do volajúcej rutiny alebo programu, čaká na kliknutie myšou alebo kláves enter.<br><br />
Toto je modálne volanie procedúry, ktoré zobrazí okno, získa zameranie a tohoto sa nevzdá, pokiaľ nie je stlačené OK.<br />
<br />
Príklad:<br />
<delphi> Program LazMessage;<br />
Uses Dialogs;<br />
begin<br />
ShowMessage ('This is a message from Lazarus')<br />
end.</delphi><br />
<br />
===MessageBox===<br />
<delphi> Function Application.MessageBox (Text, Caption: PChar; Flags: longint) : Integer;<br />
<br />
{ Defined in Forms.pp as part of TApplication; hence must be called as Application.Messagebox () <br />
or using the 'with Application do ...' construct }</delphi><br />
<br />
Parametre:<br />
* '''Text''': reťazec, ktorý je v okne zobrazený ako otázka ale inštrukcia;<br />
* '''Caption''': textový štítok, ktorý je zobrazený na vrchu okna správy;<br />
* '''Flags''': longint - integer vytvorený sčítaním rôznych konštánt, ktorými je definovaný obsah a správanie okna, napríklad '''MB_ABORTRETRYIGNORE + MR_ICONQUESTION''' nastaví, že aplikácia zobrazí ikonu otázky (?) v okne s tromi tlačítkami: ABORT, RETRY a IGNORE.<br />
<br />
Funkcia vracia hodnotu integer, ktorá zodpovedá stlačenému tlačítku; jej hodnota je daná odkazom na konštanty [IDOK..IDHELP]<br />
<br />
Môže byť volaná ako procedúra (tj. formulácia 'MessageBox()' namiesto volania funkcie 'Variable := MessageBox()' – viz. príklad nižšie)<br />
<br />
Príklad:<br />
<delphi> Uses Forms, Dialogs, LCLType;<br />
<br />
Procedure DisplayMessageBox;<br />
var reply, boxstyle: integer;<br />
begin<br />
with application do begin<br />
boxstyle := MB_ICONQUESTION + MB_YESNO;<br />
reply := MessageBox ('Press either button', 'MessageBoxDemo', boxstyle);<br />
if reply = IDYES then MessageBox ('Yes ', 'Reply',MB_ICONINFORMATION)<br />
else MessageBox ('No ', 'Reply', MB_ICONHAND);<br />
end;</delphi><br />
<br />
Všimnite si, že v tomto príklade sú reťazce 'Yes' a 'No' doplnené medzerami; inak by okno nebolo dosť široké na správne zobrazenie titulku.<br />
<br />
<center>[[Image:MessageBoxDemo.png]] [[Image:ReplyYes.png]]</center><br />
<br />
===MessageDLG===<br />
<delphi> function MessageDlg(const aMsg: string; DlgType: TMsgDlgType; <br />
Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;<br />
function MessageDlg(const aCaption, aMsg: string; DlgType: TMsgDlgType; <br />
Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;</delphi><br />
<br />
Táto funkcia má dve verzie, teda prvý parameter 'Caption' je voliteľný, ak je vynechaný nie je zobrazený Titulok.<br />
<br />
Toto je najkomplexnejší a najprepracovanejší správový dialóg, ktorý poskytuje programátorovi značnú kontrolu nad vzhľadom dialógového okna. Parametre definujúce typ okna a jeho ikonu sú typy, namiesto konštánt a tlačítka môžu byť zadané ako množina v lomených zátvorkách, napr. '''[mbRetry, mbIgnore, mbAbort, mbCancel]'''. Parameter '''HelpCtx''' aktuálne nie je implementovaný a musí bať nastavený na nulu. Návratová hodnota funkcie je identická ako stlačené tlačítko, reprezentovaná ako integer (viz nasledujúcu definície, [mrNone..mrAll]).<br />
<br />
Príklad:<br />
<delphi> Uses forms, dialogs, lcltype, controls;<br />
<br />
procedure TryMessageDlg;<br />
begin<br />
if MessageDlg ('Question', 'Do you wish to Execute?', mtConfirmation, <br />
[mbYes, mbNo, mbIgnore], 0) = mrYes<br />
then <br />
{ Execute rest of Program };<br />
end;</delphi><br />
<br />
<center> http://lazarus-ccr.sourceforge.net/kbdata/Question.png <br />
</center><br />
<br />
== Dialógy textového vstupu ==<br />
Dialógy textového vstupu, zobrazujú správu a dovoľujú používateľovi zadať požadovanú textovú hodnotu.<br />
<br />
===InputBox===<br />
<br />
<delphi>Function InputBox(const ACaption, APrompt, ADefault : String) : String;</delphi><br />
<br />
Zobrazuje okno s definovaným nadpisom, otázku a čaká na používateľský vstup v textovom poli. Voliteľne môže byť pre textové pole definovaný aj predvolený reťazec. Používateľom zadaný text alebo predvolený reťazec je vrátený ako výsledok funkcie.<br />
<br />
Príklad:<br />
<delphi> Uses forms, lcltype, dialogs, controls;<br />
<br />
procedure TryInputBox;<br />
var userstring: string;<br />
begin<br />
userstring := InputBox ('Get some text input', <br />
'Please type in some information', 'Some sample text');<br />
ShowMessage (userstring)<br />
end;</delphi><br />
<br />
===InputQuery===<br />
<delphi> Function InputQuery(const ACaption, APrompt : String;<br />
MaskInput : Boolean; var Value : String) : Boolean;<br />
Function InputQuery(const ACaption, APrompt : String;<br />
var Value : String) : Boolean;</delphi><br />
<br />
Dve verzie tejto funkcie, ktoré zobrazujú otázku a čakajú používateľský vstup textových dát; prvá verzia zahŕňa logický parameter '''MaskInput''', ktorý určuje, či má byť používateľský vstup v textovom poli maskovaný hviezdičkami (ako pri zadávaní hesla), zatiaľ čo druhá túto vlastnosť vynecháva. Používateľom zadaný text je vrátený v parametri 'Value'; výsledkom funkcie je logická hodnota, ktorá vracia '''TRUE''', ak bolo stlačené tlačítko OK alebo '''FALSE''', ak bolo okno zatvorené iným spôsobom (napríklad kliknutím na ikonu 'Zatvoriť' v lište okna). Vynechanie parametra MaskInput má rovnaký výsledok ako jeho nastavenie na FALSE.<br />
<br />
Príklad:<br />
<delphi> Uses forms, lcltype, dialogs, controls;<br />
<br />
procedure TryInputQuery;<br />
var QueryResult: boolean;<br />
userstring: string;<br />
begin<br />
if InputQuery ('Question', 'Type in some data', TRUE, userstring)<br />
then ShowMessage (userstring)<br />
else <br />
begin<br />
InputQuery ('Don''t be silly', 'Please try again', userstring);<br />
ShowMessage (userstring);<br />
end<br />
end;</delphi><br />
<br />
<center>[[Image:MessageDlgQuestion.png]] [[Image:DontBeSillly.png]]</center><br />
<br />
===PasswordBox===<br />
<delphi> Function PasswordBox(const ACaption, APrompt : String) : String;</delphi><br />
<br />
Správa sa veľmi podobne ako funkcia '''InputQuery''' s MaskInput = TRUE; rozdiel je, že heslo, ktoré bolo zadané je vrátené ako výsledok funkcie (ako '''InputBox''').<br />
<br />
==Konštanty a Typy v správových dialógoch ==<br />
<br />
Niektoré konštanty a typy, ktoré majú vzťah k použitiu v dialógových oknách a sú preddefinované v knižnici LCL:<br />
<br />
<delphi> const { Defined in LCLType.pp }</delphi><br />
<br />
Celočíslené konštanty pre definovanie typov tlačítiek a ikon pre zobrazenie v '''MessageBox'''<br />
<delphi> MB_OK = $00000000;<br />
MB_OKCANCEL = $00000001;<br />
MB_ABORTRETRYIGNORE = $00000002;<br />
MB_YESNOCANCEL = $00000003;<br />
MB_YESNO = $00000004;<br />
MB_RETRYCANCEL = $00000005;<br />
<br />
MB_ICONHAND = $00000010;<br />
MB_ICONQUESTION = $00000020;<br />
MB_ICONEXCLAMATION = $00000030;<br />
MB_ICONASTERICK = $00000040;<br />
MB_ICONWARNING = MB_ICONEXCLAMATION;<br />
MB_ICONERROR = MB_ICONHAND;<br />
MB_ICONINFORMATION = MB_ICONASTERICK;</delphi><br />
<br />
Celočíselné konštanty definujúce návratovú hodnotu z '''MessageBox''', v závislosti na stlačenom tlačítku<br />
<delphi> IDOK = 1; ID_OK = IDOK;<br />
IDCANCEL = 2; ID_CANCEL = IDCANCEL;<br />
IDABORT = 3; ID_ABORT = IDABORT;<br />
IDRETRY = 4; ID_RETRY = IDRETRY;<br />
IDIGNORE = 5; ID_IGNORE = IDIGNORE;<br />
IDYES = 6; ID_YES = IDYES;<br />
IDNO = 7; ID_NO = IDNO;<br />
IDCLOSE = 8; ID_CLOSE = IDCLOSE;<br />
IDHELP = 9; ID_HELP = IDHELP;</delphi><br />
<br />
Definuje, či je predvolené prvé, druhé alebo tretie tlačítko<br />
<br />
<delphi> MB_DEFBUTTON1 = $00000000;<br />
MB_DEFBUTTON2 = $00000100;<br />
MB_DEFBUTTON3 = $00000200;<br />
MB_DEFBUTTON4 = $00000300;</delphi><br />
<br />
Parameter '''Flags''' funkcie '''MessageBox''' je vytvorený pomocou súčtu konštánt tlačítiek '''[MB_OK..MB_RETRYCANCEL]''', voliteľnej konštanty ikony '''[MB_ICONHAND..MB_ICONINFORMATION]''' a voliteľnej konštanty predvoleného tlačítka '''[MB_DEFBUTTON1..MB_DEFBUTTON3]'''<br />
<br />
Types for use in MessageDlg, which needs parameters AType of TMsgDlgType and AButtons of TMSgDlgButtons<br />
<br />
<delphi> { Defined in Dialogs.pp }<br />
type<br />
TMsgDlgType = (mtWarning, mtError, mtInformation, mtConfirmation,<br />
mtCustom);<br />
TMsgDlgBtn = (mbYes, mbNo, mbOK, mbCancel, mbAbort, mbRetry, mbIgnore,<br />
mbAll, mbNoToAll, mbYesToAll, mbHelp, mbClose);<br />
TMsgDlgButtons = set of TMsgDlgBtn;<br />
<br />
const<br />
mbYesNoCancel = [mbYes, mbNo, mbCancel];<br />
mbOKCancel = [mbOK, mbCancel];<br />
mbAbortRetryIgnore = [mbAbort, mbRetry, mbIgnore];<br />
<br />
MsgDlgBtnToBitBtnKind: array[TMsgDlgBtn] of TBitBtnKind = (<br />
bkYes, bkNo, bkOK, bkCancel, bkAbort, bkRetry, bkIgnore,<br />
bkAll, bkNoToAll, bkYesToAll, bkHelp, bkClose<br />
);<br />
<br />
BitBtnKindToMsgDlgBtn: array[TBitBtnKind] of TMsgDlgBtn = (<br />
mbOk, mbOK, mbCancel, mbHelp, mbYes, mbNo,<br />
mbClose, mbAbort, mbRetry, mbIgnore, mbAll, mbNoToALl, mbYesToAll<br />
);<br />
<br />
{ Defined in Controls.pp }<br />
const<br />
mrNone = 0;<br />
mrOK = mrNone + 1;<br />
mrCancel = mrNone + 2;<br />
mrAbort = mrNone + 3;<br />
mrRetry = mrNone + 4;<br />
mrIgnore = mrNone + 5;<br />
mrYes = mrNone + 6;<br />
mrNo = mrNone + 7;<br />
mrAll = mrNone + 8;<br />
mrNoToAll = mrNone + 9;<br />
mrYesToAll = mrNone + 10;<br />
mrLast = mrYesToAll;</delphi><br />
<br />
----<br />
*Initial translation by --[[User:Slavko|Komunista]] 20:57, 17 November 2008 (CET)<br />
*This page has been imported from the epikwiki [http://lazarus-ccr.sourceforge.net/index.php?wiki=DialogExamples version].</div>Slavkohttps://wiki.freepascal.org/index.php?title=Dialog_Examples/sk&diff=32038Dialog Examples/sk2008-11-17T19:51:51Z<p>Slavko: /* Text input Dialogs */ translation</p>
<hr />
<div>{{Dialog Examples}}<br />
<br />
= Niektoré užitočné dialógy =<br />
Toto sú niektoré užitočné dialógy, ktoré nenájdete v Palete komonentov:<br />
<br />
* procedure ShowMessage (const Msg: string);<br />
* function MessageBox (Text, Caption : PChar; Flags: Word): Integer;<br />
* function MessageDlg (const Msg: string; AType: TMsgDlgType; AButtons: TMsgDlgButtons; HelpCtx: LongInt): Word;<br />
* function InputBox (const ACaption, APrompt, ADefault: string); string;<br />
* function InputQuery (const ACaption, APrompt: string; var Value: string): Boolean;<br />
* function PasswordBox(const ACaption, APrompt : String) : String;<br />
<br />
Každý z týchto komponentov zobrazuje malé vyskakovacie dialógové okno, ktoré obsahuje nejaké informácie a vyžaduje odozvu používateľa: stlačenie tlačítka, zadanie textu alebo oboje. Programátor má minimálnu kontrolu nad formátom, veľkosťou alebo pozíciou týchto vyskakovacích okien, ale môže ovplyvňovať ich textový obsah.<br><br />
Dôvodom prečo často existujú veľmi podobné alternatívy, je umožniť rôzne spôsoby volania komponentu, a získavania dát, z procedúr a funkcií.<br />
<br />
==Správové dialógy==<br />
Správové dialógy zobrazujú správu a čakajú na stlačenie klávesy alebo kliknutie myšou.<br />
===ShowMessage===<br />
<delphi> Procedure ShowMessage (const Msg: string);<br />
<br />
{ Defined in Dialogs.pp }</delphi><br />
<br />
Najjednoduchší správový dialóg: prijíma jednoduchý textový prarmeter, zobrazí ho v stereotypnom okne a pred vrátením, do volajúcej rutiny alebo programu, čaká na kliknutie myšou alebo kláves enter.<br><br />
Toto je modálne volanie procedúry, ktoré zobrazí okno, získa zameranie a tohoto sa nevzdá, pokiaľ nie je stlačené OK.<br />
<br />
Príklad:<br />
<delphi> Program LazMessage;<br />
Uses Dialogs;<br />
begin<br />
ShowMessage ('This is a message from Lazarus')<br />
end.</delphi><br />
<br />
===MessageBox===<br />
<delphi> Function Application.MessageBox (Text, Caption: PChar; Flags: longint) : Integer;<br />
<br />
{ Defined in Forms.pp as part of TApplication; hence must be called as Application.Messagebox () <br />
or using the 'with Application do ...' construct }</delphi><br />
<br />
Parametre:<br />
* '''Text''': reťazec, ktorý je v okne zobrazený ako otázka ale inštrukcia;<br />
* '''Caption''': textový štítok, ktorý je zobrazený na vrchu okna správy;<br />
* '''Flags''': longint - integer vytvorený sčítaním rôznych konštánt, ktorými je definovaný obsah a správanie okna, napríklad '''MB_ABORTRETRYIGNORE + MR_ICONQUESTION''' nastaví, že aplikácia zobrazí ikonu otázky (?) v okne s tromi tlačítkami: ABORT, RETRY a IGNORE.<br />
<br />
Funkcia vracia hodnotu integer, ktorá zodpovedá stlačenému tlačítku; jej hodnota je daná odkazom na konštanty [IDOK..IDHELP]<br />
<br />
Môže byť volaná ako procedúra (tj. formulácia 'MessageBox()' namiesto volania funkcie 'Variable := MessageBox()' – viz. príklad nižšie)<br />
<br />
Príklad:<br />
<delphi> Uses Forms, Dialogs, LCLType;<br />
<br />
Procedure DisplayMessageBox;<br />
var reply, boxstyle: integer;<br />
begin<br />
with application do begin<br />
boxstyle := MB_ICONQUESTION + MB_YESNO;<br />
reply := MessageBox ('Press either button', 'MessageBoxDemo', boxstyle);<br />
if reply = IDYES then MessageBox ('Yes ', 'Reply',MB_ICONINFORMATION)<br />
else MessageBox ('No ', 'Reply', MB_ICONHAND);<br />
end;</delphi><br />
<br />
Všimnite si, že v tomto príklade sú reťazce 'Yes' a 'No' doplnené medzerami; inak by okno nebolo dosť široké na správne zobrazenie titulku.<br />
<br />
<center>[[Image:MessageBoxDemo.png]] [[Image:ReplyYes.png]]</center><br />
<br />
===MessageDLG===<br />
<delphi> function MessageDlg(const aMsg: string; DlgType: TMsgDlgType; <br />
Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;<br />
function MessageDlg(const aCaption, aMsg: string; DlgType: TMsgDlgType; <br />
Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;</delphi><br />
<br />
Táto funkcia má dve verzie, teda prvý parameter 'Caption' je voliteľný, ak je vynechaný nie je zobrazený Titulok.<br />
<br />
Toto je najkomplexnejší a najprepracovanejší správový dialóg, ktorý poskytuje programátorovi značnú kontrolu nad vzhľadom dialógového okna. Parametre definujúce typ okna a jeho ikonu sú typy, namiesto konštánt a tlačítka môžu byť zadané ako množina v lomených zátvorkách, napr. '''[mbRetry, mbIgnore, mbAbort, mbCancel]'''. Parameter '''HelpCtx''' aktuálne nie je implementovaný a musí bať nastavený na nulu. Návratová hodnota funkcie je identická ako stlačené tlačítko, reprezentovaná ako integer (viz nasledujúcu definície, [mrNone..mrAll]).<br />
<br />
Príklad:<br />
<delphi> Uses forms, dialogs, lcltype, controls;<br />
<br />
procedure TryMessageDlg;<br />
begin<br />
if MessageDlg ('Question', 'Do you wish to Execute?', mtConfirmation, <br />
[mbYes, mbNo, mbIgnore], 0) = mrYes<br />
then <br />
{ Execute rest of Program };<br />
end;</delphi><br />
<br />
<center> http://lazarus-ccr.sourceforge.net/kbdata/Question.png <br />
</center><br />
<br />
== Dialógy textového vstupu ==<br />
Dialógy textového vstupu, zobrazujú správu a dovoľujú používateľovi zadať požadovanú textovú hodnotu.<br />
<br />
===InputBox===<br />
<br />
<delphi>Function InputBox(const ACaption, APrompt, ADefault : String) : String;</delphi><br />
<br />
Zobrazuje okno s definovaným nadpisom, otázku a čaká na používateľský vstup v textovom poli. Voliteľne môže byť pre textové pole definovaný aj predvolený reťazec. Používateľom zadaný text alebo predvolený reťazec je vrátený ako výsledok funkcie.<br />
<br />
Príklad:<br />
<delphi> Uses forms, lcltype, dialogs, controls;<br />
<br />
procedure TryInputBox;<br />
var userstring: string;<br />
begin<br />
userstring := InputBox ('Get some text input', <br />
'Please type in some information', 'Some sample text');<br />
ShowMessage (userstring)<br />
end;</delphi><br />
<br />
===InputQuery===<br />
<delphi> Function InputQuery(const ACaption, APrompt : String;<br />
MaskInput : Boolean; var Value : String) : Boolean;<br />
Function InputQuery(const ACaption, APrompt : String;<br />
var Value : String) : Boolean;</delphi><br />
<br />
Dve verzie tejto funkcie, ktoré zobrazujú otázku a čakajú používateľský vstup textových dát; prvá verzia zahŕňa logický parameter '''MaskInput''', ktorý určuje, či má byť používateľský vstup v textovom poli maskovaný hviezdičkami (ako pri zadávaní hesla), zatiaľ čo druhá túto vlastnosť vynecháva. Používateľom zadaný text je vrátený v parametri 'Value'; výsledkom funkcie je logická hodnota, ktorá vracia '''TRUE''', ak bolo stlačené tlačítko OK alebo '''FALSE''', ak bolo okno zatvorené iným spôsobom (napríklad kliknutím na ikonu 'Zatvoriť' v lište okna). Vynechanie parametra MaskInput má rovnaký výsledok ako jeho nastavenie na FALSE.<br />
<br />
Príklad:<br />
<delphi> Uses forms, lcltype, dialogs, controls;<br />
<br />
procedure TryInputQuery;<br />
var QueryResult: boolean;<br />
userstring: string;<br />
begin<br />
if InputQuery ('Question', 'Type in some data', TRUE, userstring)<br />
then ShowMessage (userstring)<br />
else <br />
begin<br />
InputQuery ('Don''t be silly', 'Please try again', userstring);<br />
ShowMessage (userstring);<br />
end<br />
end;</delphi><br />
<br />
<center>[[Image:MessageDlgQuestion.png]] [[Image:DontBeSillly.png]]</center><br />
<br />
===PasswordBox===<br />
<delphi> Function PasswordBox(const ACaption, APrompt : String) : String;</delphi><br />
<br />
Správa sa veľmi podobne ako funkcia '''InputQuery''' s MaskInput = TRUE; rozdiel je, že heslo, ktoré bolo zadané je vrátené ako výsledok funkcie (ako '''InputBox''').<br />
<br />
==Constants and Types used in message dialogs==<br />
<br />
Several constants and types relevant for use with the dialog boxes are pre-defined in the LCL library:<br />
<br />
<delphi> const { Defined in LCLType.pp }</delphi><br />
<br />
integer constants for defining the types of buttons<br />
and the icon for display in MessageBox<br />
<br />
<delphi> MB_OK = $00000000;<br />
MB_OKCANCEL = $00000001;<br />
MB_ABORTRETRYIGNORE = $00000002;<br />
MB_YESNOCANCEL = $00000003;<br />
MB_YESNO = $00000004;<br />
MB_RETRYCANCEL = $00000005;<br />
<br />
MB_ICONHAND = $00000010;<br />
MB_ICONQUESTION = $00000020;<br />
MB_ICONEXCLAMATION = $00000030;<br />
MB_ICONASTERICK = $00000040;<br />
MB_ICONWARNING = MB_ICONEXCLAMATION;<br />
MB_ICONERROR = MB_ICONHAND;<br />
MB_ICONINFORMATION = MB_ICONASTERICK;</delphi><br />
<br />
integer constants defining the return value from MessageBox according to which button was pressed<br />
<br />
<delphi> IDOK = 1; ID_OK = IDOK;<br />
IDCANCEL = 2; ID_CANCEL = IDCANCEL;<br />
IDABORT = 3; ID_ABORT = IDABORT;<br />
IDRETRY = 4; ID_RETRY = IDRETRY;<br />
IDIGNORE = 5; ID_IGNORE = IDIGNORE;<br />
IDYES = 6; ID_YES = IDYES;<br />
IDNO = 7; ID_NO = IDNO;<br />
IDCLOSE = 8; ID_CLOSE = IDCLOSE;<br />
IDHELP = 9; ID_HELP = IDHELP;</delphi><br />
<br />
define whether first, second or third button is default<br />
<br />
<delphi> MB_DEFBUTTON1 = $00000000;<br />
MB_DEFBUTTON2 = $00000100;<br />
MB_DEFBUTTON3 = $00000200;<br />
MB_DEFBUTTON4 = $00000300;</delphi><br />
<br />
The Flags parameter of MessageBox is constructed by adding a button constant [MB_OK..MB_RETRYCANCEL], an optional icon constant [MB_ICONHAND..MB_ICONINFORMATION] and an optional default button constant [MB_DEFBUTTON1..MB_DEFBUTTON3]<br />
<br />
Types for use in MessageDlg, which needs parameters AType of TMsgDlgType and AButtons of TMSgDlgButtons<br />
<br />
<delphi> { Defined in Dialogs.pp }<br />
type<br />
TMsgDlgType = (mtWarning, mtError, mtInformation, mtConfirmation,<br />
mtCustom);<br />
TMsgDlgBtn = (mbYes, mbNo, mbOK, mbCancel, mbAbort, mbRetry, mbIgnore,<br />
mbAll, mbNoToAll, mbYesToAll, mbHelp, mbClose);<br />
TMsgDlgButtons = set of TMsgDlgBtn;<br />
<br />
const<br />
mbYesNoCancel = [mbYes, mbNo, mbCancel];<br />
mbOKCancel = [mbOK, mbCancel];<br />
mbAbortRetryIgnore = [mbAbort, mbRetry, mbIgnore];<br />
<br />
MsgDlgBtnToBitBtnKind: array[TMsgDlgBtn] of TBitBtnKind = (<br />
bkYes, bkNo, bkOK, bkCancel, bkAbort, bkRetry, bkIgnore,<br />
bkAll, bkNoToAll, bkYesToAll, bkHelp, bkClose<br />
);<br />
<br />
BitBtnKindToMsgDlgBtn: array[TBitBtnKind] of TMsgDlgBtn = (<br />
mbOk, mbOK, mbCancel, mbHelp, mbYes, mbNo,<br />
mbClose, mbAbort, mbRetry, mbIgnore, mbAll, mbNoToALl, mbYesToAll<br />
);<br />
<br />
{ Defined in Controls.pp }<br />
const<br />
mrNone = 0;<br />
mrOK = mrNone + 1;<br />
mrCancel = mrNone + 2;<br />
mrAbort = mrNone + 3;<br />
mrRetry = mrNone + 4;<br />
mrIgnore = mrNone + 5;<br />
mrYes = mrNone + 6;<br />
mrNo = mrNone + 7;<br />
mrAll = mrNone + 8;<br />
mrNoToAll = mrNone + 9;<br />
mrYesToAll = mrNone + 10;<br />
mrLast = mrYesToAll;</delphi><br />
<br />
----<br />
This page has been imported from the epikwiki [http://lazarus-ccr.sourceforge.net/index.php?wiki=DialogExamples version].</div>Slavkohttps://wiki.freepascal.org/index.php?title=Dialog_Examples/sk&diff=32037Dialog Examples/sk2008-11-17T19:40:45Z<p>Slavko: /* MessageDLG */ typo correction</p>
<hr />
<div>{{Dialog Examples}}<br />
<br />
= Niektoré užitočné dialógy =<br />
Toto sú niektoré užitočné dialógy, ktoré nenájdete v Palete komonentov:<br />
<br />
* procedure ShowMessage (const Msg: string);<br />
* function MessageBox (Text, Caption : PChar; Flags: Word): Integer;<br />
* function MessageDlg (const Msg: string; AType: TMsgDlgType; AButtons: TMsgDlgButtons; HelpCtx: LongInt): Word;<br />
* function InputBox (const ACaption, APrompt, ADefault: string); string;<br />
* function InputQuery (const ACaption, APrompt: string; var Value: string): Boolean;<br />
* function PasswordBox(const ACaption, APrompt : String) : String;<br />
<br />
Každý z týchto komponentov zobrazuje malé vyskakovacie dialógové okno, ktoré obsahuje nejaké informácie a vyžaduje odozvu používateľa: stlačenie tlačítka, zadanie textu alebo oboje. Programátor má minimálnu kontrolu nad formátom, veľkosťou alebo pozíciou týchto vyskakovacích okien, ale môže ovplyvňovať ich textový obsah.<br><br />
Dôvodom prečo často existujú veľmi podobné alternatívy, je umožniť rôzne spôsoby volania komponentu, a získavania dát, z procedúr a funkcií.<br />
<br />
==Správové dialógy==<br />
Správové dialógy zobrazujú správu a čakajú na stlačenie klávesy alebo kliknutie myšou.<br />
===ShowMessage===<br />
<delphi> Procedure ShowMessage (const Msg: string);<br />
<br />
{ Defined in Dialogs.pp }</delphi><br />
<br />
Najjednoduchší správový dialóg: prijíma jednoduchý textový prarmeter, zobrazí ho v stereotypnom okne a pred vrátením, do volajúcej rutiny alebo programu, čaká na kliknutie myšou alebo kláves enter.<br><br />
Toto je modálne volanie procedúry, ktoré zobrazí okno, získa zameranie a tohoto sa nevzdá, pokiaľ nie je stlačené OK.<br />
<br />
Príklad:<br />
<delphi> Program LazMessage;<br />
Uses Dialogs;<br />
begin<br />
ShowMessage ('This is a message from Lazarus')<br />
end.</delphi><br />
<br />
===MessageBox===<br />
<delphi> Function Application.MessageBox (Text, Caption: PChar; Flags: longint) : Integer;<br />
<br />
{ Defined in Forms.pp as part of TApplication; hence must be called as Application.Messagebox () <br />
or using the 'with Application do ...' construct }</delphi><br />
<br />
Parametre:<br />
* '''Text''': reťazec, ktorý je v okne zobrazený ako otázka ale inštrukcia;<br />
* '''Caption''': textový štítok, ktorý je zobrazený na vrchu okna správy;<br />
* '''Flags''': longint - integer vytvorený sčítaním rôznych konštánt, ktorými je definovaný obsah a správanie okna, napríklad '''MB_ABORTRETRYIGNORE + MR_ICONQUESTION''' nastaví, že aplikácia zobrazí ikonu otázky (?) v okne s tromi tlačítkami: ABORT, RETRY a IGNORE.<br />
<br />
Funkcia vracia hodnotu integer, ktorá zodpovedá stlačenému tlačítku; jej hodnota je daná odkazom na konštanty [IDOK..IDHELP]<br />
<br />
Môže byť volaná ako procedúra (tj. formulácia 'MessageBox()' namiesto volania funkcie 'Variable := MessageBox()' – viz. príklad nižšie)<br />
<br />
Príklad:<br />
<delphi> Uses Forms, Dialogs, LCLType;<br />
<br />
Procedure DisplayMessageBox;<br />
var reply, boxstyle: integer;<br />
begin<br />
with application do begin<br />
boxstyle := MB_ICONQUESTION + MB_YESNO;<br />
reply := MessageBox ('Press either button', 'MessageBoxDemo', boxstyle);<br />
if reply = IDYES then MessageBox ('Yes ', 'Reply',MB_ICONINFORMATION)<br />
else MessageBox ('No ', 'Reply', MB_ICONHAND);<br />
end;</delphi><br />
<br />
Všimnite si, že v tomto príklade sú reťazce 'Yes' a 'No' doplnené medzerami; inak by okno nebolo dosť široké na správne zobrazenie titulku.<br />
<br />
<center>[[Image:MessageBoxDemo.png]] [[Image:ReplyYes.png]]</center><br />
<br />
===MessageDLG===<br />
<delphi> function MessageDlg(const aMsg: string; DlgType: TMsgDlgType; <br />
Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;<br />
function MessageDlg(const aCaption, aMsg: string; DlgType: TMsgDlgType; <br />
Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;</delphi><br />
<br />
Táto funkcia má dve verzie, teda prvý parameter 'Caption' je voliteľný, ak je vynechaný nie je zobrazený Titulok.<br />
<br />
Toto je najkomplexnejší a najprepracovanejší správový dialóg, ktorý poskytuje programátorovi značnú kontrolu nad vzhľadom dialógového okna. Parametre definujúce typ okna a jeho ikonu sú typy, namiesto konštánt a tlačítka môžu byť zadané ako množina v lomených zátvorkách, napr. '''[mbRetry, mbIgnore, mbAbort, mbCancel]'''. Parameter '''HelpCtx''' aktuálne nie je implementovaný a musí bať nastavený na nulu. Návratová hodnota funkcie je identická ako stlačené tlačítko, reprezentovaná ako integer (viz nasledujúcu definície, [mrNone..mrAll]).<br />
<br />
Príklad:<br />
<delphi> Uses forms, dialogs, lcltype, controls;<br />
<br />
procedure TryMessageDlg;<br />
begin<br />
if MessageDlg ('Question', 'Do you wish to Execute?', mtConfirmation, <br />
[mbYes, mbNo, mbIgnore], 0) = mrYes<br />
then <br />
{ Execute rest of Program };<br />
end;</delphi><br />
<br />
<center> http://lazarus-ccr.sourceforge.net/kbdata/Question.png <br />
</center><br />
<br />
== Text input Dialogs==<br />
===InputBox===<br />
Text input Dialogs: display a message and await user text input<br />
<br />
<delphi>Function InputBox(const ACaption, APrompt, ADefault : String) : String;</delphi><br />
<br />
Displays a box with defined title and prompt, and expects user input in a text box. A default string can optionally be displayed in the text box. The user-entered or default string is returned as the function result.<br />
<br />
Príklad:<br />
<delphi> Uses forms, lcltype, dialogs, controls;<br />
<br />
procedure TryInputBox;<br />
var userstring: string;<br />
begin<br />
userstring := InputBox ('Get some text input', <br />
'Please type in some information', 'Some sample text');<br />
ShowMessage (userstring)<br />
end;</delphi><br />
<br />
===InputQuery===<br />
<delphi> Function InputQuery(const ACaption, APrompt : String;<br />
MaskInput : Boolean; var Value : String) : Boolean;<br />
Function InputQuery(const ACaption, APrompt : String;<br />
var Value : String) : Boolean;</delphi><br />
<br />
Two versions of this function which displays a prompt and expects user input of textual data; the first includes a MaskInput boolean parameter which determines whether the user input is masked out by asterisks in the text-input box (like during entry of a password), while the second omits this property. The text entered by the user is returned in the variable parameter 'Value'; the function result is a boolean which returns TRUE if the OK button was pressed, or FALSE if the box was closed by any other mechanism (such as clicking the 'Close' icon on the top title bar). Omitting the MaskInput parameter is equivalent to setting it FALSE.<br />
<br />
Príklad:<br />
<delphi> Uses forms, lcltype, dialogs, controls;<br />
<br />
procedure TryInputQuery;<br />
var QueryResult: boolean;<br />
userstring: string;<br />
begin<br />
if InputQuery ('Question', 'Type in some data', TRUE, userstring)<br />
then ShowMessage (userstring)<br />
else <br />
begin<br />
InputQuery ('Don''t be silly', 'Please try again', userstring);<br />
ShowMessage (userstring);<br />
end<br />
end;</delphi><br />
<br />
<center> http://lazarus-ccr.sourceforge.net/kbdata/MessageDlgQuestion.png </center><br />
<br />
<center> http://lazarus-ccr.sourceforge.net/kbdata/DontBeSillly.png </center><br />
<br />
===PasswordBox===<br />
<delphi> Function PasswordBox(const ACaption, APrompt : String) : String;</delphi><br />
<br />
Behaves very similarly to the InputQuery function with MaskInput = TRUE; the difference is that the password that was typed in is returned as the result of the function (like InputBox).<br />
<br />
==Constants and Types used in message dialogs==<br />
<br />
Several constants and types relevant for use with the dialog boxes are pre-defined in the LCL library:<br />
<br />
<delphi> const { Defined in LCLType.pp }</delphi><br />
<br />
integer constants for defining the types of buttons<br />
and the icon for display in MessageBox<br />
<br />
<delphi> MB_OK = $00000000;<br />
MB_OKCANCEL = $00000001;<br />
MB_ABORTRETRYIGNORE = $00000002;<br />
MB_YESNOCANCEL = $00000003;<br />
MB_YESNO = $00000004;<br />
MB_RETRYCANCEL = $00000005;<br />
<br />
MB_ICONHAND = $00000010;<br />
MB_ICONQUESTION = $00000020;<br />
MB_ICONEXCLAMATION = $00000030;<br />
MB_ICONASTERICK = $00000040;<br />
MB_ICONWARNING = MB_ICONEXCLAMATION;<br />
MB_ICONERROR = MB_ICONHAND;<br />
MB_ICONINFORMATION = MB_ICONASTERICK;</delphi><br />
<br />
integer constants defining the return value from MessageBox according to which button was pressed<br />
<br />
<delphi> IDOK = 1; ID_OK = IDOK;<br />
IDCANCEL = 2; ID_CANCEL = IDCANCEL;<br />
IDABORT = 3; ID_ABORT = IDABORT;<br />
IDRETRY = 4; ID_RETRY = IDRETRY;<br />
IDIGNORE = 5; ID_IGNORE = IDIGNORE;<br />
IDYES = 6; ID_YES = IDYES;<br />
IDNO = 7; ID_NO = IDNO;<br />
IDCLOSE = 8; ID_CLOSE = IDCLOSE;<br />
IDHELP = 9; ID_HELP = IDHELP;</delphi><br />
<br />
define whether first, second or third button is default<br />
<br />
<delphi> MB_DEFBUTTON1 = $00000000;<br />
MB_DEFBUTTON2 = $00000100;<br />
MB_DEFBUTTON3 = $00000200;<br />
MB_DEFBUTTON4 = $00000300;</delphi><br />
<br />
The Flags parameter of MessageBox is constructed by adding a button constant [MB_OK..MB_RETRYCANCEL], an optional icon constant [MB_ICONHAND..MB_ICONINFORMATION] and an optional default button constant [MB_DEFBUTTON1..MB_DEFBUTTON3]<br />
<br />
Types for use in MessageDlg, which needs parameters AType of TMsgDlgType and AButtons of TMSgDlgButtons<br />
<br />
<delphi> { Defined in Dialogs.pp }<br />
type<br />
TMsgDlgType = (mtWarning, mtError, mtInformation, mtConfirmation,<br />
mtCustom);<br />
TMsgDlgBtn = (mbYes, mbNo, mbOK, mbCancel, mbAbort, mbRetry, mbIgnore,<br />
mbAll, mbNoToAll, mbYesToAll, mbHelp, mbClose);<br />
TMsgDlgButtons = set of TMsgDlgBtn;<br />
<br />
const<br />
mbYesNoCancel = [mbYes, mbNo, mbCancel];<br />
mbOKCancel = [mbOK, mbCancel];<br />
mbAbortRetryIgnore = [mbAbort, mbRetry, mbIgnore];<br />
<br />
MsgDlgBtnToBitBtnKind: array[TMsgDlgBtn] of TBitBtnKind = (<br />
bkYes, bkNo, bkOK, bkCancel, bkAbort, bkRetry, bkIgnore,<br />
bkAll, bkNoToAll, bkYesToAll, bkHelp, bkClose<br />
);<br />
<br />
BitBtnKindToMsgDlgBtn: array[TBitBtnKind] of TMsgDlgBtn = (<br />
mbOk, mbOK, mbCancel, mbHelp, mbYes, mbNo,<br />
mbClose, mbAbort, mbRetry, mbIgnore, mbAll, mbNoToALl, mbYesToAll<br />
);<br />
<br />
{ Defined in Controls.pp }<br />
const<br />
mrNone = 0;<br />
mrOK = mrNone + 1;<br />
mrCancel = mrNone + 2;<br />
mrAbort = mrNone + 3;<br />
mrRetry = mrNone + 4;<br />
mrIgnore = mrNone + 5;<br />
mrYes = mrNone + 6;<br />
mrNo = mrNone + 7;<br />
mrAll = mrNone + 8;<br />
mrNoToAll = mrNone + 9;<br />
mrYesToAll = mrNone + 10;<br />
mrLast = mrYesToAll;</delphi><br />
<br />
----<br />
This page has been imported from the epikwiki [http://lazarus-ccr.sourceforge.net/index.php?wiki=DialogExamples version].</div>Slavkohttps://wiki.freepascal.org/index.php?title=Dialog_Examples/sk&diff=32036Dialog Examples/sk2008-11-17T19:39:57Z<p>Slavko: /* MessageDLG */ translation</p>
<hr />
<div>{{Dialog Examples}}<br />
<br />
= Niektoré užitočné dialógy =<br />
Toto sú niektoré užitočné dialógy, ktoré nenájdete v Palete komonentov:<br />
<br />
* procedure ShowMessage (const Msg: string);<br />
* function MessageBox (Text, Caption : PChar; Flags: Word): Integer;<br />
* function MessageDlg (const Msg: string; AType: TMsgDlgType; AButtons: TMsgDlgButtons; HelpCtx: LongInt): Word;<br />
* function InputBox (const ACaption, APrompt, ADefault: string); string;<br />
* function InputQuery (const ACaption, APrompt: string; var Value: string): Boolean;<br />
* function PasswordBox(const ACaption, APrompt : String) : String;<br />
<br />
Každý z týchto komponentov zobrazuje malé vyskakovacie dialógové okno, ktoré obsahuje nejaké informácie a vyžaduje odozvu používateľa: stlačenie tlačítka, zadanie textu alebo oboje. Programátor má minimálnu kontrolu nad formátom, veľkosťou alebo pozíciou týchto vyskakovacích okien, ale môže ovplyvňovať ich textový obsah.<br><br />
Dôvodom prečo často existujú veľmi podobné alternatívy, je umožniť rôzne spôsoby volania komponentu, a získavania dát, z procedúr a funkcií.<br />
<br />
==Správové dialógy==<br />
Správové dialógy zobrazujú správu a čakajú na stlačenie klávesy alebo kliknutie myšou.<br />
===ShowMessage===<br />
<delphi> Procedure ShowMessage (const Msg: string);<br />
<br />
{ Defined in Dialogs.pp }</delphi><br />
<br />
Najjednoduchší správový dialóg: prijíma jednoduchý textový prarmeter, zobrazí ho v stereotypnom okne a pred vrátením, do volajúcej rutiny alebo programu, čaká na kliknutie myšou alebo kláves enter.<br><br />
Toto je modálne volanie procedúry, ktoré zobrazí okno, získa zameranie a tohoto sa nevzdá, pokiaľ nie je stlačené OK.<br />
<br />
Príklad:<br />
<delphi> Program LazMessage;<br />
Uses Dialogs;<br />
begin<br />
ShowMessage ('This is a message from Lazarus')<br />
end.</delphi><br />
<br />
===MessageBox===<br />
<delphi> Function Application.MessageBox (Text, Caption: PChar; Flags: longint) : Integer;<br />
<br />
{ Defined in Forms.pp as part of TApplication; hence must be called as Application.Messagebox () <br />
or using the 'with Application do ...' construct }</delphi><br />
<br />
Parametre:<br />
* '''Text''': reťazec, ktorý je v okne zobrazený ako otázka ale inštrukcia;<br />
* '''Caption''': textový štítok, ktorý je zobrazený na vrchu okna správy;<br />
* '''Flags''': longint - integer vytvorený sčítaním rôznych konštánt, ktorými je definovaný obsah a správanie okna, napríklad '''MB_ABORTRETRYIGNORE + MR_ICONQUESTION''' nastaví, že aplikácia zobrazí ikonu otázky (?) v okne s tromi tlačítkami: ABORT, RETRY a IGNORE.<br />
<br />
Funkcia vracia hodnotu integer, ktorá zodpovedá stlačenému tlačítku; jej hodnota je daná odkazom na konštanty [IDOK..IDHELP]<br />
<br />
Môže byť volaná ako procedúra (tj. formulácia 'MessageBox()' namiesto volania funkcie 'Variable := MessageBox()' – viz. príklad nižšie)<br />
<br />
Príklad:<br />
<delphi> Uses Forms, Dialogs, LCLType;<br />
<br />
Procedure DisplayMessageBox;<br />
var reply, boxstyle: integer;<br />
begin<br />
with application do begin<br />
boxstyle := MB_ICONQUESTION + MB_YESNO;<br />
reply := MessageBox ('Press either button', 'MessageBoxDemo', boxstyle);<br />
if reply = IDYES then MessageBox ('Yes ', 'Reply',MB_ICONINFORMATION)<br />
else MessageBox ('No ', 'Reply', MB_ICONHAND);<br />
end;</delphi><br />
<br />
Všimnite si, že v tomto príklade sú reťazce 'Yes' a 'No' doplnené medzerami; inak by okno nebolo dosť široké na správne zobrazenie titulku.<br />
<br />
<center>[[Image:MessageBoxDemo.png]] [[Image:ReplyYes.png]]</center><br />
<br />
===MessageDLG===<br />
<delphi> function MessageDlg(const aMsg: string; DlgType: TMsgDlgType; <br />
Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;<br />
function MessageDlg(const aCaption, aMsg: string; DlgType: TMsgDlgType; <br />
Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;</delphi><br />
<br />
Táto funkcia má dve verzie, teda prvý parameter 'Caption' je voliteľný, akje vynechaný nie je zobrazený Titulok.<br />
<br />
Toto je najkomplexnejší a najprepracovanejší správový dialóg, ktorý poskytuje programátorovi značnú kontrolu nad vzhľadom dialógového okna. <br />
<br />
Parametre definujúce typ okna a jeho ikonu sú typy, namiesto konštánt a tlačítka môžu byť zadané ako množina v lomených zátvorkách, napr. '''[mbRetry, mbIgnore, mbAbort, mbCancel]'''. Parameter '''HelpCtx''' aktuálne nie je implementovaný a musí bať nastavený na nulu.<br />
<br />
Návratová hodnota funkcie je identická ako stlačené tlačítko, reprezentovaná ako integer (viz nasledujúcu definície, [mrNone..mrAll]).<br />
<br />
Príklad:<br />
<delphi> Uses forms, dialogs, lcltype, controls;<br />
<br />
procedure TryMessageDlg;<br />
begin<br />
if MessageDlg ('Question', 'Do you wish to Execute?', mtConfirmation, <br />
[mbYes, mbNo, mbIgnore], 0) = mrYes<br />
then <br />
{ Execute rest of Program };<br />
end;</delphi><br />
<br />
<center> http://lazarus-ccr.sourceforge.net/kbdata/Question.png <br />
</center><br />
<br />
== Text input Dialogs==<br />
===InputBox===<br />
Text input Dialogs: display a message and await user text input<br />
<br />
<delphi>Function InputBox(const ACaption, APrompt, ADefault : String) : String;</delphi><br />
<br />
Displays a box with defined title and prompt, and expects user input in a text box. A default string can optionally be displayed in the text box. The user-entered or default string is returned as the function result.<br />
<br />
Príklad:<br />
<delphi> Uses forms, lcltype, dialogs, controls;<br />
<br />
procedure TryInputBox;<br />
var userstring: string;<br />
begin<br />
userstring := InputBox ('Get some text input', <br />
'Please type in some information', 'Some sample text');<br />
ShowMessage (userstring)<br />
end;</delphi><br />
<br />
===InputQuery===<br />
<delphi> Function InputQuery(const ACaption, APrompt : String;<br />
MaskInput : Boolean; var Value : String) : Boolean;<br />
Function InputQuery(const ACaption, APrompt : String;<br />
var Value : String) : Boolean;</delphi><br />
<br />
Two versions of this function which displays a prompt and expects user input of textual data; the first includes a MaskInput boolean parameter which determines whether the user input is masked out by asterisks in the text-input box (like during entry of a password), while the second omits this property. The text entered by the user is returned in the variable parameter 'Value'; the function result is a boolean which returns TRUE if the OK button was pressed, or FALSE if the box was closed by any other mechanism (such as clicking the 'Close' icon on the top title bar). Omitting the MaskInput parameter is equivalent to setting it FALSE.<br />
<br />
Príklad:<br />
<delphi> Uses forms, lcltype, dialogs, controls;<br />
<br />
procedure TryInputQuery;<br />
var QueryResult: boolean;<br />
userstring: string;<br />
begin<br />
if InputQuery ('Question', 'Type in some data', TRUE, userstring)<br />
then ShowMessage (userstring)<br />
else <br />
begin<br />
InputQuery ('Don''t be silly', 'Please try again', userstring);<br />
ShowMessage (userstring);<br />
end<br />
end;</delphi><br />
<br />
<center> http://lazarus-ccr.sourceforge.net/kbdata/MessageDlgQuestion.png </center><br />
<br />
<center> http://lazarus-ccr.sourceforge.net/kbdata/DontBeSillly.png </center><br />
<br />
===PasswordBox===<br />
<delphi> Function PasswordBox(const ACaption, APrompt : String) : String;</delphi><br />
<br />
Behaves very similarly to the InputQuery function with MaskInput = TRUE; the difference is that the password that was typed in is returned as the result of the function (like InputBox).<br />
<br />
==Constants and Types used in message dialogs==<br />
<br />
Several constants and types relevant for use with the dialog boxes are pre-defined in the LCL library:<br />
<br />
<delphi> const { Defined in LCLType.pp }</delphi><br />
<br />
integer constants for defining the types of buttons<br />
and the icon for display in MessageBox<br />
<br />
<delphi> MB_OK = $00000000;<br />
MB_OKCANCEL = $00000001;<br />
MB_ABORTRETRYIGNORE = $00000002;<br />
MB_YESNOCANCEL = $00000003;<br />
MB_YESNO = $00000004;<br />
MB_RETRYCANCEL = $00000005;<br />
<br />
MB_ICONHAND = $00000010;<br />
MB_ICONQUESTION = $00000020;<br />
MB_ICONEXCLAMATION = $00000030;<br />
MB_ICONASTERICK = $00000040;<br />
MB_ICONWARNING = MB_ICONEXCLAMATION;<br />
MB_ICONERROR = MB_ICONHAND;<br />
MB_ICONINFORMATION = MB_ICONASTERICK;</delphi><br />
<br />
integer constants defining the return value from MessageBox according to which button was pressed<br />
<br />
<delphi> IDOK = 1; ID_OK = IDOK;<br />
IDCANCEL = 2; ID_CANCEL = IDCANCEL;<br />
IDABORT = 3; ID_ABORT = IDABORT;<br />
IDRETRY = 4; ID_RETRY = IDRETRY;<br />
IDIGNORE = 5; ID_IGNORE = IDIGNORE;<br />
IDYES = 6; ID_YES = IDYES;<br />
IDNO = 7; ID_NO = IDNO;<br />
IDCLOSE = 8; ID_CLOSE = IDCLOSE;<br />
IDHELP = 9; ID_HELP = IDHELP;</delphi><br />
<br />
define whether first, second or third button is default<br />
<br />
<delphi> MB_DEFBUTTON1 = $00000000;<br />
MB_DEFBUTTON2 = $00000100;<br />
MB_DEFBUTTON3 = $00000200;<br />
MB_DEFBUTTON4 = $00000300;</delphi><br />
<br />
The Flags parameter of MessageBox is constructed by adding a button constant [MB_OK..MB_RETRYCANCEL], an optional icon constant [MB_ICONHAND..MB_ICONINFORMATION] and an optional default button constant [MB_DEFBUTTON1..MB_DEFBUTTON3]<br />
<br />
Types for use in MessageDlg, which needs parameters AType of TMsgDlgType and AButtons of TMSgDlgButtons<br />
<br />
<delphi> { Defined in Dialogs.pp }<br />
type<br />
TMsgDlgType = (mtWarning, mtError, mtInformation, mtConfirmation,<br />
mtCustom);<br />
TMsgDlgBtn = (mbYes, mbNo, mbOK, mbCancel, mbAbort, mbRetry, mbIgnore,<br />
mbAll, mbNoToAll, mbYesToAll, mbHelp, mbClose);<br />
TMsgDlgButtons = set of TMsgDlgBtn;<br />
<br />
const<br />
mbYesNoCancel = [mbYes, mbNo, mbCancel];<br />
mbOKCancel = [mbOK, mbCancel];<br />
mbAbortRetryIgnore = [mbAbort, mbRetry, mbIgnore];<br />
<br />
MsgDlgBtnToBitBtnKind: array[TMsgDlgBtn] of TBitBtnKind = (<br />
bkYes, bkNo, bkOK, bkCancel, bkAbort, bkRetry, bkIgnore,<br />
bkAll, bkNoToAll, bkYesToAll, bkHelp, bkClose<br />
);<br />
<br />
BitBtnKindToMsgDlgBtn: array[TBitBtnKind] of TMsgDlgBtn = (<br />
mbOk, mbOK, mbCancel, mbHelp, mbYes, mbNo,<br />
mbClose, mbAbort, mbRetry, mbIgnore, mbAll, mbNoToALl, mbYesToAll<br />
);<br />
<br />
{ Defined in Controls.pp }<br />
const<br />
mrNone = 0;<br />
mrOK = mrNone + 1;<br />
mrCancel = mrNone + 2;<br />
mrAbort = mrNone + 3;<br />
mrRetry = mrNone + 4;<br />
mrIgnore = mrNone + 5;<br />
mrYes = mrNone + 6;<br />
mrNo = mrNone + 7;<br />
mrAll = mrNone + 8;<br />
mrNoToAll = mrNone + 9;<br />
mrYesToAll = mrNone + 10;<br />
mrLast = mrYesToAll;</delphi><br />
<br />
----<br />
This page has been imported from the epikwiki [http://lazarus-ccr.sourceforge.net/index.php?wiki=DialogExamples version].</div>Slavkohttps://wiki.freepascal.org/index.php?title=Dialog_Examples/sk&diff=32035Dialog Examples/sk2008-11-17T19:33:00Z<p>Slavko: /* MessageBox */ translation</p>
<hr />
<div>{{Dialog Examples}}<br />
<br />
= Niektoré užitočné dialógy =<br />
Toto sú niektoré užitočné dialógy, ktoré nenájdete v Palete komonentov:<br />
<br />
* procedure ShowMessage (const Msg: string);<br />
* function MessageBox (Text, Caption : PChar; Flags: Word): Integer;<br />
* function MessageDlg (const Msg: string; AType: TMsgDlgType; AButtons: TMsgDlgButtons; HelpCtx: LongInt): Word;<br />
* function InputBox (const ACaption, APrompt, ADefault: string); string;<br />
* function InputQuery (const ACaption, APrompt: string; var Value: string): Boolean;<br />
* function PasswordBox(const ACaption, APrompt : String) : String;<br />
<br />
Každý z týchto komponentov zobrazuje malé vyskakovacie dialógové okno, ktoré obsahuje nejaké informácie a vyžaduje odozvu používateľa: stlačenie tlačítka, zadanie textu alebo oboje. Programátor má minimálnu kontrolu nad formátom, veľkosťou alebo pozíciou týchto vyskakovacích okien, ale môže ovplyvňovať ich textový obsah.<br><br />
Dôvodom prečo často existujú veľmi podobné alternatívy, je umožniť rôzne spôsoby volania komponentu, a získavania dát, z procedúr a funkcií.<br />
<br />
==Správové dialógy==<br />
Správové dialógy zobrazujú správu a čakajú na stlačenie klávesy alebo kliknutie myšou.<br />
===ShowMessage===<br />
<delphi> Procedure ShowMessage (const Msg: string);<br />
<br />
{ Defined in Dialogs.pp }</delphi><br />
<br />
Najjednoduchší správový dialóg: prijíma jednoduchý textový prarmeter, zobrazí ho v stereotypnom okne a pred vrátením, do volajúcej rutiny alebo programu, čaká na kliknutie myšou alebo kláves enter.<br><br />
Toto je modálne volanie procedúry, ktoré zobrazí okno, získa zameranie a tohoto sa nevzdá, pokiaľ nie je stlačené OK.<br />
<br />
Príklad:<br />
<delphi> Program LazMessage;<br />
Uses Dialogs;<br />
begin<br />
ShowMessage ('This is a message from Lazarus')<br />
end.</delphi><br />
<br />
===MessageBox===<br />
<delphi> Function Application.MessageBox (Text, Caption: PChar; Flags: longint) : Integer;<br />
<br />
{ Defined in Forms.pp as part of TApplication; hence must be called as Application.Messagebox () <br />
or using the 'with Application do ...' construct }</delphi><br />
<br />
Parametre:<br />
* '''Text''': reťazec, ktorý je v okne zobrazený ako otázka ale inštrukcia;<br />
* '''Caption''': textový štítok, ktorý je zobrazený na vrchu okna správy;<br />
* '''Flags''': longint - integer vytvorený sčítaním rôznych konštánt, ktorými je definovaný obsah a správanie okna, napríklad '''MB_ABORTRETRYIGNORE + MR_ICONQUESTION''' nastaví, že aplikácia zobrazí ikonu otázky (?) v okne s tromi tlačítkami: ABORT, RETRY a IGNORE.<br />
<br />
Funkcia vracia hodnotu integer, ktorá zodpovedá stlačenému tlačítku; jej hodnota je daná odkazom na konštanty [IDOK..IDHELP]<br />
<br />
Môže byť volaná ako procedúra (tj. formulácia 'MessageBox()' namiesto volania funkcie 'Variable := MessageBox()' – viz. príklad nižšie)<br />
<br />
Príklad:<br />
<delphi> Uses Forms, Dialogs, LCLType;<br />
<br />
Procedure DisplayMessageBox;<br />
var reply, boxstyle: integer;<br />
begin<br />
with application do begin<br />
boxstyle := MB_ICONQUESTION + MB_YESNO;<br />
reply := MessageBox ('Press either button', 'MessageBoxDemo', boxstyle);<br />
if reply = IDYES then MessageBox ('Yes ', 'Reply',MB_ICONINFORMATION)<br />
else MessageBox ('No ', 'Reply', MB_ICONHAND);<br />
end;</delphi><br />
<br />
Všimnite si, že v tomto príklade sú reťazce 'Yes' a 'No' doplnené medzerami; inak by okno nebolo dosť široké na správne zobrazenie titulku.<br />
<br />
<center>[[Image:MessageBoxDemo.png]] [[Image:ReplyYes.png]]</center><br />
<br />
===MessageDLG===<br />
<delphi> function MessageDlg(const aMsg: string; DlgType: TMsgDlgType; <br />
Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;<br />
function MessageDlg(const aCaption, aMsg: string; DlgType: TMsgDlgType; <br />
Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;</delphi><br />
<br />
Two versions of this function, ie first 'Caption' parameter is optional; if omitted, caption is missing from box<br />
<br />
This is the most complete and elaborate of the message dialogs, and allows the programmer considerable control over the appearance of the dialog box.<br />
The parameters defining the kind of box and its icon are types rather than integer constants, and the buttons can be specified as a set in square brackets eg [mbRetry, mbIgnore, mbAbort, mbCancel].<br />
The HelpCtx parameter is not currently implemented and should be set to zero.<br />
The return value from the Function is the identity of the button pressed, expressed as an integer (see the definitions below, [mrNone..mrAll]).<br />
<br />
Príklad:<br />
<delphi> Uses forms, dialogs, lcltype, controls;<br />
<br />
procedure TryMessageDlg;<br />
begin<br />
if MessageDlg ('Question', 'Do you wish to Execute?', mtConfirmation, <br />
[mbYes, mbNo, mbIgnore],0) = mrYes<br />
then { Execute rest of Program };<br />
end;</delphi><br />
<br />
<center> http://lazarus-ccr.sourceforge.net/kbdata/Question.png <br />
</center><br />
<br />
== Text input Dialogs==<br />
===InputBox===<br />
Text input Dialogs: display a message and await user text input<br />
<br />
<delphi>Function InputBox(const ACaption, APrompt, ADefault : String) : String;</delphi><br />
<br />
Displays a box with defined title and prompt, and expects user input in a text box. A default string can optionally be displayed in the text box. The user-entered or default string is returned as the function result.<br />
<br />
Príklad:<br />
<delphi> Uses forms, lcltype, dialogs, controls;<br />
<br />
procedure TryInputBox;<br />
var userstring: string;<br />
begin<br />
userstring := InputBox ('Get some text input', <br />
'Please type in some information', 'Some sample text');<br />
ShowMessage (userstring)<br />
end;</delphi><br />
<br />
===InputQuery===<br />
<delphi> Function InputQuery(const ACaption, APrompt : String;<br />
MaskInput : Boolean; var Value : String) : Boolean;<br />
Function InputQuery(const ACaption, APrompt : String;<br />
var Value : String) : Boolean;</delphi><br />
<br />
Two versions of this function which displays a prompt and expects user input of textual data; the first includes a MaskInput boolean parameter which determines whether the user input is masked out by asterisks in the text-input box (like during entry of a password), while the second omits this property. The text entered by the user is returned in the variable parameter 'Value'; the function result is a boolean which returns TRUE if the OK button was pressed, or FALSE if the box was closed by any other mechanism (such as clicking the 'Close' icon on the top title bar). Omitting the MaskInput parameter is equivalent to setting it FALSE.<br />
<br />
Príklad:<br />
<delphi> Uses forms, lcltype, dialogs, controls;<br />
<br />
procedure TryInputQuery;<br />
var QueryResult: boolean;<br />
userstring: string;<br />
begin<br />
if InputQuery ('Question', 'Type in some data', TRUE, userstring)<br />
then ShowMessage (userstring)<br />
else <br />
begin<br />
InputQuery ('Don''t be silly', 'Please try again', userstring);<br />
ShowMessage (userstring);<br />
end<br />
end;</delphi><br />
<br />
<center> http://lazarus-ccr.sourceforge.net/kbdata/MessageDlgQuestion.png </center><br />
<br />
<center> http://lazarus-ccr.sourceforge.net/kbdata/DontBeSillly.png </center><br />
<br />
===PasswordBox===<br />
<delphi> Function PasswordBox(const ACaption, APrompt : String) : String;</delphi><br />
<br />
Behaves very similarly to the InputQuery function with MaskInput = TRUE; the difference is that the password that was typed in is returned as the result of the function (like InputBox).<br />
<br />
==Constants and Types used in message dialogs==<br />
<br />
Several constants and types relevant for use with the dialog boxes are pre-defined in the LCL library:<br />
<br />
<delphi> const { Defined in LCLType.pp }</delphi><br />
<br />
integer constants for defining the types of buttons<br />
and the icon for display in MessageBox<br />
<br />
<delphi> MB_OK = $00000000;<br />
MB_OKCANCEL = $00000001;<br />
MB_ABORTRETRYIGNORE = $00000002;<br />
MB_YESNOCANCEL = $00000003;<br />
MB_YESNO = $00000004;<br />
MB_RETRYCANCEL = $00000005;<br />
<br />
MB_ICONHAND = $00000010;<br />
MB_ICONQUESTION = $00000020;<br />
MB_ICONEXCLAMATION = $00000030;<br />
MB_ICONASTERICK = $00000040;<br />
MB_ICONWARNING = MB_ICONEXCLAMATION;<br />
MB_ICONERROR = MB_ICONHAND;<br />
MB_ICONINFORMATION = MB_ICONASTERICK;</delphi><br />
<br />
integer constants defining the return value from MessageBox according to which button was pressed<br />
<br />
<delphi> IDOK = 1; ID_OK = IDOK;<br />
IDCANCEL = 2; ID_CANCEL = IDCANCEL;<br />
IDABORT = 3; ID_ABORT = IDABORT;<br />
IDRETRY = 4; ID_RETRY = IDRETRY;<br />
IDIGNORE = 5; ID_IGNORE = IDIGNORE;<br />
IDYES = 6; ID_YES = IDYES;<br />
IDNO = 7; ID_NO = IDNO;<br />
IDCLOSE = 8; ID_CLOSE = IDCLOSE;<br />
IDHELP = 9; ID_HELP = IDHELP;</delphi><br />
<br />
define whether first, second or third button is default<br />
<br />
<delphi> MB_DEFBUTTON1 = $00000000;<br />
MB_DEFBUTTON2 = $00000100;<br />
MB_DEFBUTTON3 = $00000200;<br />
MB_DEFBUTTON4 = $00000300;</delphi><br />
<br />
The Flags parameter of MessageBox is constructed by adding a button constant [MB_OK..MB_RETRYCANCEL], an optional icon constant [MB_ICONHAND..MB_ICONINFORMATION] and an optional default button constant [MB_DEFBUTTON1..MB_DEFBUTTON3]<br />
<br />
Types for use in MessageDlg, which needs parameters AType of TMsgDlgType and AButtons of TMSgDlgButtons<br />
<br />
<delphi> { Defined in Dialogs.pp }<br />
type<br />
TMsgDlgType = (mtWarning, mtError, mtInformation, mtConfirmation,<br />
mtCustom);<br />
TMsgDlgBtn = (mbYes, mbNo, mbOK, mbCancel, mbAbort, mbRetry, mbIgnore,<br />
mbAll, mbNoToAll, mbYesToAll, mbHelp, mbClose);<br />
TMsgDlgButtons = set of TMsgDlgBtn;<br />
<br />
const<br />
mbYesNoCancel = [mbYes, mbNo, mbCancel];<br />
mbOKCancel = [mbOK, mbCancel];<br />
mbAbortRetryIgnore = [mbAbort, mbRetry, mbIgnore];<br />
<br />
MsgDlgBtnToBitBtnKind: array[TMsgDlgBtn] of TBitBtnKind = (<br />
bkYes, bkNo, bkOK, bkCancel, bkAbort, bkRetry, bkIgnore,<br />
bkAll, bkNoToAll, bkYesToAll, bkHelp, bkClose<br />
);<br />
<br />
BitBtnKindToMsgDlgBtn: array[TBitBtnKind] of TMsgDlgBtn = (<br />
mbOk, mbOK, mbCancel, mbHelp, mbYes, mbNo,<br />
mbClose, mbAbort, mbRetry, mbIgnore, mbAll, mbNoToALl, mbYesToAll<br />
);<br />
<br />
{ Defined in Controls.pp }<br />
const<br />
mrNone = 0;<br />
mrOK = mrNone + 1;<br />
mrCancel = mrNone + 2;<br />
mrAbort = mrNone + 3;<br />
mrRetry = mrNone + 4;<br />
mrIgnore = mrNone + 5;<br />
mrYes = mrNone + 6;<br />
mrNo = mrNone + 7;<br />
mrAll = mrNone + 8;<br />
mrNoToAll = mrNone + 9;<br />
mrYesToAll = mrNone + 10;<br />
mrLast = mrYesToAll;</delphi><br />
<br />
----<br />
This page has been imported from the epikwiki [http://lazarus-ccr.sourceforge.net/index.php?wiki=DialogExamples version].</div>Slavkohttps://wiki.freepascal.org/index.php?title=Dialog_Examples/sk&diff=32034Dialog Examples/sk2008-11-17T19:21:26Z<p>Slavko: /* ShowMessage */ prvotný preklad</p>
<hr />
<div>{{Dialog Examples}}<br />
<br />
= Niektoré užitočné dialógy =<br />
Toto sú niektoré užitočné dialógy, ktoré nenájdete v Palete komonentov:<br />
<br />
* procedure ShowMessage (const Msg: string);<br />
* function MessageBox (Text, Caption : PChar; Flags: Word): Integer;<br />
* function MessageDlg (const Msg: string; AType: TMsgDlgType; AButtons: TMsgDlgButtons; HelpCtx: LongInt): Word;<br />
* function InputBox (const ACaption, APrompt, ADefault: string); string;<br />
* function InputQuery (const ACaption, APrompt: string; var Value: string): Boolean;<br />
* function PasswordBox(const ACaption, APrompt : String) : String;<br />
<br />
Každý z týchto komponentov zobrazuje malé vyskakovacie dialógové okno, ktoré obsahuje nejaké informácie a vyžaduje odozvu používateľa: stlačenie tlačítka, zadanie textu alebo oboje. Programátor má minimálnu kontrolu nad formátom, veľkosťou alebo pozíciou týchto vyskakovacích okien, ale môže ovplyvňovať ich textový obsah.<br><br />
Dôvodom prečo často existujú veľmi podobné alternatívy, je umožniť rôzne spôsoby volania komponentu, a získavania dát, z procedúr a funkcií.<br />
<br />
==Správové dialógy==<br />
Správové dialógy zobrazujú správu a čakajú na stlačenie klávesy alebo kliknutie myšou.<br />
===ShowMessage===<br />
<delphi> Procedure ShowMessage (const Msg: string);<br />
<br />
{ Defined in Dialogs.pp }</delphi><br />
<br />
Najjednoduchší správový dialóg: prijíma jednoduchý textový prarmeter, zobrazí ho v stereotypnom okne a pred vrátením, do volajúcej rutiny alebo programu, čaká na kliknutie myšou alebo kláves enter.<br><br />
Toto je modálne volanie procedúry, ktoré zobrazí okno, získa zameranie a tohoto sa nevzdá, pokiaľ nie je stlačené OK.<br />
<br />
Príklad:<br />
<delphi> Program LazMessage;<br />
Uses Dialogs;<br />
begin<br />
ShowMessage ('This is a message from Lazarus')<br />
end.</delphi><br />
<br />
===MessageBox===<br />
<delphi> Function Application.MessageBox (Text, Caption: PChar; Flags: longint) : Integer;<br />
<br />
{ Defined in Forms.pp as part of TApplication; hence must be called as Application.Messagebox () <br />
or using the 'with Application do ...' construct }</delphi><br />
<br />
Parameters include<br />
<br />
* Text: the string that is displayed as a prompt or instruction in the Box;<br />
* Caption: the string label at the top of the message box;<br />
* Flags: longint - an integer constructed by adding together various constants to define the contents and behaviour of the box, for example MB_ABORTRETRYIGNORE + MR_ICONQUESTION will cause the application to display a query (?) icon in a box with three buttons: ABORT RETRY IGNORE.<br />
<br />
The function returns an integer value corresponding to the button that was pressed; its value can be determined by reference to the constants [IDOK..IDHELP]<br />
<br />
It can be invoked like a procedure call (ie as a 'MessageBox()' statement rather than as a 'Variable := MessageBox()' function call - see example below)<br />
<br />
Príklad:<br />
<delphi> Uses Forms, Dialogs, LCLType;<br />
<br />
Procedure DisplayMessageBox;<br />
var reply, boxstyle: integer;<br />
begin<br />
with application do begin<br />
boxstyle := MB_ICONQUESTION + MB_YESNO;<br />
reply := MessageBox ('Press either button', 'MessageBoxDemo', boxstyle);<br />
if reply = IDYES then MessageBox ('Yes ', 'Reply',MB_ICONINFORMATION)<br />
else MessageBox ('No ', 'Reply', MB_ICONHAND);<br />
end;</delphi><br />
<br />
Notice that in this example the 'Yes' and 'No' strings have been padded out with spaces; otherwise the box would not be wide enough to display the caption properly<br />
<br />
<center> http://lazarus-ccr.sourceforge.net/kbdata/MessageBoxDemo.png http://lazarus-ccr.sourceforge.net/kbdata/ReplyYes.png<br />
</center><br />
<br />
===MessageDLG===<br />
<delphi> function MessageDlg(const aMsg: string; DlgType: TMsgDlgType; <br />
Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;<br />
function MessageDlg(const aCaption, aMsg: string; DlgType: TMsgDlgType; <br />
Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;</delphi><br />
<br />
Two versions of this function, ie first 'Caption' parameter is optional; if omitted, caption is missing from box<br />
<br />
This is the most complete and elaborate of the message dialogs, and allows the programmer considerable control over the appearance of the dialog box.<br />
The parameters defining the kind of box and its icon are types rather than integer constants, and the buttons can be specified as a set in square brackets eg [mbRetry, mbIgnore, mbAbort, mbCancel].<br />
The HelpCtx parameter is not currently implemented and should be set to zero.<br />
The return value from the Function is the identity of the button pressed, expressed as an integer (see the definitions below, [mrNone..mrAll]).<br />
<br />
Príklad:<br />
<delphi> Uses forms, dialogs, lcltype, controls;<br />
<br />
procedure TryMessageDlg;<br />
begin<br />
if MessageDlg ('Question', 'Do you wish to Execute?', mtConfirmation, <br />
[mbYes, mbNo, mbIgnore],0) = mrYes<br />
then { Execute rest of Program };<br />
end;</delphi><br />
<br />
<center> http://lazarus-ccr.sourceforge.net/kbdata/Question.png <br />
</center><br />
<br />
== Text input Dialogs==<br />
===InputBox===<br />
Text input Dialogs: display a message and await user text input<br />
<br />
<delphi>Function InputBox(const ACaption, APrompt, ADefault : String) : String;</delphi><br />
<br />
Displays a box with defined title and prompt, and expects user input in a text box. A default string can optionally be displayed in the text box. The user-entered or default string is returned as the function result.<br />
<br />
Príklad:<br />
<delphi> Uses forms, lcltype, dialogs, controls;<br />
<br />
procedure TryInputBox;<br />
var userstring: string;<br />
begin<br />
userstring := InputBox ('Get some text input', <br />
'Please type in some information', 'Some sample text');<br />
ShowMessage (userstring)<br />
end;</delphi><br />
<br />
===InputQuery===<br />
<delphi> Function InputQuery(const ACaption, APrompt : String;<br />
MaskInput : Boolean; var Value : String) : Boolean;<br />
Function InputQuery(const ACaption, APrompt : String;<br />
var Value : String) : Boolean;</delphi><br />
<br />
Two versions of this function which displays a prompt and expects user input of textual data; the first includes a MaskInput boolean parameter which determines whether the user input is masked out by asterisks in the text-input box (like during entry of a password), while the second omits this property. The text entered by the user is returned in the variable parameter 'Value'; the function result is a boolean which returns TRUE if the OK button was pressed, or FALSE if the box was closed by any other mechanism (such as clicking the 'Close' icon on the top title bar). Omitting the MaskInput parameter is equivalent to setting it FALSE.<br />
<br />
Príklad:<br />
<delphi> Uses forms, lcltype, dialogs, controls;<br />
<br />
procedure TryInputQuery;<br />
var QueryResult: boolean;<br />
userstring: string;<br />
begin<br />
if InputQuery ('Question', 'Type in some data', TRUE, userstring)<br />
then ShowMessage (userstring)<br />
else <br />
begin<br />
InputQuery ('Don''t be silly', 'Please try again', userstring);<br />
ShowMessage (userstring);<br />
end<br />
end;</delphi><br />
<br />
<center> http://lazarus-ccr.sourceforge.net/kbdata/MessageDlgQuestion.png </center><br />
<br />
<center> http://lazarus-ccr.sourceforge.net/kbdata/DontBeSillly.png </center><br />
<br />
===PasswordBox===<br />
<delphi> Function PasswordBox(const ACaption, APrompt : String) : String;</delphi><br />
<br />
Behaves very similarly to the InputQuery function with MaskInput = TRUE; the difference is that the password that was typed in is returned as the result of the function (like InputBox).<br />
<br />
==Constants and Types used in message dialogs==<br />
<br />
Several constants and types relevant for use with the dialog boxes are pre-defined in the LCL library:<br />
<br />
<delphi> const { Defined in LCLType.pp }</delphi><br />
<br />
integer constants for defining the types of buttons<br />
and the icon for display in MessageBox<br />
<br />
<delphi> MB_OK = $00000000;<br />
MB_OKCANCEL = $00000001;<br />
MB_ABORTRETRYIGNORE = $00000002;<br />
MB_YESNOCANCEL = $00000003;<br />
MB_YESNO = $00000004;<br />
MB_RETRYCANCEL = $00000005;<br />
<br />
MB_ICONHAND = $00000010;<br />
MB_ICONQUESTION = $00000020;<br />
MB_ICONEXCLAMATION = $00000030;<br />
MB_ICONASTERICK = $00000040;<br />
MB_ICONWARNING = MB_ICONEXCLAMATION;<br />
MB_ICONERROR = MB_ICONHAND;<br />
MB_ICONINFORMATION = MB_ICONASTERICK;</delphi><br />
<br />
integer constants defining the return value from MessageBox according to which button was pressed<br />
<br />
<delphi> IDOK = 1; ID_OK = IDOK;<br />
IDCANCEL = 2; ID_CANCEL = IDCANCEL;<br />
IDABORT = 3; ID_ABORT = IDABORT;<br />
IDRETRY = 4; ID_RETRY = IDRETRY;<br />
IDIGNORE = 5; ID_IGNORE = IDIGNORE;<br />
IDYES = 6; ID_YES = IDYES;<br />
IDNO = 7; ID_NO = IDNO;<br />
IDCLOSE = 8; ID_CLOSE = IDCLOSE;<br />
IDHELP = 9; ID_HELP = IDHELP;</delphi><br />
<br />
define whether first, second or third button is default<br />
<br />
<delphi> MB_DEFBUTTON1 = $00000000;<br />
MB_DEFBUTTON2 = $00000100;<br />
MB_DEFBUTTON3 = $00000200;<br />
MB_DEFBUTTON4 = $00000300;</delphi><br />
<br />
The Flags parameter of MessageBox is constructed by adding a button constant [MB_OK..MB_RETRYCANCEL], an optional icon constant [MB_ICONHAND..MB_ICONINFORMATION] and an optional default button constant [MB_DEFBUTTON1..MB_DEFBUTTON3]<br />
<br />
Types for use in MessageDlg, which needs parameters AType of TMsgDlgType and AButtons of TMSgDlgButtons<br />
<br />
<delphi> { Defined in Dialogs.pp }<br />
type<br />
TMsgDlgType = (mtWarning, mtError, mtInformation, mtConfirmation,<br />
mtCustom);<br />
TMsgDlgBtn = (mbYes, mbNo, mbOK, mbCancel, mbAbort, mbRetry, mbIgnore,<br />
mbAll, mbNoToAll, mbYesToAll, mbHelp, mbClose);<br />
TMsgDlgButtons = set of TMsgDlgBtn;<br />
<br />
const<br />
mbYesNoCancel = [mbYes, mbNo, mbCancel];<br />
mbOKCancel = [mbOK, mbCancel];<br />
mbAbortRetryIgnore = [mbAbort, mbRetry, mbIgnore];<br />
<br />
MsgDlgBtnToBitBtnKind: array[TMsgDlgBtn] of TBitBtnKind = (<br />
bkYes, bkNo, bkOK, bkCancel, bkAbort, bkRetry, bkIgnore,<br />
bkAll, bkNoToAll, bkYesToAll, bkHelp, bkClose<br />
);<br />
<br />
BitBtnKindToMsgDlgBtn: array[TBitBtnKind] of TMsgDlgBtn = (<br />
mbOk, mbOK, mbCancel, mbHelp, mbYes, mbNo,<br />
mbClose, mbAbort, mbRetry, mbIgnore, mbAll, mbNoToALl, mbYesToAll<br />
);<br />
<br />
{ Defined in Controls.pp }<br />
const<br />
mrNone = 0;<br />
mrOK = mrNone + 1;<br />
mrCancel = mrNone + 2;<br />
mrAbort = mrNone + 3;<br />
mrRetry = mrNone + 4;<br />
mrIgnore = mrNone + 5;<br />
mrYes = mrNone + 6;<br />
mrNo = mrNone + 7;<br />
mrAll = mrNone + 8;<br />
mrNoToAll = mrNone + 9;<br />
mrYesToAll = mrNone + 10;<br />
mrLast = mrYesToAll;</delphi><br />
<br />
----<br />
This page has been imported from the epikwiki [http://lazarus-ccr.sourceforge.net/index.php?wiki=DialogExamples version].</div>Slavkohttps://wiki.freepascal.org/index.php?title=Dialog_Examples/sk&diff=32033Dialog Examples/sk2008-11-17T19:17:56Z<p>Slavko: formating source</p>
<hr />
<div>{{Dialog Examples}}<br />
<br />
= Niektoré užitočné dialógy =<br />
Toto sú niektoré užitočné dialógy, ktoré nenájdete v Palete komonentov:<br />
<br />
* procedure ShowMessage (const Msg: string);<br />
* function MessageBox (Text, Caption : PChar; Flags: Word): Integer;<br />
* function MessageDlg (const Msg: string; AType: TMsgDlgType; AButtons: TMsgDlgButtons; HelpCtx: LongInt): Word;<br />
* function InputBox (const ACaption, APrompt, ADefault: string); string;<br />
* function InputQuery (const ACaption, APrompt: string; var Value: string): Boolean;<br />
* function PasswordBox(const ACaption, APrompt : String) : String;<br />
<br />
Každý z týchto komponentov zobrazuje malé vyskakovacie dialógové okno, ktoré obsahuje nejaké informácie a vyžaduje odozvu používateľa: stlačenie tlačítka, zadanie textu alebo oboje. Programátor má minimálnu kontrolu nad formátom, veľkosťou alebo pozíciou týchto vyskakovacích okien, ale môže ovplyvňovať ich textový obsah.<br><br />
Dôvodom prečo často existujú veľmi podobné alternatívy, je umožniť rôzne spôsoby volania komponentu, a získavania dát, z procedúr a funkcií.<br />
<br />
==Správové dialógy==<br />
Správové dialógy zobrazujú správu a čakajú na stlačenie klávesy alebo kliknutie myšou.<br />
===ShowMessage===<br />
<delphi> Procedure ShowMessage (const Msg: string);<br />
<br />
{ Defined in Dialogs.pp }</delphi><br />
<br />
The simplest message dialog: takes a simple string as parameter, displays it in a stereotyped box, and waits for a mouse-click or enter-key event before returning to the calling routine or program.<br><br />
This is a modal procedure call, that is the box is displayed, receives focus, and does not relinquish focus until the OK box is clicked or otherwise selected.<br />
<br />
Príklad:<br />
<delphi> Program LazMessage;<br />
Uses Dialogs;<br />
begin<br />
ShowMessage ('This is a message from Lazarus')<br />
end.</delphi><br />
<br />
===MessageBox===<br />
<delphi> Function Application.MessageBox (Text, Caption: PChar; Flags: longint) : Integer;<br />
<br />
{ Defined in Forms.pp as part of TApplication; hence must be called as Application.Messagebox () <br />
or using the 'with Application do ...' construct }</delphi><br />
<br />
Parameters include<br />
<br />
* Text: the string that is displayed as a prompt or instruction in the Box;<br />
* Caption: the string label at the top of the message box;<br />
* Flags: longint - an integer constructed by adding together various constants to define the contents and behaviour of the box, for example MB_ABORTRETRYIGNORE + MR_ICONQUESTION will cause the application to display a query (?) icon in a box with three buttons: ABORT RETRY IGNORE.<br />
<br />
The function returns an integer value corresponding to the button that was pressed; its value can be determined by reference to the constants [IDOK..IDHELP]<br />
<br />
It can be invoked like a procedure call (ie as a 'MessageBox()' statement rather than as a 'Variable := MessageBox()' function call - see example below)<br />
<br />
Príklad:<br />
<delphi> Uses Forms, Dialogs, LCLType;<br />
<br />
Procedure DisplayMessageBox;<br />
var reply, boxstyle: integer;<br />
begin<br />
with application do begin<br />
boxstyle := MB_ICONQUESTION + MB_YESNO;<br />
reply := MessageBox ('Press either button', 'MessageBoxDemo', boxstyle);<br />
if reply = IDYES then MessageBox ('Yes ', 'Reply',MB_ICONINFORMATION)<br />
else MessageBox ('No ', 'Reply', MB_ICONHAND);<br />
end;</delphi><br />
<br />
Notice that in this example the 'Yes' and 'No' strings have been padded out with spaces; otherwise the box would not be wide enough to display the caption properly<br />
<br />
<center> http://lazarus-ccr.sourceforge.net/kbdata/MessageBoxDemo.png http://lazarus-ccr.sourceforge.net/kbdata/ReplyYes.png<br />
</center><br />
<br />
===MessageDLG===<br />
<delphi> function MessageDlg(const aMsg: string; DlgType: TMsgDlgType; <br />
Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;<br />
function MessageDlg(const aCaption, aMsg: string; DlgType: TMsgDlgType; <br />
Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;</delphi><br />
<br />
Two versions of this function, ie first 'Caption' parameter is optional; if omitted, caption is missing from box<br />
<br />
This is the most complete and elaborate of the message dialogs, and allows the programmer considerable control over the appearance of the dialog box.<br />
The parameters defining the kind of box and its icon are types rather than integer constants, and the buttons can be specified as a set in square brackets eg [mbRetry, mbIgnore, mbAbort, mbCancel].<br />
The HelpCtx parameter is not currently implemented and should be set to zero.<br />
The return value from the Function is the identity of the button pressed, expressed as an integer (see the definitions below, [mrNone..mrAll]).<br />
<br />
Príklad:<br />
<delphi> Uses forms, dialogs, lcltype, controls;<br />
<br />
procedure TryMessageDlg;<br />
begin<br />
if MessageDlg ('Question', 'Do you wish to Execute?', mtConfirmation, <br />
[mbYes, mbNo, mbIgnore],0) = mrYes<br />
then { Execute rest of Program };<br />
end;</delphi><br />
<br />
<center> http://lazarus-ccr.sourceforge.net/kbdata/Question.png <br />
</center><br />
<br />
== Text input Dialogs==<br />
===InputBox===<br />
Text input Dialogs: display a message and await user text input<br />
<br />
<delphi>Function InputBox(const ACaption, APrompt, ADefault : String) : String;</delphi><br />
<br />
Displays a box with defined title and prompt, and expects user input in a text box. A default string can optionally be displayed in the text box. The user-entered or default string is returned as the function result.<br />
<br />
Príklad:<br />
<delphi> Uses forms, lcltype, dialogs, controls;<br />
<br />
procedure TryInputBox;<br />
var userstring: string;<br />
begin<br />
userstring := InputBox ('Get some text input', <br />
'Please type in some information', 'Some sample text');<br />
ShowMessage (userstring)<br />
end;</delphi><br />
<br />
===InputQuery===<br />
<delphi> Function InputQuery(const ACaption, APrompt : String;<br />
MaskInput : Boolean; var Value : String) : Boolean;<br />
Function InputQuery(const ACaption, APrompt : String;<br />
var Value : String) : Boolean;</delphi><br />
<br />
Two versions of this function which displays a prompt and expects user input of textual data; the first includes a MaskInput boolean parameter which determines whether the user input is masked out by asterisks in the text-input box (like during entry of a password), while the second omits this property. The text entered by the user is returned in the variable parameter 'Value'; the function result is a boolean which returns TRUE if the OK button was pressed, or FALSE if the box was closed by any other mechanism (such as clicking the 'Close' icon on the top title bar). Omitting the MaskInput parameter is equivalent to setting it FALSE.<br />
<br />
Príklad:<br />
<delphi> Uses forms, lcltype, dialogs, controls;<br />
<br />
procedure TryInputQuery;<br />
var QueryResult: boolean;<br />
userstring: string;<br />
begin<br />
if InputQuery ('Question', 'Type in some data', TRUE, userstring)<br />
then ShowMessage (userstring)<br />
else <br />
begin<br />
InputQuery ('Don''t be silly', 'Please try again', userstring);<br />
ShowMessage (userstring);<br />
end<br />
end;</delphi><br />
<br />
<center> http://lazarus-ccr.sourceforge.net/kbdata/MessageDlgQuestion.png </center><br />
<br />
<center> http://lazarus-ccr.sourceforge.net/kbdata/DontBeSillly.png </center><br />
<br />
===PasswordBox===<br />
<delphi> Function PasswordBox(const ACaption, APrompt : String) : String;</delphi><br />
<br />
Behaves very similarly to the InputQuery function with MaskInput = TRUE; the difference is that the password that was typed in is returned as the result of the function (like InputBox).<br />
<br />
==Constants and Types used in message dialogs==<br />
<br />
Several constants and types relevant for use with the dialog boxes are pre-defined in the LCL library:<br />
<br />
<delphi> const { Defined in LCLType.pp }</delphi><br />
<br />
integer constants for defining the types of buttons<br />
and the icon for display in MessageBox<br />
<br />
<delphi> MB_OK = $00000000;<br />
MB_OKCANCEL = $00000001;<br />
MB_ABORTRETRYIGNORE = $00000002;<br />
MB_YESNOCANCEL = $00000003;<br />
MB_YESNO = $00000004;<br />
MB_RETRYCANCEL = $00000005;<br />
<br />
MB_ICONHAND = $00000010;<br />
MB_ICONQUESTION = $00000020;<br />
MB_ICONEXCLAMATION = $00000030;<br />
MB_ICONASTERICK = $00000040;<br />
MB_ICONWARNING = MB_ICONEXCLAMATION;<br />
MB_ICONERROR = MB_ICONHAND;<br />
MB_ICONINFORMATION = MB_ICONASTERICK;</delphi><br />
<br />
integer constants defining the return value from MessageBox according to which button was pressed<br />
<br />
<delphi> IDOK = 1; ID_OK = IDOK;<br />
IDCANCEL = 2; ID_CANCEL = IDCANCEL;<br />
IDABORT = 3; ID_ABORT = IDABORT;<br />
IDRETRY = 4; ID_RETRY = IDRETRY;<br />
IDIGNORE = 5; ID_IGNORE = IDIGNORE;<br />
IDYES = 6; ID_YES = IDYES;<br />
IDNO = 7; ID_NO = IDNO;<br />
IDCLOSE = 8; ID_CLOSE = IDCLOSE;<br />
IDHELP = 9; ID_HELP = IDHELP;</delphi><br />
<br />
define whether first, second or third button is default<br />
<br />
<delphi> MB_DEFBUTTON1 = $00000000;<br />
MB_DEFBUTTON2 = $00000100;<br />
MB_DEFBUTTON3 = $00000200;<br />
MB_DEFBUTTON4 = $00000300;</delphi><br />
<br />
The Flags parameter of MessageBox is constructed by adding a button constant [MB_OK..MB_RETRYCANCEL], an optional icon constant [MB_ICONHAND..MB_ICONINFORMATION] and an optional default button constant [MB_DEFBUTTON1..MB_DEFBUTTON3]<br />
<br />
Types for use in MessageDlg, which needs parameters AType of TMsgDlgType and AButtons of TMSgDlgButtons<br />
<br />
<delphi> { Defined in Dialogs.pp }<br />
type<br />
TMsgDlgType = (mtWarning, mtError, mtInformation, mtConfirmation,<br />
mtCustom);<br />
TMsgDlgBtn = (mbYes, mbNo, mbOK, mbCancel, mbAbort, mbRetry, mbIgnore,<br />
mbAll, mbNoToAll, mbYesToAll, mbHelp, mbClose);<br />
TMsgDlgButtons = set of TMsgDlgBtn;<br />
<br />
const<br />
mbYesNoCancel = [mbYes, mbNo, mbCancel];<br />
mbOKCancel = [mbOK, mbCancel];<br />
mbAbortRetryIgnore = [mbAbort, mbRetry, mbIgnore];<br />
<br />
MsgDlgBtnToBitBtnKind: array[TMsgDlgBtn] of TBitBtnKind = (<br />
bkYes, bkNo, bkOK, bkCancel, bkAbort, bkRetry, bkIgnore,<br />
bkAll, bkNoToAll, bkYesToAll, bkHelp, bkClose<br />
);<br />
<br />
BitBtnKindToMsgDlgBtn: array[TBitBtnKind] of TMsgDlgBtn = (<br />
mbOk, mbOK, mbCancel, mbHelp, mbYes, mbNo,<br />
mbClose, mbAbort, mbRetry, mbIgnore, mbAll, mbNoToALl, mbYesToAll<br />
);<br />
<br />
{ Defined in Controls.pp }<br />
const<br />
mrNone = 0;<br />
mrOK = mrNone + 1;<br />
mrCancel = mrNone + 2;<br />
mrAbort = mrNone + 3;<br />
mrRetry = mrNone + 4;<br />
mrIgnore = mrNone + 5;<br />
mrYes = mrNone + 6;<br />
mrNo = mrNone + 7;<br />
mrAll = mrNone + 8;<br />
mrNoToAll = mrNone + 9;<br />
mrYesToAll = mrNone + 10;<br />
mrLast = mrYesToAll;</delphi><br />
<br />
----<br />
This page has been imported from the epikwiki [http://lazarus-ccr.sourceforge.net/index.php?wiki=DialogExamples version].</div>Slavkohttps://wiki.freepascal.org/index.php?title=Dialog_Examples/sk&diff=32032Dialog Examples/sk2008-11-17T19:07:07Z<p>Slavko: /* Some useful dialogs */ preklad</p>
<hr />
<div>{{Dialog Examples}}<br />
<br />
= Niektoré užitočné dialógy =<br />
Toto sú niektoré užitočné dialógy, ktoré nenájdete v Palete komonentov:<br />
<br />
* procedure ShowMessage (const Msg: string);<br />
* function MessageBox (Text, Caption : PChar; Flags: Word): Integer;<br />
* function MessageDlg (const Msg: string; AType: TMsgDlgType; AButtons: TMsgDlgButtons; HelpCtx: LongInt): Word;<br />
* function InputBox (const ACaption, APrompt, ADefault: string); string;<br />
* function InputQuery (const ACaption, APrompt: string; var Value: string): Boolean;<br />
* function PasswordBox(const ACaption, APrompt : String) : String;<br />
<br />
Každý z týchto komponentov zobrazuje malé vyskakovacie dialógové okno, ktoré obsahuje nejaké informácie a vyžaduje odozvu používateľa: stlačenie tlačítka, zadanie textu alebo oboje. Programátor má minimálnu kontrolu nad formátom, veľkosťou alebo pozíciou týchto vyskakovacích okien, ale môže ovplyvňovať ich textový obsah.<br><br />
Dôvodom prečo často existujú veľmi podobné alternatívy, je umožniť rôzne spôsoby volania komponentu, a získavania dát, z procedúr a funkcií.<br />
<br />
==Správové dialógy==<br />
Správové dialógy zobrazujú správu a čakajú na stlačenie klávesy alebo kliknutie myšou.<br />
===ShowMessage===<br />
Procedure ShowMessage (const Msg: string);<br />
<br />
{ Defined in Dialogs.pp }<br />
<br />
The simplest message dialog: takes a simple string as parameter, displays it in a stereotyped box, and waits for a mouse-click or enter-key event before returning to the calling routine or program.<br><br />
This is a modal procedure call, that is the box is displayed, receives focus, and does not relinquish focus until the OK box is clicked or otherwise selected.<br />
<br />
Example:<br />
<br />
Program LazMessage;<br />
Uses Dialogs;<br />
begin<br />
ShowMessage ('This is a message from Lazarus')<br />
end.<br />
<br />
===MessageBox===<br />
Function Application.MessageBox (Text, Caption: PChar; Flags: longint) : Integer;<br />
<br />
{ Defined in Forms.pp as part of TApplication; hence must be called as Application.Messagebox () or using the 'with Application do ...' construct }<br />
<br />
Parameters include<br />
<br />
* Text: the string that is displayed as a prompt or instruction in the Box;<br />
* Caption: the string label at the top of the message box;<br />
* Flags: longint - an integer constructed by adding together various constants to define the contents and behaviour of the box, for example MB_ABORTRETRYIGNORE + MR_ICONQUESTION will cause the application to display a query (?) icon in a box with three buttons: ABORT RETRY IGNORE.<br />
<br />
The function returns an integer value corresponding to the button that was pressed; its value can be determined by reference to the constants [IDOK..IDHELP]<br />
<br />
It can be invoked like a procedure call (ie as a 'MessageBox()' statement rather than as a 'Variable := MessageBox()' function call - see example below)<br />
<br />
Example<br />
<br />
Uses Forms, Dialogs, LCLType;<br />
<br />
Procedure DisplayMessageBox;<br />
var reply, boxstyle: integer;<br />
begin<br />
with application do begin<br />
boxstyle := MB_ICONQUESTION + MB_YESNO;<br />
reply := MessageBox ('Press either button', 'MessageBoxDemo', boxstyle);<br />
if reply = IDYES then MessageBox ('Yes ', 'Reply',MB_ICONINFORMATION)<br />
else MessageBox ('No ', 'Reply', MB_ICONHAND);<br />
end;<br />
<br />
Notice that in this example the 'Yes' and 'No' strings have been padded out with spaces; otherwise the box would not be wide enough to display the caption properly<br />
<br />
<center> http://lazarus-ccr.sourceforge.net/kbdata/MessageBoxDemo.png http://lazarus-ccr.sourceforge.net/kbdata/ReplyYes.png<br />
</center><br />
<br />
===MessageDLG===<br />
function MessageDlg(const aMsg: string; DlgType: TMsgDlgType; <br />
Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;<br />
function MessageDlg(const aCaption, aMsg: string; DlgType: TMsgDlgType; <br />
Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;<br />
<br />
Two versions of this function, ie first 'Caption' parameter is optional; if omitted, caption is missing from box<br />
<br />
This is the most complete and elaborate of the message dialogs, and allows the programmer considerable control over the appearance of the dialog box.<br />
The parameters defining the kind of box and its icon are types rather than integer constants, and the buttons can be specified as a set in square brackets eg [mbRetry, mbIgnore, mbAbort, mbCancel].<br />
The HelpCtx parameter is not currently implemented and should be set to zero.<br />
The return value from the Function is the identity of the button pressed, expressed as an integer (see the definitions below, [mrNone..mrAll]).<br />
<br />
Example<br />
<br />
Uses forms, dialogs, lcltype, controls;<br />
<br />
procedure TryMessageDlg;<br />
begin<br />
if MessageDlg ('Question', 'Do you wish to Execute?', mtConfirmation, <br />
[mbYes, mbNo, mbIgnore],0) = mrYes<br />
then { Execute rest of Program };<br />
end;<br />
<br />
<br />
<center> http://lazarus-ccr.sourceforge.net/kbdata/Question.png <br />
</center><br />
<br />
== Text input Dialogs==<br />
===InputBox===<br />
Text input Dialogs: display a message and await user text input<br />
<br />
Function InputBox(const ACaption, APrompt, ADefault : String) : String;<br />
<br />
Displays a box with defined title and prompt, and expects user input in a text box. A default string can optionally be displayed in the text box. The user-entered or default string is returned as the function result.<br />
<br />
Example<br />
<br />
Uses forms, lcltype, dialogs, controls;<br />
<br />
procedure TryInputBox;<br />
var userstring: string;<br />
begin<br />
userstring := InputBox ('Get some text input', <br />
'Please type in some information', 'Some sample text');<br />
ShowMessage (userstring)<br />
end;<br />
<br />
===InputQuery===<br />
Function InputQuery(const ACaption, APrompt : String;<br />
MaskInput : Boolean; var Value : String) : Boolean;<br />
Function InputQuery(const ACaption, APrompt : String;<br />
var Value : String) : Boolean;<br />
<br />
Two versions of this function which displays a prompt and expects user input of textual data; the first includes a MaskInput boolean parameter which determines whether the user input is masked out by asterisks in the text-input box (like during entry of a password), while the second omits this property. The text entered by the user is returned in the variable parameter 'Value'; the function result is a boolean which returns TRUE if the OK button was pressed, or FALSE if the box was closed by any other mechanism (such as clicking the 'Close' icon on the top title bar). Omitting the MaskInput parameter is equivalent to setting it FALSE.<br />
<br />
Example<br />
<br />
Uses forms, lcltype, dialogs, controls;<br />
<br />
procedure TryInputQuery;<br />
var QueryResult: boolean;<br />
userstring: string;<br />
begin<br />
if InputQuery ('Question', 'Type in some data', TRUE, userstring)<br />
then ShowMessage (userstring)<br />
else <br />
begin<br />
InputQuery ('Don''t be silly', 'Please try again', userstring);<br />
ShowMessage (userstring);<br />
end<br />
end;<br />
<br />
<center> http://lazarus-ccr.sourceforge.net/kbdata/MessageDlgQuestion.png </center><br />
<br />
<center> http://lazarus-ccr.sourceforge.net/kbdata/DontBeSillly.png </center><br />
<br />
===PasswordBox===<br />
Function PasswordBox(const ACaption, APrompt : String) : String;<br />
<br />
Behaves very similarly to the InputQuery function with MaskInput = TRUE; the difference is that the password that was typed in is returned as the result of the function (like InputBox).<br />
<br />
==Constants and Types used in message dialogs==<br />
<br />
Several constants and types relevant for use with the dialog boxes are pre-defined in the LCL library:<br />
<br />
const { Defined in LCLType.pp }<br />
<br />
integer constants for defining the types of buttons<br />
and the icon for display in MessageBox<br />
<br />
MB_OK = $00000000;<br />
MB_OKCANCEL = $00000001;<br />
MB_ABORTRETRYIGNORE = $00000002;<br />
MB_YESNOCANCEL = $00000003;<br />
MB_YESNO = $00000004;<br />
MB_RETRYCANCEL = $00000005;<br />
<br />
<br />
MB_ICONHAND = $00000010;<br />
MB_ICONQUESTION = $00000020;<br />
MB_ICONEXCLAMATION = $00000030;<br />
MB_ICONASTERICK = $00000040;<br />
MB_ICONWARNING = MB_ICONEXCLAMATION;<br />
MB_ICONERROR = MB_ICONHAND;<br />
MB_ICONINFORMATION = MB_ICONASTERICK;<br />
<br />
integer constants defining the return value from MessageBox according to which button was pressed<br />
<br />
IDOK = 1; ID_OK = IDOK;<br />
IDCANCEL = 2; ID_CANCEL = IDCANCEL;<br />
IDABORT = 3; ID_ABORT = IDABORT;<br />
IDRETRY = 4; ID_RETRY = IDRETRY;<br />
IDIGNORE = 5; ID_IGNORE = IDIGNORE;<br />
IDYES = 6; ID_YES = IDYES;<br />
IDNO = 7; ID_NO = IDNO;<br />
IDCLOSE = 8; ID_CLOSE = IDCLOSE;<br />
IDHELP = 9; ID_HELP = IDHELP;<br />
<br />
define whether first, second or third button is default<br />
<br />
MB_DEFBUTTON1 = $00000000;<br />
MB_DEFBUTTON2 = $00000100;<br />
MB_DEFBUTTON3 = $00000200;<br />
MB_DEFBUTTON4 = $00000300;<br />
<br />
The Flags parameter of MessageBox is constructed by adding a button constant [MB_OK..MB_RETRYCANCEL],<br />
an optional icon constant [MB_ICONHAND..MB_ICONINFORMATION]<br />
and an optional default button constant [MB_DEFBUTTON1..MB_DEFBUTTON3]<br />
<br />
Types for use in MessageDlg, which needs parameters<br />
AType of TMsgDlgType and AButtons of TMSgDlgButtons<br />
<br />
<br />
{ Defined in Dialogs.pp }<br />
type<br />
TMsgDlgType = (mtWarning, mtError, mtInformation, mtConfirmation,<br />
mtCustom);<br />
TMsgDlgBtn = (mbYes, mbNo, mbOK, mbCancel, mbAbort, mbRetry, mbIgnore,<br />
mbAll, mbNoToAll, mbYesToAll, mbHelp, mbClose);<br />
TMsgDlgButtons = set of TMsgDlgBtn;<br />
<br />
<br />
const<br />
mbYesNoCancel = [mbYes, mbNo, mbCancel];<br />
mbOKCancel = [mbOK, mbCancel];<br />
mbAbortRetryIgnore = [mbAbort, mbRetry, mbIgnore];<br />
<br />
<br />
MsgDlgBtnToBitBtnKind: array[TMsgDlgBtn] of TBitBtnKind = (<br />
bkYes, bkNo, bkOK, bkCancel, bkAbort, bkRetry, bkIgnore,<br />
bkAll, bkNoToAll, bkYesToAll, bkHelp, bkClose<br />
);<br />
<br />
<br />
BitBtnKindToMsgDlgBtn: array[TBitBtnKind] of TMsgDlgBtn = (<br />
mbOk, mbOK, mbCancel, mbHelp, mbYes, mbNo,<br />
mbClose, mbAbort, mbRetry, mbIgnore, mbAll, mbNoToALl, mbYesToAll<br />
);<br />
<br />
<br />
{ Defined in Controls.pp }<br />
const<br />
mrNone = 0;<br />
mrOK = mrNone + 1;<br />
mrCancel = mrNone + 2;<br />
mrAbort = mrNone + 3;<br />
mrRetry = mrNone + 4;<br />
mrIgnore = mrNone + 5;<br />
mrYes = mrNone + 6;<br />
mrNo = mrNone + 7;<br />
mrAll = mrNone + 8;<br />
mrNoToAll = mrNone + 9;<br />
mrYesToAll = mrNone + 10;<br />
mrLast = mrYesToAll;<br />
<br />
----<br />
This page has been imported from the epikwiki [http://lazarus-ccr.sourceforge.net/index.php?wiki=DialogExamples version].</div>Slavkohttps://wiki.freepascal.org/index.php?title=Dialog_Examples/sk&diff=32030Dialog Examples/sk2008-11-17T18:59:18Z<p>Slavko: initial release</p>
<hr />
<div>{{Dialog Examples}}<br />
<br />
= Some useful dialogs=<br />
Here are some useful dialogs not found in the Component Palette:<br />
<br />
* procedure ShowMessage (const Msg: string);<br />
* function MessageBox (Text, Caption : PChar; Flags: Word): Integer;<br />
* function MessageDlg (const Msg: string; AType: TMsgDlgType; AButtons: TMsgDlgButtons; HelpCtx: LongInt): Word;<br />
* function InputBox (const ACaption, APrompt, ADefault: string); string;<br />
* function InputQuery (const ACaption, APrompt: string; var Value: string): Boolean;<br />
* function PasswordBox(const ACaption, APrompt : String) : String;<br />
<br />
Each of these components causes a small popup box to be displayed, which contains some information and requires a user response: either a button press or some text entry or both. The programmer has little control over the format, size or position of these popup boxes, but can influence their textual content.<br><br />
The reason why there are often several very similar alternatives, is to allow different methods of calling the component and receiving data back from the procedure or function.<br />
<br />
==Message Dialogs==<br />
Message dialogs display a message and wait for a key-press or mouse-click response.<br />
===ShowMessage===<br />
Procedure ShowMessage (const Msg: string);<br />
<br />
{ Defined in Dialogs.pp }<br />
<br />
The simplest message dialog: takes a simple string as parameter, displays it in a stereotyped box, and waits for a mouse-click or enter-key event before returning to the calling routine or program.<br><br />
This is a modal procedure call, that is the box is displayed, receives focus, and does not relinquish focus until the OK box is clicked or otherwise selected.<br />
<br />
Example:<br />
<br />
Program LazMessage;<br />
Uses Dialogs;<br />
begin<br />
ShowMessage ('This is a message from Lazarus')<br />
end.<br />
<br />
===MessageBox===<br />
Function Application.MessageBox (Text, Caption: PChar; Flags: longint) : Integer;<br />
<br />
{ Defined in Forms.pp as part of TApplication; hence must be called as Application.Messagebox () or using the 'with Application do ...' construct }<br />
<br />
Parameters include<br />
<br />
* Text: the string that is displayed as a prompt or instruction in the Box;<br />
* Caption: the string label at the top of the message box;<br />
* Flags: longint - an integer constructed by adding together various constants to define the contents and behaviour of the box, for example MB_ABORTRETRYIGNORE + MR_ICONQUESTION will cause the application to display a query (?) icon in a box with three buttons: ABORT RETRY IGNORE.<br />
<br />
The function returns an integer value corresponding to the button that was pressed; its value can be determined by reference to the constants [IDOK..IDHELP]<br />
<br />
It can be invoked like a procedure call (ie as a 'MessageBox()' statement rather than as a 'Variable := MessageBox()' function call - see example below)<br />
<br />
Example<br />
<br />
Uses Forms, Dialogs, LCLType;<br />
<br />
Procedure DisplayMessageBox;<br />
var reply, boxstyle: integer;<br />
begin<br />
with application do begin<br />
boxstyle := MB_ICONQUESTION + MB_YESNO;<br />
reply := MessageBox ('Press either button', 'MessageBoxDemo', boxstyle);<br />
if reply = IDYES then MessageBox ('Yes ', 'Reply',MB_ICONINFORMATION)<br />
else MessageBox ('No ', 'Reply', MB_ICONHAND);<br />
end;<br />
<br />
Notice that in this example the 'Yes' and 'No' strings have been padded out with spaces; otherwise the box would not be wide enough to display the caption properly<br />
<br />
<center> http://lazarus-ccr.sourceforge.net/kbdata/MessageBoxDemo.png http://lazarus-ccr.sourceforge.net/kbdata/ReplyYes.png<br />
</center><br />
<br />
===MessageDLG===<br />
function MessageDlg(const aMsg: string; DlgType: TMsgDlgType; <br />
Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;<br />
function MessageDlg(const aCaption, aMsg: string; DlgType: TMsgDlgType; <br />
Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;<br />
<br />
Two versions of this function, ie first 'Caption' parameter is optional; if omitted, caption is missing from box<br />
<br />
This is the most complete and elaborate of the message dialogs, and allows the programmer considerable control over the appearance of the dialog box.<br />
The parameters defining the kind of box and its icon are types rather than integer constants, and the buttons can be specified as a set in square brackets eg [mbRetry, mbIgnore, mbAbort, mbCancel].<br />
The HelpCtx parameter is not currently implemented and should be set to zero.<br />
The return value from the Function is the identity of the button pressed, expressed as an integer (see the definitions below, [mrNone..mrAll]).<br />
<br />
Example<br />
<br />
Uses forms, dialogs, lcltype, controls;<br />
<br />
procedure TryMessageDlg;<br />
begin<br />
if MessageDlg ('Question', 'Do you wish to Execute?', mtConfirmation, <br />
[mbYes, mbNo, mbIgnore],0) = mrYes<br />
then { Execute rest of Program };<br />
end;<br />
<br />
<br />
<center> http://lazarus-ccr.sourceforge.net/kbdata/Question.png <br />
</center><br />
<br />
== Text input Dialogs==<br />
===InputBox===<br />
Text input Dialogs: display a message and await user text input<br />
<br />
Function InputBox(const ACaption, APrompt, ADefault : String) : String;<br />
<br />
Displays a box with defined title and prompt, and expects user input in a text box. A default string can optionally be displayed in the text box. The user-entered or default string is returned as the function result.<br />
<br />
Example<br />
<br />
Uses forms, lcltype, dialogs, controls;<br />
<br />
procedure TryInputBox;<br />
var userstring: string;<br />
begin<br />
userstring := InputBox ('Get some text input', <br />
'Please type in some information', 'Some sample text');<br />
ShowMessage (userstring)<br />
end;<br />
<br />
===InputQuery===<br />
Function InputQuery(const ACaption, APrompt : String;<br />
MaskInput : Boolean; var Value : String) : Boolean;<br />
Function InputQuery(const ACaption, APrompt : String;<br />
var Value : String) : Boolean;<br />
<br />
Two versions of this function which displays a prompt and expects user input of textual data; the first includes a MaskInput boolean parameter which determines whether the user input is masked out by asterisks in the text-input box (like during entry of a password), while the second omits this property. The text entered by the user is returned in the variable parameter 'Value'; the function result is a boolean which returns TRUE if the OK button was pressed, or FALSE if the box was closed by any other mechanism (such as clicking the 'Close' icon on the top title bar). Omitting the MaskInput parameter is equivalent to setting it FALSE.<br />
<br />
Example<br />
<br />
Uses forms, lcltype, dialogs, controls;<br />
<br />
procedure TryInputQuery;<br />
var QueryResult: boolean;<br />
userstring: string;<br />
begin<br />
if InputQuery ('Question', 'Type in some data', TRUE, userstring)<br />
then ShowMessage (userstring)<br />
else <br />
begin<br />
InputQuery ('Don''t be silly', 'Please try again', userstring);<br />
ShowMessage (userstring);<br />
end<br />
end;<br />
<br />
<center> http://lazarus-ccr.sourceforge.net/kbdata/MessageDlgQuestion.png </center><br />
<br />
<center> http://lazarus-ccr.sourceforge.net/kbdata/DontBeSillly.png </center><br />
<br />
===PasswordBox===<br />
Function PasswordBox(const ACaption, APrompt : String) : String;<br />
<br />
Behaves very similarly to the InputQuery function with MaskInput = TRUE; the difference is that the password that was typed in is returned as the result of the function (like InputBox).<br />
<br />
==Constants and Types used in message dialogs==<br />
<br />
Several constants and types relevant for use with the dialog boxes are pre-defined in the LCL library:<br />
<br />
const { Defined in LCLType.pp }<br />
<br />
integer constants for defining the types of buttons<br />
and the icon for display in MessageBox<br />
<br />
MB_OK = $00000000;<br />
MB_OKCANCEL = $00000001;<br />
MB_ABORTRETRYIGNORE = $00000002;<br />
MB_YESNOCANCEL = $00000003;<br />
MB_YESNO = $00000004;<br />
MB_RETRYCANCEL = $00000005;<br />
<br />
<br />
MB_ICONHAND = $00000010;<br />
MB_ICONQUESTION = $00000020;<br />
MB_ICONEXCLAMATION = $00000030;<br />
MB_ICONASTERICK = $00000040;<br />
MB_ICONWARNING = MB_ICONEXCLAMATION;<br />
MB_ICONERROR = MB_ICONHAND;<br />
MB_ICONINFORMATION = MB_ICONASTERICK;<br />
<br />
integer constants defining the return value from MessageBox according to which button was pressed<br />
<br />
IDOK = 1; ID_OK = IDOK;<br />
IDCANCEL = 2; ID_CANCEL = IDCANCEL;<br />
IDABORT = 3; ID_ABORT = IDABORT;<br />
IDRETRY = 4; ID_RETRY = IDRETRY;<br />
IDIGNORE = 5; ID_IGNORE = IDIGNORE;<br />
IDYES = 6; ID_YES = IDYES;<br />
IDNO = 7; ID_NO = IDNO;<br />
IDCLOSE = 8; ID_CLOSE = IDCLOSE;<br />
IDHELP = 9; ID_HELP = IDHELP;<br />
<br />
define whether first, second or third button is default<br />
<br />
MB_DEFBUTTON1 = $00000000;<br />
MB_DEFBUTTON2 = $00000100;<br />
MB_DEFBUTTON3 = $00000200;<br />
MB_DEFBUTTON4 = $00000300;<br />
<br />
The Flags parameter of MessageBox is constructed by adding a button constant [MB_OK..MB_RETRYCANCEL],<br />
an optional icon constant [MB_ICONHAND..MB_ICONINFORMATION]<br />
and an optional default button constant [MB_DEFBUTTON1..MB_DEFBUTTON3]<br />
<br />
Types for use in MessageDlg, which needs parameters<br />
AType of TMsgDlgType and AButtons of TMSgDlgButtons<br />
<br />
<br />
{ Defined in Dialogs.pp }<br />
type<br />
TMsgDlgType = (mtWarning, mtError, mtInformation, mtConfirmation,<br />
mtCustom);<br />
TMsgDlgBtn = (mbYes, mbNo, mbOK, mbCancel, mbAbort, mbRetry, mbIgnore,<br />
mbAll, mbNoToAll, mbYesToAll, mbHelp, mbClose);<br />
TMsgDlgButtons = set of TMsgDlgBtn;<br />
<br />
<br />
const<br />
mbYesNoCancel = [mbYes, mbNo, mbCancel];<br />
mbOKCancel = [mbOK, mbCancel];<br />
mbAbortRetryIgnore = [mbAbort, mbRetry, mbIgnore];<br />
<br />
<br />
MsgDlgBtnToBitBtnKind: array[TMsgDlgBtn] of TBitBtnKind = (<br />
bkYes, bkNo, bkOK, bkCancel, bkAbort, bkRetry, bkIgnore,<br />
bkAll, bkNoToAll, bkYesToAll, bkHelp, bkClose<br />
);<br />
<br />
<br />
BitBtnKindToMsgDlgBtn: array[TBitBtnKind] of TMsgDlgBtn = (<br />
mbOk, mbOK, mbCancel, mbHelp, mbYes, mbNo,<br />
mbClose, mbAbort, mbRetry, mbIgnore, mbAll, mbNoToALl, mbYesToAll<br />
);<br />
<br />
<br />
{ Defined in Controls.pp }<br />
const<br />
mrNone = 0;<br />
mrOK = mrNone + 1;<br />
mrCancel = mrNone + 2;<br />
mrAbort = mrNone + 3;<br />
mrRetry = mrNone + 4;<br />
mrIgnore = mrNone + 5;<br />
mrYes = mrNone + 6;<br />
mrNo = mrNone + 7;<br />
mrAll = mrNone + 8;<br />
mrNoToAll = mrNone + 9;<br />
mrYesToAll = mrNone + 10;<br />
mrLast = mrYesToAll;<br />
<br />
----<br />
This page has been imported from the epikwiki [http://lazarus-ccr.sourceforge.net/index.php?wiki=DialogExamples version].</div>Slavkohttps://wiki.freepascal.org/index.php?title=Creating_A_Patch/sk&diff=27509Creating A Patch/sk2008-04-05T12:26:39Z<p>Slavko: oprava preklepu</p>
<hr />
<div>{{Creating A Patch}}<br />
==Pokyny==<br />
Predpokladom je, že máte Lazarusa zo SVN. [[Getting Lazarus#Via SVN| Getting Lazarus Via SVN]]<br />
<br />
Otvorte príkazový riadok, alebo terminál a vojdiťe do adresára kde máte zdrojové kódy Lazarusu.<br />
<br />
'''Inštrukcie pre Windows:'''<br />
<br />
Budeme predpokladať, že zdrojové kódy sa nachádzajú v C:\lazarus<br />
<br />
# Otvorte príkazový riadok<br />
# c: {stlač enter}<br />
# cd \lazarus {stlač enter}<br />
# svn diff > mypatch.dif {stlač enter}<br />
<br />
'''Inštrukcie pre Linux/BSD atď:'''<br />
<br />
Budeme predpokladať, že zdrojové kódy sa nachádzajú v $HOME/lazarus<br />
<br />
# Otvorte svoj oblúbený terminálový program<br />
# cd $HOME {stlač enter}<br />
# cd lazarus {stlač enter}<br />
# svn diff > mypatch.diff {stlač enter}<br />
<br />
<br />
''Poznámka: Ja si ten súbor ešte rád kontrolujem aby som sa uistil že tam je len čo tam má byť.''<br />
<br />
Odporúčaný spôsob zasielania súboru je cez [http://www.lazarus.freepascal.org/mantis/ bug tracker]. Ak pre problém, ktorý Váš patch opravuje existuje hlásenie, použite ho, v opačnom prípade vytvorte nové hlásenie o chybe. Súbor s patchom pripojte do hlásenia.<br />
<br />
Druhou možnostou je spakovanie súboru pomocou zip, alebo gzip a poslanie na Lazarus mailing list (40 kB limit), alebo na mail pre patche [mailto:patch@lazarus.dommelstein.net patch@lazarus.dommelstein.net]. <br />
<br />
Eto vsjo!<br />
<br />
== Problémy ==<br />
Toto sa väčšinou týka Wokien, ale môže sa to objaviť aj na iných platformách.<br />
<br />
'''Objaví sa chyba "svn command not found", alebo niečo podobné.'''<br />
Pravdepodobne nemáte svn.exe vo svojej ceste (PATH). Následné kroky vám pomôžu tento problém odstrániť.<br />
<br />
# Nájdite svn.exe pomocou Nájdi śubory a zložky v hlavnom menu.<br />
# Po tom, čo ste našli svn.exe budete potrebovať tento adresár pridať do svojej cesty (PATH).<br />
Ako príklad: z príkazového riadka napíšte: <br />
set PATH=%PATH%;"C:\Program Files\TortoiseSVN\"<br />
<br />
''Poznámka: Váš adresár, ktorý obsahuje svn.exe nemusí byť taký istý ako je uvedený v tejto ukážke.''<br />
<br />
<br />
Následovné je dobrovolné:<br />
<br />
'''Aby to bolo napevno'''<br />
<br />
Pre Windows98 a vyžšie môžete pridať tento riadok (alebo podobný) do C:\autoexec.bat. <br />
<br />
Pre Windows2000 a vyžšie môžete nastaviť vašu cestu (PATH) cez:<br />
<br />
# Pravým kliknite na "Tento Počítač"<br />
# Vyberte "Vlastnosti"<br />
# Vyberte záložku "Pokročilé".<br />
# Kliknite na "Premenné prostredia".<br />
# Nájdite riadok s "Path" v "Systémových premenných" a pridajte: ;"C:\Program Files\TortoiseSVN\" na koniec.<br />
<br />
''Poznámka: Váš adresár, ktorý obsahuje svn.exe nemusí byť taký istý ako je uvedený v tejto ukážke.''<br />
<br />
==Aplikovanie patchu==<br />
Aplikovanie patchu je jednoduché. Patch môžete otestovať prepínačom --dry-run napr:<br />
<br />
patch --dry-run < mypatch.diff<br />
<br />
Výstup programu buďe rovnaký ako samotné patchovanie, rozdiel je v tom že sa nezmenil cielový súbor. Veľmi užitočný postup pre otestovnie správnosti patchu.<br />
<br />
Aby ste patch naozaj aplikovali spravte: <br />
<br />
patch < mypatch.diff<br />
<br />
Alebo pre opravenie oddeľovačov:<br />
<br />
patch -p0 < mypatch.diff</div>Slavkohttps://wiki.freepascal.org/index.php?title=IDE_Window:_Extract_Procedure/sk&diff=26935IDE Window: Extract Procedure/sk2008-02-20T21:27:49Z<p>Slavko: úprava formátovania</p>
<hr />
<div>{{IDE Window: Extract Procedure| Extrahovať procedúru}}<br><br />
(''Extract Procedure'')<br />
<br />
Extrahovať procedúru vystrihne vybratú časť kódu Pascalu a z neho vytvára novú procedúru/metódu. Tento nástroj je užitočný na rozdelenie veľkých procedúr alebo na jednoduché vytvorenie novej procedúry z nejakého kódu.<br />
<br />
Základný príklad:<br />
<pascal> procedure DoSomething;<br />
begin<br />
CallSomething;<br />
end;</pascal><br />
<br />
Vyberte riadok "CallSomething;" a urobte Extrahovať procedúru. Vyskočí dialógové okno, v ktorom môžete zvoliť typ a meno procedúry, ktorá á byť vytvorená. Napríklad: procedure, "NewProc".<br />
<br />
Výsledok:<br />
<pascal> procedure NewProc;<br />
begin<br />
CallSomething;<br />
end;<br />
<br />
procedure DoSomething;<br />
begin<br />
NewProc;<br />
end;</pascal><br />
<br />
Môžete vidieť, že bola vytvorená nová procedúra "NewProc", do jej tela bol vložený výber a starý kód bol nahradený volaním novej procedúry.<br />
<br />
Lokálne premenné a parametre:<br><br />
<br />
Nástroj Extrahovať procedúru hľadá použité premenné a automaticky vytvára zoznam parametrov a lokálnych premenných. Príklad:<br />
<pascal> procedure TForm1.DoSomething(var Erni, Bert: integer);<br />
var<br />
i: Integer; // Comment<br />
begin<br />
Erni:=Erni+Bert;<br />
for i:=Erni to 5 do begin<br />
|<br />
end;<br />
end;</pascal><br />
<br />
Vyberte slučku for a vytvorte novú procedúru "NewProc". Vo výbere je použitá len lokálna premenná i, tak bude presunutá do novej procedúry. Premenná Erni je použitá aj vo zvyšku kódu, tak sa z nej stane parameter.<br />
<br />
Výsledok:<br />
<pascal> procedure NewProc(const Erni: integer);<br />
var<br />
i: Integer; // Comment<br />
begin<br />
for i:=Erni to 5 do begin<br />
|<br />
end;<br />
end;<br />
<br />
procedure TForm1.DoSomething(var Erni, Bert: integer);<br />
begin<br />
Erni:=Erni+Bert;<br />
NewProc(Erni);<br />
end;</pascal><br />
<br />
Vidno ako je "i" presunutá do premennej, vrátane komentára, a z Erni je vytvorený parameter.<br />
<br />
;Obmedzenia:<br />
Pascal je veľmi výkonný jazyk, tak nemožno očakávať, že to bude pracovať s každým kódom. Momentálne limity/ToDo:<br />
* kontrola, či hranice výberu korenšpondujú s hranicou príkazu<br />
* príkazy "with"</div>Slavkohttps://wiki.freepascal.org/index.php?title=Lazarus_IDE_Tools/sk&diff=26920Lazarus IDE Tools/sk2008-02-19T22:19:51Z<p>Slavko: úprava formátovania</p>
<hr />
<div>{{Lazarus IDE Tools}}<br />
<br />
==Úvod==<br />
IDE používa knižnicu analýzy zdrojového kódu Pascal a editačných nástrojov, zvanú "codetools". Tieto nástroje poskytujú funkcie ako hľadanie deklarácie (find declaration), dokončovanie kódu (code completion), odstraňovanie, presúvanie, vkladanie a formátovanie zdrojového kódu Pascal. Tieto funkcie šetria množstvo času a duplicitných úloh. Sú nastaviteľné a každá funkcia je dostupná pomocou klávesovej skratky (viď Editor Options).<br />
<br />
Pretože ich práca záleží na zdrojovom kóde a pochopení FreePascal, Delphi a Kylix kódu, nevyžadujú preložené jednotky ani nainštalovaný prekladač Borland. Môžete naraz upravovať kód Delphi aj FreePascal. Môžete dokonca pracovať s rôznymi verziami Delphi a FreePascal súčasne. Tým sa stáva prenos Delphi kódu ešte jednoduchší.<br />
<br />
==Zhrnutie klávesových skratiek IDE==<br />
{|<br />
|-<br />
| [[Lazarus IDE Tools/sk#Hľadanie_deklarácie | Hľadanie deklarácie]] (Declaration Jumping) || '''Ctrl+Click''' alebo '''Alt+Up'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Prepínanie_metód | Prepínanie metód]] (Method Jumping) || '''Ctrl+Shift+Up''' a '''Ctrl+Shift+Down'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Šablóny_kódu | Šablóny kódu]] (Code Templates) || '''Ctrl+J'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Dokončovanie_kódu | Dokončovanie kódu]] (Code/Class Completion) || '''Ctrl+Shift+C'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Dokončovanie_identifikátorov | Dokončovanie identifikátorov]] (Identifier Completion) || '''Ctrl+Medzerník'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Dokončovanie_slov | Dokončovanie slov]] (Word Completion) || '''Ctrl+W'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Pomoc_s_parametrami |Pomoc s parametrami]] (Parameter Hints) || '''Ctrl+Shift+Space'''<br />
|}<br />
<br />
==Prepínanie metód==<br />
(''Method Jumping'')<br />
<br />
Na prepínanie medzi telom procedúry (begin..end) a jej definíciou (procedure Name;) použite Ctrl+Shift+Up.<br />
<br />
Príklad:<br />
<pascal> interface<br />
<br />
procedure DoSomething; // procedure definition<br />
<br />
implementation<br />
<br />
procedure DoSomething; // procedure body <br />
begin<br />
end;</pascal><br />
<br />
Ak je kurzor v tele provedúry a stlačíte Ctrl+Shift+Up, kurzor skočí na definíciu. Ak znova stlačíte Ctrl+Shift+Up preskočí do tela procedúry, za 'begin'. Funkcia pracuje aj s metódami (procedúrami v triedach).<br />
<br />
Tipy:<br />
'Method Jumping' presúva kurzor na rovnakú procedúru s rovnakým menom i zoznamom parametrov. Ak presná procedúra neexistuje, skočí na najpodobnejšiu a umiestni kurzor na prvý rozdiel. V Delphi táto funkcia neexistuje.<br />
<br />
Príklad procedúry s rôznymi typmi parametrov:<br />
<pascal> interface<br />
<br />
procedure DoSomething(p: char); // procedure definition<br />
<br />
implementation<br />
<br />
procedure DoSomething(p: string); // procedure body<br />
begin<br />
end;</pascal><br />
<br />
Preskočenie z definície do tela umiestni kurzor na kľúčové slovo 'string'. Túto vlastnosť môžete využiť na premenovanie metódy a/alebo zmenu jej parametrov.<br />
<br />
Príklad:<br />
Premenovali sme 'DoSomething' na 'MakeIt':<br />
<pascal> interface<br />
<br />
procedure MakeIt; // procedure definition<br />
<br />
implementation<br />
<br />
procedure DoSomething; // procedure body<br />
begin<br />
end;</pascal><br />
<br />
Potom urobte skok z definície MakeIt do tela. IDE hľadá vhodné telo, nenájde žiadne, preto začne hľadať kandidátov. Keďže stepremenovali len jednu procedúru, tak je len jedno telo bez definície (DoSomething) a tak skočí do DoSomething a umiestni kurzor vpravo od 'DoSomething'. Potomm ju môžete jednoducho premenovať tiež. Toto rovnako pracuje s parametrami.<br />
<br />
==Include súbory==<br />
(''Include Files'')<br />
<br />
Include súbory sú súbory vložené do zdrojového kódu pomocou direktív prekladača {$I filename} alebo {$INCLUDE filename}. Lazarus a FreePascal používajú veľa takýchto vecí na redukciu nadbytočnosti a vyhnutie sa nečitateľnosti konštrukcií {$IFDEF} pri podpore rôznych platforiem.<br />
<br />
Narozdiel od Delphi, IDE Lazarus plne podporuje include súbory. Napríklad môžete skočiť z metódy v súbore .pas do tela metódy v include súbore. Všetky nástroje kódu, ako dokončovanie kódu, považuje include súbory za špeciálne hranice.<br />
<br />
Napríklad: keď dokončovanie kódu pridáva telo novej metódy za telom inej metódy, ponechá ich obe v rovnakom súbore. Týmto spôsobom môžete vložiť celú implementáciu triedy do include súborov, ako to robí LCL pre skoro všetky prvky.<br />
<br />
Ale je tu začiatočnícka chyba: Ak najprv otvoríte include súbor a skúsite prepínanie metód alebo hľadanie deklarácie, dostanete chybu. IDE nevie do ktorej jednotky include súbor patrí. Najprv musíte otvoriť jednotku.<br />
<br />
Hneď ako IDE zanalyzuje jednotku, zachytí v nej include direktívy a IDE si bude pamätať tento vzťah. Tieto informácie IDE ukladá pri skončení a pri uložení projektu do ~/.lazarus/includelinks.xml. Keď nabudúce otvoríte súbor include a urobíte skok do neho alebo hľadanie deklarácie, IDE interne otvorí jednotku a skoky budú fungovať.<br />
<br />
Tento mechanizmus má samozrejme obmedzenia, niektoré include súbory sú zahrnuté dva i viackrát. Napríklad: lcl/include/winapih.inc.<br />
Skákanie z definície procedúry/metódy v tomto include súbore do tela závisí na poslednej akcii. Ak ste pracovali v lcl/lclintf.pp, IDE skočí do winapi.inc. Ak ste pracovali v lcl/interfacebase.pp, potom skočíte do lcl/include/interfacebase.inc (alebo do jedného z ďalších include súborov). Ak pracujete s obomi, potom môže nastať zmätok. ;)<br />
<br />
==Šablóny kódu==<br />
(''Code Templates'')<br />
<br />
Šablóny kódu konvertujú identifikátor v texte alebo fragmente kódu. Šablóny kódu majú prednastavenú klávesovú skratku Ctrl+J. Môžete napísať identifikátor, stlačiť Ctrl+J a identifikátor je nahradený textom definovaným pre identifikátor. Šablóny kódu môžete definovať v Environment -> Editor Options -> CodeTools.<br />
<br />
Príklad:<br />
Napíšte identifikátor 'classf', ponechajte kurzor vpravo za 'f' a stlačte Ctrl+J. Identifikátor 'classf' bude nahradený týmto:<br />
<pascal> T = class(T)<br />
private<br />
<br />
public<br />
constructor Create;<br />
destructor Destroy; override;<br />
end;</pascal><br />
<br />
a kurzor bude za 'T'.<br />
Zoznam šablón získate tak, že kurzor ponecháte na medzere (nie ne identifikátore) a stlačíte Ctrl+J. Pomocou kurzorových klávesov alebon apísania niekoľkých znakov vyberte jeden. Enter vytvorí zvolenú šablónu a Esc zatvorí zoznam.<br />
<br />
==Pomoc s parametrami==<br />
(''Parameter Hints'')<br />
Pomoc s parametrami ukazuje pomocné okno s deklaráciami parametrov aktuálneho zoznamu parametrov.<br />
<br />
Napríklad<br />
<pascal> Canvas.FillRect(|);</pascal><br />
<br />
Umiestnite kurzor do zátvoriek a stlačte Ctrl+Shift+Space. Objaví sa pomocné okno, ukazujúce parametre FillRect.<br />
<br />
==Dokončovanie kódu==<br />
(''Code Completion'')<br />
<br />
Dokončovanie kódu nájdete v menu IDE Edit -> Complete Code a má štandartnú klávespvú skratku Ctrl+Shift+C.<br />
V Delphi je dokončovaním kódu volaná funkcia zobrazujúca zoznam identifikátorov na aktuálnej pozícii v zdrojovom kóde (Ctrl+Space). V Lazarus je toto nazývané dokončovanie identifikátorov (Identifier completion). Dokončovanie kódu v sebe združuje niekoľko užitočných funkcií:<br />
<br />
* '''Dokončovanie tried''' (Class Completion): dokončuje vlastnosti, pridáva telá metód, pridáva súkromné premenné a súkromné metódy;<br />
* '''Dokončovanie forward procedúr''' (Forward Procedure Completion): pridáva telá forward procedúr;<br />
* '''Dokončovanie priradenia udalostí''' (Event Assignment Completion): * dokončuje pridelenie udalostí a pridávanie tiel a definícií metód;<br />
* '''Dokončovanie lokálnych premenných''' (Local Variable Completion): pridáva definície lokálnych premenných.<br />
Ktorá funkcia je použitá, závisí na pozícii kurzora v editore zdrojového kódu.<br />
<br />
===Dokončovanie tried===<br />
(''Class Completion'')<br />
<br />
Veľmi výkonnou funkciou dokončovania kódu je "Dokončovanie tried". Vy píšete triedu, pridáte metódy a vlastnosti, a dokončovanie kódu pridá telá metód, metódy prístupu k vlastnostiam a súkromným premenným. <br />
<br />
Príklad:<br />
Vytvorte triedu (viz [[Lazarus IDE Tools/sk#Šablóny_kódu | Šablóny kódu]], aby ste ušetrili rovnakú prácu):<br />
<pascal> TExample = class(TObject)<br />
public<br />
constructor Create;<br />
destructor Destroy; override;<br />
end;</pascal><br />
<br />
Umiestnite kurzor niekde v definícii triedy a stlačte '''Ctrl+Shift+C'''. Tým budú vytvorené chýbajúce telá metód a kurzor bude presunutý na prvé vytvorené telo, takže môžete rovno začať písať kód triedy:<br />
<pascal> { TExample }<br />
<br />
constructor TExample.Create;<br />
begin<br />
|<br />
end;<br />
<br />
destructor TExample.Destroy;<br />
begin<br />
inherited Destroy;<br />
end;</pascal><br />
<br />
:'''Poznámka''': Značka '|' nie je pridaná, len ukazuje umiestnenie kurzora.<br />
<br />
Tip: Prepínať medzi telom a definíciou metódy môžete pomocou Ctrl+Shift+Up.<br />
<br />
Všimnite si, že IDE tiež pridáva volanie deštruktora základnej triedy (inherited Destroy). Toto je urobené, ak v definícii treidy použijete kľúčové slovo '''override'''.<br />
<br />
Teraz pridajte metódu '''DoSomething''':<br />
<pascal> TExample = class(TObject)<br />
public<br />
constructor Create;<br />
procedure DoSomething(i: integer);<br />
destructor Destroy; override;<br />
end;</pascal><br />
<br />
Potom stlačte '''Ctrl+Shift+C''' a IDE pridá:<br />
<pascal> procedure TExample.DoSomething(i: integer);<br />
begin<br />
|<br />
end;</pascal><br />
<br />
Ako môžete vidieť, nové telo metódy je vložené medzi Create a Destroy, presne ako je to v definícii. Týmto sú telá metód uchovávané v rovnakom logickom poradí, ako v definícii. Spôsob vkladania môžete definovať pomocou Prostredie > Voľby Codetools -> Tvorenie kódu.<br />
<br />
===Dokončovanie vlastností===<br />
Pridajte vlastnosť '''AnInteger''':<br />
<pascal> TExample = class(TObject)<br />
public<br />
constructor Create;<br />
procedure DoSomething(i: integer);<br />
destructor Destroy; override;<br />
property AnInteger;<br />
end;</pascal><br />
<br />
Stlačte Ctrl+Shift+C a dostanete:<br />
<pascal> procedure TExample.SetAnInteger(const AValue: integer);<br />
begin<br />
|if FAnInteger=AValue then exit;<br />
FAnInteger:=AValue;<br />
end;</pascal><br />
<br />
Dokončovanie kódu pridalo metódu pre prístup k zápisu do vlastnosti a nejaký základný kód.<br />
<br />
Preskočte do triedy pomocou '''Ctrl+Shift+C''' a uvidíte, že v triede pribudlo:<br />
<pascal> TExample = class(TObject)<br />
private<br />
FAnInteger: integer;<br />
procedure SetAnInteger(const AValue: integer);<br />
public<br />
constructor Create;<br />
procedure DoSomething(i: integer);<br />
destructor Destroy; override;<br />
property AnInteger: integer read FAnInteger write SetAnInteger;<br />
end;</pascal><br />
<br />
Vlastnosť bola rozšírená pridaním kľúčových slov '''Read''' a '''Write'''. V triede je nová sekcia '''private''' s premennou '''FAnInteger''' a metódou '''SetAnInteger'''. Pridanie '''F''' na začiatok privátnej premennej je bežnou notáciou Delphi, rovnako ako označenie prístupovej metódy pomocou '''Set'''. Ak to nechcete, môžete to zmeniť ponmocou Prostredie > Voľby Codetools -> Tvorenie kódu.<br />
<br />
Vytvorenie vlastnosti len na čítanie:<br />
<pascal> property PropName: PropType read;</pascal><br />
<br />
Bude rozšírené na:<br />
<pascal> property PropName: PropType read FPropName;</pascal><br />
<br />
Vytvorenie vlastnosti len pre zápis:<br />
<pascal> property PropName: PropType write;</pascal><br />
<br />
Bude rozšírené na:<br />
<pascal> property PropName: PropType write SetPropName;</pascal><br />
<br />
Vytvorenie read only vlastnosti s metódou na čítanie:<br />
<pascal> property PropName: PropType read GetPropName;</pascal><br />
<br />
Deklarácia ostane nezmenená, ale bude pridaná funkcia '''GetPropName''':<br />
<pascal> function GetpropName: PropType;</pascal><br />
<br />
Vytvorenie vlastnosti s direktívou '''stored''':<br />
<pascal> property PropName: PropType stored;</pascal><br />
<br />
Bude rozšírené na:<br />
<pascal> property PropName: PropType read FPropName write SetPropName stored PropNameIsStored;</pascal><br />
<br />
Pretože direktíva '''stored''' je používaná pre streamovanie čítania a zápisu, sú pridané aj kľúčové slová '''read''' a '''write'''.<br />
<br />
Tip:<br />
Dokončovanie identifikátorov tiež rozpoznáva nekompletné vlastnosti a navrhne predvolené mená. Napríklad:<br />
<pascal> property PropName: PropType read |;</pascal><br />
<br />
Umiestnite kurzor za medzeru za kľúčovým slovom '''read''' a stlačte Ctrl+Space pre dokončovanie identifikátorov. To vám ponúkne premennú '''FPropName''' a procedúru '''SetPropName'''.<br />
<br />
===Dokončovanie procedúr===<br />
(''Forward Procedure Completion'')<br />
<br />
Dokončovanie dopredných deklarácií procedúr je časťou dokončovania kódu a pridáva telá chýbajúcich procedúr, ktoré sú definované. Je vyvolané, ak je kurzor na pripravenej definícii procedúry, pomocou klávesovej skratky '''Ctrl+Shift+C'''.<br />
<br />
Napríklad:<br />
Pridajte novú procedúru do časti '''interface''':<br />
<pascal> procedure DoSomething;</pascal><br />
<br />
Umiestnite kurzor na ňu a stlačte '''Ctrl+Shift+C''' pre dokončovanie kódu. V časti '''implementation''' bude doplnené:<br />
<pascal> procedure DoSomething;<br />
begin<br />
|<br />
end;</pascal><br />
<br />
:Tip: Pomocou '''Ctrl+Shift+Up''' môžete prepínať medzi definíciou a telom procedúry.<br />
<br />
Telo novej procedúry bude pridané pred metódy tried. Ak už sú v časti '''interface''' nejaké definície procedúr, IDE sa pokúsi zachovať ich poradie, napríklad:<br />
<pascal> procedure Proc1;<br />
procedure Proc2; // nová procedúra<br />
procedure Proc3;</pascal><br />
<br />
Ak telá '''Proc1''' a '''Proc3''' už existujú, potom bude telo '''Proc2''' vložené medzi telá procedúr '''Proc1''' a '''Proc3'''. Toto správanie môže byť zmené pomocou '''Prostredie > Voľby Codetools -> Tvorenie kódu'''.<br />
<br />
Viacero procedúr:<br />
<pascal> procedure Proc1_Old; // telo existuje<br />
procedure Proc2_New; // telo neexistuje<br />
procedure Proc3_New; // "<br />
procedure Proc4_New; // "<br />
procedure Proc5_Old; // telo existuje</pascal><br />
<br />
Dokončovanie kódu pridá 3 telá procedúr (Proc2_New, Proc3_New, Proc4_New).<br />
<br />
Tento nástroj nepracuje len s procedúrami definovanými v časti '''interface''', ale aj s procedúrami, ktoré sú definované pomocou kľúčového slova '''forward'''.<br />
<br />
===Dokončovanie priradenia udalostí===<br />
(''Event Assignment Completion'')<br />
<br />
Dokončovanie priradenia udalostí je čsťou Dokončovania kódu a dokončuje jeden príkaz Event:=|. Nastáva, keď je kurzor umiestnený za príkazom priradenia udalosti a stlačíte '''Ctrl+Shift+C'''.<br />
<br />
;Napríklad:<br />
V metóde, povedzme udalosti FormCreate, pridajte riadok: 'OnPaint:=':<br />
<pascal> procedure TForm1.Form1Create(Sender: TObject);<br />
begin<br />
OnPaint:=|<br />
end;</pascal><br />
<br />
Značka '|' je umiestnenie kurzora a netreba ju zadávať.<br />
<br />
Potom stlačte '''Ctrl+Shift+C''' pre dokončovanie kódu. Príkaz priradenia udalosti bude doplnený takto:<br />
<pascal> OnPaint:=@Form1Paint;</pascal><br />
<br />
Do triedy '''TForm1''' bude pridaná nová metóda '''Form1Paint'''. Potom je spustené dokončovanie tried a dostanete:<br />
<pascal> procedure TForm1.Form1Paint(Sender: TObject);<br />
begin<br />
|<br />
end;</pascal><br />
<br />
Pracuje presne ako pridávanie metód v '''Inšpektore objektov'''.<br />
<br />
:'''Poznámka''': Kurzor musíte umiestniť za operátor priradenia ':='. Ak ho umiestnite na identifikátor (tj. '''OnPaint'''), dokončovanie kódu spustí Dokončovanie lokálnych premenných, ktoré zlyhá, pretože '''OnPaint''' je už definovaná.<br />
<br />
Tip:<br />
Môžete definovať meno novej metódi aj sami, a to jej zadaním do priradenia, napríklad:<br />
<pascal> OnPaint:=@ThePaintMethod;</pascal><br />
<br />
===Dokončovanie deklarácie premenných===<br />
(''Variable Declaration Completion'')<br />
<br />
Dokončovanie deklarácie premenných je časťou '''Dokončovania kódu''' a pridáva definíciu lokálnej premennej pre príkaz Identifier:=Term;. Dokončovanie deklarácie premenných je vyvolané, keď je kurzor umiestnený na identifikátore v priradení.<br />
<br />
Napríklad:<br />
<pascal> procedure TForm1.Form1Create(Sender: TObject);<br />
begin<br />
i:=3;<br />
end;</pascal><br />
<br />
Umiestnite kurzor na 'i' alebo tesne za neho, potom stlačte Ctrl+Shift+C pre dokončovanie kódu a dostanete:<br />
<pascal> procedure TForm1.Form1Create(Sender: TObject);<br />
var<br />
i: Integer;<br />
begin<br />
i:=3;<br />
end;</pascal><br />
<br />
Nástroj dokončovania kódu najprv skontroluje, či identifikátor 'i' už nie je definovaný a ak nie, pridá deklaráciu 'var i: integer;'. Typ identifikátora je odhadovaný podľa pravej strany príkazu priradenia. Čísla ako 3 sú identifikované ako Integer.<br />
<br />
Iný príklad:<br />
<pascal> type<br />
TWhere = (Behind, Middle, InFront);<br />
<br />
procedure TForm1.Form1Create(Sender: TObject);<br />
var<br />
a: array[TWhere] of char;<br />
begin<br />
for Where:=Low(a) to High(a) do writeln(a[Where]);<br />
end;</pascal><br />
<br />
Umiestnite kurzor na 'Where' a stlačte Ctrl+Shift+C pre dokončenie kódu. Dostanete:<br />
<pascal> procedure TForm1.Form1Create(Sender: TObject);<br />
var<br />
a: array[TWhere] of char;<br />
Where: TWhere;<br />
begin<br />
for Where:=Low(a) to High(a) do writeln(a[Where]);<br />
end;</pascal><br />
<br />
===Spätné dokončovanie triedy===<br />
(''Reversed Class Completion'')<br />
Spätné dokončovanie triedy je časťou '''Dokončovania kódu''' a pridáva deklarácie súkromných metód pre aktuálne telo metódy. Je vyvolané, keď je kurzor v tele metódy, zatiaľ nie je definované pre triedy.<br />
<br />
Táto vlastnosť je dostupná od 0.9.21.<br />
<br />
Napríklad:<br />
<pascal> procedure TForm1.DoSomething(Sender: TObject);<br />
begin<br />
end;</pascal><br />
<br />
Metóda DoSomething zatiaľ nie je v TForm1 deklarovaná. Stlačte Ctrl+Shift+C a IDE pridá "procedure DoSomething(Sender: TObject);" k súkromným metódam triedy TForm1.<br />
<br />
Pre Delphianov:<br />
Dokončovanie tried pracuje pod Lazarus vždy jednym spôsobom:<br />
*Z rozhrania triedy do jej implementácie alebo naopak z implementácie triedy do jej rozhrania. Delphi vždy vyvoláva oba smery. Poszup v Delphi má nevýhodu, že ak dôjde k preklepu, ľahko vytvoríte bez upozornenia zvyšok novej metódy.<br />
<br />
===Komentáre a dokončovanie kódu===<br />
(''Comments and Code Completion'')<br />
<br />
Dokončovanie kódu sa pokúša uchovávať komentáre tam, kde sú. <br />
Príklad:<br />
<pascal> FList: TList; // zoznam prvkov TComponent<br />
FInt: integer;</pascal><br />
<br />
Pri vkladaní novej premennej medzi FList a FInt, je komentár ponechaný na riadku spolu s FList. To platí i pre:<br />
<pascal> FList: TList; { zoznam prvkov TComponent<br />
Toto je komentár na niekoľkých riadkoch, začínajúci<br />
na riadku s FList, tak nástroj dokončenia kódu predpokladá že patrí <br />
k riadku s FList a nepreruší tento vzťah.<br />
Kód bude vložený za komentár. }<br />
FInt: integer;</pascal><br />
<br />
Ak komentár začína na ďalšom riadku:<br />
<pascal> FList: TList; // zoznam prvkov TComponent<br />
{ Tento komentár patrí k nasledujúcemu riadku. <br />
Nový kód je vložený pred tentokomentár a <br />
za komentár na riadku s FList. }<br />
FInt: integer;</pascal><br />
<br />
==Refactoring==<br />
<br />
===Otočenie priradení===<br />
(''Invert Assignments'')<br />
<br />
Otočenie priradení pracuje s vybratými príkazmi Pascalu a obracia všetky priradenia z tohoto výberu. Tento nástroj je užitočný pre transformáciu "save" kódu na "load" a naopak.<br />
<br />
Príklad:<br />
<pascal> procedure DoSomething;<br />
begin<br />
AValueStudio:= BValueStudio;<br />
AValueAppartment :=BValueAppartment;<br />
AValueHouse:=BValueHouse;<br />
end;</pascal><br />
<br />
Vyberte riadky s priradeniami (medzi begin a end) a urobte Otočenie priradenia, všetky priradenia budú otočené a automaticky odsadené. Výsledok:<br />
<pascal> procedure DoSomething;<br />
begin<br />
BValueStudio := AValueStudio;<br />
BValueAppartment := AValueAppartment;<br />
BValueHouse := AValueHouse;<br />
end;</pascal><br />
<br />
=== Uzavrieť výber ===<br />
<br />
Vyberte nejaký text a vyvolajte nástroj. Zobrazí sa dialóg, kde si môžete vybrať či má výber uzatvorený medzi '''try..finally''' ale do mnoho iných blokov.<br />
<br />
=== Premenovať identifikátor ===<br />
<br />
Umiestnite kurzor na identifikátor a vyvolajte tento nástroj, obaví sa dialóg, v ktorom môžete nastaviť rozsah hľadania a nové meno identifikátora. <br />
* premenované budú všetky výskyty a len tie, ktoré momentálne používajú túto deklaráciu, čiže edklarácie s rovnakým menom nebudú premenované. <br />
* najprv bude vykonaná kontrola konfliktov mena. <br />
* Obmedzenia: Pracuje len so zdrojovými kódmi Pascalu, zatiaľ nepremenúva súbory ani neupravuje súbory lfm/lrs, či súbory lazdoc.<br />
<br />
=== Nájdi odkazy na identifikátor ===<br />
<br />
Umiestnite kurzor na identifikátor a vyvolajte nástroj. Objaví sa dialóg, v ktorom môžete nastaviť rozsah hľadania. IDE bude hľadať všetky výskyty a len tie, ktoré používajú aktuálnu deklaráciu. Čiže iné deklarácia s rovnakým menom, nebudú zobrazené.<br />
<br />
=== Zobraziť abstraktné metódy ===<br />
<br />
Táto funkcia vypisuje a automaticky kompletuje virtuálne, abstraktné metódy, ktoré je majú byť implementované.<br />
<br />
Umiestnite kurzor na deklaráciu triedu a vyvolajte nástroj. Ak existujú nejaké chýbajúce abstraktné metódy, nude zobrazený dialóg s ich zoznamom. Zvoľte metódy pre implementovanie a IDE vytvorí základy metód.<br />
<br />
=== Vytiahnuť procedúru ===<br />
Viz [[IDE_Window:_Extract_Procedure/sk|Extract Procedure]]<br />
<br />
==Hľadanie deklarácie==<br />
(''Find Declaration'')<br />
<br />
Umiestnite kurzor na identifikátor a urobte Hľadanie deklarácie, tým bude nájdená deklarácia tohoto identifikátora, prípadne otvorený príslušný súbor a kurzor bude premiestnený na miesto deklarácie.<br />
<br />
Každé hľadanie deklarácie nastavuje bod skoku. Tzn. po skoku na nájdenú deklaráciu môžete jednoduchos skočiť naspäť pomocou Search -> Jump back.<br />
<br />
Oproti Delphi má nástroj isté rozdiely:<br />
Nástroj pracuje so zdrojovým kódom na základe pravidiel Pascalu, a nie s výsledkom prekladača. The compiler returns the final type. Nástroj prezerá zdrojové kódy a všetky kroky medzi. Napríklad:<br />
<br />
: Vlastnosť 'Visible' je najprv definovaná v TControl (controls.pp), potom je predefinovaná v TCustomForm a nakoniec predefinovaná aj v TForm. Spustenie hľadania deklarácie vlastnosti Visible vás najprv presunie na Visible v TForm. Potom môžete spustiť hľadanie deklarácie znova a skočíte na Visible v TCustomForm a znova pre skočenie na Visible v TControl.<br />
<br />
Obdobne je to s TColor.<br />
Pre prekladač je to jednoducho 'longint', ale v zdrojovom kóde je to definované ako:<br />
<pascal> TGraphicsColor = -$7FFFFFFF-1..$7FFFFFFF;<br />
TColor = TGraphicsColor;</pascal><br />
<br />
Obdobné je to aj s forward definovanými triedami:<br />
Napríklad v TControl je priávtna premenná<br />
<pascal> FHostDockSite: TWinControl;</pascal><br />
<br />
Hľadanie deklarácie pre TWinControl skočí na forward definíciu:<br />
<pascal> TWinControl = class;</pascal><br />
<br />
A opätovné spustenie hľadania deklarácie skočí na skutočnú implementáciu:<br />
<pascal> TWinControl = class(TControl)</pascal><br />
<br />
Týmto spôsobom môžete stopovať každý identifikátor a nájsť každé predefinovanie, či preťaženie.<br />
<br />
==Dokončovanie identifikátorov==<br />
(''Identifier Completion'')<br />
<br />
Dokončovanie identifikátorov je vyvolané pomocou Ctrl+Space a zobrazuje všetky vyhovujúce identifikátory. <br />
<br />
Napríklad:<br />
<pascal> procedure TForm1.FormCreate(Sender: TObject);<br />
begin<br />
|<br />
end;</pascal><br />
<br />
Umiestnite kurzor medzi ''begin'' a ''end'' a stlačte Ctrl+Space. Nástroj IDE spracuje celý dosiahnuteľný kód a zobrazí zoznam všetkých nájdených identifikátorov. CodeTools kešuje výsledok, takže druhý krát bude oveľa rýchlejší.<br />
<br />
'''Poznámka pre Delphianov:''' Delphi to volá ''Dokončovanie kódu''.<br />
<br />
Niektoré identifikátory, ako 'Write', 'ReadLn', 'Low', 'SetLength', 'Self', 'Result', 'Copy' sú zabudované v prekladači a teda nie sú definované nikde v zdrojovom kóde, al Dokončovanie identifikátorov má veľa z nich tež zabudovaných. Ak nájdete nejaký chýbajúci, jednoducho vytvorte požiadadvku na vlastnosť v sledovači chýb (''bug tracker'').<br />
<br />
Dokončovanie identifikátorov nedokončuje kľúčové slová, takže ho nemožno použiť na dokončenie proc' na 'procedure'. Na toto je určené Ctrl+W [[#Dokončovanie_slov|Dokončovanie slov]] alebo Ctrl+J [[#Šablóny_kódu|Šablóny kódu]].<br />
<br />
Dokončovanie identifikátorov nezobrazuje len tie identifikátory, ktoré nie sú kompatibilné.<br />
<br />
===Predpona===<br />
Môžete začať dokončovanie identifikátorov v existujúcom slove. Potom budú písmená vľavo od kurzora brané ako predpona. <br />
<br />
Napríklad:<br />
<pascal> procedure TForm1.FormCreate(Sender: TObject);<br />
begin<br />
Ca|ption<br />
end;</pascal><br />
<br />
Okno bude zobrazovať len identifikátory začínajúce sa na 'Ca'.<br />
<br />
===Klávesy===<br />
<br />
* Písmená/čísla: pridávajú znak do editora zdrojového kódu a aktuálnej predpony, čo zároveň aktualizuje zoznam.<br />
* Backspace: odstraňuje posledný znak z editora zdrojového kódu a aktuálnej predpony, čo zároveň aktualizuje zoznam.<br />
* Return: nahradzuje celé slovo na kurzore zvoleným identifikátorom a zatvára vyskakovacie okno.<br />
* Shift+Return: as ''Return'', but replaces only the prefix (left part) of the word at the cursor.<br />
* Hore/Dole: presúva výber.<br />
* Esc: zatvára vyskakovacie okno bez zmeny.<br />
* Tab: dokončuje predponu na ďalšiu voľbu. Napríklad: aktuálna predpona je 'But' a dokončovanie identifikátora zobrazuje len 'Button1' a 'Button1Click', potom stlačenie ''Tab'' dokončí predponu na 'Button1'.<br />
* Else: ako ''Return'' a pridá znak do editora zdrojového kódu.<br />
<br />
==Dokončovanie slov==<br />
(''Word Completion'')<br />
<br />
Dokončovanie slov je vyvolané stlačením Ctrl+W a zobrazuje všetky slová všetkých aktuálne otvorených editorov. Inak pracuje presne ako Dokončovanie identifikátorov.<br />
<br />
==Prejdi do direktívy include==<br />
(''Goto Include Directive'')<br />
<br />
Tento príkaz v menu Searchskočí do príkazu (direktívy) {$I filename}, v ktorej je použitý aktuálny súbor.<br />
<br />
==Publikuj Projekt==<br />
Vytvára kópiu celého projektu. Ak chcete niekomu poslať len zdrojové kódy a nastavenia prekladača pre svoj kód, budete kamarátis touto funkciou.<br />
<br />
Bežný adresár projektu obsahuje množstvo informácií. Väčšinu z nich publikovať netreba. Súbor '''.lpi''' obsahuje informácie o relácii (ako pozíciu caret a záložiek zatvorených jednotiek) a adresár projektu obsahuje mnoho súborov '''.ppu''' a '''.o''', a tiež .exe. A práve príkaz Publikuj projekt vytvorí súbor '''.lpi''' len so základnými informáciami a všetky zdrojové kódy, so všetkých podadresárov.<br />
<br />
V ponúknutom dialógu môžete nastaviť filter pre zahrnutie/vynechanie, či pre kompresiu výstupu do jediného archívu.<br />
<br />
==Spolupracovníci==<br />
This page has been converted from the epikwiki [http://lazarus-ccr.sourceforge.net/index.php?wiki=LazarusIdeTools version].<br />
* Created page and initial template - 4/6/2004 [[User:Tom Lisjac| VlxAdmin]]<br />
* Initial content posted - 4/10/2004 MattiasG<br />
* Small wiki and formatting fixes - 4/11/2004 [[User:Tom Lisjac| VlxAdmin]]<br />
* Added a summary table for IdeTools shortcuts - 12 July 2004 [[User:Kirkpatc]]<br />
* Preložené z originálu [[Lazarus IDE Tools]] - [[User:Slavko|Slavko]] 13:51, 25 Mar 2005 (PST)</div>Slavkohttps://wiki.freepascal.org/index.php?title=Lazarus_IDE_Tools/sk&diff=26874Lazarus IDE Tools/sk2008-02-17T20:20:07Z<p>Slavko: Oprava prekladu a formátu</p>
<hr />
<div>{{Lazarus IDE Tools}}<br />
<br />
==Úvod==<br />
IDE používa knižnicu analýzy zdrojového kódu Pascal a editačných nástrojov, zvanú "codetools". Tieto nástroje poskytujú funkcie ako hľadanie deklarácie (find declaration), dokončovanie kódu (code completion), odstraňovanie, presúvanie, vkladanie a formátovanie zdrojového kódu Pascal. Tieto funkcie šetria množstvo času a duplicitných úloh. Sú nastaviteľné a každá funkcia je dostupná pomocou klávesovej skratky (viď Editor Options).<br />
<br />
Pretože ich práca záleží na zdrojovom kóde a pochopení FreePascal, Delphi a Kylix kódu, nevyžadujú preložené jednotky ani nainštalovaný prekladač Borland. Môžete naraz upravovať kód Delphi aj FreePascal. Môžete dokonca pracovať s rôznymi verziami Delphi a FreePascal súčasne. Tým sa stáva prenos Delphi kódu ešte jednoduchší.<br />
<br />
==Zhrnutie klávesových skratiek IDE==<br />
{|<br />
|-<br />
| [[Lazarus IDE Tools/sk#Hľadanie_deklarácie | Hľadanie deklarácie]] (Declaration Jumping) || '''Ctrl+Click''' alebo '''Alt+Up'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Prepínanie_metód | Prepínanie metód]] (Method Jumping) || '''Ctrl+Shift+Up''' a '''Ctrl+Shift+Down'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Šablóny_kódu | Šablóny kódu]] (Code Templates) || '''Ctrl+J'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Dokončovanie_kódu | Dokončovanie kódu]] (Code/Class Completion) || '''Ctrl+Shift+C'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Dokončovanie_identifikátorov | Dokončovanie identifikátorov]] (Identifier Completion) || '''Ctrl+Medzerník'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Dokončovanie_slov | Dokončovanie slov]] (Word Completion) || '''Ctrl+W'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Pomoc_s_parametrami |Pomoc s parametrami]] (Parameter Hints) || '''Ctrl+Shift+Space'''<br />
|}<br />
<br />
==Prepínanie metód==<br />
(''Method Jumping'')<br />
<br />
Na prepínanie medzi telom procedúry (begin..end) a jej definíciou (procedure Name;) použite Ctrl+Shift+Up.<br />
<br />
Príklad:<br />
<pascal><br />
interface<br />
<br />
procedure DoSomething; // procedure definition<br />
<br />
implementation<br />
<br />
procedure DoSomething; // procedure body <br />
begin<br />
end;<br />
</pascal><br />
<br />
Ak je kurzor v tele provedúry a stlačíte Ctrl+Shift+Up, kurzor skočí na definíciu. Ak znova stlačíte Ctrl+Shift+Up preskočí do tela procedúry, za 'begin'. Funkcia pracuje aj s metódami (procedúrami v triedach).<br />
<br />
Tipy:<br />
'Method Jumping' presúva kurzor na rovnakú procedúru s rovnakým menom i zoznamom parametrov. Ak presná procedúra neexistuje, skočí na najpodobnejšiu a umiestni kurzor na prvý rozdiel. V Delphi táto funkcia neexistuje.<br />
<br />
Príklad procedúry s rôznymi typmi parametrov:<br />
<pascal><br />
interface<br />
<br />
procedure DoSomething(p: char); // procedure definition<br />
<br />
implementation<br />
<br />
procedure DoSomething(p: string); // procedure body<br />
begin<br />
end;<br />
</pascal><br />
<br />
Preskočenie z definície do tela umiestni kurzor na kľúčové slovo 'string'. Túto vlastnosť môžete využiť na premenovanie metódy a/alebo zmenu jej parametrov.<br />
<br />
Príklad:<br />
Premenovali sme 'DoSomething' na 'MakeIt':<br />
<pascal> interface<br />
<br />
procedure MakeIt; // procedure definition<br />
<br />
implementation<br />
<br />
procedure DoSomething; // procedure body<br />
begin<br />
end;<br />
</pascal><br />
<br />
Potom urobte skok z definície MakeIt do tela. IDE hľadá vhodné telo, nenájde žiadne, preto začne hľadať kandidátov. Keďže stepremenovali len jednu procedúru, tak je len jedno telo bez definície (DoSomething) a tak skočí do DoSomething a umiestni kurzor vpravo od 'DoSomething'. Potomm ju môžete jednoducho premenovať tiež. Toto rovnako pracuje s parametrami.<br />
<br />
==Include súbory==<br />
(''Include Files'')<br />
<br />
Include súbory sú súbory vložené do zdrojového kódu pomocou direktív prekladača {$I filename} alebo {$INCLUDE filename}. Lazarus a FreePascal používajú veľa takýchto vecí na redukciu nadbytočnosti a vyhnutie sa nečitateľnosti konštrukcií {$IFDEF} pri podpore rôznych platforiem.<br />
<br />
Narozdiel od Delphi, IDE Lazarus plne podporuje include súbory. Napríklad môžete skočiť z metódy v súbore .pas do tela metódy v include súbore. Všetky nástroje kódu, ako dokončovanie kódu, považuje include súbory za špeciálne hranice.<br />
<br />
Napríklad: keď dokončovanie kódu pridáva telo novej metódy za telom inej metódy, ponechá ich obe v rovnakom súbore. Týmto spôsobom môžete vložiť celú implementáciu triedy do include súborov, ako to robí LCL pre skoro všetky prvky.<br />
<br />
Ale je tu začiatočnícka chyba: Ak najprv otvoríte include súbor a skúsite prepínanie metód alebo hľadanie deklarácie, dostanete chybu. IDE nevie do ktorej jednotky include súbor patrí. Najprv musíte otvoriť jednotku.<br />
<br />
Hneď ako IDE zanalyzuje jednotku, zachytí v nej include direktívy a IDE si bude pamätať tento vzťah. Tieto informácie IDE ukladá pri skončení a pri uložení projektu do ~/.lazarus/includelinks.xml. Keď nabudúce otvoríte súbor include a urobíte skok do neho alebo hľadanie deklarácie, IDE interne otvorí jednotku a skoky budú fungovať.<br />
<br />
Tento mechanizmus má samozrejme obmedzenia, niektoré include súbory sú zahrnuté dva i viackrát. Napríklad: lcl/include/winapih.inc.<br />
Skákanie z definície procedúry/metódy v tomto include súbore do tela závisí na poslednej akcii. Ak ste pracovali v lcl/lclintf.pp, IDE skočí do winapi.inc. Ak ste pracovali v lcl/interfacebase.pp, potom skočíte do lcl/include/interfacebase.inc (alebo do jedného z ďalších include súborov). Ak pracujete s obomi, potom môže nastať zmätok. ;)<br />
<br />
==Šablóny kódu==<br />
(''Code Templates'')<br />
<br />
Šablóny kódu konvertujú identifikátor v texte alebo fragmente kódu. Šablóny kódu majú prednastavenú klávesovú skratku Ctrl+J. Môžete napísať identifikátor, stlačiť Ctrl+J a identifikátor je nahradený textom definovaným pre identifikátor. Šablóny kódu môžete definovať v Environment -> Editor Options -> CodeTools.<br />
<br />
Príklad:<br />
Napíšte identifikátor 'classf', ponechajte kurzor vpravo za 'f' a stlačte Ctrl+J. Identifikátor 'classf' bude nahradený týmto:<br />
<pascal><br />
T = class(T)<br />
private<br />
<br />
public<br />
constructor Create;<br />
destructor Destroy; override;<br />
end;<br />
</pascal><br />
<br />
a kurzor bude za 'T'.<br />
Zoznam šablón získate tak, že kurzor ponecháte na medzere (nie ne identifikátore) a stlačíte Ctrl+J. Pomocou kurzorových klávesov alebon apísania niekoľkých znakov vyberte jeden. Enter vytvorí zvolenú šablónu a Esc zatvorí zoznam.<br />
<br />
==Pomoc s parametrami==<br />
(''Parameter Hints'')<br />
Pomoc s parametrami ukazuje pomocné okno s deklaráciami parametrov aktuálneho zoznamu parametrov.<br />
<br />
Napríklad<br />
<pascal><br />
Canvas.FillRect(|);<br />
</pascal><br />
<br />
Umiestnite kurzor do zátvoriek a stlačte Ctrl+Shift+Space. Objaví sa pomocné okno, ukazujúce parametre FillRect.<br />
<br />
==Dokončovanie kódu==<br />
(''Code Completion'')<br />
<br />
Dokončovanie kódu nájdete v menu IDE Edit -> Complete Code a má štandartnú klávespvú skratku Ctrl+Shift+C.<br />
V Delphi je dokončovaním kódu volaná funkcia zobrazujúca zoznam identifikátorov na aktuálnej pozícii v zdrojovom kóde (Ctrl+Space). V Lazarus je toto nazývané dokončovanie identifikátorov (Identifier completion). Dokončovanie kódu v sebe združuje niekoľko užitočných funkcií:<br />
<br />
* '''Dokončovanie tried''' (Class Completion): dokončuje vlastnosti, pridáva telá metód, pridáva súkromné premenné a súkromné metódy;<br />
* '''Dokončovanie forward procedúr''' (Forward Procedure Completion): pridáva telá forward procedúr;<br />
* '''Dokončovanie priradenia udalostí''' (Event Assignment Completion): * dokončuje pridelenie udalostí a pridávanie tiel a definícií metód;<br />
* '''Dokončovanie lokálnych premenných''' (Local Variable Completion): pridáva definície lokálnych premenných.<br />
Ktorá funkcia je použitá, závisí na pozícii kurzora v editore zdrojového kódu.<br />
<br />
===Dokončovanie tried===<br />
(''Class Completion'')<br />
<br />
Veľmi výkonnou funkciou dokončovania kódu je "Dokončovanie tried". Vy píšete triedu, pridáte metódy a vlastnosti, a dokončovanie kódu pridá telá metód, metódy prístupu k vlastnostiam a súkromným premenným. <br />
<br />
Príklad:<br />
Vytvorte triedu (viz [[Lazarus IDE Tools/sk#Šablóny_kódu | Šablóny kódu]], aby ste ušetrili rovnakú prácu):<br />
<pascal> TExample = class(TObject)<br />
public<br />
constructor Create;<br />
destructor Destroy; override;<br />
end;</pascal><br />
<br />
Umiestnite kurzor niekde v definícii triedy a stlačte '''Ctrl+Shift+C'''. Tým budú vytvorené chýbajúce telá metód a kurzor bude presunutý na prvé vytvorené telo, takže môžete rovno začať písať kód triedy:<br />
<pascal> { TExample }<br />
<br />
constructor TExample.Create;<br />
begin<br />
|<br />
end;<br />
<br />
destructor TExample.Destroy;<br />
begin<br />
inherited Destroy;<br />
end;</pascal><br />
<br />
:'''Poznámka''': Značka '|' nie je pridaná, len ukazuje umiestnenie kurzora.<br />
<br />
Tip: Prepínať medzi telom a definíciou metódy môžete pomocou Ctrl+Shift+Up.<br />
<br />
Všimnite si, že IDE tiež pridáva volanie deštruktora základnej triedy (inherited Destroy). Toto je urobené, ak v definícii treidy použijete kľúčové slovo '''override'''.<br />
<br />
Teraz pridajte metódu '''DoSomething''':<br />
<pascal> TExample = class(TObject)<br />
public<br />
constructor Create;<br />
procedure DoSomething(i: integer);<br />
destructor Destroy; override;<br />
end;</pascal><br />
<br />
Potom stlačte '''Ctrl+Shift+C''' a IDE pridá:<br />
<pascal> procedure TExample.DoSomething(i: integer);<br />
begin<br />
|<br />
end;</pascal><br />
<br />
Ako môžete vidieť, nové telo metódy je vložené medzi Create a Destroy, presne ako je to v definícii. Týmto sú telá metód uchovávané v rovnakom logickom poradí, ako v definícii. Spôsob vkladania môžete definovať pomocou Prostredie > Voľby Codetools -> Tvorenie kódu.<br />
<br />
===Dokončovanie vlastností===<br />
Pridajte vlastnosť '''AnInteger''':<br />
<pascal> TExample = class(TObject)<br />
public<br />
constructor Create;<br />
procedure DoSomething(i: integer);<br />
destructor Destroy; override;<br />
property AnInteger;<br />
end;</pascal><br />
<br />
Stlačte Ctrl+Shift+C a dostanete:<br />
<pascal> procedure TExample.SetAnInteger(const AValue: integer);<br />
begin<br />
|if FAnInteger=AValue then exit;<br />
FAnInteger:=AValue;<br />
end;</pascal><br />
<br />
Dokončovanie kódu pridalo metódu pre prístup k zápisu do vlastnosti a nejaký základný kód.<br />
<br />
Preskočte do triedy pomocou '''Ctrl+Shift+C''' a uvidíte, že v triede pribudlo:<br />
<pascal> TExample = class(TObject)<br />
private<br />
FAnInteger: integer;<br />
procedure SetAnInteger(const AValue: integer);<br />
public<br />
constructor Create;<br />
procedure DoSomething(i: integer);<br />
destructor Destroy; override;<br />
property AnInteger: integer read FAnInteger write SetAnInteger;<br />
end;</pascal><br />
<br />
Vlastnosť bola rozšírená pridaním kľúčových slov '''Read''' a '''Write'''. V triede je nová sekcia '''private''' s premennou '''FAnInteger''' a metódou '''SetAnInteger'''. Pridanie '''F''' na začiatok privátnej premennej je bežnou notáciou Delphi, rovnako ako označenie prístupovej metódy pomocou '''Set'''. Ak to nechcete, môžete to zmeniť ponmocou Prostredie > Voľby Codetools -> Tvorenie kódu.<br />
<br />
Vytvorenie vlastnosti len na čítanie:<br />
<pascal> property PropName: PropType read;</pascal><br />
<br />
Bude rozšírené na:<br />
<pascal> property PropName: PropType read FPropName;</pascal><br />
<br />
Vytvorenie vlastnosti len pre zápis:<br />
<pascal> property PropName: PropType write;</pascal><br />
<br />
Bude rozšírené na:<br />
<pascal> property PropName: PropType write SetPropName;</pascal><br />
<br />
Vytvorenie read only vlastnosti s metódou na čítanie:<br />
<pascal> property PropName: PropType read GetPropName;</pascal><br />
<br />
Deklarácia ostane nezmenená, ale bude pridaná funkcia '''GetPropName''':<br />
<pascal> function GetpropName: PropType;</pascal><br />
<br />
Vytvorenie vlastnosti s direktívou '''stored''':<br />
<pascal> property PropName: PropType stored;</pascal><br />
<br />
Bude rozšírené na:<br />
<pascal> property PropName: PropType read FPropName write SetPropName stored PropNameIsStored;</pascal><br />
<br />
Pretože direktíva '''stored''' je používaná pre streamovanie čítania a zápisu, sú pridané aj kľúčové slová '''read''' a '''write'''.<br />
<br />
Tip:<br />
Dokončovanie identifikátorov tiež rozpoznáva nekompletné vlastnosti a navrhne predvolené mená. Napríklad:<br />
<pascal> property PropName: PropType read |;</pascal><br />
<br />
Umiestnite kurzor za medzeru za kľúčovým slovom '''read''' a stlačte Ctrl+Space pre dokončovanie identifikátorov. To vám ponúkne premennú '''FPropName''' a procedúru '''SetPropName'''.<br />
<br />
===Dokončovanie procedúr===<br />
(''Forward Procedure Completion'')<br />
<br />
Dokončovanie dopredných deklarácií procedúr je časťou dokončovania kódu a pridáva telá chýbajúcich procedúr, ktoré sú definované. Je vyvolané, ak je kurzor na pripravenej definícii procedúry, pomocou klávesovej skratky '''Ctrl+Shift+C'''.<br />
<br />
Napríklad:<br />
Pridajte novú procedúru do časti '''interface''':<br />
<pascal> procedure DoSomething;</pascal><br />
<br />
Umiestnite kurzor na ňu a stlačte '''Ctrl+Shift+C''' pre dokončovanie kódu. V časti '''implementation''' bude doplnené:<br />
<pascal> procedure DoSomething;<br />
begin<br />
|<br />
end;</pascal><br />
<br />
:Tip: Pomocou '''Ctrl+Shift+Up''' môžete prepínať medzi definíciou a telom procedúry.<br />
<br />
Telo novej procedúry bude pridané pred metódy tried. Ak už sú v časti '''interface''' nejaké definície procedúr, IDE sa pokúsi zachovať ich poradie, napríklad:<br />
<pascal> procedure Proc1;<br />
procedure Proc2; // nová procedúra<br />
procedure Proc3;</pascal><br />
<br />
Ak telá '''Proc1''' a '''Proc3''' už existujú, potom bude telo '''Proc2''' vložené medzi telá procedúr '''Proc1''' a '''Proc3'''. Toto správanie môže byť zmené pomocou '''Prostredie > Voľby Codetools -> Tvorenie kódu'''.<br />
<br />
Viacero procedúr:<br />
<pascal> procedure Proc1_Old; // telo existuje<br />
procedure Proc2_New; // telo neexistuje<br />
procedure Proc3_New; // "<br />
procedure Proc4_New; // "<br />
procedure Proc5_Old; // telo existuje</pascal><br />
<br />
Dokončovanie kódu pridá 3 telá procedúr (Proc2_New, Proc3_New, Proc4_New).<br />
<br />
Tento nástroj nepracuje len s procedúrami definovanými v časti '''interface''', ale aj s procedúrami, ktoré sú definované pomocou kľúčového slova '''forward'''.<br />
<br />
===Dokončovanie priradenia udalostí===<br />
(''Event Assignment Completion'')<br />
<br />
Dokončovanie priradenia udalostí je čsťou Dokončovania kódu a dokončuje jeden príkaz Event:=|. Nastáva, keď je kurzor umiestnený za príkazom priradenia udalosti a stlačíte '''Ctrl+Shift+C'''.<br />
<br />
;Napríklad:<br />
V metóde, povedzme udalosti FormCreate, pridajte riadok: 'OnPaint:=':<br />
<pascal> procedure TForm1.Form1Create(Sender: TObject);<br />
begin<br />
OnPaint:=|<br />
end;</pascal><br />
<br />
Značka '|' je umiestnenie kurzora a netreba ju zadávať.<br />
<br />
Potom stlačte '''Ctrl+Shift+C''' pre dokončovanie kódu. Príkaz priradenia udalosti bude doplnený takto:<br />
<pascal> OnPaint:=@Form1Paint;</pascal><br />
<br />
Do triedy '''TForm1''' bude pridaná nová metóda '''Form1Paint'''. Potom je spustené dokončovanie tried a dostanete:<br />
<pascal> procedure TForm1.Form1Paint(Sender: TObject);<br />
begin<br />
|<br />
end;</pascal><br />
<br />
Pracuje presne ako pridávanie metód v '''Inšpektore objektov'''.<br />
<br />
:'''Poznámka''': Kurzor musíte umiestniť za operátor priradenia ':='. Ak ho umiestnite na identifikátor (tj. '''OnPaint'''), dokončovanie kódu spustí Dokončovanie lokálnych premenných, ktoré zlyhá, pretože '''OnPaint''' je už definovaná.<br />
<br />
Tip:<br />
Môžete definovať meno novej metódi aj sami, a to jej zadaním do priradenia, napríklad:<br />
<pascal> OnPaint:=@ThePaintMethod;</pascal><br />
<br />
===Dokončovanie deklarácie premenných===<br />
(''Variable Declaration Completion'')<br />
<br />
Dokončovanie deklarácie premenných je časťou '''Dokončovania kódu''' a pridáva definíciu lokálnej premennej pre príkaz Identifier:=Term;. Dokončovanie deklarácie premenných je vyvolané, keď je kurzor umiestnený na identifikátore v priradení.<br />
<br />
Napríklad:<br />
<pascal><br />
procedure TForm1.Form1Create(Sender: TObject);<br />
begin<br />
i:=3;<br />
end;<br />
</pascal><br />
<br />
Umiestnite kurzor na 'i' alebo tesne za neho, potom stlačte Ctrl+Shift+C pre dokončovanie kódu a dostanete:<br />
<pascal><br />
procedure TForm1.Form1Create(Sender: TObject);<br />
var<br />
i: Integer;<br />
begin<br />
i:=3;<br />
end;<br />
</pascal><br />
<br />
Nástroj dokončovania kódu najprv skontroluje, či identifikátor 'i' už nie je definovaný a ak nie, pridá deklaráciu 'var i: integer;'. Typ identifikátora je odhadovaný podľa pravej strany príkazu priradenia. Čísla ako 3 sú identifikované ako Integer.<br />
<br />
Iný príklad:<br />
<pascal><br />
type<br />
TWhere = (Behind, Middle, InFront);<br />
<br />
procedure TForm1.Form1Create(Sender: TObject);<br />
var<br />
a: array[TWhere] of char;<br />
begin<br />
for Where:=Low(a) to High(a) do writeln(a[Where]);<br />
end;<br />
</pascal><br />
<br />
Umiestnite kurzor na 'Where' a stlačte Ctrl+Shift+C pre dokončenie kódu. Dostanete:<br />
<pascal><br />
procedure TForm1.Form1Create(Sender: TObject);<br />
var<br />
a: array[TWhere] of char;<br />
Where: TWhere;<br />
begin<br />
for Where:=Low(a) to High(a) do writeln(a[Where]);<br />
end;<br />
</pascal><br />
<br />
===Spätné dokončovanie triedy===<br />
(''Reversed Class Completion'')<br />
Spätné dokončovanie triedy je časťou '''Dokončovania kódu''' a pridáva deklarácie súkromných metód pre aktuálne telo metódy. Je vyvolané, keď je kurzor v tele metódy, zatiaľ nie je definované pre triedy.<br />
<br />
Táto vlastnosť je dostupná od 0.9.21.<br />
<br />
Napríklad:<br />
<pascal><br />
procedure TForm1.DoSomething(Sender: TObject);<br />
begin<br />
end;<br />
</pascal><br />
<br />
Metóda DoSomething zatiaľ nie je v TForm1 deklarovaná. Stlačte Ctrl+Shift+C a IDE pridá "procedure DoSomething(Sender: TObject);" k súkromným metódam triedy TForm1.<br />
<br />
Pre Delphianov:<br />
Dokončovanie tried pracuje pod Lazarus vždy jednym spôsobom:<br />
*Z rozhrania triedy do jej implementácie alebo naopak z implementácie triedy do jej rozhrania. Delphi vždy vyvoláva oba smery. Poszup v Delphi má nevýhodu, že ak dôjde k preklepu, ľahko vytvoríte bez upozornenia zvyšok novej metódy.<br />
<br />
===Komentáre a dokončovanie kódu===<br />
(''Comments and Code Completion'')<br />
<br />
Dokončovanie kódu sa pokúša uchovávať komentáre tam, kde sú. <br />
Príklad:<br />
<pascal><br />
FList: TList; // zoznam prvkov TComponent<br />
FInt: integer;<br />
</pascal><br />
<br />
Pri vkladaní novej premennej medzi FList a FInt, je komentár ponechaný na riadku spolu s FList. To platí i pre:<br />
<pascal><br />
FList: TList; { zoznam prvkov TComponent<br />
Toto je komentár na niekoľkých riadkoch, začínajúci<br />
na riadku s FList, tak nástroj dokončenia kódu predpokladá že patrí <br />
k riadku s FList a nepreruší tento vzťah.<br />
Kód bude vložený za komentár. }<br />
FInt: integer;<br />
</pascal><br />
<br />
Ak komentár začína na ďalšom riadku:<br />
<pascal><br />
FList: TList; // zoznam prvkov TComponent<br />
{ Tento komentár patrí k nasledujúcemu riadku. <br />
Nový kód je vložený pred tentokomentár a <br />
za komentár na riadku s FList. }<br />
FInt: integer;<br />
</pascal><br />
<br />
==Refactoring==<br />
<br />
===Otočenie priradení===<br />
(''Invert Assignments'')<br />
<br />
Otočenie priradení pracuje s vybratými príkazmi Pascalu a obracia všetky priradenia z tohoto výberu. Tento nástroj je užitočný pre transformáciu "save" kódu na "load" a naopak.<br />
<br />
Príklad:<br />
<pascal> procedure DoSomething;<br />
begin<br />
AValueStudio:= BValueStudio;<br />
AValueAppartment :=BValueAppartment;<br />
AValueHouse:=BValueHouse;<br />
end;</pascal><br />
<br />
Vyberte riadky s priradeniami (medzi begin a end) a urobte Otočenie priradenia, všetky priradenia budú otočené a automaticky odsadené. Výsledok:<br />
<pascal> procedure DoSomething;<br />
begin<br />
BValueStudio := AValueStudio;<br />
BValueAppartment := AValueAppartment;<br />
BValueHouse := AValueHouse;<br />
end;</pascal><br />
<br />
=== Uzavrieť výber ===<br />
<br />
Vyberte nejaký text a vyvolajte nástroj. Zobrazí sa dialóg, kde si môžete vybrať či má výber uzatvorený medzi '''try..finally''' ale do mnoho iných blokov.<br />
<br />
=== Premenovať identifikátor ===<br />
<br />
Umiestnite kurzor na identifikátor a vyvolajte tento nástroj, obaví sa dialóg, v ktorom môžete nastaviť rozsah hľadania a nové meno identifikátora. <br />
* premenované budú všetky výskyty a len tie, ktoré momentálne používajú túto deklaráciu, čiže edklarácie s rovnakým menom nebudú premenované. <br />
* najprv bude vykonaná kontrola konfliktov mena. <br />
* Obmedzenia: Pracuje len so zdrojovými kódmi Pascalu, zatiaľ nepremenúva súbory ani neupravuje súbory lfm/lrs, či súbory lazdoc.<br />
<br />
=== Nájdi odkazy na identifikátor ===<br />
<br />
Umiestnite kurzor na identifikátor a vyvolajte nástroj. Objaví sa dialóg, v ktorom môžete nastaviť rozsah hľadania. IDE bude hľadať všetky výskyty a len tie, ktoré používajú aktuálnu deklaráciu. Čiže iné deklarácia s rovnakým menom, nebudú zobrazené.<br />
<br />
=== Zobraziť abstraktné metódy ===<br />
<br />
Táto funkcia vypisuje a automaticky kompletuje virtuálne, abstraktné metódy, ktoré je majú byť implementované.<br />
<br />
Umiestnite kurzor na deklaráciu triedu a vyvolajte nástroj. Ak existujú nejaké chýbajúce abstraktné metódy, nude zobrazený dialóg s ich zoznamom. Zvoľte metódy pre implementovanie a IDE vytvorí základy metód.<br />
<br />
=== Vytiahnuť procedúru ===<br />
Viz [[IDE_Window:_Extract_Procedure/sk|Extract Procedure]]<br />
<br />
==Hľadanie deklarácie==<br />
(''Find Declaration'')<br />
<br />
Umiestnite kurzor na identifikátor a urobte Hľadanie deklarácie, tým bude nájdená deklarácia tohoto identifikátora, prípadne otvorený príslušný súbor a kurzor bude premiestnený na miesto deklarácie.<br />
<br />
Každé hľadanie deklarácie nastavuje bod skoku. Tzn. po skoku na nájdenú deklaráciu môžete jednoduchos skočiť naspäť pomocou Search -> Jump back.<br />
<br />
Oproti Delphi má nástroj isté rozdiely:<br />
Nástroj pracuje so zdrojovým kódom na základe pravidiel Pascalu, a nie s výsledkom prekladača. The compiler returns the final type. Nástroj prezerá zdrojové kódy a všetky kroky medzi. Napríklad:<br />
<br />
: Vlastnosť 'Visible' je najprv definovaná v TControl (controls.pp), potom je predefinovaná v TCustomForm a nakoniec predefinovaná aj v TForm. Spustenie hľadania deklarácie vlastnosti Visible vás najprv presunie na Visible v TForm. Potom môžete spustiť hľadanie deklarácie znova a skočíte na Visible v TCustomForm a znova pre skočenie na Visible v TControl.<br />
<br />
Obdobne je to s TColor.<br />
Pre prekladač je to jednoducho 'longint', ale v zdrojovom kóde je to definované ako:<br />
<pascal><br />
TGraphicsColor = -$7FFFFFFF-1..$7FFFFFFF;<br />
TColor = TGraphicsColor;<br />
</pascal><br />
<br />
Obdobné je to aj s forward definovanými triedami:<br />
Napríklad v TControl je priávtna premenná<br />
<pascal><br />
FHostDockSite: TWinControl;<br />
</pascal><br />
<br />
Hľadanie deklarácie pre TWinControl skočí na forward definíciu:<br />
<pascal><br />
TWinControl = class;<br />
</pascal><br />
<br />
A opätovné spustenie hľadania deklarácie skočí na skutočnú implementáciu:<br />
<pascal><br />
TWinControl = class(TControl)<br />
</pascal><br />
<br />
Týmto spôsobom môžete stopovať každý identifikátor a nájsť každé predefinovanie, či preťaženie.<br />
<br />
==Dokončovanie identifikátorov==<br />
(''Identifier Completion'')<br />
<br />
Dokončovanie identifikátorov je vyvolané pomocou Ctrl+Space a zobrazuje všetky vyhovujúce identifikátory. <br />
<br />
Napríklad:<br />
<pascal><br />
procedure TForm1.FormCreate(Sender: TObject);<br />
begin<br />
|<br />
end;<br />
</pascal><br />
<br />
Umiestnite kurzor medzi ''begin'' a ''end'' a stlačte Ctrl+Space. Nástroj IDE spracuje celý dosiahnuteľný kód a zobrazí zoznam všetkých nájdených identifikátorov. CodeTools kešuje výsledok, takže druhý krát bude oveľa rýchlejší.<br />
<br />
'''Poznámka pre Delphianov:''' Delphi to volá ''Dokončovanie kódu''.<br />
<br />
Niektoré identifikátory, ako 'Write', 'ReadLn', 'Low', 'SetLength', 'Self', 'Result', 'Copy' sú zabudované v prekladači a teda nie sú definované nikde v zdrojovom kóde, al Dokončovanie identifikátorov má veľa z nich tež zabudovaných. Ak nájdete nejaký chýbajúci, jednoducho vytvorte požiadadvku na vlastnosť v sledovači chýb (''bug tracker'').<br />
<br />
Dokončovanie identifikátorov nedokončuje kľúčové slová, takže ho nemožno použiť na dokončenie proc' na 'procedure'. Na toto je určené Ctrl+W [[#Dokončovanie_slov|Dokončovanie slov]] alebo Ctrl+J [[#Šablóny_kódu|Šablóny kódu]].<br />
<br />
Dokončovanie identifikátorov nezobrazuje len tie identifikátory, ktoré nie sú kompatibilné.<br />
<br />
===Predpona===<br />
Môžete začať dokončovanie identifikátorov v existujúcom slove. Potom budú písmená vľavo od kurzora brané ako predpona. <br />
<br />
Napríklad:<br />
<pascal><br />
procedure TForm1.FormCreate(Sender: TObject);<br />
begin<br />
Ca|ption<br />
end;<br />
</pascal><br />
<br />
Okno bude zobrazovať len identifikátory začínajúce sa na 'Ca'.<br />
<br />
===Klávesy===<br />
<br />
* Písmená/čísla: pridávajú znak do editora zdrojového kódu a aktuálnej predpony, čo zároveň aktualizuje zoznam.<br />
* Backspace: odstraňuje posledný znak z editora zdrojového kódu a aktuálnej predpony, čo zároveň aktualizuje zoznam.<br />
* Return: nahradzuje celé slovo na kurzore zvoleným identifikátorom a zatvára vyskakovacie okno.<br />
* Shift+Return: as ''Return'', but replaces only the prefix (left part) of the word at the cursor.<br />
* Hore/Dole: presúva výber.<br />
* Esc: zatvára vyskakovacie okno bez zmeny.<br />
* Tab: dokončuje predponu na ďalšiu voľbu. Napríklad: aktuálna predpona je 'But' a dokončovanie identifikátora zobrazuje len 'Button1' a 'Button1Click', potom stlačenie ''Tab'' dokončí predponu na 'Button1'.<br />
* Else: ako ''Return'' a pridá znak do editora zdrojového kódu.<br />
<br />
==Dokončovanie slov==<br />
(''Word Completion'')<br />
<br />
Dokončovanie slov je vyvolané stlačením Ctrl+W a zobrazuje všetky slová všetkých aktuálne otvorených editorov. Inak pracuje presne ako Dokončovanie identifikátorov.<br />
<br />
==Prejdi do direktívy include==<br />
(''Goto Include Directive'')<br />
<br />
Tento príkaz v menu Searchskočí do príkazu (direktívy) {$I filename}, v ktorej je použitý aktuálny súbor.<br />
<br />
==Publikuj Projekt==<br />
Vytvára kópiu celého projektu. Ak chcete niekomu poslať len zdrojové kódy a nastavenia prekladača pre svoj kód, budete kamarátis touto funkciou.<br />
<br />
Bežný adresár projektu obsahuje množstvo informácií. Väčšinu z nich publikovať netreba. Súbor .lpi obsahuje informácie o relácii (ako pozíciu caret a záložiek zatvorených jednotiek) a adresár projektu obsahuje mnoho súborov .ppu a .o, a tiež .exe. A práve príkaz Publikuj projekt vytvorí súbor .lpi len so základnými informáciami a všetky zdrojové kódy, so všetkých podadresárov.<br />
<br />
V ponúknutom dialógu môžete nastaviť filter pre zahrnutie/vynechanie, či pre kompresiu výstupu do jediného archívu.<br />
<br />
==Spolupracovníci==<br />
This page has been converted from the epikwiki [http://lazarus-ccr.sourceforge.net/index.php?wiki=LazarusIdeTools version].<br />
* Created page and initial template - 4/6/2004 [[User:Tom Lisjac| VlxAdmin]]<br />
* Initial content posted - 4/10/2004 MattiasG<br />
* Small wiki and formatting fixes - 4/11/2004 [[User:Tom Lisjac| VlxAdmin]]<br />
* Added a summary table for IdeTools shortcuts - 12 July 2004 [[User:Kirkpatc]]<br />
* Preložené z originálu [[Lazarus IDE Tools]] - [[User:Slavko|Slavko]] 13:51, 25 Mar 2005 (PST)</div>Slavkohttps://wiki.freepascal.org/index.php?title=Lazarus_IDE_Tools/sk&diff=26873Lazarus IDE Tools/sk2008-02-17T20:08:57Z<p>Slavko: úprava nadpisu</p>
<hr />
<div>{{Lazarus IDE Tools}}<br />
<br />
==Úvod==<br />
IDE používa knižnicu analýzy zdrojového kódu Pascal a editačných nástrojov, zvanú "codetools". Tieto nástroje poskytujú funkcie ako hľadanie deklarácie (find declaration), dokončovanie kódu (code completion), odstraňovanie, presúvanie, vkladanie a formátovanie zdrojového kódu Pascal. Tieto funkcie šetria množstvo času a duplicitných úloh. Sú nastaviteľné a každá funkcia je dostupná pomocou klávesovej skratky (viď Editor Options).<br />
<br />
Pretože ich práca záleží na zdrojovom kóde a pochopení FreePascal, Delphi a Kylix kódu, nevyžadujú preložené jednotky ani nainštalovaný prekladač Borland. Môžete naraz upravovať kód Delphi aj FreePascal. Môžete dokonca pracovať s rôznymi verziami Delphi a FreePascal súčasne. Tým sa stáva prenos Delphi kódu ešte jednoduchší.<br />
<br />
==Zhrnutie klávesových skratiek IDE==<br />
{|<br />
|-<br />
| [[Lazarus IDE Tools/sk#Hľadanie_deklarácie | Hľadanie deklarácie]] (Declaration Jumping) || '''Ctrl+Click''' alebo '''Alt+Up'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Prepínanie_metód | Prepínanie metód]] (Method Jumping) || '''Ctrl+Shift+Up''' a '''Ctrl+Shift+Down'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Šablóny_kódu | Šablóny kódu]] (Code Templates) || '''Ctrl+J'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Dokončovanie_kódu | Dokončovanie kódu]] (Code/Class Completion) || '''Ctrl+Shift+C'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Dokončovanie_identifikátorov | Dokončovanie identifikátorov]] (Identifier Completion) || '''Ctrl+Medzerník'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Dokončovanie_slov | Dokončovanie slov]] (Word Completion) || '''Ctrl+W'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Pomoc_s_parametrami |Pomoc s parametrami]] (Parameter Hints) || '''Ctrl+Shift+Space'''<br />
|}<br />
<br />
==Prepínanie metód==<br />
(''Method Jumping'')<br />
<br />
Na prepínanie medzi telom procedúry (begin..end) a jej definíciou (procedure Name;) použite Ctrl+Shift+Up.<br />
<br />
Príklad:<br />
<pascal><br />
interface<br />
<br />
procedure DoSomething; // procedure definition<br />
<br />
implementation<br />
<br />
procedure DoSomething; // procedure body <br />
begin<br />
end;<br />
</pascal><br />
<br />
Ak je kurzor v tele provedúry a stlačíte Ctrl+Shift+Up, kurzor skočí na definíciu. Ak znova stlačíte Ctrl+Shift+Up preskočí do tela procedúry, za 'begin'. Funkcia pracuje aj s metódami (procedúrami v triedach).<br />
<br />
Tipy:<br />
'Method Jumping' presúva kurzor na rovnakú procedúru s rovnakým menom i zoznamom parametrov. Ak presná procedúra neexistuje, skočí na najpodobnejšiu a umiestni kurzor na prvý rozdiel. V Delphi táto funkcia neexistuje.<br />
<br />
Príklad procedúry s rôznymi typmi parametrov:<br />
<pascal><br />
interface<br />
<br />
procedure DoSomething(p: char); // procedure definition<br />
<br />
implementation<br />
<br />
procedure DoSomething(p: string); // procedure body<br />
begin<br />
end;<br />
</pascal><br />
<br />
Preskočenie z definície do tela umiestni kurzor na kľúčové slovo 'string'. Túto vlastnosť môžete využiť na premenovanie metódy a/alebo zmenu jej parametrov.<br />
<br />
Príklad:<br />
Premenovali sme 'DoSomething' na 'MakeIt':<br />
<pascal> interface<br />
<br />
procedure MakeIt; // procedure definition<br />
<br />
implementation<br />
<br />
procedure DoSomething; // procedure body<br />
begin<br />
end;<br />
</pascal><br />
<br />
Potom urobte skok z definície MakeIt do tela. IDE hľadá vhodné telo, nenájde žiadne, preto začne hľadať kandidátov. Keďže stepremenovali len jednu procedúru, tak je len jedno telo bez definície (DoSomething) a tak skočí do DoSomething a umiestni kurzor vpravo od 'DoSomething'. Potomm ju môžete jednoducho premenovať tiež. Toto rovnako pracuje s parametrami.<br />
<br />
==Include súbory==<br />
(''Include Files'')<br />
<br />
Include súbory sú súbory vložené do zdrojového kódu pomocou direktív prekladača {$I filename} alebo {$INCLUDE filename}. Lazarus a FreePascal používajú veľa takýchto vecí na redukciu nadbytočnosti a vyhnutie sa nečitateľnosti konštrukcií {$IFDEF} pri podpore rôznych platforiem.<br />
<br />
Narozdiel od Delphi, IDE Lazarus plne podporuje include súbory. Napríklad môžete skočiť z metódy v súbore .pas do tela metódy v include súbore. Všetky nástroje kódu, ako dokončovanie kódu, považuje include súbory za špeciálne hranice.<br />
<br />
Napríklad: keď dokončovanie kódu pridáva telo novej metódy za telom inej metódy, ponechá ich obe v rovnakom súbore. Týmto spôsobom môžete vložiť celú implementáciu triedy do include súborov, ako to robí LCL pre skoro všetky prvky.<br />
<br />
Ale je tu začiatočnícka chyba: Ak najprv otvoríte include súbor a skúsite prepínanie metód alebo hľadanie deklarácie, dostanete chybu. IDE nevie do ktorej jednotky include súbor patrí. Najprv musíte otvoriť jednotku.<br />
<br />
Hneď ako IDE zanalyzuje jednotku, zachytí v nej include direktívy a IDE si bude pamätať tento vzťah. Tieto informácie IDE ukladá pri skončení a pri uložení projektu do ~/.lazarus/includelinks.xml. Keď nabudúce otvoríte súbor include a urobíte skok do neho alebo hľadanie deklarácie, IDE interne otvorí jednotku a skoky budú fungovať.<br />
<br />
Tento mechanizmus má samozrejme obmedzenia, niektoré include súbory sú zahrnuté dva i viackrát. Napríklad: lcl/include/winapih.inc.<br />
Skákanie z definície procedúry/metódy v tomto include súbore do tela závisí na poslednej akcii. Ak ste pracovali v lcl/lclintf.pp, IDE skočí do winapi.inc. Ak ste pracovali v lcl/interfacebase.pp, potom skočíte do lcl/include/interfacebase.inc (alebo do jedného z ďalších include súborov). Ak pracujete s obomi, potom môže nastať zmätok. ;)<br />
<br />
==Šablóny kódu==<br />
(''Code Templates'')<br />
<br />
Šablóny kódu konvertujú identifikátor v texte alebo fragmente kódu. Šablóny kódu majú prednastavenú klávesovú skratku Ctrl+J. Môžete napísať identifikátor, stlačiť Ctrl+J a identifikátor je nahradený textom definovaným pre identifikátor. Šablóny kódu môžete definovať v Environment -> Editor Options -> CodeTools.<br />
<br />
Príklad:<br />
Napíšte identifikátor 'classf', ponechajte kurzor vpravo za 'f' a stlačte Ctrl+J. Identifikátor 'classf' bude nahradený týmto:<br />
<pascal><br />
T = class(T)<br />
private<br />
<br />
public<br />
constructor Create;<br />
destructor Destroy; override;<br />
end;<br />
</pascal><br />
<br />
a kurzor bude za 'T'.<br />
Zoznam šablón získate tak, že kurzor ponecháte na medzere (nie ne identifikátore) a stlačíte Ctrl+J. Pomocou kurzorových klávesov alebon apísania niekoľkých znakov vyberte jeden. Enter vytvorí zvolenú šablónu a Esc zatvorí zoznam.<br />
<br />
==Pomoc s parametrami==<br />
(''Parameter Hints'')<br />
Pomoc s parametrami ukazuje pomocné okno s deklaráciami parametrov aktuálneho zoznamu parametrov.<br />
<br />
Napríklad<br />
<pascal><br />
Canvas.FillRect(|);<br />
</pascal><br />
<br />
Umiestnite kurzor do zátvoriek a stlačte Ctrl+Shift+Space. Objaví sa pomocné okno, ukazujúce parametre FillRect.<br />
<br />
==Dokončovanie kódu==<br />
(''Code Completion'')<br />
<br />
Dokončovanie kódu nájdete v menu IDE Edit -> Complete Code a má štandartnú klávespvú skratku Ctrl+Shift+C.<br />
V Delphi je dokončovaním kódu volaná funkcia zobrazujúca zoznam identifikátorov na aktuálnej pozícii v zdrojovom kóde (Ctrl+Space). V Lazarus je toto nazývané dokončovanie identifikátorov (Identifier completion). Dokončovanie kódu v sebe združuje niekoľko užitočných funkcií:<br />
<br />
* '''Dokončovanie tried''' (Class Completion): dokončuje vlastnosti, pridáva telá metód, pridáva súkromné premenné a súkromné metódy;<br />
* '''Dokončovanie forward procedúr''' (Forward Procedure Completion): pridáva telá forward procedúr;<br />
* '''Dokončovanie priradenia udalostí''' (Event Assignment Completion): * dokončuje pridelenie udalostí a pridávanie tiel a definícií metód;<br />
* '''Dokončovanie lokálnych premenných''' (Local Variable Completion): pridáva definície lokálnych premenných.<br />
Ktorá funkcia je použitá, závisí na pozícii kurzora v editore zdrojového kódu.<br />
<br />
===Dokončovanie tried===<br />
(''Class Completion'')<br />
<br />
Veľmi výkonnou funkciou dokončovania kódu je "Dokončovanie tried". Vy píšete triedu, pridáte metódy a vlastnosti, a dokončovanie kódu pridá telá metód, metódy prístupu k vlastnostiam a súkromným premenným. <br />
<br />
Príklad:<br />
Vytvorte triedu (viz [[Lazarus IDE Tools/sk#Šablóny_kódu | Šablóny kódu]], aby ste ušetrili rovnakú prácu):<br />
<pascal> TExample = class(TObject)<br />
public<br />
constructor Create;<br />
destructor Destroy; override;<br />
end;</pascal><br />
<br />
Umiestnite kurzor niekde v definícii triedy a stlačte '''Ctrl+Shift+C'''. Tým budú vytvorené chýbajúce telá metód a kurzor bude presunutý na prvé vytvorené telo, takže môžete rovno začať písať kód triedy:<br />
<pascal> { TExample }<br />
<br />
constructor TExample.Create;<br />
begin<br />
|<br />
end;<br />
<br />
destructor TExample.Destroy;<br />
begin<br />
inherited Destroy;<br />
end;</pascal><br />
<br />
:'''Poznámka''': Značka '|' nie je pridaná, len ukazuje umiestnenie kurzora.<br />
<br />
Tip: Prepínať medzi telom a definíciou metódy môžete pomocou Ctrl+Shift+Up.<br />
<br />
Všimnite si, že IDE tiež pridáva volanie deštruktora základnej triedy (inherited Destroy). Toto je urobené, ak v definícii treidy použijete kľúčové slovo '''override'''.<br />
<br />
Teraz pridajte metódu '''DoSomething''':<br />
<pascal> TExample = class(TObject)<br />
public<br />
constructor Create;<br />
procedure DoSomething(i: integer);<br />
destructor Destroy; override;<br />
end;</pascal><br />
<br />
Potom stlačte '''Ctrl+Shift+C''' a IDE pridá:<br />
<pascal> procedure TExample.DoSomething(i: integer);<br />
begin<br />
|<br />
end;</pascal><br />
<br />
Ako môžete vidieť, nové telo metódy je vložené medzi Create a Destroy, presne ako je to v definícii. Týmto sú telá metód uchovávané v rovnakom logickom poradí, ako v definícii. Spôsob vkladania môžete definovať pomocou Prostredie > Voľby Codetools -> Tvorenie kódu.<br />
<br />
===Dokončovanie vlastností===<br />
Pridajte vlastnosť '''AnInteger''':<br />
<pascal> TExample = class(TObject)<br />
public<br />
constructor Create;<br />
procedure DoSomething(i: integer);<br />
destructor Destroy; override;<br />
property AnInteger;<br />
end;</pascal><br />
<br />
Stlačte Ctrl+Shift+C a dostanete:<br />
<pascal> procedure TExample.SetAnInteger(const AValue: integer);<br />
begin<br />
|if FAnInteger=AValue then exit;<br />
FAnInteger:=AValue;<br />
end;</pascal><br />
<br />
Dokončovanie kódu pridalo metódu pre prístup k zápisu do vlastnosti a nejaký základný kód.<br />
<br />
Preskočte do triedy pomocou '''Ctrl+Shift+C''' a uvidíte, že v triede pribudlo:<br />
<pascal> TExample = class(TObject)<br />
private<br />
FAnInteger: integer;<br />
procedure SetAnInteger(const AValue: integer);<br />
public<br />
constructor Create;<br />
procedure DoSomething(i: integer);<br />
destructor Destroy; override;<br />
property AnInteger: integer read FAnInteger write SetAnInteger;<br />
end;</pascal><br />
<br />
Vlastnosť bola rozšírená pridaním kľúčových slov '''Read''' a '''Write'''. V triede je nová sekcia '''private''' s premennou '''FAnInteger''' a metódou '''SetAnInteger'''. Pridanie '''F''' na začiatok privátnej premennej je bežnou notáciou Delphi, rovnako ako označenie prístupovej metódy pomocou '''Set'''. Ak to nechcete, môžete to zmeniť ponmocou Prostredie > Voľby Codetools -> Tvorenie kódu.<br />
<br />
Vytvorenie vlastnosti len na čítanie:<br />
<pascal> property PropName: PropType read;</pascal><br />
<br />
Bude rozšírené na:<br />
<pascal> property PropName: PropType read FPropName;</pascal><br />
<br />
Vytvorenie vlastnosti len pre zápis:<br />
<pascal> property PropName: PropType write;</pascal><br />
<br />
Bude rozšírené na:<br />
<pascal> property PropName: PropType write SetPropName;</pascal><br />
<br />
Vytvorenie read only vlastnosti s metódou na čítanie:<br />
<pascal> property PropName: PropType read GetPropName;</pascal><br />
<br />
Deklarácia ostane nezmenená, ale bude pridaná funkcia '''GetPropName''':<br />
<pascal> function GetpropName: PropType;</pascal><br />
<br />
Vytvorenie vlastnosti s direktívou '''stored''':<br />
<pascal> property PropName: PropType stored;</pascal><br />
<br />
Bude rozšírené na:<br />
<pascal> property PropName: PropType read FPropName write SetPropName stored PropNameIsStored;</pascal><br />
<br />
Pretože direktíva '''stored''' je používaná pre streamovanie čítania a zápisu, sú pridané aj kľúčové slová '''read''' a '''write'''.<br />
<br />
Tip:<br />
Dokončovanie identifikátorov tiež rozpoznáva nekompletné vlastnosti a navrhne predvolené mená. Napríklad:<br />
<pascal> property PropName: PropType read |;</pascal><br />
<br />
Umiestnite kurzor za medzeru za kľúčovým slovom '''read''' a stlačte Ctrl+Space pre dokončovanie identifikátorov. To vám ponúkne premennú '''FPropName''' a procedúru '''SetPropName'''.<br />
<br />
===Dokončovanie procedúr===<br />
(''Forward Procedure Completion'')<br />
<br />
Dokončovanie dopredných deklarácií procedúr je časťou dokončovania kódu a pridáva telá chýbajúcich procedúr, ktoré sú definované. Je vyvolané, ak je kurzor na pripravenej definícii procedúry, pomocou klávesovej skratky '''Ctrl+Shift+C'''.<br />
<br />
Napríklad:<br />
Pridajte novú procedúru do časti '''interface''':<br />
<pascal> procedure DoSomething;</pascal><br />
<br />
Umiestnite kurzor na ňu a stlačte '''Ctrl+Shift+C''' pre dokončovanie kódu. V časti '''implementation''' bude doplnené:<br />
<pascal> procedure DoSomething;<br />
begin<br />
|<br />
end;</pascal><br />
<br />
:Tip: Pomocou '''Ctrl+Shift+Up''' môžete prepínať medzi definíciou a telom procedúry.<br />
<br />
Telo novej procedúry bude pridané pred metódy tried. Ak už sú v časti '''interface''' nejaké definície procedúr, IDE sa pokúsi zachovať ich poradie, napríklad:<br />
<pascal> procedure Proc1;<br />
procedure Proc2; // nová procedúra<br />
procedure Proc3;</pascal><br />
<br />
Ak telá '''Proc1''' a '''Proc3''' už existujú, potom bude telo '''Proc2''' vložené medzi telá procedúr '''Proc1''' a '''Proc3'''. Toto správanie môže byť zmené pomocou '''Prostredie > Voľby Codetools -> Tvorenie kódu'''.<br />
<br />
Viacero procedúr:<br />
<pascal> procedure Proc1_Old; // telo existuje<br />
procedure Proc2_New; // telo neexistuje<br />
procedure Proc3_New; // "<br />
procedure Proc4_New; // "<br />
procedure Proc5_Old; // telo existuje</pascal><br />
<br />
Dokončovanie kódu pridá 3 telá procedúr (Proc2_New, Proc3_New, Proc4_New).<br />
<br />
Tento nástroj nepracuje len s procedúrami definovanými v časti '''interface''', ale aj s procedúrami, ktoré sú definované pomocou kľúčového slova '''forward'''.<br />
<br />
===Dokončovanie priradenia udalostí===<br />
(''Event Assignment Completion'')<br />
<br />
Dokončovanie priradenia udalostí je čsťou Dokončovania kódu a dokončuje jeden príkaz Event:=|. Nastáva, keď je kurzor umiestnený za príkazom priradenia udalosti a stlačíte '''Ctrl+Shift+C'''.<br />
<br />
;Napríklad:<br />
V metóde, povedzme udalosti FormCreate, pridajte riadok: 'OnPaint:=':<br />
<pascal> procedure TForm1.Form1Create(Sender: TObject);<br />
begin<br />
OnPaint:=|<br />
end;</pascal><br />
<br />
Značka '|' je umiestnenie kurzora a netreba ju zadávať.<br />
<br />
Potom stlačte '''Ctrl+Shift+C''' pre dokončovanie kódu. Príkaz priradenia udalosti bude doplnený takto:<br />
<pascal> OnPaint:=@Form1Paint;</pascal><br />
<br />
Do triedy '''TForm1''' bude pridaná nová metóda '''Form1Paint'''. Potom je spustené dokončovanie tried a dostanete:<br />
<pascal> procedure TForm1.Form1Paint(Sender: TObject);<br />
begin<br />
|<br />
end;</pascal><br />
<br />
Pracuje presne ako pridávanie metód v '''Inšpektore objektov'''.<br />
<br />
:'''Poznámka''': Kurzor musíte umiestniť za operátor priradenia ':='. Ak ho umiestnite na identifikátor (tj. '''OnPaint'''), dokončovanie kódu spustí Dokončovanie lokálnych premenných, ktoré zlyhá, pretože '''OnPaint''' je už definovaná.<br />
<br />
Tip:<br />
Môžete definovať meno novej metódi aj sami, a to jej zadaním do priradenia, napríklad:<br />
<pascal> OnPaint:=@ThePaintMethod;</pascal><br />
<br />
===Dokončovanie deklarácie premenných===<br />
(''Variable Declaration Completion'')<br />
<br />
Dokončovanie deklarácie premenných je časťou '''Dokončovania kódu''' a pridáva definíciu lokálnej premennej pre príkaz Identifier:=Term;. Dokončovanie deklarácie premenných je vyvolané, keď je kurzor umiestnený na identifikátore v priradení.<br />
<br />
Napríklad:<br />
<pascal><br />
procedure TForm1.Form1Create(Sender: TObject);<br />
begin<br />
i:=3;<br />
end;<br />
</pascal><br />
<br />
Umiestnite kurzor na 'i' alebo tesne za neho, potom stlačte Ctrl+Shift+C pre dokončovanie kódu a dostanete:<br />
<pascal><br />
procedure TForm1.Form1Create(Sender: TObject);<br />
var<br />
i: Integer;<br />
begin<br />
i:=3;<br />
end;<br />
</pascal><br />
<br />
Nástroj dokončovania kódu najprv skontroluje, či identifikátor 'i' už nie je definovaný a ak nie, pridá deklaráciu 'var i: integer;'. Typ identifikátora je odhadovaný podľa pravej strany príkazu priradenia. Čísla ako 3 sú identifikované ako Integer.<br />
<br />
Iný príklad:<br />
<pascal><br />
type<br />
TWhere = (Behind, Middle, InFront);<br />
<br />
procedure TForm1.Form1Create(Sender: TObject);<br />
var<br />
a: array[TWhere] of char;<br />
begin<br />
for Where:=Low(a) to High(a) do writeln(a[Where]);<br />
end;<br />
</pascal><br />
<br />
Umiestnite kurzor na 'Where' a stlačte Ctrl+Shift+C pre dokončenie kódu. Dostanete:<br />
<pascal><br />
procedure TForm1.Form1Create(Sender: TObject);<br />
var<br />
a: array[TWhere] of char;<br />
Where: TWhere;<br />
begin<br />
for Where:=Low(a) to High(a) do writeln(a[Where]);<br />
end;<br />
</pascal><br />
<br />
===Spätné dokončovanie triedy===<br />
(''Reversed Class Completion'')<br />
Spätné dokončovanie triedy je časťou '''Dokončovania kódu''' a pridáva deklarácie súkromných metód pre aktuálne telo metódy. Je vyvolané, keď je kurzor v tele metódy, zatiaľ nie je definované pre triedy.<br />
<br />
Táto vlastnosť je dostupná od 0.9.21.<br />
<br />
Napríklad:<br />
<pascal><br />
procedure TForm1.DoSomething(Sender: TObject);<br />
begin<br />
end;<br />
</pascal><br />
<br />
Metóda DoSomething zatiaľ nie je v TForm1 deklarovaná. Stlačte Ctrl+Shift+C a IDE pridá "procedure DoSomething(Sender: TObject);" k súkromným metódam triedy TForm1.<br />
<br />
Pre Delphianov:<br />
Dokončovanie tried pracuje pod Lazarus vždy jednym spôsobom:<br />
*Z rozhrania triedy do jej implementácie alebo naopak z implementácie triedy do jej rozhrania. Delphi vždy vyvoláva oba smery. Poszup v Delphi má nevýhodu, že ak dôjde k preklepu, ľahko vytvoríte bez upozornenia zvyšok novej metódy.<br />
<br />
===Komentáre a dokončovanie kódu===<br />
(''Comments and Code Completion'')<br />
<br />
Dokončovanie kódu sa pokúša uchovávať komentáre tam, kde sú. <br />
Príklad:<br />
<pascal><br />
FList: TList; // zoznam prvkov TComponent<br />
FInt: integer;<br />
</pascal><br />
<br />
Pri vkladaní novej premennej medzi FList a FInt, je komentár ponechaný na riadku spolu s FList. To platí i pre:<br />
<pascal><br />
FList: TList; { zoznam prvkov TComponent<br />
Toto je komentár na niekoľkých riadkoch, začínajúci<br />
na riadku s FList, tak nástroj dokončenia kódu predpokladá že patrí <br />
k riadku s FList a nepreruší tento vzťah.<br />
Kód bude vložený za komentár. }<br />
FInt: integer;<br />
</pascal><br />
<br />
Ak komentár začína na ďalšom riadku:<br />
<pascal><br />
FList: TList; // zoznam prvkov TComponent<br />
{ Tento komentár patrí k nasledujúcemu riadku. <br />
Nový kód je vložený pred tentokomentár a <br />
za komentár na riadku s FList. }<br />
FInt: integer;<br />
</pascal><br />
<br />
==Refactoring==<br />
<br />
===Otočenie priradenie===<br />
(''Invert Assignments'')<br />
<br />
Otočenie priradenia pracuje s vybratými príkazmi Pascalu a obracia všetky priradenia z tohoto výberu. Tento nástroj je užitočný pre transformáciu "save" kódu na "load" a naopak.<br />
<br />
Príklad:<br />
<pascal> procedure DoSomething;<br />
begin<br />
AValueStudio:= BValueStudio;<br />
AValueAppartment :=BValueAppartment;<br />
AValueHouse:=BValueHouse;<br />
end;<br />
</pascal><br />
<br />
Vyberte riadky s priradeniami (medzi begin a end) a urobte Otočenie priradenia, všetky priradenia budú otočené a automaticky odsadené. Výsledok:<br />
<pascal><br />
procedure DoSomething;<br />
begin<br />
BValueStudio := AValueStudio;<br />
BValueAppartment := AValueAppartment;<br />
BValueHouse := AValueHouse;<br />
end;<br />
</pascal><br />
<br />
=== Uzavrieť výber ===<br />
<br />
Vyberte nejaký text a vyvolajte nástroj. Zobrazí sa dialóg, kde si môžete vybrať či má výber uzatvorený medzi '''try..finally''' ale do mnoho iných blokov.<br />
<br />
=== Premenovať identifikátor ===<br />
<br />
Umiestnite kurzor na identifikátor a vyvolajte tento nástroj, obaví sa dialóg, v ktorom môžete nastaviť rozsah hľadania a nové meno identifikátora. <br />
* premenované budú všetky výskyty a len tie, ktoré momentálne používajú túto deklaráciu, čiže edklarácie s rovnakým menom nebudú premenované. <br />
* najprv bude vykonaná kontrola konfliktov mena. <br />
* Obmedzenia: Pracuje len so zdrojovými kódmi Pascalu, zatiaľ nepremenúva súbory ani neupravuje súbory lfm/lrs, či súbory lazdoc.<br />
<br />
=== Nájdi odkazy na identifikátor ===<br />
<br />
Umiestnite kurzor na identifikátor a vyvolajte nástroj. Objaví sa dialóg, v ktorom môžete nastaviť rozsah hľadania. IDE bude hľadať všetky výskyty a len tie, ktoré používajú aktuálnu deklaráciu. Čiže iné deklarácia s rovnakým menom, nebudú zobrazené.<br />
<br />
=== Zobraziť abstraktné metódy ===<br />
<br />
Táto funkcia vypisuje a automaticky kompletuje virtuálne, abstraktné metódy, ktoré je majú byť implementované.<br />
<br />
Umiestnite kurzor na deklaráciu triedu a vyvolajte nástroj. Ak existujú nejaké chýbajúce abstraktné metódy, nude zobrazený dialóg s ich zoznamom. Zvoľte metódy pre implementovanie a IDE vytvorí základy metód.<br />
<br />
=== Vytiahnuť procedúru ===<br />
Viz [[IDE_Window:_Extract_Procedure/sk|Extract Procedure]]<br />
<br />
==Hľadanie deklarácie==<br />
(''Find Declaration'')<br />
<br />
Umiestnite kurzor na identifikátor a urobte Hľadanie deklarácie, tým bude nájdená deklarácia tohoto identifikátora, prípadne otvorený príslušný súbor a kurzor bude premiestnený na miesto deklarácie.<br />
<br />
Každé hľadanie deklarácie nastavuje bod skoku. Tzn. po skoku na nájdenú deklaráciu môžete jednoduchos skočiť naspäť pomocou Search -> Jump back.<br />
<br />
Oproti Delphi má nástroj isté rozdiely:<br />
Nástroj pracuje so zdrojovým kódom na základe pravidiel Pascalu, a nie s výsledkom prekladača. The compiler returns the final type. Nástroj prezerá zdrojové kódy a všetky kroky medzi. Napríklad:<br />
<br />
: Vlastnosť 'Visible' je najprv definovaná v TControl (controls.pp), potom je predefinovaná v TCustomForm a nakoniec predefinovaná aj v TForm. Spustenie hľadania deklarácie vlastnosti Visible vás najprv presunie na Visible v TForm. Potom môžete spustiť hľadanie deklarácie znova a skočíte na Visible v TCustomForm a znova pre skočenie na Visible v TControl.<br />
<br />
Obdobne je to s TColor.<br />
Pre prekladač je to jednoducho 'longint', ale v zdrojovom kóde je to definované ako:<br />
<pascal><br />
TGraphicsColor = -$7FFFFFFF-1..$7FFFFFFF;<br />
TColor = TGraphicsColor;<br />
</pascal><br />
<br />
Obdobné je to aj s forward definovanými triedami:<br />
Napríklad v TControl je priávtna premenná<br />
<pascal><br />
FHostDockSite: TWinControl;<br />
</pascal><br />
<br />
Hľadanie deklarácie pre TWinControl skočí na forward definíciu:<br />
<pascal><br />
TWinControl = class;<br />
</pascal><br />
<br />
A opätovné spustenie hľadania deklarácie skočí na skutočnú implementáciu:<br />
<pascal><br />
TWinControl = class(TControl)<br />
</pascal><br />
<br />
Týmto spôsobom môžete stopovať každý identifikátor a nájsť každé predefinovanie, či preťaženie.<br />
<br />
==Dokončovanie identifikátorov==<br />
(''Identifier Completion'')<br />
<br />
Dokončovanie identifikátorov je vyvolané pomocou Ctrl+Space a zobrazuje všetky vyhovujúce identifikátory. <br />
<br />
Napríklad:<br />
<pascal><br />
procedure TForm1.FormCreate(Sender: TObject);<br />
begin<br />
|<br />
end;<br />
</pascal><br />
<br />
Umiestnite kurzor medzi ''begin'' a ''end'' a stlačte Ctrl+Space. Nástroj IDE spracuje celý dosiahnuteľný kód a zobrazí zoznam všetkých nájdených identifikátorov. CodeTools kešuje výsledok, takže druhý krát bude oveľa rýchlejší.<br />
<br />
'''Poznámka pre Delphianov:''' Delphi to volá ''Dokončovanie kódu''.<br />
<br />
Niektoré identifikátory, ako 'Write', 'ReadLn', 'Low', 'SetLength', 'Self', 'Result', 'Copy' sú zabudované v prekladači a teda nie sú definované nikde v zdrojovom kóde, al Dokončovanie identifikátorov má veľa z nich tež zabudovaných. Ak nájdete nejaký chýbajúci, jednoducho vytvorte požiadadvku na vlastnosť v sledovači chýb (''bug tracker'').<br />
<br />
Dokončovanie identifikátorov nedokončuje kľúčové slová, takže ho nemožno použiť na dokončenie proc' na 'procedure'. Na toto je určené Ctrl+W [[#Dokončovanie_slov|Dokončovanie slov]] alebo Ctrl+J [[#Šablóny_kódu|Šablóny kódu]].<br />
<br />
Dokončovanie identifikátorov nezobrazuje len tie identifikátory, ktoré nie sú kompatibilné.<br />
<br />
===Predpona===<br />
Môžete začať dokončovanie identifikátorov v existujúcom slove. Potom budú písmená vľavo od kurzora brané ako predpona. <br />
<br />
Napríklad:<br />
<pascal><br />
procedure TForm1.FormCreate(Sender: TObject);<br />
begin<br />
Ca|ption<br />
end;<br />
</pascal><br />
<br />
Okno bude zobrazovať len identifikátory začínajúce sa na 'Ca'.<br />
<br />
===Klávesy===<br />
<br />
* Písmená/čísla: pridávajú znak do editora zdrojového kódu a aktuálnej predpony, čo zároveň aktualizuje zoznam.<br />
* Backspace: odstraňuje posledný znak z editora zdrojového kódu a aktuálnej predpony, čo zároveň aktualizuje zoznam.<br />
* Return: nahradzuje celé slovo na kurzore zvoleným identifikátorom a zatvára vyskakovacie okno.<br />
* Shift+Return: as ''Return'', but replaces only the prefix (left part) of the word at the cursor.<br />
* Hore/Dole: presúva výber.<br />
* Esc: zatvára vyskakovacie okno bez zmeny.<br />
* Tab: dokončuje predponu na ďalšiu voľbu. Napríklad: aktuálna predpona je 'But' a dokončovanie identifikátora zobrazuje len 'Button1' a 'Button1Click', potom stlačenie ''Tab'' dokončí predponu na 'Button1'.<br />
* Else: ako ''Return'' a pridá znak do editora zdrojového kódu.<br />
<br />
==Dokončovanie slov==<br />
(''Word Completion'')<br />
<br />
Dokončovanie slov je vyvolané stlačením Ctrl+W a zobrazuje všetky slová všetkých aktuálne otvorených editorov. Inak pracuje presne ako Dokončovanie identifikátorov.<br />
<br />
==Prejdi do direktívy include==<br />
(''Goto Include Directive'')<br />
<br />
Tento príkaz v menu Searchskočí do príkazu (direktívy) {$I filename}, v ktorej je použitý aktuálny súbor.<br />
<br />
==Publikuj Projekt==<br />
Vytvára kópiu celého projektu. Ak chcete niekomu poslať len zdrojové kódy a nastavenia prekladača pre svoj kód, budete kamarátis touto funkciou.<br />
<br />
Bežný adresár projektu obsahuje množstvo informácií. Väčšinu z nich publikovať netreba. Súbor .lpi obsahuje informácie o relácii (ako pozíciu caret a záložiek zatvorených jednotiek) a adresár projektu obsahuje mnoho súborov .ppu a .o, a tiež .exe. A práve príkaz Publikuj projekt vytvorí súbor .lpi len so základnými informáciami a všetky zdrojové kódy, so všetkých podadresárov.<br />
<br />
V ponúknutom dialógu môžete nastaviť filter pre zahrnutie/vynechanie, či pre kompresiu výstupu do jediného archívu.<br />
<br />
==Spolupracovníci==<br />
This page has been converted from the epikwiki [http://lazarus-ccr.sourceforge.net/index.php?wiki=LazarusIdeTools version].<br />
* Created page and initial template - 4/6/2004 [[User:Tom Lisjac| VlxAdmin]]<br />
* Initial content posted - 4/10/2004 MattiasG<br />
* Small wiki and formatting fixes - 4/11/2004 [[User:Tom Lisjac| VlxAdmin]]<br />
* Added a summary table for IdeTools shortcuts - 12 July 2004 [[User:Kirkpatc]]<br />
* Preložené z originálu [[Lazarus IDE Tools]] - [[User:Slavko|Slavko]] 13:51, 25 Mar 2005 (PST)</div>Slavkohttps://wiki.freepascal.org/index.php?title=Lazarus_IDE_Tools/sk&diff=26872Lazarus IDE Tools/sk2008-02-17T20:08:25Z<p>Slavko: úprava nadpisu</p>
<hr />
<div>{{Lazarus IDE Tools}}<br />
<br />
==Úvod==<br />
IDE používa knižnicu analýzy zdrojového kódu Pascal a editačných nástrojov, zvanú "codetools". Tieto nástroje poskytujú funkcie ako hľadanie deklarácie (find declaration), dokončovanie kódu (code completion), odstraňovanie, presúvanie, vkladanie a formátovanie zdrojového kódu Pascal. Tieto funkcie šetria množstvo času a duplicitných úloh. Sú nastaviteľné a každá funkcia je dostupná pomocou klávesovej skratky (viď Editor Options).<br />
<br />
Pretože ich práca záleží na zdrojovom kóde a pochopení FreePascal, Delphi a Kylix kódu, nevyžadujú preložené jednotky ani nainštalovaný prekladač Borland. Môžete naraz upravovať kód Delphi aj FreePascal. Môžete dokonca pracovať s rôznymi verziami Delphi a FreePascal súčasne. Tým sa stáva prenos Delphi kódu ešte jednoduchší.<br />
<br />
==Zhrnutie klávesových skratiek IDE==<br />
{|<br />
|-<br />
| [[Lazarus IDE Tools/sk#Hľadanie_deklarácie | Hľadanie deklarácie]] (Declaration Jumping) || '''Ctrl+Click''' alebo '''Alt+Up'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Prepínanie_metód | Prepínanie metód]] (Method Jumping) || '''Ctrl+Shift+Up''' a '''Ctrl+Shift+Down'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Šablóny_kódu | Šablóny kódu]] (Code Templates) || '''Ctrl+J'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Dokončovanie_kódu | Dokončovanie kódu]] (Code/Class Completion) || '''Ctrl+Shift+C'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Dokončovanie_identifikátorov | Dokončovanie identifikátorov]] (Identifier Completion) || '''Ctrl+Medzerník'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Dokončovanie_slov | Dokončovanie slov]] (Word Completion) || '''Ctrl+W'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Pomoc_s_parametrami |Pomoc s parametrami]] (Parameter Hints) || '''Ctrl+Shift+Space'''<br />
|}<br />
<br />
==Prepínanie metód==<br />
(''Method Jumping'')<br />
<br />
Na prepínanie medzi telom procedúry (begin..end) a jej definíciou (procedure Name;) použite Ctrl+Shift+Up.<br />
<br />
Príklad:<br />
<pascal><br />
interface<br />
<br />
procedure DoSomething; // procedure definition<br />
<br />
implementation<br />
<br />
procedure DoSomething; // procedure body <br />
begin<br />
end;<br />
</pascal><br />
<br />
Ak je kurzor v tele provedúry a stlačíte Ctrl+Shift+Up, kurzor skočí na definíciu. Ak znova stlačíte Ctrl+Shift+Up preskočí do tela procedúry, za 'begin'. Funkcia pracuje aj s metódami (procedúrami v triedach).<br />
<br />
Tipy:<br />
'Method Jumping' presúva kurzor na rovnakú procedúru s rovnakým menom i zoznamom parametrov. Ak presná procedúra neexistuje, skočí na najpodobnejšiu a umiestni kurzor na prvý rozdiel. V Delphi táto funkcia neexistuje.<br />
<br />
Príklad procedúry s rôznymi typmi parametrov:<br />
<pascal><br />
interface<br />
<br />
procedure DoSomething(p: char); // procedure definition<br />
<br />
implementation<br />
<br />
procedure DoSomething(p: string); // procedure body<br />
begin<br />
end;<br />
</pascal><br />
<br />
Preskočenie z definície do tela umiestni kurzor na kľúčové slovo 'string'. Túto vlastnosť môžete využiť na premenovanie metódy a/alebo zmenu jej parametrov.<br />
<br />
Príklad:<br />
Premenovali sme 'DoSomething' na 'MakeIt':<br />
<pascal> interface<br />
<br />
procedure MakeIt; // procedure definition<br />
<br />
implementation<br />
<br />
procedure DoSomething; // procedure body<br />
begin<br />
end;<br />
</pascal><br />
<br />
Potom urobte skok z definície MakeIt do tela. IDE hľadá vhodné telo, nenájde žiadne, preto začne hľadať kandidátov. Keďže stepremenovali len jednu procedúru, tak je len jedno telo bez definície (DoSomething) a tak skočí do DoSomething a umiestni kurzor vpravo od 'DoSomething'. Potomm ju môžete jednoducho premenovať tiež. Toto rovnako pracuje s parametrami.<br />
<br />
==Include súbory==<br />
(''Include Files'')<br />
<br />
Include súbory sú súbory vložené do zdrojového kódu pomocou direktív prekladača {$I filename} alebo {$INCLUDE filename}. Lazarus a FreePascal používajú veľa takýchto vecí na redukciu nadbytočnosti a vyhnutie sa nečitateľnosti konštrukcií {$IFDEF} pri podpore rôznych platforiem.<br />
<br />
Narozdiel od Delphi, IDE Lazarus plne podporuje include súbory. Napríklad môžete skočiť z metódy v súbore .pas do tela metódy v include súbore. Všetky nástroje kódu, ako dokončovanie kódu, považuje include súbory za špeciálne hranice.<br />
<br />
Napríklad: keď dokončovanie kódu pridáva telo novej metódy za telom inej metódy, ponechá ich obe v rovnakom súbore. Týmto spôsobom môžete vložiť celú implementáciu triedy do include súborov, ako to robí LCL pre skoro všetky prvky.<br />
<br />
Ale je tu začiatočnícka chyba: Ak najprv otvoríte include súbor a skúsite prepínanie metód alebo hľadanie deklarácie, dostanete chybu. IDE nevie do ktorej jednotky include súbor patrí. Najprv musíte otvoriť jednotku.<br />
<br />
Hneď ako IDE zanalyzuje jednotku, zachytí v nej include direktívy a IDE si bude pamätať tento vzťah. Tieto informácie IDE ukladá pri skončení a pri uložení projektu do ~/.lazarus/includelinks.xml. Keď nabudúce otvoríte súbor include a urobíte skok do neho alebo hľadanie deklarácie, IDE interne otvorí jednotku a skoky budú fungovať.<br />
<br />
Tento mechanizmus má samozrejme obmedzenia, niektoré include súbory sú zahrnuté dva i viackrát. Napríklad: lcl/include/winapih.inc.<br />
Skákanie z definície procedúry/metódy v tomto include súbore do tela závisí na poslednej akcii. Ak ste pracovali v lcl/lclintf.pp, IDE skočí do winapi.inc. Ak ste pracovali v lcl/interfacebase.pp, potom skočíte do lcl/include/interfacebase.inc (alebo do jedného z ďalších include súborov). Ak pracujete s obomi, potom môže nastať zmätok. ;)<br />
<br />
==Šablóny kódu==<br />
(''Code Templates'')<br />
<br />
Šablóny kódu konvertujú identifikátor v texte alebo fragmente kódu. Šablóny kódu majú prednastavenú klávesovú skratku Ctrl+J. Môžete napísať identifikátor, stlačiť Ctrl+J a identifikátor je nahradený textom definovaným pre identifikátor. Šablóny kódu môžete definovať v Environment -> Editor Options -> CodeTools.<br />
<br />
Príklad:<br />
Napíšte identifikátor 'classf', ponechajte kurzor vpravo za 'f' a stlačte Ctrl+J. Identifikátor 'classf' bude nahradený týmto:<br />
<pascal><br />
T = class(T)<br />
private<br />
<br />
public<br />
constructor Create;<br />
destructor Destroy; override;<br />
end;<br />
</pascal><br />
<br />
a kurzor bude za 'T'.<br />
Zoznam šablón získate tak, že kurzor ponecháte na medzere (nie ne identifikátore) a stlačíte Ctrl+J. Pomocou kurzorových klávesov alebon apísania niekoľkých znakov vyberte jeden. Enter vytvorí zvolenú šablónu a Esc zatvorí zoznam.<br />
<br />
==Pomoc s parametrami==<br />
(''Parameter Hints'')<br />
Pomoc s parametrami ukazuje pomocné okno s deklaráciami parametrov aktuálneho zoznamu parametrov.<br />
<br />
Napríklad<br />
<pascal><br />
Canvas.FillRect(|);<br />
</pascal><br />
<br />
Umiestnite kurzor do zátvoriek a stlačte Ctrl+Shift+Space. Objaví sa pomocné okno, ukazujúce parametre FillRect.<br />
<br />
==Dokončovanie kódu==<br />
(''Code Completion'')<br />
<br />
Dokončovanie kódu nájdete v menu IDE Edit -> Complete Code a má štandartnú klávespvú skratku Ctrl+Shift+C.<br />
V Delphi je dokončovaním kódu volaná funkcia zobrazujúca zoznam identifikátorov na aktuálnej pozícii v zdrojovom kóde (Ctrl+Space). V Lazarus je toto nazývané dokončovanie identifikátorov (Identifier completion). Dokončovanie kódu v sebe združuje niekoľko užitočných funkcií:<br />
<br />
* '''Dokončovanie tried''' (Class Completion): dokončuje vlastnosti, pridáva telá metód, pridáva súkromné premenné a súkromné metódy;<br />
* '''Dokončovanie forward procedúr''' (Forward Procedure Completion): pridáva telá forward procedúr;<br />
* '''Dokončovanie priradenia udalostí''' (Event Assignment Completion): * dokončuje pridelenie udalostí a pridávanie tiel a definícií metód;<br />
* '''Dokončovanie lokálnych premenných''' (Local Variable Completion): pridáva definície lokálnych premenných.<br />
Ktorá funkcia je použitá, závisí na pozícii kurzora v editore zdrojového kódu.<br />
<br />
===Dokončovanie tried===<br />
(''Class Completion'')<br />
<br />
Veľmi výkonnou funkciou dokončovania kódu je "Dokončovanie tried". Vy píšete triedu, pridáte metódy a vlastnosti, a dokončovanie kódu pridá telá metód, metódy prístupu k vlastnostiam a súkromným premenným. <br />
<br />
Príklad:<br />
Vytvorte triedu (viz [[Lazarus IDE Tools/sk#Šablóny_kódu | Šablóny kódu]], aby ste ušetrili rovnakú prácu):<br />
<pascal> TExample = class(TObject)<br />
public<br />
constructor Create;<br />
destructor Destroy; override;<br />
end;</pascal><br />
<br />
Umiestnite kurzor niekde v definícii triedy a stlačte '''Ctrl+Shift+C'''. Tým budú vytvorené chýbajúce telá metód a kurzor bude presunutý na prvé vytvorené telo, takže môžete rovno začať písať kód triedy:<br />
<pascal> { TExample }<br />
<br />
constructor TExample.Create;<br />
begin<br />
|<br />
end;<br />
<br />
destructor TExample.Destroy;<br />
begin<br />
inherited Destroy;<br />
end;</pascal><br />
<br />
:'''Poznámka''': Značka '|' nie je pridaná, len ukazuje umiestnenie kurzora.<br />
<br />
Tip: Prepínať medzi telom a definíciou metódy môžete pomocou Ctrl+Shift+Up.<br />
<br />
Všimnite si, že IDE tiež pridáva volanie deštruktora základnej triedy (inherited Destroy). Toto je urobené, ak v definícii treidy použijete kľúčové slovo '''override'''.<br />
<br />
Teraz pridajte metódu '''DoSomething''':<br />
<pascal> TExample = class(TObject)<br />
public<br />
constructor Create;<br />
procedure DoSomething(i: integer);<br />
destructor Destroy; override;<br />
end;</pascal><br />
<br />
Potom stlačte '''Ctrl+Shift+C''' a IDE pridá:<br />
<pascal> procedure TExample.DoSomething(i: integer);<br />
begin<br />
|<br />
end;</pascal><br />
<br />
Ako môžete vidieť, nové telo metódy je vložené medzi Create a Destroy, presne ako je to v definícii. Týmto sú telá metód uchovávané v rovnakom logickom poradí, ako v definícii. Spôsob vkladania môžete definovať pomocou Prostredie > Voľby Codetools -> Tvorenie kódu.<br />
<br />
====Dokončovanie vlastností====<br />
Pridajte vlastnosť '''AnInteger''':<br />
<pascal> TExample = class(TObject)<br />
public<br />
constructor Create;<br />
procedure DoSomething(i: integer);<br />
destructor Destroy; override;<br />
property AnInteger;<br />
end;</pascal><br />
<br />
Stlačte Ctrl+Shift+C a dostanete:<br />
<pascal> procedure TExample.SetAnInteger(const AValue: integer);<br />
begin<br />
|if FAnInteger=AValue then exit;<br />
FAnInteger:=AValue;<br />
end;</pascal><br />
<br />
Dokončovanie kódu pridalo metódu pre prístup k zápisu do vlastnosti a nejaký základný kód.<br />
<br />
Preskočte do triedy pomocou '''Ctrl+Shift+C''' a uvidíte, že v triede pribudlo:<br />
<pascal> TExample = class(TObject)<br />
private<br />
FAnInteger: integer;<br />
procedure SetAnInteger(const AValue: integer);<br />
public<br />
constructor Create;<br />
procedure DoSomething(i: integer);<br />
destructor Destroy; override;<br />
property AnInteger: integer read FAnInteger write SetAnInteger;<br />
end;</pascal><br />
<br />
Vlastnosť bola rozšírená pridaním kľúčových slov '''Read''' a '''Write'''. V triede je nová sekcia '''private''' s premennou '''FAnInteger''' a metódou '''SetAnInteger'''. Pridanie '''F''' na začiatok privátnej premennej je bežnou notáciou Delphi, rovnako ako označenie prístupovej metódy pomocou '''Set'''. Ak to nechcete, môžete to zmeniť ponmocou Prostredie > Voľby Codetools -> Tvorenie kódu.<br />
<br />
Vytvorenie vlastnosti len na čítanie:<br />
<pascal> property PropName: PropType read;</pascal><br />
<br />
Bude rozšírené na:<br />
<pascal> property PropName: PropType read FPropName;</pascal><br />
<br />
Vytvorenie vlastnosti len pre zápis:<br />
<pascal> property PropName: PropType write;</pascal><br />
<br />
Bude rozšírené na:<br />
<pascal> property PropName: PropType write SetPropName;</pascal><br />
<br />
Vytvorenie read only vlastnosti s metódou na čítanie:<br />
<pascal> property PropName: PropType read GetPropName;</pascal><br />
<br />
Deklarácia ostane nezmenená, ale bude pridaná funkcia '''GetPropName''':<br />
<pascal> function GetpropName: PropType;</pascal><br />
<br />
Vytvorenie vlastnosti s direktívou '''stored''':<br />
<pascal> property PropName: PropType stored;</pascal><br />
<br />
Bude rozšírené na:<br />
<pascal> property PropName: PropType read FPropName write SetPropName stored PropNameIsStored;</pascal><br />
<br />
Pretože direktíva '''stored''' je používaná pre streamovanie čítania a zápisu, sú pridané aj kľúčové slová '''read''' a '''write'''.<br />
<br />
Tip:<br />
Dokončovanie identifikátorov tiež rozpoznáva nekompletné vlastnosti a navrhne predvolené mená. Napríklad:<br />
<pascal> property PropName: PropType read |;</pascal><br />
<br />
Umiestnite kurzor za medzeru za kľúčovým slovom '''read''' a stlačte Ctrl+Space pre dokončovanie identifikátorov. To vám ponúkne premennú '''FPropName''' a procedúru '''SetPropName'''.<br />
<br />
===Dokončovanie procedúr===<br />
(''Forward Procedure Completion'')<br />
<br />
Dokončovanie dopredných deklarácií procedúr je časťou dokončovania kódu a pridáva telá chýbajúcich procedúr, ktoré sú definované. Je vyvolané, ak je kurzor na pripravenej definícii procedúry, pomocou klávesovej skratky '''Ctrl+Shift+C'''.<br />
<br />
Napríklad:<br />
Pridajte novú procedúru do časti '''interface''':<br />
<pascal> procedure DoSomething;</pascal><br />
<br />
Umiestnite kurzor na ňu a stlačte '''Ctrl+Shift+C''' pre dokončovanie kódu. V časti '''implementation''' bude doplnené:<br />
<pascal> procedure DoSomething;<br />
begin<br />
|<br />
end;</pascal><br />
<br />
:Tip: Pomocou '''Ctrl+Shift+Up''' môžete prepínať medzi definíciou a telom procedúry.<br />
<br />
Telo novej procedúry bude pridané pred metódy tried. Ak už sú v časti '''interface''' nejaké definície procedúr, IDE sa pokúsi zachovať ich poradie, napríklad:<br />
<pascal> procedure Proc1;<br />
procedure Proc2; // nová procedúra<br />
procedure Proc3;</pascal><br />
<br />
Ak telá '''Proc1''' a '''Proc3''' už existujú, potom bude telo '''Proc2''' vložené medzi telá procedúr '''Proc1''' a '''Proc3'''. Toto správanie môže byť zmené pomocou '''Prostredie > Voľby Codetools -> Tvorenie kódu'''.<br />
<br />
Viacero procedúr:<br />
<pascal> procedure Proc1_Old; // telo existuje<br />
procedure Proc2_New; // telo neexistuje<br />
procedure Proc3_New; // "<br />
procedure Proc4_New; // "<br />
procedure Proc5_Old; // telo existuje</pascal><br />
<br />
Dokončovanie kódu pridá 3 telá procedúr (Proc2_New, Proc3_New, Proc4_New).<br />
<br />
Tento nástroj nepracuje len s procedúrami definovanými v časti '''interface''', ale aj s procedúrami, ktoré sú definované pomocou kľúčového slova '''forward'''.<br />
<br />
===Dokončovanie priradenia udalostí===<br />
(''Event Assignment Completion'')<br />
<br />
Dokončovanie priradenia udalostí je čsťou Dokončovania kódu a dokončuje jeden príkaz Event:=|. Nastáva, keď je kurzor umiestnený za príkazom priradenia udalosti a stlačíte '''Ctrl+Shift+C'''.<br />
<br />
;Napríklad:<br />
V metóde, povedzme udalosti FormCreate, pridajte riadok: 'OnPaint:=':<br />
<pascal> procedure TForm1.Form1Create(Sender: TObject);<br />
begin<br />
OnPaint:=|<br />
end;</pascal><br />
<br />
Značka '|' je umiestnenie kurzora a netreba ju zadávať.<br />
<br />
Potom stlačte '''Ctrl+Shift+C''' pre dokončovanie kódu. Príkaz priradenia udalosti bude doplnený takto:<br />
<pascal> OnPaint:=@Form1Paint;</pascal><br />
<br />
Do triedy '''TForm1''' bude pridaná nová metóda '''Form1Paint'''. Potom je spustené dokončovanie tried a dostanete:<br />
<pascal> procedure TForm1.Form1Paint(Sender: TObject);<br />
begin<br />
|<br />
end;</pascal><br />
<br />
Pracuje presne ako pridávanie metód v '''Inšpektore objektov'''.<br />
<br />
:'''Poznámka''': Kurzor musíte umiestniť za operátor priradenia ':='. Ak ho umiestnite na identifikátor (tj. '''OnPaint'''), dokončovanie kódu spustí Dokončovanie lokálnych premenných, ktoré zlyhá, pretože '''OnPaint''' je už definovaná.<br />
<br />
Tip:<br />
Môžete definovať meno novej metódi aj sami, a to jej zadaním do priradenia, napríklad:<br />
<pascal> OnPaint:=@ThePaintMethod;</pascal><br />
<br />
===Dokončovanie deklarácie premenných===<br />
(''Variable Declaration Completion'')<br />
<br />
Dokončovanie deklarácie premenných je časťou '''Dokončovania kódu''' a pridáva definíciu lokálnej premennej pre príkaz Identifier:=Term;. Dokončovanie deklarácie premenných je vyvolané, keď je kurzor umiestnený na identifikátore v priradení.<br />
<br />
Napríklad:<br />
<pascal><br />
procedure TForm1.Form1Create(Sender: TObject);<br />
begin<br />
i:=3;<br />
end;<br />
</pascal><br />
<br />
Umiestnite kurzor na 'i' alebo tesne za neho, potom stlačte Ctrl+Shift+C pre dokončovanie kódu a dostanete:<br />
<pascal><br />
procedure TForm1.Form1Create(Sender: TObject);<br />
var<br />
i: Integer;<br />
begin<br />
i:=3;<br />
end;<br />
</pascal><br />
<br />
Nástroj dokončovania kódu najprv skontroluje, či identifikátor 'i' už nie je definovaný a ak nie, pridá deklaráciu 'var i: integer;'. Typ identifikátora je odhadovaný podľa pravej strany príkazu priradenia. Čísla ako 3 sú identifikované ako Integer.<br />
<br />
Iný príklad:<br />
<pascal><br />
type<br />
TWhere = (Behind, Middle, InFront);<br />
<br />
procedure TForm1.Form1Create(Sender: TObject);<br />
var<br />
a: array[TWhere] of char;<br />
begin<br />
for Where:=Low(a) to High(a) do writeln(a[Where]);<br />
end;<br />
</pascal><br />
<br />
Umiestnite kurzor na 'Where' a stlačte Ctrl+Shift+C pre dokončenie kódu. Dostanete:<br />
<pascal><br />
procedure TForm1.Form1Create(Sender: TObject);<br />
var<br />
a: array[TWhere] of char;<br />
Where: TWhere;<br />
begin<br />
for Where:=Low(a) to High(a) do writeln(a[Where]);<br />
end;<br />
</pascal><br />
<br />
===Spätné dokončovanie triedy===<br />
(''Reversed Class Completion'')<br />
Spätné dokončovanie triedy je časťou '''Dokončovania kódu''' a pridáva deklarácie súkromných metód pre aktuálne telo metódy. Je vyvolané, keď je kurzor v tele metódy, zatiaľ nie je definované pre triedy.<br />
<br />
Táto vlastnosť je dostupná od 0.9.21.<br />
<br />
Napríklad:<br />
<pascal><br />
procedure TForm1.DoSomething(Sender: TObject);<br />
begin<br />
end;<br />
</pascal><br />
<br />
Metóda DoSomething zatiaľ nie je v TForm1 deklarovaná. Stlačte Ctrl+Shift+C a IDE pridá "procedure DoSomething(Sender: TObject);" k súkromným metódam triedy TForm1.<br />
<br />
Pre Delphianov:<br />
Dokončovanie tried pracuje pod Lazarus vždy jednym spôsobom:<br />
*Z rozhrania triedy do jej implementácie alebo naopak z implementácie triedy do jej rozhrania. Delphi vždy vyvoláva oba smery. Poszup v Delphi má nevýhodu, že ak dôjde k preklepu, ľahko vytvoríte bez upozornenia zvyšok novej metódy.<br />
<br />
===Komentáre a dokončovanie kódu===<br />
(''Comments and Code Completion'')<br />
<br />
Dokončovanie kódu sa pokúša uchovávať komentáre tam, kde sú. <br />
Príklad:<br />
<pascal><br />
FList: TList; // zoznam prvkov TComponent<br />
FInt: integer;<br />
</pascal><br />
<br />
Pri vkladaní novej premennej medzi FList a FInt, je komentár ponechaný na riadku spolu s FList. To platí i pre:<br />
<pascal><br />
FList: TList; { zoznam prvkov TComponent<br />
Toto je komentár na niekoľkých riadkoch, začínajúci<br />
na riadku s FList, tak nástroj dokončenia kódu predpokladá že patrí <br />
k riadku s FList a nepreruší tento vzťah.<br />
Kód bude vložený za komentár. }<br />
FInt: integer;<br />
</pascal><br />
<br />
Ak komentár začína na ďalšom riadku:<br />
<pascal><br />
FList: TList; // zoznam prvkov TComponent<br />
{ Tento komentár patrí k nasledujúcemu riadku. <br />
Nový kód je vložený pred tentokomentár a <br />
za komentár na riadku s FList. }<br />
FInt: integer;<br />
</pascal><br />
<br />
==Refactoring==<br />
<br />
===Otočenie priradenie===<br />
(''Invert Assignments'')<br />
<br />
Otočenie priradenia pracuje s vybratými príkazmi Pascalu a obracia všetky priradenia z tohoto výberu. Tento nástroj je užitočný pre transformáciu "save" kódu na "load" a naopak.<br />
<br />
Príklad:<br />
<pascal> procedure DoSomething;<br />
begin<br />
AValueStudio:= BValueStudio;<br />
AValueAppartment :=BValueAppartment;<br />
AValueHouse:=BValueHouse;<br />
end;<br />
</pascal><br />
<br />
Vyberte riadky s priradeniami (medzi begin a end) a urobte Otočenie priradenia, všetky priradenia budú otočené a automaticky odsadené. Výsledok:<br />
<pascal><br />
procedure DoSomething;<br />
begin<br />
BValueStudio := AValueStudio;<br />
BValueAppartment := AValueAppartment;<br />
BValueHouse := AValueHouse;<br />
end;<br />
</pascal><br />
<br />
=== Uzavrieť výber ===<br />
<br />
Vyberte nejaký text a vyvolajte nástroj. Zobrazí sa dialóg, kde si môžete vybrať či má výber uzatvorený medzi '''try..finally''' ale do mnoho iných blokov.<br />
<br />
=== Premenovať identifikátor ===<br />
<br />
Umiestnite kurzor na identifikátor a vyvolajte tento nástroj, obaví sa dialóg, v ktorom môžete nastaviť rozsah hľadania a nové meno identifikátora. <br />
* premenované budú všetky výskyty a len tie, ktoré momentálne používajú túto deklaráciu, čiže edklarácie s rovnakým menom nebudú premenované. <br />
* najprv bude vykonaná kontrola konfliktov mena. <br />
* Obmedzenia: Pracuje len so zdrojovými kódmi Pascalu, zatiaľ nepremenúva súbory ani neupravuje súbory lfm/lrs, či súbory lazdoc.<br />
<br />
=== Nájdi odkazy na identifikátor ===<br />
<br />
Umiestnite kurzor na identifikátor a vyvolajte nástroj. Objaví sa dialóg, v ktorom môžete nastaviť rozsah hľadania. IDE bude hľadať všetky výskyty a len tie, ktoré používajú aktuálnu deklaráciu. Čiže iné deklarácia s rovnakým menom, nebudú zobrazené.<br />
<br />
=== Zobraziť abstraktné metódy ===<br />
<br />
Táto funkcia vypisuje a automaticky kompletuje virtuálne, abstraktné metódy, ktoré je majú byť implementované.<br />
<br />
Umiestnite kurzor na deklaráciu triedu a vyvolajte nástroj. Ak existujú nejaké chýbajúce abstraktné metódy, nude zobrazený dialóg s ich zoznamom. Zvoľte metódy pre implementovanie a IDE vytvorí základy metód.<br />
<br />
=== Vytiahnuť procedúru ===<br />
Viz [[IDE_Window:_Extract_Procedure/sk|Extract Procedure]]<br />
<br />
==Hľadanie deklarácie==<br />
(''Find Declaration'')<br />
<br />
Umiestnite kurzor na identifikátor a urobte Hľadanie deklarácie, tým bude nájdená deklarácia tohoto identifikátora, prípadne otvorený príslušný súbor a kurzor bude premiestnený na miesto deklarácie.<br />
<br />
Každé hľadanie deklarácie nastavuje bod skoku. Tzn. po skoku na nájdenú deklaráciu môžete jednoduchos skočiť naspäť pomocou Search -> Jump back.<br />
<br />
Oproti Delphi má nástroj isté rozdiely:<br />
Nástroj pracuje so zdrojovým kódom na základe pravidiel Pascalu, a nie s výsledkom prekladača. The compiler returns the final type. Nástroj prezerá zdrojové kódy a všetky kroky medzi. Napríklad:<br />
<br />
: Vlastnosť 'Visible' je najprv definovaná v TControl (controls.pp), potom je predefinovaná v TCustomForm a nakoniec predefinovaná aj v TForm. Spustenie hľadania deklarácie vlastnosti Visible vás najprv presunie na Visible v TForm. Potom môžete spustiť hľadanie deklarácie znova a skočíte na Visible v TCustomForm a znova pre skočenie na Visible v TControl.<br />
<br />
Obdobne je to s TColor.<br />
Pre prekladač je to jednoducho 'longint', ale v zdrojovom kóde je to definované ako:<br />
<pascal><br />
TGraphicsColor = -$7FFFFFFF-1..$7FFFFFFF;<br />
TColor = TGraphicsColor;<br />
</pascal><br />
<br />
Obdobné je to aj s forward definovanými triedami:<br />
Napríklad v TControl je priávtna premenná<br />
<pascal><br />
FHostDockSite: TWinControl;<br />
</pascal><br />
<br />
Hľadanie deklarácie pre TWinControl skočí na forward definíciu:<br />
<pascal><br />
TWinControl = class;<br />
</pascal><br />
<br />
A opätovné spustenie hľadania deklarácie skočí na skutočnú implementáciu:<br />
<pascal><br />
TWinControl = class(TControl)<br />
</pascal><br />
<br />
Týmto spôsobom môžete stopovať každý identifikátor a nájsť každé predefinovanie, či preťaženie.<br />
<br />
==Dokončovanie identifikátorov==<br />
(''Identifier Completion'')<br />
<br />
Dokončovanie identifikátorov je vyvolané pomocou Ctrl+Space a zobrazuje všetky vyhovujúce identifikátory. <br />
<br />
Napríklad:<br />
<pascal><br />
procedure TForm1.FormCreate(Sender: TObject);<br />
begin<br />
|<br />
end;<br />
</pascal><br />
<br />
Umiestnite kurzor medzi ''begin'' a ''end'' a stlačte Ctrl+Space. Nástroj IDE spracuje celý dosiahnuteľný kód a zobrazí zoznam všetkých nájdených identifikátorov. CodeTools kešuje výsledok, takže druhý krát bude oveľa rýchlejší.<br />
<br />
'''Poznámka pre Delphianov:''' Delphi to volá ''Dokončovanie kódu''.<br />
<br />
Niektoré identifikátory, ako 'Write', 'ReadLn', 'Low', 'SetLength', 'Self', 'Result', 'Copy' sú zabudované v prekladači a teda nie sú definované nikde v zdrojovom kóde, al Dokončovanie identifikátorov má veľa z nich tež zabudovaných. Ak nájdete nejaký chýbajúci, jednoducho vytvorte požiadadvku na vlastnosť v sledovači chýb (''bug tracker'').<br />
<br />
Dokončovanie identifikátorov nedokončuje kľúčové slová, takže ho nemožno použiť na dokončenie proc' na 'procedure'. Na toto je určené Ctrl+W [[#Dokončovanie_slov|Dokončovanie slov]] alebo Ctrl+J [[#Šablóny_kódu|Šablóny kódu]].<br />
<br />
Dokončovanie identifikátorov nezobrazuje len tie identifikátory, ktoré nie sú kompatibilné.<br />
<br />
===Predpona===<br />
Môžete začať dokončovanie identifikátorov v existujúcom slove. Potom budú písmená vľavo od kurzora brané ako predpona. <br />
<br />
Napríklad:<br />
<pascal><br />
procedure TForm1.FormCreate(Sender: TObject);<br />
begin<br />
Ca|ption<br />
end;<br />
</pascal><br />
<br />
Okno bude zobrazovať len identifikátory začínajúce sa na 'Ca'.<br />
<br />
===Klávesy===<br />
<br />
* Písmená/čísla: pridávajú znak do editora zdrojového kódu a aktuálnej predpony, čo zároveň aktualizuje zoznam.<br />
* Backspace: odstraňuje posledný znak z editora zdrojového kódu a aktuálnej predpony, čo zároveň aktualizuje zoznam.<br />
* Return: nahradzuje celé slovo na kurzore zvoleným identifikátorom a zatvára vyskakovacie okno.<br />
* Shift+Return: as ''Return'', but replaces only the prefix (left part) of the word at the cursor.<br />
* Hore/Dole: presúva výber.<br />
* Esc: zatvára vyskakovacie okno bez zmeny.<br />
* Tab: dokončuje predponu na ďalšiu voľbu. Napríklad: aktuálna predpona je 'But' a dokončovanie identifikátora zobrazuje len 'Button1' a 'Button1Click', potom stlačenie ''Tab'' dokončí predponu na 'Button1'.<br />
* Else: ako ''Return'' a pridá znak do editora zdrojového kódu.<br />
<br />
==Dokončovanie slov==<br />
(''Word Completion'')<br />
<br />
Dokončovanie slov je vyvolané stlačením Ctrl+W a zobrazuje všetky slová všetkých aktuálne otvorených editorov. Inak pracuje presne ako Dokončovanie identifikátorov.<br />
<br />
==Prejdi do direktívy include==<br />
(''Goto Include Directive'')<br />
<br />
Tento príkaz v menu Searchskočí do príkazu (direktívy) {$I filename}, v ktorej je použitý aktuálny súbor.<br />
<br />
==Publikuj Projekt==<br />
Vytvára kópiu celého projektu. Ak chcete niekomu poslať len zdrojové kódy a nastavenia prekladača pre svoj kód, budete kamarátis touto funkciou.<br />
<br />
Bežný adresár projektu obsahuje množstvo informácií. Väčšinu z nich publikovať netreba. Súbor .lpi obsahuje informácie o relácii (ako pozíciu caret a záložiek zatvorených jednotiek) a adresár projektu obsahuje mnoho súborov .ppu a .o, a tiež .exe. A práve príkaz Publikuj projekt vytvorí súbor .lpi len so základnými informáciami a všetky zdrojové kódy, so všetkých podadresárov.<br />
<br />
V ponúknutom dialógu môžete nastaviť filter pre zahrnutie/vynechanie, či pre kompresiu výstupu do jediného archívu.<br />
<br />
==Spolupracovníci==<br />
This page has been converted from the epikwiki [http://lazarus-ccr.sourceforge.net/index.php?wiki=LazarusIdeTools version].<br />
* Created page and initial template - 4/6/2004 [[User:Tom Lisjac| VlxAdmin]]<br />
* Initial content posted - 4/10/2004 MattiasG<br />
* Small wiki and formatting fixes - 4/11/2004 [[User:Tom Lisjac| VlxAdmin]]<br />
* Added a summary table for IdeTools shortcuts - 12 July 2004 [[User:Kirkpatc]]<br />
* Preložené z originálu [[Lazarus IDE Tools]] - [[User:Slavko|Slavko]] 13:51, 25 Mar 2005 (PST)</div>Slavkohttps://wiki.freepascal.org/index.php?title=Lazarus_IDE_Tools/sk&diff=26871Lazarus IDE Tools/sk2008-02-17T20:08:04Z<p>Slavko: úprava nadpisu</p>
<hr />
<div>{{Lazarus IDE Tools}}<br />
<br />
==Úvod==<br />
IDE používa knižnicu analýzy zdrojového kódu Pascal a editačných nástrojov, zvanú "codetools". Tieto nástroje poskytujú funkcie ako hľadanie deklarácie (find declaration), dokončovanie kódu (code completion), odstraňovanie, presúvanie, vkladanie a formátovanie zdrojového kódu Pascal. Tieto funkcie šetria množstvo času a duplicitných úloh. Sú nastaviteľné a každá funkcia je dostupná pomocou klávesovej skratky (viď Editor Options).<br />
<br />
Pretože ich práca záleží na zdrojovom kóde a pochopení FreePascal, Delphi a Kylix kódu, nevyžadujú preložené jednotky ani nainštalovaný prekladač Borland. Môžete naraz upravovať kód Delphi aj FreePascal. Môžete dokonca pracovať s rôznymi verziami Delphi a FreePascal súčasne. Tým sa stáva prenos Delphi kódu ešte jednoduchší.<br />
<br />
==Zhrnutie klávesových skratiek IDE==<br />
{|<br />
|-<br />
| [[Lazarus IDE Tools/sk#Hľadanie_deklarácie | Hľadanie deklarácie]] (Declaration Jumping) || '''Ctrl+Click''' alebo '''Alt+Up'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Prepínanie_metód | Prepínanie metód]] (Method Jumping) || '''Ctrl+Shift+Up''' a '''Ctrl+Shift+Down'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Šablóny_kódu | Šablóny kódu]] (Code Templates) || '''Ctrl+J'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Dokončovanie_kódu | Dokončovanie kódu]] (Code/Class Completion) || '''Ctrl+Shift+C'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Dokončovanie_identifikátorov | Dokončovanie identifikátorov]] (Identifier Completion) || '''Ctrl+Medzerník'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Dokončovanie_slov | Dokončovanie slov]] (Word Completion) || '''Ctrl+W'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Pomoc_s_parametrami |Pomoc s parametrami]] (Parameter Hints) || '''Ctrl+Shift+Space'''<br />
|}<br />
<br />
==Prepínanie metód==<br />
(''Method Jumping'')<br />
<br />
Na prepínanie medzi telom procedúry (begin..end) a jej definíciou (procedure Name;) použite Ctrl+Shift+Up.<br />
<br />
Príklad:<br />
<pascal><br />
interface<br />
<br />
procedure DoSomething; // procedure definition<br />
<br />
implementation<br />
<br />
procedure DoSomething; // procedure body <br />
begin<br />
end;<br />
</pascal><br />
<br />
Ak je kurzor v tele provedúry a stlačíte Ctrl+Shift+Up, kurzor skočí na definíciu. Ak znova stlačíte Ctrl+Shift+Up preskočí do tela procedúry, za 'begin'. Funkcia pracuje aj s metódami (procedúrami v triedach).<br />
<br />
Tipy:<br />
'Method Jumping' presúva kurzor na rovnakú procedúru s rovnakým menom i zoznamom parametrov. Ak presná procedúra neexistuje, skočí na najpodobnejšiu a umiestni kurzor na prvý rozdiel. V Delphi táto funkcia neexistuje.<br />
<br />
Príklad procedúry s rôznymi typmi parametrov:<br />
<pascal><br />
interface<br />
<br />
procedure DoSomething(p: char); // procedure definition<br />
<br />
implementation<br />
<br />
procedure DoSomething(p: string); // procedure body<br />
begin<br />
end;<br />
</pascal><br />
<br />
Preskočenie z definície do tela umiestni kurzor na kľúčové slovo 'string'. Túto vlastnosť môžete využiť na premenovanie metódy a/alebo zmenu jej parametrov.<br />
<br />
Príklad:<br />
Premenovali sme 'DoSomething' na 'MakeIt':<br />
<pascal> interface<br />
<br />
procedure MakeIt; // procedure definition<br />
<br />
implementation<br />
<br />
procedure DoSomething; // procedure body<br />
begin<br />
end;<br />
</pascal><br />
<br />
Potom urobte skok z definície MakeIt do tela. IDE hľadá vhodné telo, nenájde žiadne, preto začne hľadať kandidátov. Keďže stepremenovali len jednu procedúru, tak je len jedno telo bez definície (DoSomething) a tak skočí do DoSomething a umiestni kurzor vpravo od 'DoSomething'. Potomm ju môžete jednoducho premenovať tiež. Toto rovnako pracuje s parametrami.<br />
<br />
==Include súbory==<br />
(''Include Files'')<br />
<br />
Include súbory sú súbory vložené do zdrojového kódu pomocou direktív prekladača {$I filename} alebo {$INCLUDE filename}. Lazarus a FreePascal používajú veľa takýchto vecí na redukciu nadbytočnosti a vyhnutie sa nečitateľnosti konštrukcií {$IFDEF} pri podpore rôznych platforiem.<br />
<br />
Narozdiel od Delphi, IDE Lazarus plne podporuje include súbory. Napríklad môžete skočiť z metódy v súbore .pas do tela metódy v include súbore. Všetky nástroje kódu, ako dokončovanie kódu, považuje include súbory za špeciálne hranice.<br />
<br />
Napríklad: keď dokončovanie kódu pridáva telo novej metódy za telom inej metódy, ponechá ich obe v rovnakom súbore. Týmto spôsobom môžete vložiť celú implementáciu triedy do include súborov, ako to robí LCL pre skoro všetky prvky.<br />
<br />
Ale je tu začiatočnícka chyba: Ak najprv otvoríte include súbor a skúsite prepínanie metód alebo hľadanie deklarácie, dostanete chybu. IDE nevie do ktorej jednotky include súbor patrí. Najprv musíte otvoriť jednotku.<br />
<br />
Hneď ako IDE zanalyzuje jednotku, zachytí v nej include direktívy a IDE si bude pamätať tento vzťah. Tieto informácie IDE ukladá pri skončení a pri uložení projektu do ~/.lazarus/includelinks.xml. Keď nabudúce otvoríte súbor include a urobíte skok do neho alebo hľadanie deklarácie, IDE interne otvorí jednotku a skoky budú fungovať.<br />
<br />
Tento mechanizmus má samozrejme obmedzenia, niektoré include súbory sú zahrnuté dva i viackrát. Napríklad: lcl/include/winapih.inc.<br />
Skákanie z definície procedúry/metódy v tomto include súbore do tela závisí na poslednej akcii. Ak ste pracovali v lcl/lclintf.pp, IDE skočí do winapi.inc. Ak ste pracovali v lcl/interfacebase.pp, potom skočíte do lcl/include/interfacebase.inc (alebo do jedného z ďalších include súborov). Ak pracujete s obomi, potom môže nastať zmätok. ;)<br />
<br />
==Šablóny kódu==<br />
(''Code Templates'')<br />
<br />
Šablóny kódu konvertujú identifikátor v texte alebo fragmente kódu. Šablóny kódu majú prednastavenú klávesovú skratku Ctrl+J. Môžete napísať identifikátor, stlačiť Ctrl+J a identifikátor je nahradený textom definovaným pre identifikátor. Šablóny kódu môžete definovať v Environment -> Editor Options -> CodeTools.<br />
<br />
Príklad:<br />
Napíšte identifikátor 'classf', ponechajte kurzor vpravo za 'f' a stlačte Ctrl+J. Identifikátor 'classf' bude nahradený týmto:<br />
<pascal><br />
T = class(T)<br />
private<br />
<br />
public<br />
constructor Create;<br />
destructor Destroy; override;<br />
end;<br />
</pascal><br />
<br />
a kurzor bude za 'T'.<br />
Zoznam šablón získate tak, že kurzor ponecháte na medzere (nie ne identifikátore) a stlačíte Ctrl+J. Pomocou kurzorových klávesov alebon apísania niekoľkých znakov vyberte jeden. Enter vytvorí zvolenú šablónu a Esc zatvorí zoznam.<br />
<br />
==Pomoc s parametrami==<br />
(''Parameter Hints'')<br />
Pomoc s parametrami ukazuje pomocné okno s deklaráciami parametrov aktuálneho zoznamu parametrov.<br />
<br />
Napríklad<br />
<pascal><br />
Canvas.FillRect(|);<br />
</pascal><br />
<br />
Umiestnite kurzor do zátvoriek a stlačte Ctrl+Shift+Space. Objaví sa pomocné okno, ukazujúce parametre FillRect.<br />
<br />
==Dokončovanie kódu==<br />
(''Code Completion'')<br />
<br />
Dokončovanie kódu nájdete v menu IDE Edit -> Complete Code a má štandartnú klávespvú skratku Ctrl+Shift+C.<br />
V Delphi je dokončovaním kódu volaná funkcia zobrazujúca zoznam identifikátorov na aktuálnej pozícii v zdrojovom kóde (Ctrl+Space). V Lazarus je toto nazývané dokončovanie identifikátorov (Identifier completion). Dokončovanie kódu v sebe združuje niekoľko užitočných funkcií:<br />
<br />
* '''Dokončovanie tried''' (Class Completion): dokončuje vlastnosti, pridáva telá metód, pridáva súkromné premenné a súkromné metódy;<br />
* '''Dokončovanie forward procedúr''' (Forward Procedure Completion): pridáva telá forward procedúr;<br />
* '''Dokončovanie priradenia udalostí''' (Event Assignment Completion): * dokončuje pridelenie udalostí a pridávanie tiel a definícií metód;<br />
* '''Dokončovanie lokálnych premenných''' (Local Variable Completion): pridáva definície lokálnych premenných.<br />
Ktorá funkcia je použitá, závisí na pozícii kurzora v editore zdrojového kódu.<br />
<br />
===Dokončovanie tried===<br />
(''Class Completion'')<br />
<br />
Veľmi výkonnou funkciou dokončovania kódu je "Dokončovanie tried". Vy píšete triedu, pridáte metódy a vlastnosti, a dokončovanie kódu pridá telá metód, metódy prístupu k vlastnostiam a súkromným premenným. <br />
<br />
Príklad:<br />
Vytvorte triedu (viz [[Lazarus IDE Tools/sk#Šablóny_kódu | Šablóny kódu]], aby ste ušetrili rovnakú prácu):<br />
<pascal> TExample = class(TObject)<br />
public<br />
constructor Create;<br />
destructor Destroy; override;<br />
end;</pascal><br />
<br />
Umiestnite kurzor niekde v definícii triedy a stlačte '''Ctrl+Shift+C'''. Tým budú vytvorené chýbajúce telá metód a kurzor bude presunutý na prvé vytvorené telo, takže môžete rovno začať písať kód triedy:<br />
<pascal> { TExample }<br />
<br />
constructor TExample.Create;<br />
begin<br />
|<br />
end;<br />
<br />
destructor TExample.Destroy;<br />
begin<br />
inherited Destroy;<br />
end;</pascal><br />
<br />
:'''Poznámka''': Značka '|' nie je pridaná, len ukazuje umiestnenie kurzora.<br />
<br />
Tip: Prepínať medzi telom a definíciou metódy môžete pomocou Ctrl+Shift+Up.<br />
<br />
Všimnite si, že IDE tiež pridáva volanie deštruktora základnej triedy (inherited Destroy). Toto je urobené, ak v definícii treidy použijete kľúčové slovo '''override'''.<br />
<br />
Teraz pridajte metódu '''DoSomething''':<br />
<pascal> TExample = class(TObject)<br />
public<br />
constructor Create;<br />
procedure DoSomething(i: integer);<br />
destructor Destroy; override;<br />
end;</pascal><br />
<br />
Potom stlačte '''Ctrl+Shift+C''' a IDE pridá:<br />
<pascal> procedure TExample.DoSomething(i: integer);<br />
begin<br />
|<br />
end;</pascal><br />
<br />
Ako môžete vidieť, nové telo metódy je vložené medzi Create a Destroy, presne ako je to v definícii. Týmto sú telá metód uchovávané v rovnakom logickom poradí, ako v definícii. Spôsob vkladania môžete definovať pomocou Prostredie > Voľby Codetools -> Tvorenie kódu.<br />
<br />
====Dokončovanie vlastností====<br />
Pridajte vlastnosť '''AnInteger''':<br />
<pascal> TExample = class(TObject)<br />
public<br />
constructor Create;<br />
procedure DoSomething(i: integer);<br />
destructor Destroy; override;<br />
property AnInteger;<br />
end;</pascal><br />
<br />
Stlačte Ctrl+Shift+C a dostanete:<br />
<pascal> procedure TExample.SetAnInteger(const AValue: integer);<br />
begin<br />
|if FAnInteger=AValue then exit;<br />
FAnInteger:=AValue;<br />
end;</pascal><br />
<br />
Dokončovanie kódu pridalo metódu pre prístup k zápisu do vlastnosti a nejaký základný kód.<br />
<br />
Preskočte do triedy pomocou '''Ctrl+Shift+C''' a uvidíte, že v triede pribudlo:<br />
<pascal> TExample = class(TObject)<br />
private<br />
FAnInteger: integer;<br />
procedure SetAnInteger(const AValue: integer);<br />
public<br />
constructor Create;<br />
procedure DoSomething(i: integer);<br />
destructor Destroy; override;<br />
property AnInteger: integer read FAnInteger write SetAnInteger;<br />
end;</pascal><br />
<br />
Vlastnosť bola rozšírená pridaním kľúčových slov '''Read''' a '''Write'''. V triede je nová sekcia '''private''' s premennou '''FAnInteger''' a metódou '''SetAnInteger'''. Pridanie '''F''' na začiatok privátnej premennej je bežnou notáciou Delphi, rovnako ako označenie prístupovej metódy pomocou '''Set'''. Ak to nechcete, môžete to zmeniť ponmocou Prostredie > Voľby Codetools -> Tvorenie kódu.<br />
<br />
Vytvorenie vlastnosti len na čítanie:<br />
<pascal> property PropName: PropType read;</pascal><br />
<br />
Bude rozšírené na:<br />
<pascal> property PropName: PropType read FPropName;</pascal><br />
<br />
Vytvorenie vlastnosti len pre zápis:<br />
<pascal> property PropName: PropType write;</pascal><br />
<br />
Bude rozšírené na:<br />
<pascal> property PropName: PropType write SetPropName;</pascal><br />
<br />
Vytvorenie read only vlastnosti s metódou na čítanie:<br />
<pascal> property PropName: PropType read GetPropName;</pascal><br />
<br />
Deklarácia ostane nezmenená, ale bude pridaná funkcia '''GetPropName''':<br />
<pascal> function GetpropName: PropType;</pascal><br />
<br />
Vytvorenie vlastnosti s direktívou '''stored''':<br />
<pascal> property PropName: PropType stored;</pascal><br />
<br />
Bude rozšírené na:<br />
<pascal> property PropName: PropType read FPropName write SetPropName stored PropNameIsStored;</pascal><br />
<br />
Pretože direktíva '''stored''' je používaná pre streamovanie čítania a zápisu, sú pridané aj kľúčové slová '''read''' a '''write'''.<br />
<br />
Tip:<br />
Dokončovanie identifikátorov tiež rozpoznáva nekompletné vlastnosti a navrhne predvolené mená. Napríklad:<br />
<pascal> property PropName: PropType read |;</pascal><br />
<br />
Umiestnite kurzor za medzeru za kľúčovým slovom '''read''' a stlačte Ctrl+Space pre dokončovanie identifikátorov. To vám ponúkne premennú '''FPropName''' a procedúru '''SetPropName'''.<br />
<br />
====Dokončovanie procedúr====<br />
(''Forward Procedure Completion'')<br />
<br />
Dokončovanie dopredných deklarácií procedúr je časťou dokončovania kódu a pridáva telá chýbajúcich procedúr, ktoré sú definované. Je vyvolané, ak je kurzor na pripravenej definícii procedúry, pomocou klávesovej skratky '''Ctrl+Shift+C'''.<br />
<br />
Napríklad:<br />
Pridajte novú procedúru do časti '''interface''':<br />
<pascal> procedure DoSomething;</pascal><br />
<br />
Umiestnite kurzor na ňu a stlačte '''Ctrl+Shift+C''' pre dokončovanie kódu. V časti '''implementation''' bude doplnené:<br />
<pascal> procedure DoSomething;<br />
begin<br />
|<br />
end;</pascal><br />
<br />
:Tip: Pomocou '''Ctrl+Shift+Up''' môžete prepínať medzi definíciou a telom procedúry.<br />
<br />
Telo novej procedúry bude pridané pred metódy tried. Ak už sú v časti '''interface''' nejaké definície procedúr, IDE sa pokúsi zachovať ich poradie, napríklad:<br />
<pascal> procedure Proc1;<br />
procedure Proc2; // nová procedúra<br />
procedure Proc3;</pascal><br />
<br />
Ak telá '''Proc1''' a '''Proc3''' už existujú, potom bude telo '''Proc2''' vložené medzi telá procedúr '''Proc1''' a '''Proc3'''. Toto správanie môže byť zmené pomocou '''Prostredie > Voľby Codetools -> Tvorenie kódu'''.<br />
<br />
Viacero procedúr:<br />
<pascal> procedure Proc1_Old; // telo existuje<br />
procedure Proc2_New; // telo neexistuje<br />
procedure Proc3_New; // "<br />
procedure Proc4_New; // "<br />
procedure Proc5_Old; // telo existuje</pascal><br />
<br />
Dokončovanie kódu pridá 3 telá procedúr (Proc2_New, Proc3_New, Proc4_New).<br />
<br />
Tento nástroj nepracuje len s procedúrami definovanými v časti '''interface''', ale aj s procedúrami, ktoré sú definované pomocou kľúčového slova '''forward'''.<br />
<br />
===Dokončovanie priradenia udalostí===<br />
(''Event Assignment Completion'')<br />
<br />
Dokončovanie priradenia udalostí je čsťou Dokončovania kódu a dokončuje jeden príkaz Event:=|. Nastáva, keď je kurzor umiestnený za príkazom priradenia udalosti a stlačíte '''Ctrl+Shift+C'''.<br />
<br />
;Napríklad:<br />
V metóde, povedzme udalosti FormCreate, pridajte riadok: 'OnPaint:=':<br />
<pascal> procedure TForm1.Form1Create(Sender: TObject);<br />
begin<br />
OnPaint:=|<br />
end;</pascal><br />
<br />
Značka '|' je umiestnenie kurzora a netreba ju zadávať.<br />
<br />
Potom stlačte '''Ctrl+Shift+C''' pre dokončovanie kódu. Príkaz priradenia udalosti bude doplnený takto:<br />
<pascal> OnPaint:=@Form1Paint;</pascal><br />
<br />
Do triedy '''TForm1''' bude pridaná nová metóda '''Form1Paint'''. Potom je spustené dokončovanie tried a dostanete:<br />
<pascal> procedure TForm1.Form1Paint(Sender: TObject);<br />
begin<br />
|<br />
end;</pascal><br />
<br />
Pracuje presne ako pridávanie metód v '''Inšpektore objektov'''.<br />
<br />
:'''Poznámka''': Kurzor musíte umiestniť za operátor priradenia ':='. Ak ho umiestnite na identifikátor (tj. '''OnPaint'''), dokončovanie kódu spustí Dokončovanie lokálnych premenných, ktoré zlyhá, pretože '''OnPaint''' je už definovaná.<br />
<br />
Tip:<br />
Môžete definovať meno novej metódi aj sami, a to jej zadaním do priradenia, napríklad:<br />
<pascal> OnPaint:=@ThePaintMethod;</pascal><br />
<br />
===Dokončovanie deklarácie premenných===<br />
(''Variable Declaration Completion'')<br />
<br />
Dokončovanie deklarácie premenných je časťou '''Dokončovania kódu''' a pridáva definíciu lokálnej premennej pre príkaz Identifier:=Term;. Dokončovanie deklarácie premenných je vyvolané, keď je kurzor umiestnený na identifikátore v priradení.<br />
<br />
Napríklad:<br />
<pascal><br />
procedure TForm1.Form1Create(Sender: TObject);<br />
begin<br />
i:=3;<br />
end;<br />
</pascal><br />
<br />
Umiestnite kurzor na 'i' alebo tesne za neho, potom stlačte Ctrl+Shift+C pre dokončovanie kódu a dostanete:<br />
<pascal><br />
procedure TForm1.Form1Create(Sender: TObject);<br />
var<br />
i: Integer;<br />
begin<br />
i:=3;<br />
end;<br />
</pascal><br />
<br />
Nástroj dokončovania kódu najprv skontroluje, či identifikátor 'i' už nie je definovaný a ak nie, pridá deklaráciu 'var i: integer;'. Typ identifikátora je odhadovaný podľa pravej strany príkazu priradenia. Čísla ako 3 sú identifikované ako Integer.<br />
<br />
Iný príklad:<br />
<pascal><br />
type<br />
TWhere = (Behind, Middle, InFront);<br />
<br />
procedure TForm1.Form1Create(Sender: TObject);<br />
var<br />
a: array[TWhere] of char;<br />
begin<br />
for Where:=Low(a) to High(a) do writeln(a[Where]);<br />
end;<br />
</pascal><br />
<br />
Umiestnite kurzor na 'Where' a stlačte Ctrl+Shift+C pre dokončenie kódu. Dostanete:<br />
<pascal><br />
procedure TForm1.Form1Create(Sender: TObject);<br />
var<br />
a: array[TWhere] of char;<br />
Where: TWhere;<br />
begin<br />
for Where:=Low(a) to High(a) do writeln(a[Where]);<br />
end;<br />
</pascal><br />
<br />
===Spätné dokončovanie triedy===<br />
(''Reversed Class Completion'')<br />
Spätné dokončovanie triedy je časťou '''Dokončovania kódu''' a pridáva deklarácie súkromných metód pre aktuálne telo metódy. Je vyvolané, keď je kurzor v tele metódy, zatiaľ nie je definované pre triedy.<br />
<br />
Táto vlastnosť je dostupná od 0.9.21.<br />
<br />
Napríklad:<br />
<pascal><br />
procedure TForm1.DoSomething(Sender: TObject);<br />
begin<br />
end;<br />
</pascal><br />
<br />
Metóda DoSomething zatiaľ nie je v TForm1 deklarovaná. Stlačte Ctrl+Shift+C a IDE pridá "procedure DoSomething(Sender: TObject);" k súkromným metódam triedy TForm1.<br />
<br />
Pre Delphianov:<br />
Dokončovanie tried pracuje pod Lazarus vždy jednym spôsobom:<br />
*Z rozhrania triedy do jej implementácie alebo naopak z implementácie triedy do jej rozhrania. Delphi vždy vyvoláva oba smery. Poszup v Delphi má nevýhodu, že ak dôjde k preklepu, ľahko vytvoríte bez upozornenia zvyšok novej metódy.<br />
<br />
===Komentáre a dokončovanie kódu===<br />
(''Comments and Code Completion'')<br />
<br />
Dokončovanie kódu sa pokúša uchovávať komentáre tam, kde sú. <br />
Príklad:<br />
<pascal><br />
FList: TList; // zoznam prvkov TComponent<br />
FInt: integer;<br />
</pascal><br />
<br />
Pri vkladaní novej premennej medzi FList a FInt, je komentár ponechaný na riadku spolu s FList. To platí i pre:<br />
<pascal><br />
FList: TList; { zoznam prvkov TComponent<br />
Toto je komentár na niekoľkých riadkoch, začínajúci<br />
na riadku s FList, tak nástroj dokončenia kódu predpokladá že patrí <br />
k riadku s FList a nepreruší tento vzťah.<br />
Kód bude vložený za komentár. }<br />
FInt: integer;<br />
</pascal><br />
<br />
Ak komentár začína na ďalšom riadku:<br />
<pascal><br />
FList: TList; // zoznam prvkov TComponent<br />
{ Tento komentár patrí k nasledujúcemu riadku. <br />
Nový kód je vložený pred tentokomentár a <br />
za komentár na riadku s FList. }<br />
FInt: integer;<br />
</pascal><br />
<br />
==Refactoring==<br />
<br />
===Otočenie priradenie===<br />
(''Invert Assignments'')<br />
<br />
Otočenie priradenia pracuje s vybratými príkazmi Pascalu a obracia všetky priradenia z tohoto výberu. Tento nástroj je užitočný pre transformáciu "save" kódu na "load" a naopak.<br />
<br />
Príklad:<br />
<pascal> procedure DoSomething;<br />
begin<br />
AValueStudio:= BValueStudio;<br />
AValueAppartment :=BValueAppartment;<br />
AValueHouse:=BValueHouse;<br />
end;<br />
</pascal><br />
<br />
Vyberte riadky s priradeniami (medzi begin a end) a urobte Otočenie priradenia, všetky priradenia budú otočené a automaticky odsadené. Výsledok:<br />
<pascal><br />
procedure DoSomething;<br />
begin<br />
BValueStudio := AValueStudio;<br />
BValueAppartment := AValueAppartment;<br />
BValueHouse := AValueHouse;<br />
end;<br />
</pascal><br />
<br />
=== Uzavrieť výber ===<br />
<br />
Vyberte nejaký text a vyvolajte nástroj. Zobrazí sa dialóg, kde si môžete vybrať či má výber uzatvorený medzi '''try..finally''' ale do mnoho iných blokov.<br />
<br />
=== Premenovať identifikátor ===<br />
<br />
Umiestnite kurzor na identifikátor a vyvolajte tento nástroj, obaví sa dialóg, v ktorom môžete nastaviť rozsah hľadania a nové meno identifikátora. <br />
* premenované budú všetky výskyty a len tie, ktoré momentálne používajú túto deklaráciu, čiže edklarácie s rovnakým menom nebudú premenované. <br />
* najprv bude vykonaná kontrola konfliktov mena. <br />
* Obmedzenia: Pracuje len so zdrojovými kódmi Pascalu, zatiaľ nepremenúva súbory ani neupravuje súbory lfm/lrs, či súbory lazdoc.<br />
<br />
=== Nájdi odkazy na identifikátor ===<br />
<br />
Umiestnite kurzor na identifikátor a vyvolajte nástroj. Objaví sa dialóg, v ktorom môžete nastaviť rozsah hľadania. IDE bude hľadať všetky výskyty a len tie, ktoré používajú aktuálnu deklaráciu. Čiže iné deklarácia s rovnakým menom, nebudú zobrazené.<br />
<br />
=== Zobraziť abstraktné metódy ===<br />
<br />
Táto funkcia vypisuje a automaticky kompletuje virtuálne, abstraktné metódy, ktoré je majú byť implementované.<br />
<br />
Umiestnite kurzor na deklaráciu triedu a vyvolajte nástroj. Ak existujú nejaké chýbajúce abstraktné metódy, nude zobrazený dialóg s ich zoznamom. Zvoľte metódy pre implementovanie a IDE vytvorí základy metód.<br />
<br />
=== Vytiahnuť procedúru ===<br />
Viz [[IDE_Window:_Extract_Procedure/sk|Extract Procedure]]<br />
<br />
==Hľadanie deklarácie==<br />
(''Find Declaration'')<br />
<br />
Umiestnite kurzor na identifikátor a urobte Hľadanie deklarácie, tým bude nájdená deklarácia tohoto identifikátora, prípadne otvorený príslušný súbor a kurzor bude premiestnený na miesto deklarácie.<br />
<br />
Každé hľadanie deklarácie nastavuje bod skoku. Tzn. po skoku na nájdenú deklaráciu môžete jednoduchos skočiť naspäť pomocou Search -> Jump back.<br />
<br />
Oproti Delphi má nástroj isté rozdiely:<br />
Nástroj pracuje so zdrojovým kódom na základe pravidiel Pascalu, a nie s výsledkom prekladača. The compiler returns the final type. Nástroj prezerá zdrojové kódy a všetky kroky medzi. Napríklad:<br />
<br />
: Vlastnosť 'Visible' je najprv definovaná v TControl (controls.pp), potom je predefinovaná v TCustomForm a nakoniec predefinovaná aj v TForm. Spustenie hľadania deklarácie vlastnosti Visible vás najprv presunie na Visible v TForm. Potom môžete spustiť hľadanie deklarácie znova a skočíte na Visible v TCustomForm a znova pre skočenie na Visible v TControl.<br />
<br />
Obdobne je to s TColor.<br />
Pre prekladač je to jednoducho 'longint', ale v zdrojovom kóde je to definované ako:<br />
<pascal><br />
TGraphicsColor = -$7FFFFFFF-1..$7FFFFFFF;<br />
TColor = TGraphicsColor;<br />
</pascal><br />
<br />
Obdobné je to aj s forward definovanými triedami:<br />
Napríklad v TControl je priávtna premenná<br />
<pascal><br />
FHostDockSite: TWinControl;<br />
</pascal><br />
<br />
Hľadanie deklarácie pre TWinControl skočí na forward definíciu:<br />
<pascal><br />
TWinControl = class;<br />
</pascal><br />
<br />
A opätovné spustenie hľadania deklarácie skočí na skutočnú implementáciu:<br />
<pascal><br />
TWinControl = class(TControl)<br />
</pascal><br />
<br />
Týmto spôsobom môžete stopovať každý identifikátor a nájsť každé predefinovanie, či preťaženie.<br />
<br />
==Dokončovanie identifikátorov==<br />
(''Identifier Completion'')<br />
<br />
Dokončovanie identifikátorov je vyvolané pomocou Ctrl+Space a zobrazuje všetky vyhovujúce identifikátory. <br />
<br />
Napríklad:<br />
<pascal><br />
procedure TForm1.FormCreate(Sender: TObject);<br />
begin<br />
|<br />
end;<br />
</pascal><br />
<br />
Umiestnite kurzor medzi ''begin'' a ''end'' a stlačte Ctrl+Space. Nástroj IDE spracuje celý dosiahnuteľný kód a zobrazí zoznam všetkých nájdených identifikátorov. CodeTools kešuje výsledok, takže druhý krát bude oveľa rýchlejší.<br />
<br />
'''Poznámka pre Delphianov:''' Delphi to volá ''Dokončovanie kódu''.<br />
<br />
Niektoré identifikátory, ako 'Write', 'ReadLn', 'Low', 'SetLength', 'Self', 'Result', 'Copy' sú zabudované v prekladači a teda nie sú definované nikde v zdrojovom kóde, al Dokončovanie identifikátorov má veľa z nich tež zabudovaných. Ak nájdete nejaký chýbajúci, jednoducho vytvorte požiadadvku na vlastnosť v sledovači chýb (''bug tracker'').<br />
<br />
Dokončovanie identifikátorov nedokončuje kľúčové slová, takže ho nemožno použiť na dokončenie proc' na 'procedure'. Na toto je určené Ctrl+W [[#Dokončovanie_slov|Dokončovanie slov]] alebo Ctrl+J [[#Šablóny_kódu|Šablóny kódu]].<br />
<br />
Dokončovanie identifikátorov nezobrazuje len tie identifikátory, ktoré nie sú kompatibilné.<br />
<br />
===Predpona===<br />
Môžete začať dokončovanie identifikátorov v existujúcom slove. Potom budú písmená vľavo od kurzora brané ako predpona. <br />
<br />
Napríklad:<br />
<pascal><br />
procedure TForm1.FormCreate(Sender: TObject);<br />
begin<br />
Ca|ption<br />
end;<br />
</pascal><br />
<br />
Okno bude zobrazovať len identifikátory začínajúce sa na 'Ca'.<br />
<br />
===Klávesy===<br />
<br />
* Písmená/čísla: pridávajú znak do editora zdrojového kódu a aktuálnej predpony, čo zároveň aktualizuje zoznam.<br />
* Backspace: odstraňuje posledný znak z editora zdrojového kódu a aktuálnej predpony, čo zároveň aktualizuje zoznam.<br />
* Return: nahradzuje celé slovo na kurzore zvoleným identifikátorom a zatvára vyskakovacie okno.<br />
* Shift+Return: as ''Return'', but replaces only the prefix (left part) of the word at the cursor.<br />
* Hore/Dole: presúva výber.<br />
* Esc: zatvára vyskakovacie okno bez zmeny.<br />
* Tab: dokončuje predponu na ďalšiu voľbu. Napríklad: aktuálna predpona je 'But' a dokončovanie identifikátora zobrazuje len 'Button1' a 'Button1Click', potom stlačenie ''Tab'' dokončí predponu na 'Button1'.<br />
* Else: ako ''Return'' a pridá znak do editora zdrojového kódu.<br />
<br />
==Dokončovanie slov==<br />
(''Word Completion'')<br />
<br />
Dokončovanie slov je vyvolané stlačením Ctrl+W a zobrazuje všetky slová všetkých aktuálne otvorených editorov. Inak pracuje presne ako Dokončovanie identifikátorov.<br />
<br />
==Prejdi do direktívy include==<br />
(''Goto Include Directive'')<br />
<br />
Tento príkaz v menu Searchskočí do príkazu (direktívy) {$I filename}, v ktorej je použitý aktuálny súbor.<br />
<br />
==Publikuj Projekt==<br />
Vytvára kópiu celého projektu. Ak chcete niekomu poslať len zdrojové kódy a nastavenia prekladača pre svoj kód, budete kamarátis touto funkciou.<br />
<br />
Bežný adresár projektu obsahuje množstvo informácií. Väčšinu z nich publikovať netreba. Súbor .lpi obsahuje informácie o relácii (ako pozíciu caret a záložiek zatvorených jednotiek) a adresár projektu obsahuje mnoho súborov .ppu a .o, a tiež .exe. A práve príkaz Publikuj projekt vytvorí súbor .lpi len so základnými informáciami a všetky zdrojové kódy, so všetkých podadresárov.<br />
<br />
V ponúknutom dialógu môžete nastaviť filter pre zahrnutie/vynechanie, či pre kompresiu výstupu do jediného archívu.<br />
<br />
==Spolupracovníci==<br />
This page has been converted from the epikwiki [http://lazarus-ccr.sourceforge.net/index.php?wiki=LazarusIdeTools version].<br />
* Created page and initial template - 4/6/2004 [[User:Tom Lisjac| VlxAdmin]]<br />
* Initial content posted - 4/10/2004 MattiasG<br />
* Small wiki and formatting fixes - 4/11/2004 [[User:Tom Lisjac| VlxAdmin]]<br />
* Added a summary table for IdeTools shortcuts - 12 July 2004 [[User:Kirkpatc]]<br />
* Preložené z originálu [[Lazarus IDE Tools]] - [[User:Slavko|Slavko]] 13:51, 25 Mar 2005 (PST)</div>Slavkohttps://wiki.freepascal.org/index.php?title=Lazarus_IDE_Tools/sk&diff=26870Lazarus IDE Tools/sk2008-02-17T20:07:24Z<p>Slavko: úprava formátu</p>
<hr />
<div>{{Lazarus IDE Tools}}<br />
<br />
==Úvod==<br />
IDE používa knižnicu analýzy zdrojového kódu Pascal a editačných nástrojov, zvanú "codetools". Tieto nástroje poskytujú funkcie ako hľadanie deklarácie (find declaration), dokončovanie kódu (code completion), odstraňovanie, presúvanie, vkladanie a formátovanie zdrojového kódu Pascal. Tieto funkcie šetria množstvo času a duplicitných úloh. Sú nastaviteľné a každá funkcia je dostupná pomocou klávesovej skratky (viď Editor Options).<br />
<br />
Pretože ich práca záleží na zdrojovom kóde a pochopení FreePascal, Delphi a Kylix kódu, nevyžadujú preložené jednotky ani nainštalovaný prekladač Borland. Môžete naraz upravovať kód Delphi aj FreePascal. Môžete dokonca pracovať s rôznymi verziami Delphi a FreePascal súčasne. Tým sa stáva prenos Delphi kódu ešte jednoduchší.<br />
<br />
==Zhrnutie klávesových skratiek IDE==<br />
{|<br />
|-<br />
| [[Lazarus IDE Tools/sk#Hľadanie_deklarácie | Hľadanie deklarácie]] (Declaration Jumping) || '''Ctrl+Click''' alebo '''Alt+Up'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Prepínanie_metód | Prepínanie metód]] (Method Jumping) || '''Ctrl+Shift+Up''' a '''Ctrl+Shift+Down'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Šablóny_kódu | Šablóny kódu]] (Code Templates) || '''Ctrl+J'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Dokončovanie_kódu | Dokončovanie kódu]] (Code/Class Completion) || '''Ctrl+Shift+C'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Dokončovanie_identifikátorov | Dokončovanie identifikátorov]] (Identifier Completion) || '''Ctrl+Medzerník'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Dokončovanie_slov | Dokončovanie slov]] (Word Completion) || '''Ctrl+W'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Pomoc_s_parametrami |Pomoc s parametrami]] (Parameter Hints) || '''Ctrl+Shift+Space'''<br />
|}<br />
<br />
==Prepínanie metód==<br />
(''Method Jumping'')<br />
<br />
Na prepínanie medzi telom procedúry (begin..end) a jej definíciou (procedure Name;) použite Ctrl+Shift+Up.<br />
<br />
Príklad:<br />
<pascal><br />
interface<br />
<br />
procedure DoSomething; // procedure definition<br />
<br />
implementation<br />
<br />
procedure DoSomething; // procedure body <br />
begin<br />
end;<br />
</pascal><br />
<br />
Ak je kurzor v tele provedúry a stlačíte Ctrl+Shift+Up, kurzor skočí na definíciu. Ak znova stlačíte Ctrl+Shift+Up preskočí do tela procedúry, za 'begin'. Funkcia pracuje aj s metódami (procedúrami v triedach).<br />
<br />
Tipy:<br />
'Method Jumping' presúva kurzor na rovnakú procedúru s rovnakým menom i zoznamom parametrov. Ak presná procedúra neexistuje, skočí na najpodobnejšiu a umiestni kurzor na prvý rozdiel. V Delphi táto funkcia neexistuje.<br />
<br />
Príklad procedúry s rôznymi typmi parametrov:<br />
<pascal><br />
interface<br />
<br />
procedure DoSomething(p: char); // procedure definition<br />
<br />
implementation<br />
<br />
procedure DoSomething(p: string); // procedure body<br />
begin<br />
end;<br />
</pascal><br />
<br />
Preskočenie z definície do tela umiestni kurzor na kľúčové slovo 'string'. Túto vlastnosť môžete využiť na premenovanie metódy a/alebo zmenu jej parametrov.<br />
<br />
Príklad:<br />
Premenovali sme 'DoSomething' na 'MakeIt':<br />
<pascal> interface<br />
<br />
procedure MakeIt; // procedure definition<br />
<br />
implementation<br />
<br />
procedure DoSomething; // procedure body<br />
begin<br />
end;<br />
</pascal><br />
<br />
Potom urobte skok z definície MakeIt do tela. IDE hľadá vhodné telo, nenájde žiadne, preto začne hľadať kandidátov. Keďže stepremenovali len jednu procedúru, tak je len jedno telo bez definície (DoSomething) a tak skočí do DoSomething a umiestni kurzor vpravo od 'DoSomething'. Potomm ju môžete jednoducho premenovať tiež. Toto rovnako pracuje s parametrami.<br />
<br />
==Include súbory==<br />
(''Include Files'')<br />
<br />
Include súbory sú súbory vložené do zdrojového kódu pomocou direktív prekladača {$I filename} alebo {$INCLUDE filename}. Lazarus a FreePascal používajú veľa takýchto vecí na redukciu nadbytočnosti a vyhnutie sa nečitateľnosti konštrukcií {$IFDEF} pri podpore rôznych platforiem.<br />
<br />
Narozdiel od Delphi, IDE Lazarus plne podporuje include súbory. Napríklad môžete skočiť z metódy v súbore .pas do tela metódy v include súbore. Všetky nástroje kódu, ako dokončovanie kódu, považuje include súbory za špeciálne hranice.<br />
<br />
Napríklad: keď dokončovanie kódu pridáva telo novej metódy za telom inej metódy, ponechá ich obe v rovnakom súbore. Týmto spôsobom môžete vložiť celú implementáciu triedy do include súborov, ako to robí LCL pre skoro všetky prvky.<br />
<br />
Ale je tu začiatočnícka chyba: Ak najprv otvoríte include súbor a skúsite prepínanie metód alebo hľadanie deklarácie, dostanete chybu. IDE nevie do ktorej jednotky include súbor patrí. Najprv musíte otvoriť jednotku.<br />
<br />
Hneď ako IDE zanalyzuje jednotku, zachytí v nej include direktívy a IDE si bude pamätať tento vzťah. Tieto informácie IDE ukladá pri skončení a pri uložení projektu do ~/.lazarus/includelinks.xml. Keď nabudúce otvoríte súbor include a urobíte skok do neho alebo hľadanie deklarácie, IDE interne otvorí jednotku a skoky budú fungovať.<br />
<br />
Tento mechanizmus má samozrejme obmedzenia, niektoré include súbory sú zahrnuté dva i viackrát. Napríklad: lcl/include/winapih.inc.<br />
Skákanie z definície procedúry/metódy v tomto include súbore do tela závisí na poslednej akcii. Ak ste pracovali v lcl/lclintf.pp, IDE skočí do winapi.inc. Ak ste pracovali v lcl/interfacebase.pp, potom skočíte do lcl/include/interfacebase.inc (alebo do jedného z ďalších include súborov). Ak pracujete s obomi, potom môže nastať zmätok. ;)<br />
<br />
==Šablóny kódu==<br />
(''Code Templates'')<br />
<br />
Šablóny kódu konvertujú identifikátor v texte alebo fragmente kódu. Šablóny kódu majú prednastavenú klávesovú skratku Ctrl+J. Môžete napísať identifikátor, stlačiť Ctrl+J a identifikátor je nahradený textom definovaným pre identifikátor. Šablóny kódu môžete definovať v Environment -> Editor Options -> CodeTools.<br />
<br />
Príklad:<br />
Napíšte identifikátor 'classf', ponechajte kurzor vpravo za 'f' a stlačte Ctrl+J. Identifikátor 'classf' bude nahradený týmto:<br />
<pascal><br />
T = class(T)<br />
private<br />
<br />
public<br />
constructor Create;<br />
destructor Destroy; override;<br />
end;<br />
</pascal><br />
<br />
a kurzor bude za 'T'.<br />
Zoznam šablón získate tak, že kurzor ponecháte na medzere (nie ne identifikátore) a stlačíte Ctrl+J. Pomocou kurzorových klávesov alebon apísania niekoľkých znakov vyberte jeden. Enter vytvorí zvolenú šablónu a Esc zatvorí zoznam.<br />
<br />
==Pomoc s parametrami==<br />
(''Parameter Hints'')<br />
Pomoc s parametrami ukazuje pomocné okno s deklaráciami parametrov aktuálneho zoznamu parametrov.<br />
<br />
Napríklad<br />
<pascal><br />
Canvas.FillRect(|);<br />
</pascal><br />
<br />
Umiestnite kurzor do zátvoriek a stlačte Ctrl+Shift+Space. Objaví sa pomocné okno, ukazujúce parametre FillRect.<br />
<br />
==Dokončovanie kódu==<br />
(''Code Completion'')<br />
<br />
Dokončovanie kódu nájdete v menu IDE Edit -> Complete Code a má štandartnú klávespvú skratku Ctrl+Shift+C.<br />
V Delphi je dokončovaním kódu volaná funkcia zobrazujúca zoznam identifikátorov na aktuálnej pozícii v zdrojovom kóde (Ctrl+Space). V Lazarus je toto nazývané dokončovanie identifikátorov (Identifier completion). Dokončovanie kódu v sebe združuje niekoľko užitočných funkcií:<br />
<br />
* '''Dokončovanie tried''' (Class Completion): dokončuje vlastnosti, pridáva telá metód, pridáva súkromné premenné a súkromné metódy;<br />
* '''Dokončovanie forward procedúr''' (Forward Procedure Completion): pridáva telá forward procedúr;<br />
* '''Dokončovanie priradenia udalostí''' (Event Assignment Completion): * dokončuje pridelenie udalostí a pridávanie tiel a definícií metód;<br />
* '''Dokončovanie lokálnych premenných''' (Local Variable Completion): pridáva definície lokálnych premenných.<br />
Ktorá funkcia je použitá, závisí na pozícii kurzora v editore zdrojového kódu.<br />
<br />
===Dokončovanie tried===<br />
(''Class Completion'')<br />
<br />
Veľmi výkonnou funkciou dokončovania kódu je "Dokončovanie tried". Vy píšete triedu, pridáte metódy a vlastnosti, a dokončovanie kódu pridá telá metód, metódy prístupu k vlastnostiam a súkromným premenným. <br />
<br />
Príklad:<br />
Vytvorte triedu (viz [[Lazarus IDE Tools/sk#Šablóny_kódu | Šablóny kódu]], aby ste ušetrili rovnakú prácu):<br />
<pascal> TExample = class(TObject)<br />
public<br />
constructor Create;<br />
destructor Destroy; override;<br />
end;</pascal><br />
<br />
Umiestnite kurzor niekde v definícii triedy a stlačte '''Ctrl+Shift+C'''. Tým budú vytvorené chýbajúce telá metód a kurzor bude presunutý na prvé vytvorené telo, takže môžete rovno začať písať kód triedy:<br />
<pascal> { TExample }<br />
<br />
constructor TExample.Create;<br />
begin<br />
|<br />
end;<br />
<br />
destructor TExample.Destroy;<br />
begin<br />
inherited Destroy;<br />
end;</pascal><br />
<br />
:'''Poznámka''': Značka '|' nie je pridaná, len ukazuje umiestnenie kurzora.<br />
<br />
Tip: Prepínať medzi telom a definíciou metódy môžete pomocou Ctrl+Shift+Up.<br />
<br />
Všimnite si, že IDE tiež pridáva volanie deštruktora základnej triedy (inherited Destroy). Toto je urobené, ak v definícii treidy použijete kľúčové slovo '''override'''.<br />
<br />
Teraz pridajte metódu '''DoSomething''':<br />
<pascal> TExample = class(TObject)<br />
public<br />
constructor Create;<br />
procedure DoSomething(i: integer);<br />
destructor Destroy; override;<br />
end;</pascal><br />
<br />
Potom stlačte '''Ctrl+Shift+C''' a IDE pridá:<br />
<pascal> procedure TExample.DoSomething(i: integer);<br />
begin<br />
|<br />
end;</pascal><br />
<br />
Ako môžete vidieť, nové telo metódy je vložené medzi Create a Destroy, presne ako je to v definícii. Týmto sú telá metód uchovávané v rovnakom logickom poradí, ako v definícii. Spôsob vkladania môžete definovať pomocou Prostredie > Voľby Codetools -> Tvorenie kódu.<br />
<br />
====Dokončovanie vlastností====<br />
Pridajte vlastnosť '''AnInteger''':<br />
<pascal> TExample = class(TObject)<br />
public<br />
constructor Create;<br />
procedure DoSomething(i: integer);<br />
destructor Destroy; override;<br />
property AnInteger;<br />
end;</pascal><br />
<br />
Stlačte Ctrl+Shift+C a dostanete:<br />
<pascal> procedure TExample.SetAnInteger(const AValue: integer);<br />
begin<br />
|if FAnInteger=AValue then exit;<br />
FAnInteger:=AValue;<br />
end;</pascal><br />
<br />
Dokončovanie kódu pridalo metódu pre prístup k zápisu do vlastnosti a nejaký základný kód.<br />
<br />
Preskočte do triedy pomocou '''Ctrl+Shift+C''' a uvidíte, že v triede pribudlo:<br />
<pascal> TExample = class(TObject)<br />
private<br />
FAnInteger: integer;<br />
procedure SetAnInteger(const AValue: integer);<br />
public<br />
constructor Create;<br />
procedure DoSomething(i: integer);<br />
destructor Destroy; override;<br />
property AnInteger: integer read FAnInteger write SetAnInteger;<br />
end;</pascal><br />
<br />
Vlastnosť bola rozšírená pridaním kľúčových slov '''Read''' a '''Write'''. V triede je nová sekcia '''private''' s premennou '''FAnInteger''' a metódou '''SetAnInteger'''. Pridanie '''F''' na začiatok privátnej premennej je bežnou notáciou Delphi, rovnako ako označenie prístupovej metódy pomocou '''Set'''. Ak to nechcete, môžete to zmeniť ponmocou Prostredie > Voľby Codetools -> Tvorenie kódu.<br />
<br />
Vytvorenie vlastnosti len na čítanie:<br />
<pascal> property PropName: PropType read;</pascal><br />
<br />
Bude rozšírené na:<br />
<pascal> property PropName: PropType read FPropName;</pascal><br />
<br />
Vytvorenie vlastnosti len pre zápis:<br />
<pascal> property PropName: PropType write;</pascal><br />
<br />
Bude rozšírené na:<br />
<pascal> property PropName: PropType write SetPropName;</pascal><br />
<br />
Vytvorenie read only vlastnosti s metódou na čítanie:<br />
<pascal> property PropName: PropType read GetPropName;</pascal><br />
<br />
Deklarácia ostane nezmenená, ale bude pridaná funkcia '''GetPropName''':<br />
<pascal> function GetpropName: PropType;</pascal><br />
<br />
Vytvorenie vlastnosti s direktívou '''stored''':<br />
<pascal> property PropName: PropType stored;</pascal><br />
<br />
Bude rozšírené na:<br />
<pascal> property PropName: PropType read FPropName write SetPropName stored PropNameIsStored;</pascal><br />
<br />
Pretože direktíva '''stored''' je používaná pre streamovanie čítania a zápisu, sú pridané aj kľúčové slová '''read''' a '''write'''.<br />
<br />
Tip:<br />
Dokončovanie identifikátorov tiež rozpoznáva nekompletné vlastnosti a navrhne predvolené mená. Napríklad:<br />
<pascal> property PropName: PropType read |;</pascal><br />
<br />
Umiestnite kurzor za medzeru za kľúčovým slovom '''read''' a stlačte Ctrl+Space pre dokončovanie identifikátorov. To vám ponúkne premennú '''FPropName''' a procedúru '''SetPropName'''.<br />
<br />
====Dokončovanie procedúr====<br />
(''Forward Procedure Completion'')<br />
<br />
Dokončovanie dopredných deklarácií procedúr je časťou dokončovania kódu a pridáva telá chýbajúcich procedúr, ktoré sú definované. Je vyvolané, ak je kurzor na pripravenej definícii procedúry, pomocou klávesovej skratky '''Ctrl+Shift+C'''.<br />
<br />
Napríklad:<br />
Pridajte novú procedúru do časti '''interface''':<br />
<pascal> procedure DoSomething;</pascal><br />
<br />
Umiestnite kurzor na ňu a stlačte '''Ctrl+Shift+C''' pre dokončovanie kódu. V časti '''implementation''' bude doplnené:<br />
<pascal> procedure DoSomething;<br />
begin<br />
|<br />
end;</pascal><br />
<br />
:Tip: Pomocou '''Ctrl+Shift+Up''' môžete prepínať medzi definíciou a telom procedúry.<br />
<br />
Telo novej procedúry bude pridané pred metódy tried. Ak už sú v časti '''interface''' nejaké definície procedúr, IDE sa pokúsi zachovať ich poradie, napríklad:<br />
<pascal> procedure Proc1;<br />
procedure Proc2; // nová procedúra<br />
procedure Proc3;</pascal><br />
<br />
Ak telá '''Proc1''' a '''Proc3''' už existujú, potom bude telo '''Proc2''' vložené medzi telá procedúr '''Proc1''' a '''Proc3'''. Toto správanie môže byť zmené pomocou '''Prostredie > Voľby Codetools -> Tvorenie kódu'''.<br />
<br />
Viacero procedúr:<br />
<pascal> procedure Proc1_Old; // telo existuje<br />
procedure Proc2_New; // telo neexistuje<br />
procedure Proc3_New; // "<br />
procedure Proc4_New; // "<br />
procedure Proc5_Old; // telo existuje</pascal><br />
<br />
Dokončovanie kódu pridá 3 telá procedúr (Proc2_New, Proc3_New, Proc4_New).<br />
<br />
Tento nástroj nepracuje len s procedúrami definovanými v časti '''interface''', ale aj s procedúrami, ktoré sú definované pomocou kľúčového slova '''forward'''.<br />
<br />
====Dokončovanie priradenia udalostí====<br />
(''Event Assignment Completion'')<br />
<br />
Dokončovanie priradenia udalostí je čsťou Dokončovania kódu a dokončuje jeden príkaz Event:=|. Nastáva, keď je kurzor umiestnený za príkazom priradenia udalosti a stlačíte '''Ctrl+Shift+C'''.<br />
<br />
;Napríklad:<br />
V metóde, povedzme udalosti FormCreate, pridajte riadok: 'OnPaint:=':<br />
<pascal> procedure TForm1.Form1Create(Sender: TObject);<br />
begin<br />
OnPaint:=|<br />
end;</pascal><br />
<br />
Značka '|' je umiestnenie kurzora a netreba ju zadávať.<br />
<br />
Potom stlačte '''Ctrl+Shift+C''' pre dokončovanie kódu. Príkaz priradenia udalosti bude doplnený takto:<br />
<pascal> OnPaint:=@Form1Paint;</pascal><br />
<br />
Do triedy '''TForm1''' bude pridaná nová metóda '''Form1Paint'''. Potom je spustené dokončovanie tried a dostanete:<br />
<pascal> procedure TForm1.Form1Paint(Sender: TObject);<br />
begin<br />
|<br />
end;</pascal><br />
<br />
Pracuje presne ako pridávanie metód v '''Inšpektore objektov'''.<br />
<br />
:'''Poznámka''': Kurzor musíte umiestniť za operátor priradenia ':='. Ak ho umiestnite na identifikátor (tj. '''OnPaint'''), dokončovanie kódu spustí Dokončovanie lokálnych premenných, ktoré zlyhá, pretože '''OnPaint''' je už definovaná.<br />
<br />
Tip:<br />
Môžete definovať meno novej metódi aj sami, a to jej zadaním do priradenia, napríklad:<br />
<pascal> OnPaint:=@ThePaintMethod;</pascal><br />
<br />
===Dokončovanie deklarácie premenných===<br />
(''Variable Declaration Completion'')<br />
<br />
Dokončovanie deklarácie premenných je časťou '''Dokončovania kódu''' a pridáva definíciu lokálnej premennej pre príkaz Identifier:=Term;. Dokončovanie deklarácie premenných je vyvolané, keď je kurzor umiestnený na identifikátore v priradení.<br />
<br />
Napríklad:<br />
<pascal><br />
procedure TForm1.Form1Create(Sender: TObject);<br />
begin<br />
i:=3;<br />
end;<br />
</pascal><br />
<br />
Umiestnite kurzor na 'i' alebo tesne za neho, potom stlačte Ctrl+Shift+C pre dokončovanie kódu a dostanete:<br />
<pascal><br />
procedure TForm1.Form1Create(Sender: TObject);<br />
var<br />
i: Integer;<br />
begin<br />
i:=3;<br />
end;<br />
</pascal><br />
<br />
Nástroj dokončovania kódu najprv skontroluje, či identifikátor 'i' už nie je definovaný a ak nie, pridá deklaráciu 'var i: integer;'. Typ identifikátora je odhadovaný podľa pravej strany príkazu priradenia. Čísla ako 3 sú identifikované ako Integer.<br />
<br />
Iný príklad:<br />
<pascal><br />
type<br />
TWhere = (Behind, Middle, InFront);<br />
<br />
procedure TForm1.Form1Create(Sender: TObject);<br />
var<br />
a: array[TWhere] of char;<br />
begin<br />
for Where:=Low(a) to High(a) do writeln(a[Where]);<br />
end;<br />
</pascal><br />
<br />
Umiestnite kurzor na 'Where' a stlačte Ctrl+Shift+C pre dokončenie kódu. Dostanete:<br />
<pascal><br />
procedure TForm1.Form1Create(Sender: TObject);<br />
var<br />
a: array[TWhere] of char;<br />
Where: TWhere;<br />
begin<br />
for Where:=Low(a) to High(a) do writeln(a[Where]);<br />
end;<br />
</pascal><br />
<br />
===Spätné dokončovanie triedy===<br />
(''Reversed Class Completion'')<br />
Spätné dokončovanie triedy je časťou '''Dokončovania kódu''' a pridáva deklarácie súkromných metód pre aktuálne telo metódy. Je vyvolané, keď je kurzor v tele metódy, zatiaľ nie je definované pre triedy.<br />
<br />
Táto vlastnosť je dostupná od 0.9.21.<br />
<br />
Napríklad:<br />
<pascal><br />
procedure TForm1.DoSomething(Sender: TObject);<br />
begin<br />
end;<br />
</pascal><br />
<br />
Metóda DoSomething zatiaľ nie je v TForm1 deklarovaná. Stlačte Ctrl+Shift+C a IDE pridá "procedure DoSomething(Sender: TObject);" k súkromným metódam triedy TForm1.<br />
<br />
Pre Delphianov:<br />
Dokončovanie tried pracuje pod Lazarus vždy jednym spôsobom:<br />
*Z rozhrania triedy do jej implementácie alebo naopak z implementácie triedy do jej rozhrania. Delphi vždy vyvoláva oba smery. Poszup v Delphi má nevýhodu, že ak dôjde k preklepu, ľahko vytvoríte bez upozornenia zvyšok novej metódy.<br />
<br />
===Komentáre a dokončovanie kódu===<br />
(''Comments and Code Completion'')<br />
<br />
Dokončovanie kódu sa pokúša uchovávať komentáre tam, kde sú. <br />
Príklad:<br />
<pascal><br />
FList: TList; // zoznam prvkov TComponent<br />
FInt: integer;<br />
</pascal><br />
<br />
Pri vkladaní novej premennej medzi FList a FInt, je komentár ponechaný na riadku spolu s FList. To platí i pre:<br />
<pascal><br />
FList: TList; { zoznam prvkov TComponent<br />
Toto je komentár na niekoľkých riadkoch, začínajúci<br />
na riadku s FList, tak nástroj dokončenia kódu predpokladá že patrí <br />
k riadku s FList a nepreruší tento vzťah.<br />
Kód bude vložený za komentár. }<br />
FInt: integer;<br />
</pascal><br />
<br />
Ak komentár začína na ďalšom riadku:<br />
<pascal><br />
FList: TList; // zoznam prvkov TComponent<br />
{ Tento komentár patrí k nasledujúcemu riadku. <br />
Nový kód je vložený pred tentokomentár a <br />
za komentár na riadku s FList. }<br />
FInt: integer;<br />
</pascal><br />
<br />
==Refactoring==<br />
<br />
===Otočenie priradenie===<br />
(''Invert Assignments'')<br />
<br />
Otočenie priradenia pracuje s vybratými príkazmi Pascalu a obracia všetky priradenia z tohoto výberu. Tento nástroj je užitočný pre transformáciu "save" kódu na "load" a naopak.<br />
<br />
Príklad:<br />
<pascal> procedure DoSomething;<br />
begin<br />
AValueStudio:= BValueStudio;<br />
AValueAppartment :=BValueAppartment;<br />
AValueHouse:=BValueHouse;<br />
end;<br />
</pascal><br />
<br />
Vyberte riadky s priradeniami (medzi begin a end) a urobte Otočenie priradenia, všetky priradenia budú otočené a automaticky odsadené. Výsledok:<br />
<pascal><br />
procedure DoSomething;<br />
begin<br />
BValueStudio := AValueStudio;<br />
BValueAppartment := AValueAppartment;<br />
BValueHouse := AValueHouse;<br />
end;<br />
</pascal><br />
<br />
=== Uzavrieť výber ===<br />
<br />
Vyberte nejaký text a vyvolajte nástroj. Zobrazí sa dialóg, kde si môžete vybrať či má výber uzatvorený medzi '''try..finally''' ale do mnoho iných blokov.<br />
<br />
=== Premenovať identifikátor ===<br />
<br />
Umiestnite kurzor na identifikátor a vyvolajte tento nástroj, obaví sa dialóg, v ktorom môžete nastaviť rozsah hľadania a nové meno identifikátora. <br />
* premenované budú všetky výskyty a len tie, ktoré momentálne používajú túto deklaráciu, čiže edklarácie s rovnakým menom nebudú premenované. <br />
* najprv bude vykonaná kontrola konfliktov mena. <br />
* Obmedzenia: Pracuje len so zdrojovými kódmi Pascalu, zatiaľ nepremenúva súbory ani neupravuje súbory lfm/lrs, či súbory lazdoc.<br />
<br />
=== Nájdi odkazy na identifikátor ===<br />
<br />
Umiestnite kurzor na identifikátor a vyvolajte nástroj. Objaví sa dialóg, v ktorom môžete nastaviť rozsah hľadania. IDE bude hľadať všetky výskyty a len tie, ktoré používajú aktuálnu deklaráciu. Čiže iné deklarácia s rovnakým menom, nebudú zobrazené.<br />
<br />
=== Zobraziť abstraktné metódy ===<br />
<br />
Táto funkcia vypisuje a automaticky kompletuje virtuálne, abstraktné metódy, ktoré je majú byť implementované.<br />
<br />
Umiestnite kurzor na deklaráciu triedu a vyvolajte nástroj. Ak existujú nejaké chýbajúce abstraktné metódy, nude zobrazený dialóg s ich zoznamom. Zvoľte metódy pre implementovanie a IDE vytvorí základy metód.<br />
<br />
=== Vytiahnuť procedúru ===<br />
Viz [[IDE_Window:_Extract_Procedure/sk|Extract Procedure]]<br />
<br />
==Hľadanie deklarácie==<br />
(''Find Declaration'')<br />
<br />
Umiestnite kurzor na identifikátor a urobte Hľadanie deklarácie, tým bude nájdená deklarácia tohoto identifikátora, prípadne otvorený príslušný súbor a kurzor bude premiestnený na miesto deklarácie.<br />
<br />
Každé hľadanie deklarácie nastavuje bod skoku. Tzn. po skoku na nájdenú deklaráciu môžete jednoduchos skočiť naspäť pomocou Search -> Jump back.<br />
<br />
Oproti Delphi má nástroj isté rozdiely:<br />
Nástroj pracuje so zdrojovým kódom na základe pravidiel Pascalu, a nie s výsledkom prekladača. The compiler returns the final type. Nástroj prezerá zdrojové kódy a všetky kroky medzi. Napríklad:<br />
<br />
: Vlastnosť 'Visible' je najprv definovaná v TControl (controls.pp), potom je predefinovaná v TCustomForm a nakoniec predefinovaná aj v TForm. Spustenie hľadania deklarácie vlastnosti Visible vás najprv presunie na Visible v TForm. Potom môžete spustiť hľadanie deklarácie znova a skočíte na Visible v TCustomForm a znova pre skočenie na Visible v TControl.<br />
<br />
Obdobne je to s TColor.<br />
Pre prekladač je to jednoducho 'longint', ale v zdrojovom kóde je to definované ako:<br />
<pascal><br />
TGraphicsColor = -$7FFFFFFF-1..$7FFFFFFF;<br />
TColor = TGraphicsColor;<br />
</pascal><br />
<br />
Obdobné je to aj s forward definovanými triedami:<br />
Napríklad v TControl je priávtna premenná<br />
<pascal><br />
FHostDockSite: TWinControl;<br />
</pascal><br />
<br />
Hľadanie deklarácie pre TWinControl skočí na forward definíciu:<br />
<pascal><br />
TWinControl = class;<br />
</pascal><br />
<br />
A opätovné spustenie hľadania deklarácie skočí na skutočnú implementáciu:<br />
<pascal><br />
TWinControl = class(TControl)<br />
</pascal><br />
<br />
Týmto spôsobom môžete stopovať každý identifikátor a nájsť každé predefinovanie, či preťaženie.<br />
<br />
==Dokončovanie identifikátorov==<br />
(''Identifier Completion'')<br />
<br />
Dokončovanie identifikátorov je vyvolané pomocou Ctrl+Space a zobrazuje všetky vyhovujúce identifikátory. <br />
<br />
Napríklad:<br />
<pascal><br />
procedure TForm1.FormCreate(Sender: TObject);<br />
begin<br />
|<br />
end;<br />
</pascal><br />
<br />
Umiestnite kurzor medzi ''begin'' a ''end'' a stlačte Ctrl+Space. Nástroj IDE spracuje celý dosiahnuteľný kód a zobrazí zoznam všetkých nájdených identifikátorov. CodeTools kešuje výsledok, takže druhý krát bude oveľa rýchlejší.<br />
<br />
'''Poznámka pre Delphianov:''' Delphi to volá ''Dokončovanie kódu''.<br />
<br />
Niektoré identifikátory, ako 'Write', 'ReadLn', 'Low', 'SetLength', 'Self', 'Result', 'Copy' sú zabudované v prekladači a teda nie sú definované nikde v zdrojovom kóde, al Dokončovanie identifikátorov má veľa z nich tež zabudovaných. Ak nájdete nejaký chýbajúci, jednoducho vytvorte požiadadvku na vlastnosť v sledovači chýb (''bug tracker'').<br />
<br />
Dokončovanie identifikátorov nedokončuje kľúčové slová, takže ho nemožno použiť na dokončenie proc' na 'procedure'. Na toto je určené Ctrl+W [[#Dokončovanie_slov|Dokončovanie slov]] alebo Ctrl+J [[#Šablóny_kódu|Šablóny kódu]].<br />
<br />
Dokončovanie identifikátorov nezobrazuje len tie identifikátory, ktoré nie sú kompatibilné.<br />
<br />
===Predpona===<br />
Môžete začať dokončovanie identifikátorov v existujúcom slove. Potom budú písmená vľavo od kurzora brané ako predpona. <br />
<br />
Napríklad:<br />
<pascal><br />
procedure TForm1.FormCreate(Sender: TObject);<br />
begin<br />
Ca|ption<br />
end;<br />
</pascal><br />
<br />
Okno bude zobrazovať len identifikátory začínajúce sa na 'Ca'.<br />
<br />
===Klávesy===<br />
<br />
* Písmená/čísla: pridávajú znak do editora zdrojového kódu a aktuálnej predpony, čo zároveň aktualizuje zoznam.<br />
* Backspace: odstraňuje posledný znak z editora zdrojového kódu a aktuálnej predpony, čo zároveň aktualizuje zoznam.<br />
* Return: nahradzuje celé slovo na kurzore zvoleným identifikátorom a zatvára vyskakovacie okno.<br />
* Shift+Return: as ''Return'', but replaces only the prefix (left part) of the word at the cursor.<br />
* Hore/Dole: presúva výber.<br />
* Esc: zatvára vyskakovacie okno bez zmeny.<br />
* Tab: dokončuje predponu na ďalšiu voľbu. Napríklad: aktuálna predpona je 'But' a dokončovanie identifikátora zobrazuje len 'Button1' a 'Button1Click', potom stlačenie ''Tab'' dokončí predponu na 'Button1'.<br />
* Else: ako ''Return'' a pridá znak do editora zdrojového kódu.<br />
<br />
==Dokončovanie slov==<br />
(''Word Completion'')<br />
<br />
Dokončovanie slov je vyvolané stlačením Ctrl+W a zobrazuje všetky slová všetkých aktuálne otvorených editorov. Inak pracuje presne ako Dokončovanie identifikátorov.<br />
<br />
==Prejdi do direktívy include==<br />
(''Goto Include Directive'')<br />
<br />
Tento príkaz v menu Searchskočí do príkazu (direktívy) {$I filename}, v ktorej je použitý aktuálny súbor.<br />
<br />
==Publikuj Projekt==<br />
Vytvára kópiu celého projektu. Ak chcete niekomu poslať len zdrojové kódy a nastavenia prekladača pre svoj kód, budete kamarátis touto funkciou.<br />
<br />
Bežný adresár projektu obsahuje množstvo informácií. Väčšinu z nich publikovať netreba. Súbor .lpi obsahuje informácie o relácii (ako pozíciu caret a záložiek zatvorených jednotiek) a adresár projektu obsahuje mnoho súborov .ppu a .o, a tiež .exe. A práve príkaz Publikuj projekt vytvorí súbor .lpi len so základnými informáciami a všetky zdrojové kódy, so všetkých podadresárov.<br />
<br />
V ponúknutom dialógu môžete nastaviť filter pre zahrnutie/vynechanie, či pre kompresiu výstupu do jediného archívu.<br />
<br />
==Spolupracovníci==<br />
This page has been converted from the epikwiki [http://lazarus-ccr.sourceforge.net/index.php?wiki=LazarusIdeTools version].<br />
* Created page and initial template - 4/6/2004 [[User:Tom Lisjac| VlxAdmin]]<br />
* Initial content posted - 4/10/2004 MattiasG<br />
* Small wiki and formatting fixes - 4/11/2004 [[User:Tom Lisjac| VlxAdmin]]<br />
* Added a summary table for IdeTools shortcuts - 12 July 2004 [[User:Kirkpatc]]<br />
* Preložené z originálu [[Lazarus IDE Tools]] - [[User:Slavko|Slavko]] 13:51, 25 Mar 2005 (PST)</div>Slavkohttps://wiki.freepascal.org/index.php?title=Lazarus_IDE_Tools/sk&diff=26869Lazarus IDE Tools/sk2008-02-17T20:05:01Z<p>Slavko: ešte úprava formátu a nadpisu</p>
<hr />
<div>{{Lazarus IDE Tools}}<br />
<br />
==Úvod==<br />
IDE používa knižnicu analýzy zdrojového kódu Pascal a editačných nástrojov, zvanú "codetools". Tieto nástroje poskytujú funkcie ako hľadanie deklarácie (find declaration), dokončovanie kódu (code completion), odstraňovanie, presúvanie, vkladanie a formátovanie zdrojového kódu Pascal. Tieto funkcie šetria množstvo času a duplicitných úloh. Sú nastaviteľné a každá funkcia je dostupná pomocou klávesovej skratky (viď Editor Options).<br />
<br />
Pretože ich práca záleží na zdrojovom kóde a pochopení FreePascal, Delphi a Kylix kódu, nevyžadujú preložené jednotky ani nainštalovaný prekladač Borland. Môžete naraz upravovať kód Delphi aj FreePascal. Môžete dokonca pracovať s rôznymi verziami Delphi a FreePascal súčasne. Tým sa stáva prenos Delphi kódu ešte jednoduchší.<br />
<br />
==Zhrnutie klávesových skratiek IDE==<br />
{|<br />
|-<br />
| [[Lazarus IDE Tools/sk#Hľadanie_deklarácie | Hľadanie deklarácie]] (Declaration Jumping) || '''Ctrl+Click''' alebo '''Alt+Up'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Prepínanie_metód | Prepínanie metód]] (Method Jumping) || '''Ctrl+Shift+Up''' a '''Ctrl+Shift+Down'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Šablóny_kódu | Šablóny kódu]] (Code Templates) || '''Ctrl+J'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Dokončovanie_kódu | Dokončovanie kódu]] (Code/Class Completion) || '''Ctrl+Shift+C'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Dokončovanie_identifikátorov | Dokončovanie identifikátorov]] (Identifier Completion) || '''Ctrl+Medzerník'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Dokončovanie_slov | Dokončovanie slov]] (Word Completion) || '''Ctrl+W'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Pomoc_s_parametrami |Pomoc s parametrami]] (Parameter Hints) || '''Ctrl+Shift+Space'''<br />
|}<br />
<br />
==Prepínanie metód==<br />
(''Method Jumping'')<br />
<br />
Na prepínanie medzi telom procedúry (begin..end) a jej definíciou (procedure Name;) použite Ctrl+Shift+Up.<br />
<br />
Príklad:<br />
<pascal><br />
interface<br />
<br />
procedure DoSomething; // procedure definition<br />
<br />
implementation<br />
<br />
procedure DoSomething; // procedure body <br />
begin<br />
end;<br />
</pascal><br />
<br />
Ak je kurzor v tele provedúry a stlačíte Ctrl+Shift+Up, kurzor skočí na definíciu. Ak znova stlačíte Ctrl+Shift+Up preskočí do tela procedúry, za 'begin'. Funkcia pracuje aj s metódami (procedúrami v triedach).<br />
<br />
Tipy:<br />
'Method Jumping' presúva kurzor na rovnakú procedúru s rovnakým menom i zoznamom parametrov. Ak presná procedúra neexistuje, skočí na najpodobnejšiu a umiestni kurzor na prvý rozdiel. V Delphi táto funkcia neexistuje.<br />
<br />
Príklad procedúry s rôznymi typmi parametrov:<br />
<pascal><br />
interface<br />
<br />
procedure DoSomething(p: char); // procedure definition<br />
<br />
implementation<br />
<br />
procedure DoSomething(p: string); // procedure body<br />
begin<br />
end;<br />
</pascal><br />
<br />
Preskočenie z definície do tela umiestni kurzor na kľúčové slovo 'string'. Túto vlastnosť môžete využiť na premenovanie metódy a/alebo zmenu jej parametrov.<br />
<br />
Príklad:<br />
Premenovali sme 'DoSomething' na 'MakeIt':<br />
<pascal> interface<br />
<br />
procedure MakeIt; // procedure definition<br />
<br />
implementation<br />
<br />
procedure DoSomething; // procedure body<br />
begin<br />
end;<br />
</pascal><br />
<br />
Potom urobte skok z definície MakeIt do tela. IDE hľadá vhodné telo, nenájde žiadne, preto začne hľadať kandidátov. Keďže stepremenovali len jednu procedúru, tak je len jedno telo bez definície (DoSomething) a tak skočí do DoSomething a umiestni kurzor vpravo od 'DoSomething'. Potomm ju môžete jednoducho premenovať tiež. Toto rovnako pracuje s parametrami.<br />
<br />
==Include súbory==<br />
(''Include Files'')<br />
<br />
Include súbory sú súbory vložené do zdrojového kódu pomocou direktív prekladača {$I filename} alebo {$INCLUDE filename}. Lazarus a FreePascal používajú veľa takýchto vecí na redukciu nadbytočnosti a vyhnutie sa nečitateľnosti konštrukcií {$IFDEF} pri podpore rôznych platforiem.<br />
<br />
Narozdiel od Delphi, IDE Lazarus plne podporuje include súbory. Napríklad môžete skočiť z metódy v súbore .pas do tela metódy v include súbore. Všetky nástroje kódu, ako dokončovanie kódu, považuje include súbory za špeciálne hranice.<br />
<br />
Napríklad: keď dokončovanie kódu pridáva telo novej metódy za telom inej metódy, ponechá ich obe v rovnakom súbore. Týmto spôsobom môžete vložiť celú implementáciu triedy do include súborov, ako to robí LCL pre skoro všetky prvky.<br />
<br />
Ale je tu začiatočnícka chyba: Ak najprv otvoríte include súbor a skúsite prepínanie metód alebo hľadanie deklarácie, dostanete chybu. IDE nevie do ktorej jednotky include súbor patrí. Najprv musíte otvoriť jednotku.<br />
<br />
Hneď ako IDE zanalyzuje jednotku, zachytí v nej include direktívy a IDE si bude pamätať tento vzťah. Tieto informácie IDE ukladá pri skončení a pri uložení projektu do ~/.lazarus/includelinks.xml. Keď nabudúce otvoríte súbor include a urobíte skok do neho alebo hľadanie deklarácie, IDE interne otvorí jednotku a skoky budú fungovať.<br />
<br />
Tento mechanizmus má samozrejme obmedzenia, niektoré include súbory sú zahrnuté dva i viackrát. Napríklad: lcl/include/winapih.inc.<br />
Skákanie z definície procedúry/metódy v tomto include súbore do tela závisí na poslednej akcii. Ak ste pracovali v lcl/lclintf.pp, IDE skočí do winapi.inc. Ak ste pracovali v lcl/interfacebase.pp, potom skočíte do lcl/include/interfacebase.inc (alebo do jedného z ďalších include súborov). Ak pracujete s obomi, potom môže nastať zmätok. ;)<br />
<br />
==Šablóny kódu==<br />
(''Code Templates'')<br />
<br />
Šablóny kódu konvertujú identifikátor v texte alebo fragmente kódu. Šablóny kódu majú prednastavenú klávesovú skratku Ctrl+J. Môžete napísať identifikátor, stlačiť Ctrl+J a identifikátor je nahradený textom definovaným pre identifikátor. Šablóny kódu môžete definovať v Environment -> Editor Options -> CodeTools.<br />
<br />
Príklad:<br />
Napíšte identifikátor 'classf', ponechajte kurzor vpravo za 'f' a stlačte Ctrl+J. Identifikátor 'classf' bude nahradený týmto:<br />
<pascal><br />
T = class(T)<br />
private<br />
<br />
public<br />
constructor Create;<br />
destructor Destroy; override;<br />
end;<br />
</pascal><br />
<br />
a kurzor bude za 'T'.<br />
Zoznam šablón získate tak, že kurzor ponecháte na medzere (nie ne identifikátore) a stlačíte Ctrl+J. Pomocou kurzorových klávesov alebon apísania niekoľkých znakov vyberte jeden. Enter vytvorí zvolenú šablónu a Esc zatvorí zoznam.<br />
<br />
==Pomoc s parametrami==<br />
(''Parameter Hints'')<br />
Pomoc s parametrami ukazuje pomocné okno s deklaráciami parametrov aktuálneho zoznamu parametrov.<br />
<br />
Napríklad<br />
<pascal><br />
Canvas.FillRect(|);<br />
</pascal><br />
<br />
Umiestnite kurzor do zátvoriek a stlačte Ctrl+Shift+Space. Objaví sa pomocné okno, ukazujúce parametre FillRect.<br />
<br />
==Dokončovanie kódu==<br />
(''Code Completion'')<br />
<br />
Dokončovanie kódu nájdete v menu IDE Edit -> Complete Code a má štandartnú klávespvú skratku Ctrl+Shift+C.<br />
V Delphi je dokončovaním kódu volaná funkcia zobrazujúca zoznam identifikátorov na aktuálnej pozícii v zdrojovom kóde (Ctrl+Space). V Lazarus je toto nazývané dokončovanie identifikátorov (Identifier completion). Dokončovanie kódu v sebe združuje niekoľko užitočných funkcií:<br />
<br />
* '''Dokončovanie tried''' (Class Completion): dokončuje vlastnosti, pridáva telá metód, pridáva súkromné premenné a súkromné metódy;<br />
* '''Dokončovanie forward procedúr''' (Forward Procedure Completion): pridáva telá forward procedúr;<br />
* '''Dokončovanie priradenia udalostí''' (Event Assignment Completion): * dokončuje pridelenie udalostí a pridávanie tiel a definícií metód;<br />
* '''Dokončovanie lokálnych premenných''' (Local Variable Completion): pridáva definície lokálnych premenných.<br />
Ktorá funkcia je použitá, závisí na pozícii kurzora v editore zdrojového kódu.<br />
<br />
===Dokončovanie tried===<br />
(''Class Completion'')<br />
<br />
Veľmi výkonnou funkciou dokončovania kódu je "Dokončovanie tried". Vy píšete triedu, pridáte metódy a vlastnosti, a dokončovanie kódu pridá telá metód, metódy prístupu k vlastnostiam a súkromným premenným. <br />
<br />
Príklad:<br />
Vytvorte triedu (viz [[Lazarus IDE Tools/sk#Šablóny_kódu | Šablóny kódu]], aby ste ušetrili rovnakú prácu):<br />
<pascal> TExample = class(TObject)<br />
public<br />
constructor Create;<br />
destructor Destroy; override;<br />
end;</pascal><br />
<br />
Umiestnite kurzor niekde v definícii triedy a stlačte '''Ctrl+Shift+C'''. Tým budú vytvorené chýbajúce telá metód a kurzor bude presunutý na prvé vytvorené telo, takže môžete rovno začať písať kód triedy:<br />
<pascal> { TExample }<br />
<br />
constructor TExample.Create;<br />
begin<br />
|<br />
end;<br />
<br />
destructor TExample.Destroy;<br />
begin<br />
inherited Destroy;<br />
end;</pascal><br />
<br />
:'''Poznámka''': Značka '|' nie je pridaná, len ukazuje umiestnenie kurzora.<br />
<br />
Tip: Prepínať medzi telom a definíciou metódy môžete pomocou Ctrl+Shift+Up.<br />
<br />
Všimnite si, že IDE tiež pridáva volanie deštruktora základnej triedy (inherited Destroy). Toto je urobené, ak v definícii treidy použijete kľúčové slovo '''override'''.<br />
<br />
Teraz pridajte metódu '''DoSomething''':<br />
<pascal> TExample = class(TObject)<br />
public<br />
constructor Create;<br />
procedure DoSomething(i: integer);<br />
destructor Destroy; override;<br />
end;</pascal><br />
<br />
Potom stlačte '''Ctrl+Shift+C''' a IDE pridá:<br />
<pascal> procedure TExample.DoSomething(i: integer);<br />
begin<br />
|<br />
end;</pascal><br />
<br />
Ako môžete vidieť, nové telo metódy je vložené medzi Create a Destroy, presne ako je to v definícii. Týmto sú telá metód uchovávané v rovnakom logickom poradí, ako v definícii. Spôsob vkladania môžete definovať pomocou Prostredie > Voľby Codetools -> Tvorenie kódu.<br />
<br />
====Dokončovanie vlastností====<br />
Pridajte vlastnosť '''AnInteger''':<br />
<pascal> TExample = class(TObject)<br />
public<br />
constructor Create;<br />
procedure DoSomething(i: integer);<br />
destructor Destroy; override;<br />
property AnInteger;<br />
end;</pascal><br />
<br />
Stlačte Ctrl+Shift+C a dostanete:<br />
<pascal> procedure TExample.SetAnInteger(const AValue: integer);<br />
begin<br />
|if FAnInteger=AValue then exit;<br />
FAnInteger:=AValue;<br />
end;</pascal><br />
<br />
Dokončovanie kódu pridalo metódu pre prístup k zápisu do vlastnosti a nejaký základný kód.<br />
<br />
Preskočte do triedy pomocou '''Ctrl+Shift+C''' a uvidíte, že v triede pribudlo:<br />
<pascal> TExample = class(TObject)<br />
private<br />
FAnInteger: integer;<br />
procedure SetAnInteger(const AValue: integer);<br />
public<br />
constructor Create;<br />
procedure DoSomething(i: integer);<br />
destructor Destroy; override;<br />
property AnInteger: integer read FAnInteger write SetAnInteger;<br />
end;</pascal><br />
<br />
Vlastnosť bola rozšírená pridaním kľúčových slov '''Read''' a '''Write'''. V triede je nová sekcia '''private''' s premennou '''FAnInteger''' a metódou '''SetAnInteger'''. Pridanie '''F''' na začiatok privátnej premennej je bežnou notáciou Delphi, rovnako ako označenie prístupovej metódy pomocou '''Set'''. Ak to nechcete, môžete to zmeniť ponmocou Prostredie > Voľby Codetools -> Tvorenie kódu.<br />
<br />
Vytvorenie vlastnosti len na čítanie:<br />
<pascal> property PropName: PropType read;</pascal><br />
<br />
Bude rozšírené na:<br />
<pascal> property PropName: PropType read FPropName;</pascal><br />
<br />
Vytvorenie vlastnosti len pre zápis:<br />
<pascal> property PropName: PropType write;</pascal><br />
<br />
Bude rozšírené na:<br />
<pascal> property PropName: PropType write SetPropName;</pascal><br />
<br />
Vytvorenie read only vlastnosti s metódou na čítanie:<br />
<pascal> property PropName: PropType read GetPropName;</pascal><br />
<br />
Deklarácia ostane nezmenená, ale bude pridaná funkcia '''GetPropName''':<br />
<pascal> function GetpropName: PropType;</pascal><br />
<br />
Vytvorenie vlastnosti s direktívou '''stored''':<br />
<pascal> property PropName: PropType stored;</pascal><br />
<br />
Bude rozšírené na:<br />
<pascal> property PropName: PropType read FPropName write SetPropName stored PropNameIsStored;</pascal><br />
<br />
Pretože direktíva '''stored''' je používaná pre streamovanie čítania a zápisu, sú pridané aj kľúčové slová '''read''' a '''write'''.<br />
<br />
Tip:<br />
Dokončovanie identifikátorov tiež rozpoznáva nekompletné vlastnosti a navrhne predvolené mená. Napríklad:<br />
<pascal> property PropName: PropType read |;</pascal><br />
<br />
Umiestnite kurzor za medzeru za kľúčovým slovom '''read''' a stlačte Ctrl+Space pre dokončovanie identifikátorov. To vám ponúkne premennú '''FPropName''' a procedúru '''SetPropName'''.<br />
<br />
====Dokončovanie procedúr====<br />
(''Forward Procedure Completion'')<br />
<br />
Dokončovanie dopredných deklarácií procedúr je časťou dokončovania kódu a pridáva telá chýbajúcich procedúr, ktoré sú definované. Je vyvolané, ak je kurzor na pripravenej definícii procedúry, pomocou klávesovej skratky '''Ctrl+Shift+C'''.<br />
<br />
Napríklad:<br />
Pridajte novú procedúru do časti '''interface''':<br />
<pascal> procedure DoSomething;</pascal><br />
<br />
Umiestnite kurzor na ňu a stlačte '''Ctrl+Shift+C''' pre dokončovanie kódu. V časti '''implementation''' bude doplnené:<br />
<pascal> procedure DoSomething;<br />
begin<br />
|<br />
end;</pascal><br />
<br />
:Tip: Pomocou '''Ctrl+Shift+Up''' môžete prepínať medzi definíciou a telom procedúry.<br />
<br />
Telo novej procedúry bude pridané pred metódy tried. Ak už sú v časti '''interface''' nejaké definície procedúr, IDE sa pokúsi zachovať ich poradie, napríklad:<br />
<pascal> procedure Proc1;<br />
procedure Proc2; // nová procedúra<br />
procedure Proc3;</pascal><br />
<br />
Ak telá '''Proc1''' a '''Proc3''' už existujú, potom bude telo '''Proc2''' vložené medzi telá procedúr '''Proc1''' a '''Proc3'''. Toto správanie môže byť zmené pomocou '''Prostredie > Voľby Codetools -> Tvorenie kódu'''.<br />
<br />
Viacero procedúr:<br />
<pascal> procedure Proc1_Old; // telo existuje<br />
procedure Proc2_New; // telo neexistuje<br />
procedure Proc3_New; // "<br />
procedure Proc4_New; // "<br />
procedure Proc5_Old; // telo existuje</pascal><br />
<br />
Dokončovanie kódu pridá 3 telá procedúr (Proc2_New, Proc3_New, Proc4_New).<br />
<br />
Tento nástroj nepracuje len s procedúrami definovanými v časti '''interface''', ale aj s procedúrami, ktoré sú definované pomocou kľúčového slova '''forward'''.<br />
<br />
===Dokončovanie priradenia udalostí===<br />
(''Event Assignment Completion'')<br />
<br />
Dokončovanie priradenia udalostí je čsťou Dokončovania kódu a dokončuje jeden príkaz Event:=|. Nastáva, keď je kurzor umiestnený za príkazom priradenia udalosti.<br />
<br />
Napríklad:<br />
V metóde, povedzme udalosti FormCreate event, pridajte riadok: 'OnPaint:=':<br />
<pascal><br />
procedure TForm1.Form1Create(Sender: TObject);<br />
begin<br />
OnPaint:=|<br />
end;<br />
</pascal><br />
<br />
Značka '|' je umiestnenie kurzora a netreba ju zadávať.<br />
<br />
Potom stlačte Ctrl+Shift+C pre dokončovanie kódu. Príkaz priradenia udalosti bude doplnený takto:<br />
<pascal><br />
OnPaint:=@Form1Paint;<br />
</pascal><br />
<br />
Do triedy TForm1 bude pridaná nová metóda Form1Paint. Potom je spustené dokončovanie tried a dostanete:<br />
<pascal><br />
procedure TForm1.Form1Paint(Sender: TObject);<br />
begin<br />
|<br />
end;<br />
</pascal><br />
<br />
Pracuje presne ako pridávanie metód v Object inspectore.<br />
<br />
Poznámka: Kurzor musíte umiestniť za operátor priradenia ':='. Ak ho umiestnite na identifikátor (tj. OnPaint), dokončovanie kódu spustí Dokončovanie lokálnych premenných, ktoré zlyhá, pretože OnPaint je už definovaná.<br />
<br />
Tip:<br />
Môžete definovať meno novej metódi aj sami, a to jej zadaním do priradenia, napríklad:<br />
<pascal><br />
OnPaint:=@ThePaintMethod;<br />
</pascal><br />
<br />
===Dokončovanie deklarácie premenných===<br />
(''Variable Declaration Completion'')<br />
<br />
Dokončovanie deklarácie premenných je časťou '''Dokončovania kódu''' a pridáva definíciu lokálnej premennej pre príkaz Identifier:=Term;. Dokončovanie deklarácie premenných je vyvolané, keď je kurzor umiestnený na identifikátore v priradení.<br />
<br />
Napríklad:<br />
<pascal><br />
procedure TForm1.Form1Create(Sender: TObject);<br />
begin<br />
i:=3;<br />
end;<br />
</pascal><br />
<br />
Umiestnite kurzor na 'i' alebo tesne za neho, potom stlačte Ctrl+Shift+C pre dokončovanie kódu a dostanete:<br />
<pascal><br />
procedure TForm1.Form1Create(Sender: TObject);<br />
var<br />
i: Integer;<br />
begin<br />
i:=3;<br />
end;<br />
</pascal><br />
<br />
Nástroj dokončovania kódu najprv skontroluje, či identifikátor 'i' už nie je definovaný a ak nie, pridá deklaráciu 'var i: integer;'. Typ identifikátora je odhadovaný podľa pravej strany príkazu priradenia. Čísla ako 3 sú identifikované ako Integer.<br />
<br />
Iný príklad:<br />
<pascal><br />
type<br />
TWhere = (Behind, Middle, InFront);<br />
<br />
procedure TForm1.Form1Create(Sender: TObject);<br />
var<br />
a: array[TWhere] of char;<br />
begin<br />
for Where:=Low(a) to High(a) do writeln(a[Where]);<br />
end;<br />
</pascal><br />
<br />
Umiestnite kurzor na 'Where' a stlačte Ctrl+Shift+C pre dokončenie kódu. Dostanete:<br />
<pascal><br />
procedure TForm1.Form1Create(Sender: TObject);<br />
var<br />
a: array[TWhere] of char;<br />
Where: TWhere;<br />
begin<br />
for Where:=Low(a) to High(a) do writeln(a[Where]);<br />
end;<br />
</pascal><br />
<br />
===Spätné dokončovanie triedy===<br />
(''Reversed Class Completion'')<br />
Spätné dokončovanie triedy je časťou '''Dokončovania kódu''' a pridáva deklarácie súkromných metód pre aktuálne telo metódy. Je vyvolané, keď je kurzor v tele metódy, zatiaľ nie je definované pre triedy.<br />
<br />
Táto vlastnosť je dostupná od 0.9.21.<br />
<br />
Napríklad:<br />
<pascal><br />
procedure TForm1.DoSomething(Sender: TObject);<br />
begin<br />
end;<br />
</pascal><br />
<br />
Metóda DoSomething zatiaľ nie je v TForm1 deklarovaná. Stlačte Ctrl+Shift+C a IDE pridá "procedure DoSomething(Sender: TObject);" k súkromným metódam triedy TForm1.<br />
<br />
Pre Delphianov:<br />
Dokončovanie tried pracuje pod Lazarus vždy jednym spôsobom:<br />
*Z rozhrania triedy do jej implementácie alebo naopak z implementácie triedy do jej rozhrania. Delphi vždy vyvoláva oba smery. Poszup v Delphi má nevýhodu, že ak dôjde k preklepu, ľahko vytvoríte bez upozornenia zvyšok novej metódy.<br />
<br />
===Komentáre a dokončovanie kódu===<br />
(''Comments and Code Completion'')<br />
<br />
Dokončovanie kódu sa pokúša uchovávať komentáre tam, kde sú. <br />
Príklad:<br />
<pascal><br />
FList: TList; // zoznam prvkov TComponent<br />
FInt: integer;<br />
</pascal><br />
<br />
Pri vkladaní novej premennej medzi FList a FInt, je komentár ponechaný na riadku spolu s FList. To platí i pre:<br />
<pascal><br />
FList: TList; { zoznam prvkov TComponent<br />
Toto je komentár na niekoľkých riadkoch, začínajúci<br />
na riadku s FList, tak nástroj dokončenia kódu predpokladá že patrí <br />
k riadku s FList a nepreruší tento vzťah.<br />
Kód bude vložený za komentár. }<br />
FInt: integer;<br />
</pascal><br />
<br />
Ak komentár začína na ďalšom riadku:<br />
<pascal><br />
FList: TList; // zoznam prvkov TComponent<br />
{ Tento komentár patrí k nasledujúcemu riadku. <br />
Nový kód je vložený pred tentokomentár a <br />
za komentár na riadku s FList. }<br />
FInt: integer;<br />
</pascal><br />
<br />
==Refactoring==<br />
<br />
===Otočenie priradenie===<br />
(''Invert Assignments'')<br />
<br />
Otočenie priradenia pracuje s vybratými príkazmi Pascalu a obracia všetky priradenia z tohoto výberu. Tento nástroj je užitočný pre transformáciu "save" kódu na "load" a naopak.<br />
<br />
Príklad:<br />
<pascal> procedure DoSomething;<br />
begin<br />
AValueStudio:= BValueStudio;<br />
AValueAppartment :=BValueAppartment;<br />
AValueHouse:=BValueHouse;<br />
end;<br />
</pascal><br />
<br />
Vyberte riadky s priradeniami (medzi begin a end) a urobte Otočenie priradenia, všetky priradenia budú otočené a automaticky odsadené. Výsledok:<br />
<pascal><br />
procedure DoSomething;<br />
begin<br />
BValueStudio := AValueStudio;<br />
BValueAppartment := AValueAppartment;<br />
BValueHouse := AValueHouse;<br />
end;<br />
</pascal><br />
<br />
=== Uzavrieť výber ===<br />
<br />
Vyberte nejaký text a vyvolajte nástroj. Zobrazí sa dialóg, kde si môžete vybrať či má výber uzatvorený medzi '''try..finally''' ale do mnoho iných blokov.<br />
<br />
=== Premenovať identifikátor ===<br />
<br />
Umiestnite kurzor na identifikátor a vyvolajte tento nástroj, obaví sa dialóg, v ktorom môžete nastaviť rozsah hľadania a nové meno identifikátora. <br />
* premenované budú všetky výskyty a len tie, ktoré momentálne používajú túto deklaráciu, čiže edklarácie s rovnakým menom nebudú premenované. <br />
* najprv bude vykonaná kontrola konfliktov mena. <br />
* Obmedzenia: Pracuje len so zdrojovými kódmi Pascalu, zatiaľ nepremenúva súbory ani neupravuje súbory lfm/lrs, či súbory lazdoc.<br />
<br />
=== Nájdi odkazy na identifikátor ===<br />
<br />
Umiestnite kurzor na identifikátor a vyvolajte nástroj. Objaví sa dialóg, v ktorom môžete nastaviť rozsah hľadania. IDE bude hľadať všetky výskyty a len tie, ktoré používajú aktuálnu deklaráciu. Čiže iné deklarácia s rovnakým menom, nebudú zobrazené.<br />
<br />
=== Zobraziť abstraktné metódy ===<br />
<br />
Táto funkcia vypisuje a automaticky kompletuje virtuálne, abstraktné metódy, ktoré je majú byť implementované.<br />
<br />
Umiestnite kurzor na deklaráciu triedu a vyvolajte nástroj. Ak existujú nejaké chýbajúce abstraktné metódy, nude zobrazený dialóg s ich zoznamom. Zvoľte metódy pre implementovanie a IDE vytvorí základy metód.<br />
<br />
=== Vytiahnuť procedúru ===<br />
Viz [[IDE_Window:_Extract_Procedure/sk|Extract Procedure]]<br />
<br />
==Hľadanie deklarácie==<br />
(''Find Declaration'')<br />
<br />
Umiestnite kurzor na identifikátor a urobte Hľadanie deklarácie, tým bude nájdená deklarácia tohoto identifikátora, prípadne otvorený príslušný súbor a kurzor bude premiestnený na miesto deklarácie.<br />
<br />
Každé hľadanie deklarácie nastavuje bod skoku. Tzn. po skoku na nájdenú deklaráciu môžete jednoduchos skočiť naspäť pomocou Search -> Jump back.<br />
<br />
Oproti Delphi má nástroj isté rozdiely:<br />
Nástroj pracuje so zdrojovým kódom na základe pravidiel Pascalu, a nie s výsledkom prekladača. The compiler returns the final type. Nástroj prezerá zdrojové kódy a všetky kroky medzi. Napríklad:<br />
<br />
: Vlastnosť 'Visible' je najprv definovaná v TControl (controls.pp), potom je predefinovaná v TCustomForm a nakoniec predefinovaná aj v TForm. Spustenie hľadania deklarácie vlastnosti Visible vás najprv presunie na Visible v TForm. Potom môžete spustiť hľadanie deklarácie znova a skočíte na Visible v TCustomForm a znova pre skočenie na Visible v TControl.<br />
<br />
Obdobne je to s TColor.<br />
Pre prekladač je to jednoducho 'longint', ale v zdrojovom kóde je to definované ako:<br />
<pascal><br />
TGraphicsColor = -$7FFFFFFF-1..$7FFFFFFF;<br />
TColor = TGraphicsColor;<br />
</pascal><br />
<br />
Obdobné je to aj s forward definovanými triedami:<br />
Napríklad v TControl je priávtna premenná<br />
<pascal><br />
FHostDockSite: TWinControl;<br />
</pascal><br />
<br />
Hľadanie deklarácie pre TWinControl skočí na forward definíciu:<br />
<pascal><br />
TWinControl = class;<br />
</pascal><br />
<br />
A opätovné spustenie hľadania deklarácie skočí na skutočnú implementáciu:<br />
<pascal><br />
TWinControl = class(TControl)<br />
</pascal><br />
<br />
Týmto spôsobom môžete stopovať každý identifikátor a nájsť každé predefinovanie, či preťaženie.<br />
<br />
==Dokončovanie identifikátorov==<br />
(''Identifier Completion'')<br />
<br />
Dokončovanie identifikátorov je vyvolané pomocou Ctrl+Space a zobrazuje všetky vyhovujúce identifikátory. <br />
<br />
Napríklad:<br />
<pascal><br />
procedure TForm1.FormCreate(Sender: TObject);<br />
begin<br />
|<br />
end;<br />
</pascal><br />
<br />
Umiestnite kurzor medzi ''begin'' a ''end'' a stlačte Ctrl+Space. Nástroj IDE spracuje celý dosiahnuteľný kód a zobrazí zoznam všetkých nájdených identifikátorov. CodeTools kešuje výsledok, takže druhý krát bude oveľa rýchlejší.<br />
<br />
'''Poznámka pre Delphianov:''' Delphi to volá ''Dokončovanie kódu''.<br />
<br />
Niektoré identifikátory, ako 'Write', 'ReadLn', 'Low', 'SetLength', 'Self', 'Result', 'Copy' sú zabudované v prekladači a teda nie sú definované nikde v zdrojovom kóde, al Dokončovanie identifikátorov má veľa z nich tež zabudovaných. Ak nájdete nejaký chýbajúci, jednoducho vytvorte požiadadvku na vlastnosť v sledovači chýb (''bug tracker'').<br />
<br />
Dokončovanie identifikátorov nedokončuje kľúčové slová, takže ho nemožno použiť na dokončenie proc' na 'procedure'. Na toto je určené Ctrl+W [[#Dokončovanie_slov|Dokončovanie slov]] alebo Ctrl+J [[#Šablóny_kódu|Šablóny kódu]].<br />
<br />
Dokončovanie identifikátorov nezobrazuje len tie identifikátory, ktoré nie sú kompatibilné.<br />
<br />
===Predpona===<br />
Môžete začať dokončovanie identifikátorov v existujúcom slove. Potom budú písmená vľavo od kurzora brané ako predpona. <br />
<br />
Napríklad:<br />
<pascal><br />
procedure TForm1.FormCreate(Sender: TObject);<br />
begin<br />
Ca|ption<br />
end;<br />
</pascal><br />
<br />
Okno bude zobrazovať len identifikátory začínajúce sa na 'Ca'.<br />
<br />
===Klávesy===<br />
<br />
* Písmená/čísla: pridávajú znak do editora zdrojového kódu a aktuálnej predpony, čo zároveň aktualizuje zoznam.<br />
* Backspace: odstraňuje posledný znak z editora zdrojového kódu a aktuálnej predpony, čo zároveň aktualizuje zoznam.<br />
* Return: nahradzuje celé slovo na kurzore zvoleným identifikátorom a zatvára vyskakovacie okno.<br />
* Shift+Return: as ''Return'', but replaces only the prefix (left part) of the word at the cursor.<br />
* Hore/Dole: presúva výber.<br />
* Esc: zatvára vyskakovacie okno bez zmeny.<br />
* Tab: dokončuje predponu na ďalšiu voľbu. Napríklad: aktuálna predpona je 'But' a dokončovanie identifikátora zobrazuje len 'Button1' a 'Button1Click', potom stlačenie ''Tab'' dokončí predponu na 'Button1'.<br />
* Else: ako ''Return'' a pridá znak do editora zdrojového kódu.<br />
<br />
==Dokončovanie slov==<br />
(''Word Completion'')<br />
<br />
Dokončovanie slov je vyvolané stlačením Ctrl+W a zobrazuje všetky slová všetkých aktuálne otvorených editorov. Inak pracuje presne ako Dokončovanie identifikátorov.<br />
<br />
==Prejdi do direktívy include==<br />
(''Goto Include Directive'')<br />
<br />
Tento príkaz v menu Searchskočí do príkazu (direktívy) {$I filename}, v ktorej je použitý aktuálny súbor.<br />
<br />
==Publikuj Projekt==<br />
Vytvára kópiu celého projektu. Ak chcete niekomu poslať len zdrojové kódy a nastavenia prekladača pre svoj kód, budete kamarátis touto funkciou.<br />
<br />
Bežný adresár projektu obsahuje množstvo informácií. Väčšinu z nich publikovať netreba. Súbor .lpi obsahuje informácie o relácii (ako pozíciu caret a záložiek zatvorených jednotiek) a adresár projektu obsahuje mnoho súborov .ppu a .o, a tiež .exe. A práve príkaz Publikuj projekt vytvorí súbor .lpi len so základnými informáciami a všetky zdrojové kódy, so všetkých podadresárov.<br />
<br />
V ponúknutom dialógu môžete nastaviť filter pre zahrnutie/vynechanie, či pre kompresiu výstupu do jediného archívu.<br />
<br />
==Spolupracovníci==<br />
This page has been converted from the epikwiki [http://lazarus-ccr.sourceforge.net/index.php?wiki=LazarusIdeTools version].<br />
* Created page and initial template - 4/6/2004 [[User:Tom Lisjac| VlxAdmin]]<br />
* Initial content posted - 4/10/2004 MattiasG<br />
* Small wiki and formatting fixes - 4/11/2004 [[User:Tom Lisjac| VlxAdmin]]<br />
* Added a summary table for IdeTools shortcuts - 12 July 2004 [[User:Kirkpatc]]<br />
* Preložené z originálu [[Lazarus IDE Tools]] - [[User:Slavko|Slavko]] 13:51, 25 Mar 2005 (PST)</div>Slavkohttps://wiki.freepascal.org/index.php?title=Lazarus_IDE_Tools/sk&diff=26868Lazarus IDE Tools/sk2008-02-17T19:55:54Z<p>Slavko: úprava formátovania</p>
<hr />
<div>{{Lazarus IDE Tools}}<br />
<br />
==Úvod==<br />
IDE používa knižnicu analýzy zdrojového kódu Pascal a editačných nástrojov, zvanú "codetools". Tieto nástroje poskytujú funkcie ako hľadanie deklarácie (find declaration), dokončovanie kódu (code completion), odstraňovanie, presúvanie, vkladanie a formátovanie zdrojového kódu Pascal. Tieto funkcie šetria množstvo času a duplicitných úloh. Sú nastaviteľné a každá funkcia je dostupná pomocou klávesovej skratky (viď Editor Options).<br />
<br />
Pretože ich práca záleží na zdrojovom kóde a pochopení FreePascal, Delphi a Kylix kódu, nevyžadujú preložené jednotky ani nainštalovaný prekladač Borland. Môžete naraz upravovať kód Delphi aj FreePascal. Môžete dokonca pracovať s rôznymi verziami Delphi a FreePascal súčasne. Tým sa stáva prenos Delphi kódu ešte jednoduchší.<br />
<br />
==Zhrnutie klávesových skratiek IDE==<br />
{|<br />
|-<br />
| [[Lazarus IDE Tools/sk#Hľadanie_deklarácie | Hľadanie deklarácie]] (Declaration Jumping) || '''Ctrl+Click''' alebo '''Alt+Up'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Prepínanie_metód | Prepínanie metód]] (Method Jumping) || '''Ctrl+Shift+Up''' a '''Ctrl+Shift+Down'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Šablóny_kódu | Šablóny kódu]] (Code Templates) || '''Ctrl+J'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Dokončovanie_kódu | Dokončovanie kódu]] (Code/Class Completion) || '''Ctrl+Shift+C'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Dokončovanie_identifikátorov | Dokončovanie identifikátorov]] (Identifier Completion) || '''Ctrl+Medzerník'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Dokončovanie_slov | Dokončovanie slov]] (Word Completion) || '''Ctrl+W'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Pomoc_s_parametrami |Pomoc s parametrami]] (Parameter Hints) || '''Ctrl+Shift+Space'''<br />
|}<br />
<br />
==Prepínanie metód==<br />
(''Method Jumping'')<br />
<br />
Na prepínanie medzi telom procedúry (begin..end) a jej definíciou (procedure Name;) použite Ctrl+Shift+Up.<br />
<br />
Príklad:<br />
<pascal><br />
interface<br />
<br />
procedure DoSomething; // procedure definition<br />
<br />
implementation<br />
<br />
procedure DoSomething; // procedure body <br />
begin<br />
end;<br />
</pascal><br />
<br />
Ak je kurzor v tele provedúry a stlačíte Ctrl+Shift+Up, kurzor skočí na definíciu. Ak znova stlačíte Ctrl+Shift+Up preskočí do tela procedúry, za 'begin'. Funkcia pracuje aj s metódami (procedúrami v triedach).<br />
<br />
Tipy:<br />
'Method Jumping' presúva kurzor na rovnakú procedúru s rovnakým menom i zoznamom parametrov. Ak presná procedúra neexistuje, skočí na najpodobnejšiu a umiestni kurzor na prvý rozdiel. V Delphi táto funkcia neexistuje.<br />
<br />
Príklad procedúry s rôznymi typmi parametrov:<br />
<pascal><br />
interface<br />
<br />
procedure DoSomething(p: char); // procedure definition<br />
<br />
implementation<br />
<br />
procedure DoSomething(p: string); // procedure body<br />
begin<br />
end;<br />
</pascal><br />
<br />
Preskočenie z definície do tela umiestni kurzor na kľúčové slovo 'string'. Túto vlastnosť môžete využiť na premenovanie metódy a/alebo zmenu jej parametrov.<br />
<br />
Príklad:<br />
Premenovali sme 'DoSomething' na 'MakeIt':<br />
<pascal> interface<br />
<br />
procedure MakeIt; // procedure definition<br />
<br />
implementation<br />
<br />
procedure DoSomething; // procedure body<br />
begin<br />
end;<br />
</pascal><br />
<br />
Potom urobte skok z definície MakeIt do tela. IDE hľadá vhodné telo, nenájde žiadne, preto začne hľadať kandidátov. Keďže stepremenovali len jednu procedúru, tak je len jedno telo bez definície (DoSomething) a tak skočí do DoSomething a umiestni kurzor vpravo od 'DoSomething'. Potomm ju môžete jednoducho premenovať tiež. Toto rovnako pracuje s parametrami.<br />
<br />
==Include súbory==<br />
(''Include Files'')<br />
<br />
Include súbory sú súbory vložené do zdrojového kódu pomocou direktív prekladača {$I filename} alebo {$INCLUDE filename}. Lazarus a FreePascal používajú veľa takýchto vecí na redukciu nadbytočnosti a vyhnutie sa nečitateľnosti konštrukcií {$IFDEF} pri podpore rôznych platforiem.<br />
<br />
Narozdiel od Delphi, IDE Lazarus plne podporuje include súbory. Napríklad môžete skočiť z metódy v súbore .pas do tela metódy v include súbore. Všetky nástroje kódu, ako dokončovanie kódu, považuje include súbory za špeciálne hranice.<br />
<br />
Napríklad: keď dokončovanie kódu pridáva telo novej metódy za telom inej metódy, ponechá ich obe v rovnakom súbore. Týmto spôsobom môžete vložiť celú implementáciu triedy do include súborov, ako to robí LCL pre skoro všetky prvky.<br />
<br />
Ale je tu začiatočnícka chyba: Ak najprv otvoríte include súbor a skúsite prepínanie metód alebo hľadanie deklarácie, dostanete chybu. IDE nevie do ktorej jednotky include súbor patrí. Najprv musíte otvoriť jednotku.<br />
<br />
Hneď ako IDE zanalyzuje jednotku, zachytí v nej include direktívy a IDE si bude pamätať tento vzťah. Tieto informácie IDE ukladá pri skončení a pri uložení projektu do ~/.lazarus/includelinks.xml. Keď nabudúce otvoríte súbor include a urobíte skok do neho alebo hľadanie deklarácie, IDE interne otvorí jednotku a skoky budú fungovať.<br />
<br />
Tento mechanizmus má samozrejme obmedzenia, niektoré include súbory sú zahrnuté dva i viackrát. Napríklad: lcl/include/winapih.inc.<br />
Skákanie z definície procedúry/metódy v tomto include súbore do tela závisí na poslednej akcii. Ak ste pracovali v lcl/lclintf.pp, IDE skočí do winapi.inc. Ak ste pracovali v lcl/interfacebase.pp, potom skočíte do lcl/include/interfacebase.inc (alebo do jedného z ďalších include súborov). Ak pracujete s obomi, potom môže nastať zmätok. ;)<br />
<br />
==Šablóny kódu==<br />
(''Code Templates'')<br />
<br />
Šablóny kódu konvertujú identifikátor v texte alebo fragmente kódu. Šablóny kódu majú prednastavenú klávesovú skratku Ctrl+J. Môžete napísať identifikátor, stlačiť Ctrl+J a identifikátor je nahradený textom definovaným pre identifikátor. Šablóny kódu môžete definovať v Environment -> Editor Options -> CodeTools.<br />
<br />
Príklad:<br />
Napíšte identifikátor 'classf', ponechajte kurzor vpravo za 'f' a stlačte Ctrl+J. Identifikátor 'classf' bude nahradený týmto:<br />
<pascal><br />
T = class(T)<br />
private<br />
<br />
public<br />
constructor Create;<br />
destructor Destroy; override;<br />
end;<br />
</pascal><br />
<br />
a kurzor bude za 'T'.<br />
Zoznam šablón získate tak, že kurzor ponecháte na medzere (nie ne identifikátore) a stlačíte Ctrl+J. Pomocou kurzorových klávesov alebon apísania niekoľkých znakov vyberte jeden. Enter vytvorí zvolenú šablónu a Esc zatvorí zoznam.<br />
<br />
==Pomoc s parametrami==<br />
(''Parameter Hints'')<br />
Pomoc s parametrami ukazuje pomocné okno s deklaráciami parametrov aktuálneho zoznamu parametrov.<br />
<br />
Napríklad<br />
<pascal><br />
Canvas.FillRect(|);<br />
</pascal><br />
<br />
Umiestnite kurzor do zátvoriek a stlačte Ctrl+Shift+Space. Objaví sa pomocné okno, ukazujúce parametre FillRect.<br />
<br />
==Dokončovanie kódu==<br />
(''Code Completion'')<br />
<br />
Dokončovanie kódu nájdete v menu IDE Edit -> Complete Code a má štandartnú klávespvú skratku Ctrl+Shift+C.<br />
V Delphi je dokončovaním kódu volaná funkcia zobrazujúca zoznam identifikátorov na aktuálnej pozícii v zdrojovom kóde (Ctrl+Space). V Lazarus je toto nazývané dokončovanie identifikátorov (Identifier completion). Dokončovanie kódu v sebe združuje niekoľko užitočných funkcií:<br />
<br />
* '''Dokončovanie tried''' (Class Completion): dokončuje vlastnosti, pridáva telá metód, pridáva súkromné premenné a súkromné metódy;<br />
* '''Dokončovanie forward procedúr''' (Forward Procedure Completion): pridáva telá forward procedúr;<br />
* '''Dokončovanie priradenia udalostí''' (Event Assignment Completion): * dokončuje pridelenie udalostí a pridávanie tiel a definícií metód;<br />
* '''Dokončovanie lokálnych premenných''' (Local Variable Completion): pridáva definície lokálnych premenných.<br />
Ktorá funkcia je použitá, závisí na pozícii kurzora v editore zdrojového kódu.<br />
<br />
===Dokončovanie tried===<br />
(''Class Completion'')<br />
<br />
Veľmi výkonnou funkciou dokončovania kódu je "Dokončovanie tried". Vy píšete triedu, pridáte metódy a vlastnosti, a dokončovanie kódu pridá telá metód, metódy prístupu k vlastnostiam a súkromným premenným. <br />
<br />
Príklad:<br />
Vytvorte triedu (viz [[Lazarus IDE Tools/sk#Šablóny_kódu | Šablóny kódu]], aby ste ušetrili rovnakú prácu):<br />
<pascal> TExample = class(TObject)<br />
public<br />
constructor Create;<br />
destructor Destroy; override;<br />
end;</pascal><br />
<br />
Umiestnite kurzor niekde v definícii triedy a stlačte '''Ctrl+Shift+C'''. Tým budú vytvorené chýbajúce telá metód a kurzor bude presunutý na prvé vytvorené telo, takže môžete rovno začať písať kód triedy:<br />
<pascal> { TExample }<br />
<br />
constructor TExample.Create;<br />
begin<br />
|<br />
end;<br />
<br />
destructor TExample.Destroy;<br />
begin<br />
inherited Destroy;<br />
end;</pascal><br />
<br />
:'''Poznámka''': Značka '|' nie je pridaná, len ukazuje umiestnenie kurzora.<br />
<br />
Tip: Prepínať medzi telom a definíciou metódy môžete pomocou Ctrl+Shift+Up.<br />
<br />
Všimnite si, že IDE tiež pridáva volanie deštruktora základnej triedy (inherited Destroy). Toto je urobené, ak v definícii treidy použijete kľúčové slovo '''override'''.<br />
<br />
Teraz pridajte metódu '''DoSomething''':<br />
<pascal> TExample = class(TObject)<br />
public<br />
constructor Create;<br />
procedure DoSomething(i: integer);<br />
destructor Destroy; override;<br />
end;</pascal><br />
<br />
Potom stlačte '''Ctrl+Shift+C''' a IDE pridá:<br />
<pascal> procedure TExample.DoSomething(i: integer);<br />
begin<br />
|<br />
end;</pascal><br />
<br />
Ako môžete vidieť, nové telo metódy je vložené medzi Create a Destroy, presne ako je to v definícii. Týmto sú telá metód uchovávané v rovnakom logickom poradí, ako v definícii. Spôsob vkladania môžete definovať pomocou Prostredie > Voľby Codetools -> Tvorenie kódu.<br />
<br />
====Dokončovanie vlastností====<br />
Pridajte vlastnosť '''AnInteger''':<br />
<pascal> TExample = class(TObject)<br />
public<br />
constructor Create;<br />
procedure DoSomething(i: integer);<br />
destructor Destroy; override;<br />
property AnInteger;<br />
end;</pascal><br />
<br />
Stlačte Ctrl+Shift+C a dostanete:<br />
<pascal> procedure TExample.SetAnInteger(const AValue: integer);<br />
begin<br />
|if FAnInteger=AValue then exit;<br />
FAnInteger:=AValue;<br />
end;</pascal><br />
<br />
Dokončovanie kódu pridalo metódu pre prístup k zápisu do vlastnosti a nejaký základný kód.<br />
<br />
Preskočte do triedy pomocou '''Ctrl+Shift+C''' a uvidíte, že v triede pribudlo:<br />
<pascal> TExample = class(TObject)<br />
private<br />
FAnInteger: integer;<br />
procedure SetAnInteger(const AValue: integer);<br />
public<br />
constructor Create;<br />
procedure DoSomething(i: integer);<br />
destructor Destroy; override;<br />
property AnInteger: integer read FAnInteger write SetAnInteger;<br />
end;</pascal><br />
<br />
Vlastnosť bola rozšírená pridaním kľúčových slov '''Read''' a '''Write'''. V triede je nová sekcia '''private''' s premennou '''FAnInteger''' a metódou '''SetAnInteger'''. Pridanie '''F''' na začiatok privátnej premennej je bežnou notáciou Delphi, rovnako ako označenie prístupovej metódy pomocou '''Set'''. Ak to nechcete, môžete to zmeniť ponmocou Prostredie > Voľby Codetools -> Tvorenie kódu.<br />
<br />
Vytvorenie vlastnosti len na čítanie:<br />
<pascal> property PropName: PropType read;</pascal><br />
<br />
Bude rozšírené na:<br />
<pascal> property PropName: PropType read FPropName;</pascal><br />
<br />
Vytvorenie vlastnosti len pre zápis:<br />
<pascal> property PropName: PropType write;</pascal><br />
<br />
Bude rozšírené na:<br />
<pascal> property PropName: PropType write SetPropName;</pascal><br />
<br />
Vytvorenie read only vlastnosti s metódou na čítanie:<br />
<pascal> property PropName: PropType read GetPropName;</pascal><br />
<br />
Deklarácia ostane nezmenená, ale bude pridaná funkcia '''GetPropName''':<br />
<pascal> function GetpropName: PropType;</pascal><br />
<br />
Vytvorenie vlastnosti s direktívou '''stored''':<br />
<pascal> property PropName: PropType stored;</pascal><br />
<br />
Bude rozšírené na:<br />
<pascal> property PropName: PropType read FPropName write SetPropName stored PropNameIsStored;</pascal><br />
<br />
Pretože direktíva '''stored''' je používaná pre streamovanie čítania a zápisu, sú pridané aj kľúčové slová '''read''' a '''write'''.<br />
<br />
Tip:<br />
Dokončovanie identifikátorov tiež rozpoznáva nekompletné vlastnosti a navrhne predvolené mená. Napríklad:<br />
<pascal> property PropName: PropType read |;</pascal><br />
<br />
Umiestnite kurzor za medzeru za kľúčovým slovom '''read''' a stlačte Ctrl+Space pre dokončovanie identifikátorov. To vám ponúkne premennú '''FPropName''' a procedúru '''SetPropName'''.<br />
<br />
====Dokončovanie forward procedúr====<br />
(''Forward Procedure Completion'')<br />
<br />
Dokončovanie dopredných deklarácií procedúr je časťou dokončovania kódu a pridáva telá chýbajúcich procedúr, ktoré sú definované. Je vyvolané, ak je kurzor na pripravenej definícii procedúry, pomocou klávesovej skratky '''Ctrl+Shift+C'''.<br />
<br />
Napríklad:<br />
Pridajte novú procedúru do časti '''interface''':<br />
<pascal> procedure DoSomething;</pascal><br />
<br />
Umiestnite kurzor na ňu a stlačte '''Ctrl+Shift+C''' pre dokončovanie kódu. V časti '''implementation''' bude doplnené:<br />
<pascal> procedure DoSomething;<br />
begin<br />
|<br />
end;</pascal><br />
<br />
:Tip: Pomocou '''Ctrl+Shift+Up''' môžete prepínať medzi definíciou a telom procedúry.<br />
<br />
Telo novej procedúry bude pridané pred metódy tried. Ak už sú v časti interface nejaké definície procedúr, IDE sa pokúsi zachovať ich poradie, napríklad:<br />
<pascal> procedure Proc1;<br />
procedure Proc2; // nová procedúra<br />
procedure Proc3;</pascal><br />
<br />
Ak telá Proc1 a Proc3 už existujú, potom bude telo Proc2 vložené medzi telá procedúr Proc1 a Proc3. Toto správanie môže byť zmené pomocou Environment > Codetools Options -> Code Creation.<br />
<br />
Viacero procedúr:<br />
<pascal> procedure Proc1_Old; // telo existuje<br />
procedure Proc2_New; // telo neexistuje<br />
procedure Proc3_New; // "<br />
procedure Proc4_New; // "<br />
procedure Proc5_Old; // telo existuje</pascal><br />
<br />
Dokončovanie kódu pridá 3 telá procedúr (Proc2_New, Proc3_New, Proc4_New).<br />
<br />
Prečo sa to volá Dokončovanie forward procedúr"?<br />
<br />
Pretože tento nástroj nepracuje len s procedúrami definovanými v časti '''interface''', ale aj s procedúrami, ktoré sú definované pomocou kľúčového slova '''forward'''.<br />
<br />
===Dokončovanie priradenia udalostí===<br />
(''Event Assignment Completion'')<br />
<br />
Dokončovanie priradenia udalostí je čsťou Dokončovania kódu a dokončuje jeden príkaz Event:=|. Nastáva, keď je kurzor umiestnený za príkazom priradenia udalosti.<br />
<br />
Napríklad:<br />
V metóde, povedzme udalosti FormCreate event, pridajte riadok: 'OnPaint:=':<br />
<pascal><br />
procedure TForm1.Form1Create(Sender: TObject);<br />
begin<br />
OnPaint:=|<br />
end;<br />
</pascal><br />
<br />
Značka '|' je umiestnenie kurzora a netreba ju zadávať.<br />
<br />
Potom stlačte Ctrl+Shift+C pre dokončovanie kódu. Príkaz priradenia udalosti bude doplnený takto:<br />
<pascal><br />
OnPaint:=@Form1Paint;<br />
</pascal><br />
<br />
Do triedy TForm1 bude pridaná nová metóda Form1Paint. Potom je spustené dokončovanie tried a dostanete:<br />
<pascal><br />
procedure TForm1.Form1Paint(Sender: TObject);<br />
begin<br />
|<br />
end;<br />
</pascal><br />
<br />
Pracuje presne ako pridávanie metód v Object inspectore.<br />
<br />
Poznámka: Kurzor musíte umiestniť za operátor priradenia ':='. Ak ho umiestnite na identifikátor (tj. OnPaint), dokončovanie kódu spustí Dokončovanie lokálnych premenných, ktoré zlyhá, pretože OnPaint je už definovaná.<br />
<br />
Tip:<br />
Môžete definovať meno novej metódi aj sami, a to jej zadaním do priradenia, napríklad:<br />
<pascal><br />
OnPaint:=@ThePaintMethod;<br />
</pascal><br />
<br />
===Dokončovanie deklarácie premenných===<br />
(''Variable Declaration Completion'')<br />
<br />
Dokončovanie deklarácie premenných je časťou '''Dokončovania kódu''' a pridáva definíciu lokálnej premennej pre príkaz Identifier:=Term;. Dokončovanie deklarácie premenných je vyvolané, keď je kurzor umiestnený na identifikátore v priradení.<br />
<br />
Napríklad:<br />
<pascal><br />
procedure TForm1.Form1Create(Sender: TObject);<br />
begin<br />
i:=3;<br />
end;<br />
</pascal><br />
<br />
Umiestnite kurzor na 'i' alebo tesne za neho, potom stlačte Ctrl+Shift+C pre dokončovanie kódu a dostanete:<br />
<pascal><br />
procedure TForm1.Form1Create(Sender: TObject);<br />
var<br />
i: Integer;<br />
begin<br />
i:=3;<br />
end;<br />
</pascal><br />
<br />
Nástroj dokončovania kódu najprv skontroluje, či identifikátor 'i' už nie je definovaný a ak nie, pridá deklaráciu 'var i: integer;'. Typ identifikátora je odhadovaný podľa pravej strany príkazu priradenia. Čísla ako 3 sú identifikované ako Integer.<br />
<br />
Iný príklad:<br />
<pascal><br />
type<br />
TWhere = (Behind, Middle, InFront);<br />
<br />
procedure TForm1.Form1Create(Sender: TObject);<br />
var<br />
a: array[TWhere] of char;<br />
begin<br />
for Where:=Low(a) to High(a) do writeln(a[Where]);<br />
end;<br />
</pascal><br />
<br />
Umiestnite kurzor na 'Where' a stlačte Ctrl+Shift+C pre dokončenie kódu. Dostanete:<br />
<pascal><br />
procedure TForm1.Form1Create(Sender: TObject);<br />
var<br />
a: array[TWhere] of char;<br />
Where: TWhere;<br />
begin<br />
for Where:=Low(a) to High(a) do writeln(a[Where]);<br />
end;<br />
</pascal><br />
<br />
===Spätné dokončovanie triedy===<br />
(''Reversed Class Completion'')<br />
Spätné dokončovanie triedy je časťou '''Dokončovania kódu''' a pridáva deklarácie súkromných metód pre aktuálne telo metódy. Je vyvolané, keď je kurzor v tele metódy, zatiaľ nie je definované pre triedy.<br />
<br />
Táto vlastnosť je dostupná od 0.9.21.<br />
<br />
Napríklad:<br />
<pascal><br />
procedure TForm1.DoSomething(Sender: TObject);<br />
begin<br />
end;<br />
</pascal><br />
<br />
Metóda DoSomething zatiaľ nie je v TForm1 deklarovaná. Stlačte Ctrl+Shift+C a IDE pridá "procedure DoSomething(Sender: TObject);" k súkromným metódam triedy TForm1.<br />
<br />
Pre Delphianov:<br />
Dokončovanie tried pracuje pod Lazarus vždy jednym spôsobom:<br />
*Z rozhrania triedy do jej implementácie alebo naopak z implementácie triedy do jej rozhrania. Delphi vždy vyvoláva oba smery. Poszup v Delphi má nevýhodu, že ak dôjde k preklepu, ľahko vytvoríte bez upozornenia zvyšok novej metódy.<br />
<br />
===Komentáre a dokončovanie kódu===<br />
(''Comments and Code Completion'')<br />
<br />
Dokončovanie kódu sa pokúša uchovávať komentáre tam, kde sú. <br />
Príklad:<br />
<pascal><br />
FList: TList; // zoznam prvkov TComponent<br />
FInt: integer;<br />
</pascal><br />
<br />
Pri vkladaní novej premennej medzi FList a FInt, je komentár ponechaný na riadku spolu s FList. To platí i pre:<br />
<pascal><br />
FList: TList; { zoznam prvkov TComponent<br />
Toto je komentár na niekoľkých riadkoch, začínajúci<br />
na riadku s FList, tak nástroj dokončenia kódu predpokladá že patrí <br />
k riadku s FList a nepreruší tento vzťah.<br />
Kód bude vložený za komentár. }<br />
FInt: integer;<br />
</pascal><br />
<br />
Ak komentár začína na ďalšom riadku:<br />
<pascal><br />
FList: TList; // zoznam prvkov TComponent<br />
{ Tento komentár patrí k nasledujúcemu riadku. <br />
Nový kód je vložený pred tentokomentár a <br />
za komentár na riadku s FList. }<br />
FInt: integer;<br />
</pascal><br />
<br />
==Refactoring==<br />
<br />
===Otočenie priradenie===<br />
(''Invert Assignments'')<br />
<br />
Otočenie priradenia pracuje s vybratými príkazmi Pascalu a obracia všetky priradenia z tohoto výberu. Tento nástroj je užitočný pre transformáciu "save" kódu na "load" a naopak.<br />
<br />
Príklad:<br />
<pascal> procedure DoSomething;<br />
begin<br />
AValueStudio:= BValueStudio;<br />
AValueAppartment :=BValueAppartment;<br />
AValueHouse:=BValueHouse;<br />
end;<br />
</pascal><br />
<br />
Vyberte riadky s priradeniami (medzi begin a end) a urobte Otočenie priradenia, všetky priradenia budú otočené a automaticky odsadené. Výsledok:<br />
<pascal><br />
procedure DoSomething;<br />
begin<br />
BValueStudio := AValueStudio;<br />
BValueAppartment := AValueAppartment;<br />
BValueHouse := AValueHouse;<br />
end;<br />
</pascal><br />
<br />
=== Uzavrieť výber ===<br />
<br />
Vyberte nejaký text a vyvolajte nástroj. Zobrazí sa dialóg, kde si môžete vybrať či má výber uzatvorený medzi '''try..finally''' ale do mnoho iných blokov.<br />
<br />
=== Premenovať identifikátor ===<br />
<br />
Umiestnite kurzor na identifikátor a vyvolajte tento nástroj, obaví sa dialóg, v ktorom môžete nastaviť rozsah hľadania a nové meno identifikátora. <br />
* premenované budú všetky výskyty a len tie, ktoré momentálne používajú túto deklaráciu, čiže edklarácie s rovnakým menom nebudú premenované. <br />
* najprv bude vykonaná kontrola konfliktov mena. <br />
* Obmedzenia: Pracuje len so zdrojovými kódmi Pascalu, zatiaľ nepremenúva súbory ani neupravuje súbory lfm/lrs, či súbory lazdoc.<br />
<br />
=== Nájdi odkazy na identifikátor ===<br />
<br />
Umiestnite kurzor na identifikátor a vyvolajte nástroj. Objaví sa dialóg, v ktorom môžete nastaviť rozsah hľadania. IDE bude hľadať všetky výskyty a len tie, ktoré používajú aktuálnu deklaráciu. Čiže iné deklarácia s rovnakým menom, nebudú zobrazené.<br />
<br />
=== Zobraziť abstraktné metódy ===<br />
<br />
Táto funkcia vypisuje a automaticky kompletuje virtuálne, abstraktné metódy, ktoré je majú byť implementované.<br />
<br />
Umiestnite kurzor na deklaráciu triedu a vyvolajte nástroj. Ak existujú nejaké chýbajúce abstraktné metódy, nude zobrazený dialóg s ich zoznamom. Zvoľte metódy pre implementovanie a IDE vytvorí základy metód.<br />
<br />
=== Vytiahnuť procedúru ===<br />
Viz [[IDE_Window:_Extract_Procedure/sk|Extract Procedure]]<br />
<br />
==Hľadanie deklarácie==<br />
(''Find Declaration'')<br />
<br />
Umiestnite kurzor na identifikátor a urobte Hľadanie deklarácie, tým bude nájdená deklarácia tohoto identifikátora, prípadne otvorený príslušný súbor a kurzor bude premiestnený na miesto deklarácie.<br />
<br />
Každé hľadanie deklarácie nastavuje bod skoku. Tzn. po skoku na nájdenú deklaráciu môžete jednoduchos skočiť naspäť pomocou Search -> Jump back.<br />
<br />
Oproti Delphi má nástroj isté rozdiely:<br />
Nástroj pracuje so zdrojovým kódom na základe pravidiel Pascalu, a nie s výsledkom prekladača. The compiler returns the final type. Nástroj prezerá zdrojové kódy a všetky kroky medzi. Napríklad:<br />
<br />
: Vlastnosť 'Visible' je najprv definovaná v TControl (controls.pp), potom je predefinovaná v TCustomForm a nakoniec predefinovaná aj v TForm. Spustenie hľadania deklarácie vlastnosti Visible vás najprv presunie na Visible v TForm. Potom môžete spustiť hľadanie deklarácie znova a skočíte na Visible v TCustomForm a znova pre skočenie na Visible v TControl.<br />
<br />
Obdobne je to s TColor.<br />
Pre prekladač je to jednoducho 'longint', ale v zdrojovom kóde je to definované ako:<br />
<pascal><br />
TGraphicsColor = -$7FFFFFFF-1..$7FFFFFFF;<br />
TColor = TGraphicsColor;<br />
</pascal><br />
<br />
Obdobné je to aj s forward definovanými triedami:<br />
Napríklad v TControl je priávtna premenná<br />
<pascal><br />
FHostDockSite: TWinControl;<br />
</pascal><br />
<br />
Hľadanie deklarácie pre TWinControl skočí na forward definíciu:<br />
<pascal><br />
TWinControl = class;<br />
</pascal><br />
<br />
A opätovné spustenie hľadania deklarácie skočí na skutočnú implementáciu:<br />
<pascal><br />
TWinControl = class(TControl)<br />
</pascal><br />
<br />
Týmto spôsobom môžete stopovať každý identifikátor a nájsť každé predefinovanie, či preťaženie.<br />
<br />
==Dokončovanie identifikátorov==<br />
(''Identifier Completion'')<br />
<br />
Dokončovanie identifikátorov je vyvolané pomocou Ctrl+Space a zobrazuje všetky vyhovujúce identifikátory. <br />
<br />
Napríklad:<br />
<pascal><br />
procedure TForm1.FormCreate(Sender: TObject);<br />
begin<br />
|<br />
end;<br />
</pascal><br />
<br />
Umiestnite kurzor medzi ''begin'' a ''end'' a stlačte Ctrl+Space. Nástroj IDE spracuje celý dosiahnuteľný kód a zobrazí zoznam všetkých nájdených identifikátorov. CodeTools kešuje výsledok, takže druhý krát bude oveľa rýchlejší.<br />
<br />
'''Poznámka pre Delphianov:''' Delphi to volá ''Dokončovanie kódu''.<br />
<br />
Niektoré identifikátory, ako 'Write', 'ReadLn', 'Low', 'SetLength', 'Self', 'Result', 'Copy' sú zabudované v prekladači a teda nie sú definované nikde v zdrojovom kóde, al Dokončovanie identifikátorov má veľa z nich tež zabudovaných. Ak nájdete nejaký chýbajúci, jednoducho vytvorte požiadadvku na vlastnosť v sledovači chýb (''bug tracker'').<br />
<br />
Dokončovanie identifikátorov nedokončuje kľúčové slová, takže ho nemožno použiť na dokončenie proc' na 'procedure'. Na toto je určené Ctrl+W [[#Dokončovanie_slov|Dokončovanie slov]] alebo Ctrl+J [[#Šablóny_kódu|Šablóny kódu]].<br />
<br />
Dokončovanie identifikátorov nezobrazuje len tie identifikátory, ktoré nie sú kompatibilné.<br />
<br />
===Predpona===<br />
Môžete začať dokončovanie identifikátorov v existujúcom slove. Potom budú písmená vľavo od kurzora brané ako predpona. <br />
<br />
Napríklad:<br />
<pascal><br />
procedure TForm1.FormCreate(Sender: TObject);<br />
begin<br />
Ca|ption<br />
end;<br />
</pascal><br />
<br />
Okno bude zobrazovať len identifikátory začínajúce sa na 'Ca'.<br />
<br />
===Klávesy===<br />
<br />
* Písmená/čísla: pridávajú znak do editora zdrojového kódu a aktuálnej predpony, čo zároveň aktualizuje zoznam.<br />
* Backspace: odstraňuje posledný znak z editora zdrojového kódu a aktuálnej predpony, čo zároveň aktualizuje zoznam.<br />
* Return: nahradzuje celé slovo na kurzore zvoleným identifikátorom a zatvára vyskakovacie okno.<br />
* Shift+Return: as ''Return'', but replaces only the prefix (left part) of the word at the cursor.<br />
* Hore/Dole: presúva výber.<br />
* Esc: zatvára vyskakovacie okno bez zmeny.<br />
* Tab: dokončuje predponu na ďalšiu voľbu. Napríklad: aktuálna predpona je 'But' a dokončovanie identifikátora zobrazuje len 'Button1' a 'Button1Click', potom stlačenie ''Tab'' dokončí predponu na 'Button1'.<br />
* Else: ako ''Return'' a pridá znak do editora zdrojového kódu.<br />
<br />
==Dokončovanie slov==<br />
(''Word Completion'')<br />
<br />
Dokončovanie slov je vyvolané stlačením Ctrl+W a zobrazuje všetky slová všetkých aktuálne otvorených editorov. Inak pracuje presne ako Dokončovanie identifikátorov.<br />
<br />
==Prejdi do direktívy include==<br />
(''Goto Include Directive'')<br />
<br />
Tento príkaz v menu Searchskočí do príkazu (direktívy) {$I filename}, v ktorej je použitý aktuálny súbor.<br />
<br />
==Publikuj Projekt==<br />
Vytvára kópiu celého projektu. Ak chcete niekomu poslať len zdrojové kódy a nastavenia prekladača pre svoj kód, budete kamarátis touto funkciou.<br />
<br />
Bežný adresár projektu obsahuje množstvo informácií. Väčšinu z nich publikovať netreba. Súbor .lpi obsahuje informácie o relácii (ako pozíciu caret a záložiek zatvorených jednotiek) a adresár projektu obsahuje mnoho súborov .ppu a .o, a tiež .exe. A práve príkaz Publikuj projekt vytvorí súbor .lpi len so základnými informáciami a všetky zdrojové kódy, so všetkých podadresárov.<br />
<br />
V ponúknutom dialógu môžete nastaviť filter pre zahrnutie/vynechanie, či pre kompresiu výstupu do jediného archívu.<br />
<br />
==Spolupracovníci==<br />
This page has been converted from the epikwiki [http://lazarus-ccr.sourceforge.net/index.php?wiki=LazarusIdeTools version].<br />
* Created page and initial template - 4/6/2004 [[User:Tom Lisjac| VlxAdmin]]<br />
* Initial content posted - 4/10/2004 MattiasG<br />
* Small wiki and formatting fixes - 4/11/2004 [[User:Tom Lisjac| VlxAdmin]]<br />
* Added a summary table for IdeTools shortcuts - 12 July 2004 [[User:Kirkpatc]]<br />
* Preložené z originálu [[Lazarus IDE Tools]] - [[User:Slavko|Slavko]] 13:51, 25 Mar 2005 (PST)</div>Slavkohttps://wiki.freepascal.org/index.php?title=Lazarus_IDE_Tools/sk&diff=26867Lazarus IDE Tools/sk2008-02-17T19:53:15Z<p>Slavko: úprava formátovania</p>
<hr />
<div>{{Lazarus IDE Tools}}<br />
<br />
==Úvod==<br />
IDE používa knižnicu analýzy zdrojového kódu Pascal a editačných nástrojov, zvanú "codetools". Tieto nástroje poskytujú funkcie ako hľadanie deklarácie (find declaration), dokončovanie kódu (code completion), odstraňovanie, presúvanie, vkladanie a formátovanie zdrojového kódu Pascal. Tieto funkcie šetria množstvo času a duplicitných úloh. Sú nastaviteľné a každá funkcia je dostupná pomocou klávesovej skratky (viď Editor Options).<br />
<br />
Pretože ich práca záleží na zdrojovom kóde a pochopení FreePascal, Delphi a Kylix kódu, nevyžadujú preložené jednotky ani nainštalovaný prekladač Borland. Môžete naraz upravovať kód Delphi aj FreePascal. Môžete dokonca pracovať s rôznymi verziami Delphi a FreePascal súčasne. Tým sa stáva prenos Delphi kódu ešte jednoduchší.<br />
<br />
==Zhrnutie klávesových skratiek IDE==<br />
{|<br />
|-<br />
| [[Lazarus IDE Tools/sk#Hľadanie_deklarácie | Hľadanie deklarácie]] (Declaration Jumping) || '''Ctrl+Click''' alebo '''Alt+Up'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Prepínanie_metód | Prepínanie metód]] (Method Jumping) || '''Ctrl+Shift+Up''' a '''Ctrl+Shift+Down'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Šablóny_kódu | Šablóny kódu]] (Code Templates) || '''Ctrl+J'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Dokončovanie_kódu | Dokončovanie kódu]] (Code/Class Completion) || '''Ctrl+Shift+C'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Dokončovanie_identifikátorov | Dokončovanie identifikátorov]] (Identifier Completion) || '''Ctrl+Medzerník'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Dokončovanie_slov | Dokončovanie slov]] (Word Completion) || '''Ctrl+W'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Pomoc_s_parametrami |Pomoc s parametrami]] (Parameter Hints) || '''Ctrl+Shift+Space'''<br />
|}<br />
<br />
==Prepínanie metód==<br />
(''Method Jumping'')<br />
<br />
Na prepínanie medzi telom procedúry (begin..end) a jej definíciou (procedure Name;) použite Ctrl+Shift+Up.<br />
<br />
Príklad:<br />
<pascal><br />
interface<br />
<br />
procedure DoSomething; // procedure definition<br />
<br />
implementation<br />
<br />
procedure DoSomething; // procedure body <br />
begin<br />
end;<br />
</pascal><br />
<br />
Ak je kurzor v tele provedúry a stlačíte Ctrl+Shift+Up, kurzor skočí na definíciu. Ak znova stlačíte Ctrl+Shift+Up preskočí do tela procedúry, za 'begin'. Funkcia pracuje aj s metódami (procedúrami v triedach).<br />
<br />
Tipy:<br />
'Method Jumping' presúva kurzor na rovnakú procedúru s rovnakým menom i zoznamom parametrov. Ak presná procedúra neexistuje, skočí na najpodobnejšiu a umiestni kurzor na prvý rozdiel. V Delphi táto funkcia neexistuje.<br />
<br />
Príklad procedúry s rôznymi typmi parametrov:<br />
<pascal><br />
interface<br />
<br />
procedure DoSomething(p: char); // procedure definition<br />
<br />
implementation<br />
<br />
procedure DoSomething(p: string); // procedure body<br />
begin<br />
end;<br />
</pascal><br />
<br />
Preskočenie z definície do tela umiestni kurzor na kľúčové slovo 'string'. Túto vlastnosť môžete využiť na premenovanie metódy a/alebo zmenu jej parametrov.<br />
<br />
Príklad:<br />
Premenovali sme 'DoSomething' na 'MakeIt':<br />
<pascal> interface<br />
<br />
procedure MakeIt; // procedure definition<br />
<br />
implementation<br />
<br />
procedure DoSomething; // procedure body<br />
begin<br />
end;<br />
</pascal><br />
<br />
Potom urobte skok z definície MakeIt do tela. IDE hľadá vhodné telo, nenájde žiadne, preto začne hľadať kandidátov. Keďže stepremenovali len jednu procedúru, tak je len jedno telo bez definície (DoSomething) a tak skočí do DoSomething a umiestni kurzor vpravo od 'DoSomething'. Potomm ju môžete jednoducho premenovať tiež. Toto rovnako pracuje s parametrami.<br />
<br />
==Include súbory==<br />
(''Include Files'')<br />
<br />
Include súbory sú súbory vložené do zdrojového kódu pomocou direktív prekladača {$I filename} alebo {$INCLUDE filename}. Lazarus a FreePascal používajú veľa takýchto vecí na redukciu nadbytočnosti a vyhnutie sa nečitateľnosti konštrukcií {$IFDEF} pri podpore rôznych platforiem.<br />
<br />
Narozdiel od Delphi, IDE Lazarus plne podporuje include súbory. Napríklad môžete skočiť z metódy v súbore .pas do tela metódy v include súbore. Všetky nástroje kódu, ako dokončovanie kódu, považuje include súbory za špeciálne hranice.<br />
<br />
Napríklad: keď dokončovanie kódu pridáva telo novej metódy za telom inej metódy, ponechá ich obe v rovnakom súbore. Týmto spôsobom môžete vložiť celú implementáciu triedy do include súborov, ako to robí LCL pre skoro všetky prvky.<br />
<br />
Ale je tu začiatočnícka chyba: Ak najprv otvoríte include súbor a skúsite prepínanie metód alebo hľadanie deklarácie, dostanete chybu. IDE nevie do ktorej jednotky include súbor patrí. Najprv musíte otvoriť jednotku.<br />
<br />
Hneď ako IDE zanalyzuje jednotku, zachytí v nej include direktívy a IDE si bude pamätať tento vzťah. Tieto informácie IDE ukladá pri skončení a pri uložení projektu do ~/.lazarus/includelinks.xml. Keď nabudúce otvoríte súbor include a urobíte skok do neho alebo hľadanie deklarácie, IDE interne otvorí jednotku a skoky budú fungovať.<br />
<br />
Tento mechanizmus má samozrejme obmedzenia, niektoré include súbory sú zahrnuté dva i viackrát. Napríklad: lcl/include/winapih.inc.<br />
Skákanie z definície procedúry/metódy v tomto include súbore do tela závisí na poslednej akcii. Ak ste pracovali v lcl/lclintf.pp, IDE skočí do winapi.inc. Ak ste pracovali v lcl/interfacebase.pp, potom skočíte do lcl/include/interfacebase.inc (alebo do jedného z ďalších include súborov). Ak pracujete s obomi, potom môže nastať zmätok. ;)<br />
<br />
==Šablóny kódu==<br />
(''Code Templates'')<br />
<br />
Šablóny kódu konvertujú identifikátor v texte alebo fragmente kódu. Šablóny kódu majú prednastavenú klávesovú skratku Ctrl+J. Môžete napísať identifikátor, stlačiť Ctrl+J a identifikátor je nahradený textom definovaným pre identifikátor. Šablóny kódu môžete definovať v Environment -> Editor Options -> CodeTools.<br />
<br />
Príklad:<br />
Napíšte identifikátor 'classf', ponechajte kurzor vpravo za 'f' a stlačte Ctrl+J. Identifikátor 'classf' bude nahradený týmto:<br />
<pascal><br />
T = class(T)<br />
private<br />
<br />
public<br />
constructor Create;<br />
destructor Destroy; override;<br />
end;<br />
</pascal><br />
<br />
a kurzor bude za 'T'.<br />
Zoznam šablón získate tak, že kurzor ponecháte na medzere (nie ne identifikátore) a stlačíte Ctrl+J. Pomocou kurzorových klávesov alebon apísania niekoľkých znakov vyberte jeden. Enter vytvorí zvolenú šablónu a Esc zatvorí zoznam.<br />
<br />
==Pomoc s parametrami==<br />
(''Parameter Hints'')<br />
Pomoc s parametrami ukazuje pomocné okno s deklaráciami parametrov aktuálneho zoznamu parametrov.<br />
<br />
Napríklad<br />
<pascal><br />
Canvas.FillRect(|);<br />
</pascal><br />
<br />
Umiestnite kurzor do zátvoriek a stlačte Ctrl+Shift+Space. Objaví sa pomocné okno, ukazujúce parametre FillRect.<br />
<br />
==Dokončovanie kódu==<br />
(''Code Completion'')<br />
<br />
Dokončovanie kódu nájdete v menu IDE Edit -> Complete Code a má štandartnú klávespvú skratku Ctrl+Shift+C.<br />
V Delphi je dokončovaním kódu volaná funkcia zobrazujúca zoznam identifikátorov na aktuálnej pozícii v zdrojovom kóde (Ctrl+Space). V Lazarus je toto nazývané dokončovanie identifikátorov (Identifier completion). Dokončovanie kódu v sebe združuje niekoľko užitočných funkcií:<br />
<br />
* '''Dokončovanie tried''' (Class Completion): dokončuje vlastnosti, pridáva telá metód, pridáva súkromné premenné a súkromné metódy;<br />
* '''Dokončovanie forward procedúr''' (Forward Procedure Completion): pridáva telá forward procedúr;<br />
* '''Dokončovanie priradenia udalostí''' (Event Assignment Completion): * dokončuje pridelenie udalostí a pridávanie tiel a definícií metód;<br />
* '''Dokončovanie lokálnych premenných''' (Local Variable Completion): pridáva definície lokálnych premenných.<br />
Ktorá funkcia je použitá, závisí na pozícii kurzora v editore zdrojového kódu.<br />
<br />
===Dokončovanie tried===<br />
(''Class Completion'')<br />
<br />
Veľmi výkonnou funkciou dokončovania kódu je "Dokončovanie tried". Vy píšete triedu, pridáte metódy a vlastnosti, a dokončovanie kódu pridá telá metód, metódy prístupu k vlastnostiam a súkromným premenným. <br />
<br />
Príklad:<br />
Vytvorte triedu (viz [[Lazarus IDE Tools/sk#Šablóny_kódu | Šablóny kódu]], aby ste ušetrili rovnakú prácu):<br />
<pascal> TExample = class(TObject)<br />
public<br />
constructor Create;<br />
destructor Destroy; override;<br />
end;</pascal><br />
<br />
Umiestnite kurzor niekde v definícii triedy a stlačte '''Ctrl+Shift+C'''. Tým budú vytvorené chýbajúce telá metód a kurzor bude presunutý na prvé vytvorené telo, takže môžete rovno začať písať kód triedy:<br />
<pascal> { TExample }<br />
<br />
constructor TExample.Create;<br />
begin<br />
|<br />
end;<br />
<br />
destructor TExample.Destroy;<br />
begin<br />
inherited Destroy;<br />
end;</pascal><br />
<br />
:'''Poznámka''': Značka '|' nie je pridaná, len ukazuje umiestnenie kurzora.<br />
<br />
Tip: Prepínať medzi telom a definíciou metódy môžete pomocou Ctrl+Shift+Up.<br />
<br />
Všimnite si, že IDE tiež pridáva volanie deštruktora základnej triedy (inherited Destroy). Toto je urobené, ak v definícii treidy použijete kľúčové slovo '''override'''.<br />
<br />
Teraz pridajte metódu '''DoSomething''':<br />
<pascal> TExample = class(TObject)<br />
public<br />
constructor Create;<br />
procedure DoSomething(i: integer);<br />
destructor Destroy; override;<br />
end;</pascal><br />
<br />
Potom stlačte '''Ctrl+Shift+C''' a IDE pridá:<br />
<pascal> procedure TExample.DoSomething(i: integer);<br />
begin<br />
|<br />
end;</pascal><br />
<br />
Ako môžete vidieť, nové telo metódy je vložené medzi Create a Destroy, presne ako je to v definícii. Týmto sú telá metód uchovávané v rovnakom logickom poradí, ako v definícii. Spôsob vkladania môžete definovať pomocou Prostredie > Voľby Codetools -> Tvorenie kódu.<br />
<br />
====Dokončovanie vlastností====<br />
Pridajte vlastnosť '''AnInteger''':<br />
<pascal> TExample = class(TObject)<br />
public<br />
constructor Create;<br />
procedure DoSomething(i: integer);<br />
destructor Destroy; override;<br />
property AnInteger;<br />
end;</pascal><br />
<br />
Stlačte Ctrl+Shift+C a dostanete:<br />
<pascal> procedure TExample.SetAnInteger(const AValue: integer);<br />
begin<br />
|if FAnInteger=AValue then exit;<br />
FAnInteger:=AValue;<br />
end;</pascal><br />
<br />
Dokončovanie kódu pridalo metódu pre prístup k zápisu do vlastnosti a nejaký základný kód.<br />
<br />
Preskočte do triedy pomocou '''Ctrl+Shift+C''' a uvidíte, že v triede pribudlo:<br />
<pascal> TExample = class(TObject)<br />
private<br />
FAnInteger: integer;<br />
procedure SetAnInteger(const AValue: integer);<br />
public<br />
constructor Create;<br />
procedure DoSomething(i: integer);<br />
destructor Destroy; override;<br />
property AnInteger: integer read FAnInteger write SetAnInteger;<br />
end;</pascal><br />
<br />
Vlastnosť bola rozšírená pridaním kľúčových slov '''Read''' a '''Write'''. V triede je nová sekcia '''private''' s premennou '''FAnInteger''' a metódou '''SetAnInteger'''. Pridanie '''F''' na začiatok privátnej premennej je bežnou notáciou Delphi, rovnako ako označenie prístupovej metódy pomocou '''Set'''. Ak to nechcete, môžete to zmeniť ponmocou Prostredie > Voľby Codetools -> Tvorenie kódu.<br />
<br />
Vytvorenie vlastnosti len na čítanie:<br />
<pascal> property PropName: PropType read;</pascal><br />
<br />
Bude rozšírené na:<br />
<pascal> property PropName: PropType read FPropName;</pascal><br />
<br />
Vytvorenie vlastnosti len pre zápis:<br />
<pascal> property PropName: PropType write;</pascal><br />
<br />
Bude rozšírené na:<br />
<pascal> property PropName: PropType write SetPropName;</pascal><br />
<br />
Vytvorenie read only vlastnosti s metódou na čítanie:<br />
<pascal> property PropName: PropType read GetPropName;</pascal><br />
<br />
Deklarácia ostane nezmenená, ale bude pridaná funkcia '''GetPropName''':<br />
<pascal> function GetpropName: PropType;</pascal><br />
<br />
Vytvorenie vlastnosti s direktívou '''stored''':<br />
<pascal> property PropName: PropType stored;</pascal><br />
<br />
Bude rozšírené na:<br />
<pascal> property PropName: PropType read FPropName write SetPropName stored PropNameIsStored;</pascal><br />
<br />
Pretože direktíva '''stored''' je používaná pre streamovanie čítania a zápisu, sú pridané aj kľúčové slová '''read''' a '''write'''.<br />
<br />
Tip:<br />
Dokončovanie identifikátorov tiež rozpoznáva nekompletné vlastnosti a navrhne predvolené mená. Napríklad:<br />
<pascal> property PropName: PropType read |;</pascal><br />
<br />
Umiestnite kurzor za medzeru za kľúčovým slovom '''read''' a stlačte Ctrl+Space pre dokončovanie identifikátorov. To vám ponúkne premennú '''FPropName''' a procedúru '''SetPropName'''.<br />
<br />
===Dokončovanie forward procedúr===<br />
(''Forward Procedure Completion'')<br />
<br />
Dokončovanie forward procedúr je časťou dokončovania kódu a pridáva telá chýbajúcich procedúr, ktoré sú definované. Je vyvolané, ak je kurzor na pripravenej definícii procedúry.<br />
<br />
Napríklad:<br />
Pridajte novú procedúru do časti '''interface''':<br />
<pascal><br />
procedure DoSomething;<br />
</pascal><br />
<br />
Umiestnite kurzor na ňu a stlačte Ctrl+Shift+C pre dokončovaniekódu. V časti '''implementation''' bude doplnené:<br />
<pascal><br />
procedure DoSomething;<br />
begin<br />
|<br />
end;<br />
</pascal><br />
<br />
Tip: Pomocou Ctrl+Shift+Up môžete prepínať medzi definíciou a telom procedúry.<br />
<br />
Telo novej procedúry bude pridané pred metódy tried. Ak už sú v časti interface nejaké definície procedúr, IDE sa pokúsi zachovať ich poradie, napríklad:<br />
<pascal><br />
procedure Proc1;<br />
procedure Proc2; // nová procedúra<br />
procedure Proc3;<br />
</pascal><br />
<br />
Ak telá Proc1 a Proc3 už existujú, potom bude telo Proc2 vložené medzi telá procedúr Proc1 a Proc3. Toto správanie môže byť zmené pomocou Environment > Codetools Options -> Code Creation.<br />
<br />
Viacero procedúr:<br />
<pascal><br />
procedure Proc1_Old; // telo existuje<br />
procedure Proc2_New; // telo neexistuje<br />
procedure Proc3_New; // "<br />
procedure Proc4_New; // "<br />
procedure Proc5_Old; // telo existuje<br />
</pascal><br />
<br />
Dokončovanie kódu pridá 3 telá procedúr (Proc2_New, Proc3_New, Proc4_New).<br />
<br />
Prečo sa to volá Dokončovanie forward procedúr"?<br />
<br />
Pretože tento nástroj nepracuje len s procedúrami definovanými v časti interface, ale aj s procedúrami, ktoré sú definované pomocou kľúčového slova '''forward'''.<br />
<br />
===Dokončovanie priradenia udalostí===<br />
(''Event Assignment Completion'')<br />
<br />
Dokončovanie priradenia udalostí je čsťou Dokončovania kódu a dokončuje jeden príkaz Event:=|. Nastáva, keď je kurzor umiestnený za príkazom priradenia udalosti.<br />
<br />
Napríklad:<br />
V metóde, povedzme udalosti FormCreate event, pridajte riadok: 'OnPaint:=':<br />
<pascal><br />
procedure TForm1.Form1Create(Sender: TObject);<br />
begin<br />
OnPaint:=|<br />
end;<br />
</pascal><br />
<br />
Značka '|' je umiestnenie kurzora a netreba ju zadávať.<br />
<br />
Potom stlačte Ctrl+Shift+C pre dokončovanie kódu. Príkaz priradenia udalosti bude doplnený takto:<br />
<pascal><br />
OnPaint:=@Form1Paint;<br />
</pascal><br />
<br />
Do triedy TForm1 bude pridaná nová metóda Form1Paint. Potom je spustené dokončovanie tried a dostanete:<br />
<pascal><br />
procedure TForm1.Form1Paint(Sender: TObject);<br />
begin<br />
|<br />
end;<br />
</pascal><br />
<br />
Pracuje presne ako pridávanie metód v Object inspectore.<br />
<br />
Poznámka: Kurzor musíte umiestniť za operátor priradenia ':='. Ak ho umiestnite na identifikátor (tj. OnPaint), dokončovanie kódu spustí Dokončovanie lokálnych premenných, ktoré zlyhá, pretože OnPaint je už definovaná.<br />
<br />
Tip:<br />
Môžete definovať meno novej metódi aj sami, a to jej zadaním do priradenia, napríklad:<br />
<pascal><br />
OnPaint:=@ThePaintMethod;<br />
</pascal><br />
<br />
===Dokončovanie deklarácie premenných===<br />
(''Variable Declaration Completion'')<br />
<br />
Dokončovanie deklarácie premenných je časťou '''Dokončovania kódu''' a pridáva definíciu lokálnej premennej pre príkaz Identifier:=Term;. Dokončovanie deklarácie premenných je vyvolané, keď je kurzor umiestnený na identifikátore v priradení.<br />
<br />
Napríklad:<br />
<pascal><br />
procedure TForm1.Form1Create(Sender: TObject);<br />
begin<br />
i:=3;<br />
end;<br />
</pascal><br />
<br />
Umiestnite kurzor na 'i' alebo tesne za neho, potom stlačte Ctrl+Shift+C pre dokončovanie kódu a dostanete:<br />
<pascal><br />
procedure TForm1.Form1Create(Sender: TObject);<br />
var<br />
i: Integer;<br />
begin<br />
i:=3;<br />
end;<br />
</pascal><br />
<br />
Nástroj dokončovania kódu najprv skontroluje, či identifikátor 'i' už nie je definovaný a ak nie, pridá deklaráciu 'var i: integer;'. Typ identifikátora je odhadovaný podľa pravej strany príkazu priradenia. Čísla ako 3 sú identifikované ako Integer.<br />
<br />
Iný príklad:<br />
<pascal><br />
type<br />
TWhere = (Behind, Middle, InFront);<br />
<br />
procedure TForm1.Form1Create(Sender: TObject);<br />
var<br />
a: array[TWhere] of char;<br />
begin<br />
for Where:=Low(a) to High(a) do writeln(a[Where]);<br />
end;<br />
</pascal><br />
<br />
Umiestnite kurzor na 'Where' a stlačte Ctrl+Shift+C pre dokončenie kódu. Dostanete:<br />
<pascal><br />
procedure TForm1.Form1Create(Sender: TObject);<br />
var<br />
a: array[TWhere] of char;<br />
Where: TWhere;<br />
begin<br />
for Where:=Low(a) to High(a) do writeln(a[Where]);<br />
end;<br />
</pascal><br />
<br />
===Spätné dokončovanie triedy===<br />
(''Reversed Class Completion'')<br />
Spätné dokončovanie triedy je časťou '''Dokončovania kódu''' a pridáva deklarácie súkromných metód pre aktuálne telo metódy. Je vyvolané, keď je kurzor v tele metódy, zatiaľ nie je definované pre triedy.<br />
<br />
Táto vlastnosť je dostupná od 0.9.21.<br />
<br />
Napríklad:<br />
<pascal><br />
procedure TForm1.DoSomething(Sender: TObject);<br />
begin<br />
end;<br />
</pascal><br />
<br />
Metóda DoSomething zatiaľ nie je v TForm1 deklarovaná. Stlačte Ctrl+Shift+C a IDE pridá "procedure DoSomething(Sender: TObject);" k súkromným metódam triedy TForm1.<br />
<br />
Pre Delphianov:<br />
Dokončovanie tried pracuje pod Lazarus vždy jednym spôsobom:<br />
*Z rozhrania triedy do jej implementácie alebo naopak z implementácie triedy do jej rozhrania. Delphi vždy vyvoláva oba smery. Poszup v Delphi má nevýhodu, že ak dôjde k preklepu, ľahko vytvoríte bez upozornenia zvyšok novej metódy.<br />
<br />
===Komentáre a dokončovanie kódu===<br />
(''Comments and Code Completion'')<br />
<br />
Dokončovanie kódu sa pokúša uchovávať komentáre tam, kde sú. <br />
Príklad:<br />
<pascal><br />
FList: TList; // zoznam prvkov TComponent<br />
FInt: integer;<br />
</pascal><br />
<br />
Pri vkladaní novej premennej medzi FList a FInt, je komentár ponechaný na riadku spolu s FList. To platí i pre:<br />
<pascal><br />
FList: TList; { zoznam prvkov TComponent<br />
Toto je komentár na niekoľkých riadkoch, začínajúci<br />
na riadku s FList, tak nástroj dokončenia kódu predpokladá že patrí <br />
k riadku s FList a nepreruší tento vzťah.<br />
Kód bude vložený za komentár. }<br />
FInt: integer;<br />
</pascal><br />
<br />
Ak komentár začína na ďalšom riadku:<br />
<pascal><br />
FList: TList; // zoznam prvkov TComponent<br />
{ Tento komentár patrí k nasledujúcemu riadku. <br />
Nový kód je vložený pred tentokomentár a <br />
za komentár na riadku s FList. }<br />
FInt: integer;<br />
</pascal><br />
<br />
==Refactoring==<br />
<br />
===Otočenie priradenie===<br />
(''Invert Assignments'')<br />
<br />
Otočenie priradenia pracuje s vybratými príkazmi Pascalu a obracia všetky priradenia z tohoto výberu. Tento nástroj je užitočný pre transformáciu "save" kódu na "load" a naopak.<br />
<br />
Príklad:<br />
<pascal> procedure DoSomething;<br />
begin<br />
AValueStudio:= BValueStudio;<br />
AValueAppartment :=BValueAppartment;<br />
AValueHouse:=BValueHouse;<br />
end;<br />
</pascal><br />
<br />
Vyberte riadky s priradeniami (medzi begin a end) a urobte Otočenie priradenia, všetky priradenia budú otočené a automaticky odsadené. Výsledok:<br />
<pascal><br />
procedure DoSomething;<br />
begin<br />
BValueStudio := AValueStudio;<br />
BValueAppartment := AValueAppartment;<br />
BValueHouse := AValueHouse;<br />
end;<br />
</pascal><br />
<br />
=== Uzavrieť výber ===<br />
<br />
Vyberte nejaký text a vyvolajte nástroj. Zobrazí sa dialóg, kde si môžete vybrať či má výber uzatvorený medzi '''try..finally''' ale do mnoho iných blokov.<br />
<br />
=== Premenovať identifikátor ===<br />
<br />
Umiestnite kurzor na identifikátor a vyvolajte tento nástroj, obaví sa dialóg, v ktorom môžete nastaviť rozsah hľadania a nové meno identifikátora. <br />
* premenované budú všetky výskyty a len tie, ktoré momentálne používajú túto deklaráciu, čiže edklarácie s rovnakým menom nebudú premenované. <br />
* najprv bude vykonaná kontrola konfliktov mena. <br />
* Obmedzenia: Pracuje len so zdrojovými kódmi Pascalu, zatiaľ nepremenúva súbory ani neupravuje súbory lfm/lrs, či súbory lazdoc.<br />
<br />
=== Nájdi odkazy na identifikátor ===<br />
<br />
Umiestnite kurzor na identifikátor a vyvolajte nástroj. Objaví sa dialóg, v ktorom môžete nastaviť rozsah hľadania. IDE bude hľadať všetky výskyty a len tie, ktoré používajú aktuálnu deklaráciu. Čiže iné deklarácia s rovnakým menom, nebudú zobrazené.<br />
<br />
=== Zobraziť abstraktné metódy ===<br />
<br />
Táto funkcia vypisuje a automaticky kompletuje virtuálne, abstraktné metódy, ktoré je majú byť implementované.<br />
<br />
Umiestnite kurzor na deklaráciu triedu a vyvolajte nástroj. Ak existujú nejaké chýbajúce abstraktné metódy, nude zobrazený dialóg s ich zoznamom. Zvoľte metódy pre implementovanie a IDE vytvorí základy metód.<br />
<br />
=== Vytiahnuť procedúru ===<br />
Viz [[IDE_Window:_Extract_Procedure/sk|Extract Procedure]]<br />
<br />
==Hľadanie deklarácie==<br />
(''Find Declaration'')<br />
<br />
Umiestnite kurzor na identifikátor a urobte Hľadanie deklarácie, tým bude nájdená deklarácia tohoto identifikátora, prípadne otvorený príslušný súbor a kurzor bude premiestnený na miesto deklarácie.<br />
<br />
Každé hľadanie deklarácie nastavuje bod skoku. Tzn. po skoku na nájdenú deklaráciu môžete jednoduchos skočiť naspäť pomocou Search -> Jump back.<br />
<br />
Oproti Delphi má nástroj isté rozdiely:<br />
Nástroj pracuje so zdrojovým kódom na základe pravidiel Pascalu, a nie s výsledkom prekladača. The compiler returns the final type. Nástroj prezerá zdrojové kódy a všetky kroky medzi. Napríklad:<br />
<br />
: Vlastnosť 'Visible' je najprv definovaná v TControl (controls.pp), potom je predefinovaná v TCustomForm a nakoniec predefinovaná aj v TForm. Spustenie hľadania deklarácie vlastnosti Visible vás najprv presunie na Visible v TForm. Potom môžete spustiť hľadanie deklarácie znova a skočíte na Visible v TCustomForm a znova pre skočenie na Visible v TControl.<br />
<br />
Obdobne je to s TColor.<br />
Pre prekladač je to jednoducho 'longint', ale v zdrojovom kóde je to definované ako:<br />
<pascal><br />
TGraphicsColor = -$7FFFFFFF-1..$7FFFFFFF;<br />
TColor = TGraphicsColor;<br />
</pascal><br />
<br />
Obdobné je to aj s forward definovanými triedami:<br />
Napríklad v TControl je priávtna premenná<br />
<pascal><br />
FHostDockSite: TWinControl;<br />
</pascal><br />
<br />
Hľadanie deklarácie pre TWinControl skočí na forward definíciu:<br />
<pascal><br />
TWinControl = class;<br />
</pascal><br />
<br />
A opätovné spustenie hľadania deklarácie skočí na skutočnú implementáciu:<br />
<pascal><br />
TWinControl = class(TControl)<br />
</pascal><br />
<br />
Týmto spôsobom môžete stopovať každý identifikátor a nájsť každé predefinovanie, či preťaženie.<br />
<br />
==Dokončovanie identifikátorov==<br />
(''Identifier Completion'')<br />
<br />
Dokončovanie identifikátorov je vyvolané pomocou Ctrl+Space a zobrazuje všetky vyhovujúce identifikátory. <br />
<br />
Napríklad:<br />
<pascal><br />
procedure TForm1.FormCreate(Sender: TObject);<br />
begin<br />
|<br />
end;<br />
</pascal><br />
<br />
Umiestnite kurzor medzi ''begin'' a ''end'' a stlačte Ctrl+Space. Nástroj IDE spracuje celý dosiahnuteľný kód a zobrazí zoznam všetkých nájdených identifikátorov. CodeTools kešuje výsledok, takže druhý krát bude oveľa rýchlejší.<br />
<br />
'''Poznámka pre Delphianov:''' Delphi to volá ''Dokončovanie kódu''.<br />
<br />
Niektoré identifikátory, ako 'Write', 'ReadLn', 'Low', 'SetLength', 'Self', 'Result', 'Copy' sú zabudované v prekladači a teda nie sú definované nikde v zdrojovom kóde, al Dokončovanie identifikátorov má veľa z nich tež zabudovaných. Ak nájdete nejaký chýbajúci, jednoducho vytvorte požiadadvku na vlastnosť v sledovači chýb (''bug tracker'').<br />
<br />
Dokončovanie identifikátorov nedokončuje kľúčové slová, takže ho nemožno použiť na dokončenie proc' na 'procedure'. Na toto je určené Ctrl+W [[#Dokončovanie_slov|Dokončovanie slov]] alebo Ctrl+J [[#Šablóny_kódu|Šablóny kódu]].<br />
<br />
Dokončovanie identifikátorov nezobrazuje len tie identifikátory, ktoré nie sú kompatibilné.<br />
<br />
===Predpona===<br />
Môžete začať dokončovanie identifikátorov v existujúcom slove. Potom budú písmená vľavo od kurzora brané ako predpona. <br />
<br />
Napríklad:<br />
<pascal><br />
procedure TForm1.FormCreate(Sender: TObject);<br />
begin<br />
Ca|ption<br />
end;<br />
</pascal><br />
<br />
Okno bude zobrazovať len identifikátory začínajúce sa na 'Ca'.<br />
<br />
===Klávesy===<br />
<br />
* Písmená/čísla: pridávajú znak do editora zdrojového kódu a aktuálnej predpony, čo zároveň aktualizuje zoznam.<br />
* Backspace: odstraňuje posledný znak z editora zdrojového kódu a aktuálnej predpony, čo zároveň aktualizuje zoznam.<br />
* Return: nahradzuje celé slovo na kurzore zvoleným identifikátorom a zatvára vyskakovacie okno.<br />
* Shift+Return: as ''Return'', but replaces only the prefix (left part) of the word at the cursor.<br />
* Hore/Dole: presúva výber.<br />
* Esc: zatvára vyskakovacie okno bez zmeny.<br />
* Tab: dokončuje predponu na ďalšiu voľbu. Napríklad: aktuálna predpona je 'But' a dokončovanie identifikátora zobrazuje len 'Button1' a 'Button1Click', potom stlačenie ''Tab'' dokončí predponu na 'Button1'.<br />
* Else: ako ''Return'' a pridá znak do editora zdrojového kódu.<br />
<br />
==Dokončovanie slov==<br />
(''Word Completion'')<br />
<br />
Dokončovanie slov je vyvolané stlačením Ctrl+W a zobrazuje všetky slová všetkých aktuálne otvorených editorov. Inak pracuje presne ako Dokončovanie identifikátorov.<br />
<br />
==Prejdi do direktívy include==<br />
(''Goto Include Directive'')<br />
<br />
Tento príkaz v menu Searchskočí do príkazu (direktívy) {$I filename}, v ktorej je použitý aktuálny súbor.<br />
<br />
==Publikuj Projekt==<br />
Vytvára kópiu celého projektu. Ak chcete niekomu poslať len zdrojové kódy a nastavenia prekladača pre svoj kód, budete kamarátis touto funkciou.<br />
<br />
Bežný adresár projektu obsahuje množstvo informácií. Väčšinu z nich publikovať netreba. Súbor .lpi obsahuje informácie o relácii (ako pozíciu caret a záložiek zatvorených jednotiek) a adresár projektu obsahuje mnoho súborov .ppu a .o, a tiež .exe. A práve príkaz Publikuj projekt vytvorí súbor .lpi len so základnými informáciami a všetky zdrojové kódy, so všetkých podadresárov.<br />
<br />
V ponúknutom dialógu môžete nastaviť filter pre zahrnutie/vynechanie, či pre kompresiu výstupu do jediného archívu.<br />
<br />
==Spolupracovníci==<br />
This page has been converted from the epikwiki [http://lazarus-ccr.sourceforge.net/index.php?wiki=LazarusIdeTools version].<br />
* Created page and initial template - 4/6/2004 [[User:Tom Lisjac| VlxAdmin]]<br />
* Initial content posted - 4/10/2004 MattiasG<br />
* Small wiki and formatting fixes - 4/11/2004 [[User:Tom Lisjac| VlxAdmin]]<br />
* Added a summary table for IdeTools shortcuts - 12 July 2004 [[User:Kirkpatc]]<br />
* Preložené z originálu [[Lazarus IDE Tools]] - [[User:Slavko|Slavko]] 13:51, 25 Mar 2005 (PST)</div>Slavkohttps://wiki.freepascal.org/index.php?title=Lazarus_IDE_Tools/sk&diff=26866Lazarus IDE Tools/sk2008-02-17T18:35:49Z<p>Slavko: úprava formátovania kódu</p>
<hr />
<div>{{Lazarus IDE Tools}}<br />
<br />
==Úvod==<br />
IDE používa knižnicu analýzy zdrojového kódu Pascal a editačných nástrojov, zvanú "codetools". Tieto nástroje poskytujú funkcie ako hľadanie deklarácie (find declaration), dokončovanie kódu (code completion), odstraňovanie, presúvanie, vkladanie a formátovanie zdrojového kódu Pascal. Tieto funkcie šetria množstvo času a duplicitných úloh. Sú nastaviteľné a každá funkcia je dostupná pomocou klávesovej skratky (viď Editor Options).<br />
<br />
Pretože ich práca záleží na zdrojovom kóde a pochopení FreePascal, Delphi a Kylix kódu, nevyžadujú preložené jednotky ani nainštalovaný prekladač Borland. Môžete naraz upravovať kód Delphi aj FreePascal. Môžete dokonca pracovať s rôznymi verziami Delphi a FreePascal súčasne. Tým sa stáva prenos Delphi kódu ešte jednoduchší.<br />
<br />
==Zhrnutie klávesových skratiek IDE==<br />
{|<br />
|-<br />
| [[Lazarus IDE Tools/sk#Hľadanie_deklarácie | Hľadanie deklarácie]] (Declaration Jumping) || '''Ctrl+Click''' alebo '''Alt+Up'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Prepínanie_metód | Prepínanie metód]] (Method Jumping) || '''Ctrl+Shift+Up''' a '''Ctrl+Shift+Down'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Šablóny_kódu | Šablóny kódu]] (Code Templates) || '''Ctrl+J'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Dokončovanie_kódu | Dokončovanie kódu]] (Code/Class Completion) || '''Ctrl+Shift+C'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Dokončovanie_identifikátorov | Dokončovanie identifikátorov]] (Identifier Completion) || '''Ctrl+Medzerník'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Dokončovanie_slov | Dokončovanie slov]] (Word Completion) || '''Ctrl+W'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Pomoc_s_parametrami |Pomoc s parametrami]] (Parameter Hints) || '''Ctrl+Shift+Space'''<br />
|}<br />
<br />
==Prepínanie metód==<br />
(''Method Jumping'')<br />
<br />
Na prepínanie medzi telom procedúry (begin..end) a jej definíciou (procedure Name;) použite Ctrl+Shift+Up.<br />
<br />
Príklad:<br />
<pascal><br />
interface<br />
<br />
procedure DoSomething; // procedure definition<br />
<br />
implementation<br />
<br />
procedure DoSomething; // procedure body <br />
begin<br />
end;<br />
</pascal><br />
<br />
Ak je kurzor v tele provedúry a stlačíte Ctrl+Shift+Up, kurzor skočí na definíciu. Ak znova stlačíte Ctrl+Shift+Up preskočí do tela procedúry, za 'begin'. Funkcia pracuje aj s metódami (procedúrami v triedach).<br />
<br />
Tipy:<br />
'Method Jumping' presúva kurzor na rovnakú procedúru s rovnakým menom i zoznamom parametrov. Ak presná procedúra neexistuje, skočí na najpodobnejšiu a umiestni kurzor na prvý rozdiel. V Delphi táto funkcia neexistuje.<br />
<br />
Príklad procedúry s rôznymi typmi parametrov:<br />
<pascal><br />
interface<br />
<br />
procedure DoSomething(p: char); // procedure definition<br />
<br />
implementation<br />
<br />
procedure DoSomething(p: string); // procedure body<br />
begin<br />
end;<br />
</pascal><br />
<br />
Preskočenie z definície do tela umiestni kurzor na kľúčové slovo 'string'. Túto vlastnosť môžete využiť na premenovanie metódy a/alebo zmenu jej parametrov.<br />
<br />
Príklad:<br />
Premenovali sme 'DoSomething' na 'MakeIt':<br />
<pascal> interface<br />
<br />
procedure MakeIt; // procedure definition<br />
<br />
implementation<br />
<br />
procedure DoSomething; // procedure body<br />
begin<br />
end;<br />
</pascal><br />
<br />
Potom urobte skok z definície MakeIt do tela. IDE hľadá vhodné telo, nenájde žiadne, preto začne hľadať kandidátov. Keďže stepremenovali len jednu procedúru, tak je len jedno telo bez definície (DoSomething) a tak skočí do DoSomething a umiestni kurzor vpravo od 'DoSomething'. Potomm ju môžete jednoducho premenovať tiež. Toto rovnako pracuje s parametrami.<br />
<br />
==Include súbory==<br />
(''Include Files'')<br />
<br />
Include súbory sú súbory vložené do zdrojového kódu pomocou direktív prekladača {$I filename} alebo {$INCLUDE filename}. Lazarus a FreePascal používajú veľa takýchto vecí na redukciu nadbytočnosti a vyhnutie sa nečitateľnosti konštrukcií {$IFDEF} pri podpore rôznych platforiem.<br />
<br />
Narozdiel od Delphi, IDE Lazarus plne podporuje include súbory. Napríklad môžete skočiť z metódy v súbore .pas do tela metódy v include súbore. Všetky nástroje kódu, ako dokončovanie kódu, považuje include súbory za špeciálne hranice.<br />
<br />
Napríklad: keď dokončovanie kódu pridáva telo novej metódy za telom inej metódy, ponechá ich obe v rovnakom súbore. Týmto spôsobom môžete vložiť celú implementáciu triedy do include súborov, ako to robí LCL pre skoro všetky prvky.<br />
<br />
Ale je tu začiatočnícka chyba: Ak najprv otvoríte include súbor a skúsite prepínanie metód alebo hľadanie deklarácie, dostanete chybu. IDE nevie do ktorej jednotky include súbor patrí. Najprv musíte otvoriť jednotku.<br />
<br />
Hneď ako IDE zanalyzuje jednotku, zachytí v nej include direktívy a IDE si bude pamätať tento vzťah. Tieto informácie IDE ukladá pri skončení a pri uložení projektu do ~/.lazarus/includelinks.xml. Keď nabudúce otvoríte súbor include a urobíte skok do neho alebo hľadanie deklarácie, IDE interne otvorí jednotku a skoky budú fungovať.<br />
<br />
Tento mechanizmus má samozrejme obmedzenia, niektoré include súbory sú zahrnuté dva i viackrát. Napríklad: lcl/include/winapih.inc.<br />
Skákanie z definície procedúry/metódy v tomto include súbore do tela závisí na poslednej akcii. Ak ste pracovali v lcl/lclintf.pp, IDE skočí do winapi.inc. Ak ste pracovali v lcl/interfacebase.pp, potom skočíte do lcl/include/interfacebase.inc (alebo do jedného z ďalších include súborov). Ak pracujete s obomi, potom môže nastať zmätok. ;)<br />
<br />
==Šablóny kódu==<br />
(''Code Templates'')<br />
<br />
Šablóny kódu konvertujú identifikátor v texte alebo fragmente kódu. Šablóny kódu majú prednastavenú klávesovú skratku Ctrl+J. Môžete napísať identifikátor, stlačiť Ctrl+J a identifikátor je nahradený textom definovaným pre identifikátor. Šablóny kódu môžete definovať v Environment -> Editor Options -> CodeTools.<br />
<br />
Príklad:<br />
Napíšte identifikátor 'classf', ponechajte kurzor vpravo za 'f' a stlačte Ctrl+J. Identifikátor 'classf' bude nahradený týmto:<br />
<pascal><br />
T = class(T)<br />
private<br />
<br />
public<br />
constructor Create;<br />
destructor Destroy; override;<br />
end;<br />
</pascal><br />
<br />
a kurzor bude za 'T'.<br />
Zoznam šablón získate tak, že kurzor ponecháte na medzere (nie ne identifikátore) a stlačíte Ctrl+J. Pomocou kurzorových klávesov alebon apísania niekoľkých znakov vyberte jeden. Enter vytvorí zvolenú šablónu a Esc zatvorí zoznam.<br />
<br />
==Pomoc s parametrami==<br />
(''Parameter Hints'')<br />
Pomoc s parametrami ukazuje pomocné okno s deklaráciami parametrov aktuálneho zoznamu parametrov.<br />
<br />
Napríklad<br />
<pascal><br />
Canvas.FillRect(|);<br />
</pascal><br />
<br />
Umiestnite kurzor do zátvoriek a stlačte Ctrl+Shift+Space. Objaví sa pomocné okno, ukazujúce parametre FillRect.<br />
<br />
==Dokončovanie kódu==<br />
(''Code Completion'')<br />
<br />
Dokončovanie kódu nájdete v menu IDE Edit -> Complete Code a má štandartnú klávespvú skratku Ctrl+Shift+C.<br />
V Delphi je dokončovaním kódu volaná funkcia zobrazujúca zoznam identifikátorov na aktuálnej pozícii v zdrojovom kóde (Ctrl+Space). V Lazarus je toto nazývané dokončovanie identifikátorov (Identifier completion). Dokončovanie kódu v sebe združuje niekoľko užitočných funkcií:<br />
<br />
* '''Dokončovanie tried''' (Class Completion): dokončuje vlastnosti, pridáva telá metód, pridáva súkromné premenné a súkromné metódy;<br />
* '''Dokončovanie forward procedúr''' (Forward Procedure Completion): pridáva telá forward procedúr;<br />
* '''Dokončovanie priradenia udalostí''' (Event Assignment Completion): * dokončuje pridelenie udalostí a pridávanie tiel a definícií metód;<br />
* '''Dokončovanie lokálnych premenných''' (Local Variable Completion): pridáva definície lokálnych premenných.<br />
Ktorá funkcia je použitá, závisí na pozícii kurzora v editore zdrojového kódu.<br />
<br />
===Dokončovanie tried===<br />
(''Class Completion'')<br />
<br />
Veľmi výkonnou funkciou dokončovania kódu je "Dokončovanie tried".<br />
Vy píšete triedu, pridáte metódy a vlastnosti, a dokončovanie kódu pridá telá metód, metódy prístupu k vlastnostiam a súkromným premenným. <br />
<br />
Príklad:<br />
Vytvorte triedu (viz [[Lazarus IDE Tools/sk#Šablóny_kódu | Šablóny kódu]], aby ste ušetrili rovnakú prácu):<br />
<pascal> TExample = class(TObject)<br />
public<br />
constructor Create;<br />
destructor Destroy; override;<br />
end;</pascal><br />
<br />
Umiestnite kurzor niekde v definícii triedy a stlačte Ctrl+Shift+C. Tým budú vytvorené chýbajúce telá metód a kurzor bude presunutý na prvé vytvorené telo, takže môžete rovno začať písať kód triedy:<br />
<pascal> { TExample }<br />
<br />
constructor TExample.Create;<br />
begin<br />
|<br />
end;<br />
<br />
destructor TExample.Destroy;<br />
begin<br />
inherited Destroy;<br />
end;</pascal><br />
<br />
Poznámka: Značka '|' nie je pridaná, len ukazuje umiestnenie kurzora.<br />
<br />
Tip: Prepínať medzi telom a definíciou metódy môžete pomocou Ctrl+Shift+Up.<br />
<br />
Všimnite si, že IDE tiež pridáva volanie deštruktora základnej triedy (inherited Destroy). Toto je urobené, ak v definícii treidy použijete kľúčové slovo 'override'.<br />
<br />
Teraz pridajtemetódu '''DoSomething''':<br />
<pascal> TExample = class(TObject)<br />
public<br />
constructor Create;<br />
procedure DoSomething(i: integer);<br />
destructor Destroy; override;<br />
end;</pascal><br />
<br />
Potom stlačte Ctrl+Shift+C a IDE pridá:<br />
<pascal> procedure TExample.DoSomething(i: integer);<br />
begin<br />
|<br />
end;</pascal><br />
<br />
Ako môžete vidieť, nové telo metódy je vložené medzi Create a Destroy, presne ako je to v definícii. Týmto sú telá metód uchovávané v rovnakom logickom poradí, ako v definícii. Spôsob vkladania môžete definovať pomocou Environment > Codetools Options -> Code Creation.<br />
<br />
'''Dokončovanie vlastností'''<br />
Pridajte vlastnosť '''AnInteger''':<br />
<pascal> TExample = class(TObject)<br />
public<br />
constructor Create;<br />
procedure DoSomething(i: integer);<br />
destructor Destroy; override;<br />
property AnInteger;<br />
end;</pascal><br />
<br />
Stlačte Ctrl+Shift+C a dostanete:<br />
<pascal> procedure TExample.SetAnInteger(const AValue: integer);<br />
begin<br />
|if FAnInteger=AValue then exit;<br />
FAnInteger:=AValue;<br />
end;</pascal><br />
<br />
Dokončovanie kódu pridalo metódu pre prístup k zápisu do vlastnosti a nejaký základný kód.<br />
<br />
Preskočte do triedy pomocou Ctrl+Shift+Up a uvidíte, že v triede pribudlo:<br />
<pascal> TExample = class(TObject)<br />
private<br />
FAnInteger: integer;<br />
procedure SetAnInteger(const AValue: integer);<br />
public<br />
constructor Create;<br />
procedure DoSomething(i: integer);<br />
destructor Destroy; override;<br />
property AnInteger: integer read FAnInteger write SetAnInteger;<br />
end;</pascal><br />
<br />
Vlastnosť bola rozšírená pridaním kľúčových slov '''Read''' a '''Write'''. V triede je nová sekcia '''private''' s premennou '''FAnInteger''' a metódou '''SetAnInteger'''.<br />
Pridanie '''F''' na začiatok privátnej premennej je bežnou notáciou Delphi, rovnako ako označenie prístupovej metódy pomocou '''Set'''. Ak to nechcete, môžete to zmeniť ponmocou Environment > Codetools Options -> Code Creation.<br />
<br />
Vytvorenie read only vlastnosti:<br />
<pascal> property PropName: PropType read;</pascal><br />
<br />
Bude rozšírené na:<br />
<pascal> property PropName: PropType read FPropName;</pascal><br />
<br />
Vytvorenie write only vlstnosti:<br />
<pascal> property PropName: PropType write;</pascal><br />
<br />
Bude rozšírené na:<br />
<pascal> property PropName: PropType write SetPropName;</pascal><br />
<br />
Vytvorenie read only vlastnosti s metódou Read:<br />
<pascal> property PropName: PropType read GetPropName;</pascal><br />
<br />
Ostane nezmenené a bude pridaná funkcia GetPropName:<br />
<pascal> function GetpropName: PropType;</pascal><br />
<br />
Vytvorenie vlastnosti s direktívou '''stored''':<br />
<pascal> property PropName: PropType stored;</pascal><br />
<br />
Bude rozšírené na:<br />
<pascal> property PropName: PropType read FPropName write SetPropName stored PropNameIsStored;</pascal><br />
<br />
Pretože direktíva '''stored''' je používaná pre streamovanie čítania a zápisu, sú kľúčové slová '''read''' a '''write''' pridané tiež.<br />
<br />
Tip:<br />
Dokončovanie identifikátorov tiež rozpoznáva nekompletné vlastnosti a navrhne predvolené mená. Napríklad:<br />
<pascal> property PropName: PropType read |;</pascal><br />
<br />
Umiestnite kurzor za medzeru za kľúčovým slovom '''read''' a stlačte Ctrl+Space pre dokončovanie identifikátorov. To vám ponúkne premennú '''FPropName''' a procedúru '''SetPropName'''.<br />
<br />
===Dokončovanie forward procedúr===<br />
(''Forward Procedure Completion'')<br />
<br />
Dokončovanie forward procedúr je časťou dokončovania kódu a pridáva telá chýbajúcich procedúr, ktoré sú definované. Je vyvolané, ak je kurzor na pripravenej definícii procedúry.<br />
<br />
Napríklad:<br />
Pridajte novú procedúru do časti '''interface''':<br />
<pascal><br />
procedure DoSomething;<br />
</pascal><br />
<br />
Umiestnite kurzor na ňu a stlačte Ctrl+Shift+C pre dokončovaniekódu. V časti '''implementation''' bude doplnené:<br />
<pascal><br />
procedure DoSomething;<br />
begin<br />
|<br />
end;<br />
</pascal><br />
<br />
Tip: Pomocou Ctrl+Shift+Up môžete prepínať medzi definíciou a telom procedúry.<br />
<br />
Telo novej procedúry bude pridané pred metódy tried. Ak už sú v časti interface nejaké definície procedúr, IDE sa pokúsi zachovať ich poradie, napríklad:<br />
<pascal><br />
procedure Proc1;<br />
procedure Proc2; // nová procedúra<br />
procedure Proc3;<br />
</pascal><br />
<br />
Ak telá Proc1 a Proc3 už existujú, potom bude telo Proc2 vložené medzi telá procedúr Proc1 a Proc3. Toto správanie môže byť zmené pomocou Environment > Codetools Options -> Code Creation.<br />
<br />
Viacero procedúr:<br />
<pascal><br />
procedure Proc1_Old; // telo existuje<br />
procedure Proc2_New; // telo neexistuje<br />
procedure Proc3_New; // "<br />
procedure Proc4_New; // "<br />
procedure Proc5_Old; // telo existuje<br />
</pascal><br />
<br />
Dokončovanie kódu pridá 3 telá procedúr (Proc2_New, Proc3_New, Proc4_New).<br />
<br />
Prečo sa to volá Dokončovanie forward procedúr"?<br />
<br />
Pretože tento nástroj nepracuje len s procedúrami definovanými v časti interface, ale aj s procedúrami, ktoré sú definované pomocou kľúčového slova '''forward'''.<br />
<br />
===Dokončovanie priradenia udalostí===<br />
(''Event Assignment Completion'')<br />
<br />
Dokončovanie priradenia udalostí je čsťou Dokončovania kódu a dokončuje jeden príkaz Event:=|. Nastáva, keď je kurzor umiestnený za príkazom priradenia udalosti.<br />
<br />
Napríklad:<br />
V metóde, povedzme udalosti FormCreate event, pridajte riadok: 'OnPaint:=':<br />
<pascal><br />
procedure TForm1.Form1Create(Sender: TObject);<br />
begin<br />
OnPaint:=|<br />
end;<br />
</pascal><br />
<br />
Značka '|' je umiestnenie kurzora a netreba ju zadávať.<br />
<br />
Potom stlačte Ctrl+Shift+C pre dokončovanie kódu. Príkaz priradenia udalosti bude doplnený takto:<br />
<pascal><br />
OnPaint:=@Form1Paint;<br />
</pascal><br />
<br />
Do triedy TForm1 bude pridaná nová metóda Form1Paint. Potom je spustené dokončovanie tried a dostanete:<br />
<pascal><br />
procedure TForm1.Form1Paint(Sender: TObject);<br />
begin<br />
|<br />
end;<br />
</pascal><br />
<br />
Pracuje presne ako pridávanie metód v Object inspectore.<br />
<br />
Poznámka: Kurzor musíte umiestniť za operátor priradenia ':='. Ak ho umiestnite na identifikátor (tj. OnPaint), dokončovanie kódu spustí Dokončovanie lokálnych premenných, ktoré zlyhá, pretože OnPaint je už definovaná.<br />
<br />
Tip:<br />
Môžete definovať meno novej metódi aj sami, a to jej zadaním do priradenia, napríklad:<br />
<pascal><br />
OnPaint:=@ThePaintMethod;<br />
</pascal><br />
<br />
===Dokončovanie deklarácie premenných===<br />
(''Variable Declaration Completion'')<br />
<br />
Dokončovanie deklarácie premenných je časťou '''Dokončovania kódu''' a pridáva definíciu lokálnej premennej pre príkaz Identifier:=Term;. Dokončovanie deklarácie premenných je vyvolané, keď je kurzor umiestnený na identifikátore v priradení.<br />
<br />
Napríklad:<br />
<pascal><br />
procedure TForm1.Form1Create(Sender: TObject);<br />
begin<br />
i:=3;<br />
end;<br />
</pascal><br />
<br />
Umiestnite kurzor na 'i' alebo tesne za neho, potom stlačte Ctrl+Shift+C pre dokončovanie kódu a dostanete:<br />
<pascal><br />
procedure TForm1.Form1Create(Sender: TObject);<br />
var<br />
i: Integer;<br />
begin<br />
i:=3;<br />
end;<br />
</pascal><br />
<br />
Nástroj dokončovania kódu najprv skontroluje, či identifikátor 'i' už nie je definovaný a ak nie, pridá deklaráciu 'var i: integer;'. Typ identifikátora je odhadovaný podľa pravej strany príkazu priradenia. Čísla ako 3 sú identifikované ako Integer.<br />
<br />
Iný príklad:<br />
<pascal><br />
type<br />
TWhere = (Behind, Middle, InFront);<br />
<br />
procedure TForm1.Form1Create(Sender: TObject);<br />
var<br />
a: array[TWhere] of char;<br />
begin<br />
for Where:=Low(a) to High(a) do writeln(a[Where]);<br />
end;<br />
</pascal><br />
<br />
Umiestnite kurzor na 'Where' a stlačte Ctrl+Shift+C pre dokončenie kódu. Dostanete:<br />
<pascal><br />
procedure TForm1.Form1Create(Sender: TObject);<br />
var<br />
a: array[TWhere] of char;<br />
Where: TWhere;<br />
begin<br />
for Where:=Low(a) to High(a) do writeln(a[Where]);<br />
end;<br />
</pascal><br />
<br />
===Spätné dokončovanie triedy===<br />
(''Reversed Class Completion'')<br />
Spätné dokončovanie triedy je časťou '''Dokončovania kódu''' a pridáva deklarácie súkromných metód pre aktuálne telo metódy. Je vyvolané, keď je kurzor v tele metódy, zatiaľ nie je definované pre triedy.<br />
<br />
Táto vlastnosť je dostupná od 0.9.21.<br />
<br />
Napríklad:<br />
<pascal><br />
procedure TForm1.DoSomething(Sender: TObject);<br />
begin<br />
end;<br />
</pascal><br />
<br />
Metóda DoSomething zatiaľ nie je v TForm1 deklarovaná. Stlačte Ctrl+Shift+C a IDE pridá "procedure DoSomething(Sender: TObject);" k súkromným metódam triedy TForm1.<br />
<br />
Pre Delphianov:<br />
Dokončovanie tried pracuje pod Lazarus vždy jednym spôsobom:<br />
*Z rozhrania triedy do jej implementácie alebo naopak z implementácie triedy do jej rozhrania. Delphi vždy vyvoláva oba smery. Poszup v Delphi má nevýhodu, že ak dôjde k preklepu, ľahko vytvoríte bez upozornenia zvyšok novej metódy.<br />
<br />
===Komentáre a dokončovanie kódu===<br />
(''Comments and Code Completion'')<br />
<br />
Dokončovanie kódu sa pokúša uchovávať komentáre tam, kde sú. <br />
Príklad:<br />
<pascal><br />
FList: TList; // zoznam prvkov TComponent<br />
FInt: integer;<br />
</pascal><br />
<br />
Pri vkladaní novej premennej medzi FList a FInt, je komentár ponechaný na riadku spolu s FList. To platí i pre:<br />
<pascal><br />
FList: TList; { zoznam prvkov TComponent<br />
Toto je komentár na niekoľkých riadkoch, začínajúci<br />
na riadku s FList, tak nástroj dokončenia kódu predpokladá že patrí <br />
k riadku s FList a nepreruší tento vzťah.<br />
Kód bude vložený za komentár. }<br />
FInt: integer;<br />
</pascal><br />
<br />
Ak komentár začína na ďalšom riadku:<br />
<pascal><br />
FList: TList; // zoznam prvkov TComponent<br />
{ Tento komentár patrí k nasledujúcemu riadku. <br />
Nový kód je vložený pred tentokomentár a <br />
za komentár na riadku s FList. }<br />
FInt: integer;<br />
</pascal><br />
<br />
==Refactoring==<br />
<br />
===Otočenie priradenie===<br />
(''Invert Assignments'')<br />
<br />
Otočenie priradenia pracuje s vybratými príkazmi Pascalu a obracia všetky priradenia z tohoto výberu. Tento nástroj je užitočný pre transformáciu "save" kódu na "load" a naopak.<br />
<br />
Príklad:<br />
<pascal> procedure DoSomething;<br />
begin<br />
AValueStudio:= BValueStudio;<br />
AValueAppartment :=BValueAppartment;<br />
AValueHouse:=BValueHouse;<br />
end;<br />
</pascal><br />
<br />
Vyberte riadky s priradeniami (medzi begin a end) a urobte Otočenie priradenia, všetky priradenia budú otočené a automaticky odsadené. Výsledok:<br />
<pascal><br />
procedure DoSomething;<br />
begin<br />
BValueStudio := AValueStudio;<br />
BValueAppartment := AValueAppartment;<br />
BValueHouse := AValueHouse;<br />
end;<br />
</pascal><br />
<br />
=== Uzavrieť výber ===<br />
<br />
Vyberte nejaký text a vyvolajte nástroj. Zobrazí sa dialóg, kde si môžete vybrať či má výber uzatvorený medzi '''try..finally''' ale do mnoho iných blokov.<br />
<br />
=== Premenovať identifikátor ===<br />
<br />
Umiestnite kurzor na identifikátor a vyvolajte tento nástroj, obaví sa dialóg, v ktorom môžete nastaviť rozsah hľadania a nové meno identifikátora. <br />
* premenované budú všetky výskyty a len tie, ktoré momentálne používajú túto deklaráciu, čiže edklarácie s rovnakým menom nebudú premenované. <br />
* najprv bude vykonaná kontrola konfliktov mena. <br />
* Obmedzenia: Pracuje len so zdrojovými kódmi Pascalu, zatiaľ nepremenúva súbory ani neupravuje súbory lfm/lrs, či súbory lazdoc.<br />
<br />
=== Nájdi odkazy na identifikátor ===<br />
<br />
Umiestnite kurzor na identifikátor a vyvolajte nástroj. Objaví sa dialóg, v ktorom môžete nastaviť rozsah hľadania. IDE bude hľadať všetky výskyty a len tie, ktoré používajú aktuálnu deklaráciu. Čiže iné deklarácia s rovnakým menom, nebudú zobrazené.<br />
<br />
=== Zobraziť abstraktné metódy ===<br />
<br />
Táto funkcia vypisuje a automaticky kompletuje virtuálne, abstraktné metódy, ktoré je majú byť implementované.<br />
<br />
Umiestnite kurzor na deklaráciu triedu a vyvolajte nástroj. Ak existujú nejaké chýbajúce abstraktné metódy, nude zobrazený dialóg s ich zoznamom. Zvoľte metódy pre implementovanie a IDE vytvorí základy metód.<br />
<br />
=== Vytiahnuť procedúru ===<br />
Viz [[IDE_Window:_Extract_Procedure/sk|Extract Procedure]]<br />
<br />
==Hľadanie deklarácie==<br />
(''Find Declaration'')<br />
<br />
Umiestnite kurzor na identifikátor a urobte Hľadanie deklarácie, tým bude nájdená deklarácia tohoto identifikátora, prípadne otvorený príslušný súbor a kurzor bude premiestnený na miesto deklarácie.<br />
<br />
Každé hľadanie deklarácie nastavuje bod skoku. Tzn. po skoku na nájdenú deklaráciu môžete jednoduchos skočiť naspäť pomocou Search -> Jump back.<br />
<br />
Oproti Delphi má nástroj isté rozdiely:<br />
Nástroj pracuje so zdrojovým kódom na základe pravidiel Pascalu, a nie s výsledkom prekladača. The compiler returns the final type. Nástroj prezerá zdrojové kódy a všetky kroky medzi. Napríklad:<br />
<br />
: Vlastnosť 'Visible' je najprv definovaná v TControl (controls.pp), potom je predefinovaná v TCustomForm a nakoniec predefinovaná aj v TForm. Spustenie hľadania deklarácie vlastnosti Visible vás najprv presunie na Visible v TForm. Potom môžete spustiť hľadanie deklarácie znova a skočíte na Visible v TCustomForm a znova pre skočenie na Visible v TControl.<br />
<br />
Obdobne je to s TColor.<br />
Pre prekladač je to jednoducho 'longint', ale v zdrojovom kóde je to definované ako:<br />
<pascal><br />
TGraphicsColor = -$7FFFFFFF-1..$7FFFFFFF;<br />
TColor = TGraphicsColor;<br />
</pascal><br />
<br />
Obdobné je to aj s forward definovanými triedami:<br />
Napríklad v TControl je priávtna premenná<br />
<pascal><br />
FHostDockSite: TWinControl;<br />
</pascal><br />
<br />
Hľadanie deklarácie pre TWinControl skočí na forward definíciu:<br />
<pascal><br />
TWinControl = class;<br />
</pascal><br />
<br />
A opätovné spustenie hľadania deklarácie skočí na skutočnú implementáciu:<br />
<pascal><br />
TWinControl = class(TControl)<br />
</pascal><br />
<br />
Týmto spôsobom môžete stopovať každý identifikátor a nájsť každé predefinovanie, či preťaženie.<br />
<br />
==Dokončovanie identifikátorov==<br />
(''Identifier Completion'')<br />
<br />
Dokončovanie identifikátorov je vyvolané pomocou Ctrl+Space a zobrazuje všetky vyhovujúce identifikátory. <br />
<br />
Napríklad:<br />
<pascal><br />
procedure TForm1.FormCreate(Sender: TObject);<br />
begin<br />
|<br />
end;<br />
</pascal><br />
<br />
Umiestnite kurzor medzi ''begin'' a ''end'' a stlačte Ctrl+Space. Nástroj IDE spracuje celý dosiahnuteľný kód a zobrazí zoznam všetkých nájdených identifikátorov. CodeTools kešuje výsledok, takže druhý krát bude oveľa rýchlejší.<br />
<br />
'''Poznámka pre Delphianov:''' Delphi to volá ''Dokončovanie kódu''.<br />
<br />
Niektoré identifikátory, ako 'Write', 'ReadLn', 'Low', 'SetLength', 'Self', 'Result', 'Copy' sú zabudované v prekladači a teda nie sú definované nikde v zdrojovom kóde, al Dokončovanie identifikátorov má veľa z nich tež zabudovaných. Ak nájdete nejaký chýbajúci, jednoducho vytvorte požiadadvku na vlastnosť v sledovači chýb (''bug tracker'').<br />
<br />
Dokončovanie identifikátorov nedokončuje kľúčové slová, takže ho nemožno použiť na dokončenie proc' na 'procedure'. Na toto je určené Ctrl+W [[#Dokončovanie_slov|Dokončovanie slov]] alebo Ctrl+J [[#Šablóny_kódu|Šablóny kódu]].<br />
<br />
Dokončovanie identifikátorov nezobrazuje len tie identifikátory, ktoré nie sú kompatibilné.<br />
<br />
===Predpona===<br />
Môžete začať dokončovanie identifikátorov v existujúcom slove. Potom budú písmená vľavo od kurzora brané ako predpona. <br />
<br />
Napríklad:<br />
<pascal><br />
procedure TForm1.FormCreate(Sender: TObject);<br />
begin<br />
Ca|ption<br />
end;<br />
</pascal><br />
<br />
Okno bude zobrazovať len identifikátory začínajúce sa na 'Ca'.<br />
<br />
===Klávesy===<br />
<br />
* Písmená/čísla: pridávajú znak do editora zdrojového kódu a aktuálnej predpony, čo zároveň aktualizuje zoznam.<br />
* Backspace: odstraňuje posledný znak z editora zdrojového kódu a aktuálnej predpony, čo zároveň aktualizuje zoznam.<br />
* Return: nahradzuje celé slovo na kurzore zvoleným identifikátorom a zatvára vyskakovacie okno.<br />
* Shift+Return: as ''Return'', but replaces only the prefix (left part) of the word at the cursor.<br />
* Hore/Dole: presúva výber.<br />
* Esc: zatvára vyskakovacie okno bez zmeny.<br />
* Tab: dokončuje predponu na ďalšiu voľbu. Napríklad: aktuálna predpona je 'But' a dokončovanie identifikátora zobrazuje len 'Button1' a 'Button1Click', potom stlačenie ''Tab'' dokončí predponu na 'Button1'.<br />
* Else: ako ''Return'' a pridá znak do editora zdrojového kódu.<br />
<br />
==Dokončovanie slov==<br />
(''Word Completion'')<br />
<br />
Dokončovanie slov je vyvolané stlačením Ctrl+W a zobrazuje všetky slová všetkých aktuálne otvorených editorov. Inak pracuje presne ako Dokončovanie identifikátorov.<br />
<br />
==Prejdi do direktívy include==<br />
(''Goto Include Directive'')<br />
<br />
Tento príkaz v menu Searchskočí do príkazu (direktívy) {$I filename}, v ktorej je použitý aktuálny súbor.<br />
<br />
==Publikuj Projekt==<br />
Vytvára kópiu celého projektu. Ak chcete niekomu poslať len zdrojové kódy a nastavenia prekladača pre svoj kód, budete kamarátis touto funkciou.<br />
<br />
Bežný adresár projektu obsahuje množstvo informácií. Väčšinu z nich publikovať netreba. Súbor .lpi obsahuje informácie o relácii (ako pozíciu caret a záložiek zatvorených jednotiek) a adresár projektu obsahuje mnoho súborov .ppu a .o, a tiež .exe. A práve príkaz Publikuj projekt vytvorí súbor .lpi len so základnými informáciami a všetky zdrojové kódy, so všetkých podadresárov.<br />
<br />
V ponúknutom dialógu môžete nastaviť filter pre zahrnutie/vynechanie, či pre kompresiu výstupu do jediného archívu.<br />
<br />
==Spolupracovníci==<br />
This page has been converted from the epikwiki [http://lazarus-ccr.sourceforge.net/index.php?wiki=LazarusIdeTools version].<br />
* Created page and initial template - 4/6/2004 [[User:Tom Lisjac| VlxAdmin]]<br />
* Initial content posted - 4/10/2004 MattiasG<br />
* Small wiki and formatting fixes - 4/11/2004 [[User:Tom Lisjac| VlxAdmin]]<br />
* Added a summary table for IdeTools shortcuts - 12 July 2004 [[User:Kirkpatc]]<br />
* Preložené z originálu [[Lazarus IDE Tools]] - [[User:Slavko|Slavko]] 13:51, 25 Mar 2005 (PST)</div>Slavkohttps://wiki.freepascal.org/index.php?title=Lazarus_IDE_Tools/sk&diff=26865Lazarus IDE Tools/sk2008-02-17T15:56:01Z<p>Slavko: Oprava odkazu a formátovania</p>
<hr />
<div>{{Lazarus IDE Tools}}<br />
<br />
==Úvod==<br />
IDE používa knižnicu analýzy zdrojového kódu Pascal a editačných nástrojov, zvanú "codetools". Tieto nástroje poskytujú funkcie ako hľadanie deklarácie (find declaration), dokončovanie kódu (code completion), odstraňovanie, presúvanie, vkladanie a formátovanie zdrojového kódu Pascal. Tieto funkcie šetria množstvo času a duplicitných úloh. Sú nastaviteľné a každá funkcia je dostupná pomocou klávesovej skratky (viď Editor Options).<br />
<br />
Pretože ich práca záleží na zdrojovom kóde a pochopení FreePascal, Delphi a Kylix kódu, nevyžadujú preložené jednotky ani nainštalovaný prekladač Borland. Môžete naraz upravovať kód Delphi aj FreePascal. Môžete dokonca pracovať s rôznymi verziami Delphi a FreePascal súčasne. Tým sa stáva prenos Delphi kódu ešte jednoduchší.<br />
<br />
==Zhrnutie klávesových skratiek IDE==<br />
{|<br />
|-<br />
| [[Lazarus IDE Tools/sk#Hľadanie_deklarácie | Hľadanie deklarácie]] (Declaration Jumping) || '''Ctrl+Click''' alebo '''Alt+Up'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Prepínanie_metód | Prepínanie metód]] (Method Jumping) || '''Ctrl+Shift+Up''' a '''Ctrl+Shift+Down'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Šablóny_kódu | Šablóny kódu]] (Code Templates) || '''Ctrl+J'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Dokončovanie_kódu | Dokončovanie kódu]] (Code/Class Completion) || '''Ctrl+Shift+C'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Dokončovanie_identifikátorov | Dokončovanie identifikátorov]] (Identifier Completion) || '''Ctrl+Medzerník'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Dokončovanie_slov | Dokončovanie slov]] (Word Completion) || '''Ctrl+W'''<br />
|-<br />
| [[Lazarus IDE Tools/sk#Pomoc_s_parametrami |Pomoc s parametrami]] (Parameter Hints) || '''Ctrl+Shift+Space'''<br />
|}<br />
<br />
==Prepínanie metód==<br />
(''Method Jumping'')<br />
<br />
Na prepínanie medzi telom procedúry (begin..end) a jej definíciou (procedure Name;) použite Ctrl+Shift+Up.<br />
<br />
Príklad:<br />
<pascal><br />
interface<br />
<br />
procedure DoSomething; // procedure definition<br />
<br />
implementation<br />
<br />
procedure DoSomething; // procedure body <br />
begin<br />
end;<br />
</pascal><br />
<br />
Ak je kurzor v tele provedúry a stlačíte Ctrl+Shift+Up, kurzor skočí na definíciu. Ak znova stlačíte Ctrl+Shift+Up preskočí do tela procedúry, za 'begin'. Funkcia pracuje aj s metódami (procedúrami v triedach).<br />
<br />
Tipy:<br />
'Method Jumping' presúva kurzor na rovnakú procedúru s rovnakým menom i zoznamom parametrov. Ak presná procedúra neexistuje, skočí na najpodobnejšiu a umiestni kurzor na prvý rozdiel. V Delphi táto funkcia neexistuje.<br />
<br />
Príklad procedúry s rôznymi typmi parametrov:<br />
<pascal><br />
interface<br />
<br />
procedure DoSomething(p: char); // procedure definition<br />
<br />
implementation<br />
<br />
procedure DoSomething(p: string); // procedure body<br />
begin<br />
end;<br />
</pascal><br />
<br />
Preskočenie z definície do tela umiestni kurzor na kľúčové slovo 'string'. Túto vlastnosť môžete využiť na premenovanie metódy a/alebo zmenu jej parametrov.<br />
<br />
Príklad:<br />
Premenovali sme 'DoSomething' na 'MakeIt':<br />
<pascal> interface<br />
<br />
procedure MakeIt; // procedure definition<br />
<br />
implementation<br />
<br />
procedure DoSomething; // procedure body<br />
begin<br />
end;<br />
</pascal><br />
<br />
Potom urobte skok z definície MakeIt do tela. IDE hľadá vhodné telo, nenájde žiadne, preto začne hľadať kandidátov. Keďže stepremenovali len jednu procedúru, tak je len jedno telo bez definície (DoSomething) a tak skočí do DoSomething a umiestni kurzor vpravo od 'DoSomething'. Potomm ju môžete jednoducho premenovať tiež. Toto rovnako pracuje s parametrami.<br />
<br />
==Include súbory==<br />
(''Include Files'')<br />
<br />
Include súbory sú súbory vložené do zdrojového kódu pomocou direktív prekladača {$I filename} alebo {$INCLUDE filename}. Lazarus a FreePascal používajú veľa takýchto vecí na redukciu nadbytočnosti a vyhnutie sa nečitateľnosti konštrukcií {$IFDEF} pri podpore rôznych platforiem.<br />
<br />
Narozdiel od Delphi, IDE Lazarus plne podporuje include súbory. Napríklad môžete skočiť z metódy v súbore .pas do tela metódy v include súbore. Všetky nástroje kódu, ako dokončovanie kódu, považuje include súbory za špeciálne hranice.<br />
<br />
Napríklad: keď dokončovanie kódu pridáva telo novej metódy za telom inej metódy, ponechá ich obe v rovnakom súbore. Týmto spôsobom môžete vložiť celú implementáciu triedy do include súborov, ako to robí LCL pre skoro všetky prvky.<br />
<br />
Ale je tu začiatočnícka chyba: Ak najprv otvoríte include súbor a skúsite prepínanie metód alebo hľadanie deklarácie, dostanete chybu. IDE nevie do ktorej jednotky include súbor patrí. Najprv musíte otvoriť jednotku.<br />
<br />
Hneď ako IDE zanalyzuje jednotku, zachytí v nej include direktívy a IDE si bude pamätať tento vzťah. Tieto informácie IDE ukladá pri skončení a pri uložení projektu do ~/.lazarus/includelinks.xml. Keď nabudúce otvoríte súbor include a urobíte skok do neho alebo hľadanie deklarácie, IDE interne otvorí jednotku a skoky budú fungovať.<br />
<br />
Tento mechanizmus má samozrejme obmedzenia, niektoré include súbory sú zahrnuté dva i viackrát. Napríklad: lcl/include/winapih.inc.<br />
Skákanie z definície procedúry/metódy v tomto include súbore do tela závisí na poslednej akcii. Ak ste pracovali v lcl/lclintf.pp, IDE skočí do winapi.inc. Ak ste pracovali v lcl/interfacebase.pp, potom skočíte do lcl/include/interfacebase.inc (alebo do jedného z ďalších include súborov). Ak pracujete s obomi, potom môže nastať zmätok. ;)<br />
<br />
==Šablóny kódu==<br />
(''Code Templates'')<br />
<br />
Šablóny kódu konvertujú identifikátor v texte alebo fragmente kódu. Šablóny kódu majú prednastavenú klávesovú skratku Ctrl+J. Môžete napísať identifikátor, stlačiť Ctrl+J a identifikátor je nahradený textom definovaným pre identifikátor. Šablóny kódu môžete definovať v Environment -> Editor Options -> CodeTools.<br />
<br />
Príklad:<br />
Napíšte identifikátor 'classf', ponechajte kurzor vpravo za 'f' a stlačte Ctrl+J. Identifikátor 'classf' bude nahradený týmto:<br />
<pascal><br />
T = class(T)<br />
private<br />
<br />
public<br />
constructor Create;<br />
destructor Destroy; override;<br />
end;<br />
</pascal><br />
<br />
a kurzor bude za 'T'.<br />
Zoznam šablón získate tak, že kurzor ponecháte na medzere (nie ne identifikátore) a stlačíte Ctrl+J. Pomocou kurzorových klávesov alebon apísania niekoľkých znakov vyberte jeden. Enter vytvorí zvolenú šablónu a Esc zatvorí zoznam.<br />
<br />
==Pomoc s parametrami==<br />
(''Parameter Hints'')<br />
Pomoc s parametrami ukazuje pomocné okno s deklaráciami parametrov aktuálneho zoznamu parametrov.<br />
<br />
Napríklad<br />
<pascal><br />
Canvas.FillRect(|);<br />
</pascal><br />
<br />
Umiestnite kurzor do zátvoriek a stlačte Ctrl+Shift+Space. Objaví sa pomocné okno, ukazujúce parametre FillRect.<br />
<br />
==Dokončovanie kódu==<br />
(''Code Completion'')<br />
<br />
Dokončovanie kódu nájdete v menu IDE Edit -> Complete Code a má štandartnú klávespvú skratku Ctrl+Shift+C.<br />
V Delphi je dokončovaním kódu volaná funkcia zobrazujúca zoznam identifikátorov na aktuálnej pozícii v zdrojovom kóde (Ctrl+Space). V Lazarus je toto nazývané dokončovanie identifikátorov (Identifier completion). Dokončovanie kódu v sebe združuje niekoľko užitočných funkcií:<br />
<br />
* '''Dokončovanie tried''' (Class Completion): dokončuje vlastnosti, pridáva telá metód, pridáva súkromné premenné a súkromné metódy;<br />
* '''Dokončovanie forward procedúr''' (Forward Procedure Completion): pridáva telá forward procedúr;<br />
* '''Dokončovanie priradenia udalostí''' (Event Assignment Completion): * dokončuje pridelenie udalostí a pridávanie tiel a definícií metód;<br />
* '''Dokončovanie lokálnych premenných''' (Local Variable Completion): pridáva definície lokálnych premenných.<br />
Ktorá funkcia je použitá, závisí na pozícii kurzora v editore zdrojového kódu.<br />
<br />
===Dokončovanie tried===<br />
(''Class Completion'')<br />
<br />
Veľmi výkonnou funkciou dokončovania kódu je "Dokončovanie tried".<br />
Vy píšete triedu, pridáte metódy a vlastnosti, a dokončovanie kódu pridá telá metód, metódy prístupu k vlastnostiam a súkromným premenným. <br />
<br />
Príklad:<br />
Vytvorte triedu (viz [[Lazarus IDE Tools/sk#Šablóny_kódu | Šablóny kódu]], aby ste ušetrili rovnakú prácu):<br />
<pascal><br />
TExample = class(TObject)<br />
public<br />
constructor Create;<br />
destructor Destroy; override;<br />
end;<br />
</pascal><br />
<br />
Umiestnite kurzor niekde v definícii triedy a stlačte Ctrl+Shift+C. Tým budú vytvorené chýbajúce telá metód a kurzor bude presunutý na prvé vytvorené telo, takže môžete rovno začať písať kód triedy:<br />
<pascal><br />
{ TExample }<br />
<br />
constructor TExample.Create;<br />
begin<br />
|<br />
end;<br />
<br />
destructor TExample.Destroy;<br />
begin<br />
inherited Destroy;<br />
end;<br />
</pascal><br />
<br />
Poznámka: Značka '|' nie je pridaná, len ukazuje umiestnenie kurzora.<br />
<br />
Tip: Prepínať medzi telom a definíciou metódy môžete pomocou Ctrl+Shift+Up.<br />
<br />
Všimnite si, že IDE tiež pridáva volanie deštruktora základnej triedy (inherited Destroy). Toto je urobené, ak v definícii treidy použijete kľúčové slovo 'override'.<br />
<br />
Teraz pridajtemetódu '''DoSomething''':<br />
<pascal><br />
TExample = class(TObject)<br />
public<br />
constructor Create;<br />
procedure DoSomething(i: integer);<br />
destructor Destroy; override;<br />
end;<br />
</pascal><br />
<br />
Potom stlačte Ctrl+Shift+C a IDE pridá:<br />
<pascal><br />
procedure TExample.DoSomething(i: integer);<br />
begin<br />
|<br />
end;<br />
</pascal><br />
<br />
Ako môžete vidieť, nové telo metódy je vložené medzi Create a Destroy, presne ako je to v definícii. Týmto sú telá metód uchovávané v rovnakom logickom poradí, ako v definícii. Spôsob vkladania môžete definovať pomocou Environment > Codetools Options -> Code Creation.<br />
<br />
'''Dokončovanie vlastností'''<br />
Pridajte vlastnosť '''AnInteger''':<br />
<pascal><br />
TExample = class(TObject)<br />
public<br />
constructor Create;<br />
procedure DoSomething(i: integer);<br />
destructor Destroy; override;<br />
property AnInteger;<br />
end;<br />
</pascal><br />
<br />
Stlačte Ctrl+Shift+C a dostanete:<br />
<pascal><br />
procedure TExample.SetAnInteger(const AValue: integer);<br />
begin<br />
|if FAnInteger=AValue then exit;<br />
FAnInteger:=AValue;<br />
end;<br />
</pascal><br />
<br />
Dokončovanie kódu pridalo metódu pre prístup k zápisu do vlastnosti a nejaký základný kód.<br />
<br />
Preskočte do triedy pomocou Ctrl+Shift+Up a uvidíte, že v triede pribudlo:<br />
<pascal><br />
TExample = class(TObject)<br />
private<br />
FAnInteger: integer;<br />
procedure SetAnInteger(const AValue: integer);<br />
public<br />
constructor Create;<br />
procedure DoSomething(i: integer);<br />
destructor Destroy; override;<br />
property AnInteger: integer read FAnInteger write SetAnInteger;<br />
end;<br />
</pascal><br />
<br />
Vlastnosť bola rozšírená pridaním kľúčových slov '''Read''' a '''Write'''. V triede je nová sekcia '''private''' s premennou '''FAnInteger''' a metódou '''SetAnInteger'''.<br />
Pridanie '''F''' na začiatok privátnej premennej je bežnou notáciou Delphi, rovnako ako označenie prístupovej metódy pomocou '''Set'''. Ak to nechcete, môžete to zmeniť ponmocou Environment > Codetools Options -> Code Creation.<br />
<br />
Vytvorenie read only vlastnosti:<br />
<pascal><br />
property PropName: PropType read;<br />
</pascal><br />
<br />
Bude rozšírené na:<br />
<pascal><br />
property PropName: PropType read FPropName;<br />
</pascal><br />
<br />
Vytvorenie write only vlstnosti:<br />
<pascal><br />
property PropName: PropType write;<br />
</pascal><br />
<br />
Bude rozšírené na:<br />
<pascal><br />
property PropName: PropType write SetPropName;<br />
</pascal><br />
<br />
Vytvorenie read only vlastnosti s metódou Read:<br />
<pascal><br />
property PropName: PropType read GetPropName;<br />
</pascal><br />
<br />
Ostane nezmenené a bude pridaná funkcia GetPropName:<br />
<pascal><br />
function GetpropName: PropType;<br />
</pascal><br />
<br />
Vytvorenie vlastnosti s direktívou '''stored''':<br />
<pascal><br />
property PropName: PropType stored;<br />
</pascal><br />
<br />
Bude rozšírené na:<br />
<pascal><br />
property PropName: PropType read FPropName write SetPropName stored PropNameIsStored;<br />
</pascal><br />
<br />
Pretože direktíva '''stored''' je používaná pre streamovanie čítania a zápisu, sú kľúčové slová '''read''' a '''write''' pridané tiež.<br />
<br />
Tip:<br />
Dokončovanie identifikátorov tiež rozpoznáva nekompletné vlastnosti a navrhne predvolené mená. Napríklad:<br />
<pascal><br />
property PropName: PropType read |;<br />
</pascal><br />
<br />
Umiestnite kurzor za medzeru za kľúčovým slovom '''read''' a stlačte Ctrl+Space pre dokončovanie identifikátorov. To vám ponúkne premennú '''FPropName''' a procedúru '''SetPropName'''.<br />
<br />
===Dokončovanie forward procedúr===<br />
(''Forward Procedure Completion'')<br />
<br />
Dokončovanie forward procedúr je časťou dokončovania kódu a pridáva telá chýbajúcich procedúr, ktoré sú definované. Je vyvolané, ak je kurzor na pripravenej definícii procedúry.<br />
<br />
Napríklad:<br />
Pridajte novú procedúru do časti '''interface''':<br />
<pascal><br />
procedure DoSomething;<br />
</pascal><br />
<br />
Umiestnite kurzor na ňu a stlačte Ctrl+Shift+C pre dokončovaniekódu. V časti '''implementation''' bude doplnené:<br />
<pascal><br />
procedure DoSomething;<br />
begin<br />
|<br />
end;<br />
</pascal><br />
<br />
Tip: Pomocou Ctrl+Shift+Up môžete prepínať medzi definíciou a telom procedúry.<br />
<br />
Telo novej procedúry bude pridané pred metódy tried. Ak už sú v časti interface nejaké definície procedúr, IDE sa pokúsi zachovať ich poradie, napríklad:<br />
<pascal><br />
procedure Proc1;<br />
procedure Proc2; // nová procedúra<br />
procedure Proc3;<br />
</pascal><br />
<br />
Ak telá Proc1 a Proc3 už existujú, potom bude telo Proc2 vložené medzi telá procedúr Proc1 a Proc3. Toto správanie môže byť zmené pomocou Environment > Codetools Options -> Code Creation.<br />
<br />
Viacero procedúr:<br />
<pascal><br />
procedure Proc1_Old; // telo existuje<br />
procedure Proc2_New; // telo neexistuje<br />
procedure Proc3_New; // "<br />
procedure Proc4_New; // "<br />
procedure Proc5_Old; // telo existuje<br />
</pascal><br />
<br />
Dokončovanie kódu pridá 3 telá procedúr (Proc2_New, Proc3_New, Proc4_New).<br />
<br />
Prečo sa to volá Dokončovanie forward procedúr"?<br />
<br />
Pretože tento nástroj nepracuje len s procedúrami definovanými v časti interface, ale aj s procedúrami, ktoré sú definované pomocou kľúčového slova '''forward'''.<br />
<br />
===Dokončovanie priradenia udalostí===<br />
(''Event Assignment Completion'')<br />
<br />
Dokončovanie priradenia udalostí je čsťou Dokončovania kódu a dokončuje jeden príkaz Event:=|. Nastáva, keď je kurzor umiestnený za príkazom priradenia udalosti.<br />
<br />
Napríklad:<br />
V metóde, povedzme udalosti FormCreate event, pridajte riadok: 'OnPaint:=':<br />
<pascal><br />
procedure TForm1.Form1Create(Sender: TObject);<br />
begin<br />
OnPaint:=|<br />
end;<br />
</pascal><br />
<br />
Značka '|' je umiestnenie kurzora a netreba ju zadávať.<br />
<br />
Potom stlačte Ctrl+Shift+C pre dokončovanie kódu. Príkaz priradenia udalosti bude doplnený takto:<br />
<pascal><br />
OnPaint:=@Form1Paint;<br />
</pascal><br />
<br />
Do triedy TForm1 bude pridaná nová metóda Form1Paint. Potom je spustené dokončovanie tried a dostanete:<br />
<pascal><br />
procedure TForm1.Form1Paint(Sender: TObject);<br />
begin<br />
|<br />
end;<br />
</pascal><br />
<br />
Pracuje presne ako pridávanie metód v Object inspectore.<br />
<br />
Poznámka: Kurzor musíte umiestniť za operátor priradenia ':='. Ak ho umiestnite na identifikátor (tj. OnPaint), dokončovanie kódu spustí Dokončovanie lokálnych premenných, ktoré zlyhá, pretože OnPaint je už definovaná.<br />
<br />
Tip:<br />
Môžete definovať meno novej metódi aj sami, a to jej zadaním do priradenia, napríklad:<br />
<pascal><br />
OnPaint:=@ThePaintMethod;<br />
</pascal><br />
<br />
===Dokončovanie deklarácie premenných===<br />
(''Variable Declaration Completion'')<br />
<br />
Dokončovanie deklarácie premenných je časťou '''Dokončovania kódu''' a pridáva definíciu lokálnej premennej pre príkaz Identifier:=Term;. Dokončovanie deklarácie premenných je vyvolané, keď je kurzor umiestnený na identifikátore v priradení.<br />
<br />
Napríklad:<br />
<pascal><br />
procedure TForm1.Form1Create(Sender: TObject);<br />
begin<br />
i:=3;<br />
end;<br />
</pascal><br />
<br />
Umiestnite kurzor na 'i' alebo tesne za neho, potom stlačte Ctrl+Shift+C pre dokončovanie kódu a dostanete:<br />
<pascal><br />
procedure TForm1.Form1Create(Sender: TObject);<br />
var<br />
i: Integer;<br />
begin<br />
i:=3;<br />
end;<br />
</pascal><br />
<br />
Nástroj dokončovania kódu najprv skontroluje, či identifikátor 'i' už nie je definovaný a ak nie, pridá deklaráciu 'var i: integer;'. Typ identifikátora je odhadovaný podľa pravej strany príkazu priradenia. Čísla ako 3 sú identifikované ako Integer.<br />
<br />
Iný príklad:<br />
<pascal><br />
type<br />
TWhere = (Behind, Middle, InFront);<br />
<br />
procedure TForm1.Form1Create(Sender: TObject);<br />
var<br />
a: array[TWhere] of char;<br />
begin<br />
for Where:=Low(a) to High(a) do writeln(a[Where]);<br />
end;<br />
</pascal><br />
<br />
Umiestnite kurzor na 'Where' a stlačte Ctrl+Shift+C pre dokončenie kódu. Dostanete:<br />
<pascal><br />
procedure TForm1.Form1Create(Sender: TObject);<br />
var<br />
a: array[TWhere] of char;<br />
Where: TWhere;<br />
begin<br />
for Where:=Low(a) to High(a) do writeln(a[Where]);<br />
end;<br />
</pascal><br />
<br />
===Spätné dokončovanie triedy===<br />
(''Reversed Class Completion'')<br />
Spätné dokončovanie triedy je časťou '''Dokončovania kódu''' a pridáva deklarácie súkromných metód pre aktuálne telo metódy. Je vyvolané, keď je kurzor v tele metódy, zatiaľ nie je definované pre triedy.<br />
<br />
Táto vlastnosť je dostupná od 0.9.21.<br />
<br />
Napríklad:<br />
<pascal><br />
procedure TForm1.DoSomething(Sender: TObject);<br />
begin<br />
end;<br />
</pascal><br />
<br />
Metóda DoSomething zatiaľ nie je v TForm1 deklarovaná. Stlačte Ctrl+Shift+C a IDE pridá "procedure DoSomething(Sender: TObject);" k súkromným metódam triedy TForm1.<br />
<br />
Pre Delphianov:<br />
Dokončovanie tried pracuje pod Lazarus vždy jednym spôsobom:<br />
*Z rozhrania triedy do jej implementácie alebo naopak z implementácie triedy do jej rozhrania. Delphi vždy vyvoláva oba smery. Poszup v Delphi má nevýhodu, že ak dôjde k preklepu, ľahko vytvoríte bez upozornenia zvyšok novej metódy.<br />
<br />
===Komentáre a dokončovanie kódu===<br />
(''Comments and Code Completion'')<br />
<br />
Dokončovanie kódu sa pokúša uchovávať komentáre tam, kde sú. <br />
Príklad:<br />
<pascal><br />
FList: TList; // zoznam prvkov TComponent<br />
FInt: integer;<br />
</pascal><br />
<br />
Pri vkladaní novej premennej medzi FList a FInt, je komentár ponechaný na riadku spolu s FList. To platí i pre:<br />
<pascal><br />
FList: TList; { zoznam prvkov TComponent<br />
Toto je komentár na niekoľkých riadkoch, začínajúci<br />
na riadku s FList, tak nástroj dokončenia kódu predpokladá že patrí <br />
k riadku s FList a nepreruší tento vzťah.<br />
Kód bude vložený za komentár. }<br />
FInt: integer;<br />
</pascal><br />
<br />
Ak komentár začína na ďalšom riadku:<br />
<pascal><br />
FList: TList; // zoznam prvkov TComponent<br />
{ Tento komentár patrí k nasledujúcemu riadku. <br />
Nový kód je vložený pred tentokomentár a <br />
za komentár na riadku s FList. }<br />
FInt: integer;<br />
</pascal><br />
<br />
==Refactoring==<br />
<br />
===Otočenie priradenie===<br />
(''Invert Assignments'')<br />
<br />
Otočenie priradenia pracuje s vybratými príkazmi Pascalu a obracia všetky priradenia z tohoto výberu. Tento nástroj je užitočný pre transformáciu "save" kódu na "load" a naopak.<br />
<br />
Príklad:<br />
<pascal> procedure DoSomething;<br />
begin<br />
AValueStudio:= BValueStudio;<br />
AValueAppartment :=BValueAppartment;<br />
AValueHouse:=BValueHouse;<br />
end;<br />
</pascal><br />
<br />
Vyberte riadky s priradeniami (medzi begin a end) a urobte Otočenie priradenia, všetky priradenia budú otočené a automaticky odsadené. Výsledok:<br />
<pascal><br />
procedure DoSomething;<br />
begin<br />
BValueStudio := AValueStudio;<br />
BValueAppartment := AValueAppartment;<br />
BValueHouse := AValueHouse;<br />
end;<br />
</pascal><br />
<br />
=== Uzavrieť výber ===<br />
<br />
Vyberte nejaký text a vyvolajte nástroj. Zobrazí sa dialóg, kde si môžete vybrať či má výber uzatvorený medzi '''try..finally''' ale do mnoho iných blokov.<br />
<br />
=== Premenovať identifikátor ===<br />
<br />
Umiestnite kurzor na identifikátor a vyvolajte tento nástroj, obaví sa dialóg, v ktorom môžete nastaviť rozsah hľadania a nové meno identifikátora. <br />
* premenované budú všetky výskyty a len tie, ktoré momentálne používajú túto deklaráciu, čiže edklarácie s rovnakým menom nebudú premenované. <br />
* najprv bude vykonaná kontrola konfliktov mena. <br />
* Obmedzenia: Pracuje len so zdrojovými kódmi Pascalu, zatiaľ nepremenúva súbory ani neupravuje súbory lfm/lrs, či súbory lazdoc.<br />
<br />
=== Nájdi odkazy na identifikátor ===<br />
<br />
Umiestnite kurzor na identifikátor a vyvolajte nástroj. Objaví sa dialóg, v ktorom môžete nastaviť rozsah hľadania. IDE bude hľadať všetky výskyty a len tie, ktoré používajú aktuálnu deklaráciu. Čiže iné deklarácia s rovnakým menom, nebudú zobrazené.<br />
<br />
=== Zobraziť abstraktné metódy ===<br />
<br />
Táto funkcia vypisuje a automaticky kompletuje virtuálne, abstraktné metódy, ktoré je majú byť implementované.<br />
<br />
Umiestnite kurzor na deklaráciu triedu a vyvolajte nástroj. Ak existujú nejaké chýbajúce abstraktné metódy, nude zobrazený dialóg s ich zoznamom. Zvoľte metódy pre implementovanie a IDE vytvorí základy metód.<br />
<br />
=== Vytiahnuť procedúru ===<br />
Viz [[IDE_Window:_Extract_Procedure/sk|Extract Procedure]]<br />
<br />
==Hľadanie deklarácie==<br />
(''Find Declaration'')<br />
<br />
Umiestnite kurzor na identifikátor a urobte Hľadanie deklarácie, tým bude nájdená deklarácia tohoto identifikátora, prípadne otvorený príslušný súbor a kurzor bude premiestnený na miesto deklarácie.<br />
<br />
Každé hľadanie deklarácie nastavuje bod skoku. Tzn. po skoku na nájdenú deklaráciu môžete jednoduchos skočiť naspäť pomocou Search -> Jump back.<br />
<br />
Oproti Delphi má nástroj isté rozdiely:<br />
Nástroj pracuje so zdrojovým kódom na základe pravidiel Pascalu, a nie s výsledkom prekladača. The compiler returns the final type. Nástroj prezerá zdrojové kódy a všetky kroky medzi. Napríklad:<br />
<br />
: Vlastnosť 'Visible' je najprv definovaná v TControl (controls.pp), potom je predefinovaná v TCustomForm a nakoniec predefinovaná aj v TForm. Spustenie hľadania deklarácie vlastnosti Visible vás najprv presunie na Visible v TForm. Potom môžete spustiť hľadanie deklarácie znova a skočíte na Visible v TCustomForm a znova pre skočenie na Visible v TControl.<br />
<br />
Obdobne je to s TColor.<br />
Pre prekladač je to jednoducho 'longint', ale v zdrojovom kóde je to definované ako:<br />
<pascal><br />
TGraphicsColor = -$7FFFFFFF-1..$7FFFFFFF;<br />
TColor = TGraphicsColor;<br />
</pascal><br />
<br />
Obdobné je to aj s forward definovanými triedami:<br />
Napríklad v TControl je priávtna premenná<br />
<pascal><br />
FHostDockSite: TWinControl;<br />
</pascal><br />
<br />
Hľadanie deklarácie pre TWinControl skočí na forward definíciu:<br />
<pascal><br />
TWinControl = class;<br />
</pascal><br />
<br />
A opätovné spustenie hľadania deklarácie skočí na skutočnú implementáciu:<br />
<pascal><br />
TWinControl = class(TControl)<br />
</pascal><br />
<br />
Týmto spôsobom môžete stopovať každý identifikátor a nájsť každé predefinovanie, či preťaženie.<br />
<br />
==Dokončovanie identifikátorov==<br />
(''Identifier Completion'')<br />
<br />
Dokončovanie identifikátorov je vyvolané pomocou Ctrl+Space a zobrazuje všetky vyhovujúce identifikátory. <br />
<br />
Napríklad:<br />
<pascal><br />
procedure TForm1.FormCreate(Sender: TObject);<br />
begin<br />
|<br />
end;<br />
</pascal><br />
<br />
Umiestnite kurzor medzi ''begin'' a ''end'' a stlačte Ctrl+Space. Nástroj IDE spracuje celý dosiahnuteľný kód a zobrazí zoznam všetkých nájdených identifikátorov. CodeTools kešuje výsledok, takže druhý krát bude oveľa rýchlejší.<br />
<br />
'''Poznámka pre Delphianov:''' Delphi to volá ''Dokončovanie kódu''.<br />
<br />
Niektoré identifikátory, ako 'Write', 'ReadLn', 'Low', 'SetLength', 'Self', 'Result', 'Copy' sú zabudované v prekladači a teda nie sú definované nikde v zdrojovom kóde, al Dokončovanie identifikátorov má veľa z nich tež zabudovaných. Ak nájdete nejaký chýbajúci, jednoducho vytvorte požiadadvku na vlastnosť v sledovači chýb (''bug tracker'').<br />
<br />
Dokončovanie identifikátorov nedokončuje kľúčové slová, takže ho nemožno použiť na dokončenie proc' na 'procedure'. Na toto je určené Ctrl+W [[#Dokončovanie_slov|Dokončovanie slov]] alebo Ctrl+J [[#Šablóny_kódu|Šablóny kódu]].<br />
<br />
Dokončovanie identifikátorov nezobrazuje len tie identifikátory, ktoré nie sú kompatibilné.<br />
<br />
===Predpona===<br />
Môžete začať dokončovanie identifikátorov v existujúcom slove. Potom budú písmená vľavo od kurzora brané ako predpona. <br />
<br />
Napríklad:<br />
<pascal><br />
procedure TForm1.FormCreate(Sender: TObject);<br />
begin<br />
Ca|ption<br />
end;<br />
</pascal><br />
<br />
Okno bude zobrazovať len identifikátory začínajúce sa na 'Ca'.<br />
<br />
===Klávesy===<br />
<br />
* Písmená/čísla: pridávajú znak do editora zdrojového kódu a aktuálnej predpony, čo zároveň aktualizuje zoznam.<br />
* Backspace: odstraňuje posledný znak z editora zdrojového kódu a aktuálnej predpony, čo zároveň aktualizuje zoznam.<br />
* Return: nahradzuje celé slovo na kurzore zvoleným identifikátorom a zatvára vyskakovacie okno.<br />
* Shift+Return: as ''Return'', but replaces only the prefix (left part) of the word at the cursor.<br />
* Hore/Dole: presúva výber.<br />
* Esc: zatvára vyskakovacie okno bez zmeny.<br />
* Tab: dokončuje predponu na ďalšiu voľbu. Napríklad: aktuálna predpona je 'But' a dokončovanie identifikátora zobrazuje len 'Button1' a 'Button1Click', potom stlačenie ''Tab'' dokončí predponu na 'Button1'.<br />
* Else: ako ''Return'' a pridá znak do editora zdrojového kódu.<br />
<br />
==Dokončovanie slov==<br />
(''Word Completion'')<br />
<br />
Dokončovanie slov je vyvolané stlačením Ctrl+W a zobrazuje všetky slová všetkých aktuálne otvorených editorov. Inak pracuje presne ako Dokončovanie identifikátorov.<br />
<br />
==Prejdi do direktívy include==<br />
(''Goto Include Directive'')<br />
<br />
Tento príkaz v menu Searchskočí do príkazu (direktívy) {$I filename}, v ktorej je použitý aktuálny súbor.<br />
<br />
==Publikuj Projekt==<br />
Vytvára kópiu celého projektu. Ak chcete niekomu poslať len zdrojové kódy a nastavenia prekladača pre svoj kód, budete kamarátis touto funkciou.<br />
<br />
Bežný adresár projektu obsahuje množstvo informácií. Väčšinu z nich publikovať netreba. Súbor .lpi obsahuje informácie o relácii (ako pozíciu caret a záložiek zatvorených jednotiek) a adresár projektu obsahuje mnoho súborov .ppu a .o, a tiež .exe. A práve príkaz Publikuj projekt vytvorí súbor .lpi len so základnými informáciami a všetky zdrojové kódy, so všetkých podadresárov.<br />
<br />
V ponúknutom dialógu môžete nastaviť filter pre zahrnutie/vynechanie, či pre kompresiu výstupu do jediného archívu.<br />
<br />
==Spolupracovníci==<br />
This page has been converted from the epikwiki [http://lazarus-ccr.sourceforge.net/index.php?wiki=LazarusIdeTools version].<br />
* Created page and initial template - 4/6/2004 [[User:Tom Lisjac| VlxAdmin]]<br />
* Initial content posted - 4/10/2004 MattiasG<br />
* Small wiki and formatting fixes - 4/11/2004 [[User:Tom Lisjac| VlxAdmin]]<br />
* Added a summary table for IdeTools shortcuts - 12 July 2004 [[User:Kirkpatc]]<br />
* Preložené z originálu [[Lazarus IDE Tools]] - [[User:Slavko|Slavko]] 13:51, 25 Mar 2005 (PST)</div>Slavkohttps://wiki.freepascal.org/index.php?title=Main_Page/sk&diff=26862Main Page/sk2008-02-17T14:38:18Z<p>Slavko: vypnutie obsahu</p>
<hr />
<div>__NOTOC__<br />
{{Main Page}}<br />
=Vitajte na wiki Lazarus a Free Pascal=<br />
==Popis==<br />
Cieľom tejto wiki stránky je byť vedomostnou základňou pre FPS/Lazarus a [[Related projects | príbuzné projekty]].<br />
<br />
FPC už má dobrú používateľskú dokumentáciu v rôznych formátoch, ale [[FPC development|FPC developer information, organizational information]] a subjekty, ktorá zatiaľ nie sú [[FPC documentation| správne zdokumentované]] sú v v tejto wiki. <br />
<br />
Lazarus, inými slovami, má niektoré trhliny v používateľskej dokumentácii, preto bola vytvorená táto oblasť ako "otvorený dokument" alebo "wiki", kde upravovať a pridávať obsah môže každý. <br />
<br />
Wiki zrýchľuje situáciu umožnením zmien a pridávania cez webový prehliadač! Pre príručky, prosím pozrite na [http://www.chat11.com/30_Second_Quick_Wiki_Tutorial 30-sekundový rýchly Wiki Tutorial] alebo na [http://en.wikipedia.org/wiki/Wikipedia:Tutorial príručka WikiPedia]. Pre nácvik je k dispozícii [[Sand Box/sk|Pieskovisko]]. Ak máte nejaký problém, prosím informujte [http://sourceforge.net/users/vlx/ administrátora] alebo pošlite hlásenie chyby na [http://sourceforge.net/projects/lazarus-ccr Lazarus-CCR] SF stránku. Môžete tiež pridať poznámku alebo návrh na našej [[Site Feedback| spätnoväzobnej stránke]].<br />
<br />
'''Históriu projektu''' Lazarus nájdete na stránke [[History | histórie]].<br />
<br />
== Dokumentácia Free Pascal ==<br />
;[[FPC documentation|Vývojárska dokumentácia FPC]]<br />
:Obsahuje dostupnú dokumentáciu pre vývojárov a iných spolupracovníkov Free Pascal Compiler, ako ľudia podieľajúci sa na prekladoch správ do iných jazykov, zoznam pascal bindings, organizačné informácie, postupy pre uvoľnenie FPC, zoznamy ToDo. atď.<br />
<br />
== Dokumentácia Lazarus ==<br />
;[[Lazarus Documentation/sk | Dokumentácia Lazarus]]<br />
:Všetka dostupná dokumentácia a [[Lazarus_Documentation/sk#Pr.C3.ADru.C4.8Dky_Lazarus_a_Pascal | príručky]] pre Lazarus IDE môžete nájsť na [[Lazarus Documentation/sk | slovenskej dokumentačnej stránke]]. Veľa týchto stránok je "v procese tvorby", tak sa nebojte pridať vlastné skúsenosti a informácie. Môžte si aj vytvoriť vlastnú stránku s osobnými a kontaknými informáciami.<br />
<br />
== Download ==<br />
Všetky momentálne prístupné komponenty a balíky sú oblasti súborov <br />
[http://sourceforge.net/project/showfiles.php?group_id=92177 Lazarus-CCR Sourceforge]. Free Pascal prekladač a aktuálne testovacie verzie Lazarus nájdete na<br />
[http://sourceforge.net/project/showfiles.php?group_id=89339 stránke Lazarus Sourceforge]. Dodatočná dokumentácia o týchto balíkoch je na [[Components and Code examples]] wiki stránke. Prekladač a vela poskytnutého kódu nájdete na stránke sťahovacích zrkadiel [http://www.freepascal.org/sdown.html Free Pascal Compiler] a na stránke [http://lazarus.freepascal.org Lazarus IDE].<br />
<br />
==Mailing listy==<br />
Noví a aj skúsení používatelia sú pozvaní zapojiť sa do Lazarus-ccr <br />
[http://lists.sourceforge.net/lists/listinfo/lazarus-ccr-announce oznámenia] a [http://lists.sourceforge.net/lists/listinfo/lazarus-ccr-general všeobecných] mailing listov.<br />
<br />
Možnu užitočnejšie budú [http://www.lazarus.freepascal.org/modules.php?op=modload&name=StaticPage&file=index&sURL=maill Lazarus] IDE mailing list a [http://www.freepascal.org/maillist.html FreePascal] vývojárske a informačné mailing listy.<br />
<br />
<br />
==Kto pracuje na čom?==<br />
Ak práve prerábate komponent alebo knižnicu, prosím uverejnite to na [[Current conversion projects]] stránke. Tieto informácie pomôžu vývojárom ktorý chcú prepísať komponenty a zároveň zabráni tomu aby dvaja ľudia robili na jednej veci.<br />
<br />
==Referencie, odkazy a zdroje==<br />
<br />
===Lazarus IDE===<br />
Novinky a informácie o stave prostredia Lazarus sa nachádzajú na [http://lazarus.freepascal.org Lazarus IDE website]. Vydania prostredia Lazarus a prekladača FreePascal môžete stiahnut tam. [http://sourceforge.net/project/showfiles.php?group_id=89339 Lazarus file area] má tiež posledné balíky prostredia Lazarus a prekladača Free Pascal.<br />
<br />
====Aktívne projekty Lazarus====<br />
Náš momentálny zoznam [[Projects using Lazarus/sk|Projects using Lazarus]] , je verejne prístupný a obsahuje súbory spojené s Lazarusom na stiahnutie.<br />
<br />
====Super stránky and odkazové farmy====<br />
Náš momentálny zoznam stránok ohladom Delphi/Kylix môžete náist na [[Page Of Code Sites]]. Ak poznáte stránku ktorá tam nieje, pridajte ju.<br />
====Špecializované vyhladávače====<br />
Na webe sa nachádzaju velmi vyspelé prehladávače ktoré uľahčia učenie a prácu pri riešení problémov.<br />
Tamarack Associates spravuje rýchly [http://www.tamaracka.com/search.htm prehladávač] špeciálne navrhnutý pre Borland usenet archívy. Mer Systems Inc. spravuje podobný [http://www.mers.com/searchsite.html prehladávač].<br />
Ďaľším vynikájúcim zdrojom informácií je [http://www.efg2.com/Lab/search.htm Earl F. Glynn's Computer Lab]<br />
<br />
=Preklady=<br />
* [[Main Page/es | Español (Spanish)]]<br />
* [[Main Page/de | Deutsch (German)]]<br />
* [[Main Page/it | Italiano (Italian)]]<br />
* [[Main Page/nl | Nederlands (Dutch)]]<br />
* [[Main Page/pt | Português (Portuguese)]]<br />
* [[Main Page/fi | suomi (Finnish)]]<br />
<br />
=Stará wiki=<br />
Tieto stránky sú v procese prerábania zo starého wiki formátu. Stará wiki stránka sa nachádza [http://lazarus-ccr.sourceforge.net/index.php?wiki=FrontPage tu].<br><br />
Originálny obsah [[User:VlxAdmin]].</div>Slavkohttps://wiki.freepascal.org/index.php?title=Installing_Lazarus/sk&diff=26466Installing Lazarus/sk2008-01-27T16:32:52Z<p>Slavko: úprava CVS -> SVN</p>
<hr />
<div>{{Installing Lazarus}}<br />
<br />
==Úvod==<br />
<br />
Pre tých, ktorí jednoducho chcú nainštalovať Lazarus a začať ho používať pre programovanie, je najjednoduchším prístupom stiahnuť a nainštalovať najnovšiu, podľa možností stabilnú, binárnu verziu (linuxový balíček ".rpm alebo windowsový balíček ".exe"). Môžete si prečíteť časti pod Linux alebo Windows nazvané "fpc binaries" alebo prvé odstavece v časti o inštalácii Lazarus v Linuxe alebo vo Windows; väčšinu ostatných informácií môžete kľudne ignorovať.<br />
<br />
Tí, ktorí sa chcú spolupracovať pri vývoji prekladača alebo IDE, alebo chcú mať najaktuálnejšie nástroje, budú potrebovať inštaláciu zo zdrojových súborov a väčšina zvyšných informácií je pre nich relevantná.<br />
<br />
Lazarus pozostáva z dvoch základných častí:<br />
* LCL - knižnica komponentov Lazarus (Lazarus Component Library)<br />
* IDE - Integrované vývojové prostredie<br />
<br />
Tieto v podstate závisia na:<br />
* FreePascal – prekladač FreePascal<br />
* FCL – knižnica komponentov FreePascal (FreePascal Component library,obsahujúca väčšinu nevizuálnych komponentov použitých v Lazarus<br />
<br />
===Systémové požiadavky Lazarus===<br />
<br />
# prekladač FreePascal, balíčky a zdrojové kódy (*dôležité* rovnakej verzie/dátumu)<br />
# podporovaný Widget tool-kit<br />
#:;Win32: : môže byť použité pôvodné Win32 API<br />
#:;Linux/xxxBSD: GTK+ 1.2.x : Väčšina distribúcií Linuxu a *BSDs už inštaluje knižnice GTK+ 1.2.x. Nájsť ich môžete aj na http://www.gtk.org. <br> Budete tiež chcieť gdk-pixbuf, 0.13 alebo novšiu (doporučené 0.18 alebo novšie), ktorú tiež nájdete vo väčšine nových distribúcií. Zdrojový kód je dostupný z ftp://ftp.gnome.org/pub/GNOME/sources/gdk-pixbuf/<br />
#:;Mac OS X: GTK+ 1.2.x : Budete potrebovať Apple Developer Tools, X11 a GTK1.2. Viz nižšie Inštalácia pod Mac OS X.<br />
#:;GTK+ 2.x: UPOZORNENIE: Rozhranie GTK2 zatiaľ nie je kompletné a je len pre testovacie účely.<br> Nájdete ho vo väčšine posledných distribúcií, zdrojový kód hľadajte na http://www.gtk.org.<br />
<br />
FAQ - Najčastejšie kladené otázky sú dostupné na http://www.lazarus.freepascal.org . Niektoré z otázok môžete nájsť v lokálnom súbore 'FAQ'.<br />
<br />
Nasledujúce časti popisujú ako získať FreePascal a ako správne nainštalovať Lazarus.<br />
<br />
==Inštalácia prekladača FreePascal==<br />
<br />
Rozsiahla diskusia o inštalácii a budovaní prekladačov FreePascal je dostupná na http://www.stack.nl/~marcov/buildfaq.pdf - pre niektorých užívateľov môže byť zbytočne podrobná, ale je dostatočne vyčerpávajúca.<br />
<br />
Lazarus vyžaduje '''fpc''' (FreePascal) verzie 2.2.0 alebo novšií a vyžaduje oboje, aj preložené knižnice fpc (binárne) aj zdrojové kódy fpc, a oboje rovnakej verzie.<br />
<br />
===Inštalácia Free Pascalu pod Linuxom===<br />
<br />
====Binárky FPC====<br />
<br />
Posledné uvoľnenie FreePascal, verziu 2.2.0, môžete získať z webovej stránky FreePascal (http://www.freepascal.org/download.html, potom zvoľte zrkadlo) alebo zo sourceforge (http://sourceforge.net/projects/lazarus). <br />
<br />
V sťahovacej sekcii Lazarus (http://www.lazarus.freepascal.org ) nájdete RPM balíčky prekladača Free Pascal (compiler / linux). Ak nemáte distribúciu založenú na RPM, môžete si stiahnuť a nainštalovať tarbally z http://www.freepascal.org. Ak si chcete binárky prekladať sami, pozrite sekciu BSD.<br />
<br />
Inštrukcie:<br />
<br />
UPOZORNENIE: ak '''nepoužívate RPM''' (dokonca ak plánujete použiť alien) je lepšie získať posledný stabilný fpc (momentálne 2.2.0) a nainštalovať Lazarus zo zdrojových kódov.<br />
<br />
Spusťte Linux a prihláste sa ako ROOT.<br />
<br />
Stiahnite posledné súbory z http://sourceforge.net/project/showfiles.php?group_id=89339.<br />
Napríklad:<br />
:* fpc-2.0.4-0.i586.rpm<br />
:* fpcsrc-2.0.4-0.i386.rpm<br />
:* lazarus-0.9.22-0.i386.rpm<br><br />
a nainštalujte ich:<br />
:* rpm -Uvh fpc-2.0.4-0.i586.rpm<br />
:* rpm -Uvh fpcsrc-2.0.4-0.i386.rpm<br />
:* rpm -Uvh lazarus-0.9.22-0.i386.rpm<br><br />
<br />
Používatelia Debianu sa budú musieť uchýliť k použitiu alien (pozor, negeneruje fpc.cfg) alebo nainštalovať tarball.<br />
<br />
==== Zdrojové kódy FPC ====<br />
<br />
Od uvoľnenie verzie 2.0, FPC premigroval do Subversion (SVN). Momentálne neexistuje zrkadlo CVS, takže budete potrebovať na získanie zdrojových kódov FPC použiť SVN.<br />
<br />
===== Stiahnutie Dennej snímky zdrojových kódov Vývojového stromu (version 2.3.x) =====<br />
<br />
Môžete stiahnuť dnešné vývojové (v 2.3.x) zrdojové kódy v podobe komprimovanej snímky SVN úložiska zdrojových kódov: tieto snímky sú denne aktualizované a odrážajú stav úložiska zdrojových kódov. Súbory sú uchovávané na stránke s archívom SVN.<br />
<br />
Celý verejný archív zdrojových kódov verzie 2.3.x: [ftp://ftp.freepascal.org/pub/fpc/snapshot/v23/source/fpc.zip fpc.zip] (24 MB)<br />
<br />
===== Stiahnutie Dennej snímky zdrojových kódov Uvoľneného stromu (verzia 2.2.x) =====<br />
<br />
Môžete stiahnuť dnešné vývojové (v 2.2.x) zdrojové kódy, ktoré budú viesť k nasledujúcej stabilnej verzi v podobe komprimovanej snímky SVN úložiska zdrojových kódov: tieto snímky sú denne aktualizované a odrážajú stav úložiska zdrojových kódov. Súbory sú uchovávané na stránke s archívom SVN.<br />
<br />
Celý verejný archív verzie 2.2.x: [ftp://ftp.freepascal.org/pub/fpc/snapshot/v22/source/fpc.zip fpc.zip] (24 MB)<br />
<br />
<br />
===== Pripojenie k úložisku zdrojových kódov pomocou SVN =====<br />
<br />
Ako alternatíva k denným zip súborom zdrojových kódov SVN, je každému dostupné SVN úložisko, s prístupom len na čítanie. Čiže môžete priamo pristupovať ku kódu a budete mať k dispozícii skutočne aktuálne zdrojové kódy. Je to tiež metóda, ktorá vyžaduje menej šírky pásma, okrem prvotného stiahnutia (checkout v jazyku SVN).<br />
<br />
===== Vývojové snímky =====<br />
<br />
<br />
(Samozrejme potrebujete mať nainštalované SVN. [http://subversion.tigris.org/ Tu hľadajte] inštrukcie ako to urobiť.)<br />
<br />
Zmeňte adresár (cd) na rodičovský adresár Vašej vývojovej oblasti, napr.<br />
<br />
[]$ cd /home/username/FreePascal<br />
<br />
Pre získanie úplného úložiska zdrojového kódu, všetkých verejne dostupných modulov, zadajte<br />
<br />
[]$ svn checkout http://svn.freepascal.org/svn/fpc/trunk fpc<br />
<br />
Normálne stačí tento krok urobiť len raz.<br />
<br />
Pre aktualizáciu zdrojových kódov, stiahnutých podľa predchádzajúceho kroku (checkout), zadajte<br />
<br />
[]$svn update fpc<br />
<br />
<br />
===== Opravy pre 2.2.x =====<br />
<br />
Opravy potrebujú samostatný adresrá, vytvorte napríklad adresár 'fixes', vstúpte do neho a opakujte predchádzajúci príkaz checkout s URL http://svn.freepascal.org/svn/fpc/branches/fixes_2_2:<br />
<br />
[]$ cd mysvn/fixes<br />
[]$ svn checkout http://svn.freepascal.org/svn/fpc/branches/fixes_2_2 fpc<br />
<br />
a pre aktualizáciu:<br />
<br />
[]$ svn update fpc<br />
<br />
Zdrojové kódy dokumentácie sú v samostatnom úložisku, zvanom fpcdocs, takže príkaz pre jej získanie je<br />
<br />
[]$ svn checkout http://svn.freepascal.org/svn/fpcdocs/trunk fpcdocs<br />
<br />
Ak sa o subversion chcete naučiť viac, prečítajte si výbronú [http://svnbook.red-bean.com/ knihu o Subversion], ktorá je slobodne dostupná online v rôznych fomátoch.<br />
<br />
Pre nechápavých: Máte prístup len na čítanie, takže sa nepokúšajte odoslať (commit) hocičo :-)<br />
<br />
Ďalšie informácie hľadajte n awebovej stránke [http://www.freepascal.org/develop.html FreePascal].<br />
<br />
===Inštalácia Free Pascal vo Windows===<br />
<br />
====Binárne súbory FPC pre Windows====<br />
<br />
Najjednoduchším spôsobom ako získať fungujúcu inštaláciu FreePascal je stiahnuť si aktuálnu release binárnych súborov Lazarus pre Windows zo SourceForge.net – release obsahuje aktuálnu verziu prekladača FreePascal a knižnice FreePascal, ako aj Lazarus IDE. Ak však chcete inštalovať zo zdrojových súborov, čítajte ďalej!<br />
<br />
Môžete získať zipovaný inštalátor fpc 2.2.0 v sekcii sťahovanie Free Pascal http://www.freepascal.org/download.html, (potom zvoľte zrkadlo).<br />
<br />
Inštalácia so zdrojových kódov je obsahom nasledujúcej sekcie - nie je určená pre nováčikov, keďže vyžaduje aj spúšťanie prekladača.<br />
<br />
====Zdrojové kódy FPC pre Windows====<br />
<br />
<<<< Viz predchádzajúcu sekciu [[#Zdrojové kódy FPC|Zdrojové kódy FPC]] pre Linux, kde je popísané použitie SVN >>>><br />
<br />
Najjednoduchší spôsob ako získať zdrojové kódy FreePascal je pomocou SVN. Zdrojové kódy môžete tiež stiahnuť ako celý balíček – pozrite http://www.freepascal.org/develop.html, kde sú denné snímky stromu verzie 2.3.x.<br />
<br />
Zdrojové kódy FPC pomocou SVN<br />
<br />
Na vykonanie nasledujúcich krokov budete potrebovať klienta SVN, napr. [http://www.tortoisecvs.org/ TortoiseSVN] alebo [http://www.wincvs.org/ WinCVS]. Presné príkazy sa môžu medzi klientami meniť; nasledujúce sú pre použitie s klientom [https://ccvs.cvshome.org/files/documents/19/324/cvs-1-12-9.zip CVS home].<br />
<br />
Najprv si vytvorte adresár, do ktorého umiestniíte zdrojové súbory (napr. c:\source), potom do príkazového riadku zadajte tieto príkazy:<br />
C:\Source> svn co http://svn.freepascal.org/svn/svn/trunk fpc<br />
Typ: Pre stiahnutie/aktualizáciu posledných zmien stačí zadať<br />
<br />
C:\> cd Source\FPC<br />
C:\Source\FPC> svn up<br />
<br />
Pozrite si http://www.freepascal.org/down-win32.html Zoznam zrkadiel nájdete na http://www.freepascal.org/sdown.html. Stiahnite FreePascal ako jeden veľký súbor, rozbaľte ho a spusťte install.exe.<br />
<br />
Do systémovej premennej PATH pridajte adresár fpc:<br />
* Win98: Upravte autoexec.bat pridaním riadku: PATH=%PATH%;C:\pp\bin\bin\win32<br />
* WinXP/2k: Tento počítač (pravý klik) -> Vlastnosti -> Spresnenie (stránka) -> Premenné prostredia -> Systémové premenné -> Upravte "PATH" pridaním "C:\pp\bin\bin\win32".<br />
<br />
Potom reštartujte Windows.<br />
<br />
''ToDo: Explain how to download fpc sources and build the compiler''<br />
<br />
=== Inštalácia Free Pascal pod FreeBSD/auto ===<br />
<br />
Posledná kolekcia portov FreeBSD obsahuje stabilnú verziu 2.2.0 v ports/lang/fpc. Ale je roztrúsená do 57 (!) balíčkov a neinštaluje zdrojové kódy, tak je väčšinou lepšie nainštalovať ho manuálne (viz nižšie). Napriek tomu tu je postup pre inštaláciu portu.<br />
<br />
Toto musí byť urobené ako as root.<br />
<br />
[]# cd /usr/ports/lang/fpc && make install && make clean<br />
<br />
ďalšou možnosťou je použiť portinstall.<br />
<br />
[]# portinstall fpc<br />
<br />
Po nainštalovaní fpc skontrolujte či pracuje jednoduchým zadaním<br />
<br />
[]$ fpc<br />
<br />
===Inštalácia Free Pascalu pod BSD/manuálne===<br />
<br />
Všetko čo potrebujete sú:<br />
<br />
Súbor so všetkými zrojákmi prípadne dva (fpc a lazarus)<br />
<br />
1. napr. pre fpc ftp://ftp.freepascal.org/fpc/dist/Linux/separate/sources.tar najlepšie export (žiadne CVS/ adresáre). Tento súbor to nemá<br><br />
2. Denné zdrojáky Lazarus.<br />
* _hocaký_ štartovací prekladač od vydania 1.9) Verziu si môžete overiť pomocou príkazu "ppc386 -i". Ak je výstup 1.9.3 až 2.0.x tak je všetko vporiadku.<br />
* - závislosti. (pre FreeBSD je to gtk12, glib12 a gdk_pixbuf a ešte GNU make, iconv a gettext)<br />
<br />
Kompilácia FPC:<br />
<br />
1. (zožente) potrebné súbory (FPC zdrojáky, štartovací prekladač)<br />
2. (rozbalte) A potom od-tgz-ujte vo vašom pracovonom adresári,<br />
3. (skompilujte) choďte do work/fpc/ a spustite<br />
<br />
$MAKE all OPT='-gl -O3p3' PP=/cesta/k/štartovaciemukompileru-meno-ppc386<br />
(/cesta/k/.. môže byť vynechaná ak máte ppc386 v ceste(PATH))<br />
($MAKE je make v linuxe a gmake na BSD)<br />
<br />
4. (nainštalujte) vo work/fpc spusťte<br />
<br />
$MAKE install PP=compiler/ppc386 PREFIX=$THEPREFIX<br />
(THEPREFIX= je väčšinou /usr/lcoal, ale napr. na NetBSD je to /usr/pkg kvôli portom)<br />
Vytvorte symbolickú linku:<br />
ln -s $THEPREFIX/lib/fpc/1.0.8/ppc386 $THEPREFIX/bin/ppc386<br />
install sourceinstall PREFIX=$THEPREFIX<br />
<br />
5. (nastavťe) spustite compiler/utils/samplecfg $THEPREFIX/lib/fpc/1.9.3 $ETCDIR<br />
6. (nepovinne, testujte), presvečte sa či ppc386 -i dáva výstup, ináč musíte pridať $PREFIX/bin do vašej cesty. Skúsťe skompilovať program s parametrami -viwn, a pozrite či nepíše chyby.<br />
Poznámky:<br />
<br />
* Ak potrebujete fpcmake balíkové listy, musíte si ich sami vygenerovať alebo zohnať, v každom prípade spravte pokusnú inštaláciu do /tmp/pack a zistite či sa súbori nainštalovali pomocou find . >ll<br />
<br />
* $THEPREFIX a $ETCDIR by mali byť nastaviteľné uživateľom. Inak niesu možné lokálne inštalácie.<br />
<br />
* BSDHIER=1 pri všetkých príkazoch make núti hierarchické konvencie BSD.<br />
<br />
=== Inštalácia Free Pascalu pod Mac OS X ===<br />
<br />
Budete potrebovať Apple Developer tools, X11, and GTK 1.2:<br />
<br />
Developer-tools: sú zahrnuté na orginálnych inštalačných CD inštalácie OS X, alebo ich môžete stiahnuť z (nutná free registrácia) http://developer.apple.com/.<br />
<br />
Apple X11: Na novoinštalovanom systéme: zvoľte "Customize" v inštalačnom dialógu a zvoľte "X11".<br />
<br />
Na už nainštalovanom systéme: <br />
<br />
MacOSX 10.3: stiahnuť z http://www.apple.com/downloads/macosx/apple/x11formacosx.html<br />
<br />
MacOSX 10.4: nainštalovať X11 z DVD.<br />
<br />
GTK 1.2: Stiahnutie a správne nainštalovanie môže zabrať veľa času, preto využite dostupných správcov balíčkov. Jeden z nich je fink, ktorý môžete stiahnuť z http://fink.sourceforge.net/download/index.php?phpLang=en; a pokračovať podľa inštalačných pokynov.<br />
<br />
V termináli spusťte<br />
sudo /sw/bin/apt-get install gdk-pixbuf gtk+ gtk+-data gtk+-shlibs gtk-doc gtk-engines<br />
<br />
Aplikácie X11 je v /Applications/Utilities/X11. Môžete ju pretiahnuť do docku, aby ste ju mohli spúšťať jednym kliknutím.<br />
<br />
Tip: Väčšina programov X11, vrátane Lazarus, očakáva, že získa zameranie po kliknutí myšou do okna. Pod MacOSX je toto deaktivované, aktivovať ju môžte pre všetky aplikácie X11 zadaním v termináli:<br />
defaults write com.apple.x11 wm_click_through -bool true<br />
<br />
;Prekladač Free Pascal:<br />
Potom stiahnite a nainštalujte Prekladač Free Pascal Compiler (aspoň 2.2.0) z:<br />
: https://sourceforge.net/project/showfiles.php?group_id=89339<br />
<br />
Pri preklade GTK programov, musíte pridať do fpc.cfg dva riadky, ktoré umožnia používanie knižníc:<br />
-Fl/sw/lib<br />
-Fl/usr/X11R6/lib<br />
<br />
Pre Lazarus sú potrebné aj zdrojové kódy FPC:<br />
<br />
*nainštalujte SVN pre MacOS X: dobrou voľbou je balíček poskytnutý [http://www.codingmonkeys.de/mbo/ Martinom Ottom].<br />
<br />
Vytvorte adresár, kde chcete umiestniť zdrojové kódy. Túto úlohu nemusíte robiť ako root, môže to urobiť každý bežný používateľ. <br />
Najprv vytvorte adresár pre fpc <br />
: (napr. /Users/username/freepascal) <br />
potom otvorte terminál al urobte nsledujúce:<br />
[]$ svn co http://svn.freepascal.org/svn/fpc/trunk fpc<br />
Týmto vytvoríte adresár nazvaný 'fpc', ktorý môže byť neskôr použitý v IDE.<br />
Tit: Pre stiahnutie/aktualizáciou posledných zmien jednoducho spusťte<br />
[]$ cd /Users/username/freepascal/fpc<br />
[]$ svn up<br />
<br />
==Inštalácia Lazarus==<br />
<br />
===Inštalácia Lazarus pod Linuxom===<br />
<br />
==== Ubuntu / Debian ====<br />
<br />
Najjednoduchšia cesta pre získanie aktuálnej pracujúcej inštalácie Lazarus je stihnutie súborov .deb pre FreePascal a Lazarus z úložiska SourceForge.<br />
<br />
Experimentálne: [[How to setup a FPC and Lazarus Ubuntu repository/sk|Ako nastaviť úložisko FPC a Lazarus]]<br />
<br />
===== Jednoduché vytvorenie balíčkov deb =====<br />
<br />
Najjdenoduchšia cesta pre získanie aktuálnej funkčnej inštalácie Lazarus je stiahnuť a vybudovať svoje vlastné balíčky .deb podľa inštrukcií na [[How to setup a FPC and Lazarus Ubuntu repository/sk|Ako nastaviť úložisko FPC a Lazarus]]<br />
<br />
==== Inštalácia pomocou rpm ====<br />
Najľahší spôsob ako získať poslednú verziu Lazarusa je stiahnuť si RPM balíčky pre FreePascal a Lazarus z SourceForge stránky.<br />
<br />
Potrebujete stiahnuť vybranú verziu z:<br />
* prekladača (napr. fpc-1.9.5-041207.i386.rpm)<br />
* zdrojákov knižníc (napr. fpcsrc-1.9.5-041207.i386.rpm)<br />
* Lazarusa (napr. lazarus-0.9.2.4-fpc_1.9.5_041207.i386.rpm).<br />
<br />
Potom napíšete následovné príkazy (musíte mať práva root - použiťe su, alebo sudo)<br />
rpm -Uvh fpc-1.9.5-041207.i386.rpm<br />
rpm -Uvh fpcsrc-1.9.5-041207.i386.rpm<br />
rpm -Uvh lazarus-0.9.2.4-fpc_1.9.5_041207.i386.rpm<br />
<br />
Ak dávaťe prednosť ručnej inštalácie zo zdrojov, následujťe tieto inštrukcie. Pretože je celý lazarus nainštalovaný do jedného adresára, odinštalácia je veľmi jednoduchá a na inštaláciu nemusíte byť root. Môžete si stiahnuť tgz súbory fpc, fpcsrc a lazarus z downloads sekcie, alebo priamo cez CVS.<br />
<br />
;Sťahovanie lazarusa cez CVS: <br />
cvs umožňuje ľahký spôsob updatu pre vaše zdrojové kódy tým že sťahuje len zmenené súbory. Toto je odporúčaný spôsob ktorý vám ušetrí veľa času. Pripojenie na internet je nutné: Nemusíte byt root. Lazarus nepotrebuje špeciálne práva ani počas inštalácie ani za behu. Najprv pre Lazarus vytvorte adresár (napr. /home/username/freepascal) a potom spravte následovné:<br />
<br />
;pripojte sa na CVS server (poznámka: lazarus a freepascal používaju rovnaký server)<br />
[]$ export CVSROOT=:pserver:cvs@cvs.freepascal.org:/FPC/CVS<br />
[]$ cvs login<br />
heslo je 'cvs' bez ''. <br />
<br />
;stiahnite si lazarus zdrojáky:<br />
[]$ cvs -z3 co lazarus<br />
skompilujte lazarus:<br />
[]$ cd lazarus<br />
[]$ make (gmake on BSD)<br />
<br />
Ak bolo FPC nainštalované vporiadku, mala by kompilácia prebehnúť bez problémov. Ak nie, prečítajte si FAQ.<br />
<br />
;Spusťte lazarus<br />
[]$ ./lazarus<br />
<br />
IDE by sa malo spustiť. Ak ste spusťili lazarus v konzole, uvidíte pár poznámok ohladom chýbajúcich nastavení. Toto je normálne pri prvom štarte. IDE sa snaží automaticky naisť kde sú prekladač freepascal a jeho zdrojáky.<br />
<br />
;Skontrolujte cesty:<br />
: Použíte menu a choďte do<br />
:: Environment -> Environment Options -> Files<br />
<br />
'FPC Source directory' by mal ukazovať na miesto kde máte zdrojáky FPC. Tento adresár väčšinou končí s /fpc/ alebo /fpcsrc/ (napr. /usr/src/fpcsrc, alebo /home/username/freepascal/fpc) a obsahuje adresáre ako 'compiler', 'docs', 'fcl', 'rtl' a 'packages'.<br />
<br />
''Dorob: vysvetli ostatné cesty''<br />
<br />
;Rada:<br />
Aby ste updatly lazarus stačí<br />
[]$ cd /home/username/freepascal/lazarus<br />
[]$ cvs -z3 update -dP<br />
[]$ make clean all (gmake na BSD)<br />
Toto skompiluje lazarus a vytvorí IDE bez balíkov. Aby sťe napojili nainštalované balíky spravte následovné:<br />
[]$ make idepkg<br />
<br />
====Inštalácia Lazarusa pod Debian GNU/Linux====<br />
<br />
Existujú už predpripravené balíky pre Debian na stiahnutie. Uistite sa, že ste si prečítali usr/share/doc/lazarus/README.Debian predtým než začnete. Návrhy, nápady a sťažnosti sú výtané; prośim pošlite svoje komentáre Carlosovi Laviolovi <claviola@debian.org>.<br />
<br />
====Ďaľší (ľahší?) spôsob inštalácie Lazarusa pod Debianom====<br />
Pridal [[User:Kirkpatc]].<br />
<br />
;Jednoduchá inštalácia lazarusa pod Debianom<br />
(predpokladá sa čerstvá inštalácia Debianu bez načítaných vývojárskych knižníc)<br />
<br />
Zo stránky sourceforge si stiahnite posledné fpc, fpclib a lazarus vydania; následujte linky z http://lazarus.freepascal.org, kliknite na "downloads" nalavo, potom kliknite na "binaries" potom "linux" a potom "Current Lazarus RPM". Toto vás donesie až na<br />
: http://sourceforge.net/project/showfiles.php?group_id=89339<br />
Potom stiahnite následovné súbory (alebo novšie verzie ak sa dá)<br />
* fpc-1.9.5-041001.i386.rpm<br />
* fpcsrc-1.9.5-041001.i386.rpm<br />
* lazarus-0.9.2.2-fpc_1.9.5_041001.i386.rpm<br />
choďte do adresára kam ste súbory uložili a spravte sa root-om(su) a napíšte:<br />
<br />
alien fpc* //toto skonvertuje aj fpc aj fpcsrc do debian formátu<br />
alien laz*<br />
potom použite kpackage, alebo podobný nástroj na nainštalovanie fpc, fpcsrc a lazarus **.rpm.deb súborov.<br />
<br />
Potrebujete vytvoriť konfiguračný súbor, ktorý sa bude nachádzať v /etc/fpc.cfg. Stále ako root choďte do hlavného adresára fpc /usr/lib/fpc/1.9.5 a napíšte<br />
sh ./samplecfg /usr/lib/fpc/1.9.5 /etc<br />
Overte si obsah vášho nového konfiguračného súboru (cat /etc/fpc.cfg) a spravte zmeny ktoré potrebujete použitím vi alebo iného textového editora.<br />
<br />
Potrebujete nainštalovať vývojové balíky GTK a pixbuf takže<br />
apt-get install libgtk2.0-dev<br />
apt-get install libgdk-pixbuf-dev<br />
A potom môžte začať programovať!<br />
<br />
===Inštalácia Lazarusa pod Mac OS X===<br />
<br />
Je to vpodstate to isté ako pod Linuxom. Jedine musíte nainštalovať apple-developer tools a X11.<br />
<br />
===Inštalácia Lazarus vo Windows===<br />
<br />
Aktuálna release binárnych balíčkov Lazarus pre Windows sa inštaluje veľmi jednoducho. Binárny balíček pre Linux i Windows je dostupný z [http://sourceforge.net/project/showfiles.php?group_id=89339 SourceForge.net]<br />
<br />
Stiahnite poslednú verziu (momentálne (currently Lazarus-0.9.2.4-20041210-win32.exe) a spusťte aplikáciu. Dostanete sa do typickej inštalácie Windows, v ktorej sú prekladač FreePascal a zdrojové knižnice nainštalované do rovnakej adresárovej štruktúry ako Lazarus a môžete spustiť IDE a pracovať bez väčších problémov, za predpokladu, že máte odinštalovanú predchádzajúcu verziu Lazarus a/alebo FreePascal (väčšinou v adresári C:\pp).<br />
<br />
Lazarus Snapshot pre Windows nájdete aj na: http://www.ca.freepascal.org/Lazarus/<br />
<br />
====Inštalácia so zdrojových súborov====<br />
<br />
Ak dávate prednosť inštalácii zo zdrojových kódov, postupujte podľa nasledujúcich inštrukcií<br />
(Vďaka, Joe, za tento popis Krok za krokom)<br />
<br />
* potrebujete stiahnuť zdrojové kódy Lazarus z ftp://ftp.freepascal.org/pub/fpc/snapshot/lazarus/lazarus.zip<br />
<br />
''ToDo: pôvodná adresa ftp://ftp.freepascal.org/pub/fpc/source/lazarus.zip nefunguje, ale neviem či ide o to isté...''<br />
<br />
* archív rozbaľte, napr. do c:\Lazarus. Potrebujete mať nainštalovaný aspoň FreePascal-1.9.3, ktorým preložíte zdrojové kódy a Lazarus.exe pracuje. Cesta k môjmu (pôv. autorora) FreePascal je c:\pp\bin\win32. V tomto adresári nájdete viacero spustiteľných súborov (make, grep, ppc386 atď.).<br />
<br />
* Otvorte konzolu (príkazový riadok) a zadajte:<br />
cd c:\lazarus<br />
set path=c:\pp\bin\win32;c:\lazarus //samozrejme zmeňte na svoju cestu<br />
windres -i lazarus.rc -o lazarus.res<br />
make<br />
<br />
Ak všetko prebehne ako má, napíšte Lazarus.exe. Editor zdrojového kódu, dialógy a editor vlastností pracuje, ale nie perfektne... Pozrite sa a uvidíte.<br />
<br />
Môžete tiež preložiť príklady:<br />
cd examples<br />
make<br />
<br />
Ak rozbalíte Lazarus na iný disk, napr.: d:\Lazarus. Môže sa stať, že budete potrebovať utilitu gnu na jeho vytvorenie, ak ju máte, zadajte jej cestu do premennej Path, ale jednoduchšie je nevyberať iný disk.<br />
<br />
To je všetko.<br />
<br />
<br />
<br />
===Inštalácia Lazarusa pod BSD===<br />
<br />
Prośim napíšte ma niekto!<br />
<br />
==Pôvodní spolupracovníci a zmeny==<br />
This page has been converted from the epikwiki [http://lazarus-ccr.sourceforge.net/index.php?wiki=InstallingLazarus version].<br />
* Initially imported and formatted. [[User:Tom | VlxAdmin]] 9/22/2003<br />
* Changed Joe's part for Windows to require fpc 1.0.10. [[User:Vincent | Vincent]] 9/25/2003<br />
* Updated "What is required for lazarus". AndrewJohnson 10/1/2003<br />
* Finished formatted the InstallingLazarus page [[User:Tom | VlxAdmin]] 2/22/2004<br />
* Posted some notes about Installing FPC and Lazarus: mostly reflecting experiences in trying to get the PATHS right in Linux. 3/11/2004 [[User:Kirkpatc]]<br />
* Copied the contents of my note into the main InstallingLazarus section, edited it slightly. I don't know how to remove the original note. 3/12/2004 [[User:Kirkpatc]]<br />
* Removed the original note. Tidied the wiki and formatting a bit. [[User:Tom | VlxAdmin]]<br />
* Corrected a couple of typos - 3/12/2004 [[User:Kirkpatc]]<br />
* Added link for daily snapshot deb packages - 3/27/2004 [[User:Vincent | Vincent]]<br />
* Fixed links in GettingLazarus (downloading binaries) and several other pages. 22 July 2004 [[User:Kirkpatc]]<br />
* Added link for lazarus deb packages - 19 August 2004 VincentSnijders<br />
* Added a short note on installing in Debian - 23 Nov 2004 [[User:Kirkpatc]]<br />
* Considerable re-write and re-organization of installation section - 11 Dec 2004 [[User:Kirkpatc]]</div>Slavkohttps://wiki.freepascal.org/index.php?title=Installing_Lazarus/sk&diff=26465Installing Lazarus/sk2008-01-27T16:29:28Z<p>Slavko: úprava nadpisu</p>
<hr />
<div>{{Installing Lazarus}}<br />
<br />
==Úvod==<br />
<br />
Pre tých, ktorí jednoducho chcú nainštalovať Lazarus a začať ho používať pre programovanie, je najjednoduchším prístupom stiahnuť a nainštalovať najnovšiu, podľa možností stabilnú, binárnu verziu (linuxový balíček ".rpm alebo windowsový balíček ".exe"). Môžete si prečíteť časti pod Linux alebo Windows nazvané "fpc binaries" alebo prvé odstavece v časti o inštalácii Lazarus v Linuxe alebo vo Windows; väčšinu ostatných informácií môžete kľudne ignorovať.<br />
<br />
Tí, ktorí sa chcú spolupracovať pri vývoji prekladača alebo IDE, alebo chcú mať najaktuálnejšie nástroje, budú potrebovať inštaláciu zo zdrojových súborov a väčšina zvyšných informácií je pre nich relevantná.<br />
<br />
Lazarus pozostáva z dvoch základných častí:<br />
* LCL - knižnica komponentov Lazarus (Lazarus Component Library)<br />
* IDE - Integrované vývojové prostredie<br />
<br />
Tieto v podstate závisia na:<br />
* FreePascal – prekladač FreePascal<br />
* FCL – knižnica komponentov FreePascal (FreePascal Component library,obsahujúca väčšinu nevizuálnych komponentov použitých v Lazarus<br />
<br />
===Systémové požiadavky Lazarus===<br />
<br />
# prekladač FreePascal, balíčky a zdrojové kódy (*dôležité* rovnakej verzie/dátumu)<br />
# podporovaný Widget tool-kit<br />
#:;Win32: : môže byť použité pôvodné Win32 API<br />
#:;Linux/xxxBSD: GTK+ 1.2.x : Väčšina distribúcií Linuxu a *BSDs už inštaluje knižnice GTK+ 1.2.x. Nájsť ich môžete aj na http://www.gtk.org. <br> Budete tiež chcieť gdk-pixbuf, 0.13 alebo novšiu (doporučené 0.18 alebo novšie), ktorú tiež nájdete vo väčšine nových distribúcií. Zdrojový kód je dostupný z ftp://ftp.gnome.org/pub/GNOME/sources/gdk-pixbuf/<br />
#:;Mac OS X: GTK+ 1.2.x : Budete potrebovať Apple Developer Tools, X11 a GTK1.2. Viz nižšie Inštalácia pod Mac OS X.<br />
#:;GTK+ 2.x: UPOZORNENIE: Rozhranie GTK2 zatiaľ nie je kompletné a je len pre testovacie účely.<br> Nájdete ho vo väčšine posledných distribúcií, zdrojový kód hľadajte na http://www.gtk.org.<br />
<br />
FAQ - Najčastejšie kladené otázky sú dostupné na http://www.lazarus.freepascal.org . Niektoré z otázok môžete nájsť v lokálnom súbore 'FAQ'.<br />
<br />
Nasledujúce časti popisujú ako získať FreePascal a ako správne nainštalovať Lazarus.<br />
<br />
==Inštalácia prekladača FreePascal==<br />
<br />
Rozsiahla diskusia o inštalácii a budovaní prekladačov FreePascal je dostupná na http://www.stack.nl/~marcov/buildfaq.pdf - pre niektorých užívateľov môže byť zbytočne podrobná, ale je dostatočne vyčerpávajúca.<br />
<br />
Lazarus vyžaduje '''fpc''' (FreePascal) verzie 2.2.0 alebo novšií a vyžaduje oboje, aj preložené knižnice fpc (binárne) aj zdrojové kódy fpc, a oboje rovnakej verzie.<br />
<br />
===Inštalácia Free Pascalu pod Linuxom===<br />
<br />
====Binárky FPC====<br />
<br />
Posledné uvoľnenie FreePascal, verziu 2.2.0, môžete získať z webovej stránky FreePascal (http://www.freepascal.org/download.html, potom zvoľte zrkadlo) alebo zo sourceforge (http://sourceforge.net/projects/lazarus). <br />
<br />
V sťahovacej sekcii Lazarus (http://www.lazarus.freepascal.org ) nájdete RPM balíčky prekladača Free Pascal (compiler / linux). Ak nemáte distribúciu založenú na RPM, môžete si stiahnuť a nainštalovať tarbally z http://www.freepascal.org. Ak si chcete binárky prekladať sami, pozrite sekciu BSD.<br />
<br />
Inštrukcie:<br />
<br />
UPOZORNENIE: ak '''nepoužívate RPM''' (dokonca ak plánujete použiť alien) je lepšie získať posledný stabilný fpc (momentálne 2.2.0) a nainštalovať Lazarus zo zdrojových kódov.<br />
<br />
Spusťte Linux a prihláste sa ako ROOT.<br />
<br />
Stiahnite posledné súbory z http://sourceforge.net/project/showfiles.php?group_id=89339.<br />
Napríklad:<br />
:* fpc-2.0.4-0.i586.rpm<br />
:* fpcsrc-2.0.4-0.i386.rpm<br />
:* lazarus-0.9.22-0.i386.rpm<br><br />
a nainštalujte ich:<br />
:* rpm -Uvh fpc-2.0.4-0.i586.rpm<br />
:* rpm -Uvh fpcsrc-2.0.4-0.i386.rpm<br />
:* rpm -Uvh lazarus-0.9.22-0.i386.rpm<br><br />
<br />
Používatelia Debianu sa budú musieť uchýliť k použitiu alien (pozor, negeneruje fpc.cfg) alebo nainštalovať tarball.<br />
<br />
==== Zdrojové kódy FPC ====<br />
<br />
Od uvoľnenie verzie 2.0, FPC premigroval do Subversion (SVN). Momentálne neexistuje zrkadlo CVS, takže budete potrebovať na získanie zdrojových kódov FPC použiť SVN.<br />
<br />
===== Stiahnutie Dennej snímky zdrojových kódov Vývojového stromu (version 2.3.x) =====<br />
<br />
Môžete stiahnuť dnešné vývojové (v 2.3.x) zrdojové kódy v podobe komprimovanej snímky SVN úložiska zdrojových kódov: tieto snímky sú denne aktualizované a odrážajú stav úložiska zdrojových kódov. Súbory sú uchovávané na stránke s archívom SVN.<br />
<br />
Celý verejný archív zdrojových kódov verzie 2.3.x: [ftp://ftp.freepascal.org/pub/fpc/snapshot/v23/source/fpc.zip fpc.zip] (24 MB)<br />
<br />
===== Stiahnutie Dennej snímky zdrojových kódov Uvoľneného stromu (verzia 2.2.x) =====<br />
<br />
Môžete stiahnuť dnešné vývojové (v 2.2.x) zdrojové kódy, ktoré budú viesť k nasledujúcej stabilnej verzi v podobe komprimovanej snímky SVN úložiska zdrojových kódov: tieto snímky sú denne aktualizované a odrážajú stav úložiska zdrojových kódov. Súbory sú uchovávané na stránke s archívom SVN.<br />
<br />
Celý verejný archív verzie 2.2.x: [ftp://ftp.freepascal.org/pub/fpc/snapshot/v22/source/fpc.zip fpc.zip] (24 MB)<br />
<br />
<br />
===== Pripojenie k úložisku zdrojových kódov pomocou SVN =====<br />
<br />
Ako alternatíva k denným zip súborom zdrojových kódov SVN, je každému dostupné SVN úložisko, s prístupom len na čítanie. Čiže môžete priamo pristupovať ku kódu a budete mať k dispozícii skutočne aktuálne zdrojové kódy. Je to tiež metóda, ktorá vyžaduje menej šírky pásma, okrem prvotného stiahnutia (checkout v jazyku SVN).<br />
<br />
===== Vývojové snímky =====<br />
<br />
<br />
(Samozrejme potrebujete mať nainštalované SVN. [http://subversion.tigris.org/ Tu hľadajte] inštrukcie ako to urobiť.)<br />
<br />
Zmeňte adresár (cd) na rodičovský adresár Vašej vývojovej oblasti, napr.<br />
<br />
[]$ cd /home/username/FreePascal<br />
<br />
Pre získanie úplného úložiska zdrojového kódu, všetkých verejne dostupných modulov, zadajte<br />
<br />
[]$ svn checkout http://svn.freepascal.org/svn/fpc/trunk fpc<br />
<br />
Normálne stačí tento krok urobiť len raz.<br />
<br />
Pre aktualizáciu zdrojových kódov, stiahnutých podľa predchádzajúceho kroku (checkout), zadajte<br />
<br />
[]$svn update fpc<br />
<br />
<br />
===== Opravy pre 2.2.x =====<br />
<br />
Opravy potrebujú samostatný adresrá, vytvorte napríklad adresár 'fixes', vstúpte do neho a opakujte predchádzajúci príkaz checkout s URL http://svn.freepascal.org/svn/fpc/branches/fixes_2_2:<br />
<br />
[]$ cd mysvn/fixes<br />
[]$ svn checkout http://svn.freepascal.org/svn/fpc/branches/fixes_2_2 fpc<br />
<br />
a pre aktualizáciu:<br />
<br />
[]$ svn update fpc<br />
<br />
Zdrojové kódy dokumentácie sú v samostatnom úložisku, zvanom fpcdocs, takže príkaz pre jej získanie je<br />
<br />
[]$ svn checkout http://svn.freepascal.org/svn/fpcdocs/trunk fpcdocs<br />
<br />
Ak sa o subversion chcete naučiť viac, prečítajte si výbronú [http://svnbook.red-bean.com/ knihu o Subversion], ktorá je slobodne dostupná online v rôznych fomátoch.<br />
<br />
Pre nechápavých: Máte prístup len na čítanie, takže sa nepokúšajte odoslať (commit) hocičo :-)<br />
<br />
Ďalšie informácie hľadajte n awebovej stránke [http://www.freepascal.org/develop.html FreePascal].<br />
<br />
===Inštalácia Free Pascal vo Windows===<br />
<br />
====Binárne súbory FPC pre Windows====<br />
<br />
Najjednoduchším spôsobom ako získať fungujúcu inštaláciu FreePascal je stiahnuť si aktuálnu release binárnych súborov Lazarus pre Windows zo SourceForge.net – release obsahuje aktuálnu verziu prekladača FreePascal a knižnice FreePascal, ako aj Lazarus IDE. Ak však chcete inštalovať zo zdrojových súborov, čítajte ďalej!<br />
<br />
Môžete získať zipovaný inštalátor fpc 2.2.0 v sekcii sťahovanie Free Pascal http://www.freepascal.org/download.html, (potom zvoľte zrkadlo).<br />
<br />
Inštalácia so zdrojových kódov je obsahom nasledujúcej sekcie - nie je určená pre nováčikov, keďže vyžaduje aj spúšťanie prekladača.<br />
<br />
====Zdrojové kódy FPC pre Windows====<br />
<br />
<<<< Viz predchádzajúcu sekciu [[#Zdrojové kódy FPC|Zdrojové kódy FPC]] pre Linux, kde je popísané použitie SVN >>>><br />
<br />
Najjednoduchší spôsob ako získať zdrojové kódy FreePascal je pomocou CVS. Zdrojové kódy môžete tiež stiahnuť ako celý balíček – pozrite http://www.freepascal.org/develop.html, kde sú denné snímky stromu verzie 2.3.x.<br />
<br />
Zdrojové kódy FPC pomocou CVS<br />
<br />
Na vykonanie nasledujúcich krokov budete potrebovať klienta CVS, napr. [http://www.tortoisecvs.org/ TortoiseCVS] alebo [http://www.wincvs.org/ WinCVS]. Presné príkazy sa môžu medzi klientami meniť; nasledujúce sú pre použitie s klientom [https://ccvs.cvshome.org/files/documents/19/324/cvs-1-12-9.zip CVS home].<br />
<br />
Najprv si vytvorte adresár, do ktorého radi umiestnili zdrojové súbory. (napr. c:\source), potom do príkazového riadku zadajte tieto príkazy:<br />
C:\Source> svn co http://svn.freepascal.org/svn/svn/trunk fpc<br />
Typ: Pre stiahnutie/aktualizáciu posledných zmien stačí zadať<br />
<br />
C:\> cd Source\FPC<br />
C:\Source\FPC> svn up<br />
<br />
Pozrite si http://www.freepascal.org/down-win32.html Zoznam zrkadiel nájdete na http://www.freepascal.org/sdown.html. Stiahnite FreePascal ako jeden veľký súbor, rozbaľte ho a spusťte install.exe.<br />
<br />
Do systémovej premennej PATH pridajte adresár fpc:<br />
* Win98: Upravte autoexec.bat pridaním riadku: PATH=%PATH%;C:\pp\bin\bin\win32<br />
* WinXP/2k: Tento počítač (pravý klik) -> Vlastnosti -> Spresnenie (stránka) -> Premenné prostredia -> Systémové premenné -> Upravte "PATH" pridaním "C:\pp\bin\bin\win32".<br />
<br />
Potom reštartujte Windows.<br />
<br />
''ToDo: Explain how to download fpc sources and build the compiler''<br />
<br />
=== Inštalácia Free Pascal pod FreeBSD/auto ===<br />
<br />
Posledná kolekcia portov FreeBSD obsahuje stabilnú verziu 2.2.0 v ports/lang/fpc. Ale je roztrúsená do 57 (!) balíčkov a neinštaluje zdrojové kódy, tak je väčšinou lepšie nainštalovať ho manuálne (viz nižšie). Napriek tomu tu je postup pre inštaláciu portu.<br />
<br />
Toto musí byť urobené ako as root.<br />
<br />
[]# cd /usr/ports/lang/fpc && make install && make clean<br />
<br />
ďalšou možnosťou je použiť portinstall.<br />
<br />
[]# portinstall fpc<br />
<br />
Po nainštalovaní fpc skontrolujte či pracuje jednoduchým zadaním<br />
<br />
[]$ fpc<br />
<br />
===Inštalácia Free Pascalu pod BSD/manuálne===<br />
<br />
Všetko čo potrebujete sú:<br />
<br />
Súbor so všetkými zrojákmi prípadne dva (fpc a lazarus)<br />
<br />
1. napr. pre fpc ftp://ftp.freepascal.org/fpc/dist/Linux/separate/sources.tar najlepšie export (žiadne CVS/ adresáre). Tento súbor to nemá<br><br />
2. Denné zdrojáky Lazarus.<br />
* _hocaký_ štartovací prekladač od vydania 1.9) Verziu si môžete overiť pomocou príkazu "ppc386 -i". Ak je výstup 1.9.3 až 2.0.x tak je všetko vporiadku.<br />
* - závislosti. (pre FreeBSD je to gtk12, glib12 a gdk_pixbuf a ešte GNU make, iconv a gettext)<br />
<br />
Kompilácia FPC:<br />
<br />
1. (zožente) potrebné súbory (FPC zdrojáky, štartovací prekladač)<br />
2. (rozbalte) A potom od-tgz-ujte vo vašom pracovonom adresári,<br />
3. (skompilujte) choďte do work/fpc/ a spustite<br />
<br />
$MAKE all OPT='-gl -O3p3' PP=/cesta/k/štartovaciemukompileru-meno-ppc386<br />
(/cesta/k/.. môže byť vynechaná ak máte ppc386 v ceste(PATH))<br />
($MAKE je make v linuxe a gmake na BSD)<br />
<br />
4. (nainštalujte) vo work/fpc spusťte<br />
<br />
$MAKE install PP=compiler/ppc386 PREFIX=$THEPREFIX<br />
(THEPREFIX= je väčšinou /usr/lcoal, ale napr. na NetBSD je to /usr/pkg kvôli portom)<br />
Vytvorte symbolickú linku:<br />
ln -s $THEPREFIX/lib/fpc/1.0.8/ppc386 $THEPREFIX/bin/ppc386<br />
install sourceinstall PREFIX=$THEPREFIX<br />
<br />
5. (nastavťe) spustite compiler/utils/samplecfg $THEPREFIX/lib/fpc/1.9.3 $ETCDIR<br />
6. (nepovinne, testujte), presvečte sa či ppc386 -i dáva výstup, ináč musíte pridať $PREFIX/bin do vašej cesty. Skúsťe skompilovať program s parametrami -viwn, a pozrite či nepíše chyby.<br />
Poznámky:<br />
<br />
* Ak potrebujete fpcmake balíkové listy, musíte si ich sami vygenerovať alebo zohnať, v každom prípade spravte pokusnú inštaláciu do /tmp/pack a zistite či sa súbori nainštalovali pomocou find . >ll<br />
<br />
* $THEPREFIX a $ETCDIR by mali byť nastaviteľné uživateľom. Inak niesu možné lokálne inštalácie.<br />
<br />
* BSDHIER=1 pri všetkých príkazoch make núti hierarchické konvencie BSD.<br />
<br />
=== Inštalácia Free Pascalu pod Mac OS X ===<br />
<br />
Budete potrebovať Apple Developer tools, X11, and GTK 1.2:<br />
<br />
Developer-tools: sú zahrnuté na orginálnych inštalačných CD inštalácie OS X, alebo ich môžete stiahnuť z (nutná free registrácia) http://developer.apple.com/.<br />
<br />
Apple X11: Na novoinštalovanom systéme: zvoľte "Customize" v inštalačnom dialógu a zvoľte "X11".<br />
<br />
Na už nainštalovanom systéme: <br />
<br />
MacOSX 10.3: stiahnuť z http://www.apple.com/downloads/macosx/apple/x11formacosx.html<br />
<br />
MacOSX 10.4: nainštalovať X11 z DVD.<br />
<br />
GTK 1.2: Stiahnutie a správne nainštalovanie môže zabrať veľa času, preto využite dostupných správcov balíčkov. Jeden z nich je fink, ktorý môžete stiahnuť z http://fink.sourceforge.net/download/index.php?phpLang=en; a pokračovať podľa inštalačných pokynov.<br />
<br />
V termináli spusťte<br />
sudo /sw/bin/apt-get install gdk-pixbuf gtk+ gtk+-data gtk+-shlibs gtk-doc gtk-engines<br />
<br />
Aplikácie X11 je v /Applications/Utilities/X11. Môžete ju pretiahnuť do docku, aby ste ju mohli spúšťať jednym kliknutím.<br />
<br />
Tip: Väčšina programov X11, vrátane Lazarus, očakáva, že získa zameranie po kliknutí myšou do okna. Pod MacOSX je toto deaktivované, aktivovať ju môžte pre všetky aplikácie X11 zadaním v termináli:<br />
defaults write com.apple.x11 wm_click_through -bool true<br />
<br />
;Prekladač Free Pascal:<br />
Potom stiahnite a nainštalujte Prekladač Free Pascal Compiler (aspoň 2.2.0) z:<br />
: https://sourceforge.net/project/showfiles.php?group_id=89339<br />
<br />
Pri preklade GTK programov, musíte pridať do fpc.cfg dva riadky, ktoré umožnia používanie knižníc:<br />
-Fl/sw/lib<br />
-Fl/usr/X11R6/lib<br />
<br />
Pre Lazarus sú potrebné aj zdrojové kódy FPC:<br />
<br />
*nainštalujte SVN pre MacOS X: dobrou voľbou je balíček poskytnutý [http://www.codingmonkeys.de/mbo/ Martinom Ottom].<br />
<br />
Vytvorte adresár, kde chcete umiestniť zdrojové kódy. Túto úlohu nemusíte robiť ako root, môže to urobiť každý bežný používateľ. <br />
Najprv vytvorte adresár pre fpc <br />
: (napr. /Users/username/freepascal) <br />
potom otvorte terminál al urobte nsledujúce:<br />
[]$ svn co http://svn.freepascal.org/svn/fpc/trunk fpc<br />
Týmto vytvoríte adresár nazvaný 'fpc', ktorý môže byť neskôr použitý v IDE.<br />
Tit: Pre stiahnutie/aktualizáciou posledných zmien jednoducho spusťte<br />
[]$ cd /Users/username/freepascal/fpc<br />
[]$ svn up<br />
<br />
==Inštalácia Lazarus==<br />
<br />
===Inštalácia Lazarus pod Linuxom===<br />
<br />
==== Ubuntu / Debian ====<br />
<br />
Najjednoduchšia cesta pre získanie aktuálnej pracujúcej inštalácie Lazarus je stihnutie súborov .deb pre FreePascal a Lazarus z úložiska SourceForge.<br />
<br />
Experimentálne: [[How to setup a FPC and Lazarus Ubuntu repository/sk|Ako nastaviť úložisko FPC a Lazarus]]<br />
<br />
===== Jednoduché vytvorenie balíčkov deb =====<br />
<br />
Najjdenoduchšia cesta pre získanie aktuálnej funkčnej inštalácie Lazarus je stiahnuť a vybudovať svoje vlastné balíčky .deb podľa inštrukcií na [[How to setup a FPC and Lazarus Ubuntu repository/sk|Ako nastaviť úložisko FPC a Lazarus]]<br />
<br />
==== Inštalácia pomocou rpm ====<br />
Najľahší spôsob ako získať poslednú verziu Lazarusa je stiahnuť si RPM balíčky pre FreePascal a Lazarus z SourceForge stránky.<br />
<br />
Potrebujete stiahnuť vybranú verziu z:<br />
* prekladača (napr. fpc-1.9.5-041207.i386.rpm)<br />
* zdrojákov knižníc (napr. fpcsrc-1.9.5-041207.i386.rpm)<br />
* Lazarusa (napr. lazarus-0.9.2.4-fpc_1.9.5_041207.i386.rpm).<br />
<br />
Potom napíšete následovné príkazy (musíte mať práva root - použiťe su, alebo sudo)<br />
rpm -Uvh fpc-1.9.5-041207.i386.rpm<br />
rpm -Uvh fpcsrc-1.9.5-041207.i386.rpm<br />
rpm -Uvh lazarus-0.9.2.4-fpc_1.9.5_041207.i386.rpm<br />
<br />
Ak dávaťe prednosť ručnej inštalácie zo zdrojov, následujťe tieto inštrukcie. Pretože je celý lazarus nainštalovaný do jedného adresára, odinštalácia je veľmi jednoduchá a na inštaláciu nemusíte byť root. Môžete si stiahnuť tgz súbory fpc, fpcsrc a lazarus z downloads sekcie, alebo priamo cez CVS.<br />
<br />
;Sťahovanie lazarusa cez CVS: <br />
cvs umožňuje ľahký spôsob updatu pre vaše zdrojové kódy tým že sťahuje len zmenené súbory. Toto je odporúčaný spôsob ktorý vám ušetrí veľa času. Pripojenie na internet je nutné: Nemusíte byt root. Lazarus nepotrebuje špeciálne práva ani počas inštalácie ani za behu. Najprv pre Lazarus vytvorte adresár (napr. /home/username/freepascal) a potom spravte následovné:<br />
<br />
;pripojte sa na CVS server (poznámka: lazarus a freepascal používaju rovnaký server)<br />
[]$ export CVSROOT=:pserver:cvs@cvs.freepascal.org:/FPC/CVS<br />
[]$ cvs login<br />
heslo je 'cvs' bez ''. <br />
<br />
;stiahnite si lazarus zdrojáky:<br />
[]$ cvs -z3 co lazarus<br />
skompilujte lazarus:<br />
[]$ cd lazarus<br />
[]$ make (gmake on BSD)<br />
<br />
Ak bolo FPC nainštalované vporiadku, mala by kompilácia prebehnúť bez problémov. Ak nie, prečítajte si FAQ.<br />
<br />
;Spusťte lazarus<br />
[]$ ./lazarus<br />
<br />
IDE by sa malo spustiť. Ak ste spusťili lazarus v konzole, uvidíte pár poznámok ohladom chýbajúcich nastavení. Toto je normálne pri prvom štarte. IDE sa snaží automaticky naisť kde sú prekladač freepascal a jeho zdrojáky.<br />
<br />
;Skontrolujte cesty:<br />
: Použíte menu a choďte do<br />
:: Environment -> Environment Options -> Files<br />
<br />
'FPC Source directory' by mal ukazovať na miesto kde máte zdrojáky FPC. Tento adresár väčšinou končí s /fpc/ alebo /fpcsrc/ (napr. /usr/src/fpcsrc, alebo /home/username/freepascal/fpc) a obsahuje adresáre ako 'compiler', 'docs', 'fcl', 'rtl' a 'packages'.<br />
<br />
''Dorob: vysvetli ostatné cesty''<br />
<br />
;Rada:<br />
Aby ste updatly lazarus stačí<br />
[]$ cd /home/username/freepascal/lazarus<br />
[]$ cvs -z3 update -dP<br />
[]$ make clean all (gmake na BSD)<br />
Toto skompiluje lazarus a vytvorí IDE bez balíkov. Aby sťe napojili nainštalované balíky spravte následovné:<br />
[]$ make idepkg<br />
<br />
====Inštalácia Lazarusa pod Debian GNU/Linux====<br />
<br />
Existujú už predpripravené balíky pre Debian na stiahnutie. Uistite sa, že ste si prečítali usr/share/doc/lazarus/README.Debian predtým než začnete. Návrhy, nápady a sťažnosti sú výtané; prośim pošlite svoje komentáre Carlosovi Laviolovi <claviola@debian.org>.<br />
<br />
====Ďaľší (ľahší?) spôsob inštalácie Lazarusa pod Debianom====<br />
Pridal [[User:Kirkpatc]].<br />
<br />
;Jednoduchá inštalácia lazarusa pod Debianom<br />
(predpokladá sa čerstvá inštalácia Debianu bez načítaných vývojárskych knižníc)<br />
<br />
Zo stránky sourceforge si stiahnite posledné fpc, fpclib a lazarus vydania; následujte linky z http://lazarus.freepascal.org, kliknite na "downloads" nalavo, potom kliknite na "binaries" potom "linux" a potom "Current Lazarus RPM". Toto vás donesie až na<br />
: http://sourceforge.net/project/showfiles.php?group_id=89339<br />
Potom stiahnite následovné súbory (alebo novšie verzie ak sa dá)<br />
* fpc-1.9.5-041001.i386.rpm<br />
* fpcsrc-1.9.5-041001.i386.rpm<br />
* lazarus-0.9.2.2-fpc_1.9.5_041001.i386.rpm<br />
choďte do adresára kam ste súbory uložili a spravte sa root-om(su) a napíšte:<br />
<br />
alien fpc* //toto skonvertuje aj fpc aj fpcsrc do debian formátu<br />
alien laz*<br />
potom použite kpackage, alebo podobný nástroj na nainštalovanie fpc, fpcsrc a lazarus **.rpm.deb súborov.<br />
<br />
Potrebujete vytvoriť konfiguračný súbor, ktorý sa bude nachádzať v /etc/fpc.cfg. Stále ako root choďte do hlavného adresára fpc /usr/lib/fpc/1.9.5 a napíšte<br />
sh ./samplecfg /usr/lib/fpc/1.9.5 /etc<br />
Overte si obsah vášho nového konfiguračného súboru (cat /etc/fpc.cfg) a spravte zmeny ktoré potrebujete použitím vi alebo iného textového editora.<br />
<br />
Potrebujete nainštalovať vývojové balíky GTK a pixbuf takže<br />
apt-get install libgtk2.0-dev<br />
apt-get install libgdk-pixbuf-dev<br />
A potom môžte začať programovať!<br />
<br />
===Inštalácia Lazarusa pod Mac OS X===<br />
<br />
Je to vpodstate to isté ako pod Linuxom. Jedine musíte nainštalovať apple-developer tools a X11.<br />
<br />
===Inštalácia Lazarus vo Windows===<br />
<br />
Aktuálna release binárnych balíčkov Lazarus pre Windows sa inštaluje veľmi jednoducho. Binárny balíček pre Linux i Windows je dostupný z [http://sourceforge.net/project/showfiles.php?group_id=89339 SourceForge.net]<br />
<br />
Stiahnite poslednú verziu (momentálne (currently Lazarus-0.9.2.4-20041210-win32.exe) a spusťte aplikáciu. Dostanete sa do typickej inštalácie Windows, v ktorej sú prekladač FreePascal a zdrojové knižnice nainštalované do rovnakej adresárovej štruktúry ako Lazarus a môžete spustiť IDE a pracovať bez väčších problémov, za predpokladu, že máte odinštalovanú predchádzajúcu verziu Lazarus a/alebo FreePascal (väčšinou v adresári C:\pp).<br />
<br />
Lazarus Snapshot pre Windows nájdete aj na: http://www.ca.freepascal.org/Lazarus/<br />
<br />
====Inštalácia so zdrojových súborov====<br />
<br />
Ak dávate prednosť inštalácii zo zdrojových kódov, postupujte podľa nasledujúcich inštrukcií<br />
(Vďaka, Joe, za tento popis Krok za krokom)<br />
<br />
* potrebujete stiahnuť zdrojové kódy Lazarus z ftp://ftp.freepascal.org/pub/fpc/snapshot/lazarus/lazarus.zip<br />
<br />
''ToDo: pôvodná adresa ftp://ftp.freepascal.org/pub/fpc/source/lazarus.zip nefunguje, ale neviem či ide o to isté...''<br />
<br />
* archív rozbaľte, napr. do c:\Lazarus. Potrebujete mať nainštalovaný aspoň FreePascal-1.9.3, ktorým preložíte zdrojové kódy a Lazarus.exe pracuje. Cesta k môjmu (pôv. autorora) FreePascal je c:\pp\bin\win32. V tomto adresári nájdete viacero spustiteľných súborov (make, grep, ppc386 atď.).<br />
<br />
* Otvorte konzolu (príkazový riadok) a zadajte:<br />
cd c:\lazarus<br />
set path=c:\pp\bin\win32;c:\lazarus //samozrejme zmeňte na svoju cestu<br />
windres -i lazarus.rc -o lazarus.res<br />
make<br />
<br />
Ak všetko prebehne ako má, napíšte Lazarus.exe. Editor zdrojového kódu, dialógy a editor vlastností pracuje, ale nie perfektne... Pozrite sa a uvidíte.<br />
<br />
Môžete tiež preložiť príklady:<br />
cd examples<br />
make<br />
<br />
Ak rozbalíte Lazarus na iný disk, napr.: d:\Lazarus. Môže sa stať, že budete potrebovať utilitu gnu na jeho vytvorenie, ak ju máte, zadajte jej cestu do premennej Path, ale jednoduchšie je nevyberať iný disk.<br />
<br />
To je všetko.<br />
<br />
<br />
<br />
===Inštalácia Lazarusa pod BSD===<br />
<br />
Prośim napíšte ma niekto!<br />
<br />
==Pôvodní spolupracovníci a zmeny==<br />
This page has been converted from the epikwiki [http://lazarus-ccr.sourceforge.net/index.php?wiki=InstallingLazarus version].<br />
* Initially imported and formatted. [[User:Tom | VlxAdmin]] 9/22/2003<br />
* Changed Joe's part for Windows to require fpc 1.0.10. [[User:Vincent | Vincent]] 9/25/2003<br />
* Updated "What is required for lazarus". AndrewJohnson 10/1/2003<br />
* Finished formatted the InstallingLazarus page [[User:Tom | VlxAdmin]] 2/22/2004<br />
* Posted some notes about Installing FPC and Lazarus: mostly reflecting experiences in trying to get the PATHS right in Linux. 3/11/2004 [[User:Kirkpatc]]<br />
* Copied the contents of my note into the main InstallingLazarus section, edited it slightly. I don't know how to remove the original note. 3/12/2004 [[User:Kirkpatc]]<br />
* Removed the original note. Tidied the wiki and formatting a bit. [[User:Tom | VlxAdmin]]<br />
* Corrected a couple of typos - 3/12/2004 [[User:Kirkpatc]]<br />
* Added link for daily snapshot deb packages - 3/27/2004 [[User:Vincent | Vincent]]<br />
* Fixed links in GettingLazarus (downloading binaries) and several other pages. 22 July 2004 [[User:Kirkpatc]]<br />
* Added link for lazarus deb packages - 19 August 2004 VincentSnijders<br />
* Added a short note on installing in Debian - 23 Nov 2004 [[User:Kirkpatc]]<br />
* Considerable re-write and re-organization of installation section - 11 Dec 2004 [[User:Kirkpatc]]</div>Slavkohttps://wiki.freepascal.org/index.php?title=Creating_A_Patch/sk&diff=26282Creating A Patch/sk2008-01-14T15:16:40Z<p>Slavko: úprava formátu</p>
<hr />
<div>{{Creating A Patch}}<br />
==Pokyny==<br />
Predpokladom je, že máte Lazarusa zo SVN. [[Getting Lazarus#Via SVN| Getting Lazarus Via SVN]]<br />
<br />
Otvorte príkazový riadok, alebo terminál a vojdiťe do adresára kde máte zdrojové kódy Lazarusu.<br />
<br />
'''Inštrukcie pre Windows:'''<br />
<br />
Budeme predpokladať, že zdrojové kódy sa nachádzajú v C:\lazarus<br />
<br />
# Otvorte príkazový riadok<br />
# c: {stlač enter}<br />
# cd \lazarus {stlač enter}<br />
# svn diff > mypatch.dif {stlač enter}<br />
<br />
'''Inštrukcie pre Linux/BSD atď:'''<br />
<br />
Budeme predpokladať, že zdrojové kódy sa nachádzajú v $HOME/lazarus<br />
<br />
# Otvorte svoj oblúbený terminálový program<br />
# cd $HOME {stlač enter}<br />
# cd lazarus {stlač enter}<br />
# svn diff > mypatch.diff {stlač enter}<br />
<br />
<br />
''Poznámka: Ja si ten súbor ešte rád kontrolujem aby som sa uistil že tam je len čo tam má byť.''<br />
<br />
Odporúčaný spôsob zasielania súboru je cez [http://www.lazarus.freepascal.org/mantis/ bug tracker]. Ak pre problém, ktorý Váš patch opravuje existuje hlásenie, použite ho, v opačnom prípade vytvorte nové hlásenie o chybe. Súbor s patchom pripojte do hlásenia.<br />
<br />
Druhou možnostou je spakovanie súboru pomocou zip, alebo gzip a poslanie na Lazarus mailing list (40 kB limit), alebo na mail pre patche [mailto:patch@lazarus.dommelstein.net patch@lazarus.dommelstein.net]. <br />
<br />
Eto vsjo!<br />
<br />
== Problémy ==<br />
Toto sa väčšinou týka Wokien, ale môže sa to objaviť aj na iných platformách.<br />
<br />
'''Objaví sa chyba "svn command not found", alebo niečo podobné.'''<br />
Pravdepodobne nemáte svn.exe vo svojej ceste (PATH). Následné kroky vám pomôžu tento problém odstrániť.<br />
<br />
# Nájdite svn.exe pomocou Nájdi śubory a zložky v hlavnom menu.<br />
# Po tom, čo ste našli svn.exe budete potrebovať tento adresár pridať do svojej cesty (PATH).<br />
Ako príklad: z príkazového riadka napíšte: <br />
set PATH=%PATH%;"C:\Program Files\TortoiseSVN\"<br />
<br />
''Poznámka: Váš adresár, ktorý obsahuje svn.exe nemusí byť taký istý ako je uvedený v tejto ukážke.''<br />
<br />
<br />
Následovné je dobrovolné:<br />
<br />
'''Aby to bolo napevno'''<br />
<br />
Pre Windows98 a vyžšie môžete pridať tento riadok (alebo podobný) do C:\autoexec.bat. <br />
<br />
Pre Windows2000 a vyžšie môžete nastaviť vašu cestu (PATH) cez:<br />
<br />
# Pravým kliknite na "Tento Počítač"<br />
# Vyberte "Vlastnosti"<br />
# Vyberte záložku "Pokročilé".<br />
# Kliknite na "Premenné prostredia".<br />
# Nájdite riadok s "Path" v "Systémových premenných" a pridajte: ;"C:\Program Files\TortoiseSVN\" na koniec.<br />
<br />
''Poznámka: Váš adresár, ktorý obsahuje svn.exe nemusí byť taký istý ako je uvedený v tejto ukážke.''<br />
<br />
==Aplikovanie patchu==<br />
Aplikovanie patchu je jednoduché. Patch môžete otestovať prepínačom --dry-run napr:<br />
<br />
patch --dry-run < mypatch.diff<br />
<br />
Výstup programu buďe rovnaký ako samotné patchovanie, rozdiel je v tom že sa nezmenil cielový súbor. Veľmi užitočná funkčnosť na otestovnie správnosti patchu.<br />
<br />
Aby ste patch naozaj aplikovali spravte: <br />
<br />
patch < mypatch.diff<br />
<br />
Alebo pre opravenie oddelovačov:<br />
<br />
patch -p0 < mypatch.diff</div>Slavkohttps://wiki.freepascal.org/index.php?title=Lazarus_For_Delphi_Users/sk&diff=26255Lazarus For Delphi Users/sk2008-01-11T17:43:50Z<p>Slavko: úprava formátovania</p>
<hr />
<div>{{Lazarus For Delphi Users}}<br />
<br />
Tento článok je pre tých, ktorí sú zainteresovaní v Lazarus a už poznajú Delphi. Popisuje rozdiely medzi týmito dvomi prostrediami. <br />
<br />
==Delphi -> Lazarus==<br />
Lazarus je Rapid Application Development (RAD) nástroj ako Delphi. To znamená, že prichádza s knižnicou vizuálnych komponentov a IDE. Knižnica komponentov Lazarus (LCL) sa veľmi podobá Delphi VCL. Väčšina jednotiek, tried a vlastností má rovnaké meno a funkciu, čím je prechod jednoduchý. Ale Lazarus nie je 'open source Delphi klon', tak neočakávajte 100% kompatibilitu.<br />
<br />
===Najväčšie rozdiely===<br />
Lazarus je úplný open source, je napísaný bez závislosti na platforme a používa silný prekladač FreePascal (FPC). FPC beží na viac ako 15 platformách, ale nie všetky balíčky a knižnice sú prenesené, tak Lazarus práve beží pod Linux, Free/Open/NetBSD, MacOSX a win32.<br />
<br />
Lazarus zatiaľ nie je kompletný, ako aj tento text. Stále hľadáme nových vývojárov, porterov, pisateľov dokumentácie, ... .<br />
<br />
==Delphi IDE -> Lazarus IDE==<br />
===Projekty===<br />
Základným súborom aplikácie Delphi je súbor .dpr. Základným súborom projektu Lazarus je súbor .lpi (Lazarus Project Information). Súbor .dpr je základný zdrojový kód programu a Delphi IDE v ňom uchováva niektoré informácie o direktívach prekladača a jednotkách. Aplikácia Lazarus má tiež súbor .lpr, ktorý je súborom so základným zdrojovým kódom, ale všetky ostatné informácie sú uchovávané v súbore .lpi. Teda, dôležitým súborom je súbor .lpi.<br />
<br />
Jedno dôležité pravidlo: '''Vždy existuje projekt!!!'''<br />
<br />
Jediný spôsob ako zatvoriť projekt je skončiť Lazarus alebo otvoriť iný projekt. To je preto, že projekt Lazarus je tiež "session". To znamená, že aktuálne nastavenia editora sú uchovávané v súbore .lpi a sú obnovené, keď otvoríte projekt. Napríklad: ladíte aplikáciu, nastavíte veľa ladiacich bodov a záložiek. Môžete projekt uložiť a zatvoriť Lazarus alebo otvoriť iný, ale keď znova otvoríte pôvodný, dokonca i na inom počítači, všetky vaše ladiace body, záložky, otvorené súbory, pozície kurzora, histórie skokov, ... sú obnovené.<br />
<br />
===Editor zdrojového kódu===<br />
(Source Editor)<br />
Takmer všetky klávesy a klávesové skratky môžu byť nastavené v Environment->Editor options->Key mappings<br />
<br />
IDE Lazarus má veľa nástrojov pre zdrojový kód. Mnohé z nich sú veľmi podobné tým v Delphi. Ale je tu jeden veľký rozdiel: Lazarus nepoužíva prekladač na získanie informácií o kóde, ale analyzuje priamo zdrojový kód, čo má veľa výhod:<br />
<br />
: Editor zdrojového kódu pracuje s komentármi. V Delphi sú komentáre len medzerou v kóde, funkcie kódu tu nepracujú a pri automatickom vložení kódu, sú vaše komentáre posunuté. Pod Lazarus môžete hľadať deklarácie dokonca v kóde komentára. Aj keď toto nie je úplne spoľahlivé, často to pracuje. A keď vložíte nový kód, používa IDE nejakú heuristiku na uchovanie komentára a kódu spolu. Napríklad: nebude rozdelený riadok "c: char; // comment".<br />
<br />
Dokončovanie kódu Delphi (Ctrl+Space) je pod Lazarus nazvané '''Identifier Completion'''. Termín Lazarus '''Code Completion''' je funkcia, ktorá kombinuje '''Automatic Class Completion''' (rovnaká ako v Delphi), '''Local Variable Completion''' a '''Event Assignment Completion'''. Tieto všetky sú vyvolané pomocou Ctrl+Shift+C a IDE určuje podľa pozície kurzora, ktorá funkcia bude použitá.<br />
<br />
====Dokončovanie lokálnych premenných====<br />
(Local Variable Completion)<br />
Predstavte si, že ste práve vytvorili novú metódu a napísali príkaz "i:=3;"<br />
<pascal>procedure<br />
TForm1.DoSomething; <br />
begin<br />
i := 3; <br />
end;</pascal><br />
<br />
Umiestnite kurzor nad identifikátor "i" a stlačte Ctrl+Shift+C, čím získate:<br />
<pascal>procedure<br />
TForm1.DoSomething; <br />
var<br />
i: Integer; <br />
begin<br />
i:= 3; <br />
end;</pascal><br />
<br />
====Dokončovanie priradenia udalostí====<br />
(Event Assignment Completion)<br />
Príjemná funkcia Inšpektora objektov je automatické vytváranie metód. To isté môžete urobiť v editore zdrojového kódu.<br />
Napríklad:<br />
: Button1.OnClick:=<br />
Umiestnite kurzor za operátor priradenia ":=" a stlačte Ctrl+Shift+C.<br />
<br />
====Dokončovanie slov====<br />
(Word Completion Ctrl+W)<br />
Táto funkcia je odstupná po stlačení Ctrl+W. Pracuje podobne ako "Identifier Completion", ale nepracuje len s identifikátormi Pascalu, ale so všetkými slovami. Dovolí vám vybrať zo všetkých slov zo všetkých otvorených súborov začínajúcich rovnakými písmenami.<br />
<br />
====Include súborov====<br />
Delphi túto podporu nemá a tak ste pravdepodobne veľa takýchto súborov nevytvorili. Ale include súbory majú veľkú výhodu: Dovoľujú písanie na platforme (ne)závislý kód bez komplikovanosti vášho kódu s direktívami IFDEF.<br />
<br />
Napríklad: Method jumping, Class Completion, Find declaration, .. všetky pracujú s include súbormi.<br />
<br />
Pre nastavenie dokončovania kódu je k dispozícii veľa nastavení.<br />
<br />
===Designer===<br />
- Guidelines<br />
<br />
====Object Inspector====<br />
Ako v IDE Delphi aj v IDE Lazarus je Inšpektor objektov použitý na úpravu vlastností komponentov, priradenie udalostí atď. Nasledujú niektoré malé rozdiely, na ktoré treba pri použití pamätať:<br />
# Počnúc Delphi 5, je Object Treeview, ktorý môže byť použitý na navigáciu a výber objektov podľa ich hierarchie, ako doplnok tradičného rozbaľovacieho zoznamu v Inšpektore objektov. V Lazarus je toto súčasťou Inšpektora objektov a jeho použitím namiesto predvoleného rozbaľovacieho zoznamu môžete vybrať jeho ne/použitie pomocou kontextového menu "Show Component Tree" <br />
# V Delphi dvojité kliknutie na prázdnu udalosť ju automaticky vytvorí a otvorí Editor zdrojového kódu na jej pozícii, v Lazarus je tlačítko napravo od rozbaľovacieho zoznamu, ktoré vykoná to isté. <br />
# V Delphi musíte ručne zmazať meno udalosti v políčku, aby ste odstránili priradenie, v Lazarus zvoľte v zozname "(None)".<br />
# Podobne ako pri udalostiach, dvojitým kliknutím na regulárne vlastnosti (napr. Boolean) nezmení ich hodnotu, ale musíte ju zvoliť zo zoznamu a na otvorenie ich predvoleného editora, musíte kliknúť na tlačítko vpravo od rozbaľovacieho zoznamu.<br />
<br />
====Balíčky====<br />
V Lazarus nemôžete inštalovať balíčky Delphi, pretože potrebujú čary prekladača Delphi. Preto pre Lazarus potrebujete špeciálne vytvorené balíčky.<br />
<br />
Vytvorte nový balíček, uložte ho v zdrojovom adresári balíčkov (bežne rovnaký adresár súboru .dpk), pridajte LCL ako vyžadovaný balíček a nakoniec pridajte súbory .pas. Teraz ho môžete nainštalovať alebo použiť vo svojom projekte. Medzi balíčkami Lazarus a Delphi sú rozdiely, prečítajte si prosím docs/Packages.txt v zdrojovom kóde Lazarus.<br />
- viď docs/Packages.txt v zdrojovom kóde Lazarus.<br />
<br />
===VCL -> LCL===<br />
Hoci obe, VCL aj LCL, slúžia rovnakému cieľu - Objektovo orientovanej hierarchii komponentov hlavnému motoru pre rýchly vývoj aplikácií (RAD), nie sú identické. Napríklad, kým VCL poskytuje veľa nevizuálnych komponentov, LCL sa pokúša poskytovať len vizuálne, kým väčšina nevizuálnych komponentov (ako db access) sú poskytované pomocou FCL, zahrnutej vo FreePascal.<br />
<br />
Takže veľa prvkov VCL nemusí existovať v LCL, alebo naopak, alebo dokonca keď prvky existujú v oboch, nie sú to klony a musíte urobiť pri prenose zmeny v aplikácii, komponentoch a prvkoch.<br />
<br />
Nasledujúci text sa pokúša poskytnúť čo najúplnejší popis hlavných rozdielov a nekompatibility medzi nimi, pre užívateľov Delphi. Popisuje najmä rozdiely VCL v D4, ale i D5, D6 alebo D7; s aktuálnou LCL, ako je v CVS. Takže nemusí byť vždy presne k verzii, ktorú používate alebo úplne súhlasiť s aktuálnym LCL, ktorý máte. Ak uvidíte rozdiely medzi nasledujúcim textom a LCL ako je v CVS, alebo svojim Delphi kľudne sa pripojte a zmeňte to tak, aby ste prispeli k úplnosti pre všetkých ľudí.<br />
<br />
====TControl.Font/TControl.ParentFont====<br />
Vo VCL je pre prvky úplne bežné použiť presné meno fontu a vlastností fontu ako bold a italics a očakávanie tejto hodnoty bude vždy nasledovať. Ďalej je poskytnutá vlastnosť TControl.ParentFont, ktorá zaisťuje, že prvok sa bude vždy riadiť svojim rodičovským fontom. Opäť, implicitná domnienka je, že tieto hodnoty budú vždy nasledované, dokonca nedbajúc nastavenia Windows Apearance. <br />
<br />
Toto nie je vždy pravda v LCL, ani byť nemôže. LCL je cross-platform/cross-interface od začiatku preferuje vyvážené nastavenie a bude sa vždy pokúšať nastaviť Desktop/Toolkit Apearance alebo nastavenú Tému na všetkých nástrojoch. Napríklad, ak používate rozhranie GTK a téma GTK poskytuje konkrétny font pre tlačítka, potom sa tlačítka LCL budú vždy pokúšať použiť tento font.<br />
<br />
To znamená, že väčšina prvkov LCL nemá rovnakú úroveň návrhu prvku, ktorá je často predpokladaná vo VCL, skôr len tie vlastné prvky, ktoré sú kreslené Canvas miesto pridelené rozhraním môžu byť modifikované týmto spôsobom, nedbajúcim na použité rozhranie.<br />
<br />
Ak je napríklad potrebný Label s fontom bold/special color, musíte použiť TStaticText, keďže TLabel je špecifický prvok rozhrania a všetky rozhrania sú poskytnuté v pôvodnej verzii a mnoho z nich bude mať predvolené nastavenia, ktoré budú použité.<br />
<br />
==== Riadenie Dragging/Docking ====<br />
Vo VCL väčšina (Win) prvkov implementuje metódy a spätné funkcie pre obsluhovanie preťahovania a dokovania prvkov, napríklad preťahovanie prvku z jedného panela a jeho dokovanie do iného panely v dobe behu programu.<br />
<br />
Táto funkcia nie je teraz implementovaná/dokončená v LCL, hoci teraz je v počiatočnom štádiu plánovania a bude eventuálne podporovať nejakú úroveň kompatibility tohto typu správania, ak nie dokonca presne rovnaké.<br />
<br />
Toto aktuálne znamená, že prvky nemôžu dediť/používať nasledujúce funkcie, procedúry, vlastnosti a udalosti TControl:<br />
<br />
<delphi>protected<br />
function GetDockEdge(MousePos: TPoint): TAlign; <br />
function GetDragImages: TDragImageList; <br />
function GetFloating: Boolean; <br />
function GetFloatingDockSiteClass: TWinControlClass; <br />
procedure DoEndDrag(Target:TObject); X, Y: Integer); <br />
procedure DockTrackNoTarget(Source: TDragDockObject; X, Y: Integer); <br />
procedure DoEndDock(Target: TObject; X, Y: Integer); <br />
procedure DoDock(NewDockSite: TWinControl; var ARect: TRect); <br />
procedure DoStartDock(var DragObject: TDragObject); <br />
procedure DragCanceled; <br />
procedure DragOver(Source: TObject; X, Y: Integer; State: TDragState; <br />
var Accept: Boolean); <br />
procedure DoEndDrag(Target: TObject; X, Y: Integer); <br />
procedure DoStartDrag(var DragObject: TDragObject); <br />
procedure DrawDragDockImage(DragDockObject: TDragDockObject); <br />
procedure EraseDragDockImage(DragDockObject: TDragDockObject); <br />
procedure PositionDockRect(DragDockObject: TDragDockObject); <br />
procedure SetDragMode(Value: TDragMode); <br />
property DragKind: TDragKind; <br />
property DragCursor: TCursor; <br />
property DragMode: TDragMode; <br />
property OnDragDrop: TDragDropEvent; <br />
property OnDragOver: TDragOverEvent; <br />
property OnEndDock: TEndDragEvent; <br />
property OnEndDrag: TEndDragEvent; <br />
property OnStartDock: TStartDockEvent; <br />
property OnStartDrag: TStartDragEvent; <br />
public <br />
function Dragging: Boolean; <br />
function ManualDock(NewDockSite: TWinControl; DropControl: TControl; <br />
ControlSide: TAlign): Boolean; <br />
function ManualFloat(ScreenPos: TRect): Boolean; <br />
function ReplaceDockedControl(Control: TControl; NewDockSite: TWinControl; <br />
DropControl: TControl; ControlSide: TAlign): Boolean; <br />
procedure BeginDrag(Immediate: Boolean; Threshold: Integer); <br />
procedure Dock(NewDockSite: TWinControl; ARect: TRect); <br />
procedure DragDrop(Source: TObject; X, Y: Integer); <br />
procedure EndDrag(Drop: Boolean); <br />
property DockOrientation: TDockOrientation; <br />
property Floating: Boolean; <br />
property FloatingDockSiteClass: TWinControlClass; <br />
property HostDockSite: TWinControl; <br />
property LRDockWidth: Integer; <br />
property TBDockHeight: Integer; <br />
property UndockHeight: Integer; <br />
property UndockWidth: Integer;</delphi><br />
<br />
a že nasledujúce triedy neexistujú alebo sú nepoužiteľné:<br />
<br />
<delphi>TDragImageList = class (TCustomImageList) <br />
TDockZone = class<br />
TDockTree = class (TInterfacedObject, IDockManager) <br />
TDragObject = class (TObject) <br />
TBaseDragControlObject = class (TDragObject) <br />
TDragControlObject = class (TBaseDragControlObject) <br />
TDragDockObject = class (TBaseDragControlObject)</delphi><br />
<br />
a že nasledujúce funkcie sú tiež neexistujúce/nepoužiteľné:<br />
<br />
<delphi>function FindDragTarget(const Pos: TPoint; AllowDisabled: Boolean) : TControl; <br />
procedure CancelDrag; <br />
function IsDragObject(sender: TObject): Boolean;</delphi><br />
<br />
====TEdit/TCustomEdit====<br />
Prvky Edit, kým základné funkcie sú v LCL rovnaké ako vo VCL, iné treba pri konverzii robiť opatrne:<br />
# kvôli obmedzeniam rozhraní, TEdit.PasswordChar zatiaľ nepracuje vo všetkých rozhraniach (neskôr možno), namiesto toho použite TCustomEdit.EchoMode emPassword v udalosti na skrytie textu. <br />
# Udalosti OnDrag/Dock zatiaľ nie sú implementované. Viz [[#Riadenie Dragging/Docking|Riadenie Dragging/Docking]].<br />
# Vlastnosti Font sú, kvôli správaniu rozhrania, zvyčajne ignorované. Viz [[#TControl.Font/TControl.ParentFont|TControl.Font/TControl.ParentFont]]<br />
<br />
===TSplitter -> TPairSplitter===<br />
'''Please Improve Me'''<br />
<br />
V LCL existuje prvok TSplitter, tak ho netreba konvertovať, napriek tomu ho chcem trochu vysvetliť:<br />
<br />
Vo VCL, "Splitting" prvkov, čo je ošetrením, ktoré umožňuje preťahovanie medzi dvomi komponentmi na získanie viac/menej miesta pre jeden na úkor ostatných, je urobený pomocou TSplitter. Často to môžete vidieť, napríklad v IDE Delphi medzi dokovaným Code Explorer a Source Viewer. <br />
<br />
LCL poskytuje svoj vlastný prvok, nazvaný TPairSplitter, ktorý obsluhuje rovnakú úlohu, avšak nie je kompatibilný, tak "skúšanie" preruší VCL kód alebo bude potrebný Delphi DFM pri prenose kódu.<br />
<br />
;V čom presne sú rozdiely?<br />
Najväčšie rozdiely sú, že VCL TSplitter nemá potomkov, namiesto toho ho umiestňujete medzi dva prvky, ktoré sú správne usporiadané a dovoľuje meniť ich veľkosť za behu programu, nedbajúc na vlastnú veľkosť. Prvky musia byť správne usporiadané, napríklad Panel a Splitter s Aligned Left a druhý Panel Aligned Client. Za behu programu môžete zmeniť rozloženie panelov pomocou preťahovania ošetreného pomocou prvku Splitter.<br />
<br />
V LCL je však TPairSplitter špeciálnym typom prvku s dvomi panelmi a môže byť užitočný len ak prvky na presúvanie sú na týchto paneloch, ale posúvanie bude jednako vykonané medzi týmito panelmi, i keď na nich nebude nič. Ako v predchádzajúcom príklade, potrebujete formulár s TPairSplitter Aligned Client a Panel Aligned Client na jeho ľavej strane a Panel Aligned Client na jeho pravej strane.<br />
<br />
Iným dôležitým rozdielom je, že vo VCL, keďže TSplitter je svoj vlastný TControl, tak jeho pozícia pri zmene veľkosti je uchovávaná relatívne k ostatným prvkom, tak napríklad klientský panel sa bude zväčšovať, kým ostatné panely nie, tým je pozícia rozdelenia relatívna k zarovnaniu rozdeľovaných prvkov.<br />
<br />
V LCL sú bočné panely samostatné, potom TPairSplitter má vlastnosť Position, ktorá je absolútne relatívna k vrcholu Top alebo Left. Tak pri zmene veľkosti aktuálna sa pozícia nemení podľa obsahu, tak musí byť nastavené spätné volanie na zaistenie uchovania pomeru, ak je to dôležité.<br />
<br />
Napríklad, ak pravá strana vertikálneho rozdelenia musí mať správanie ako alClient, potrebujete zmeniť spätným volaním veľkosť formulára, napríklad takto:<br />
<br />
PairSplitter.Position := PairSplitter.Width - PairSplitter.Position; <br />
<br />
;Teda ako môžem konvertovať existujúci kód používajúci TSplitter na TPairSplitter?<br />
Ak sú splitter a prvky vytvorené vo vnútri aktuálnej funkcie (ako OnCreate formulára), konverzia nebude zložitá, najprv zreorganizujeme kód na vytvorenie prvkov v poradí novej hierarchie a nastavíme rodičov podriadených prvkov pre rozdelenie na ľavý/horný a pravý/dolný podiel prvku PairSplitter. Napríklad:<br />
<br />
{| class="code"<br />
|- <br />
| class="header" | '''VCL''' || class="header" | '''LCL'''<br />
|- class="code"<br />
| class="code" |<br />
<delphi>var <br />
BottomPanel: TPanel;<br />
VerticalSplitter: TSplitter;<br />
LeftPanel: TPanel;<br />
HorizontalSplitter: TSplitter;<br />
MainPanel: TPanel;<br />
<br />
begin<br />
BottomPanel:= TPanel.Create(Self);<br />
with (BottomPanel) do<br />
begin<br />
Parent:= Self;<br />
Height:= 75;<br />
Align:= alBottom;<br />
end;<br />
<br />
VerticalSplitter:= TSplitter.Create(Self);<br />
with (VerticalSplitter) do<br />
begin<br />
Parent:= Self;<br />
Align:= alBottom;<br />
end;<br />
<br />
HorizontalSplitter:= TSplitter.Create(Self);<br />
with (HorizontalSplitter) do<br />
begin<br />
Parent:= Self;<br />
align:= alLeft;<br />
end;<br />
<br />
LeftPanel:= TPanel.Create(Self);<br />
with (LeftPanel) do<br />
begin<br />
Parent:= Self;<br />
Width:= 125;<br />
Align:= alLeft;<br />
end;<br />
<br />
MainPanel:= TPanel.Create(Self);<br />
with (MainPanel) do<br />
begin<br />
Parent:= Self;<br />
Align:= alClient;<br />
Caption:= 'Hello';<br />
end;<br />
end;</delphi><br />
| class="code" | <br />
<delphi>var<br />
BottomPanel: TPanel;<br />
VerticalSplitter: TPairSplitter;<br />
LeftPanel: TPanel;<br />
HorizontalSplitter: TPairSplitter;<br />
MainPanel: TPanel;<br />
<br />
begin<br />
VerticalSplitter:= TPairSplitter.Create(Self);<br />
with (VerticalSplitter) do<br />
begin<br />
Parent:= Self;<br />
Align:= alClient;<br />
Width:= Self.Width;<br />
Height:= Self.Height;<br />
SplitterType:= pstVertical;<br />
Position:= Height - 75;<br />
Sides[0].Width:= Width;<br />
Sides[0].Height:= Position;<br />
end;<br />
<br />
HorizontalSplitter:= TPairSplitter.Create(Self);<br />
with (HorizontalSplitter) do<br />
begin<br />
Parent:= VerticalSplitter.Sides[0];<br />
Width:= Self.Width;<br />
Height:= VerticalSplitter.Position;<br />
align:= alClient;<br />
SplitterType:= pstHorizontal;<br />
Position:= 125;<br />
end;<br />
<br />
LeftPanel:= TPanel.Create(Self);<br />
with (LeftPanel) do<br />
begin<br />
Parent:= HorizontalSplitter.Sides[0];<br />
Align:= alClient;<br />
end;<br />
<br />
MainPanel:= TPanel.Create(Self);<br />
with (MainPanel) do<br />
begin<br />
Parent:= HorizontalSplitter.Sides[1];<br />
Align:= alClient;<br />
Caption:= 'Hello';<br />
end;<br />
<br />
BottomPanel:= TPanel.Create(Self);<br />
with (BottomPanel) do<br />
begin<br />
Parent:= VerticalSplitter.Sides[1];<br />
Align:= alClient;<br />
end;<br />
end;</delphi><br />
|}<br />
<br />
Ako môžete vidieť, zmena pozostáva väčšinou z hierarchie. Ak vám lepšie vyhovuje práca s DFM, zmeny potrebné pre konverziu DFM->LFM sú podobné zmenám vyššie, ide o rovnaký typ zmien v Parent/Owner atď.<br />
Potom bude vyššie spomínaný príklad vyzerať takto nejako:<br />
<br />
{| class="code"<br />
|- <br />
| class="header" | '''Delphi DFM''' <div style="font-weight: normal">'''(extraneous values removed)'''<br />
| class="header" | '''Lazarus LFM''' <div style="font-weight: normal">'''(most width, height, etc. removed)'''<br />
|- class="code"<br />
| class="code" |<br />
<delphi><br />
object VerticalSplitter: TSplitter<br />
Height = 3<br />
Cursor = crVSplit<br />
Align = alBottom<br />
end<br />
object HorizontalSplitter: TSplitter<br />
Width = 3<br />
Align = alLeft<br />
end<br />
object BottomPanel: TPanel<br />
Height = 75<br />
Align = alBottom<br />
end<br />
object LeftPanel: TPanel<br />
Width = 125<br />
Align = alLeft<br />
end<br />
object MainPanel: TPanel<br />
Align = alClient<br />
end <br />
</delphi><br />
| class="code" |<br />
<delphi><br />
object VerticalSplitter: TPairSplitter<br />
Align = alClient<br />
SplitterType = pstVertical<br />
Position = 225<br />
Height = 300<br />
Width = 400<br />
object Pairsplitterside1: TPairSplitterIde<br />
object HorizontalSplitter: TPairSplitter<br />
Align = alClient<br />
Position = 125<br />
object Pairsplitterside3: TPairSplitterIde<br />
Width = 125<br />
object LeftPanel: TPanel<br />
Align = alClient<br />
Width = 125<br />
end<br />
end<br />
object Pairsplitterside4: TPairSplitterIde<br />
object MainPanel: TPanel<br />
Align = alClient<br />
end<br />
end<br />
end<br />
end<br />
object Pairsplitterside2: TPairSplitterIde<br />
object BottomPanel: TPanel<br />
Align = alClient<br />
Height = 75<br />
end<br />
end<br />
end<br />
</delphi><br />
|}<br />
<br />
===TCustomTreeView/TTreeView===<br />
Oboje, VCL aj LCL, poskytujú komponent TCustomTreeView/TTreeView, používaný pre výpisy stromovej štruktúry dát s viacnásobnými uzlami, rozšíreným výberom a ImageList, a hoci skutočná funkčnosť je porovnateľná, nie všetky vlastnosti sú úplne kompatibilné. Hlavné rozdiely sú:<br />
'''Incomplete list, also update to include TCustomTreeView Mark functions and protected methods '''<br />
<br />
# LCL poskytuje TCustomTreeView.Options, množinu volieb, ktoré môžu byť nastavené na zmenu správania a vzhľadu prvku: <br />
#* tvoAllowMultiselect- nastavuje mód viacnásobného výberu uzlov, ekvivalent k TCustomTreeView.MultiSelect vo VCL VCL<br />
#* tvoAutoExpand- automatické rozbalenie uzlov, ekvivalent k TCustomTreeView.AutoExpand<br />
#* tvoAutoInsertMark- aktualizácia prípravy Drag pri prechode myšou. <br />
#* tvoAutoItemHeight- automatické prispôsobenie výšky prvku. <br />
#* tvoHideSelection- neoznačovať vybranú položku. <br />
#* tvoHotTrack- použitie HotTracking, ekvivalent k TCustomTreeview.HotTrack <br />
#* tvoKeepCollapsedNodes- pri zbalení uzla, uchováva podriadené uzly <br />
#* tvoReadOnly- ekvivalent k TCustomTreeview.ReadOnly <br />
#* tvoRightClickSelect- dovoľuje použiť pravé tlačítko myši na výber uzla, ekvivalent k TCustomTreeView.RightClickSelect <br />
#* tvoRowSelect- dovoľuje výber riadkov, ekvivalent k TCustomTreeView.RowSelect <br />
#* tvoShowButtons- zobrazuje tlačítka, ekvivalent k TCustomTreeView.ShowButtons <br />
#* tvoShowLines- zobrazuje čiary uzlov, ekvivalent k TCustomTreeView.ShowLines <br />
#* tvoShowRoot- zobrazuje root, ekvivalent k TCustomTreeView.ShowRoot <br />
#* tvoShowSeparators- zobrazuje oddeľovače <br />
#* tvoToolTips- zobrazuje samostatné tooltips pre uzly <br />
<br />
# LCL poskytuje dodatočné vlastnosti:<br />
#* udalosť TCustomTreeView.OnSelectionChange <br />
#* TCustomTreeView.DefaultItems, pre predvolené číslo položiek <br />
#* TCustomTreeView.ExpandSignType na určenie znamienka použitého na rozbaliteľných/zbaliteľných uzloch <br />
<br />
==Original Contributors and changes==<br />
This page has been converted from the epikwiki [http://lazarus-ccr.sourceforge.net/index.php?wiki=LazarusForDelphiUsers version].<br />
* Initial import and formatting - [[User:Tom | VlxAdmin]] 9/26/2003<br />
* Begin VCL -> LCL with a section on TSplitter -> TPairSplitter - [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson Andrew Johnson] 9/30/2003<br />
* Add TControl.Font/TControl.ParentFont to VCL -> LCL - [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson Andrew Johnson] 9/30/2003<br />
* Update TEdit/TCustomEdit section in VCL -> LCL - [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson Andrew Johnson] 10/1/2003<br />
* Add Control Dragging/Docking to VCL -> LCL - [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson Andrew Johnson] 10/1/2003<br />
* Added "Object Inspector" to Delphi IDE -> Lazarus IDE - [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson Andrew Johnson] 10/1/2003<br />
* Added initial "TCustomTreeView/TTreeView" to VCL -> LCL - [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson Andrew Johnson] 10/1/2003<br />
* Added introduction to VCL -> LCL - [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson Andrew Johnson] 10/1/2003<br />
* Fixed some typos - [[User:Vincent | Vincent]] 10/2/2003<br />
* Fixed Typo [[User:Kirkpatc]] 20 May 2004<br />
* Prvotný preklad z origánalu - [[User:Slavko|Slavko]] 01:18, 2 Apr 2005 (PST)</div>Slavkohttps://wiki.freepascal.org/index.php?title=Lazarus_For_Delphi_Users/sk&diff=26254Lazarus For Delphi Users/sk2008-01-11T17:40:14Z<p>Slavko: Oprava prekladu</p>
<hr />
<div>{{Lazarus For Delphi Users}}<br />
<br />
Tento článok je pre tých, ktorí sú zainteresovaní v Lazarus a už poznajú Delphi. Popisuje rozdiely medzi týmito dvomi prostrediami. <br />
<br />
==Delphi -> Lazarus==<br />
Lazarus je Rapid Application Development (RAD) nástroj ako Delphi. To znamená, že prichádza s knižnicou vizuálnych komponentov a IDE. Knižnica komponentov Lazarus (LCL) sa veľmi podobá Delphi VCL. Väčšina jednotiek, tried a vlastností má rovnaké meno a funkciu, čím je prechod jednoduchý. Ale Lazarus nie je 'open source Delphi klon', tak neočakávajte 100% kompatibilitu.<br />
<br />
===Najväčšie rozdiely===<br />
Lazarus je úplný open source, je napísaný bez závislosti na platforme a používa silný prekladač FreePascal (FPC). FPC beží na viac ako 15 platformách, ale nie všetky balíčky a knižnice sú prenesené, tak Lazarus práve beží pod Linux, Free/Open/NetBSD, MacOSX a win32.<br />
<br />
Lazarus zatiaľ nie je kompletný, ako aj tento text. Stále hľadáme nových vývojárov, porterov, pisateľov dokumentácie, ... .<br />
<br />
==Delphi IDE -> Lazarus IDE==<br />
===Projekty===<br />
Základným súborom aplikácie Delphi je súbor .dpr. Základným súborom projektu Lazarus je súbor .lpi (Lazarus Project Information). Súbor .dpr je základný zdrojový kód programu a Delphi IDE v ňom uchováva niektoré informácie o direktívach prekladača a jednotkách. Aplikácia Lazarus má tiež súbor .lpr, ktorý je súborom so základným zdrojovým kódom, ale všetky ostatné informácie sú uchovávané v súbore .lpi. Teda, dôležitým súborom je súbor .lpi.<br />
<br />
Jedno dôležité pravidlo: '''Vždy existuje projekt!!!'''<br />
<br />
Jediný spôsob ako zatvoriť projekt je skončiť Lazarus alebo otvoriť iný projekt. To je preto, že projekt Lazarus je tiež "session". To znamená, že aktuálne nastavenia editora sú uchovávané v súbore .lpi a sú obnovené, keď otvoríte projekt. Napríklad: ladíte aplikáciu, nastavíte veľa ladiacich bodov a záložiek. Môžete projekt uložiť a zatvoriť Lazarus alebo otvoriť iný, ale keď znova otvoríte pôvodný, dokonca i na inom počítači, všetky vaše ladiace body, záložky, otvorené súbory, pozície kurzora, histórie skokov, ... sú obnovené.<br />
<br />
===Editor zdrojového kódu===<br />
(Source Editor)<br />
Takmer všetky klávesy a klávesové skratky môžu byť nastavené v Environment->Editor options->Key mappings<br />
<br />
IDE Lazarus má veľa nástrojov pre zdrojový kód. Mnohé z nich sú veľmi podobné tým v Delphi. Ale je tu jeden veľký rozdiel: Lazarus nepoužíva prekladač na získanie informácií o kóde, ale analyzuje priamo zdrojový kód, čo má veľa výhod:<br />
<br />
: Editor zdrojového kódu pracuje s komentármi. V Delphi sú komentáre len medzerou v kóde, funkcie kódu tu nepracujú a pri automatickom vložení kódu, sú vaše komentáre posunuté. Pod Lazarus môžete hľadať deklarácie dokonca v kóde komentára. Aj keď toto nie je úplne spoľahlivé, často to pracuje. A keď vložíte nový kód, používa IDE nejakú heuristiku na uchovanie komentára a kódu spolu. Napríklad: nebude rozdelený riadok "c: char; // comment".<br />
<br />
Dokončovanie kódu Delphi (Ctrl+Space) je pod Lazarus nazvané '''Identifier Completion'''. Termín Lazarus '''Code Completion''' je funkcia, ktorá kombinuje '''Automatic Class Completion''' (rovnaká ako v Delphi), '''Local Variable Completion''' a '''Event Assignment Completion'''. Tieto všetky sú vyvolané pomocou Ctrl+Shift+C a IDE určuje podľa pozície kurzora, ktorá funkcia bude použitá.<br />
<br />
====Dokončovanie lokálnych premenných====<br />
(Local Variable Completion)<br />
Predstavte si, že ste práve vytvorili novú metódu a napísali príkaz "i:=3;"<br />
<pascal>procedure<br />
TForm1.DoSomething; <br />
begin<br />
i := 3; <br />
end;</pascal><br />
<br />
Umiestnite kurzor nad identifikátor "i" a stlačte Ctrl+Shift+C, čím získate:<br />
<pascal>procedure<br />
TForm1.DoSomething; <br />
var<br />
i: Integer; <br />
begin<br />
i:= 3; <br />
end;</pascal><br />
<br />
====Dokončovanie priradenia udalostí====<br />
(Event Assignment Completion)<br />
Príjemná funkcia Inšpektora objektov je automatické vytváranie metód. To isté môžete urobiť v editore zdrojového kódu.<br />
Napríklad:<br />
: Button1.OnClick:=<br />
Umiestnite kurzor za operátor priradenia ":=" a stlačte Ctrl+Shift+C.<br />
<br />
====Dokončovanie slov====<br />
(Word Completion Ctrl+W)<br />
Táto funkcia je odstupná po stlačení Ctrl+W. Pracuje podobne ako "Identifier Completion", ale nepracuje len s identifikátormi Pascalu, ale so všetkými slovami. Dovolí vám vybrať zo všetkých slov zo všetkých otvorených súborov začínajúcich rovnakými písmenami.<br />
<br />
====Include súborov====<br />
Delphi túto podporu nemá a tak ste pravdepodobne veľa takýchto súborov nevytvorili. Ale include súbory majú veľkú výhodu: Dovoľujú písanie na platforme (ne)závislý kód bez komplikovanosti vášho kódu s direktívami IFDEF.<br />
<br />
Napríklad: Method jumping, Class Completion, Find declaration, .. všetky pracujú s include súbormi.<br />
<br />
Pre nastavenie dokončovania kódu je k dispozícii veľa nastavení.<br />
<br />
===Designer===<br />
- Guidelines<br />
<br />
====Object Inspector====<br />
Ako v IDE Delphi aj v IDE Lazarus je Inšpektor objektov použitý na úpravu vlastností komponentov, priradenie udalostí atď. Nasledujú niektoré malé rozdiely, na ktoré treba pri použití pamätať:<br />
# Počnúc Delphi 5, je Object Treeview, ktorý môže byť použitý na navigáciu a výber objektov podľa ich hierarchie, ako doplnok tradičného rozbaľovacieho zoznamu v Inšpektore objektov. V Lazarus je toto súčasťou Inšpektora objektov a jeho použitím namiesto predvoleného rozbaľovacieho zoznamu môžete vybrať jeho ne/použitie pomocou kontextového menu "Show Component Tree" <br />
# V Delphi dvojité kliknutie na prázdnu udalosť ju automaticky vytvorí a otvorí Editor zdrojového kódu na jej pozícii, v Lazarus je tlačítko napravo od rozbaľovacieho zoznamu, ktoré vykoná to isté. <br />
# V Delphi musíte ručne zmazať meno udalosti v políčku, aby ste odstránili priradenie, v Lazarus zvoľte v zozname "(None)".<br />
# Podobne ako pri udalostiach, dvojitým kliknutím na regulárne vlastnosti (napr. Boolean) nezmení ich hodnotu, ale musíte ju zvoliť zo zoznamu a na otvorenie ich predvoleného editora, musíte kliknúť na tlačítko vpravo od rozbaľovacieho zoznamu.<br />
<br />
====Balíčky====<br />
V Lazarus nemôžete inštalovať balíčky Delphi, pretože potrebujú čary prekladača Delphi. Preto pre Lazarus potrebujete špeciálne vytvorené balíčky.<br />
<br />
Vytvorte nový balíček, uložte ho v zdrojovom adresári balíčkov (bežne rovnaký adresár súboru .dpk), pridajte LCL ako vyžadovaný balíček a nakoniec pridajte súbory .pas. Teraz ho môžete nainštalovať alebo použiť vo svojom projekte. Medzi balíčkami Lazarus a Delphi sú rozdiely, prečítajte si prosím docs/Packages.txt v zdrojovom kóde Lazarus.<br />
- viď docs/Packages.txt v zdrojovom kóde Lazarus.<br />
<br />
===VCL -> LCL===<br />
Hoci obe, VCL aj LCL, slúžia rovnakému cieľu - Objektovo orientovanej hierarchii komponentov hlavnému motoru pre rýchly vývoj aplikácií (RAD), nie sú identické. Napríklad, kým VCL poskytuje veľa nevizuálnych komponentov, LCL sa pokúša poskytovať len vizuálne, kým väčšina nevizuálnych komponentov (ako db access) sú poskytované pomocou FCL, zahrnutej vo FreePascal.<br />
<br />
Takže veľa prvkov VCL nemusí existovať v LCL, alebo naopak, alebo dokonca keď prvky existujú v oboch, nie sú to klony a musíte urobiť pri prenose zmeny v aplikácii, komponentoch a prvkoch.<br />
<br />
Nasledujúci text sa pokúša poskytnúť čo najúplnejší popis hlavných rozdielov a nekompatibility medzi nimi, pre užívateľov Delphi. Popisuje najmä rozdiely VCL v D4, ale i D5, D6 alebo D7; s aktuálnou LCL, ako je v CVS. Takže nemusí byť vždy presne k verzii, ktorú používate alebo úplne súhlasiť s aktuálnym LCL, ktorý máte. Ak uvidíte rozdiely medzi nasledujúcim textom a LCL ako je v CVS, alebo svojim Delphi kľudne sa pripojte a zmeňte to tak, aby ste prispeli k úplnosti pre všetkých ľudí.<br />
<br />
====TControl.Font/TControl.ParentFont====<br />
Vo VCL je pre prvky úplne bežné použiť presné meno fontu a vlastností fontu ako bold a italics a očakávanie tejto hodnoty bude vždy nasledovať. Ďalej je poskytnutá vlastnosť TControl.ParentFont, ktorá zaisťuje, že prvok sa bude vždy riadiť svojim rodičovským fontom. Opäť, implicitná domnienka je, že tieto hodnoty budú vždy nasledované, dokonca nedbajúc nastavenia Windows Apearance. <br />
<br />
Toto nie je vždy pravda v LCL, ani byť nemôže. LCL je cross-platform/cross-interface od začiatku preferuje vyvážené nastavenie a bude sa vždy pokúšať nastaviť Desktop/Toolkit Apearance alebo nastavenú Tému na všetkých nástrojoch. Napríklad, ak používate rozhranie GTK a téma GTK poskytuje konkrétny font pre tlačítka, potom sa tlačítka LCL budú vždy pokúšať použiť tento font.<br />
<br />
To znamená, že väčšina prvkov LCL nemá rovnakú úroveň návrhu prvku, ktorá je často predpokladaná vo VCL, skôr len tie vlastné prvky, ktoré sú kreslené Canvas miesto pridelené rozhraním môžu byť modifikované týmto spôsobom, nedbajúcim na použité rozhranie.<br />
<br />
Ak je napríklad potrebný Label s fontom bold/special color, musíte použiť TStaticText, keďže TLabel je špecifický prvok rozhrania a všetky rozhrania sú poskytnuté v pôvodnej verzii a mnoho z nich bude mať predvolené nastavenia, ktoré budú použité.<br />
<br />
==== Riadenie Dragging/Docking ====<br />
Vo VCL väčšina (Win) prvkov implementuje metódy a spätné funkcie pre obsluhovanie preťahovania a dokovania prvkov, napríklad preťahovanie prvku z jedného panela a jeho dokovanie do iného panely v dobe behu programu.<br />
<br />
Táto funkcia nie je teraz implementovaná/dokončená v LCL, hoci teraz je v počiatočnom štádiu plánovania a bude eventuálne podporovať nejakú úroveň kompatibility tohto typu správania, ak nie dokonca presne rovnaké.<br />
<br />
Toto aktuálne znamená, že prvky nemôžu dediť/používať nasledujúce funkcie, procedúry, vlastnosti a udalosti TControl:<br />
<br />
<delphi>protected<br />
function GetDockEdge(MousePos: TPoint): TAlign; <br />
function GetDragImages: TDragImageList; <br />
function GetFloating: Boolean; <br />
function GetFloatingDockSiteClass: TWinControlClass; <br />
procedure DoEndDrag(Target:TObject); X, Y: Integer); <br />
procedure DockTrackNoTarget(Source: TDragDockObject; X, Y: Integer); <br />
procedure DoEndDock(Target: TObject; X, Y: Integer); <br />
procedure DoDock(NewDockSite: TWinControl; var ARect: TRect); <br />
procedure DoStartDock(var DragObject: TDragObject); <br />
procedure DragCanceled; <br />
procedure DragOver(Source: TObject; X, Y: Integer; State: TDragState; <br />
var Accept: Boolean); <br />
procedure DoEndDrag(Target: TObject; X, Y: Integer); <br />
procedure DoStartDrag(var DragObject: TDragObject); <br />
procedure DrawDragDockImage(DragDockObject: TDragDockObject); <br />
procedure EraseDragDockImage(DragDockObject: TDragDockObject); <br />
procedure PositionDockRect(DragDockObject: TDragDockObject); <br />
procedure SetDragMode(Value: TDragMode); <br />
property DragKind: TDragKind; <br />
property DragCursor: TCursor; <br />
property DragMode: TDragMode; <br />
property OnDragDrop: TDragDropEvent; <br />
property OnDragOver: TDragOverEvent; <br />
property OnEndDock: TEndDragEvent; <br />
property OnEndDrag: TEndDragEvent; <br />
property OnStartDock: TStartDockEvent; <br />
property OnStartDrag: TStartDragEvent; <br />
public <br />
function Dragging: Boolean; <br />
function ManualDock(NewDockSite: TWinControl; DropControl: TControl; <br />
ControlSide: TAlign): Boolean; <br />
function ManualFloat(ScreenPos: TRect): Boolean; <br />
function ReplaceDockedControl(Control: TControl; NewDockSite: TWinControl; <br />
DropControl: TControl; ControlSide: TAlign): Boolean; <br />
procedure BeginDrag(Immediate: Boolean; Threshold: Integer); <br />
procedure Dock(NewDockSite: TWinControl; ARect: TRect); <br />
procedure DragDrop(Source: TObject; X, Y: Integer); <br />
procedure EndDrag(Drop: Boolean); <br />
property DockOrientation: TDockOrientation; <br />
property Floating: Boolean; <br />
property FloatingDockSiteClass: TWinControlClass; <br />
property HostDockSite: TWinControl; <br />
property LRDockWidth: Integer; <br />
property TBDockHeight: Integer; <br />
property UndockHeight: Integer; <br />
property UndockWidth: Integer;</delphi><br />
<br />
a že nasledujúce triedy neexistujú alebo sú nepoužiteľné:<br />
<br />
<delphi>TDragImageList = class (TCustomImageList) <br />
TDockZone = class<br />
TDockTree = class (TInterfacedObject, IDockManager) <br />
TDragObject = class (TObject) <br />
TBaseDragControlObject = class (TDragObject) <br />
TDragControlObject = class (TBaseDragControlObject) <br />
TDragDockObject = class (TBaseDragControlObject)</delphi><br />
<br />
a že nasledujúce funkcie sú tiež neexistujúce/nepoužiteľné:<br />
<br />
<delphi>function FindDragTarget(const Pos: TPoint; AllowDisabled: Boolean) : TControl; <br />
procedure CancelDrag; <br />
function IsDragObject(sender: TObject): Boolean;</delphi><br />
<br />
====TEdit/TCustomEdit====<br />
Prvky Edit, kým základné funkcie sú v LCL rovnaké ako vo VCL, iné treba pri konverzii robiť opatrne:<br />
# kvôli obmedzeniam rozhraní, TEdit.PasswordChar zatiaľ nepracuje vo všetkých rozhraniach (neskôr možno), namiesto toho použite TCustomEdit.EchoMode emPassword v udalosti na skrytie textu. <br />
# Udalosti OnDrag/Dock zatiaľ nie sú implementované. Viz [[#Riadenie Dragging/Docking|Riadenie Dragging/Docking]].<br />
# Vlastnosti Font sú, kvôli správaniu rozhrania, zvyčajne ignorované. Viz [[#TControl.Font/TControl.ParentFont|TControl.Font/TControl.ParentFont]]<br />
<br />
===TSplitter -> TPairSplitter===<br />
'''Please Improve Me'''<br />
<br />
V LCL existuje prvok TSplitter, tak ho netreba konvertovať, napriek tomu ho chcem trochu vysvetliť:<br />
<br />
Vo VCL, "Splitting" prvkov, čo je ošetrením, ktoré umožňuje preťahovanie medzi dvomi komponentmi na získanie viac/menej miesta pre jeden na úkor ostatných, je urobený pomocou TSplitter. Často to môžete vidieť, napríklad v IDE Delphi medzi dokovaným Code Explorer a Source Viewer. <br />
<br />
LCL poskytuje svoj vlastný prvok, nazvaný TPairSplitter, ktorý obsluhuje rovnakú úlohu, avšak nie je kompatibilný, tak "skúšanie" preruší VCL kód alebo bude potrebný Delphi DFM pri prenose kódu.<br />
<br />
;V čom presne sú rozdiely?<br />
Najväčšie rozdiely sú, že VCL TSplitter nemá potomkov, namiesto toho ho umiestňujete medzi dva prvky, ktoré sú správne usporiadané a dovoľuje meniť ich veľkosť za behu programu, nedbajúc na vlastnú veľkosť. Prvky musia byť správne usporiadané, napríklad Panel a Splitter s Aligned Left a druhý Panel Aligned Client. Za behu programu môžete zmeniť rozloženie panelov pomocou preťahovania ošetreného pomocou prvku Splitter.<br />
<br />
V LCL je však TPairSplitter špeciálnym typom prvku s dvomi panelmi a môže byť užitočný len ak prvky na presúvanie sú na týchto paneloch, ale posúvanie bude jednako vykonané medzi týmito panelmi, i keď na nich nebude nič. Ako v predchádzajúcom príklade, potrebujete formulár s TPairSplitter Aligned Client a Panel Aligned Client na jeho ľavej strane a Panel Aligned Client na jeho pravej strane.<br />
<br />
Iným dôležitým rozdielom je, že vo VCL, keďže TSplitter je svoj vlastný TControl, tak jeho pozícia pri zmene veľkosti je uchovávaná relatívne k ostatným prvkom, tak napríklad klientský panel sa bude zväčšovať, kým ostatné panely nie, tým je pozícia rozdelenia relatívna k zarovnaniu rozdeľovaných prvkov.<br />
<br />
V LCL sú bočné panely samostatné, potom TPairSplitter má vlastnosť Position, ktorá je absolútne relatívna k vrcholu Top alebo Left. Tak pri zmene veľkosti aktuálna sa pozícia nemení podľa obsahu, tak musí byť nastavené spätné volanie na zaistenie uchovania pomeru, ak je to dôležité.<br />
<br />
Napríklad, ak pravá strana vertikálneho rozdelenia musí mať správanie ako alClient, potrebujete zmeniť spätným volaním veľkosť formulára, napríklad takto:<br />
<br />
PairSplitter.Position := PairSplitter.Width - PairSplitter.Position; <br />
<br />
;Teda ako môžem konvertovať existujúci kód používajúci TSplitter na TPairSplitter?<br />
Ak sú splitter a prvky vytvorené vo vnútri aktuálnej funkcie (ako OnCreate formulára), konverzia nebude zložitá, najprv zreorganizujeme kód na vytvorenie prvkov v poradí novej hierarchie a nastavíme rodičov podriadených prvkov pre rozdelenie na ľavý/horný a pravý/dolný podiel prvku PairSplitter. Napríklad:<br />
{| class="code"<br />
|- <br />
| class="header" | VCL || class="header" | LCL<br />
|- class="code"<br />
| class="code" |<div class="key">var</div><br />
BottomPanel: TPanel<div class="symbol">;</div><br />
<div></div><br />
VerticalSplitter: TSplitter<div class="symbol">;</div><br />
LeftPanel: TPanel<div class="symbol">;</div><br />
HorizontalSplitter: TSplitter<div class="symbol">;</div><br />
<div></div><br />
MainPanel: TPanel<div class="symbol">;</div><br />
<div class="key">begin</div><br />
BottomPanel:= TPanel.Create(Self)<div class="symbol">;</div><br />
<div class="key">with</div> (BottomPanel) <div class="key">do</div><br />
<div class="key">begin</div><br />
Parent:= Self<div class="symbol">;</div><br />
Height:= <div class="int">75</div><div class="symbol">;</div><br />
Align:= alBottom<div class="symbol">;</div><br />
<div class="key">end</div><div class="symbol">;</div><br />
<div></div><br />
VerticalSplitter:= TSplitter.Create(Self)<div class="symbol">;</div><br />
<div class="key">with</div> (VerticalSplitter) <div class="key">do</div><br />
<div class="key">begin</div><br />
Parent:= Self<div class="symbol">;</div><br />
Align:= alBottom<div class="symbol">;</div><br />
<div class="key">end</div><div class="symbol">;</div><br />
<div></div><br />
HorizontalSplitter:= TSplitter.Create(Self)<div class="symbol">;</div><br />
<div class="key">with</div> (HorizontalSplitter) <div class="key">do</div><br />
<div class="key">begin</div><br />
Parent:= Self<div class="symbol">;</div><br />
align:= alLeft<div class="symbol">;</div><br />
<div class="key">end</div><div class="symbol">;</div><br />
<div></div><br />
LeftPanel:= TPanel.Create(Self)<div class="symbol">;</div><br />
<div class="key">with</div> (LeftPanel) <div class="key">do</div><br />
<div class="key">begin</div><br />
Parent:= Self<div class="symbol">;</div><br />
Width:= <div class="int">125</div><div class="symbol">;</div><br />
Align:= alLeft<div class="symbol">;</div><br />
<div class="key">end</div><div class="symbol">;</div><br />
<div></div><br />
MainPanel:= TPanel.Create(Self)<div class="symbol">;</div><br />
<div class="key">with</div> (MainPanel) <div class="key">do</div><br />
<div class="key">begin</div><br />
Parent:= Self<div class="symbol">;</div><br />
Align:= alClient<div class="symbol">;</div><br />
Caption:= <div class="str">'Hello'</div><div class="symbol">;</div><br />
<div class="key">end</div><div class="symbol">;</div><br />
<div class="key">end</div>; <br />
| class="code" | <div class="key">var</div><br />
BottomPanel: TPanel<div class="symbol">;</div><br />
<div></div><br />
VerticalSplitter: TPairSplitter<div class="symbol">;</div><br />
LeftPanel: TPanel<div class="symbol">;</div><br />
HorizontalSplitter: TPairSplitter<div class="symbol">;</div><br />
<div></div><br />
MainPanel: TPanel<div class="symbol">;</div><br />
<div class="key">begin</div><br />
VerticalSplitter:= TPairSplitter.Create(Self)<div class="symbol">;</div><br />
<div class="key">with</div> (VerticalSplitter) <div class="key">do</div><br />
<div class="key">begin</div><br />
Parent:= Self<div class="symbol">;</div><br />
Align:= alClient<div class="symbol">;</div><br />
Width:= Self.Width<div class="symbol">;</div><br />
Height:= Self.Height<div class="symbol">;</div><br />
SplitterType:= pstVertical<div class="symbol">;</div><br />
Position:= Height - <div class="int">75</div><div class="symbol">;</div><br />
Sides[<div class="int">0</div>].Width:= Width<div class="symbol">;</div><br />
Sides[<div class="int">0</div>].Height:= Position<div class="symbol">;</div><br />
<div class="key">end</div><div class="symbol">;</div><br />
<div></div><br />
HorizontalSplitter:= TPairSplitter.Create(Self)<div class="symbol">;</div><br />
<div class="key">with</div> (HorizontalSplitter) <div class="key">do</div><br />
<div class="key">begin</div><br />
Parent:= VerticalSplitter.Sides[<div class="int">0</div>]<div class="symbol">;</div><br />
Width:= Self.Width<div class="symbol">;</div><br />
Height:= VerticalSplitter.Position<div class="symbol">;</div><br />
align:= alClient<div class="symbol">;</div><br />
SplitterType:= pstHorizontal<div class="symbol">;</div><br />
Position:= <div class="int">125</div><div class="symbol">;</div><br />
<div class="key">end</div><div class="symbol">;</div><br />
<div></div><br />
LeftPanel:= TPanel.Create(Self)<div class="symbol">;</div><br />
<div class="key">with</div> (LeftPanel) <div class="key">do</div><br />
<div class="key">begin</div><br />
Parent:= HorizontalSplitter.Sides[<div class="int">0</div>]<div class="symbol">;</div><br />
Align:= alClient<div class="symbol">;</div><br />
<div class="key">end</div><div class="symbol">;</div><br />
<div></div><br />
MainPanel:= TPanel.Create(Self)<div class="symbol">;</div><br />
<div class="key">with</div> (MainPanel) <div class="key">do</div><br />
<div class="key">begin</div><br />
Parent:= HorizontalSplitter.Sides[<div class="int">1</div>]<div class="symbol">;</div><br />
Align:= alClient<div class="symbol">;</div><br />
Caption:= <div class="str">'Hello'</div><div class="symbol">;</div><br />
<div class="key">end</div><div class="symbol">;</div><br />
<div></div><br />
BottomPanel:= TPanel.Create(Self)<div class="symbol">;</div><br />
<div class="key">with</div> (BottomPanel) <div class="key">do</div><br />
<div class="key">begin</div><br />
Parent:= VerticalSplitter.Sides[<div class="int">1</div>]<div class="symbol">;</div><br />
Align:= alClient<div class="symbol">;</div><br />
<div class="key">end</div><div class="symbol">;</div><br />
<div class="key">end</div><div class="symbol">;</div><br />
|}<br />
<br />
Ako môžete vidieť, zmena pozostáva väčšinou z hierarchie. Ak vám lepšie vyhovuje práca s DFM, zmeny potrebné pre konverziu DFM->LFM sú podobné zmenám vyššie, ide o rovnaký typ zmien v Parent/Owner atď.<br />
Potom bude vyššie spomínaný príklad vyzerať takto nejako:<br />
{| class="code"<br />
|- <br />
| class="header" | Delphi DFM <div style="font-weight: normal">(exteranous values removed)</div><br />
| class="header" | Lazarus LFM <div style="font-weight: normal">(most width, height etc removed)</div><br />
|- class="code"<br />
| class="code" |<div class="key">object</div>VerticalSplitter: TSplitter<br />
Height <div class="symbol">=</div> <div class="int">3</div><br />
Cursor <div class="symbol">=</div> crVSplit<br />
Align <div class="symbol">=</div> alBottom<br />
<div class="key">end</div><br />
<div class="key">object</div> HorizontalSplitter: TSplitter<br />
Width <div class="symbol">=</div> <div class="int">3</div><br />
Align <div class="symbol">=</div> alLeft<br />
<div class="key">end</div><br />
<div class="key">object</div> BottomPanel: TPanel<br />
Height <div class="symbol">=</div> <div class="int">75</div><br />
Align <div class="symbol">=</div> alBottom<br />
<div class="key">end</div><br />
<div class="key">object</div> LeftPanel: TPanel<br />
Width <div class="symbol">=</div> <div class="int">125</div><br />
Align <div class="symbol">=</div> alLeft<br />
<div class="key">end</div><br />
<div class="key">object</div> MainPanel: TPanel<br />
Align <div class="symbol">=</div> alClient<br />
<div class="key">end</div> <br />
| class="code" |<div class="key">object</div> VerticalSplitter: TPairSplitter<br />
Align <div class="symbol">=</div> alClient<br />
SplitterType <div class="symbol">=</div> pstVertical<br />
Position <div class="symbol">=</div> <div class="int">225</div><br />
Height <div class="symbol">=</div> <div class="int">300</div><br />
Width <div class="symbol">=</div> <div class="int">400</div><br />
<div class="key">object</div> Pairsplitterside1: TPairSplitterIde<br />
<div class="key">object</div> HorizontalSplitter: TPairSplitter<br />
Align <div class="symbol">=</div> alClient<br />
Position <div class="symbol">=</div> <div class="int">125</div><br />
<div class="key">object</div> Pairsplitterside3: TPairSplitterIde<br />
Width <div class="symbol">=</div> <div class="int">125</div><br />
<div class="key">object</div> LeftPanel: TPanel<br />
Align <div class="symbol">=</div> alClient<br />
Width <div class="symbol">=</div> <div class="int">125</div><br />
<div class="key">end</div><br />
<div class="key">end</div><br />
<div class="key">object</div> Pairsplitterside4: TPairSplitterIde<br />
<div class="key">object</div> MainPanel: TPanel<br />
Align <div class="symbol">=</div> alClient<br />
<div class="key">end</div><br />
<div class="key">end</div><br />
<div class="key">end</div><br />
<div class="key">end</div><br />
<div class="key">object</div> Pairsplitterside2: TPairSplitterIde<br />
<div class="key">object</div> BottomPanel: TPanel<br />
Align <div class="symbol">=</div> alClient<br />
Height <div class="symbol">=</div> <div class="int">75</div>;<br />
<div class="key">end</div><br />
<div class="key">end</div><br />
<div class="key">end</div><br />
|}<br />
<br />
===TCustomTreeView/TTreeView===<br />
Oboje, VCL aj LCL, poskytujú komponent TCustomTreeView/TTreeView, používaný pre výpisy stromovej štruktúry dát s viacnásobnými uzlami, rozšíreným výberom a ImageList, a hoci skutočná funkčnosť je porovnateľná, nie všetky vlastnosti sú úplne kompatibilné. Hlavné rozdiely sú:<br />
'''Incomplete list, also update to include TCustomTreeView Mark functions and protected methods '''<br />
<br />
# LCL poskytuje TCustomTreeView.Options, množinu volieb, ktoré môžu byť nastavené na zmenu správania a vzhľadu prvku: <br />
#* tvoAllowMultiselect- nastavuje mód viacnásobného výberu uzlov, ekvivalent k TCustomTreeView.MultiSelect vo VCL VCL<br />
#* tvoAutoExpand- automatické rozbalenie uzlov, ekvivalent k TCustomTreeView.AutoExpand<br />
#* tvoAutoInsertMark- aktualizácia prípravy Drag pri prechode myšou. <br />
#* tvoAutoItemHeight- automatické prispôsobenie výšky prvku. <br />
#* tvoHideSelection- neoznačovať vybranú položku. <br />
#* tvoHotTrack- použitie HotTracking, ekvivalent k TCustomTreeview.HotTrack <br />
#* tvoKeepCollapsedNodes- pri zbalení uzla, uchováva podriadené uzly <br />
#* tvoReadOnly- ekvivalent k TCustomTreeview.ReadOnly <br />
#* tvoRightClickSelect- dovoľuje použiť pravé tlačítko myši na výber uzla, ekvivalent k TCustomTreeView.RightClickSelect <br />
#* tvoRowSelect- dovoľuje výber riadkov, ekvivalent k TCustomTreeView.RowSelect <br />
#* tvoShowButtons- zobrazuje tlačítka, ekvivalent k TCustomTreeView.ShowButtons <br />
#* tvoShowLines- zobrazuje čiary uzlov, ekvivalent k TCustomTreeView.ShowLines <br />
#* tvoShowRoot- zobrazuje root, ekvivalent k TCustomTreeView.ShowRoot <br />
#* tvoShowSeparators- zobrazuje oddeľovače <br />
#* tvoToolTips- zobrazuje samostatné tooltips pre uzly <br />
<br />
# LCL poskytuje dodatočné vlastnosti:<br />
#* udalosť TCustomTreeView.OnSelectionChange <br />
#* TCustomTreeView.DefaultItems, pre predvolené číslo položiek <br />
#* TCustomTreeView.ExpandSignType na určenie znamienka použitého na rozbaliteľných/zbaliteľných uzloch <br />
<br />
==Original Contributors and changes==<br />
This page has been converted from the epikwiki [http://lazarus-ccr.sourceforge.net/index.php?wiki=LazarusForDelphiUsers version].<br />
* Initial import and formatting - [[User:Tom | VlxAdmin]] 9/26/2003<br />
* Begin VCL -> LCL with a section on TSplitter -> TPairSplitter - [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson Andrew Johnson] 9/30/2003<br />
* Add TControl.Font/TControl.ParentFont to VCL -> LCL - [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson Andrew Johnson] 9/30/2003<br />
* Update TEdit/TCustomEdit section in VCL -> LCL - [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson Andrew Johnson] 10/1/2003<br />
* Add Control Dragging/Docking to VCL -> LCL - [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson Andrew Johnson] 10/1/2003<br />
* Added "Object Inspector" to Delphi IDE -> Lazarus IDE - [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson Andrew Johnson] 10/1/2003<br />
* Added initial "TCustomTreeView/TTreeView" to VCL -> LCL - [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson Andrew Johnson] 10/1/2003<br />
* Added introduction to VCL -> LCL - [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson Andrew Johnson] 10/1/2003<br />
* Fixed some typos - [[User:Vincent | Vincent]] 10/2/2003<br />
* Fixed Typo [[User:Kirkpatc]] 20 May 2004<br />
* Prvotný preklad z origánalu - [[User:Slavko|Slavko]] 01:18, 2 Apr 2005 (PST)</div>Slavkohttps://wiki.freepascal.org/index.php?title=Lazarus_For_Delphi_Users/sk&diff=26253Lazarus For Delphi Users/sk2008-01-11T17:38:18Z<p>Slavko: preklad nadpisu</p>
<hr />
<div>{{Lazarus For Delphi Users}}<br />
<br />
Tento článok je pre tých, ktorí sú zainteresovaní v Lazarus a už poznajú Delphi. Popisuje rozdiely medzi týmito dvomi prostrediami. <br />
<br />
==Delphi -> Lazarus==<br />
Lazarus je Rapid Application Development (RAD) nástroj ako Delphi. To znamená, že prichádza s knižnicou vizuálnych komponentov a IDE. Knižnica komponentov Lazarus (LCL) sa veľmi podobá Delphi VCL. Väčšina jednotiek, tried a vlastností má rovnaké meno a funkciu, čím je prechod jednoduchý. Ale Lazarus nie je 'open source Delphi klon', tak neočakávajte 100% kompatibilitu.<br />
<br />
===Najväčšie rozdiely===<br />
Lazarus je úplný open source, je napísaný bez závislosti na platforme a používa silný prekladač FreePascal (FPC). FPC beží na viac ako 15 platformách, ale nie všetky balíčky a knižnice sú prenesené, tak Lazarus práve beží pod Linux, Free/Open/NetBSD, MacOSX a win32.<br />
<br />
Lazarus zatiaľ nie je kompletný, ako aj tento text. Stále hľadáme nových vývojárov, porterov, pisateľov dokumentácie, ... .<br />
<br />
==Delphi IDE -> Lazarus IDE==<br />
===Projekty===<br />
Základným súborom aplikácie Delphi je súbor .dpr. Základným súborom projektu Lazarus je súbor .lpi (Lazarus Project Information). Súbor .dpr je základný zdrojový kód programu a Delphi IDE v ňom uchováva niektoré informácie o direktívach prekladača a jednotkách. Aplikácia Lazarus má tiež súbor .lpr, ktorý je súborom so základným zdrojovým kódom, ale všetky ostatné informácie sú uchovávané v súbore .lpi. Teda, dôležitým súborom je súbor .lpi.<br />
<br />
Jedno dôležité pravidlo: '''Vždy existuje projekt!!!'''<br />
<br />
Jediný spôsob ako zatvoriť projekt je skončiť Lazarus alebo otvoriť iný projekt. To je preto, že projekt Lazarus je tiež "session". To znamená, že aktuálne nastavenia editora sú uchovávané v súbore .lpi a sú obnovené, keď otvoríte projekt. Napríklad: ladíte aplikáciu, nastavíte veľa ladiacich bodov a záložiek. Môžete projekt uložiť a zatvoriť Lazarus alebo otvoriť iný, ale keď znova otvoríte pôvodný, dokonca i na inom počítači, všetky vaše ladiace body, záložky, otvorené súbory, pozície kurzora, histórie skokov, ... sú obnovené.<br />
<br />
===Editor zdrojového kódu===<br />
(Source Editor)<br />
Takmer všetky klávesy a klávesové skratky môžu byť nastavené v Environment->Editor options->Key mappings<br />
<br />
IDE Lazarus má veľa nástrojov pre zdrojový kód. Mnohé z nich sú veľmi podobné tým v Delphi. Ale je tu jeden veľký rozdiel: Lazarus nepoužíva prekladač na získanie informácií o kóde, ale analyzuje priamo zdrojový kód, čo má veľa výhod:<br />
<br />
: Editor zdrojového kódu pracuje s komentármi. V Delphi sú komentáre len medzerou v kóde, funkcie kódu tu nepracujú a pri automatickom vložení kódu, sú vaše komentáre posunuté. Pod Lazarus môžete hľadať deklarácie dokonca v kóde komentára. Aj keď toto nie je úplne spoľahlivé, často to pracuje. A keď vložíte nový kód, používa IDE nejakú heuristiku na uchovanie komentára a kódu spolu. Napríklad: nebude rozdelený riadok "c: char; // comment".<br />
<br />
Dokončovanie kódu Delphi (Ctrl+Space) je pod Lazarus nazvané '''Identifier Completion'''. Termín Lazarus '''Code Completion''' je funkcia, ktorá kombinuje '''Automatic Class Completion''' (rovnaká ako v Delphi), '''Local Variable Completion''' a '''Event Assignment Completion'''. Tieto všetky sú vyvolané pomocou Ctrl+Shift+C a IDE určuje podľa pozície kurzora, ktorá funkcia bude použitá.<br />
<br />
====Dokončovanie lokálnych premenných====<br />
(Local Variable Completion)<br />
Predstavte si, že ste práve vytvorili novú metódu a napísali príkaz "i:=3;"<br />
<pascal>procedure<br />
TForm1.DoSomething; <br />
begin<br />
i := 3; <br />
end;</pascal><br />
<br />
Umiestnite kurzor nad identifikátor "i" a stlačte Ctrl+Shift+C, čím získate:<br />
<pascal>procedure<br />
TForm1.DoSomething; <br />
var<br />
i: Integer; <br />
begin<br />
i:= 3; <br />
end;</pascal><br />
<br />
====Dokončovanie priradenia udalostí====<br />
(Event Assignment Completion)<br />
Príjemná funkcia Inšpektora objektov je automatické vytváranie metód. To isté môžete urobiť v editore zdrojového kódu.<br />
Napríklad:<br />
: Button1.OnClick:=<br />
Umiestnite kurzor za operátor priradenia ":=" a stlačte Ctrl+Shift+C.<br />
<br />
====Dokončovanie slov====<br />
(Word Completion Ctrl+W)<br />
Táto funkcia je odstupná po stlačení Ctrl+W. Pracuje podobne ako "Identifier Completion", ale nepracuje len s identifikátormi Pascalu, ale so všetkými slovami. Dovolí vám vybrať zo všetkých slov zo všetkých otvorených súborov začínajúcich rovnakými písmenami.<br />
<br />
====Include súborov====<br />
Delphi túto podporu nemá a tak ste pravdepodobne veľa takýchto súborov nevytvorili. Ale include súbory majú veľkú výhodu: Dovoľujú písanie na platforme (ne)závislý kód bez komplikovanosti vášho kódu s direktívami IFDEF.<br />
<br />
Napríklad: Method jumping, Class Completion, Find declaration, .. všetky pracujú s include súbormi.<br />
<br />
Pre nastavenie dokončovania kódu je k dispozícii veľa nastavení.<br />
<br />
===Designer===<br />
- Guidelines<br />
<br />
====Object Inspector====<br />
Ako v IDE Delphi aj v IDE Lazarus je Inšpektor objektov použitý na úpravu vlastností komponentov, priradenie udalostí atď. Nasledujú niektoré malé rozdiely, na ktoré treba pri použití pamätať:<br />
# Počnúc Delphi 5, je Object Treeview, ktorý môže byť použitý na navigáciu a výber objektov podľa ich hierarchie, ako doplnok tradičného rozbaľovacieho zoznamu v Inšpektore objektov. V Lazarus je toto súčasťou Inšpektora objektov a jeho použitím namiesto predvoleného rozbaľovacieho zoznamu môžete vybrať jeho ne/použitie pomocou kontextového menu "Show Component Tree" <br />
# V Delphi dvojité kliknutie na prázdnu udalosť ju automaticky vytvorí a otvorí Editor zdrojového kódu na jej pozícii, v Lazarus je tlačítko napravo od rozbaľovacieho zoznamu, ktoré vykoná to isté. <br />
# V Delphi musíte ručne zmazať meno udalosti v políčku, aby ste odstránili priradenie, v Lazarus zvoľte v zozname "(None)".<br />
# Podobne ako pri udalostiach, dvojitým kliknutím na regulárne vlastnosti (napr. Boolean) nezmení ich hodnotu, ale musíte ju zvoliť zo zoznamu a na otvorenie ich predvoleného editora, musíte kliknúť na tlačítko vpravo od rozbaľovacieho zoznamu.<br />
<br />
====Balíčky====<br />
V Lazarus nemôžete inštalovať balíčky Delphi, pretože potrebujú čary prekladača Delphi. Preto pre Lazarus potrebujete špeciálne vytvorené balíčky.<br />
<br />
Vytvorte nový balíček, uložte ho v zdrojovom adresári balíčkov (bežne rovnaký adresár súboru .dpk), pridajte LCL ako vyžadovaný balíček a nakoniec pridajte súbory .pas. Teraz ho môžete nainštalovať alebo použiť vo svojom projekte. Medzi balíčkami Lazarus a Delphi sú rozdiely, prečítajte si prosím docs/Packages.txt v zdrojovom kóde Lazarus.<br />
- viď docs/Packages.txt v zdrojovom kóde Lazarus.<br />
<br />
===VCL -> LCL===<br />
Hoci obe, VCL aj LCL, slúžia rovnakému cieľu - Objektovo orientovanej hierarchii komponentov hlavnému motoru pre rýchly vývoj aplikácií (RAD), nie sú identické. Napríklad, kým VCL poskytuje veľa nevizuálnych komponentov, LCL sa pokúša poskytovať len vizuálne, kým väčšina nevizuálnych komponentov (ako db access) sú poskytované pomocou FCL, zahrnutej vo FreePascal.<br />
<br />
Takže veľa prvkov VCL nemusí existovať v LCL, alebo naopak, alebo dokonca keď prvky existujú v oboch, nie sú to klony a musíte urobiť pri prenose zmeny v aplikácii, komponentoch a prvkoch.<br />
<br />
Nasledujúci text sa pokúša poskytnúť čo najúplnejší popis hlavných rozdielov a nekompatibility medzi nimi, pre užívateľov Delphi. Popisuje najmä rozdiely VCL v D4, ale i D5, D6 alebo D7; s aktuálnou LCL, ako je v CVS. Takže nemusí byť vždy presne k verzii, ktorú používate alebo úplne súhlasiť s aktuálnym LCL, ktorý máte. Ak uvidíte rozdiely medzi nasledujúcim textom a LCL ako je v CVS, alebo svojim Delphi kľudne sa pripojte a zmeňte to tak, aby ste prispeli k úplnosti pre všetkých ľudí.<br />
<br />
====TControl.Font/TControl.ParentFont====<br />
Vo VCL je pre prvky úplne bežné použiť presné meno fontu a vlastností fontu ako bold a italics a očakávanie tejto hodnoty bude vždy nasledovať. Ďalej je poskytnutá vlastnosť TControl.ParentFont, ktorá zaisťuje, že prvok sa bude vždy riadiť svojim rodičovským fontom. Opäť, implicitná domnienka je, že tieto hodnoty budú vždy nasledované, dokonca nedbajúc nastavenia Windows Apearance. <br />
<br />
Toto nie je vždy pravda v LCL, ani byť nemôže. LCL je cross-platform/cross-interface od začiatku preferuje vyvážené nastavenie a bude sa vždy pokúšať nastaviť Desktop/Toolkit Apearance alebo nastavenú Tému na všetkých nástrojoch. Napríklad, ak používate rozhranie GTK a téma GTK poskytuje konkrétny font pre tlačítka, potom sa tlačítka LCL budú vždy pokúšať použiť tento font.<br />
<br />
To znamená, že väčšina prvkov LCL nemá rovnakú úroveň návrhu prvku, ktorá je často predpokladaná vo VCL, skôr len tie vlastné prvky, ktoré sú kreslené Canvas miesto pridelené rozhraním môžu byť modifikované týmto spôsobom, nedbajúcim na použité rozhranie.<br />
<br />
Ak je napríklad potrebný Label s fontom bold/special color, musíte použiť TStaticText, keďže TLabel je špecifický prvok rozhrania a všetky rozhrania sú poskytnuté v pôvodnej verzii a mnoho z nich bude mať predvolené nastavenia, ktoré budú použité.<br />
<br />
==== Riadenie Dragging/Docking ====<br />
Vo VCL väčšina (Win) prvkov implementuje metódy a spätné funkcie pre obsluhovanie preťahovania a dokovania prvkov, napríklad preťahovanie prvku z jedného panela a jeho dokovanie do iného panely v dobe behu programu.<br />
<br />
Táto funkcia nie je teraz implementovaná/dokončená v LCL, hoci teraz je v počiatočnom štádiu plánovania a bude eventuálne podporovať nejakú úroveň kompatibility tohto typu správania, ak nie dokonca presne rovnaké.<br />
<br />
Toto aktuálne znamená, že prvky nemôžu dediť/používať nasledujúce funkcie, procedúry, vlastnosti a udalosti TControl:<br />
<br />
<delphi>protected<br />
function GetDockEdge(MousePos: TPoint): TAlign; <br />
function GetDragImages: TDragImageList; <br />
function GetFloating: Boolean; <br />
function GetFloatingDockSiteClass: TWinControlClass; <br />
procedure DoEndDrag(Target:TObject); X, Y: Integer); <br />
procedure DockTrackNoTarget(Source: TDragDockObject; X, Y: Integer); <br />
procedure DoEndDock(Target: TObject; X, Y: Integer); <br />
procedure DoDock(NewDockSite: TWinControl; var ARect: TRect); <br />
procedure DoStartDock(var DragObject: TDragObject); <br />
procedure DragCanceled; <br />
procedure DragOver(Source: TObject; X, Y: Integer; State: TDragState; <br />
var Accept: Boolean); <br />
procedure DoEndDrag(Target: TObject; X, Y: Integer); <br />
procedure DoStartDrag(var DragObject: TDragObject); <br />
procedure DrawDragDockImage(DragDockObject: TDragDockObject); <br />
procedure EraseDragDockImage(DragDockObject: TDragDockObject); <br />
procedure PositionDockRect(DragDockObject: TDragDockObject); <br />
procedure SetDragMode(Value: TDragMode); <br />
property DragKind: TDragKind; <br />
property DragCursor: TCursor; <br />
property DragMode: TDragMode; <br />
property OnDragDrop: TDragDropEvent; <br />
property OnDragOver: TDragOverEvent; <br />
property OnEndDock: TEndDragEvent; <br />
property OnEndDrag: TEndDragEvent; <br />
property OnStartDock: TStartDockEvent; <br />
property OnStartDrag: TStartDragEvent; <br />
public <br />
function Dragging: Boolean; <br />
function ManualDock(NewDockSite: TWinControl; DropControl: TControl; <br />
ControlSide: TAlign): Boolean; <br />
function ManualFloat(ScreenPos: TRect): Boolean; <br />
function ReplaceDockedControl(Control: TControl; NewDockSite: TWinControl; <br />
DropControl: TControl; ControlSide: TAlign): Boolean; <br />
procedure BeginDrag(Immediate: Boolean; Threshold: Integer); <br />
procedure Dock(NewDockSite: TWinControl; ARect: TRect); <br />
procedure DragDrop(Source: TObject; X, Y: Integer); <br />
procedure EndDrag(Drop: Boolean); <br />
property DockOrientation: TDockOrientation; <br />
property Floating: Boolean; <br />
property FloatingDockSiteClass: TWinControlClass; <br />
property HostDockSite: TWinControl; <br />
property LRDockWidth: Integer; <br />
property TBDockHeight: Integer; <br />
property UndockHeight: Integer; <br />
property UndockWidth: Integer;</delphi><br />
<br />
a že nasledujúce triedy neexistujú alebo sú nepoužiteľné:<br />
<br />
<delphi>TDragImageList = class (TCustomImageList) <br />
TDockZone = class<br />
TDockTree = class (TInterfacedObject, IDockManager) <br />
TDragObject = class (TObject) <br />
TBaseDragControlObject = class (TDragObject) <br />
TDragControlObject = class (TBaseDragControlObject) <br />
TDragDockObject = class (TBaseDragControlObject)</delphi><br />
<br />
a že nasledujúce funkcie sú tiež neexistujúce/nepoužiteľné:<br />
<br />
<delphi>function FindDragTarget(const Pos: TPoint; AllowDisabled: Boolean) : TControl; <br />
procedure CancelDrag; <br />
function IsDragObject(sender: TObject): Boolean;</delphi><br />
<br />
====TEdit/TCustomEdit====<br />
Prvky Edit, kým základné funkcie sú rovnaké ako vo VCL, nemajú niektoré výstupy v konverzii:<br />
# kvôli obmedzeniam rozhraní, TEdit.PasswordChar zatiaľ nepracuje vo všetkých rozhraniach (neskôr možno), namiesto toho použite TCustomEdit.EchoMode emPassword v udalosti na skrytie textu. <br />
# Udalosti OnDrag/Dock zatiaľ nie sú implementované. Viz [LazarusForDelphiUsers#Control Dragging/Docking|Control Dragging/Docking].<br />
# Vlastnosti Font sú zvyč¨ ajne ignorované kvôli správaniu rozhrania. Viz [[#TControl.Font/TControl.ParentFont | TControl.Font/TControl.ParentFont]]<br />
<br />
===TSplitter -> TPairSplitter===<br />
'''Please Improve Me'''<br />
<br />
V LCL existuje prvok TSplitter, tak ho netreba konvertovať, napriek tomu ho chcem trochu vysvetliť:<br />
<br />
Vo VCL, "Splitting" prvkov, čo je ošetrením, ktoré umožňuje preťahovanie medzi dvomi komponentmi na získanie viac/menej miesta pre jeden na úkor ostatných, je urobený pomocou TSplitter. Často to môžete vidieť, napríklad v IDE Delphi medzi dokovaným Code Explorer a Source Viewer. <br />
<br />
LCL poskytuje svoj vlastný prvok, nazvaný TPairSplitter, ktorý obsluhuje rovnakú úlohu, avšak nie je kompatibilný, tak "skúšanie" preruší VCL kód alebo bude potrebný Delphi DFM pri prenose kódu.<br />
<br />
;V čom presne sú rozdiely?<br />
Najväčšie rozdiely sú, že VCL TSplitter nemá potomkov, namiesto toho ho umiestňujete medzi dva prvky, ktoré sú správne usporiadané a dovoľuje meniť ich veľkosť za behu programu, nedbajúc na vlastnú veľkosť. Prvky musia byť správne usporiadané, napríklad Panel a Splitter s Aligned Left a druhý Panel Aligned Client. Za behu programu môžete zmeniť rozloženie panelov pomocou preťahovania ošetreného pomocou prvku Splitter.<br />
<br />
V LCL je však TPairSplitter špeciálnym typom prvku s dvomi panelmi a môže byť užitočný len ak prvky na presúvanie sú na týchto paneloch, ale posúvanie bude jednako vykonané medzi týmito panelmi, i keď na nich nebude nič. Ako v predchádzajúcom príklade, potrebujete formulár s TPairSplitter Aligned Client a Panel Aligned Client na jeho ľavej strane a Panel Aligned Client na jeho pravej strane.<br />
<br />
Iným dôležitým rozdielom je, že vo VCL, keďže TSplitter je svoj vlastný TControl, tak jeho pozícia pri zmene veľkosti je uchovávaná relatívne k ostatným prvkom, tak napríklad klientský panel sa bude zväčšovať, kým ostatné panely nie, tým je pozícia rozdelenia relatívna k zarovnaniu rozdeľovaných prvkov.<br />
<br />
V LCL sú bočné panely samostatné, potom TPairSplitter má vlastnosť Position, ktorá je absolútne relatívna k vrcholu Top alebo Left. Tak pri zmene veľkosti aktuálna sa pozícia nemení podľa obsahu, tak musí byť nastavené spätné volanie na zaistenie uchovania pomeru, ak je to dôležité.<br />
<br />
Napríklad, ak pravá strana vertikálneho rozdelenia musí mať správanie ako alClient, potrebujete zmeniť spätným volaním veľkosť formulára, napríklad takto:<br />
<br />
PairSplitter.Position := PairSplitter.Width - PairSplitter.Position; <br />
<br />
;Teda ako môžem konvertovať existujúci kód používajúci TSplitter na TPairSplitter?<br />
Ak sú splitter a prvky vytvorené vo vnútri aktuálnej funkcie (ako OnCreate formulára), konverzia nebude zložitá, najprv zreorganizujeme kód na vytvorenie prvkov v poradí novej hierarchie a nastavíme rodičov podriadených prvkov pre rozdelenie na ľavý/horný a pravý/dolný podiel prvku PairSplitter. Napríklad:<br />
{| class="code"<br />
|- <br />
| class="header" | VCL || class="header" | LCL<br />
|- class="code"<br />
| class="code" |<div class="key">var</div><br />
BottomPanel: TPanel<div class="symbol">;</div><br />
<div></div><br />
VerticalSplitter: TSplitter<div class="symbol">;</div><br />
LeftPanel: TPanel<div class="symbol">;</div><br />
HorizontalSplitter: TSplitter<div class="symbol">;</div><br />
<div></div><br />
MainPanel: TPanel<div class="symbol">;</div><br />
<div class="key">begin</div><br />
BottomPanel:= TPanel.Create(Self)<div class="symbol">;</div><br />
<div class="key">with</div> (BottomPanel) <div class="key">do</div><br />
<div class="key">begin</div><br />
Parent:= Self<div class="symbol">;</div><br />
Height:= <div class="int">75</div><div class="symbol">;</div><br />
Align:= alBottom<div class="symbol">;</div><br />
<div class="key">end</div><div class="symbol">;</div><br />
<div></div><br />
VerticalSplitter:= TSplitter.Create(Self)<div class="symbol">;</div><br />
<div class="key">with</div> (VerticalSplitter) <div class="key">do</div><br />
<div class="key">begin</div><br />
Parent:= Self<div class="symbol">;</div><br />
Align:= alBottom<div class="symbol">;</div><br />
<div class="key">end</div><div class="symbol">;</div><br />
<div></div><br />
HorizontalSplitter:= TSplitter.Create(Self)<div class="symbol">;</div><br />
<div class="key">with</div> (HorizontalSplitter) <div class="key">do</div><br />
<div class="key">begin</div><br />
Parent:= Self<div class="symbol">;</div><br />
align:= alLeft<div class="symbol">;</div><br />
<div class="key">end</div><div class="symbol">;</div><br />
<div></div><br />
LeftPanel:= TPanel.Create(Self)<div class="symbol">;</div><br />
<div class="key">with</div> (LeftPanel) <div class="key">do</div><br />
<div class="key">begin</div><br />
Parent:= Self<div class="symbol">;</div><br />
Width:= <div class="int">125</div><div class="symbol">;</div><br />
Align:= alLeft<div class="symbol">;</div><br />
<div class="key">end</div><div class="symbol">;</div><br />
<div></div><br />
MainPanel:= TPanel.Create(Self)<div class="symbol">;</div><br />
<div class="key">with</div> (MainPanel) <div class="key">do</div><br />
<div class="key">begin</div><br />
Parent:= Self<div class="symbol">;</div><br />
Align:= alClient<div class="symbol">;</div><br />
Caption:= <div class="str">'Hello'</div><div class="symbol">;</div><br />
<div class="key">end</div><div class="symbol">;</div><br />
<div class="key">end</div>; <br />
| class="code" | <div class="key">var</div><br />
BottomPanel: TPanel<div class="symbol">;</div><br />
<div></div><br />
VerticalSplitter: TPairSplitter<div class="symbol">;</div><br />
LeftPanel: TPanel<div class="symbol">;</div><br />
HorizontalSplitter: TPairSplitter<div class="symbol">;</div><br />
<div></div><br />
MainPanel: TPanel<div class="symbol">;</div><br />
<div class="key">begin</div><br />
VerticalSplitter:= TPairSplitter.Create(Self)<div class="symbol">;</div><br />
<div class="key">with</div> (VerticalSplitter) <div class="key">do</div><br />
<div class="key">begin</div><br />
Parent:= Self<div class="symbol">;</div><br />
Align:= alClient<div class="symbol">;</div><br />
Width:= Self.Width<div class="symbol">;</div><br />
Height:= Self.Height<div class="symbol">;</div><br />
SplitterType:= pstVertical<div class="symbol">;</div><br />
Position:= Height - <div class="int">75</div><div class="symbol">;</div><br />
Sides[<div class="int">0</div>].Width:= Width<div class="symbol">;</div><br />
Sides[<div class="int">0</div>].Height:= Position<div class="symbol">;</div><br />
<div class="key">end</div><div class="symbol">;</div><br />
<div></div><br />
HorizontalSplitter:= TPairSplitter.Create(Self)<div class="symbol">;</div><br />
<div class="key">with</div> (HorizontalSplitter) <div class="key">do</div><br />
<div class="key">begin</div><br />
Parent:= VerticalSplitter.Sides[<div class="int">0</div>]<div class="symbol">;</div><br />
Width:= Self.Width<div class="symbol">;</div><br />
Height:= VerticalSplitter.Position<div class="symbol">;</div><br />
align:= alClient<div class="symbol">;</div><br />
SplitterType:= pstHorizontal<div class="symbol">;</div><br />
Position:= <div class="int">125</div><div class="symbol">;</div><br />
<div class="key">end</div><div class="symbol">;</div><br />
<div></div><br />
LeftPanel:= TPanel.Create(Self)<div class="symbol">;</div><br />
<div class="key">with</div> (LeftPanel) <div class="key">do</div><br />
<div class="key">begin</div><br />
Parent:= HorizontalSplitter.Sides[<div class="int">0</div>]<div class="symbol">;</div><br />
Align:= alClient<div class="symbol">;</div><br />
<div class="key">end</div><div class="symbol">;</div><br />
<div></div><br />
MainPanel:= TPanel.Create(Self)<div class="symbol">;</div><br />
<div class="key">with</div> (MainPanel) <div class="key">do</div><br />
<div class="key">begin</div><br />
Parent:= HorizontalSplitter.Sides[<div class="int">1</div>]<div class="symbol">;</div><br />
Align:= alClient<div class="symbol">;</div><br />
Caption:= <div class="str">'Hello'</div><div class="symbol">;</div><br />
<div class="key">end</div><div class="symbol">;</div><br />
<div></div><br />
BottomPanel:= TPanel.Create(Self)<div class="symbol">;</div><br />
<div class="key">with</div> (BottomPanel) <div class="key">do</div><br />
<div class="key">begin</div><br />
Parent:= VerticalSplitter.Sides[<div class="int">1</div>]<div class="symbol">;</div><br />
Align:= alClient<div class="symbol">;</div><br />
<div class="key">end</div><div class="symbol">;</div><br />
<div class="key">end</div><div class="symbol">;</div><br />
|}<br />
<br />
Ako môžete vidieť, zmena pozostáva väčšinou z hierarchie. Ak vám lepšie vyhovuje práca s DFM, zmeny potrebné pre konverziu DFM->LFM sú podobné zmenám vyššie, ide o rovnaký typ zmien v Parent/Owner atď.<br />
Potom bude vyššie spomínaný príklad vyzerať takto nejako:<br />
{| class="code"<br />
|- <br />
| class="header" | Delphi DFM <div style="font-weight: normal">(exteranous values removed)</div><br />
| class="header" | Lazarus LFM <div style="font-weight: normal">(most width, height etc removed)</div><br />
|- class="code"<br />
| class="code" |<div class="key">object</div>VerticalSplitter: TSplitter<br />
Height <div class="symbol">=</div> <div class="int">3</div><br />
Cursor <div class="symbol">=</div> crVSplit<br />
Align <div class="symbol">=</div> alBottom<br />
<div class="key">end</div><br />
<div class="key">object</div> HorizontalSplitter: TSplitter<br />
Width <div class="symbol">=</div> <div class="int">3</div><br />
Align <div class="symbol">=</div> alLeft<br />
<div class="key">end</div><br />
<div class="key">object</div> BottomPanel: TPanel<br />
Height <div class="symbol">=</div> <div class="int">75</div><br />
Align <div class="symbol">=</div> alBottom<br />
<div class="key">end</div><br />
<div class="key">object</div> LeftPanel: TPanel<br />
Width <div class="symbol">=</div> <div class="int">125</div><br />
Align <div class="symbol">=</div> alLeft<br />
<div class="key">end</div><br />
<div class="key">object</div> MainPanel: TPanel<br />
Align <div class="symbol">=</div> alClient<br />
<div class="key">end</div> <br />
| class="code" |<div class="key">object</div> VerticalSplitter: TPairSplitter<br />
Align <div class="symbol">=</div> alClient<br />
SplitterType <div class="symbol">=</div> pstVertical<br />
Position <div class="symbol">=</div> <div class="int">225</div><br />
Height <div class="symbol">=</div> <div class="int">300</div><br />
Width <div class="symbol">=</div> <div class="int">400</div><br />
<div class="key">object</div> Pairsplitterside1: TPairSplitterIde<br />
<div class="key">object</div> HorizontalSplitter: TPairSplitter<br />
Align <div class="symbol">=</div> alClient<br />
Position <div class="symbol">=</div> <div class="int">125</div><br />
<div class="key">object</div> Pairsplitterside3: TPairSplitterIde<br />
Width <div class="symbol">=</div> <div class="int">125</div><br />
<div class="key">object</div> LeftPanel: TPanel<br />
Align <div class="symbol">=</div> alClient<br />
Width <div class="symbol">=</div> <div class="int">125</div><br />
<div class="key">end</div><br />
<div class="key">end</div><br />
<div class="key">object</div> Pairsplitterside4: TPairSplitterIde<br />
<div class="key">object</div> MainPanel: TPanel<br />
Align <div class="symbol">=</div> alClient<br />
<div class="key">end</div><br />
<div class="key">end</div><br />
<div class="key">end</div><br />
<div class="key">end</div><br />
<div class="key">object</div> Pairsplitterside2: TPairSplitterIde<br />
<div class="key">object</div> BottomPanel: TPanel<br />
Align <div class="symbol">=</div> alClient<br />
Height <div class="symbol">=</div> <div class="int">75</div>;<br />
<div class="key">end</div><br />
<div class="key">end</div><br />
<div class="key">end</div><br />
|}<br />
<br />
===TCustomTreeView/TTreeView===<br />
Oboje, VCL aj LCL, poskytujú komponent TCustomTreeView/TTreeView, používaný pre výpisy stromovej štruktúry dát s viacnásobnými uzlami, rozšíreným výberom a ImageList, a hoci skutočná funkčnosť je porovnateľná, nie všetky vlastnosti sú úplne kompatibilné. Hlavné rozdiely sú:<br />
'''Incomplete list, also update to include TCustomTreeView Mark functions and protected methods '''<br />
<br />
# LCL poskytuje TCustomTreeView.Options, množinu volieb, ktoré môžu byť nastavené na zmenu správania a vzhľadu prvku: <br />
#* tvoAllowMultiselect- nastavuje mód viacnásobného výberu uzlov, ekvivalent k TCustomTreeView.MultiSelect vo VCL VCL<br />
#* tvoAutoExpand- automatické rozbalenie uzlov, ekvivalent k TCustomTreeView.AutoExpand<br />
#* tvoAutoInsertMark- aktualizácia prípravy Drag pri prechode myšou. <br />
#* tvoAutoItemHeight- automatické prispôsobenie výšky prvku. <br />
#* tvoHideSelection- neoznačovať vybranú položku. <br />
#* tvoHotTrack- použitie HotTracking, ekvivalent k TCustomTreeview.HotTrack <br />
#* tvoKeepCollapsedNodes- pri zbalení uzla, uchováva podriadené uzly <br />
#* tvoReadOnly- ekvivalent k TCustomTreeview.ReadOnly <br />
#* tvoRightClickSelect- dovoľuje použiť pravé tlačítko myši na výber uzla, ekvivalent k TCustomTreeView.RightClickSelect <br />
#* tvoRowSelect- dovoľuje výber riadkov, ekvivalent k TCustomTreeView.RowSelect <br />
#* tvoShowButtons- zobrazuje tlačítka, ekvivalent k TCustomTreeView.ShowButtons <br />
#* tvoShowLines- zobrazuje čiary uzlov, ekvivalent k TCustomTreeView.ShowLines <br />
#* tvoShowRoot- zobrazuje root, ekvivalent k TCustomTreeView.ShowRoot <br />
#* tvoShowSeparators- zobrazuje oddeľovače <br />
#* tvoToolTips- zobrazuje samostatné tooltips pre uzly <br />
<br />
# LCL poskytuje dodatočné vlastnosti:<br />
#* udalosť TCustomTreeView.OnSelectionChange <br />
#* TCustomTreeView.DefaultItems, pre predvolené číslo položiek <br />
#* TCustomTreeView.ExpandSignType na určenie znamienka použitého na rozbaliteľných/zbaliteľných uzloch <br />
<br />
==Original Contributors and changes==<br />
This page has been converted from the epikwiki [http://lazarus-ccr.sourceforge.net/index.php?wiki=LazarusForDelphiUsers version].<br />
* Initial import and formatting - [[User:Tom | VlxAdmin]] 9/26/2003<br />
* Begin VCL -> LCL with a section on TSplitter -> TPairSplitter - [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson Andrew Johnson] 9/30/2003<br />
* Add TControl.Font/TControl.ParentFont to VCL -> LCL - [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson Andrew Johnson] 9/30/2003<br />
* Update TEdit/TCustomEdit section in VCL -> LCL - [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson Andrew Johnson] 10/1/2003<br />
* Add Control Dragging/Docking to VCL -> LCL - [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson Andrew Johnson] 10/1/2003<br />
* Added "Object Inspector" to Delphi IDE -> Lazarus IDE - [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson Andrew Johnson] 10/1/2003<br />
* Added initial "TCustomTreeView/TTreeView" to VCL -> LCL - [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson Andrew Johnson] 10/1/2003<br />
* Added introduction to VCL -> LCL - [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson Andrew Johnson] 10/1/2003<br />
* Fixed some typos - [[User:Vincent | Vincent]] 10/2/2003<br />
* Fixed Typo [[User:Kirkpatc]] 20 May 2004<br />
* Prvotný preklad z origánalu - [[User:Slavko|Slavko]] 01:18, 2 Apr 2005 (PST)</div>Slavkohttps://wiki.freepascal.org/index.php?title=Lazarus_For_Delphi_Users/sk&diff=26252Lazarus For Delphi Users/sk2008-01-11T17:31:52Z<p>Slavko: úprava formátovania</p>
<hr />
<div>{{Lazarus For Delphi Users}}<br />
<br />
Tento článok je pre tých, ktorí sú zainteresovaní v Lazarus a už poznajú Delphi. Popisuje rozdiely medzi týmito dvomi prostrediami. <br />
<br />
==Delphi -> Lazarus==<br />
Lazarus je Rapid Application Development (RAD) nástroj ako Delphi. To znamená, že prichádza s knižnicou vizuálnych komponentov a IDE. Knižnica komponentov Lazarus (LCL) sa veľmi podobá Delphi VCL. Väčšina jednotiek, tried a vlastností má rovnaké meno a funkciu, čím je prechod jednoduchý. Ale Lazarus nie je 'open source Delphi klon', tak neočakávajte 100% kompatibilitu.<br />
<br />
===Najväčšie rozdiely===<br />
Lazarus je úplný open source, je napísaný bez závislosti na platforme a používa silný prekladač FreePascal (FPC). FPC beží na viac ako 15 platformách, ale nie všetky balíčky a knižnice sú prenesené, tak Lazarus práve beží pod Linux, Free/Open/NetBSD, MacOSX a win32.<br />
<br />
Lazarus zatiaľ nie je kompletný, ako aj tento text. Stále hľadáme nových vývojárov, porterov, pisateľov dokumentácie, ... .<br />
<br />
==Delphi IDE -> Lazarus IDE==<br />
===Projekty===<br />
Základným súborom aplikácie Delphi je súbor .dpr. Základným súborom projektu Lazarus je súbor .lpi (Lazarus Project Information). Súbor .dpr je základný zdrojový kód programu a Delphi IDE v ňom uchováva niektoré informácie o direktívach prekladača a jednotkách. Aplikácia Lazarus má tiež súbor .lpr, ktorý je súborom so základným zdrojovým kódom, ale všetky ostatné informácie sú uchovávané v súbore .lpi. Teda, dôležitým súborom je súbor .lpi.<br />
<br />
Jedno dôležité pravidlo: '''Vždy existuje projekt!!!'''<br />
<br />
Jediný spôsob ako zatvoriť projekt je skončiť Lazarus alebo otvoriť iný projekt. To je preto, že projekt Lazarus je tiež "session". To znamená, že aktuálne nastavenia editora sú uchovávané v súbore .lpi a sú obnovené, keď otvoríte projekt. Napríklad: ladíte aplikáciu, nastavíte veľa ladiacich bodov a záložiek. Môžete projekt uložiť a zatvoriť Lazarus alebo otvoriť iný, ale keď znova otvoríte pôvodný, dokonca i na inom počítači, všetky vaše ladiace body, záložky, otvorené súbory, pozície kurzora, histórie skokov, ... sú obnovené.<br />
<br />
===Editor zdrojového kódu===<br />
(Source Editor)<br />
Takmer všetky klávesy a klávesové skratky môžu byť nastavené v Environment->Editor options->Key mappings<br />
<br />
IDE Lazarus má veľa nástrojov pre zdrojový kód. Mnohé z nich sú veľmi podobné tým v Delphi. Ale je tu jeden veľký rozdiel: Lazarus nepoužíva prekladač na získanie informácií o kóde, ale analyzuje priamo zdrojový kód, čo má veľa výhod:<br />
<br />
: Editor zdrojového kódu pracuje s komentármi. V Delphi sú komentáre len medzerou v kóde, funkcie kódu tu nepracujú a pri automatickom vložení kódu, sú vaše komentáre posunuté. Pod Lazarus môžete hľadať deklarácie dokonca v kóde komentára. Aj keď toto nie je úplne spoľahlivé, často to pracuje. A keď vložíte nový kód, používa IDE nejakú heuristiku na uchovanie komentára a kódu spolu. Napríklad: nebude rozdelený riadok "c: char; // comment".<br />
<br />
Dokončovanie kódu Delphi (Ctrl+Space) je pod Lazarus nazvané '''Identifier Completion'''. Termín Lazarus '''Code Completion''' je funkcia, ktorá kombinuje '''Automatic Class Completion''' (rovnaká ako v Delphi), '''Local Variable Completion''' a '''Event Assignment Completion'''. Tieto všetky sú vyvolané pomocou Ctrl+Shift+C a IDE určuje podľa pozície kurzora, ktorá funkcia bude použitá.<br />
<br />
====Dokončovanie lokálnych premenných====<br />
(Local Variable Completion)<br />
Predstavte si, že ste práve vytvorili novú metódu a napísali príkaz "i:=3;"<br />
<pascal>procedure<br />
TForm1.DoSomething; <br />
begin<br />
i := 3; <br />
end;</pascal><br />
<br />
Umiestnite kurzor nad identifikátor "i" a stlačte Ctrl+Shift+C, čím získate:<br />
<pascal>procedure<br />
TForm1.DoSomething; <br />
var<br />
i: Integer; <br />
begin<br />
i:= 3; <br />
end;</pascal><br />
<br />
====Dokončovanie priradenia udalostí====<br />
(Event Assignment Completion)<br />
Príjemná funkcia Inšpektora objektov je automatické vytváranie metód. To isté môžete urobiť v editore zdrojového kódu.<br />
Napríklad:<br />
: Button1.OnClick:=<br />
Umiestnite kurzor za operátor priradenia ":=" a stlačte Ctrl+Shift+C.<br />
<br />
====Dokončovanie slov====<br />
(Word Completion Ctrl+W)<br />
Táto funkcia je odstupná po stlačení Ctrl+W. Pracuje podobne ako "Identifier Completion", ale nepracuje len s identifikátormi Pascalu, ale so všetkými slovami. Dovolí vám vybrať zo všetkých slov zo všetkých otvorených súborov začínajúcich rovnakými písmenami.<br />
<br />
====Include súborov====<br />
Delphi túto podporu nemá a tak ste pravdepodobne veľa takýchto súborov nevytvorili. Ale include súbory majú veľkú výhodu: Dovoľujú písanie na platforme (ne)závislý kód bez komplikovanosti vášho kódu s direktívami IFDEF.<br />
<br />
Napríklad: Method jumping, Class Completion, Find declaration, .. všetky pracujú s include súbormi.<br />
<br />
Pre nastavenie dokončovania kódu je k dispozícii veľa nastavení.<br />
<br />
===Designer===<br />
- Guidelines<br />
<br />
====Object Inspector====<br />
Ako v IDE Delphi aj v IDE Lazarus je Inšpektor objektov použitý na úpravu vlastností komponentov, priradenie udalostí atď. Nasledujú niektoré malé rozdiely, na ktoré treba pri použití pamätať:<br />
# Počnúc Delphi 5, je Object Treeview, ktorý môže byť použitý na navigáciu a výber objektov podľa ich hierarchie, ako doplnok tradičného rozbaľovacieho zoznamu v Inšpektore objektov. V Lazarus je toto súčasťou Inšpektora objektov a jeho použitím namiesto predvoleného rozbaľovacieho zoznamu môžete vybrať jeho ne/použitie pomocou kontextového menu "Show Component Tree" <br />
# V Delphi dvojité kliknutie na prázdnu udalosť ju automaticky vytvorí a otvorí Editor zdrojového kódu na jej pozícii, v Lazarus je tlačítko napravo od rozbaľovacieho zoznamu, ktoré vykoná to isté. <br />
# V Delphi musíte ručne zmazať meno udalosti v políčku, aby ste odstránili priradenie, v Lazarus zvoľte v zozname "(None)".<br />
# Podobne ako pri udalostiach, dvojitým kliknutím na regulárne vlastnosti (napr. Boolean) nezmení ich hodnotu, ale musíte ju zvoliť zo zoznamu a na otvorenie ich predvoleného editora, musíte kliknúť na tlačítko vpravo od rozbaľovacieho zoznamu.<br />
<br />
====Balíčky====<br />
V Lazarus nemôžete inštalovať balíčky Delphi, pretože potrebujú čary prekladača Delphi. Preto pre Lazarus potrebujete špeciálne vytvorené balíčky.<br />
<br />
Vytvorte nový balíček, uložte ho v zdrojovom adresári balíčkov (bežne rovnaký adresár súboru .dpk), pridajte LCL ako vyžadovaný balíček a nakoniec pridajte súbory .pas. Teraz ho môžete nainštalovať alebo použiť vo svojom projekte. Medzi balíčkami Lazarus a Delphi sú rozdiely, prečítajte si prosím docs/Packages.txt v zdrojovom kóde Lazarus.<br />
- viď docs/Packages.txt v zdrojovom kóde Lazarus.<br />
<br />
===VCL -> LCL===<br />
Hoci obe, VCL aj LCL, slúžia rovnakému cieľu - Objektovo orientovanej hierarchii komponentov hlavnému motoru pre rýchly vývoj aplikácií (RAD), nie sú identické. Napríklad, kým VCL poskytuje veľa nevizuálnych komponentov, LCL sa pokúša poskytovať len vizuálne, kým väčšina nevizuálnych komponentov (ako db access) sú poskytované pomocou FCL, zahrnutej vo FreePascal.<br />
<br />
Takže veľa prvkov VCL nemusí existovať v LCL, alebo naopak, alebo dokonca keď prvky existujú v oboch, nie sú to klony a musíte urobiť pri prenose zmeny v aplikácii, komponentoch a prvkoch.<br />
<br />
Nasledujúci text sa pokúša poskytnúť čo najúplnejší popis hlavných rozdielov a nekompatibility medzi nimi, pre užívateľov Delphi. Popisuje najmä rozdiely VCL v D4, ale i D5, D6 alebo D7; s aktuálnou LCL, ako je v CVS. Takže nemusí byť vždy presne k verzii, ktorú používate alebo úplne súhlasiť s aktuálnym LCL, ktorý máte. Ak uvidíte rozdiely medzi nasledujúcim textom a LCL ako je v CVS, alebo svojim Delphi kľudne sa pripojte a zmeňte to tak, aby ste prispeli k úplnosti pre všetkých ľudí.<br />
<br />
====TControl.Font/TControl.ParentFont====<br />
Vo VCL je pre prvky úplne bežné použiť presné meno fontu a vlastností fontu ako bold a italics a očakávanie tejto hodnoty bude vždy nasledovať. Ďalej je poskytnutá vlastnosť TControl.ParentFont, ktorá zaisťuje, že prvok sa bude vždy riadiť svojim rodičovským fontom. Opäť, implicitná domnienka je, že tieto hodnoty budú vždy nasledované, dokonca nedbajúc nastavenia Windows Apearance. <br />
<br />
Toto nie je vždy pravda v LCL, ani byť nemôže. LCL je cross-platform/cross-interface od začiatku preferuje vyvážené nastavenie a bude sa vždy pokúšať nastaviť Desktop/Toolkit Apearance alebo nastavenú Tému na všetkých nástrojoch. Napríklad, ak používate rozhranie GTK a téma GTK poskytuje konkrétny font pre tlačítka, potom sa tlačítka LCL budú vždy pokúšať použiť tento font.<br />
<br />
To znamená, že väčšina prvkov LCL nemá rovnakú úroveň návrhu prvku, ktorá je často predpokladaná vo VCL, skôr len tie vlastné prvky, ktoré sú kreslené Canvas miesto pridelené rozhraním môžu byť modifikované týmto spôsobom, nedbajúcim na použité rozhranie.<br />
<br />
Ak je napríklad potrebný Label s fontom bold/special color, musíte použiť TStaticText, keďže TLabel je špecifický prvok rozhrania a všetky rozhrania sú poskytnuté v pôvodnej verzii a mnoho z nich bude mať predvolené nastavenia, ktoré budú použité.<br />
<br />
====Control Dragging/Docking====<br />
Vo VCL väčšina (Win) prvkov implementuje metódy a spätné funkcie pre obsluhovanie preťahovania a dokovania prvkov, napríklad preťahovanie prvku z jedného panela a jeho dokovanie do iného panely v dobe behu programu.<br />
<br />
Táto funkcia nie je teraz implementovaná/dokončená v LCL, hoci teraz je v počiatočnom štádiu plánovania a bude eventuálne podporovať nejakú úroveň kompatibility tohto typu správania, ak nie dokonca presne rovnaké.<br />
<br />
Toto aktuálne znamená, že prvky nemôžu dediť/používať nasledujúce funkcie, procedúry, vlastnosti a udalosti TControl:<br />
<br />
<delphi>protected<br />
function GetDockEdge(MousePos: TPoint): TAlign; <br />
function GetDragImages: TDragImageList; <br />
function GetFloating: Boolean; <br />
function GetFloatingDockSiteClass: TWinControlClass; <br />
procedure DoEndDrag(Target:TObject); X, Y: Integer); <br />
procedure DockTrackNoTarget(Source: TDragDockObject; X, Y: Integer); <br />
procedure DoEndDock(Target: TObject; X, Y: Integer); <br />
procedure DoDock(NewDockSite: TWinControl; var ARect: TRect); <br />
procedure DoStartDock(var DragObject: TDragObject); <br />
procedure DragCanceled; <br />
procedure DragOver(Source: TObject; X, Y: Integer; State: TDragState; <br />
var Accept: Boolean); <br />
procedure DoEndDrag(Target: TObject; X, Y: Integer); <br />
procedure DoStartDrag(var DragObject: TDragObject); <br />
procedure DrawDragDockImage(DragDockObject: TDragDockObject); <br />
procedure EraseDragDockImage(DragDockObject: TDragDockObject); <br />
procedure PositionDockRect(DragDockObject: TDragDockObject); <br />
procedure SetDragMode(Value: TDragMode); <br />
property DragKind: TDragKind; <br />
property DragCursor: TCursor; <br />
property DragMode: TDragMode; <br />
property OnDragDrop: TDragDropEvent; <br />
property OnDragOver: TDragOverEvent; <br />
property OnEndDock: TEndDragEvent; <br />
property OnEndDrag: TEndDragEvent; <br />
property OnStartDock: TStartDockEvent; <br />
property OnStartDrag: TStartDragEvent; <br />
public <br />
function Dragging: Boolean; <br />
function ManualDock(NewDockSite: TWinControl; DropControl: TControl; <br />
ControlSide: TAlign): Boolean; <br />
function ManualFloat(ScreenPos: TRect): Boolean; <br />
function ReplaceDockedControl(Control: TControl; NewDockSite: TWinControl; <br />
DropControl: TControl; ControlSide: TAlign): Boolean; <br />
procedure BeginDrag(Immediate: Boolean; Threshold: Integer); <br />
procedure Dock(NewDockSite: TWinControl; ARect: TRect); <br />
procedure DragDrop(Source: TObject; X, Y: Integer); <br />
procedure EndDrag(Drop: Boolean); <br />
property DockOrientation: TDockOrientation; <br />
property Floating: Boolean; <br />
property FloatingDockSiteClass: TWinControlClass; <br />
property HostDockSite: TWinControl; <br />
property LRDockWidth: Integer; <br />
property TBDockHeight: Integer; <br />
property UndockHeight: Integer; <br />
property UndockWidth: Integer;</delphi><br />
<br />
a že nasledujúce triedy neexistujú alebo sú nepoužiteľné:<br />
<br />
<delphi>TDragImageList = class (TCustomImageList) <br />
TDockZone = class<br />
TDockTree = class (TInterfacedObject, IDockManager) <br />
TDragObject = class (TObject) <br />
TBaseDragControlObject = class (TDragObject) <br />
TDragControlObject = class (TBaseDragControlObject) <br />
TDragDockObject = class (TBaseDragControlObject)</delphi><br />
<br />
a že nasledujúce funkcie sú tiež neexistujúce/nepoužiteľné:<br />
<br />
<delphi>function FindDragTarget(const Pos: TPoint; AllowDisabled: Boolean) : TControl; <br />
procedure CancelDrag; <br />
function IsDragObject(sender: TObject): Boolean;</delphi><br />
<br />
====TEdit/TCustomEdit====<br />
Prvky Edit, kým základné funkcie sú rovnaké ako vo VCL, nemajú niektoré výstupy v konverzii:<br />
# kvôli obmedzeniam rozhraní, TEdit.PasswordChar zatiaľ nepracuje vo všetkých rozhraniach (neskôr možno), namiesto toho použite TCustomEdit.EchoMode emPassword v udalosti na skrytie textu. <br />
# Udalosti OnDrag/Dock zatiaľ nie sú implementované. Viz [LazarusForDelphiUsers#Control Dragging/Docking|Control Dragging/Docking].<br />
# Vlastnosti Font sú zvyč¨ ajne ignorované kvôli správaniu rozhrania. Viz [[#TControl.Font/TControl.ParentFont | TControl.Font/TControl.ParentFont]]<br />
<br />
===TSplitter -> TPairSplitter===<br />
'''Please Improve Me'''<br />
<br />
V LCL existuje prvok TSplitter, tak ho netreba konvertovať, napriek tomu ho chcem trochu vysvetliť:<br />
<br />
Vo VCL, "Splitting" prvkov, čo je ošetrením, ktoré umožňuje preťahovanie medzi dvomi komponentmi na získanie viac/menej miesta pre jeden na úkor ostatných, je urobený pomocou TSplitter. Často to môžete vidieť, napríklad v IDE Delphi medzi dokovaným Code Explorer a Source Viewer. <br />
<br />
LCL poskytuje svoj vlastný prvok, nazvaný TPairSplitter, ktorý obsluhuje rovnakú úlohu, avšak nie je kompatibilný, tak "skúšanie" preruší VCL kód alebo bude potrebný Delphi DFM pri prenose kódu.<br />
<br />
;V čom presne sú rozdiely?<br />
Najväčšie rozdiely sú, že VCL TSplitter nemá potomkov, namiesto toho ho umiestňujete medzi dva prvky, ktoré sú správne usporiadané a dovoľuje meniť ich veľkosť za behu programu, nedbajúc na vlastnú veľkosť. Prvky musia byť správne usporiadané, napríklad Panel a Splitter s Aligned Left a druhý Panel Aligned Client. Za behu programu môžete zmeniť rozloženie panelov pomocou preťahovania ošetreného pomocou prvku Splitter.<br />
<br />
V LCL je však TPairSplitter špeciálnym typom prvku s dvomi panelmi a môže byť užitočný len ak prvky na presúvanie sú na týchto paneloch, ale posúvanie bude jednako vykonané medzi týmito panelmi, i keď na nich nebude nič. Ako v predchádzajúcom príklade, potrebujete formulár s TPairSplitter Aligned Client a Panel Aligned Client na jeho ľavej strane a Panel Aligned Client na jeho pravej strane.<br />
<br />
Iným dôležitým rozdielom je, že vo VCL, keďže TSplitter je svoj vlastný TControl, tak jeho pozícia pri zmene veľkosti je uchovávaná relatívne k ostatným prvkom, tak napríklad klientský panel sa bude zväčšovať, kým ostatné panely nie, tým je pozícia rozdelenia relatívna k zarovnaniu rozdeľovaných prvkov.<br />
<br />
V LCL sú bočné panely samostatné, potom TPairSplitter má vlastnosť Position, ktorá je absolútne relatívna k vrcholu Top alebo Left. Tak pri zmene veľkosti aktuálna sa pozícia nemení podľa obsahu, tak musí byť nastavené spätné volanie na zaistenie uchovania pomeru, ak je to dôležité.<br />
<br />
Napríklad, ak pravá strana vertikálneho rozdelenia musí mať správanie ako alClient, potrebujete zmeniť spätným volaním veľkosť formulára, napríklad takto:<br />
<br />
PairSplitter.Position := PairSplitter.Width - PairSplitter.Position; <br />
<br />
;Teda ako môžem konvertovať existujúci kód používajúci TSplitter na TPairSplitter?<br />
Ak sú splitter a prvky vytvorené vo vnútri aktuálnej funkcie (ako OnCreate formulára), konverzia nebude zložitá, najprv zreorganizujeme kód na vytvorenie prvkov v poradí novej hierarchie a nastavíme rodičov podriadených prvkov pre rozdelenie na ľavý/horný a pravý/dolný podiel prvku PairSplitter. Napríklad:<br />
{| class="code"<br />
|- <br />
| class="header" | VCL || class="header" | LCL<br />
|- class="code"<br />
| class="code" |<div class="key">var</div><br />
BottomPanel: TPanel<div class="symbol">;</div><br />
<div></div><br />
VerticalSplitter: TSplitter<div class="symbol">;</div><br />
LeftPanel: TPanel<div class="symbol">;</div><br />
HorizontalSplitter: TSplitter<div class="symbol">;</div><br />
<div></div><br />
MainPanel: TPanel<div class="symbol">;</div><br />
<div class="key">begin</div><br />
BottomPanel:= TPanel.Create(Self)<div class="symbol">;</div><br />
<div class="key">with</div> (BottomPanel) <div class="key">do</div><br />
<div class="key">begin</div><br />
Parent:= Self<div class="symbol">;</div><br />
Height:= <div class="int">75</div><div class="symbol">;</div><br />
Align:= alBottom<div class="symbol">;</div><br />
<div class="key">end</div><div class="symbol">;</div><br />
<div></div><br />
VerticalSplitter:= TSplitter.Create(Self)<div class="symbol">;</div><br />
<div class="key">with</div> (VerticalSplitter) <div class="key">do</div><br />
<div class="key">begin</div><br />
Parent:= Self<div class="symbol">;</div><br />
Align:= alBottom<div class="symbol">;</div><br />
<div class="key">end</div><div class="symbol">;</div><br />
<div></div><br />
HorizontalSplitter:= TSplitter.Create(Self)<div class="symbol">;</div><br />
<div class="key">with</div> (HorizontalSplitter) <div class="key">do</div><br />
<div class="key">begin</div><br />
Parent:= Self<div class="symbol">;</div><br />
align:= alLeft<div class="symbol">;</div><br />
<div class="key">end</div><div class="symbol">;</div><br />
<div></div><br />
LeftPanel:= TPanel.Create(Self)<div class="symbol">;</div><br />
<div class="key">with</div> (LeftPanel) <div class="key">do</div><br />
<div class="key">begin</div><br />
Parent:= Self<div class="symbol">;</div><br />
Width:= <div class="int">125</div><div class="symbol">;</div><br />
Align:= alLeft<div class="symbol">;</div><br />
<div class="key">end</div><div class="symbol">;</div><br />
<div></div><br />
MainPanel:= TPanel.Create(Self)<div class="symbol">;</div><br />
<div class="key">with</div> (MainPanel) <div class="key">do</div><br />
<div class="key">begin</div><br />
Parent:= Self<div class="symbol">;</div><br />
Align:= alClient<div class="symbol">;</div><br />
Caption:= <div class="str">'Hello'</div><div class="symbol">;</div><br />
<div class="key">end</div><div class="symbol">;</div><br />
<div class="key">end</div>; <br />
| class="code" | <div class="key">var</div><br />
BottomPanel: TPanel<div class="symbol">;</div><br />
<div></div><br />
VerticalSplitter: TPairSplitter<div class="symbol">;</div><br />
LeftPanel: TPanel<div class="symbol">;</div><br />
HorizontalSplitter: TPairSplitter<div class="symbol">;</div><br />
<div></div><br />
MainPanel: TPanel<div class="symbol">;</div><br />
<div class="key">begin</div><br />
VerticalSplitter:= TPairSplitter.Create(Self)<div class="symbol">;</div><br />
<div class="key">with</div> (VerticalSplitter) <div class="key">do</div><br />
<div class="key">begin</div><br />
Parent:= Self<div class="symbol">;</div><br />
Align:= alClient<div class="symbol">;</div><br />
Width:= Self.Width<div class="symbol">;</div><br />
Height:= Self.Height<div class="symbol">;</div><br />
SplitterType:= pstVertical<div class="symbol">;</div><br />
Position:= Height - <div class="int">75</div><div class="symbol">;</div><br />
Sides[<div class="int">0</div>].Width:= Width<div class="symbol">;</div><br />
Sides[<div class="int">0</div>].Height:= Position<div class="symbol">;</div><br />
<div class="key">end</div><div class="symbol">;</div><br />
<div></div><br />
HorizontalSplitter:= TPairSplitter.Create(Self)<div class="symbol">;</div><br />
<div class="key">with</div> (HorizontalSplitter) <div class="key">do</div><br />
<div class="key">begin</div><br />
Parent:= VerticalSplitter.Sides[<div class="int">0</div>]<div class="symbol">;</div><br />
Width:= Self.Width<div class="symbol">;</div><br />
Height:= VerticalSplitter.Position<div class="symbol">;</div><br />
align:= alClient<div class="symbol">;</div><br />
SplitterType:= pstHorizontal<div class="symbol">;</div><br />
Position:= <div class="int">125</div><div class="symbol">;</div><br />
<div class="key">end</div><div class="symbol">;</div><br />
<div></div><br />
LeftPanel:= TPanel.Create(Self)<div class="symbol">;</div><br />
<div class="key">with</div> (LeftPanel) <div class="key">do</div><br />
<div class="key">begin</div><br />
Parent:= HorizontalSplitter.Sides[<div class="int">0</div>]<div class="symbol">;</div><br />
Align:= alClient<div class="symbol">;</div><br />
<div class="key">end</div><div class="symbol">;</div><br />
<div></div><br />
MainPanel:= TPanel.Create(Self)<div class="symbol">;</div><br />
<div class="key">with</div> (MainPanel) <div class="key">do</div><br />
<div class="key">begin</div><br />
Parent:= HorizontalSplitter.Sides[<div class="int">1</div>]<div class="symbol">;</div><br />
Align:= alClient<div class="symbol">;</div><br />
Caption:= <div class="str">'Hello'</div><div class="symbol">;</div><br />
<div class="key">end</div><div class="symbol">;</div><br />
<div></div><br />
BottomPanel:= TPanel.Create(Self)<div class="symbol">;</div><br />
<div class="key">with</div> (BottomPanel) <div class="key">do</div><br />
<div class="key">begin</div><br />
Parent:= VerticalSplitter.Sides[<div class="int">1</div>]<div class="symbol">;</div><br />
Align:= alClient<div class="symbol">;</div><br />
<div class="key">end</div><div class="symbol">;</div><br />
<div class="key">end</div><div class="symbol">;</div><br />
|}<br />
<br />
Ako môžete vidieť, zmena pozostáva väčšinou z hierarchie. Ak vám lepšie vyhovuje práca s DFM, zmeny potrebné pre konverziu DFM->LFM sú podobné zmenám vyššie, ide o rovnaký typ zmien v Parent/Owner atď.<br />
Potom bude vyššie spomínaný príklad vyzerať takto nejako:<br />
{| class="code"<br />
|- <br />
| class="header" | Delphi DFM <div style="font-weight: normal">(exteranous values removed)</div><br />
| class="header" | Lazarus LFM <div style="font-weight: normal">(most width, height etc removed)</div><br />
|- class="code"<br />
| class="code" |<div class="key">object</div>VerticalSplitter: TSplitter<br />
Height <div class="symbol">=</div> <div class="int">3</div><br />
Cursor <div class="symbol">=</div> crVSplit<br />
Align <div class="symbol">=</div> alBottom<br />
<div class="key">end</div><br />
<div class="key">object</div> HorizontalSplitter: TSplitter<br />
Width <div class="symbol">=</div> <div class="int">3</div><br />
Align <div class="symbol">=</div> alLeft<br />
<div class="key">end</div><br />
<div class="key">object</div> BottomPanel: TPanel<br />
Height <div class="symbol">=</div> <div class="int">75</div><br />
Align <div class="symbol">=</div> alBottom<br />
<div class="key">end</div><br />
<div class="key">object</div> LeftPanel: TPanel<br />
Width <div class="symbol">=</div> <div class="int">125</div><br />
Align <div class="symbol">=</div> alLeft<br />
<div class="key">end</div><br />
<div class="key">object</div> MainPanel: TPanel<br />
Align <div class="symbol">=</div> alClient<br />
<div class="key">end</div> <br />
| class="code" |<div class="key">object</div> VerticalSplitter: TPairSplitter<br />
Align <div class="symbol">=</div> alClient<br />
SplitterType <div class="symbol">=</div> pstVertical<br />
Position <div class="symbol">=</div> <div class="int">225</div><br />
Height <div class="symbol">=</div> <div class="int">300</div><br />
Width <div class="symbol">=</div> <div class="int">400</div><br />
<div class="key">object</div> Pairsplitterside1: TPairSplitterIde<br />
<div class="key">object</div> HorizontalSplitter: TPairSplitter<br />
Align <div class="symbol">=</div> alClient<br />
Position <div class="symbol">=</div> <div class="int">125</div><br />
<div class="key">object</div> Pairsplitterside3: TPairSplitterIde<br />
Width <div class="symbol">=</div> <div class="int">125</div><br />
<div class="key">object</div> LeftPanel: TPanel<br />
Align <div class="symbol">=</div> alClient<br />
Width <div class="symbol">=</div> <div class="int">125</div><br />
<div class="key">end</div><br />
<div class="key">end</div><br />
<div class="key">object</div> Pairsplitterside4: TPairSplitterIde<br />
<div class="key">object</div> MainPanel: TPanel<br />
Align <div class="symbol">=</div> alClient<br />
<div class="key">end</div><br />
<div class="key">end</div><br />
<div class="key">end</div><br />
<div class="key">end</div><br />
<div class="key">object</div> Pairsplitterside2: TPairSplitterIde<br />
<div class="key">object</div> BottomPanel: TPanel<br />
Align <div class="symbol">=</div> alClient<br />
Height <div class="symbol">=</div> <div class="int">75</div>;<br />
<div class="key">end</div><br />
<div class="key">end</div><br />
<div class="key">end</div><br />
|}<br />
<br />
===TCustomTreeView/TTreeView===<br />
Oboje, VCL aj LCL, poskytujú komponent TCustomTreeView/TTreeView, používaný pre výpisy stromovej štruktúry dát s viacnásobnými uzlami, rozšíreným výberom a ImageList, a hoci skutočná funkčnosť je porovnateľná, nie všetky vlastnosti sú úplne kompatibilné. Hlavné rozdiely sú:<br />
'''Incomplete list, also update to include TCustomTreeView Mark functions and protected methods '''<br />
<br />
# LCL poskytuje TCustomTreeView.Options, množinu volieb, ktoré môžu byť nastavené na zmenu správania a vzhľadu prvku: <br />
#* tvoAllowMultiselect- nastavuje mód viacnásobného výberu uzlov, ekvivalent k TCustomTreeView.MultiSelect vo VCL VCL<br />
#* tvoAutoExpand- automatické rozbalenie uzlov, ekvivalent k TCustomTreeView.AutoExpand<br />
#* tvoAutoInsertMark- aktualizácia prípravy Drag pri prechode myšou. <br />
#* tvoAutoItemHeight- automatické prispôsobenie výšky prvku. <br />
#* tvoHideSelection- neoznačovať vybranú položku. <br />
#* tvoHotTrack- použitie HotTracking, ekvivalent k TCustomTreeview.HotTrack <br />
#* tvoKeepCollapsedNodes- pri zbalení uzla, uchováva podriadené uzly <br />
#* tvoReadOnly- ekvivalent k TCustomTreeview.ReadOnly <br />
#* tvoRightClickSelect- dovoľuje použiť pravé tlačítko myši na výber uzla, ekvivalent k TCustomTreeView.RightClickSelect <br />
#* tvoRowSelect- dovoľuje výber riadkov, ekvivalent k TCustomTreeView.RowSelect <br />
#* tvoShowButtons- zobrazuje tlačítka, ekvivalent k TCustomTreeView.ShowButtons <br />
#* tvoShowLines- zobrazuje čiary uzlov, ekvivalent k TCustomTreeView.ShowLines <br />
#* tvoShowRoot- zobrazuje root, ekvivalent k TCustomTreeView.ShowRoot <br />
#* tvoShowSeparators- zobrazuje oddeľovače <br />
#* tvoToolTips- zobrazuje samostatné tooltips pre uzly <br />
<br />
# LCL poskytuje dodatočné vlastnosti:<br />
#* udalosť TCustomTreeView.OnSelectionChange <br />
#* TCustomTreeView.DefaultItems, pre predvolené číslo položiek <br />
#* TCustomTreeView.ExpandSignType na určenie znamienka použitého na rozbaliteľných/zbaliteľných uzloch <br />
<br />
==Original Contributors and changes==<br />
This page has been converted from the epikwiki [http://lazarus-ccr.sourceforge.net/index.php?wiki=LazarusForDelphiUsers version].<br />
* Initial import and formatting - [[User:Tom | VlxAdmin]] 9/26/2003<br />
* Begin VCL -> LCL with a section on TSplitter -> TPairSplitter - [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson Andrew Johnson] 9/30/2003<br />
* Add TControl.Font/TControl.ParentFont to VCL -> LCL - [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson Andrew Johnson] 9/30/2003<br />
* Update TEdit/TCustomEdit section in VCL -> LCL - [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson Andrew Johnson] 10/1/2003<br />
* Add Control Dragging/Docking to VCL -> LCL - [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson Andrew Johnson] 10/1/2003<br />
* Added "Object Inspector" to Delphi IDE -> Lazarus IDE - [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson Andrew Johnson] 10/1/2003<br />
* Added initial "TCustomTreeView/TTreeView" to VCL -> LCL - [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson Andrew Johnson] 10/1/2003<br />
* Added introduction to VCL -> LCL - [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson Andrew Johnson] 10/1/2003<br />
* Fixed some typos - [[User:Vincent | Vincent]] 10/2/2003<br />
* Fixed Typo [[User:Kirkpatc]] 20 May 2004<br />
* Prvotný preklad z origánalu - [[User:Slavko|Slavko]] 01:18, 2 Apr 2005 (PST)</div>Slavkohttps://wiki.freepascal.org/index.php?title=Lazarus_For_Delphi_Users/sk&diff=26251Lazarus For Delphi Users/sk2008-01-11T17:21:01Z<p>Slavko: úprava formátovania</p>
<hr />
<div>{{Lazarus For Delphi Users}}<br />
<br />
Tento článok je pre tých, ktorí sú zainteresovaní v Lazarus a už poznajú Delphi. Popisuje rozdiely medzi týmito dvomi prostrediami. <br />
<br />
==Delphi -> Lazarus==<br />
Lazarus je Rapid Application Development (RAD) nástroj ako Delphi. To znamená, že prichádza s knižnicou vizuálnych komponentov a IDE. Knižnica komponentov Lazarus (LCL) sa veľmi podobá Delphi VCL. Väčšina jednotiek, tried a vlastností má rovnaké meno a funkciu, čím je prechod jednoduchý. Ale Lazarus nie je 'open source Delphi klon', tak neočakávajte 100% kompatibilitu.<br />
<br />
===Najväčšie rozdiely===<br />
Lazarus je úplný open source, je napísaný bez závislosti na platforme a používa silný prekladač FreePascal (FPC). FPC beží na viac ako 15 platformách, ale nie všetky balíčky a knižnice sú prenesené, tak Lazarus práve beží pod Linux, Free/Open/NetBSD, MacOSX a win32.<br />
<br />
Lazarus zatiaľ nie je kompletný, ako aj tento text. Stále hľadáme nových vývojárov, porterov, pisateľov dokumentácie, ... .<br />
<br />
==Delphi IDE -> Lazarus IDE==<br />
===Projekty===<br />
Základným súborom aplikácie Delphi je súbor .dpr. Základným súborom projektu Lazarus je súbor .lpi (Lazarus Project Information). Súbor .dpr je základný zdrojový kód programu a Delphi IDE v ňom uchováva niektoré informácie o direktívach prekladača a jednotkách. Aplikácia Lazarus má tiež súbor .lpr, ktorý je súborom so základným zdrojovým kódom, ale všetky ostatné informácie sú uchovávané v súbore .lpi. Teda, dôležitým súborom je súbor .lpi.<br />
<br />
Jedno dôležité pravidlo: '''Vždy existuje projekt!!!'''<br />
<br />
Jediný spôsob ako zatvoriť projekt je skončiť Lazarus alebo otvoriť iný projekt. To je preto, že projekt Lazarus je tiež "session". To znamená, že aktuálne nastavenia editora sú uchovávané v súbore .lpi a sú obnovené, keď otvoríte projekt. Napríklad: ladíte aplikáciu, nastavíte veľa ladiacich bodov a záložiek. Môžete projekt uložiť a zatvoriť Lazarus alebo otvoriť iný, ale keď znova otvoríte pôvodný, dokonca i na inom počítači, všetky vaše ladiace body, záložky, otvorené súbory, pozície kurzora, histórie skokov, ... sú obnovené.<br />
<br />
===Editor zdrojového kódu===<br />
(Source Editor)<br />
Takmer všetky klávesy a klávesové skratky môžu byť nastavené v Environment->Editor options->Key mappings<br />
<br />
IDE Lazarus má veľa nástrojov pre zdrojový kód. Mnohé z nich sú veľmi podobné tým v Delphi. Ale je tu jeden veľký rozdiel: Lazarus nepoužíva prekladač na získanie informácií o kóde, ale analyzuje priamo zdrojový kód, čo má veľa výhod:<br />
<br />
: Editor zdrojového kódu pracuje s komentármi. V Delphi sú komentáre len medzerou v kóde, funkcie kódu tu nepracujú a pri automatickom vložení kódu, sú vaše komentáre posunuté. Pod Lazarus môžete hľadať deklarácie dokonca v kóde komentára. Aj keď toto nie je úplne spoľahlivé, často to pracuje. A keď vložíte nový kód, používa IDE nejakú heuristiku na uchovanie komentára a kódu spolu. Napríklad: nebude rozdelený riadok "c: char; // comment".<br />
<br />
Dokončovanie kódu Delphi (Ctrl+Space) je pod Lazarus nazvané '''Identifier Completion'''. Termín Lazarus '''Code Completion''' je funkcia, ktorá kombinuje '''Automatic Class Completion''' (rovnaká ako v Delphi), '''Local Variable Completion''' a '''Event Assignment Completion'''. Tieto všetky sú vyvolané pomocou Ctrl+Shift+C a IDE určuje podľa pozície kurzora, ktorá funkcia bude použitá.<br />
<br />
====Dokončovanie lokálnych premenných====<br />
(Local Variable Completion)<br />
Predstavte si, že ste práve vytvorili novú metódu a napísali príkaz "i:=3;"<br />
<pascal>procedure<br />
TForm1.DoSomething; <br />
begin<br />
i := 3; <br />
end;</pascal><br />
<br />
Umiestnite kurzor nad identifikátor "i" a stlačte Ctrl+Shift+C, čím získate:<br />
<pascal>procedure<br />
TForm1.DoSomething; <br />
var<br />
i: Integer; <br />
begin<br />
i:= 3; <br />
end;</pascal><br />
<br />
====Dokončovanie priradenia udalostí====<br />
(Event Assignment Completion)<br />
Príjemná funkcia Inšpektora objektov je automatické vytváranie metód. To isté môžete urobiť v editore zdrojového kódu.<br />
Napríklad:<br />
: Button1.OnClick:=<br />
Umiestnite kurzor za operátor priradenia ":=" a stlačte Ctrl+Shift+C.<br />
<br />
====Dokončovanie slov====<br />
(Word Completion Ctrl+W)<br />
Táto funkcia je odstupná po stlačení Ctrl+W. Pracuje podobne ako "Identifier Completion", ale nepracuje len s identifikátormi Pascalu, ale so všetkými slovami. Dovolí vám vybrať zo všetkých slov zo všetkých otvorených súborov začínajúcich rovnakými písmenami.<br />
<br />
====Include súborov====<br />
Delphi túto podporu nemá a tak ste pravdepodobne veľa takýchto súborov nevytvorili. Ale include súbory majú veľkú výhodu: Dovoľujú písanie na platforme (ne)závislý kód bez komplikovanosti vášho kódu s direktívami IFDEF.<br />
<br />
Napríklad: Method jumping, Class Completion, Find declaration, .. všetky pracujú s include súbormi.<br />
<br />
Pre nastavenie dokončovania kódu je k dispozícii veľa nastavení.<br />
<br />
===Designer===<br />
- Guidelines<br />
<br />
====Object Inspector====<br />
Ako v IDE Delphi aj v IDE Lazarus je Inšpektor objektov použitý na úpravu vlastností komponentov, priradenie udalostí atď. Nasledujú niektoré malé rozdiely, na ktoré treba pri použití pamätať:<br />
# Počnúc Delphi 5, je Object Treeview, ktorý môže byť použitý na navigáciu a výber objektov podľa ich hierarchie, ako doplnok tradičného rozbaľovacieho zoznamu v Inšpektore objektov. V Lazarus je toto súčasťou Inšpektora objektov a jeho použitím namiesto predvoleného rozbaľovacieho zoznamu môžete vybrať jeho ne/použitie pomocou kontextového menu "Show Component Tree" <br />
# V Delphi dvojité kliknutie na prázdnu udalosť ju automaticky vytvorí a otvorí Editor zdrojového kódu na jej pozícii, v Lazarus je tlačítko napravo od rozbaľovacieho zoznamu, ktoré vykoná to isté. <br />
# V Delphi musíte ručne zmazať meno udalosti v políčku, aby ste odstránili priradenie, v Lazarus zvoľte v zozname "(None)".<br />
# Podobne ako pri udalostiach, dvojitým kliknutím na regulárne vlastnosti (napr. Boolean) nezmení ich hodnotu, ale musíte ju zvoliť zo zoznamu a na otvorenie ich predvoleného editora, musíte kliknúť na tlačítko vpravo od rozbaľovacieho zoznamu.<br />
<br />
====Balíčky====<br />
V Lazarus nemôžete inštalovať balíčky Delphi, pretože potrebujú čary prekladača Delphi. Preto pre Lazarus potrebujete špeciálne vytvorené balíčky.<br />
<br />
Vytvorte nový balíček, uložte ho v zdrojovom adresári balíčkov (bežne rovnaký adresár súboru .dpk), pridajte LCL ako vyžadovaný balíček a nakoniec pridajte súbory .pas. Teraz ho môžete nainštalovať alebo použiť vo svojom projekte. Medzi balíčkami Lazarus a Delphi sú rozdiely, prečítajte si prosím docs/Packages.txt v zdrojovom kóde Lazarus.<br />
- viď docs/Packages.txt v zdrojovom kóde Lazarus.<br />
<br />
===VCL -> LCL===<br />
Hoci obe, VCL aj LCL, slúžia rovnakému cieľu - Objektovo orientovanej hierarchii komponentov hlavnému motoru pre rýchly vývoj aplikácií (RAD), nie sú identické. Napríklad, kým VCL poskytuje veľa nevizuálnych komponentov, LCL sa pokúša poskytovať len vizuálne, kým väčšina nevizuálnych komponentov (ako db access) sú poskytované pomocou FCL, zahrnutej vo FreePascal.<br />
<br />
Takže veľa prvkov VCL nemusí existovať v LCL, alebo naopak, alebo dokonca keď prvky existujú v oboch, nie sú to klony a musíte urobiť pri prenose zmeny v aplikácii, komponentoch a prvkoch.<br />
<br />
Nasledujúci text sa pokúša poskytnúť čo najúplnejší popis hlavných rozdielov a nekompatibility medzi nimi, pre užívateľov Delphi. Popisuje najmä rozdiely VCL v D4, ale i D5, D6 alebo D7; s aktuálnou LCL, ako je v CVS. Takže nemusí byť vždy presne k verzii, ktorú používate alebo úplne súhlasiť s aktuálnym LCL, ktorý máte. Ak uvidíte rozdiely medzi nasledujúcim textom a LCL ako je v CVS, alebo svojim Delphi kľudne sa pripojte a zmeňte to tak, aby ste prispeli k úplnosti pre všetkých ľudí.<br />
<br />
====TControl.Font/TControl.ParentFont====<br />
Vo VCL je pre prvky úplne bežné použiť presné meno fontu a vlastností fontu ako bold a italics a očakávanie tejto hodnoty bude vždy nasledovať. Ďalej je poskytnutá vlastnosť TControl.ParentFont, ktorá zaisťuje, že prvok sa bude vždy riadiť svojim rodičovským fontom. Opäť, implicitná domnienka je, že tieto hodnoty budú vždy nasledované, dokonca nedbajúc nastavenia Windows Apearance. <br />
<br />
Toto nie je vždy pravda v LCL, ani byť nemôže. LCL je cross-platform/cross-interface od začiatku preferuje vyvážené nastavenie a bude sa vždy pokúšať nastaviť Desktop/Toolkit Apearance alebo nastavenú Tému na všetkých nástrojoch. Napríklad, ak používate rozhranie GTK a téma GTK poskytuje konkrétny font pre tlačítka, potom sa tlačítka LCL budú vždy pokúšať použiť tento font.<br />
<br />
To znamená, že väčšina prvkov LCL nemá rovnakú úroveň návrhu prvku, ktorá je často predpokladaná vo VCL, skôr len tie vlastné prvky, ktoré sú kreslené Canvas miesto pridelené rozhraním môžu byť modifikované týmto spôsobom, nedbajúcim na použité rozhranie.<br />
<br />
Ak je napríklad potrebný Label s fontom bold/special color, musíte použiť TStaticText, keďže TLabel je špecifický prvok rozhrania a všetky rozhrania sú poskytnuté v pôvodnej verzii a mnoho z nich bude mať predvolené nastavenia, ktoré budú použité.<br />
<br />
====Control Dragging/Docking====<br />
Vo VCL väčšina (Win) prvkov implementuje metódy a spätné funkcie pre obsluhovanie preťahovania a dokovania prvkov, napríklad preťahovanie prvku z jedného panela a jeho dokovanie do iného panely v dobe behu programu.<br />
<br />
Táto funkcia nie je teraz implementovaná/dokončená v LCL, hoci teraz je v počiatočnom štádiu plánovania a bude eventuálne podporovať nejakú úroveň kompatibility tohto typu správania, ak nie dokonca presne rovnaké.<br />
<br />
Toto aktuálne znamená, že prvky nemôžu dediť/používať nasledujúce funkcie, procedúry, vlastnosti a udalosti TControl:<br />
{| class="code" <br />
|- class="code"<br />
| class="code" |<div class="key">Protected</div><br />
<div class="key">function</div> GetDockEdge(MousePos: TPoint): TAlign;<br />
<div class="key">function</div> GetDragImages: TDragImageList;<br />
<div class="key">function</div> GetFloating: Boolean;<br />
<div class="key">function</div> GetFloatingDockSiteClass: TWinControlClass;<br />
<div class="key">procedure</div> DoEndDrag(Target:TObject); X, Y: Integer);<br />
<div class="key">procedure</div> DockTrackNoTarget(Source: TDragDockObject; X, Y: Integer);<br />
<div class="key">procedure</div> DoEndDock(Target: TObject; X, Y: Integer);<br />
<div class="key">procedure</div> DoDock(NewDockSite: TWinControl; <div class="key">var</div> ARect: TRect);<br />
<div class="key">procedure</div> DoStartDock(<div class="key">var</div> DragObject: TDragObject);<br />
<div class="key">procedure</div> DragCanceled;<br />
<div class="key">procedure</div> DragOver(Source: TObject; X, Y: Integer; State: TDragState;<br />
<div class="key">var</div> Accept: Boolean);<br />
<div class="key">procedure</div> DoEndDrag(Target: TObject; X, Y: Integer);<br />
<div class="key">procedure</div> DoStartDrag(<div class="key">var</div> DragObject: TDragObject);<br />
<div class="key">procedure</div> DrawDragDockImage(DragDockObject: TDragDockObject);<br />
<div class="key">procedure</div> EraseDragDockImage(DragDockObject: TDragDockObject);<br />
<div class="key">procedure</div> PositionDockRect(DragDockObject: TDragDockObject);<br />
<div class="key">procedure</div> SetDragMode(Value: TDragMode);<br />
<div class="key">property</div> DragKind: TDragKind;<br />
<div class="key">property</div> DragCursor: TCursor;<br />
<div class="key">property</div> DragMode: TDragMode;<br />
<div class="key">property</div> OnDragDrop: TDragDropEvent;<br />
<div class="key">property</div> OnDragOver: TDragOverEvent;<br />
<div class="key">property</div> OnEndDock: TEndDragEvent;<br />
<div class="key">property</div> OnEndDrag: TEndDragEvent;<br />
<div class="key">property</div> OnStartDock: TStartDockEvent;<br />
<div class="key">property</div> OnStartDrag: TStartDragEvent;<br />
<div class="key">public</div><br />
<div class="key">function</div> Dragging: Boolean;<br />
<div class="key">function</div> ManualDock(NewDockSite: TWinControl; DropControl: TControl;<br />
<div class="key"> </div>ControlSide: TAlign): Boolean;<br />
<div class="key">function</div> ManualFloat(ScreenPos: TRect): Boolean;<br />
<div class="key">function</div> ReplaceDockedControl(Control: TControl; NewDockSite: TWinControl;<br />
<div class="key"> </div>DropControl: TControl; ControlSide: TAlign): Boolean;<br />
<div class="key">procedure</div> BeginDrag(Immediate: Boolean; Threshold: Integer);<br />
<div class="key">procedure</div> Dock(NewDockSite: TWinControl; ARect: TRect);<br />
<div class="key">procedure</div> DragDrop(Source: TObject; X, Y: Integer);<br />
<div class="key">procedure</div> EndDrag(Drop: Boolean);<br />
<div class="key">property</div> DockOrientation: TDockOrientation;<br />
<div class="key">property</div> Floating: Boolean;<br />
<div class="key">property</div> FloatingDockSiteClass: TWinControlClass;<br />
<div class="key">property</div> HostDockSite: TWinControl;<br />
<div class="key">property</div> LRDockWidth: Integer;<br />
<div class="key">property</div> TBDockHeight: Integer;<br />
<div class="key">property</div> UndockHeight: Integer;<br />
<div class="key">property</div> UndockWidth: Integer; <br />
|}<br />
<br />
a že nasledujúce triedy neexistujú alebo sú nepoužiteľné:<br />
{| class="code" <br />
|- class="code"<br />
| class="code" | TDragImageList = <div class="key">class</div>(TCustomImageList)<br />
TDockZone = <div class="key">class</div><br />
TDockTree = <div class="key">class</div>(TInterfacedObject, IDockManager)<br />
TDragObject = <div class="key">class</div>(TObject)<br />
TBaseDragControlObject = <div class="key">class</div>(TDragObject)<br />
TDragControlObject = <div class="key">class</div>(TBaseDragControlObject)<br />
TDragDockObject = <div class="key">class</div>(TBaseDragControlObject) <br />
|}<br />
a že nasledujúce funkcie sú tiež neexistujúce/nepoužiteľné:<br />
{| class="code" <br />
|- class="code"<br />
| class="code" | <div class="key">function</div> FindDragTarget(<div class="key">const</div> Pos: TPoint;<br />
<div class="key"> </div>AllowDisabled: Boolean) : TControl;<br />
<div class="key">procedure</div> CancelDrag;<br />
<div class="key">function</div> IsDragObject(sender: TObject): Boolean;<br />
|}<br />
<br />
====TEdit/TCustomEdit====<br />
Prvky Edit, kým základné funkcie sú rovnaké ako vo VCL, nemajú niektoré výstupy v konverzii:<br />
# kvôli obmedzeniam rozhraní, TEdit.PasswordChar zatiaľ nepracuje vo všetkých rozhraniach (neskôr možno), namiesto toho použite TCustomEdit.EchoMode emPassword v udalosti na skrytie textu. <br />
# Udalosti OnDrag/Dock zatiaľ nie sú implementované. Viz [LazarusForDelphiUsers#Control Dragging/Docking|Control Dragging/Docking].<br />
# Vlastnosti Font sú zvyč¨ ajne ignorované kvôli správaniu rozhrania. Viz [[#TControl.Font/TControl.ParentFont | TControl.Font/TControl.ParentFont]]<br />
<br />
===TSplitter -> TPairSplitter===<br />
'''Please Improve Me'''<br />
<br />
V LCL existuje prvok TSplitter, tak ho netreba konvertovať, napriek tomu ho chcem trochu vysvetliť:<br />
<br />
Vo VCL, "Splitting" prvkov, čo je ošetrením, ktoré umožňuje preťahovanie medzi dvomi komponentmi na získanie viac/menej miesta pre jeden na úkor ostatných, je urobený pomocou TSplitter. Často to môžete vidieť, napríklad v IDE Delphi medzi dokovaným Code Explorer a Source Viewer. <br />
<br />
LCL poskytuje svoj vlastný prvok, nazvaný TPairSplitter, ktorý obsluhuje rovnakú úlohu, avšak nie je kompatibilný, tak "skúšanie" preruší VCL kód alebo bude potrebný Delphi DFM pri prenose kódu.<br />
<br />
;V čom presne sú rozdiely?<br />
Najväčšie rozdiely sú, že VCL TSplitter nemá potomkov, namiesto toho ho umiestňujete medzi dva prvky, ktoré sú správne usporiadané a dovoľuje meniť ich veľkosť za behu programu, nedbajúc na vlastnú veľkosť. Prvky musia byť správne usporiadané, napríklad Panel a Splitter s Aligned Left a druhý Panel Aligned Client. Za behu programu môžete zmeniť rozloženie panelov pomocou preťahovania ošetreného pomocou prvku Splitter.<br />
<br />
V LCL je však TPairSplitter špeciálnym typom prvku s dvomi panelmi a môže byť užitočný len ak prvky na presúvanie sú na týchto paneloch, ale posúvanie bude jednako vykonané medzi týmito panelmi, i keď na nich nebude nič. Ako v predchádzajúcom príklade, potrebujete formulár s TPairSplitter Aligned Client a Panel Aligned Client na jeho ľavej strane a Panel Aligned Client na jeho pravej strane.<br />
<br />
Iným dôležitým rozdielom je, že vo VCL, keďže TSplitter je svoj vlastný TControl, tak jeho pozícia pri zmene veľkosti je uchovávaná relatívne k ostatným prvkom, tak napríklad klientský panel sa bude zväčšovať, kým ostatné panely nie, tým je pozícia rozdelenia relatívna k zarovnaniu rozdeľovaných prvkov.<br />
<br />
V LCL sú bočné panely samostatné, potom TPairSplitter má vlastnosť Position, ktorá je absolútne relatívna k vrcholu Top alebo Left. Tak pri zmene veľkosti aktuálna sa pozícia nemení podľa obsahu, tak musí byť nastavené spätné volanie na zaistenie uchovania pomeru, ak je to dôležité.<br />
<br />
Napríklad, ak pravá strana vertikálneho rozdelenia musí mať správanie ako alClient, potrebujete zmeniť spätným volaním veľkosť formulára, napríklad takto:<br />
<br />
PairSplitter.Position := PairSplitter.Width - PairSplitter.Position; <br />
<br />
;Teda ako môžem konvertovať existujúci kód používajúci TSplitter na TPairSplitter?<br />
Ak sú splitter a prvky vytvorené vo vnútri aktuálnej funkcie (ako OnCreate formulára), konverzia nebude zložitá, najprv zreorganizujeme kód na vytvorenie prvkov v poradí novej hierarchie a nastavíme rodičov podriadených prvkov pre rozdelenie na ľavý/horný a pravý/dolný podiel prvku PairSplitter. Napríklad:<br />
{| class="code"<br />
|- <br />
| class="header" | VCL || class="header" | LCL<br />
|- class="code"<br />
| class="code" |<div class="key">var</div><br />
BottomPanel: TPanel<div class="symbol">;</div><br />
<div></div><br />
VerticalSplitter: TSplitter<div class="symbol">;</div><br />
LeftPanel: TPanel<div class="symbol">;</div><br />
HorizontalSplitter: TSplitter<div class="symbol">;</div><br />
<div></div><br />
MainPanel: TPanel<div class="symbol">;</div><br />
<div class="key">begin</div><br />
BottomPanel:= TPanel.Create(Self)<div class="symbol">;</div><br />
<div class="key">with</div> (BottomPanel) <div class="key">do</div><br />
<div class="key">begin</div><br />
Parent:= Self<div class="symbol">;</div><br />
Height:= <div class="int">75</div><div class="symbol">;</div><br />
Align:= alBottom<div class="symbol">;</div><br />
<div class="key">end</div><div class="symbol">;</div><br />
<div></div><br />
VerticalSplitter:= TSplitter.Create(Self)<div class="symbol">;</div><br />
<div class="key">with</div> (VerticalSplitter) <div class="key">do</div><br />
<div class="key">begin</div><br />
Parent:= Self<div class="symbol">;</div><br />
Align:= alBottom<div class="symbol">;</div><br />
<div class="key">end</div><div class="symbol">;</div><br />
<div></div><br />
HorizontalSplitter:= TSplitter.Create(Self)<div class="symbol">;</div><br />
<div class="key">with</div> (HorizontalSplitter) <div class="key">do</div><br />
<div class="key">begin</div><br />
Parent:= Self<div class="symbol">;</div><br />
align:= alLeft<div class="symbol">;</div><br />
<div class="key">end</div><div class="symbol">;</div><br />
<div></div><br />
LeftPanel:= TPanel.Create(Self)<div class="symbol">;</div><br />
<div class="key">with</div> (LeftPanel) <div class="key">do</div><br />
<div class="key">begin</div><br />
Parent:= Self<div class="symbol">;</div><br />
Width:= <div class="int">125</div><div class="symbol">;</div><br />
Align:= alLeft<div class="symbol">;</div><br />
<div class="key">end</div><div class="symbol">;</div><br />
<div></div><br />
MainPanel:= TPanel.Create(Self)<div class="symbol">;</div><br />
<div class="key">with</div> (MainPanel) <div class="key">do</div><br />
<div class="key">begin</div><br />
Parent:= Self<div class="symbol">;</div><br />
Align:= alClient<div class="symbol">;</div><br />
Caption:= <div class="str">'Hello'</div><div class="symbol">;</div><br />
<div class="key">end</div><div class="symbol">;</div><br />
<div class="key">end</div>; <br />
| class="code" | <div class="key">var</div><br />
BottomPanel: TPanel<div class="symbol">;</div><br />
<div></div><br />
VerticalSplitter: TPairSplitter<div class="symbol">;</div><br />
LeftPanel: TPanel<div class="symbol">;</div><br />
HorizontalSplitter: TPairSplitter<div class="symbol">;</div><br />
<div></div><br />
MainPanel: TPanel<div class="symbol">;</div><br />
<div class="key">begin</div><br />
VerticalSplitter:= TPairSplitter.Create(Self)<div class="symbol">;</div><br />
<div class="key">with</div> (VerticalSplitter) <div class="key">do</div><br />
<div class="key">begin</div><br />
Parent:= Self<div class="symbol">;</div><br />
Align:= alClient<div class="symbol">;</div><br />
Width:= Self.Width<div class="symbol">;</div><br />
Height:= Self.Height<div class="symbol">;</div><br />
SplitterType:= pstVertical<div class="symbol">;</div><br />
Position:= Height - <div class="int">75</div><div class="symbol">;</div><br />
Sides[<div class="int">0</div>].Width:= Width<div class="symbol">;</div><br />
Sides[<div class="int">0</div>].Height:= Position<div class="symbol">;</div><br />
<div class="key">end</div><div class="symbol">;</div><br />
<div></div><br />
HorizontalSplitter:= TPairSplitter.Create(Self)<div class="symbol">;</div><br />
<div class="key">with</div> (HorizontalSplitter) <div class="key">do</div><br />
<div class="key">begin</div><br />
Parent:= VerticalSplitter.Sides[<div class="int">0</div>]<div class="symbol">;</div><br />
Width:= Self.Width<div class="symbol">;</div><br />
Height:= VerticalSplitter.Position<div class="symbol">;</div><br />
align:= alClient<div class="symbol">;</div><br />
SplitterType:= pstHorizontal<div class="symbol">;</div><br />
Position:= <div class="int">125</div><div class="symbol">;</div><br />
<div class="key">end</div><div class="symbol">;</div><br />
<div></div><br />
LeftPanel:= TPanel.Create(Self)<div class="symbol">;</div><br />
<div class="key">with</div> (LeftPanel) <div class="key">do</div><br />
<div class="key">begin</div><br />
Parent:= HorizontalSplitter.Sides[<div class="int">0</div>]<div class="symbol">;</div><br />
Align:= alClient<div class="symbol">;</div><br />
<div class="key">end</div><div class="symbol">;</div><br />
<div></div><br />
MainPanel:= TPanel.Create(Self)<div class="symbol">;</div><br />
<div class="key">with</div> (MainPanel) <div class="key">do</div><br />
<div class="key">begin</div><br />
Parent:= HorizontalSplitter.Sides[<div class="int">1</div>]<div class="symbol">;</div><br />
Align:= alClient<div class="symbol">;</div><br />
Caption:= <div class="str">'Hello'</div><div class="symbol">;</div><br />
<div class="key">end</div><div class="symbol">;</div><br />
<div></div><br />
BottomPanel:= TPanel.Create(Self)<div class="symbol">;</div><br />
<div class="key">with</div> (BottomPanel) <div class="key">do</div><br />
<div class="key">begin</div><br />
Parent:= VerticalSplitter.Sides[<div class="int">1</div>]<div class="symbol">;</div><br />
Align:= alClient<div class="symbol">;</div><br />
<div class="key">end</div><div class="symbol">;</div><br />
<div class="key">end</div><div class="symbol">;</div><br />
|}<br />
<br />
Ako môžete vidieť, zmena pozostáva väčšinou z hierarchie. Ak vám lepšie vyhovuje práca s DFM, zmeny potrebné pre konverziu DFM->LFM sú podobné zmenám vyššie, ide o rovnaký typ zmien v Parent/Owner atď.<br />
Potom bude vyššie spomínaný príklad vyzerať takto nejako:<br />
{| class="code"<br />
|- <br />
| class="header" | Delphi DFM <div style="font-weight: normal">(exteranous values removed)</div><br />
| class="header" | Lazarus LFM <div style="font-weight: normal">(most width, height etc removed)</div><br />
|- class="code"<br />
| class="code" |<div class="key">object</div>VerticalSplitter: TSplitter<br />
Height <div class="symbol">=</div> <div class="int">3</div><br />
Cursor <div class="symbol">=</div> crVSplit<br />
Align <div class="symbol">=</div> alBottom<br />
<div class="key">end</div><br />
<div class="key">object</div> HorizontalSplitter: TSplitter<br />
Width <div class="symbol">=</div> <div class="int">3</div><br />
Align <div class="symbol">=</div> alLeft<br />
<div class="key">end</div><br />
<div class="key">object</div> BottomPanel: TPanel<br />
Height <div class="symbol">=</div> <div class="int">75</div><br />
Align <div class="symbol">=</div> alBottom<br />
<div class="key">end</div><br />
<div class="key">object</div> LeftPanel: TPanel<br />
Width <div class="symbol">=</div> <div class="int">125</div><br />
Align <div class="symbol">=</div> alLeft<br />
<div class="key">end</div><br />
<div class="key">object</div> MainPanel: TPanel<br />
Align <div class="symbol">=</div> alClient<br />
<div class="key">end</div> <br />
| class="code" |<div class="key">object</div> VerticalSplitter: TPairSplitter<br />
Align <div class="symbol">=</div> alClient<br />
SplitterType <div class="symbol">=</div> pstVertical<br />
Position <div class="symbol">=</div> <div class="int">225</div><br />
Height <div class="symbol">=</div> <div class="int">300</div><br />
Width <div class="symbol">=</div> <div class="int">400</div><br />
<div class="key">object</div> Pairsplitterside1: TPairSplitterIde<br />
<div class="key">object</div> HorizontalSplitter: TPairSplitter<br />
Align <div class="symbol">=</div> alClient<br />
Position <div class="symbol">=</div> <div class="int">125</div><br />
<div class="key">object</div> Pairsplitterside3: TPairSplitterIde<br />
Width <div class="symbol">=</div> <div class="int">125</div><br />
<div class="key">object</div> LeftPanel: TPanel<br />
Align <div class="symbol">=</div> alClient<br />
Width <div class="symbol">=</div> <div class="int">125</div><br />
<div class="key">end</div><br />
<div class="key">end</div><br />
<div class="key">object</div> Pairsplitterside4: TPairSplitterIde<br />
<div class="key">object</div> MainPanel: TPanel<br />
Align <div class="symbol">=</div> alClient<br />
<div class="key">end</div><br />
<div class="key">end</div><br />
<div class="key">end</div><br />
<div class="key">end</div><br />
<div class="key">object</div> Pairsplitterside2: TPairSplitterIde<br />
<div class="key">object</div> BottomPanel: TPanel<br />
Align <div class="symbol">=</div> alClient<br />
Height <div class="symbol">=</div> <div class="int">75</div>;<br />
<div class="key">end</div><br />
<div class="key">end</div><br />
<div class="key">end</div><br />
|}<br />
<br />
===TCustomTreeView/TTreeView===<br />
Oboje, VCL aj LCL, poskytujú komponent TCustomTreeView/TTreeView, používaný pre výpisy stromovej štruktúry dát s viacnásobnými uzlami, rozšíreným výberom a ImageList, a hoci skutočná funkčnosť je porovnateľná, nie všetky vlastnosti sú úplne kompatibilné. Hlavné rozdiely sú:<br />
'''Incomplete list, also update to include TCustomTreeView Mark functions and protected methods '''<br />
<br />
# LCL poskytuje TCustomTreeView.Options, množinu volieb, ktoré môžu byť nastavené na zmenu správania a vzhľadu prvku: <br />
#* tvoAllowMultiselect- nastavuje mód viacnásobného výberu uzlov, ekvivalent k TCustomTreeView.MultiSelect vo VCL VCL<br />
#* tvoAutoExpand- automatické rozbalenie uzlov, ekvivalent k TCustomTreeView.AutoExpand<br />
#* tvoAutoInsertMark- aktualizácia prípravy Drag pri prechode myšou. <br />
#* tvoAutoItemHeight- automatické prispôsobenie výšky prvku. <br />
#* tvoHideSelection- neoznačovať vybranú položku. <br />
#* tvoHotTrack- použitie HotTracking, ekvivalent k TCustomTreeview.HotTrack <br />
#* tvoKeepCollapsedNodes- pri zbalení uzla, uchováva podriadené uzly <br />
#* tvoReadOnly- ekvivalent k TCustomTreeview.ReadOnly <br />
#* tvoRightClickSelect- dovoľuje použiť pravé tlačítko myši na výber uzla, ekvivalent k TCustomTreeView.RightClickSelect <br />
#* tvoRowSelect- dovoľuje výber riadkov, ekvivalent k TCustomTreeView.RowSelect <br />
#* tvoShowButtons- zobrazuje tlačítka, ekvivalent k TCustomTreeView.ShowButtons <br />
#* tvoShowLines- zobrazuje čiary uzlov, ekvivalent k TCustomTreeView.ShowLines <br />
#* tvoShowRoot- zobrazuje root, ekvivalent k TCustomTreeView.ShowRoot <br />
#* tvoShowSeparators- zobrazuje oddeľovače <br />
#* tvoToolTips- zobrazuje samostatné tooltips pre uzly <br />
<br />
# LCL poskytuje dodatočné vlastnosti:<br />
#* udalosť TCustomTreeView.OnSelectionChange <br />
#* TCustomTreeView.DefaultItems, pre predvolené číslo položiek <br />
#* TCustomTreeView.ExpandSignType na určenie znamienka použitého na rozbaliteľných/zbaliteľných uzloch <br />
<br />
==Original Contributors and changes==<br />
This page has been converted from the epikwiki [http://lazarus-ccr.sourceforge.net/index.php?wiki=LazarusForDelphiUsers version].<br />
* Initial import and formatting - [[User:Tom | VlxAdmin]] 9/26/2003<br />
* Begin VCL -> LCL with a section on TSplitter -> TPairSplitter - [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson Andrew Johnson] 9/30/2003<br />
* Add TControl.Font/TControl.ParentFont to VCL -> LCL - [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson Andrew Johnson] 9/30/2003<br />
* Update TEdit/TCustomEdit section in VCL -> LCL - [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson Andrew Johnson] 10/1/2003<br />
* Add Control Dragging/Docking to VCL -> LCL - [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson Andrew Johnson] 10/1/2003<br />
* Added "Object Inspector" to Delphi IDE -> Lazarus IDE - [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson Andrew Johnson] 10/1/2003<br />
* Added initial "TCustomTreeView/TTreeView" to VCL -> LCL - [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson Andrew Johnson] 10/1/2003<br />
* Added introduction to VCL -> LCL - [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson Andrew Johnson] 10/1/2003<br />
* Fixed some typos - [[User:Vincent | Vincent]] 10/2/2003<br />
* Fixed Typo [[User:Kirkpatc]] 20 May 2004<br />
* Prvotný preklad z origánalu - [[User:Slavko|Slavko]] 01:18, 2 Apr 2005 (PST)</div>Slavkohttps://wiki.freepascal.org/index.php?title=Code_Conversion_Guide/sk&diff=26164Code Conversion Guide/sk2008-01-06T13:31:46Z<p>Slavko: Oprava preklepov</p>
<hr />
<div>{{Code Conversion Guide}}<br />
<br />
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.<br />
<br />
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. <br />
<br />
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.<br />
<br />
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. <br />
<br />
==Výber komponentov alebo knižnice pre konverziu==<br />
<br />
===Kde hľadať kód na konverziu===<br />
<br />
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].<br />
<br />
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].<br />
<br />
===Licencovanie===<br />
<br />
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.<br />
<br />
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.<br />
<br />
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".<br />
<br />
===Závislosti ===<br />
<br />
Ď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.<br />
<br />
===Poznámky k prekladaču===<br />
<br />
Viz:<br />
* [http://www.freepascal.org/probs.html Známe problémy]<br />
* [http://www.freepascal.org/bugs/db.php3?statusfield=Unfixed Neopravené chyby]<br />
<br />
===Poznámky k platforme a OS===<br />
<br />
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!<br />
<br />
==Konverzia ==<br />
<br />
===Nastavenie IDE Lazarus pre konverziu projektu===<br />
<br />
====Vytvorenie skúšobného projektu====<br />
* Umiestnite konvertovaný kód do podadresára (napr: convertdir)<br />
* Spusťte Lazarus<br />
* '''File->Save All''' do adresára convertdir. Zmysluplné mená pre Project a predvolenú jednotku sú voliteľné.<br />
* Otvorte "základnú" konvertovanú jednotku v convertdir<br />
* Pridajte ju do projektu: '''Project->Add Active Unit to Project'''<br />
* Spusťte '''Tools->Quick Syntax Check''' alebo '''Run->Build All''', čím začnete.<br />
<br />
====Na čo treba dať pozor====<br />
* 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'''.<br />
====Zdrojové kódy Delphi VCL a Kylix CLX v Lazarus====<br />
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'''.<br />
<br />
===Problémy konverzie a ich riešenie ===<br />
<br />
==== Ekvivalenty Delphi/Kylix súborov v Lazarus ====<br />
<br />
{|border="1" width="800" <br />
! Delphi / Kylix !! Popis !! Lazarus !! Popis<br />
|- <br />
|valign="top"| .pas<br />
<br />
.dfm/.xfm,<br />
<br />
.dcu/.dpu,<br />
<br />
.dpr(main project file),<br />
<br />
.res,<br />
<br />
.dof/.kof<br />
<br />
---<br />
<br />
---<br />
<br />
---<br />
<br />
|valign="top"| súbor zdrojového kódu Delphi,<br />
<br />
formulár Delphi,<br />
<br />
preložená jednotka Delphi,<br />
<br />
projekt Delphi,<br />
<br />
Resource súbor Windows,<br />
<br />
súbor volieb Delphi<br />
<br />
|valign="top"| .pas, .pp<br />
.lfm,<br />
<br />
.o,<br />
<br />
.lpr<br />
<br />
---<br />
<br />
---<br />
<br />
.lrs,<br />
<br />
.lpi(hlavný súbor projketu),<br />
<br />
.ppu<br />
<br />
|valign="top"| súbor jednotky Pascal,<br />
<br />
dátový súbor formulára,<br />
<br />
súbor preloženej jednotky,<br />
<br />
súbor projektu,<br />
<br />
Resource súbor,<br />
<br />
súbor volieb projektu,<br />
<br />
Resource súbor Lazarus,<br />
<br />
informačný súbor projektu Lazarus,<br />
<br />
popisný súbor jednotky FPC<br />
|}<br />
<br />
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.<br />
<br />
====Konverzia projektov/formulárov/jednotiek Delphi do Lazarus====<br />
<br />
Premenujte alebo prekopírujte súbor .dpr na súbor .lpr. Zakomentujte alebo odstráňte direktívu <br />
{$R *.res}<br />
a pridajte direktívu<br />
{$mode delphi}{$H+}<br />
alebo<br />
{$mode objfpc}{$H+}<br />
do súboru .lpr. <br />
<br />
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.<br />
<br />
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.<br />
<br />
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:<br />
<br />
# upraví veľkosť písmen v sekciách uses a iclude.<br />
# konvertuje súbory .dfm na súbory .lfm (bez kontroly obsahu, len formát)<br />
# vytvorí prázdny súbor .lrs (obsah bude pridaný neskôr)<br />
# pridá direktívu<br />
{$mode delphi}<br />
# nahradí jednotku Windows jednotkou LCLIntf<br />
# ak je to potrebné, pridá jednotku LResources<br />
# odoberie jednotku Variants<br />
# odoberie direktívu<br />
{$R *.dfm}<br />
# pridá do sekcie initialization direktívu <br />
{$i unit.lrs}<br />
<br />
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).<br />
<br />
====Výber správneho módu prekladača====<br />
<br />
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:<br />
<br />
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í.<br />
<br />
Väčšinu jednotiek Delphi môžete jednoducho preložiť pomocou [[Free Pascal]] pridaním tejto konštrukcie, hneď za meno jednotky<br />
{$IFDEF FPC}<br />
{$MODE DELPHI}<br />
{$ENDIF}<br />
<br />
Ď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].<br />
<br />
====Viac-platformové poznámky====<br />
* 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.<br />
* Neodkazujte na špecifické pamäťové miesto, ako dátová oblasť BIOS. Zistite čo kód potrebuje a skúste nájsť cezplatformovú alternatívu.<br />
* 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é.<br />
* Ak potrebujete nejaký kód, špecifický pre OS, používajte '''IFDEF'''. Viz zoznam makier neskôr.<br />
<br />
====Užitočné premenné prekladača====<br />
<br />
Pre písanie kódu, ktorý sa má správať na rôznych systémoch rôzne, môžete použiť direktívy<br />
{$IFDEF Name}<br />
Pričom Name môže byť<br />
*'''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.<br />
{$IfDef LCL}<br />
*'''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.<br />
{$IfDef FPC}<br />
*'''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.<br />
{$IfDef LCLGtk}<br />
{$IfDef LCLWin32}<br />
{$IfDef LCLQt}<br />
... <br />
*'''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ží.<br />
{$IfDef Unix}<br />
{$IfDef Win32}<br />
...<br />
: Pre prácu v Kylix použite nasledujúcu konštrukciu:<br />
{$IfDef Linux}<br />
{$Define Unix}<br />
{$EndIf}<br />
*'''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.<br />
{$IfDef ENDIAN_BIG}<br />
<br />
Ďalšie podrobnosti nájdete v [http://www.freepascal.org/docs-html/prog/prog.html#QQ2-23-21 dokumentácii Free Pascal].<br />
<br />
==== Podpora 32bit/64bit ====<br />
<br />
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:<br />
*'''PtrInt''' je 32bit Integer so znamienkom na 32bit platformách a 64bit Integer sp znamienkom na 64bit platformách.<br />
*'''PtrUInt''', je rovnaké ako predchádzajúce s tým rozdielom, že sa jedná o Integer bez znamienka.<br />
<br />
Pre kód, ktorý má pracovať s Delphi a FPC použite:<br />
{$IFNDEF FPC}<br />
type<br />
PtrInt = integer;<br />
PtrUInt = cardinal;<br />
{$ENDIF}<br />
<br />
Nahrďte všetky<br />
integer(SomePointerOrObject)<br />
týmto<br />
PtrInt(SomePointerOrObject)<br />
<br />
====Hľadanie chýbajúcich identifikátorov====<br />
<br />
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.<br />
<br />
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):<br />
<br />
grep -in ' tbutton =' lcl/*<br />
<br />
====Rozdiely v dôležitých jednotkách Lazarus a Delphi ====<br />
<br />
;Prosím dopĺňajte túto časť!;<br />
<br />
* Windows -> LCLIntf, LCLType, LCLProc, VCLGlobals, ...<br />
<br />
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ď).<br />
<br />
Jednotka '''Interfaces''' musí byť zahrnutá v súbore .lpr file pre správnu inicializáciu príslušného WidgetSet.<br />
<br />
* Messages->LMessages<br />
<br />
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'''.<br />
<br />
* Graphics, Controls->GraphTypes, GraphMath, Graphics, Controls<br />
<br />
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.<br />
<br />
Point1 := Point2 + Point3<br />
<br />
či porovnanie dvoch pravouholníkov ako<br />
<br />
if (rect1 = rect2) then ...<br />
<br />
* Mask->MaskEdit<br />
<br />
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.<br />
<br />
* StdCtrls->StdCtrls,Buttons<br />
<br />
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úť.<br />
<br />
====Rozdiely vo vlastnostiach a metódach Delphi -> FPC/LCL ====<br />
* v LCL je Canvas obsahnutý v TBitmap<br />
====Sémantické rozdiely ====<br />
<br />
===== Poradie vyhodnocovania parametrov =====<br />
<br />
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.<br />
<br />
===== Vnorené procedúry/funkcie sú procedurálne premenné =====<br />
<br />
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ú.<br />
<br />
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.<br />
<br />
Inými slovami, nevolajte vnorené procedúry pomocou procedurálnych premenných.<br />
<br />
==== Syntaktické rozdiely ====<br />
<br />
;Prosím dopĺňajte túto kapitolu!<br />
<br />
Kvôli zdedenej prísnosti FPC, budú potrebné niektoré syntaktické zmeny, napriek direktíve<br />
{$Mode Delphi}<br />
pracuje oveľa pomalšie ako Delphi. Kvôli tomu oveľa viac vyhovujú pravidlá syntaxe<br />
{$Mode ObjFPC}<br />
ak je to možné, vrelo doporučujem, dokonca i keď bude kód zdieľaný medzi Delphi a LCL.<br />
<br />
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:<br />
<br />
=====Pri priraďovaní vstupného bodu obsluhy udalosti, pridajte predponu "@"=====<br />
<br />
Napríklad, môžete manuálne priradiť udalosť tlačítka<br />
{| border="1" width="800"<br />
! Delphi !! OBJFPC<br />
|-<br />
|<pascal><br />
begin<br />
if not Assigned(MyButton.OnClick) then <br />
MyButton.OnClick:= SomeFunction;<br />
//@ nie je vyžadované<br />
//ďalší kód...<br />
end;<br />
</pascal><br />
|<pascal><br />
begin<br />
if not Assigned(MyButton.OnClick) then<br />
MyButton.OnClick:= @SomeFunction;<br />
//@ je vyžadované<br />
//ďalší kód...<br />
end;<br />
</pascal><br />
|}<br />
<br />
=====Pri volaní procedurálnej premennej používajte túto syntax: theprocname()=====<br />
<br />
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<br />
{| border="1" width="800"<br />
! Delphi !! OBJFPC<br />
|-<br />
|<pascal><br />
With (SomeObject) do <br />
begin<br />
If Assigned(OnMyCallback) then<br />
OnMyCallback;<br />
//zátvorky nie sú vyžadované<br />
end;<br />
</pascal><br />
|<pascal><br />
With (SomeObject) do <br />
begin<br />
If Assigned(OnMyCallback) then<br />
OnMyCallback();<br />
//zátvorky sú vyžadované<br />
end;<br />
</pascal><br />
|}<br />
<br />
===== Pri pristupovaní k hodnotám v ukazovateli na záznam ho musíte najprv dereferencovať =====<br />
<br />
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. <br />
<br />
V FPC musí byť najprv dereferencovaný, napríklad:<br />
{| border="1" width="800"<br />
! Delphi !! OBJFPC<br />
|-<br />
|<pascal><br />
Function GetSomeValue(ARecord: PMyRecord):Integer;<br />
begin<br />
If Assigned(ARecord) then<br />
Result:=ARecord.SomeValue<br />
else<br />
Result:=0;<br />
end;<br />
</pascal><br />
|<pascal><br />
Function GetSomeValue(ARecord: PMyRecord):Integer;<br />
begin<br />
If Assigned(ARecord) then<br />
Result:=ARecord^.SomeValue<br />
else<br />
Result:=0;<br />
end;<br />
</pascal><br />
|}<br />
<br />
=====Pri pristupovaní znakov indexovaného reťazca Vlastnosti objektu, musí byť najprv uzatvorený v zátvorkách =====<br />
<br />
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.<br />
<br />
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<br />
{| border="1" width="800"<br />
! Delphi !! OBJFPC<br />
|-<br />
|<pascal><br />
Type TSomeComponent=class(TComponent)<br />
//Ďalší kód...<br />
Published<br />
Property MyString:String index 3 read GetMyString;<br />
//Ďalší kód...<br />
End;<br />
<br />
var<br />
MyChar:char;<br />
begin<br />
If Length(MyString)>2 then<br />
//nie sú potrebné zátvorky<br />
MyChar:= MyString[3];<br />
//Ďalší kód...<br />
end;<br />
</pascal><br />
|<pascal><br />
Type TSomeComponent=class(TComponent)<br />
//Ďalší kód...<br />
Published<br />
Property MyString:String index 3 read GetMyString;<br />
//Ďalší kód...<br />
End;<br />
<br />
var<br />
MyChar:char;<br />
begin<br />
If Length(MyString)>2 then<br />
//niekedy sú potrebné zátvorky<br />
MyChar:= (MyString)[3];<br />
//Ďalší kód...<br />
end;<br />
</pascal><br />
|}<br />
<br />
=====Pri použití ukazovateľov s premennými alebo funkciami, musíte ich najprv pretypovať na príslušný typ =====<br />
<br />
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. <br />
<br />
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<br />
<br />
{| border="1" width="800"<br />
! Delphi !! OBJFPC<br />
|-<br />
|<pascal><br />
Unit 1<br />
Type <br />
TSomeObject=class(TComponent)<br />
//Ďalší kód...<br />
End;<br />
<br />
Procedure DoSomething(Value: TSomeObject);<br />
Function GetSomeObject: TSomeObject;<br />
<br />
Unit 2<br />
Type <br />
TSomeComponent=class(TComponent)<br />
//Ďalší kód...<br />
Published SomeObject: Pointer;<br />
//Ďalší kód...<br />
End;<br />
<br />
Application<br />
var <br />
MyComponent: TSomeComponent;<br />
begin<br />
MyComponent.SomeObject:=GetSomeObject;<br />
//Ďalší kód...<br />
DoSomething(MyComponent.SomeObject);<br />
end;<br />
</pascal><br />
|<pascal><br />
Unit 1<br />
Type <br />
TSomeObject=class(TComponent)<br />
//Ďalší kód...<br />
End;<br />
<br />
Procedure DoSomething(Value: TSomeObject);<br />
Function GetSomeObject: TSomeObject;<br />
<br />
Unit 2<br />
Type<br />
TSomeComponent=class(TComponent)<br />
//Ďalší kód...<br />
Published SomeObject: Pointer;<br />
//Ďalší kód...<br />
End;<br />
<br />
Application<br />
var <br />
MyComponent: TSomeComponent;<br />
begin<br />
MyComponent.SomeObject:=Pointer(GetSomeObject);<br />
//Ďalší kód...<br />
DoSomething(TSomeObject(MyComponent.SomeObject));<br />
end;<br />
</pascal><br />
|}<br />
<br />
==== Resources ====<br />
<br />
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ť:<br />
cd lazarus/tools<br />
make install<br />
Pre pridanie resource do svojej aplikácie spusťte:<br />
lazres myresource.lrs mypix.xpm anotherpix.xpm<br />
A potom<br />
* pridajte jednotku '''LResources''' do sekcie '''Uses'''<br />
* zahrňte vami vytvorený súbor .lrs do bloku ''initialization''<br />
<br />
;Príklad:<br />
<pascal><br />
function TForm1.LoadGlyph(const GlyphName: String): TBitMap;<br />
begin<br />
Result:= TPixmap.Create;<br />
Result.LoadFromLazarusResource(GlyphName);<br />
end;<br />
//Ďalší kód...<br />
begin<br />
Speedbutton1.glyph:= LoadGlyph('mypix');<br />
//Ďalší kód...<br />
end<br />
<br />
initialization<br />
{$I unit1.lrs}<br />
{$I myresource.lrs}<br />
end.<br />
</pascal><br />
<br />
=== Iná metóda konverzie projektu Delphi/Kylix do Lazarus ===<br />
<br />
* 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)<br />
* premeujte súbor .dpr na '''.lpr'''<br />
* urobte potrebné zmeny súboru '''.lpr''':<br />
# pridajte direktívy '''{$mode delphi}{$H+}''' alebo '''{$mode objfpc}{H+}'''<br />
# pridajte jednotku '''Interfaces''' do sekcie uses<br />
# zakomentujte alebo zmažte direktívu {$R *.res} <br />
* urobte potrebné zmeny vo všetkých súboroch jednotiek '''.pas''':<br />
# pridajte direktívu '''{$mode delphi}{$H+}''' alebo '''{$mode objfpc}{H+}'''<br />
# pridajte '''LResources''' a, ak má formulár tlačítka, aj '''Buttons''' do sekcie uses<br />
# zakomentujte alebo zmažte direktívu {$R *.dfm} alebo {$R *.xfm}<br />
# pridajte sekciu '''Initialization''' nakoniec každého súboru jednotky a pridajte do nej direktívu '''{$I unitname.lrs}'''<br />
* vyberte '''Project->New Project from file'''<br />
* zvoľte súbor '''.lpr'''<br />
* v okne 'Create a new project' zvoľte 'Application'<br />
* vybudujte projekt a zaistite ďalšie potrebné opravy, v tomto okamžiku je automaticky vygenerovaný súbor .lpi.<br />
**Môžete sa stretnúť so správou 'Error reading Form', ak to nastane kliknite na 'Continue Loading'<br />
* všetko uložte a máte projekt Lazarus :-)<br />
<br />
== Získanie nápovedy ==<br />
<br />
Ak sa počas konverzie stretnete sproblémom, ktorý neviete vyriešiť, sú široké možnosti ako získať pomoc:<br />
<br />
=== Documentation ===<br />
<br />
* 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.<br />
* Pre problémy viac orientované na Lazarus, hľadajte aj v [[Main Page|Dokumentácii projektu Lazarus]].<br />
<br />
=== Partnerská podpora ===<br />
<br />
* 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.<br />
* IRC - na irc.freenode.net: [irc://irc.freenode.net/fpc #fpc] rpe FPC alebo [irc://irc.freenode.net/lazarus-ide #lazarus-ide] pre Lazarus<br />
<br />
=== Vedomostné bázy ===<br />
<br />
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:<br />
* Tamarack Associates poskytuej rýchly [http://www.tamaracka.com/search.htm vyhľadávací] stroj špecifické pre archívy Borland usenet.<br />
* Mer Systems Inc. poskytuje podobný vyhľadávací [http://www.mers.com/searchsite.html stroj].<br />
* Ď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].<br />
<br />
== Balíčkovanie a Uvoľňovanie komponentov ==<br />
<br />
=== Vytvorenie Lazarus balíčka s vašim komponentom ===<br />
<br />
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.<br />
<br />
=== Dokumentácia ===<br />
<br />
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.<br />
<br />
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.<br />
<br />
=== Tvorba Code Release stránky ===<br />
<br />
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ď.<br />
<br />
Pre vytvorenie svojej stránky Code Release vo svojom prehliadači: <br />
<br />
* prejdite na [[Release new component]]<br />
* napíšte meno komponentu do editačného poľa a kliknite na ''Create Article''<br />
* vyplňte šablónu a stlačte uložiť.<br />
* 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.<br />
<br />
=== Poslanie komponentu ===<br />
<br />
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.<br />
<br />
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]].<br />
<br />
== Contributors and Changes ==<br />
<br />
This page has been converted from the epikwiki [http://lazarus-ccr.sourceforge.net/index.php?wiki=CodeConversionGuide version].<br />
* Initial version by Tom Lisjac and Mattias Gärtner - 9/22/2003 [[User:Tom | VlxAdmin]]<br />
* Moved Getting help from the main page. T. Lisjac - 9/24/2003 [[User:Tom | VlxAdmin]]<br />
* Added documentation templates, procedure and links. 9/25/2003 [[User:Tom | VlxAdmin]]<br />
* LCLLinux was renamed to LCLIntf, [[User:Jesusrmx | Jesus Reyes]], 9/27/2003<br />
* added more information on Unit changes, [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson AndrewJohnson] 9/27/2003<br />
* Updated Syntax differences, including some examples, [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson AndrewJohnson] 9/27/2003<br />
* FPC 1.0.x doesn't support interfaces, [[User:Vincent | Vincent Snijders]] 9/28/2003<br />
* Fixed some of the examples per new WikiWord definition, 9/28/2003 [[User:Tom | VlxAdmin]]<br />
* Made code more consistant to remove last accidental Pascal WikiWord definitions, [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson AndrewJohnson] 9/27/2003<br />
* Use tables for code examples for nice blocks, and easy side by side view of Delphi->FPC differences, [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson AndrewJohnson] 10/17/2003<br />
* Use pascal stylesheet to make example code more readable, [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson AndrewJohnson] 10/18/2003</div>Slavkohttps://wiki.freepascal.org/index.php?title=Code_Conversion_Guide/sk&diff=26152Code Conversion Guide/sk2008-01-05T20:02:02Z<p>Slavko: Oprava preklepu</p>
<hr />
<div>{{Code Conversion Guide}}<br />
<br />
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.<br />
<br />
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. <br />
<br />
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.<br />
<br />
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. <br />
<br />
==Výber komponentov alebo knižnice pre konverziu==<br />
<br />
===Kde hľadať kód na konverziu===<br />
<br />
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].<br />
<br />
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].<br />
<br />
===Licencovanie===<br />
<br />
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.<br />
<br />
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.<br />
<br />
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".<br />
<br />
===Závislosti ===<br />
<br />
Ď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.<br />
<br />
===Poznámky k prekladaču===<br />
<br />
Viz:<br />
* [http://www.freepascal.org/probs.html Známe problémy]<br />
* [http://www.freepascal.org/bugs/db.php3?statusfield=Unfixed Neopravené chyby]<br />
<br />
===Poznámky k platforme a OS===<br />
<br />
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!<br />
<br />
==Konverzia ==<br />
<br />
===Nastavenie IDE Lazarus pre konverziu projektu===<br />
<br />
====Vytvorenie skúšobného projektu====<br />
* Umiestnite konvertovaný kód do podadresára (napr: convertdir)<br />
* Spusťte Lazarus<br />
* '''File->Save All''' do adresára convertdir. Zmysluplné mená pre Project a predvolenú jednotku sú voliteľné.<br />
* Otvorte "základnú" konvertovanú jednotku v convertdir<br />
* Pridajte ju do projektu: '''Project->Add Active Unit to Project'''<br />
* Spusťte '''Tools->Quick Syntax Check''' alebo '''Run->Build All''', čím začnete.<br />
<br />
====Na čo treba dať pozor====<br />
* 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'''.<br />
====Zdrojové kódy Delphi VCL a Kylix CLX v Lazarus====<br />
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'''.<br />
<br />
===Problémy konverzie a ich riešenie ===<br />
<br />
==== Ekvivalenty Delphi/Kylix súborov v Lazarus ====<br />
<br />
{|border="1" width="800" <br />
! Delphi / Kylix !! Popis !! Lazarus !! Popis<br />
|- <br />
|valign="top"| .pas<br />
<br />
.dfm/.xfm,<br />
<br />
.dcu/.dpu,<br />
<br />
.dpr(main project file),<br />
<br />
.res,<br />
<br />
.dof/.kof<br />
<br />
---<br />
<br />
---<br />
<br />
---<br />
<br />
|valign="top"| súbor zdrojového kódu Delphi,<br />
<br />
formulár Delphi,<br />
<br />
preložená jednotka Delphi,<br />
<br />
projekt Delphi,<br />
<br />
Resource súbor Windows,<br />
<br />
súbor volieb Delphi<br />
<br />
|valign="top"| .pas, .pp<br />
.lfm,<br />
<br />
.o,<br />
<br />
.lpr<br />
<br />
---<br />
<br />
---<br />
<br />
.lrs,<br />
<br />
.lpi(hlavný súbor projketu),<br />
<br />
.ppu<br />
<br />
|valign="top"| súbor jednotky Pascal,<br />
<br />
dátový súbor formulára,<br />
<br />
súbor preloženej jednotky,<br />
<br />
súbor projektu,<br />
<br />
Resource súbor,<br />
<br />
súbor volieb projektu,<br />
<br />
Resource súbor Lazarus,<br />
<br />
informačný súbor projektu Lazarus,<br />
<br />
popisný súbor jednotky FPC<br />
|}<br />
<br />
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.<br />
<br />
====Konverzia projektov/formulárov/jednotiek Delphi do Lazarus====<br />
<br />
Premenujte alebo prekopírujte súbor .dpr na súbor .lpr. Zakomentujte alebo odstráňte direktívu <br />
{$R *.res}<br />
a pridajte direktívu<br />
{$mode delphi}{$H+}<br />
alebo<br />
{$mode objfpc}{$H+}<br />
do súboru .lpr. <br />
<br />
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.<br />
<br />
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.<br />
<br />
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:<br />
<br />
# upraví veľkosť písmen v sekciách uses a iclude.<br />
# konvertuje súbory .dfm na súbory .lfm (bez kontroly obsahu, len formát)<br />
# vytvorí prázdny súbor .lrs (obsah bude pridaný neskôr)<br />
# pridá direktívu<br />
{$mode delphi}<br />
# nahradí jednotku Windows jednotkou LCLIntf<br />
# ak je to potrebné, pridá jednotku LResources<br />
# odoberie jednotku Variants<br />
# odoberie direktívu<br />
{$R *.dfm}<br />
# pridá do sekcie initialization direktívu <br />
{$i unit.lrs}<br />
<br />
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).<br />
<br />
====Výber správneho módu prekladača====<br />
<br />
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:<br />
<br />
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í.<br />
<br />
Väčšinu jednotiek Delphi môžete jednoducho preložiť pomocou [[Free Pascal]] pridaním tejto konštrukcie, hneď za meno jednotky<br />
{$IFDEF FPC}<br />
{$MODE DELPHI}<br />
{$ENDIF}<br />
<br />
Ď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].<br />
<br />
====Viac-platformové poznámky====<br />
* 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.<br />
* Neodkazujte na špecifické pamäťové miesto, ako dátová oblasť BIOS. Zistite čo kód potrebuje a skúste nájsť cezplatformovú alternatívu.<br />
* 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é.<br />
* Ak potrebujete nejaký kód, špecifický pre OS, používajte '''IFDEF'''. Viz zoznam makier neskôr.<br />
<br />
====Užitočné premenné prekladača====<br />
<br />
Pre písanie kódu, ktorý sa má správať na rôznych systémoch rôzne, môžete použiť direktívy<br />
{$IFDEF Name}<br />
Pričom Name môže byť<br />
*'''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.<br />
{$IfDef LCL}<br />
*'''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.<br />
{$IfDef FPC}<br />
*'''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.<br />
{$IfDef LCLGtk}<br />
{$IfDef LCLWin32}<br />
{$IfDef LCLQt}<br />
... <br />
*'''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ží.<br />
{$IfDef Unix}<br />
{$IfDef Win32}<br />
...<br />
: Pre prácu v Kylix použite nasledujúcu konštrukciu:<br />
{$IfDef Linux}<br />
{$Define Unix}<br />
{$EndIf}<br />
*'''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.<br />
{$IfDef ENDIAN_BIG}<br />
<br />
Ďalšie podrobnosti nájdete v [http://www.freepascal.org/docs-html/prog/prog.html#QQ2-23-21 dokumentácii Free Pascal].<br />
<br />
==== Podpora 32bit/64bit ====<br />
<br />
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:<br />
*'''PtrInt''' je 32bit Integer so znamienkom na 32bit platformách a 64bit Integer sp znamienkom na 64bit platformách.<br />
*'''PtrUInt''', je rovnaké ako predchádzajúce s tým rozdielom, že sa jedná o Integer bez znamienka.<br />
<br />
Pre kód, ktorý má pracovať s Delphi a FPC použite:<br />
{$IFNDEF FPC}<br />
type<br />
PtrInt = integer;<br />
PtrUInt = cardinal;<br />
{$ENDIF}<br />
<br />
Nahrďte všetky<br />
integer(SomePointerOrObject)<br />
týmto<br />
PtrInt(SomePointerOrObject)<br />
<br />
====Hľadanie chýbajúcich identifikátorov====<br />
<br />
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.<br />
<br />
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):<br />
<br />
grep -in ' tbutton =' lcl/*<br />
<br />
====Rozdiely v dôležitých jednotkách Lazarus a Delphi ====<br />
<br />
;Prosím dopĺňajte túto časť!;<br />
<br />
* Windows -> LCLIntf, LCLType, LCLProc, VCLGlobals, ...<br />
<br />
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ď).<br />
<br />
Jednotka '''Interfaces''' musí byť zahrnutá v súbore .lpr file pre správnu inicializáciu príslušného WidgetSet.<br />
<br />
* Messages->LMessages<br />
<br />
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'''.<br />
<br />
* Graphics, Controls->GraphTypes, GraphMath, Graphics, Controls<br />
<br />
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.<br />
<br />
Point1 := Point2 + Point3<br />
<br />
či porovnanie dvoch pravouholníkov ako<br />
<br />
if (rect1 = rect2) then ...<br />
<br />
* Mask->MaskEdit<br />
<br />
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.<br />
<br />
* StdCtrls->StdCtrls,Buttons<br />
<br />
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úť.<br />
<br />
====Rozdiely vo vlastnostiach a metódach Delphi -> FPC/LCL ====<br />
* v LCL je Canvas obsahnutý v TBitmap<br />
====Sémantické rozdiely ====<br />
<br />
===== Poradie vyhodnocovania parametrov =====<br />
<br />
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.<br />
<br />
===== Vnorené procedúry/funkcie sú procedurálne premenné =====<br />
<br />
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 premnnú.<br />
<br />
FPC vždy posiela framepointer rodičovskej procedúry ako skrytý prvý parameter, podľa aktuálnej konvecie vlanie, čo znamená, že ak voláte vnorenú procedúru ako bežnú procedirálnu premnnú, vštky parametre budú posunuté o jednu pozíciu.<br />
<br />
Inými slovami, nevolajte vnorené procedúry pomocou procedurálnych premenných.<br />
<br />
==== Syntaktické rozdiely ====<br />
<br />
;Prosím dopĺňajte túto kapitolu!<br />
<br />
Kvôli zdedenej prísnosti FPC, budú potrebné niektoré syntaktické zmeny, napriek direktíve<br />
{$Mode Delphi}<br />
pracuje oveľa pomalšie ako Delphi. Kvôli tomu oveľa viac vyhovujú pravidlá syntaxe<br />
{$Mode ObjFPC}<br />
ak je to možné, vrelo doporučujem, dokonca i keď bude kód zdieľaný medzi Delphi a LCL.<br />
<br />
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:<br />
<br />
=====Pri priraďovaní vstupného bodu obsluhy udalosti, pridajte predponu "@"=====<br />
<br />
Napríklad, môžete manuálne priradiť udalosť tlačítka<br />
{| border="1" width="800"<br />
! Delphi !! OBJFPC<br />
|-<br />
|<pascal><br />
begin<br />
if not Assigned(MyButton.OnClick) then <br />
MyButton.OnClick:= SomeFunction;<br />
//@ nie je vyžadované<br />
//ďalší kód...<br />
end;<br />
</pascal><br />
|<pascal><br />
begin<br />
if not Assigned(MyButton.OnClick) then<br />
MyButton.OnClick:= @SomeFunction;<br />
//@ je vyžadované<br />
//ďalší kód...<br />
end;<br />
</pascal><br />
|}<br />
<br />
=====Pri volaní procedurálnej premennej používajte túto syntax: theprocname()=====<br />
<br />
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<br />
{| border="1" width="800"<br />
! Delphi !! OBJFPC<br />
|-<br />
|<pascal><br />
With (SomeObject) do <br />
begin<br />
If Assigned(OnMyCallback) then<br />
OnMyCallback;<br />
//zátvorky nie sú vyžadované<br />
end;<br />
</pascal><br />
|<pascal><br />
With (SomeObject) do <br />
begin<br />
If Assigned(OnMyCallback) then<br />
OnMyCallback();<br />
//zátvorky sú vyžadované<br />
end;<br />
</pascal><br />
|}<br />
<br />
===== Pri pristupovaní k hodnotám v ukazovateli na záznam ho musíte najprv dereferencovať =====<br />
<br />
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. <br />
<br />
V FPC musí byť najprv dereferencovaný, napríklad:<br />
{| border="1" width="800"<br />
! Delphi !! OBJFPC<br />
|-<br />
|<pascal><br />
Function GetSomeValue(ARecord: PMyRecord):Integer;<br />
begin<br />
If Assigned(ARecord) then<br />
Result:=ARecord.SomeValue<br />
else<br />
Result:=0;<br />
end;<br />
</pascal><br />
|<pascal><br />
Function GetSomeValue(ARecord: PMyRecord):Integer;<br />
begin<br />
If Assigned(ARecord) then<br />
Result:=ARecord^.SomeValue<br />
else<br />
Result:=0;<br />
end;<br />
</pascal><br />
|}<br />
<br />
=====Pri pristupovaní znakov indexovaného reťazca Vlastnosti objektu, musí byť najprv uzatvorený v zátvorkách =====<br />
<br />
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.<br />
<br />
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<br />
{| border="1" width="800"<br />
! Delphi !! OBJFPC<br />
|-<br />
|<pascal><br />
Type TSomeComponent=class(TComponent)<br />
//Ďalší kód...<br />
Published<br />
Property MyString:String index 3 read GetMyString;<br />
//Ďalší kód...<br />
End;<br />
<br />
var<br />
MyChar:char;<br />
begin<br />
If Length(MyString)>2 then<br />
//nie sú potrebné zátvorky<br />
MyChar:= MyString[3];<br />
//Ďalší kód...<br />
end;<br />
</pascal><br />
|<pascal><br />
Type TSomeComponent=class(TComponent)<br />
//Ďalší kód...<br />
Published<br />
Property MyString:String index 3 read GetMyString;<br />
//Ďalší kód...<br />
End;<br />
<br />
var<br />
MyChar:char;<br />
begin<br />
If Length(MyString)>2 then<br />
//niekedy sú potrebné zátvorky<br />
MyChar:= (MyString)[3];<br />
//Ďalší kód...<br />
end;<br />
</pascal><br />
|}<br />
<br />
=====Pri použití ukazovateľov s premennými alebo funkciami, musíte ich najprv pretypovať na príslušný typ =====<br />
<br />
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. <br />
<br />
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<br />
<br />
{| border="1" width="800"<br />
! Delphi !! OBJFPC<br />
|-<br />
|<pascal><br />
Unit 1<br />
Type <br />
TSomeObject=class(TComponent)<br />
//Ďalší kód...<br />
End;<br />
<br />
Procedure DoSomething(Value: TSomeObject);<br />
Function GetSomeObject: TSomeObject;<br />
<br />
Unit 2<br />
Type <br />
TSomeComponent=class(TComponent)<br />
//Ďalší kód...<br />
Published SomeObject: Pointer;<br />
//Ďalší kód...<br />
End;<br />
<br />
Application<br />
var <br />
MyComponent: TSomeComponent;<br />
begin<br />
MyComponent.SomeObject:=GetSomeObject;<br />
//Ďalší kód...<br />
DoSomething(MyComponent.SomeObject);<br />
end;<br />
</pascal><br />
|<pascal><br />
Unit 1<br />
Type <br />
TSomeObject=class(TComponent)<br />
//Ďalší kód...<br />
End;<br />
<br />
Procedure DoSomething(Value: TSomeObject);<br />
Function GetSomeObject: TSomeObject;<br />
<br />
Unit 2<br />
Type<br />
TSomeComponent=class(TComponent)<br />
//Ďalší kód...<br />
Published SomeObject: Pointer;<br />
//Ďalší kód...<br />
End;<br />
<br />
Application<br />
var <br />
MyComponent: TSomeComponent;<br />
begin<br />
MyComponent.SomeObject:=Pointer(GetSomeObject);<br />
//Ďalší kód...<br />
DoSomething(TSomeObject(MyComponent.SomeObject));<br />
end;<br />
</pascal><br />
|}<br />
<br />
==== Resources ====<br />
<br />
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ť:<br />
cd lazarus/tools<br />
make install<br />
Pre pridanie resource do svojej aplikácie spusťte:<br />
lazres myresource.lrs mypix.xpm anotherpix.xpm<br />
A potom<br />
* pridajte jednotku '''LResources''' do sekcie '''Uses'''<br />
* zahrňte vami vytvorený súbor .lrs do bloku ''initialization''<br />
<br />
;Príklad:<br />
<pascal><br />
function TForm1.LoadGlyph(const GlyphName: String): TBitMap;<br />
begin<br />
Result:= TPixmap.Create;<br />
Result.LoadFromLazarusResource(GlyphName);<br />
end;<br />
//Ďalší kód...<br />
begin<br />
Speedbutton1.glyph:= LoadGlyph('mypix');<br />
//Ďalší kód...<br />
end<br />
<br />
initialization<br />
{$I unit1.lrs}<br />
{$I myresource.lrs}<br />
end.<br />
</pascal><br />
<br />
=== Iná metóda konverzie projektu Delphi/Kylix do Lazarus ===<br />
<br />
* 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)<br />
* premeujte súbor .dpr na '''.lpr'''<br />
* urobte potrebné zmeny súboru '''.lpr''':<br />
# pridajte direktívy '''{$mode delphi}{$H+}''' alebo '''{$mode objfpc}{H+}'''<br />
# pridajte jednotku '''Interfaces''' do sekcie uses<br />
# zakomentujte alebo zmažte direktívu {$R *.res} <br />
* urobte potrebné zmeny vo všetkých súboroch jednotiek '''.pas''':<br />
# pridajte direktívu '''{$mode delphi}{$H+}''' alebo '''{$mode objfpc}{H+}'''<br />
# pridajte '''LResources''' a, ak má formulár tlačítka, aj '''Buttons''' do sekcie uses<br />
# zakomentujte alebo zmažte direktívu {$R *.dfm} alebo {$R *.xfm}<br />
# pridajte sekciu '''Initialization''' nakoniec každého súboru jednotky a pridajte do nej direktívu '''{$I unitname.lrs}'''<br />
* vyberte '''Project->New Project from file'''<br />
* zvoľte súbor '''.lpr'''<br />
* v okne 'Create a new project' zvoľte 'Application'<br />
* vybudujte projekt a zaistite ďalšie potrebné opravy, v tomto okamžiku je automaticky vygenerovaný súbor .lpi.<br />
**Môžete sa stretnúť so správou 'Error reading Form', ak to nastane kliknite na 'Continue Loading'<br />
* všetko uložte a máte projekt Lazarus :-)<br />
<br />
== Získanie nápovedy ==<br />
<br />
Ak sa počas konverzie stretnete sproblémom, ktorý neviete vyriešiť, sú široké možnosti ako získať pomoc:<br />
<br />
=== Documentation ===<br />
<br />
* 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.<br />
* Pre problémy viac orientované na Lazarus, hľadajte aj v [[Main Page|Dokumentácii projektu Lazarus]].<br />
<br />
=== Partnerská podpora ===<br />
<br />
* 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.<br />
* IRC - na irc.freenode.net: [irc://irc.freenode.net/fpc #fpc] rpe FPC alebo [irc://irc.freenode.net/lazarus-ide #lazarus-ide] pre Lazarus<br />
<br />
=== Vedomostné bázy ===<br />
<br />
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:<br />
* Tamarack Associates poskytuej rýchly [http://www.tamaracka.com/search.htm vyhľadávací] stroj špecifické pre archívy Borland usenet.<br />
* Mer Systems Inc. poskytuje podobný vyhľadávací [http://www.mers.com/searchsite.html stroj].<br />
* Ď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].<br />
<br />
== Balíčkovanie a Uvoľňovanie komponentov ==<br />
<br />
=== Vytvorenie Lazarus balíčka s vašim komponentom ===<br />
<br />
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.<br />
<br />
=== Dokumentácia ===<br />
<br />
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.<br />
<br />
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.<br />
<br />
=== Tvorba Code Release stránky ===<br />
<br />
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ď.<br />
<br />
Pre vytvorenie svojej stránky Code Release vo svojom prehliadači: <br />
<br />
* prejdite na [[Release new component]]<br />
* napíšte meno komponentu do editačného poľa a kliknite na ''Create Article''<br />
* vyplňte šablónu a stlačte uložiť.<br />
* 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.<br />
<br />
=== Poslanie komponentu ===<br />
<br />
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.<br />
<br />
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]].<br />
<br />
== Contributors and Changes ==<br />
<br />
This page has been converted from the epikwiki [http://lazarus-ccr.sourceforge.net/index.php?wiki=CodeConversionGuide version].<br />
* Initial version by Tom Lisjac and Mattias Gärtner - 9/22/2003 [[User:Tom | VlxAdmin]]<br />
* Moved Getting help from the main page. T. Lisjac - 9/24/2003 [[User:Tom | VlxAdmin]]<br />
* Added documentation templates, procedure and links. 9/25/2003 [[User:Tom | VlxAdmin]]<br />
* LCLLinux was renamed to LCLIntf, [[User:Jesusrmx | Jesus Reyes]], 9/27/2003<br />
* added more information on Unit changes, [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson AndrewJohnson] 9/27/2003<br />
* Updated Syntax differences, including some examples, [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson AndrewJohnson] 9/27/2003<br />
* FPC 1.0.x doesn't support interfaces, [[User:Vincent | Vincent Snijders]] 9/28/2003<br />
* Fixed some of the examples per new WikiWord definition, 9/28/2003 [[User:Tom | VlxAdmin]]<br />
* Made code more consistant to remove last accidental Pascal WikiWord definitions, [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson AndrewJohnson] 9/27/2003<br />
* Use tables for code examples for nice blocks, and easy side by side view of Delphi->FPC differences, [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson AndrewJohnson] 10/17/2003<br />
* Use pascal stylesheet to make example code more readable, [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson AndrewJohnson] 10/18/2003</div>Slavkohttps://wiki.freepascal.org/index.php?title=Code_Conversion_Guide/sk&diff=26151Code Conversion Guide/sk2008-01-05T20:01:18Z<p>Slavko: Oprava preklepu</p>
<hr />
<div>{{Code Conversion Guide}}<br />
<br />
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.<br />
<br />
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. <br />
<br />
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.<br />
<br />
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. <br />
<br />
==Výber komponentov alebo knižnice pre konverziu==<br />
<br />
===Kde hľadať kód na konverziu===<br />
<br />
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].<br />
<br />
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].<br />
<br />
===Licencovanie===<br />
<br />
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.<br />
<br />
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.<br />
<br />
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".<br />
<br />
===Závislosti ===<br />
<br />
Ď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.<br />
<br />
===Poznámky k prekladaču===<br />
<br />
Viz:<br />
* [http://www.freepascal.org/probs.html Známe problémy]<br />
* [http://www.freepascal.org/bugs/db.php3?statusfield=Unfixed Neopravené chyby]<br />
<br />
===Poznámky k platforme a OS===<br />
<br />
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!<br />
<br />
==Konverzia ==<br />
<br />
===Nastavenie IDE Lazarus pre konverziu projektu===<br />
<br />
====Vytvorenie skúšobného projektu====<br />
* Umiestnite konvertovaný kód do podadresára (napr: convertdir)<br />
* Spusťte Lazarus<br />
* '''File->Save All''' do adresára convertdir. Zmysluplné mená pre Project a predvolenú jednotku sú voliteľné.<br />
* Otvorte "základnú" konvertovanú jednotku v convertdir<br />
* Pridajte ju do projektu: '''Project->Add Active Unit to Project'''<br />
* Spusťte '''Tools->Quick Syntax Check''' alebo '''Run->Build All''', čím začnete.<br />
<br />
====Na čo treba dať pozor====<br />
* 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'''.<br />
====Zdrojové kódy Delphi VCL a Kylix CLX v Lazarus====<br />
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'''.<br />
<br />
===Problémy konverzie a ich riešenie ===<br />
<br />
==== Ekvivalenty Delphi/Kylix súborov v Lazarus ====<br />
<br />
{|border="1" width="800" <br />
! Delphi / Kylix !! Popis !! Lazarus !! Popis<br />
|- <br />
|valign="top"| .pas<br />
<br />
.dfm/.xfm,<br />
<br />
.dcu/.dpu,<br />
<br />
.dpr(main project file),<br />
<br />
.res,<br />
<br />
.dof/.kof<br />
<br />
---<br />
<br />
---<br />
<br />
---<br />
<br />
|valign="top"| súbor zdrojového kódu Delphi,<br />
<br />
formulár Delphi,<br />
<br />
preložená jednotka Delphi,<br />
<br />
projekt Delphi,<br />
<br />
Resource súbor Windows,<br />
<br />
súbor volieb Delphi<br />
<br />
|valign="top"| .pas, .pp<br />
.lfm,<br />
<br />
.o,<br />
<br />
.lpr<br />
<br />
---<br />
<br />
---<br />
<br />
.lrs,<br />
<br />
.lpi(hlavný súbor projketu),<br />
<br />
.ppu<br />
<br />
|valign="top"| súbor jednotky Pascal,<br />
<br />
dátový súbor formulára,<br />
<br />
súbor preloženej jednotky,<br />
<br />
súbor projektu,<br />
<br />
Resource súbor,<br />
<br />
súbor volieb projektu,<br />
<br />
Resource súbor Lazarus,<br />
<br />
informačný súbor projektu Lazarus,<br />
<br />
popisný súbor jednotky FPC<br />
|}<br />
<br />
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.<br />
<br />
====Konverzia projektov/formulárov/jednotiek Delphi do Lazarus====<br />
<br />
Premenujte alebo prekopírujte súbor .dpr na súbor .lpr. Zakomentujte alebo odstráňte direktívu <br />
{$R *.res}<br />
a pridajte direktívu<br />
{$mode delphi}{$H+}<br />
alebo<br />
{$mode objfpc}{$H+}<br />
do súboru .lpr. <br />
<br />
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.<br />
<br />
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.<br />
<br />
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:<br />
<br />
# upraví veľkosť písmen v sekciách uses a iclude.<br />
# konvertuje súbory .dfm na súbory .lfm (bez kontroly obsahu, len formát)<br />
# vytvorí prázdny súbor .lrs (obsah bude pridaný neskôr)<br />
# pridá direktívu<br />
{$mode delphi}<br />
# nahradí jednotku Windows jednotkou LCLIntf<br />
# ak je to potrebné, pridá jednotku LResources<br />
# odoberie jednotku Variants<br />
# odoberie direktívu<br />
{$R *.dfm}<br />
# pridá do sekcie initialization direktívu <br />
{$i unit.lrs}<br />
<br />
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).<br />
<br />
====Výber správneho módu prekladača====<br />
<br />
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:<br />
<br />
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í.<br />
<br />
Väčšinu jednotiek Delphi môžete jednoducho preložiť pomocou [[Free Pascal]] pridaním tejto konštrukcie, hneď za meno jednotky<br />
{$IFDEF FPC}<br />
{$MODE DELPHI}<br />
{$ENDIF}<br />
<br />
Ď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].<br />
<br />
====Viac-platformové poznámky====<br />
* 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.<br />
* Neodkazujte na špecifické pamäťové miesto, ako dátová oblasť BIOS. Zistite čo kód potrebuje a skúste nájsť cezplatformovú alternatívu.<br />
* 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é.<br />
* Ak potrebujete nejaký kód, špecifický pre OS, používajte '''IFDEF'''. Viz zoznam makier neskôr.<br />
<br />
====Užitočné premenné prekladača====<br />
<br />
Pre písanie kódu, ktorý sa má správať na rôznych systémoch rôzne, môžete použiť direktívy<br />
{$IFDEF Name}<br />
Pričom Name môže byť<br />
*'''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.<br />
{$IfDef LCL}<br />
*'''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.<br />
{$IfDef FPC}<br />
*'''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.<br />
{$IfDef LCLGtk}<br />
{$IfDef LCLWin32}<br />
{$IfDef LCLQt}<br />
... <br />
*'''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ží.<br />
{$IfDef Unix}<br />
{$IfDef Win32}<br />
...<br />
: Pre prácu v Kylix použite nasledujúcu konštrukciu:<br />
{$IfDef Linux}<br />
{$Define Unix}<br />
{$EndIf}<br />
*'''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.<br />
{$IfDef ENDIAN_BIG}<br />
<br />
Ďalšie podrobnosti nájdete v [http://www.freepascal.org/docs-html/prog/prog.html#QQ2-23-21 dokumentácii Free Pascal].<br />
<br />
==== Podpora 32bit/64bit ====<br />
<br />
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:<br />
*'''PtrInt''' je 32bit Integer so znamienkom na 32bit platformách a 64bit Integer sp znamienkom na 64bit platformách.<br />
*'''PtrUInt''', je rovnaké ako predchádzajúce s tým rozdielom, že sa jedná o Integer bez znamienka.<br />
<br />
Pre kód, ktorý má pracovať s Delphi a FPC použite:<br />
{$IFNDEF FPC}<br />
type<br />
PtrInt = integer;<br />
PtrUInt = cardinal;<br />
{$ENDIF}<br />
<br />
Nahrďte všetky<br />
integer(SomePointerOrObject)<br />
týmto<br />
PtrInt(SomePointerOrObject)<br />
<br />
====Hľadanie chýbajúcich identifikátorov====<br />
<br />
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.<br />
<br />
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):<br />
<br />
grep -in ' tbutton =' lcl/*<br />
<br />
====Rozdiely v dôležitých jednotkách Lazarus a Delphi ====<br />
<br />
;Prosím dopĺňajte túto časť!;<br />
<br />
* Windows -> LCLIntf, LCLType, LCLProc, VCLGlobals, ...<br />
<br />
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ď).<br />
<br />
Jednotka '''Interfaces''' musí byť zahrnutá v súbore .lpr file pre správnu inicializáciu príslušného WidgetSet.<br />
<br />
* Messages->LMessages<br />
<br />
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'''.<br />
<br />
* Graphics, Controls->GraphTypes, GraphMath, Graphics, Controls<br />
<br />
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.<br />
<br />
Point1 := Point2 + Point3<br />
<br />
či porovnanie dvoch pravouholníkov ako<br />
<br />
if (rect1 = rect2) then ...<br />
<br />
* Mask->MaskEdit<br />
<br />
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.<br />
<br />
* StdCtrls->StdCtrls,Buttons<br />
<br />
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úť.<br />
<br />
====Rozdiely vo vlastnostiach a metódach Delphi -> FPC/LCL ====<br />
* v LCL je Canvas obsahnutý v TBitmap<br />
====Sémantické rozdiely ====<br />
<br />
===== Poradie vyhodnocovania parametrov =====<br />
<br />
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.<br />
<br />
===== Vnorené procedúry/funkcie sú procedurálne premenné =====<br />
<br />
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 premnnú.<br />
<br />
FPC vždy posiela framepointer rodičovskej procedúry ako skrytý prvý parameter, podľa aktuálnej konvecie vlanie, čo znamená, že ak voláte vnorenú procedúru ako bežnú procedirálnu premnnú, vštky parametre budú posunuté o jednu pozíciu.<br />
<br />
Inými slovami, nevolajte vnorené procedúry pomocou procedurálnych premenných.<br />
<br />
==== Syntaktické rozdiely ====<br />
<br />
;Prosím dopĺňajte túto kapitolu!<br />
<br />
Kvôli zdedenej prísnosti FPC, budú potrebné niektoré syntaktické zmeny, napriek direktíve<br />
{$Mode Delphi}<br />
pracuje oveľa pomalšie ako Delphi. Kvôli tomu oveľa viac vyhovujú pravidlá syntaxe<br />
{$Mode ObjFPC}<br />
ak je to možné, vrelo doporučujem, dokonca i keď bude kód zdieľaný medzi Delphi a LCL.<br />
<br />
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:<br />
<br />
=====Pri priraďovaní vstupného bodu obsluhy udalosti, pridajte predponu "@"=====<br />
<br />
Napríklad, môžete manuálne priradiť udalosť tlačítka<br />
{| border="1" width="800"<br />
! Delphi !! OBJFPC<br />
|-<br />
|<pascal><br />
begin<br />
if not Assigned(MyButton.OnClick) then <br />
MyButton.OnClick:= SomeFunction;<br />
//@ nie je vyžadované<br />
//ďalší kód...<br />
end;<br />
</pascal><br />
|<pascal><br />
begin<br />
if not Assigned(MyButton.OnClick) then<br />
MyButton.OnClick:= @SomeFunction;<br />
//@ je vyžadované<br />
//ďalší kód...<br />
end;<br />
</pascal><br />
|}<br />
<br />
=====Pri volaní procedurálnej premennej používajte túto syntax: theprocname()=====<br />
<br />
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<br />
{| border="1" width="800"<br />
! Delphi !! OBJFPC<br />
|-<br />
|<pascal><br />
With (SomeObject) do <br />
begin<br />
If Assigned(OnMyCallback) then<br />
OnMyCallback;<br />
//zátvorky nie sú vyžadované<br />
end;<br />
</pascal><br />
|<pascal><br />
With (SomeObject) do <br />
begin<br />
If Assigned(OnMyCallback) then<br />
OnMyCallback();<br />
//zátvorky sú vyžadované<br />
end;<br />
</pascal><br />
|}<br />
<br />
===== Pri pristupovaní k hodnotám v ukazovateli na záznam ho musíte najprv dereferencovať =====<br />
<br />
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. <br />
<br />
V FPC musí byť najprv dereferencovaný, napríklad:<br />
{| border="1" width="800"<br />
! Delphi !! OBJFPC<br />
|-<br />
|<pascal><br />
Function GetSomeValue(ARecord: PMyRecord):Integer;<br />
begin<br />
If Assigned(ARecord) then<br />
Result:=ARecord.SomeValue<br />
else<br />
Result:=0;<br />
end;<br />
</pascal><br />
|<pascal><br />
Function GetSomeValue(ARecord: PMyRecord):Integer;<br />
begin<br />
If Assigned(ARecord) then<br />
Result:=ARecord^.SomeValue<br />
else<br />
Result:=0;<br />
end;<br />
</pascal><br />
|}<br />
<br />
=====Pri pristupovaní znakov indexovaného reťazca Vlastnosti objektu, musí byť najprv uzatvorený v zátvorkách =====<br />
<br />
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.<br />
<br />
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<br />
{| border="1" width="800"<br />
! Delphi !! OBJFPC<br />
|-<br />
|<pascal><br />
Type TSomeComponent=class(TComponent)<br />
//Ďalší kód...<br />
Published<br />
Property MyString:String index 3 read GetMyString;<br />
//Ďalší kód...<br />
End;<br />
<br />
var<br />
MyChar:char;<br />
begin<br />
If Length(MyString)>2 then<br />
//nie sú potrebné zátvorky<br />
MyChar:= MyString[3];<br />
//Ďalší kód...<br />
end;<br />
</pascal><br />
|<pascal><br />
Type TSomeComponent=class(TComponent)<br />
//Ďalší kód...<br />
Published<br />
Property MyString:String index 3 read GetMyString;<br />
//Ďalší kód...<br />
End;<br />
<br />
var<br />
MyChar:char;<br />
begin<br />
If Length(MyString)>2 then<br />
//niekedy sú potrebné zátvorky<br />
MyChar:= (MyString)[3];<br />
//Ďalší kód...<br />
end;<br />
</pascal><br />
|}<br />
<br />
=====Pri použití ukazovateľov s premennými alebo funkciami, musíte ich najprv pretypovať na príslušný typ =====<br />
<br />
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. <br />
<br />
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<br />
<br />
{| border="1" width="800"<br />
! Delphi !! OBJFPC<br />
|-<br />
|<pascal><br />
Unit 1<br />
Type <br />
TSomeObject=class(TComponent)<br />
//Ďalší kód...<br />
End;<br />
<br />
Procedure DoSomething(Value: TSomeObject);<br />
Function GetSomeObject: TSomeObject;<br />
<br />
Unit 2<br />
Type <br />
TSomeComponent=class(TComponent)<br />
//Ďalší kód...<br />
Published SomeObject: Pointer;<br />
//Ďalší kód...<br />
End;<br />
<br />
Application<br />
var <br />
MyComponent: TSomeComponent;<br />
begin<br />
MyComponent.SomeObject:=GetSomeObject;<br />
//Ďalší kód...<br />
DoSomething(MyComponent.SomeObject);<br />
end;<br />
</pascal><br />
|<pascal><br />
Unit 1<br />
Type <br />
TSomeObject=class(TComponent)<br />
//Ďalší kód...<br />
End;<br />
<br />
Procedure DoSomething(Value: TSomeObject);<br />
Function GetSomeObject: TSomeObject;<br />
<br />
Unit 2<br />
Type<br />
TSomeComponent=class(TComponent)<br />
//Ďalší kód...<br />
Published SomeObject: Pointer;<br />
//Ďalší kód...<br />
End;<br />
<br />
Application<br />
var <br />
MyComponent: TSomeComponent;<br />
begin<br />
MyComponent.SomeObject:=Pointer(GetSomeObject);<br />
//Ďalší kód...<br />
DoSomething(TSomeObject(MyComponent.SomeObject));<br />
end;<br />
</pascal><br />
|}<br />
<br />
==== Resources ====<br />
<br />
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ť:<br />
cd lazarus/tools<br />
make install<br />
Pre pridanie resource do svojej aplikácie spusťte:<br />
lazres myresource.lrs mypix.xpm anotherpix.xpm<br />
A potom<br />
* pridajte jednotku '''LResources''' do sekcie '''Uses'''<br />
* zahrňte vami vytvorený súbor .lrs do bloku ''initialization''<br />
<br />
;Príklad:<br />
<pascal><br />
function TForm1.LoadGlyph(const GlyphName: String): TBitMap;<br />
begin<br />
Result:= TPixmap.Create;<br />
Result.LoadFromLazarusResource(GlyphName);<br />
end;<br />
//Ďalší kód...<br />
begin<br />
Speedbutton1.glyph:= LoadGlyph('mypix');<br />
//Ďalší kód...<br />
end<br />
<br />
initialization<br />
{$I unit1.lrs}<br />
{$I myresource.lrs}<br />
end.<br />
</pascal><br />
<br />
=== Iná metóda konverzie projketu Delphi/Kylix do Lazarus ===<br />
<br />
* 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)<br />
* premeujte súbor .dpr na '''.lpr'''<br />
* urobte potrebné zmeny súboru '''.lpr''':<br />
# pridajte direktívy '''{$mode delphi}{$H+}''' alebo '''{$mode objfpc}{H+}'''<br />
# pridajte jednotku '''Interfaces''' do sekcie uses<br />
# zakomentujte alebo zmažte direktívu {$R *.res} <br />
* urobte potrebné zmeny vo všetkých súboroch jednotiek '''.pas''':<br />
# pridajte direktívu '''{$mode delphi}{$H+}''' alebo '''{$mode objfpc}{H+}'''<br />
# pridajte '''LResources''' a, ak má formulár tlačítka, aj '''Buttons''' do sekcie uses<br />
# zakomentujte alebo zmažte direktívu {$R *.dfm} alebo {$R *.xfm}<br />
# pridajte sekciu '''Initialization''' nakoniec každého súboru jednotky a pridajte do nej direktívu '''{$I unitname.lrs}'''<br />
* vyberte '''Project->New Project from file'''<br />
* zvoľte súbor '''.lpr'''<br />
* v okne 'Create a new project' zvoľte 'Application'<br />
* vybudujte projekt a zaistite ďalšie potrebné opravy, v tomto okamžiku je automaticky vygenerovaný súbor .lpi.<br />
**Môžete sa stretnúť so správou 'Error reading Form', ak to nastane kliknite na 'Continue Loading'<br />
* všetko uložte a máte projekt Lazarus :-)<br />
<br />
== Získanie nápovedy ==<br />
<br />
Ak sa počas konverzie stretnete sproblémom, ktorý neviete vyriešiť, sú široké možnosti ako získať pomoc:<br />
<br />
=== Documentation ===<br />
<br />
* 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.<br />
* Pre problémy viac orientované na Lazarus, hľadajte aj v [[Main Page|Dokumentácii projektu Lazarus]].<br />
<br />
=== Partnerská podpora ===<br />
<br />
* 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.<br />
* IRC - na irc.freenode.net: [irc://irc.freenode.net/fpc #fpc] rpe FPC alebo [irc://irc.freenode.net/lazarus-ide #lazarus-ide] pre Lazarus<br />
<br />
=== Vedomostné bázy ===<br />
<br />
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:<br />
* Tamarack Associates poskytuej rýchly [http://www.tamaracka.com/search.htm vyhľadávací] stroj špecifické pre archívy Borland usenet.<br />
* Mer Systems Inc. poskytuje podobný vyhľadávací [http://www.mers.com/searchsite.html stroj].<br />
* Ď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].<br />
<br />
== Balíčkovanie a Uvoľňovanie komponentov ==<br />
<br />
=== Vytvorenie Lazarus balíčka s vašim komponentom ===<br />
<br />
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.<br />
<br />
=== Dokumentácia ===<br />
<br />
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.<br />
<br />
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.<br />
<br />
=== Tvorba Code Release stránky ===<br />
<br />
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ď.<br />
<br />
Pre vytvorenie svojej stránky Code Release vo svojom prehliadači: <br />
<br />
* prejdite na [[Release new component]]<br />
* napíšte meno komponentu do editačného poľa a kliknite na ''Create Article''<br />
* vyplňte šablónu a stlačte uložiť.<br />
* 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.<br />
<br />
=== Poslanie komponentu ===<br />
<br />
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.<br />
<br />
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]].<br />
<br />
== Contributors and Changes ==<br />
<br />
This page has been converted from the epikwiki [http://lazarus-ccr.sourceforge.net/index.php?wiki=CodeConversionGuide version].<br />
* Initial version by Tom Lisjac and Mattias Gärtner - 9/22/2003 [[User:Tom | VlxAdmin]]<br />
* Moved Getting help from the main page. T. Lisjac - 9/24/2003 [[User:Tom | VlxAdmin]]<br />
* Added documentation templates, procedure and links. 9/25/2003 [[User:Tom | VlxAdmin]]<br />
* LCLLinux was renamed to LCLIntf, [[User:Jesusrmx | Jesus Reyes]], 9/27/2003<br />
* added more information on Unit changes, [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson AndrewJohnson] 9/27/2003<br />
* Updated Syntax differences, including some examples, [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson AndrewJohnson] 9/27/2003<br />
* FPC 1.0.x doesn't support interfaces, [[User:Vincent | Vincent Snijders]] 9/28/2003<br />
* Fixed some of the examples per new WikiWord definition, 9/28/2003 [[User:Tom | VlxAdmin]]<br />
* Made code more consistant to remove last accidental Pascal WikiWord definitions, [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson AndrewJohnson] 9/27/2003<br />
* Use tables for code examples for nice blocks, and easy side by side view of Delphi->FPC differences, [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson AndrewJohnson] 10/17/2003<br />
* Use pascal stylesheet to make example code more readable, [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson AndrewJohnson] 10/18/2003</div>Slavkohttps://wiki.freepascal.org/index.php?title=Lazarus_Documentation/sk&diff=26143Lazarus Documentation/sk2008-01-05T19:29:12Z<p>Slavko: Oprava odkazov</p>
<hr />
<div>{{Lazarus Documentation}}<br />
<br />
Dostupná dokumentácia k Lazarus a Free Pascal v slovenskom jazyku, neúplná, ak chcete zapojte sa.<br />
<br />
==Príručky Lazarus a Pascal==<br />
<br />
*[[Overview of Free Pascal and Lazarus/sk | Zoznámenie s Free Pascal a Lazarus ]] - krátky popis o tom, čo možno vyvíjať s týmito všeobecnými nástrojmi.<br />
*[[Lazarus Tutorial/sk | Začíname s Lazarus]] - Návod pre začiatočníkov a detailný popis IDE Lazarus.<br />
*[[Lazarus IDE Tools/sk | Nástroje IDE Lazarus]] - Stredne zložitý návod o dokončovaní kódu a ostatných nástrojoch IDE.<br />
*[[Lazarus Database Tutorial/sk | Databázová príručka pre Lazarus]] - Uvod do použitia databáz v Lazarus.<br />
*[[Developing with Graphics/sk | Vývoj s grafikou]] - Niekoľko základných príkaldov pre prácu s grafikou.<br />
*[[Pascal Tutorial/sk | Úvod do Pascalu]] - [http://www.taoyue.com/ Tao Yueova] príručka Pascalu (zaradené s dovolením).<br />
*[[TXMLPropStorage/sk | TXMLPropStorage ]] - Použitie TXMLPropStorage na uloženie používateľských nastavení.<br />
*[[Executing External Programs/sk | Spúštanie externých programov]] - Krátka príručka ukazujúca ako spustiť externé programy zo svojho programu.<br />
*[[Hardware Access/sk | Prístup k hardvéru]] - Ako pristupovať priamo k zariadeniam ako ISA karty, PCI karty, paralelné a sériové porty a USB zariadenia.<br />
*[[Networking/sk | Sieť ]] - Príručka o XML, TCP/IP protokole, vytváraní sietových programov, WebServices, atď.<br />
*[[XML Tutorial/ Príručka XML]] - Písanie a čítanie súborov XML.<br />
*[[Multithreaded Application Tutorial/sk | Príručka viacvláknového programovania ]] - Ako naprogramovať viacvláknové aplikácie s použitím Free Pascalu a Lazarusa.<br />
*[[Streaming components/sk | Streamové komponenty ]] - Ako tvoriť komponenty pre streamovanie a čítať/tvoriť komponenty pre streamy.<br />
*[[OpenGL Tutorial/sk | príručka OpenGL ]] - Ako používať GLUT v Lazarus.<br />
*[[Creating bindings for C libraries/sk | Vytváranie prepojení na knižnice C ]] - Ako konvertovať hlavičkové súbory C (.h) na Pascalovské unity.<br />
*[[Lazarus/FPC Libraries/sk | FPC knižnice ]] - Ako tvoriť dynamické knižnice (.so, .dll, .dynlib) a ako ich použiť.<br />
*[[Translations/i18n/localizations for programs/sk | Lokalizácia programov ]] - Ako poskynúť lokalizoavné verzie programov a balíčkov.<br />
*[[Daemons and Services/sk | Démony a služby ]] - Ako tvoriť služby Windows a/alebo Linuxových démonov.<br />
<br />
==Užívateľské príručky Lazarus==<br />
*[[Lazarus Faq/sk |Lazarus FAQ]] - Všeobecné informácie o Lazarus a zvláštnostiach pre užívateľov Linux a Windows.<br />
*[[Lazarus DB Faq/sk |Lazarus DB FAQ]] - Často kladené otázky o databázových riešeniach v Lazarus.<br />
*[[Databases in Lazarus/sk | Databázy v Lazarus]] - Prehľad použitia databáz v Lazarus.<br />
*[[Code Examples/sk |Príklady kódov]] - Vzorové funkčné kódy pre Lazarus.<br />
*[[Feature_Ideas |Kniha prianí a želaní (en)]] - Vlastnosti, ktoré chcete mať v Lazarus.<br />
*[[How do I create a bug report/sk |Hlásenie chýb]] - Ako oznámiť chybu, o ktorej si myslíte, že ste ju našli v Lazarus?<br />
<br />
===Inštalácia=== <br />
*[[Installing Lazarus/sk |Inštalácia Lazarus]] - Inštalačná príručka.<br />
*[[Getting Lazarus/sk |Získanie Lazarus]] - Inštrukcie pre stiahnutie uvoľnenej alebo SVN verzie Lazarus.<br />
*[[OS X Programming Tips |Programovacie tipy pre OSX (en)]] - Inštalácia Lazarus, užitočné nástroje, príkazy Unixu atď...<br />
<br />
===IDE - Integrované vývojové prostredie===<br />
*[[IDE tricks|Triky pre IDE (en)]] - Tipy, triky a skryté vlastnosti.<br />
*[[Lazarus IDE|Lazarus IDE (en)]] - Popis okien IDE.<br />
*[[Lazarus Packages/sk |Balíčky v Lazarus]] - Návod pre tvorbu balíčka v Lazarus.<br />
*[[Install Packages/sk |Inštalácia balíčkov ]] - Malá príručka pre inštaláciu balíčkov.<br />
*[[Extending the IDE/sk |Rozšírenie IDE]] - Ako do IDE Lazarus pridať funkciu.<br />
*[[Adding Kylix Help/sk |Pridanie nápovedy Kylix]] - Ako používať súbory nápovedy Borlandu v editore IDE.<br />
<br />
===LCL - Knižnica komponentov Lazarus ===<br />
*[[doc:lcl/|Dokumentácia LCL (en)]] - On-line nápoveda pre LCL (práca postupuje, len v angličtine).<br />
*[[Autosize / Layout/sk |Automatická veľkosť vzhľadu]] - Ako navrhnúť formulár, ktorý pracuje na všetkých platformách.<br />
*[[Main Loop Hooks/sk |Main Loop Hooks ]] - Ako obsluhovať viaceré zdroje udalostí.<br />
*[[Asynchronous Calls/sk | Asynchrónne volania ]] - Ak radiť metódy do fronty pre neskošie vykonanie.<br />
*[[File size and smartlinking/sk |Veľkosť súboru a smartlinking]] - Ako smartlinkovať programy a vytvoriť menšie programy.<br />
*[[Accessing the Interfaces directly/sk |Priamy prístup k rozhraniam ]] - Ukážka ako pristupovať LCL widgetsety.<br />
*[[Add Help to Your Application/sk |Pridajte do svojej aplikácie nápovedu ]] - Ako vytvoriť Online nápovedu pre svoju aplikáciu.<br />
*[[Anchor Sides/sk |Anchor Sides]] - Popis vlastnosti Anchor Sides.<br />
*[[LCL Tips/sk |LCL tipy ]] - Tipy a triky<br />
*[[LCL Defines/sk |Definovanie LCL]] - Výber správnych volieb pre rekompiláciu LCL.<br />
<br />
===Vývoj===<br />
*[[The Power of Proper Planning and Practices |Správne plánovanie a postupy (en)]] - Všeobecné najlepšie postupy pre vývojárov Free Pascal a Lazarus.<br />
*[[Multiplatform Programming Guide/sk |Príručka viacplatformového programovania]] - Ak vyvíjať cezplatformové aplikácie a portovať z jednej platformy na inú.<br />
*[[Using Pascal Libraries with .NET and Mono/sk |Použitie knižníc Pascalu s .NET a Mono]] - Áno, môžete použiť kód Free Pascal s .NET a Mono.<br />
*[[Deploying Your Application/sk|Inštalujte svoje aplikácie]] - Ako vytvoriť pre svoj program inštalátor.<br />
*[[Cross compiling/sk |Krížová kompilácia]] - Vytváranie spustiteľných programov z jednej platformy na inej.<br />
*[[Remote Debugging/sk |Vzdialené ladenie]] - Ako ladiť svoje Lazarus programy na inom stroji.<br />
*[[Application Icon/sk |Ikona programu]] - Nastavenie ikony programu.<br />
<br />
=== Nástroje ===<br />
*[[Lazarus Documentation Editor/sk |Editor dokumentácie Lazarus]] - Použitie '''lazde''' pre vytváranie dokumentácie<br />
*[[LazDoc/sk |LazDoc]] - integrovaný editor pre súbory dokumentácie.<br />
*[[FPDoc Updater/sk |Aktualizátor FPDoc]] - GUI nástroj pre aktualizáciu súborov FPDoc.<br />
*[[lazbuild/sk |lazbuild]] - Kompilácia projektov a balíčkov bez IDE.<br />
<br />
===Prechod z Delphi===<br />
*[[Lazarus Components|Komponenty Lazarus (en)]] - Porovnanie komponentov Lazarus a Turbo Delphi.<br />
*[[Lazarus For Delphi Users/sk |Prechod z Delphi na Lazarus]] - Pre užívateľov Delphi, ktorí prechádzajú na Lazarus.<br />
* [[Code Conversion Guide/sk |Konverzia zdrojového kódu]] - Ako preniesť existujúci kód a komponenty z Delphi a Kylix.<br />
<br />
==Príručky vývojárov Lazarus==<br />
*[[How To Help Developing Lazarus | Ako pomôcť s vývojom Lazarus (en)]] - Príručka pre nováčikov začínajúcich vylepšovanie Lazarus.<br />
*[[Version Numbering | Číslovanie verzií (en)]] - Vysvetlenie rôznych čísiel verzií Lazarus.<br />
*[[Creating A Patch/sk | Tvorba patchov ]] - Príručka tvorby záplat so zmenami Lazarus.<br />
*[[Creating a Backtrace with GDB | Tvorba backtrace pomocou GDB (en)]] - Príručka tvorby backtrace pre pomoc s ladením programu.<br />
*[[How To Make Lazarus Docs/sk | Tvorba dokumentácie Lazarus]] - Návod na vytváranie dokumentačných súborov.<br />
*[[Nomenclature | Nomenklatúra (en)]] - Príručka pre voľbu mena novej metódy alebo vlastnosti.<br />
*[[DesignGuidelines | Rukoväť vývojára (en)]] - Návod ako postupovať pri zmene zdrojového kódu Lazarus.<br />
*[[GUI design | Návrh GUI (en)]] - Rukoväť návrhu Lazarus GUI<br />
*[[Roadmap | Roadmap (en)]] - Predstava o aktuálnom stave rôznych častí Lazarus.<br />
*[[Road To 1.0 | Cesta k 1.0 (en)]] - Čo je treba urobiť pre Lazarus 1.0<br />
*[[Detailed Lazarus 0.9.24 todo | Detailné Lazarus 0.9.24 ToDo (en)]] - Kontrolný list pre uvoľnenie 0.9.24<br />
*[[Moderating the bug tracker | Moderovanie sledovania chýb (en)]] - Príručka pre vývojárov a moderátorov Lazarus o použití [http://www.freepascal.org/mantis/ sledovania chýb].<br />
*[[Codetools | Codetools (en)]] - Ako sú CodeTools integrované do IDE.<br />
*[[Creating IDE Help | Tvorba nápovedy IDE (en)]] - Ako rozšíriť dokumentáciu IDE.<br />
*[[Unit not found - How to find units | Unita nenájdená - Ako hľadať unity (en)]] - Ako nastaviť IDE a zdrojové súbory.<br />
*[[Bounties | Bounties (en)]] - Potrebujete konkrétnu novú vlastnosť rýchlo? Tu nastavte cenu. <br />
<br />
===LCL - Lazarus component library===<br />
*[[LCL Messages/sk | Správy LCL]] - Príručka zameraná na správy LCL.<br />
*[[LCL Internals | Vnútro LCL (en)]] - Informácie o vnútornom fungovaní LCL.<br />
*[[LCL Key Handling | LCL Obsluha kláves (en)]] - Pomoc! Klávesa stlačená, čo teraz?<br />
*[[LCL Internals - Resizing, Moving | Vnútro LCL - Zmena veľkosti, Presun (en)]] - Ako LCL komunikuje s rozhraním LCL pre zmenu veľkosti, presun ovládacích prvkov.<br />
*[[LCL Unicode Support | Podpora Unicode v LCL (en)]] - Cesta k podpore Unicode v Lazarus.<br />
*[[LCL Documentation Roadmap | Dokumentačná mapa LCL (en)]] - Ktoré jednotky ešte treba zdokumentovať.<br />
<br />
===Interfaces===<br />
* [[Lazarus known issues (things that will never be fixed) | Známe riešenia Lazarus (ktoré nebudú zmenené) (en)]] - Zoznam riešení kompatibility rozhrania.<br />
*[[GTK2 Interface | Rozhranie GTK2 (en)]] - gtk2 pre Unixy, Mac OS X, Windows<br />
*[[Carbon Interface | Rozhranie Carbon (en)]] - Rozhranie Carbon pre Mac OS X<br />
*[[Qt Interface |Rozhranie Qt (en)]] - Rozhranie Qt 4 pre Unixy, Mac OS X a Linuxové PDA.<br />
*[[Windows CE Interface | Rozhranie Windows CE (en)]] - Pre Pocket PC a Smartphony<br />
*[[fpGUI Interface | Rozhranie fpGUI (en)]] - Množina nástrojov kompletne napísaná v Object Pascale.<br />
<br />
===Preklady===<br />
* [[Getting translation strings right | Správne preložené reťazce (en)]] Niekoľko poznámok pre programátorov o tom ako vo svojich aplikáciách tvoriť a používať preložiteľné reťazce. Rýchlejšie rozobrané všeobecné veci o tvorbe reťazcov, poskytuje niekoľko rád pre riešenie implementácie a ukazuje niektoré veci na zváženie, pri použití Angličtiny ako základného jazyka.<br />
<br />
<!-- *[[TO-DO]] Remaining Tasks --><br />
* [[Help:Add language bar/sk | Pridanie jazykovej lišty]] - Vysvetľuje ako na vrch wiki stránky pridať zoznam prekladov.<br />
<br />
== Dokumentácia ďalších komponentov ==<br />
*[[Pascal Script]] a [[Pascal Script Examples]] - Ako použiť komponenty Pascal script v Lazarus.<br />
*[[OpenGL]] - Ako použiť OpenGL v Lazarus<br />
*[[KOL-CE]] - Free Pascal/Lazarus port knižnice KOL&MCK. Ako v Lazarus vytvoriť veľmi kompaktné aplikácie pre Win32/WinCE.<br />
<br />
==Dokumentácia prekladača Free Pascal==<br />
Okrem [http://lazarus-ccr.sourceforge.net/fpcdoc/ tejto stránky], sa posledná verzia online dokumentácie v rôznych stiahnuteľných formátoch nachádza na hlavnej stránke [http://www.freepascal.org/docs.html Free Pascal Compiler].<br />
<br />
*[http://lazarus-ccr.sourceforge.net/fpcdoc/user/user.html Používateľská príručka]<br />
*[http://lazarus-ccr.sourceforge.net/fpcdoc/prog/prog.html Príručka programátora]<br />
*[http://lazarus-ccr.sourceforge.net/fpcdoc/ref/ref.html Referenčná príručka pre unitu system a podporované konštrukcie Pascalu]<br />
*[http://lazarus-ccr.sourceforge.net/fpcdoc/rtl/index.html Referenčný manuál Run-Time Library]<br />
*[http://lazarus-ccr.sourceforge.net/fpcdoc/fcl/index.html Referenčný manuál Free Component Library]<br />
*[http://lazarus-ccr.sourceforge.net/fpcdoc/fpdoc/fpdoc.html Manuál dokumentačného nástroja Free Pascal ]<br />
*[[Build messages]]<br />
<br />
== Blogy a weby o Lazarus ==<br />
=== Blogy ===<br />
*[[Adventures of a Newbie]] - Blog nováčika, začínaji s nejakými návodnými informáciami v bežiacom zázname.<br />
*[http://lazarusroad.blogspot.com/ Na ceste s Lazarus/Freepascal] - Blog určený pre záznamy o ksúsenostiach pri programovaní s Lazarus a Freepascal (by Luiz Américo)<br />
*[http://port2laz.blogspot.com/ Prenos do Lazarus] - Blog popisujúci prenos stredne veľkých aplikácií (100 k) z D7 s CLX do Lazarus (by Alexsander da Rosa)<br />
*[http://living-lazarus.blogspot.com/ Život Lazarus] - Bádanie jedného človeka o možnostiach open source RAD (by [[User:Wibblytim|Wibblytim]]).<br />
*[http://beeography.wordpress.com/tag/object-pascal/ Bee.ography] - Jednoducho (ďalší) bzukot včely!<br />
<br />
=== Webové stráky ===<br />
*[[swainbrain pascal wiki]] - Unikátne návody a informácie Free Pascal [http://mercury.it.swin.edu.au/swinbrain/index.php/Pascal#Pascal_Development_Tools swainbrain]</div>Slavkohttps://wiki.freepascal.org/index.php?title=Lazarus_Documentation/sk&diff=26139Lazarus Documentation/sk2008-01-05T19:09:48Z<p>Slavko: Oprava odkazu</p>
<hr />
<div>{{Lazarus Documentation}}<br />
<br />
Dostupná dokumentácia k Lazarus a Free Pascal v slovenskom jazyku, neúplná, ak chcete zapojte sa.<br />
<br />
==Príručky Lazarus a Pascal==<br />
<br />
*[[Overview of Free Pascal and Lazarus/sk | Zoznámenie s Free Pascal a Lazarus ]] - krátky popis o tom, čo možno vyvíjať s týmito všeobecnými nástrojmi.<br />
*[[Lazarus Tutorial/sk | Začíname s Lazarus]] - Návod pre začiatočníkov a detailný popis IDE Lazarus.<br />
*[[Lazarus IDE Tools/sk | Nástroje IDE Lazarus]] - Stredne zložitý návod o dokončovaní kódu a ostatných nástrojoch IDE.<br />
*[[Lazarus Database Tutorial/sk | Databázová príručka pre Lazarus]] - Uvod do použitia databáz v Lazarus.<br />
*[[Developing with Graphics/sk | Vývoj s grafikou]] - Niekoľko základných príkaldov pre prácu s grafikou.<br />
*[[Pascal Tutorial/sk | Úvod do Pascalu]] - [http://www.taoyue.com/ Tao Yueova] príručka Pascalu (zaradené s dovolením).<br />
*[[TXMLPropStorage/sk | TXMLPropStorage ]] - Použitie TXMLPropStorage na uloženie používateľských nastavení.<br />
*[[Executing External Programs/sk | Spúštanie externých programov]] - Krátka príručka ukazujúca ako spustiť externé programy zo svojho programu.<br />
*[[Hardware Access/sk | Prístup k hardvéru]] - Ako pristupovať priamo k zariadeniam ako ISA karty, PCI karty, paralelné a sériové porty a USB zariadenia.<br />
*[[Networking/sk | Sieť ]] - Príručka o XML, TCP/IP protokole, vytváraní sietových programov, WebServices, atď.<br />
*[[XML Tutorial/ Príručka XML]] - Písanie a čítanie súborov XML.<br />
*[[Multithreaded Application Tutorial/sk | Príručka viacvláknového programovania ]] - Ako naprogramovať viacvláknové aplikácie s použitím Free Pascalu a Lazarusa.<br />
*[[Streaming components/sk | Streamové komponenty ]] - Ako tvoriť komponenty pre streamovanie a čítať/tvoriť komponenty pre streamy.<br />
*[[OpenGL Tutorial/sk | príručka OpenGL ]] - Ako používať GLUT v Lazarus.<br />
*[[Creating bindings for C libraries/sk | Vytváranie prepojení na knižnice C ]] - Ako konvertovať hlavičkové súbory C (.h) na Pascalovské unity.<br />
*[[Lazarus/FPC Libraries/sk | FPC knižnice ]] - Ako tvoriť dynamické knižnice (.so, .dll, .dynlib) a ako ich použiť.<br />
*[[Translations/i18n/localizations for programs/sk | Lokalizácia programov ]] - Ako poskynúť lokalizoavné verzie programov a balíčkov.<br />
*[[Daemons and Services/sk | Démony a služby ]] - Ako tvoriť služby Windows a/alebo Linuxových démonov.<br />
<br />
==Užívateľské príručky Lazarus==<br />
*[[Lazarus Faq/sk |Lazarus FAQ]] - Všeobecné informácie o Lazarus a zvláštnostiach pre užívateľov Linux a Windows.<br />
*[[Lazarus DB Faq/sk |Lazarus DB FAQ]] - Často kladené otázky o databázových riešeniach v Lazarus.<br />
*[[Databases in Lazarus/sk | Databázy v Lazarus]] - Prehľad použitia databáz v Lazarus.<br />
*[[Code Examples/sk |Príklady kódov]] - Vzorové funkčné kódy pre Lazarus.<br />
*[[Feature_Ideas |Kniha prianí a želaní (en)]] - Vlastnosti, ktoré chcete mať v Lazarus.<br />
*[[How do I create a bug report/sk |Hlásenie chýb]] - Ako oznámiť chybu, o ktorej si myslíte, že ste ju našli v Lazarus?<br />
<br />
===Inštalácia=== <br />
*[[Installing Lazarus/sk |Inštalácia Lazarus]] - Inštalačná príručka.<br />
*[[Getting Lazarus/sk |Získanie Lazarus]] - Inštrukcie pre stiahnutie uvoľnenej alebo SVN verzie Lazarus.<br />
*[[OS X Programming Tips |Programovacie tipy pre OSX (en)]] - Inštalácia Lazarus, užitočné nástroje, príkazy Unixu atď...<br />
<br />
===IDE - Integrované vývojové prostredie===<br />
*[[IDE tricks/sk |Triky pre IDE]] - Tipy, triky a skryté vlastnosti.<br />
*[[Lazarus IDE/sk |Lazarus IDE]] - Popis okien IDE.<br />
*[[Lazarus Packages/sk |Balíčky v Lazarus]] - Návod pre tvorbu balíčka v Lazarus.<br />
*[[Install Packages/sk |Inštalácia balíčkov ]] - Malá príručka pre inštaláciu balíčkov.<br />
*[[Extending the IDE/sk |Rozšírenie IDE]] - Ako do IDE Lazarus pridať funkciu.<br />
*[[Adding Kylix Help/sk |Pridanie nápovedy Kylix]] - Ako používať súbory nápovedy Borlandu v editore IDE.<br />
<br />
===LCL - Knižnica komponentov Lazarus ===<br />
*[[doc:lcl/|Dokumentácia LCL (en)]] - On-line nápoveda pre LCL (práca postupuje, len v angličtine).<br />
*[[Autosize / Layout/sk |Automatická veľkosť vzhľadu]] - Ako navrhnúť formulár, ktorý pracuje na všetkých platformách.<br />
*[[Main Loop Hooks/sk |Main Loop Hooks ]] - Ako obsluhovať viaceré zdroje udalostí.<br />
*[[Asynchronous Calls/sk | Asynchrónne volania ]] - Ak radiť metódy do fronty pre neskošie vykonanie.<br />
*[[File size and smartlinking/sk |Veľkosť súboru a smartlinking]] - Ako smartlinkovať programy a vytvoriť menšie programy.<br />
*[[Accessing the Interfaces directly/sk |Priamy prístup k rozhraniam ]] - Ukážka ako pristupovať LCL widgetsety.<br />
*[[Add Help to Your Application/sk |Pridajte do svojej aplikácie nápovedu ]] - Ako vytvoriť Online nápovedu pre svoju aplikáciu.<br />
*[[Anchor Sides/sk |Anchor Sides]] - Popis vlastnosti Anchor Sides.<br />
*[[LCL Tips/sk |LCL tipy ]] - Tipy a triky<br />
*[[LCL Defines/sk |Definovanie LCL]] - Výber správnych volieb pre rekompiláciu LCL.<br />
<br />
===Vývoj===<br />
*[[The Power of Proper Planning and Practices |Správne plánovanie a postupy (en)]] - Všeobecné najlepšie postupy pre vývojárov Free Pascal a Lazarus.<br />
*[[Multiplatform Programming Guide/sk |Príručka viacplatformového programovania]] - Ak vyvíjať cezplatformové aplikácie a portovať z jednej platformy na inú.<br />
*[[Using Pascal Libraries with .NET and Mono/sk |Použitie knižníc Pascalu s .NET a Mono]] - Áno, môžete použiť kód Free Pascal s .NET a Mono.<br />
*[[Deploying Your Application/sk|Inštalujte svoje aplikácie]] - Ako vytvoriť pre svoj program inštalátor.<br />
*[[Cross compiling/sk |Krížová kompilácia]] - Vytváranie spustiteľných programov z jednej platformy na inej.<br />
*[[Remote Debugging/sk |Vzdialené ladenie]] - Ako ladiť svoje Lazarus programy na inom stroji.<br />
*[[Application Icon/sk |Ikona programu]] - Nastavenie ikony programu.<br />
<br />
=== Nástroje ===<br />
*[[Lazarus Documentation Editor/sk |Editor dokumentácie Lazarus]] - Použitie '''lazde''' pre vytváranie dokumentácie<br />
*[[LazDoc/sk |LazDoc]] - integrovaný editor pre súbory dokumentácie.<br />
*[[FPDoc Updater/sk |Aktualizátor FPDoc]] - GUI nástroj pre aktualizáciu súborov FPDoc.<br />
*[[lazbuild/sk |lazbuild]] - Kompilácia projektov a balíčkov bez IDE.<br />
<br />
===Prechod z Delphi===<br />
*[[Lazarus Components|Komponenty Lazarus (en)]] - Porovnanie komponentov Lazarus a Turbo Delphi.<br />
*[[Lazarus For Delphi Users/sk |Prechod z Delphi na Lazarus]] - Pre užívateľov Delphi, ktorí prechádzajú na Lazarus.<br />
* [[Code Conversion Guide/sk |Konverzia zdrojového kódu]] - Ako preniesť existujúci kód a komponenty z Delphi a Kylix.<br />
<br />
==Príručky vývojárov Lazarus==<br />
*[[How To Help Developing Lazarus | Ako pomôcť s vývojom Lazarus (en)]] - Príručka pre nováčikov začínajúcich vylepšovanie Lazarus.<br />
*[[Version Numbering | Číslovanie verzií (en)]] - Vysvetlenie rôznych čísiel verzií Lazarus.<br />
*[[Creating A Patch/sk | Tvorba patchov ]] - Príručka tvorby záplat so zmenami Lazarus.<br />
*[[Creating a Backtrace with GDB | Tvorba backtrace pomocou GDB (en)]] - Príručka tvorby backtrace pre pomoc s ladením programu.<br />
*[[How To Make Lazarus Docs/sk | Tvorba dokumentácie Lazarus]] - Návod na vytváranie dokumentačných súborov.<br />
*[[Nomenclature | Nomenklatúra (en)]] - Príručka pre voľbu mena novej metódy alebo vlastnosti.<br />
*[[DesignGuidelines | Rukoväť vývojára (en)]] - Návod ako postupovať pri zmene zdrojového kódu Lazarus.<br />
*[[GUI design | Návrh GUI (en)]] - Rukoväť návrhu Lazarus GUI<br />
*[[Roadmap | Roadmap (en)]] - Predstava o aktuálnom stave rôznych častí Lazarus.<br />
*[[Road To 1.0 | Cesta k 1.0 (en)]] - Čo je treba urobiť pre Lazarus 1.0<br />
*[[Detailed Lazarus 0.9.24 todo | Detailné Lazarus 0.9.24 ToDo (en)]] - Kontrolný list pre uvoľnenie 0.9.24<br />
*[[Moderating the bug tracker | Moderovanie sledovania chýb (en)]] - Príručka pre vývojárov a moderátorov Lazarus o použití [http://www.freepascal.org/mantis/ sledovania chýb].<br />
*[[Codetools | Codetools (en)]] - Ako sú CodeTools integrované do IDE.<br />
*[[Creating IDE Help | Tvorba nápovedy IDE (en)]] - Ako rozšíriť dokumentáciu IDE.<br />
*[[Unit not found - How to find units | Unita nenájdená - Ako hľadať unity (en)]] - Ako nastaviť IDE a zdrojové súbory.<br />
*[[Bounties | Bounties (en)]] - Potrebujete konkrétnu novú vlastnosť rýchlo? Tu nastavte cenu. <br />
<br />
===LCL - Lazarus component library===<br />
*[[LCL Messages/sk | Správy LCL]] - Príručka zameraná na správy LCL.<br />
*[[LCL Internals | Vnútro LCL (en)]] - Informácie o vnútornom fungovaní LCL.<br />
*[[LCL Key Handling | LCL Obsluha kláves (en)]] - Pomoc! Klávesa stlačená, čo teraz?<br />
*[[LCL Internals - Resizing, Moving | Vnútro LCL - Zmena veľkosti, Presun (en)]] - Ako LCL komunikuje s rozhraním LCL pre zmenu veľkosti, presun ovládacích prvkov.<br />
*[[LCL Unicode Support | Podpora Unicode v LCL (en)]] - Cesta k podpore Unicode v Lazarus.<br />
*[[LCL Documentation Roadmap | Dokumentačná mapa LCL (en)]] - Ktoré jednotky ešte treba zdokumentovať.<br />
<br />
===Interfaces===<br />
* [[Lazarus known issues (things that will never be fixed) | Známe riešenia Lazarus (ktoré nebudú zmenené) (en)]] - Zoznam riešení kompatibility rozhrania.<br />
*[[GTK2 Interface | Rozhranie GTK2 (en)]] - gtk2 pre Unixy, Mac OS X, Windows<br />
*[[Carbon Interface | Rozhranie Carbon (en)]] - Rozhranie Carbon pre Mac OS X<br />
*[[Qt Interface |Rozhranie Qt (en)]] - Rozhranie Qt 4 pre Unixy, Mac OS X a Linuxové PDA.<br />
*[[Windows CE Interface | Rozhranie Windows CE (en)]] - Pre Pocket PC a Smartphony<br />
*[[fpGUI Interface | Rozhranie fpGUI (en)]] - Množina nástrojov kompletne napísaná v Object Pascale.<br />
<br />
===Preklady===<br />
* [[Getting translation strings right | Správne preložené reťazce (en)]] Niekoľko poznámok pre programátorov o tom ako vo svojich aplikáciách tvoriť a používať preložiteľné reťazce. Rýchlejšie rozobrané všeobecné veci o tvorbe reťazcov, poskytuje niekoľko rád pre riešenie implementácie a ukazuje niektoré veci na zváženie, pri použití Angličtiny ako základného jazyka.<br />
<br />
<!-- *[[TO-DO]] Remaining Tasks --><br />
* [[Help:Add language bar/sk | Pridanie jazykovej lišty]] - Vysvetľuje ako na vrch wiki stránky pridať zoznam prekladov.<br />
<br />
== Dokumentácia ďalších komponentov ==<br />
*[[Pascal Script]] a [[Pascal Script Examples]] - Ako použiť komponenty Pascal script v Lazarus.<br />
*[[OpenGL]] - Ako použiť OpenGL v Lazarus<br />
*[[KOL-CE]] - Free Pascal/Lazarus port knižnice KOL&MCK. Ako v Lazarus vytvoriť veľmi kompaktné aplikácie pre Win32/WinCE.<br />
<br />
==Dokumentácia prekladača Free Pascal==<br />
Okrem [http://lazarus-ccr.sourceforge.net/fpcdoc/ tejto stránky], sa posledná verzia online dokumentácie v rôznych stiahnuteľných formátoch nachádza na hlavnej stránke [http://www.freepascal.org/docs.html Free Pascal Compiler].<br />
<br />
*[http://lazarus-ccr.sourceforge.net/fpcdoc/user/user.html Používateľská príručka]<br />
*[http://lazarus-ccr.sourceforge.net/fpcdoc/prog/prog.html Príručka programátora]<br />
*[http://lazarus-ccr.sourceforge.net/fpcdoc/ref/ref.html Referenčná príručka pre unitu system a podporované konštrukcie Pascalu]<br />
*[http://lazarus-ccr.sourceforge.net/fpcdoc/rtl/index.html Referenčný manuál Run-Time Library]<br />
*[http://lazarus-ccr.sourceforge.net/fpcdoc/fcl/index.html Referenčný manuál Free Component Library]<br />
*[http://lazarus-ccr.sourceforge.net/fpcdoc/fpdoc/fpdoc.html Manuál dokumentačného nástroja Free Pascal ]<br />
*[[Build messages]]<br />
<br />
== Blogy a weby o Lazarus ==<br />
=== Blogy ===<br />
*[[Adventures of a Newbie]] - Blog nováčika, začínaji s nejakými návodnými informáciami v bežiacom zázname.<br />
*[http://lazarusroad.blogspot.com/ Na ceste s Lazarus/Freepascal] - Blog určený pre záznamy o ksúsenostiach pri programovaní s Lazarus a Freepascal (by Luiz Américo)<br />
*[http://port2laz.blogspot.com/ Prenos do Lazarus] - Blog popisujúci prenos stredne veľkých aplikácií (100 k) z D7 s CLX do Lazarus (by Alexsander da Rosa)<br />
*[http://living-lazarus.blogspot.com/ Život Lazarus] - Bádanie jedného človeka o možnostiach open source RAD (by [[User:Wibblytim|Wibblytim]]).<br />
*[http://beeography.wordpress.com/tag/object-pascal/ Bee.ography] - Jednoducho (ďalší) bzukot včely!<br />
<br />
=== Webové stráky ===<br />
*[[swainbrain pascal wiki]] - Unikátne návody a informácie Free Pascal [http://mercury.it.swin.edu.au/swinbrain/index.php/Pascal#Pascal_Development_Tools swainbrain]</div>Slavkohttps://wiki.freepascal.org/index.php?title=Main_Loop_Hooks/sk&diff=26047Main Loop Hooks/sk2008-01-02T19:25:21Z<p>Slavko: Prvotný preklad</p>
<hr />
<div>{{Main Loop Hooks}}<br />
<br />
== Prehľad problému ==<br />
<br />
Potrebujete čakať kým nastane nejaká udalosť (v sokete alebo rúre ...), ale chcete to urobiť v základnom (GUI) vlákne a neblokovať GUI a tiež nechcete viacero vlákien? Riešenie tohoto problému je schopnosť pridať extra obsluhy, ktoré čakjú v hlavnej slučke udalostí.<br />
<br />
== Detaily riešenia ==<br />
<br />
Pre poskytnutie tejto schopnosti boli do jednotky [[doc:lcl/lclintf|LCLIntf]] pridané dve funkcie:<br />
<br />
AddEventHandler(AHandle: THandle; AFlags: dword; <br />
AEventHandler: TWaitHandleEvent; AData: PtrInt): PEventHandler;<br />
RemoveEventHandler(var AHandler: PEventHandler);<br />
SetEventHandlerFlags(AHandler: PEventHandler; NewFlags: dword);<br />
<br />
Typ [[doc:lcl/interfacebase/twaithandleevent.html|TWaitHandleEvent]] je deklarovaný v jednotke '''InterfaceBase''' ako:<br />
<br />
TWaitHandleEvent = procedure(AData: PtrInt; AFlags: dword) of object;<br />
<br />
[[doc:lcl/lclintf/addeventhandler.html|AddEventHandler]] pridáva obsluhu čakajúcu v hlavnej slučke udalostí.<br />
<br />
Keď je signalizovaná obsluha, potom je volaná procedúra zadaná v ACallback s parametrom '''AData''', ktorý je poslaný pri registrovaní obsluhy udalosti, a príznakmi, ktoré sú špecifické pre OS. Príznaky, poslané do '''AddEventHandler''', môžu byť upravené pomocou '''SetEventHandlerFlags'''. Handler (ukazovateľ) vrátený '''AddEventHandler''' musí byť poslaný do '''RemoveEventHandler''' pre zastavenie očakávania priradenej obsluhe.<br />
<br />
[[doc:lcl/lclintf/removeeventhandler.html|RemoveEventHandler]] zastavuje očakávanie zadanej obluhy. '''RemoveEventHandler''' nastaví, pred ukončením, '''AHandler''' na nil. Jeho argumentom je ukazovateľ vrátený z '''AddEventHandler'''.<br />
<br />
=== Windows ===<br />
<br />
V aktuálnej implementácii nie je parameter '''AFlags''' v '''AddEventHandler''' použitý a '''AFlags''' v '''TWaitHandleEvent''' bude 0.<br />
<br />
Win32 podporuje nasledujúce typy handle, v podstate veci podporované MsgWaitForMultipleObjects:<br />
* oznamovania zmeny (pre súbory a adresáre)<br />
* konzolový vstup<br />
* udalosti: signalizované WinAPI funkciou SetEvent<br />
* mutexy: signalizované keď ich nikto nevlastní<br />
* procesy: signalizované keď sú skončené<br />
* semfóry: signalizované keď je ich počet väčší ako nula<br />
* vlákna: signalizované keď sú skončené<br />
* časovače: signalizované keď vyprší, viz SetWaitableTimer<br />
<br />
=== Gtk/Unix === <br />
<br />
Parameter '''AFlags''' v '''AddEventHandler''' udáva podmienky, za ktorých má byť signalizovaná obsluha, s možnýmy hodnotami dokuemntovanými v type GIOCondition v použití [http://developer.gimp.org/api/2.0/glib/glib-IO-Channels.html#GIOCondition glib].<br />
<br />
V spätnom volaní bude '''AFlags''' obsahovať podmienky vyššie odkazovaného typu '''GIOCondition''', ktoré boli splnené.<br />
<br />
Gtk/unix podporuje nasledujúce typy obsluhy:<br />
* súbory<br />
* sokety<br />
* rúry<br />
<br />
Všimnite si, že Win32 nepodporuje sokety a rúry (prinajmenšom ich použitie je "odradzované" v MSDN). Návrh: použite '''WSAEventSelect''' na vytvorenie udalosti spojenej so soketom a pošlite obsluhu udalosti.<br />
<br />
=== Rúry a ukončovanie procesu ===<br />
<br />
Pre poskytnutie viac-platformného riešenia pre rúry (neveľmi podporované na Win32) a procesy (nie veľmi podporované na GTK/Unix) boli pridané ďalšie funkcie:<br />
<br />
TChildExitReason = (cerExit, cerSignal);<br />
TPipeReason = (prDataAvailable, prBroken, prCanWrite);<br />
TPipeReasons = set of TPipeReason;<br />
<br />
TChildExitEvent = procedure(AData: PtrInt; AReason: TChildExitReason; AInfo: dword) of object;<br />
TPipeEvent = procedure(AData: PtrInt; AReasons: TPipeReasons) of object;<br />
<br />
function AddProcessEventHandler(AHandle: THandle; <br />
AEventHandler: TChildExitEvent; AData: PtrInt): PProcessEventHandler;<br />
procedure RemoveProcessEventHandler(var AHandler: PProcessEventHandler);<br />
<br />
function AddPipeEventHandler(AHandle: THandle; <br />
AEventHandler: TPipeEvent; AData: PtrInt): PPipeEventHandler;<br />
procedure RemovePipeEventHandler(var AHandler: PPipeEventHandler);<br />
<br />
Keď proces končí, bude volaná zadaná obsluha udalosti. '''AInfo''' bude obsahovať ukončovací kód, ak '''AReason''' je cerExit, alebo (len Unix) ukončovací signál, ak '''AReason''' je cerSignal. Pre GTK/Unix, použite PID ako '''AHandle''' pre sledovanie. Interne, je nainštalovaný popisovač signálu pre pochopenie signálu SIGCHLD. Na Win32, je na čakanie ukončenia procesu použitý '''AddEventHandler'''.<br />
<br />
Pre sledovanie rúry na prichádzajúce dáta, pošlite do '''AddPipeEventHandler''' popisovač súboru (unix) alebo handle konca čítania rúry, so zvolenou metódou obsluhy udalosti ako '''AEventHandler'''. Na GTK/Unix, je volaná '''AddEventHandler''' na čakanie prevádzky popisovača súboru. Na Win32, slučka správ vyprší každých 100 ms, na kontrolu všetkých čakaných rúr na dostupná dáta, ak sú dostupné dáta, je volaná obsluha udalosti.</div>Slavkohttps://wiki.freepascal.org/index.php?title=Template:Main_Loop_Hooks&diff=26040Template:Main Loop Hooks2008-01-02T18:18:44Z<p>Slavko: Added slovak link</p>
<hr />
<div><small> <br />
[[Main Loop Hooks | English (en)]]<br />
[[Main Loop Hooks/fr|'''Français (fr)''']]<br />
[[Main Loop Hooks/sk|'''Slovensky (sk)''']]<br />
</small></div>Slavkohttps://wiki.freepascal.org/index.php?title=Lazarus_Packages/sk&diff=26039Lazarus Packages/sk2008-01-02T17:45:54Z<p>Slavko: Doplnenie sekcie a preklad</p>
<hr />
<div>{{Lazarus Packages}}<br />
<br />
= Prehlad balíkového systému Lazarus =<br />
<br />
== Čo je balík v Lazaruse? ==<br />
<br />
Balíček v Lazarus je zoznam unít a komponentov, ktoré obsahujú informácie o tom ako majú byť skompilované a ako môžu byť použité inými balíkmi, alebo IDE. Oproti Delphi, balíky niesu obmedzené len na knižnice a môžu byť nezávislé od operačného systému. (Delphi: [[packages|Balíček v Delphi]] je špecialne skompilovaná knižnica používaná aplikáciami, prostredím alebo obomi. Balíky Delphi vyžadujú od prekladača špeciálnu funkciu ktorú fpc v tomto momente ešte nemá a ktorá je závislá na operačnom systéme).<br />
<br />
Momentálne podporuje prekladač [[Free Pascal]] len statické balíky. Kvôli tomu musíte skompilovať a reštartovať prostredie pri každej inštalácií alebo odinštalácií balíka.<br />
<br />
Balík lazarusu je identifikovaný menom a verziou.<br />
<br />
== FAQ ==<br />
<br />
'''Otázka''': Potrebujem inštalovať balíček?<br />
<br />
'''Odpoveď''': Balíček potrebujete inštalovať len, ak obsahuje položky pre dobu návrhu (''designtime''), ako komponenty pre Paletu komponentov IDE. Ak tieto položky nepoužívate, balíček inštalovať nepotrebujete. Ak chcete len použiť balíček vo svojom projekte, neinštalujte ho.<br />
<br />
'''Otázka''': Nainštaloval som balíček, ale IDE nevie nájsť jednotky<br />
<br />
'''Odpoveď''': Inštalácia balíčka znamená, že balíček je integrovaný do IDE, nei do Vášho projektu. To sú dve odlišné veci. Pre použitie balíčka vo svojom projekte, použite '''Project -> Project Inspector -> Add -> New Requirement''' a odinštalujte balíček, ak neobsahuje žiadne rozšírenie IDE.<br />
<br />
== Rýchly štart ==<br />
<br />
Aby ste videli balíkoví systém v akcií urobte následovné:<br />
<br />
Vytváranie nového balíku:<br />
* '''File->New... -> Package -> Standard Package'''<br />
* Otvorí sa editor balíkov<br />
* Použite tlačidlo Save hore vlavo.<br />
* V závislosti od Vášho nastavenia 'naming' vo Voľbách prostredia sa vás IDE opýta, či má uložiť súbor s malými písmenami. Stlačte Áno.<br />
Gratulujem: Práve ste vytvorili svôj prvý balík.<br />
<br />
Pridávanie nového komponentu:<br />
* Použite tlačidlo '''Add -> New component'''<br />
* Vyberte si komponent v zozname predkov typu combobox. Napr.: TBevel.<br />
* Kliknite OK<br />
* Súbor bude pridaný do balíčka a otvorený v editore.<br />
* Nainštalujte balík pomocou tlačidla 'install' na vrchu editora balíkov.<br />
* Lazarus uloží balík a spýta sa či má byť IDE prebudované. Sltačte Áno.<br />
* Balíky sú staticky linkované takže je potrebný reštart IDE.<br />
* Reštartujte Lazarus a pozrite či máte svoj komponent v lište komponentov (Napr.: TBevel1 bude na 'Additional' stránke).<br />
Gratulujem: Práve ste nainštalovaly svoj prvý balík so svojim prvým komponentom.<br />
<br />
== Položky menu IDE pre balíčky ==<br />
<br />
;File->New... -> Package -> Standard Package<br />
* vytvorí nový balíček<br />
;Project -> Project Inspector<br />
* zobrazuje, ktoré balíčky sú vyžadované projektom, ktorý je práve otvorený<br />
* môžete tu pridať/odobrať závislosti<br />
;Run -> Compiler options -> Inherited<br />
* zobrazuje voľby prekladača, a z ktorého balíčka sú zdedené<br />
;Components -><br />
* '''Open loaded package''': dialóg zobrazujúci všetky otvorené balíčky a ich stav<br />
* '''Open package file (.lpk)''': otvoriť súbor .lpk<br />
* '''Open package of current unit''': otvoriť súbor .lpk, ktorý patrí súboru v Editore zdrojového kódu<br />
* '''Open recent package''': otvoriť súbor naposledy otvoreného balíčka (súbor .lpk)<br />
* '''Add active unit to a package''': pridá jednotku v Editore zdrojového kódu do balíčka<br />
* '''Package Graph''': Diagram balíčkov, zobrazuje všetky otvorené balíčky a ich závislosti<br />
* '''Configure installed packages''': upraviť zoznam balíčkov nainštalovaných v IDE - nainštalovať/odinštalovať viacero balíčkov naraz<br />
;Project -> Project Inspector<br />
* tu možno upravovať všetky balíčky použité projektom<br />
<br />
== Teória ==<br />
<br />
Každý balíček Lazarus má súbor .lpk. Balíček je identifikovaný svojim menom a verziou. Meno musí súhlasiť s menom súboru .lpk. Napríklad:<br />
<br />
Name: Package1, Version: 1.0, Filename: /home/.../package1.lpk.<br />
<br />
* IDE automaticky vytvára hlavný súbor zdrojového kódu (package1.pas). Súbor .lpk obsahuje informácie o vyžadovaných balíčkoch, použitých súboroch, ako ich kompilovať a čo je potrebné pre použitie balíčka inými balíčkami/projektmi. Adresár, v ktorom sa nachádza súbor .lpk, je volaný "adresár balíčka".<br />
* IDE udržiava zoznam všetkých balíčkových súborov (<config directory>/packagelinks.xml). Vždy keď otvoríte balíček v IDE, je pridaný do tohoto zoznamu. Keď otvoríte balíček, IDE automaticky otvorí všetky vyžadované balíčky pomocou tohoto zoznamu.<br />
* Tri základné balíčky: FCL, LCL a SynEdit, sú súčasťou IDE a tak sú vytvorené automaticky, len na čítanie a nemajú súbor .lpk.<br />
* Bežné balíčky majú zdrojový adresár s jednotkami Pascalu. Normálne je tam aj súbor .lpk. Balíček má aj výstupný adresár, predvolene to je podadresár 'lib/$(TargetCPU)-$(TargetOS)/' a adresári balíčka.<br />
* Pred samotnou kompiláciou balíčka IDE skontroluje všetky vyžadované balíčky a ak ich je potrebné aktualizovať a majú nastavený príznak autoaktualizácie, sú najprv preložené. Potom IDE vytvorí hlavný súbor zdrojového kódu, ak bol súbor .lpk napríklad package1.lpk, potom hlavný súbor zdrojového kódu bude package1.pas. Tento súbor obsahuje v sekcii uses všetky jednotky a procedúru 'Register', ktorá je volaná v sekcii intialization. <br />
<br />
;Napríklad:<br />
<br />
This file was automatically created by Lazarus. Do not edit!<br />
This source is only used to compile and install<br />
the package GTKOpenGL 1.0.<br><br />
unit GTKOpenGL;<br />
interface<br />
uses GTKGLArea, GTKGLArea_Int, NVGL, NVGLX, LazarusPackageIntf;<br />
implementation<br />
procedure Register;<br />
begin<br />
RegisterUnit('GTKGLArea', @GTKGLArea.Register);<br />
end;<br />
initialization<br />
RegisterPackage('GTKOpenGL', @Register)<br />
end.<br />
<br />
* Potom je volaný prekladač a balíček je preložený do výstupného adresára.<br />
* Po úspešnom preklade je vytvorený stavový súbor. Stavový súbor je vložený do výstupného adresára, volá sa <menobalíčka>.compiled a obsahuje informácie o tom, ako bol balíček preložený. Tento stavový súbor je použitý v IDE pre kontrolu či jepotrebná aktualizácia.<br />
<br />
Príklad: gtkopengl.compiled:<br />
<br />
<?xml version="1.0"?><br />
<CONFIG><br />
<Compiler Value="/usr/bin/ppc386" Date="781388725"/><br />
<Params Value=" -Rintel -S2cgi -CD -Ch8000000 -OG1p1<br />
-Tlinux -gl -vewnhi -l -Fu../../../lcl/units<br />
-Fu../../../lcl/units/gtk -Fu../../../packager/units<br />
-Fu. -FElib/ gtkopengl.pas"/><br />
</CONFIG><br />
<br />
* IDE otvára všetky potrebné balíčky automaticky. To znamená, že otvára všetky nainštalované balíčky, všetky balíčky označené pre inštaláciu (auto install), všetky balíčky s otvoreným Editor, všetky balíčky vyžadované projektom a všetky balíčky vyžadované inými balíčkami. Nepotebné balíčky sú automaticky uvoľnené, keď má IDE trochu času.<br />
* IDE nikdy neotvára dva balíčky s rovnakým menom naraz. Keď používateľ otvorí iný balíček s rovnakým menom ako má už otvorený balíček, IDE sa spýta na jeho nahradenie.<br />
* IDE spravuje dve samostatné množiny balíčkov: '''nainštalované''' balíčky a '''automaticky nainštalované''' balíčky. Automaticky nainštalované balíčky budú pripojené k IDE pri nasledujúcom preklade IDE. Na to si vytvára v konfiguračnom adresári dva nové súbory: staticpackages.inc a idemake.cfg. Potom pre preloženia seba samého volá:<br />
make ide OPT=@/path/to/your/config/idemake.cfg<br />
<br />
== Pokyny a tipy ==<br />
<br />
Prosím, pridajte každý pokyn, či tip tu.<br />
<br />
*pre premenovanie balíčka použite 'Save as'.<br />
<br />
;Príklad<br />
<br />
Ako príklad použijem tiOPF. tiOPF má takúto štruktúru adresára, keďže je preložený pre FPC, Delphi 5-7, D2005 a D2006.<br />
<br />
Source <= úplná cesta \Programming\3rdParty\tiOPF\Source<br />
\Compilers<br />
\Delphi7 <= tu je balíček pre Delphi 7<br />
\D2005<br />
\FPC <= tu je tiOPF.lpk<br />
\Core <= súbory základných jednotiek<br />
\Options <= súbory voliteľných jendotiek, pre dodatočné funkcie<br />
\GUI<br />
<br />
Pre použitie tohoto príkladu som pridal do "Options - Usage - Units" nasledujúce cesty:<br />
"$(PkgOutDir);..\..\Core;..\..\Options;..\..\GUI" <br />
ktoré budú pridané do každého projektu používajúceho tento balíček.<br />
<br />
== Spolupracovníci a komentáre ==<br />
<br />
This page has been converted from the epikwiki [http://lazarus-ccr.sourceforge.net/index.php?wiki=LazarusPackages version].<br />
* dokončenie prekladu a aktualizácia z originálu --[[User:Slavko|Komunista]] 18:45, 2 January 2008 (CET)</div>Slavkohttps://wiki.freepascal.org/index.php?title=Lazarus_Packages/sk&diff=26038Lazarus Packages/sk2008-01-02T17:27:15Z<p>Slavko: Preklad sekcie</p>
<hr />
<div>{{Lazarus Packages}}<br />
<br />
= Prehlad balíkového systému Lazarus =<br />
<br />
== Čo je balík v Lazaruse? ==<br />
<br />
Balíček v Lazarus je zoznam unít a komponentov, ktoré obsahujú informácie o tom ako majú byť skompilované a ako môžu byť použité inými balíkmi, alebo IDE. Oproti Delphi, balíky niesu obmedzené len na knižnice a môžu byť nezávislé od operačného systému. (Delphi: [[packages|Balíček v Delphi]] je špecialne skompilovaná knižnica používaná aplikáciami, prostredím alebo obomi. Balíky Delphi vyžadujú od prekladača špeciálnu funkciu ktorú fpc v tomto momente ešte nemá a ktorá je závislá na operačnom systéme).<br />
<br />
Momentálne podporuje prekladač [[Free Pascal]] len statické balíky. Kvôli tomu musíte skompilovať a reštartovať prostredie pri každej inštalácií alebo odinštalácií balíka.<br />
<br />
Balík lazarusu je identifikovaný menom a verziou.<br />
<br />
== FAQ ==<br />
<br />
'''Otázka''': Potrebujem inštalovať balíček?<br />
<br />
'''Odpoveď''': Balíček potrebujete inštalovať len, ak obsahuje položky pre dobu návrhu (''designtime''), ako komponenty pre Paletu komponentov IDE. Ak tieto položky nepoužívate, balíček inštalovať nepotrebujete. Ak chcete len použiť balíček vo svojom projekte, neinštalujte ho.<br />
<br />
'''Otázka''': Nainštaloval som balíček, ale IDE nevie nájsť jednotky<br />
<br />
'''Odpoveď''': Inštalácia balíčka znamená, že balíček je integrovaný do IDE, nei do Vášho projektu. To sú dve odlišné veci. Pre použitie balíčka vo svojom projekte, použite '''Project -> Project Inspector -> Add -> New Requirement''' a odinštalujte balíček, ak neobsahuje žiadne rozšírenie IDE.<br />
<br />
== Rýchly štart ==<br />
<br />
Aby ste videli balíkoví systém v akcií urobte následovné:<br />
<br />
Vytváranie nového balíku:<br />
* '''File->New... -> Package -> Standard Package'''<br />
* Otvorí sa editor balíkov<br />
* Použite tlačidlo Save hore vlavo.<br />
* V závislosti od Vášho nastavenia 'naming' vo Voľbách prostredia sa vás IDE opýta, či má uložiť súbor s malými písmenami. Stlačte Áno.<br />
Gratulujem: Práve ste vytvorili svôj prvý balík.<br />
<br />
Pridávanie nového komponentu:<br />
* Použite tlačidlo '''Add -> New component'''<br />
* Vyberte si komponent v zozname predkov typu combobox. Napr.: TBevel.<br />
* Kliknite OK<br />
* Súbor bude pridaný do balíčka a otvorený v editore.<br />
* Nainštalujte balík pomocou tlačidla 'install' na vrchu editora balíkov.<br />
* Lazarus uloží balík a spýta sa či má byť IDE prebudované. Sltačte Áno.<br />
* Balíky sú staticky linkované takže je potrebný reštart IDE.<br />
* Reštartujte Lazarus a pozrite či máte svoj komponent v lište komponentov (Napr.: TBevel1 bude na 'Additional' stránke).<br />
Gratulujem: Práve ste nainštalovaly svoj prvý balík so svojim prvým komponentom.<br />
<br />
== Položky menu IDE pre balíčky ==<br />
<br />
;File->New... -> Package -> Standard Package<br />
* vytvorí nový balíček<br />
;Project -> Project Inspector<br />
* zobrazuje, ktoré balíčky sú vyžadované projektom, ktorý je práve otvorený<br />
* môžete tu pridať/odobrať závislosti<br />
;Run -> Compiler options -> Inherited<br />
* zobrazuje voľby prekladača, a z ktorého balíčka sú zdedené<br />
;Components -><br />
* '''Open loaded package''': dialóg zobrazujúci všetky otvorené balíčky a ich stav<br />
* '''Open package file (.lpk)''': otvoriť súbor .lpk<br />
* '''Open package of current unit''': otvoriť súbor .lpk, ktorý patrí súboru v Editore zdrojového kódu<br />
* '''Open recent package''': otvoriť súbor naposledy otvoreného balíčka (súbor .lpk)<br />
* '''Add active unit to a package''': pridá jednotku v Editore zdrojového kódu do balíčka<br />
* '''Package Graph''': Diagram balíčkov, zobrazuje všetky otvorené balíčky a ich závislosti<br />
* '''Configure installed packages''': upraviť zoznam balíčkov nainštalovaných v IDE - nainštalovať/odinštalovať viacero balíčkov naraz<br />
;Project -> Project Inspector<br />
* tu možno upravovať všetky balíčky použité projektom<br />
<br />
== Teória ==<br />
<br />
Každý balíček Lazarus má súbor .lpk. Balíček je identifikovaný svojim menom a verziou. Meno musí súhlasiť s menom súboru .lpk. Napríklad:<br />
<br />
Name: Package1, Version: 1.0, Filename: /home/.../package1.lpk.<br />
<br />
* IDE automaticky vytvára hlavný súbor zdrojového kódu (package1.pas). Súbor .lpk obsahuje informácie o vyžadovaných balíčkoch, použitých súboroch, ako ich kompilovať a čo je potrebné pre použitie balíčka inými balíčkami/projektmi. Adresár, v ktorom sa nachádza súbor .lpk, je volaný "adresár balíčka".<br />
* IDE udržiava zoznam všetkých balíčkových súborov (<config directory>/packagelinks.xml). Vždy keď otvoríte balíček v IDE, je pridaný do tohoto zoznamu. Keď otvoríte balíček, IDE automaticky otvorí všetky vyžadované balíčky pomocou tohoto zoznamu.<br />
* Tri základné balíčky: FCL, LCL a SynEdit, sú súčasťou IDE a tak sú vytvorené automaticky, len na čítanie a nemajú súbor .lpk.<br />
* Bežné balíčky majú zdrojový adresár s jednotkami Pascalu. Normálne je tam aj súbor .lpk. Balíček má aj výstupný adresár, predvolene to je podadresár 'lib/$(TargetCPU)-$(TargetOS)/' a adresári balíčka.<br />
* Pred samotnou kompiláciou balíčka IDE skontroluje všetky vyžadované balíčky a ak ich je potrebné aktualizovať a majú nastavený príznak autoaktualizácie, sú najprv preložené. Potom IDE vytvorí hlavný súbor zdrojového kódu, ak bol súbor .lpk napríklad package1.lpk, potom hlavný súbor zdrojového kódu bude package1.pas. Tento súbor obsahuje v sekcii uses všetky jednotky a procedúru 'Register', ktorá je volaná v sekcii intialization. <br />
<br />
;Napríklad:<br />
<br />
This file was automatically created by Lazarus. Do not edit!<br />
This source is only used to compile and install<br />
the package GTKOpenGL 1.0.<br><br />
unit GTKOpenGL;<br />
interface<br />
uses GTKGLArea, GTKGLArea_Int, NVGL, NVGLX, LazarusPackageIntf;<br />
implementation<br />
procedure Register;<br />
begin<br />
RegisterUnit('GTKGLArea', @GTKGLArea.Register);<br />
end;<br />
initialization<br />
RegisterPackage('GTKOpenGL', @Register)<br />
end.<br />
<br />
* Potom je volaný prekladač a balíček je preložený do výstupného adresára.<br />
* Po úspešnom preklade je vytvorený stavový súbor. Stavový súbor je vložený do výstupného adresára, volá sa <menobalíčka>.compiled a obsahuje informácie o tom, ako bol balíček preložený. Tento stavový súbor je použitý v IDE pre kontrolu či jepotrebná aktualizácia.<br />
<br />
Príklad: gtkopengl.compiled:<br />
<br />
<?xml version="1.0"?><br />
<CONFIG><br />
<Compiler Value="/usr/bin/ppc386" Date="781388725"/><br />
<Params Value=" -Rintel -S2cgi -CD -Ch8000000 -OG1p1<br />
-Tlinux -gl -vewnhi -l -Fu../../../lcl/units<br />
-Fu../../../lcl/units/gtk -Fu../../../packager/units<br />
-Fu. -FElib/ gtkopengl.pas"/><br />
</CONFIG><br />
<br />
* IDE otvára všetky potrebné balíčky automaticky. To znamená, že otvára všetky nainštalované balíčky, všetky balíčky označené pre inštaláciu (auto install), všetky balíčky s otvoreným Editor, všetky balíčky vyžadované projektom a všetky balíčky vyžadované inými balíčkami. Nepotebné balíčky sú automaticky uvoľnené, keď má IDE trochu času.<br />
* IDE nikdy neotvára dva balíčky s rovnakým menom naraz. Keď používateľ otvorí iný balíček s rovnakým menom ako má už otvorený balíček, IDE sa spýta na jeho nahradenie.<br />
* IDE spravuje dve samostatné množiny balíčkov: '''nainštalované''' balíčky a '''automaticky nainštalované''' balíčky. Automaticky nainštalované balíčky budú pripojené k IDE pri nasledujúcom preklade IDE. Na to si vytvára v konfiguračnom adresári dva nové súbory: staticpackages.inc a idemake.cfg. Potom pre preloženia seba samého volá:<br />
make ide OPT=@/path/to/your/config/idemake.cfg<br />
<br />
== Contributors and Comments ==<br />
<br />
This page has been converted from the epikwiki [http://lazarus-ccr.sourceforge.net/index.php?wiki=LazarusPackages version].</div>Slavkohttps://wiki.freepascal.org/index.php?title=Lazarus_Packages/sk&diff=26037Lazarus Packages/sk2008-01-02T16:55:07Z<p>Slavko: Preklad sekcie</p>
<hr />
<div>{{Lazarus Packages}}<br />
<br />
= Prehlad balíkového systému Lazarus =<br />
<br />
== Čo je balík v Lazaruse? ==<br />
<br />
Balíček v Lazarus je zoznam unít a komponentov, ktoré obsahujú informácie o tom ako majú byť skompilované a ako môžu byť použité inými balíkmi, alebo IDE. Oproti Delphi, balíky niesu obmedzené len na knižnice a môžu byť nezávislé od operačného systému. (Delphi: [[packages|Balíček v Delphi]] je špecialne skompilovaná knižnica používaná aplikáciami, prostredím alebo obomi. Balíky Delphi vyžadujú od prekladača špeciálnu funkciu ktorú fpc v tomto momente ešte nemá a ktorá je závislá na operačnom systéme).<br />
<br />
Momentálne podporuje prekladač [[Free Pascal]] len statické balíky. Kvôli tomu musíte skompilovať a reštartovať prostredie pri každej inštalácií alebo odinštalácií balíka.<br />
<br />
Balík lazarusu je identifikovaný menom a verziou.<br />
<br />
== FAQ ==<br />
<br />
'''Otázka''': Potrebujem inštalovať balíček?<br />
<br />
'''Odpoveď''': Balíček potrebujete inštalovať len, ak obsahuje položky pre dobu návrhu (''designtime''), ako komponenty pre Paletu komponentov IDE. Ak tieto položky nepoužívate, balíček inštalovať nepotrebujete. Ak chcete len použiť balíček vo svojom projekte, neinštalujte ho.<br />
<br />
'''Otázka''': Nainštaloval som balíček, ale IDE nevie nájsť jednotky<br />
<br />
'''Odpoveď''': Inštalácia balíčka znamená, že balíček je integrovaný do IDE, nei do Vášho projektu. To sú dve odlišné veci. Pre použitie balíčka vo svojom projekte, použite '''Project -> Project Inspector -> Add -> New Requirement''' a odinštalujte balíček, ak neobsahuje žiadne rozšírenie IDE.<br />
<br />
== Rýchly štart ==<br />
<br />
Aby ste videli balíkoví systém v akcií urobte následovné:<br />
<br />
Vytváranie nového balíku:<br />
* '''File->New... -> Package -> Standard Package'''<br />
* Otvorí sa editor balíkov<br />
* Použite tlačidlo Save hore vlavo.<br />
* V závislosti od Vášho nastavenia 'naming' vo Voľbách prostredia sa vás IDE opýta, či má uložiť súbor s malými písmenami. Stlačte Áno.<br />
Gratulujem: Práve ste vytvorili svôj prvý balík.<br />
<br />
Pridávanie nového komponentu:<br />
* Použite tlačidlo '''Add -> New component'''<br />
* Vyberte si komponent v zozname predkov typu combobox. Napr.: TBevel.<br />
* Kliknite OK<br />
* Súbor bude pridaný do balíčka a otvorený v editore.<br />
* Nainštalujte balík pomocou tlačidla 'install' na vrchu editora balíkov.<br />
* Lazarus uloží balík a spýta sa či má byť IDE prebudované. Sltačte Áno.<br />
* Balíky sú staticky linkované takže je potrebný reštart IDE.<br />
* Reštartujte Lazarus a pozrite či máte svoj komponent v lište komponentov (Napr.: TBevel1 bude na 'Additional' stránke).<br />
Gratulujem: Práve ste nainštalovaly svoj prvý balík so svojim prvým komponentom.<br />
<br />
== Položky menu IDE pre balíčky ==<br />
<br />
;File->New... -> Package -> Standard Package<br />
* vytvorí nový balíček<br />
;Project -> Project Inspector<br />
* zobrazuje, ktoré balíčky sú vyžadované projektom, ktorý je práve otvorený<br />
* môžete tu pridať/odobrať závislosti<br />
;Run -> Compiler options -> Inherited<br />
* zobrazuje voľby prekladača, a z ktorého balíčka sú zdedené<br />
;Components -><br />
* '''Open loaded package''': dialóg zobrazujúci všetky otvorené balíčky a ich stav<br />
* '''Open package file (.lpk)''': otvoriť súbor .lpk<br />
* '''Open package of current unit''': otvoriť súbor .lpk, ktorý patrí súboru v Editore zdrojového kódu<br />
* '''Open recent package''': otvoriť súbor naposledy otvoreného balíčka (súbor .lpk)<br />
* '''Add active unit to a package''': pridá jednotku v Editore zdrojového kódu do balíčka<br />
* '''Package Graph''': Diagram balíčkov, zobrazuje všetky otvorené balíčky a ich závislosti<br />
* '''Configure installed packages''': upraviť zoznam balíčkov nainštalovaných v IDE - nainštalovať/odinštalovať viacero balíčkov naraz<br />
;Project -> Project Inspector<br />
* tu možno upravovať všetky balíčky použité projektom<br />
<br />
== The theory ==<br />
<br />
Each Lazarus package has a .lpk file. A package is identified by its name and its version. The name must correspond to the lpk filename. For example:<br />
<br />
Name: Package1, Version: 1.0, Filename: /home/.../package1.lpk.<br />
<br />
Hint: To rename a package, use 'save as'.<br />
<br />
* The IDE automatically creates the main source file (package1.pas). See below. The lpk file contains information about the required packages, the files it uses, how to compile them, and what is needed to use the package by other packages/projects. The directory where the lpk file is, is called the "package directory".<br />
* The IDE maintains a list of all package files (packagelinks.xml). Everytime a package is opened in the IDE it will be added to this list. When a package is opened, the IDE automatically opens all required packages via this list.<br />
* There are three base packages: FCL, LCL and SynEdit. These are parts of the IDE and so they are autocreated, readonly and have no lpk file.<br />
* Normally a package has a source directory with some pascal units. And normally the lpk file will be there too. A package has also an output directory. Default is the subdirectory 'lib' in the package directory.<br />
* Before a package is compiled the IDE checks all required packages and if they need update and have the auto update flag, they are compiled first. Then the IDE creates the package main source file. If the lpk file was package1.lpk, then the main source file is package1.pas. This file contains all units in the uses section plus a 'Register' procedure, which is called in the intialization section. <br />
<br />
For example:<br />
<br />
This file was automatically created by Lazarus. Do not edit!<br />
This source is only used to compile and install<br />
the package GTKOpenGL 1.0.<br><br />
unit GTKOpenGL;<br />
interface<br />
uses GTKGLArea, GTKGLArea_Int, NVGL, NVGLX, LazarusPackageIntf;<br />
implementation<br />
procedure Register;<br />
begin<br />
RegisterUnit('GTKGLArea', @GTKGLArea.Register);<br />
end;<br />
initialization<br />
RegisterPackage('GTKOpenGL', @Register)<br />
end.<br />
<br />
* Then the compiler is called and the package is compiled to the output directory.<br />
* After successful compilation the state file is created. The state file is put into the output directory. It has the name <packagename>.compiled and contains the information, how the package was compiled. This state file is used by the IDE to check if update is needed.<br />
<br />
For example: gtkopengl.compiled:<br />
<br />
<?xml version="1.0"?><br />
<CONFIG><br />
<Compiler Value="/usr/bin/ppc386" Date="781388725"/><br />
<Params Value=" -Rintel -S2cgi -CD -Ch8000000 -OG1p1<br />
-Tlinux -gl -vewnhi -l -Fu../../../lcl/units<br />
-Fu../../../lcl/units/gtk -Fu../../../packager/units<br />
-Fu. -FElib/ gtkopengl.pas"/><br />
</CONFIG><br />
<br />
* The IDE opens all needed packages automatically. This means, it opens all installed packages, all packages marked for installation (auto install), all packages with an open Editor, all packages required by the project and all packages required by one of the other packages. Unneeded packages are automatically unloaded, when the IDE becomes idle.<br />
* The IDE never opens two packages with the same name at the same time. When the user opens another package file with the same name as an already opened package the IDE will ask to replace the old one.<br />
* The IDE maintains two extra sets of packages: The 'installed' packages and the 'auto install' packages. The auto install packages will be linked into the IDE on next compile. It creates two new files in the config directory: staticpackages.inc and idemake.cfg. Then it calls 'make ide OPT=@/path/to/your/config/idemake.cfg' to compile itself.<br />
<br />
== Contributors and Comments ==<br />
<br />
This page has been converted from the epikwiki [http://lazarus-ccr.sourceforge.net/index.php?wiki=LazarusPackages version].</div>Slavkohttps://wiki.freepascal.org/index.php?title=Lazarus_Packages/sk&diff=26036Lazarus Packages/sk2008-01-02T16:30:30Z<p>Slavko: Pridanie novej sekcie a oprava prekladu</p>
<hr />
<div>{{Lazarus Packages}}<br />
<br />
= Prehlad balíkového systému Lazarus =<br />
<br />
== Čo je balík v Lazaruse? ==<br />
<br />
Balíček v Lazarus je zoznam unít a komponentov, ktoré obsahujú informácie o tom ako majú byť skompilované a ako môžu byť použité inými balíkmi, alebo IDE. Oproti Delphi, balíky niesu obmedzené len na knižnice a môžu byť nezávislé od operačného systému. (Delphi: [[packages|Balíček v Delphi]] je špecialne skompilovaná knižnica používaná aplikáciami, prostredím alebo obomi. Balíky Delphi vyžadujú od prekladača špeciálnu funkciu ktorú fpc v tomto momente ešte nemá a ktorá je závislá na operačnom systéme).<br />
<br />
Momentálne podporuje prekladač [[Free Pascal]] len statické balíky. Kvôli tomu musíte skompilovať a reštartovať prostredie pri každej inštalácií alebo odinštalácií balíka.<br />
<br />
Balík lazarusu je identifikovaný menom a verziou.<br />
<br />
== FAQ ==<br />
<br />
'''Otázka''': Potrebujem inštalovať balíček?<br />
<br />
'''Odpoveď''': Balíček potrebujete inštalovať len, ak obsahuje položky pre dobu návrhu (''designtime''), ako komponenty pre Paletu komponentov IDE. Ak tieto položky nepoužívate, balíček inštalovať nepotrebujete. Ak chcete len použiť balíček vo svojom projekte, neinštalujte ho.<br />
<br />
'''Otázka''': Nainštaloval som balíček, ale IDE nevie nájsť jednotky<br />
<br />
'''Odpoveď''': Inštalácia balíčka znamená, že balíček je integrovaný do IDE, nei do Vášho projektu. To sú dve odlišné veci. Pre použitie balíčka vo svojom projekte, použite '''Project -> Project Inspector -> Add -> New Requirement''' a odinštalujte balíček, ak neobsahuje žiadne rozšírenie IDE.<br />
<br />
== Rýchly štart ==<br />
<br />
Aby ste videli balíkoví systém v akcií urobte následovné:<br />
<br />
Vytváranie nového balíku:<br />
* '''File->New... -> Package -> Standard Package'''<br />
* Otvorí sa editor balíkov<br />
* Použite tlačidlo Save hore vlavo.<br />
* V závislosti od Vášho nastavenia 'naming' vo Voľbách prostredia sa vás IDE opýta, či má uložiť súbor s malými písmenami. Stlačte Áno.<br />
Gratulujem: Práve ste vytvorili svôj prvý balík.<br />
<br />
Pridávanie nového komponentu:<br />
* Použite tlačidlo '''Add -> New component'''<br />
* Vyberte si komponent v zozname predkov typu combobox. Napr.: TBevel.<br />
* Kliknite OK<br />
* Súbor bude pridaný do balíčka a otvorený v editore.<br />
* Nainštalujte balík pomocou tlačidla 'install' na vrchu editora balíkov.<br />
* Lazarus uloží balík a spýta sa či má byť IDE prebudované. Sltačte Áno.<br />
* Balíky sú staticky linkované takže je potrebný reštart IDE.<br />
* Reštartujte Lazarus a pozrite či máte svoj komponent v lište komponentov (Napr.: TBevel1 bude na 'Additional' stránke).<br />
Gratulujem: Práve ste nainštalovaly svoj prvý balík so svojim prvým komponentom.<br />
<br />
== The IDE menu items for packages: ==<br />
<br />
* File->New... -> Package -> Standard Package<br />
Creates a new package.<br />
* Project -> Project Inspector<br />
Here you can see, what packages are required by the currently open project.<br />
You can add new dependencies and remove unneeded ones.<br />
* Run -> Compiler options -> Inherited<br />
Here you can see what compiler options are inherited from which package.<br />
<br />
Components -> 5 new items<br />
- 'Open package'<br />
A dialog shows all open packages with their state.<br />
<br />
- 'Open package file'<br />
Open a .lpk file<br />
<br />
- 'Open recent package'<br />
Open a recently open package file (lpk file)<br />
<br />
- 'Package Graph'<br />
The package graph shows all open packages and their dependencies.<br />
<br />
== The theory ==<br />
<br />
Each Lazarus package has a .lpk file. A package is identified by its name and its version. The name must correspond to the lpk filename. For example:<br />
<br />
Name: Package1, Version: 1.0, Filename: /home/.../package1.lpk.<br />
<br />
Hint: To rename a package, use 'save as'.<br />
<br />
* The IDE automatically creates the main source file (package1.pas). See below. The lpk file contains information about the required packages, the files it uses, how to compile them, and what is needed to use the package by other packages/projects. The directory where the lpk file is, is called the "package directory".<br />
* The IDE maintains a list of all package files (packagelinks.xml). Everytime a package is opened in the IDE it will be added to this list. When a package is opened, the IDE automatically opens all required packages via this list.<br />
* There are three base packages: FCL, LCL and SynEdit. These are parts of the IDE and so they are autocreated, readonly and have no lpk file.<br />
* Normally a package has a source directory with some pascal units. And normally the lpk file will be there too. A package has also an output directory. Default is the subdirectory 'lib' in the package directory.<br />
* Before a package is compiled the IDE checks all required packages and if they need update and have the auto update flag, they are compiled first. Then the IDE creates the package main source file. If the lpk file was package1.lpk, then the main source file is package1.pas. This file contains all units in the uses section plus a 'Register' procedure, which is called in the intialization section. <br />
<br />
For example:<br />
<br />
This file was automatically created by Lazarus. Do not edit!<br />
This source is only used to compile and install<br />
the package GTKOpenGL 1.0.<br><br />
unit GTKOpenGL;<br />
interface<br />
uses GTKGLArea, GTKGLArea_Int, NVGL, NVGLX, LazarusPackageIntf;<br />
implementation<br />
procedure Register;<br />
begin<br />
RegisterUnit('GTKGLArea', @GTKGLArea.Register);<br />
end;<br />
initialization<br />
RegisterPackage('GTKOpenGL', @Register)<br />
end.<br />
<br />
* Then the compiler is called and the package is compiled to the output directory.<br />
* After successful compilation the state file is created. The state file is put into the output directory. It has the name <packagename>.compiled and contains the information, how the package was compiled. This state file is used by the IDE to check if update is needed.<br />
<br />
For example: gtkopengl.compiled:<br />
<br />
<?xml version="1.0"?><br />
<CONFIG><br />
<Compiler Value="/usr/bin/ppc386" Date="781388725"/><br />
<Params Value=" -Rintel -S2cgi -CD -Ch8000000 -OG1p1<br />
-Tlinux -gl -vewnhi -l -Fu../../../lcl/units<br />
-Fu../../../lcl/units/gtk -Fu../../../packager/units<br />
-Fu. -FElib/ gtkopengl.pas"/><br />
</CONFIG><br />
<br />
* The IDE opens all needed packages automatically. This means, it opens all installed packages, all packages marked for installation (auto install), all packages with an open Editor, all packages required by the project and all packages required by one of the other packages. Unneeded packages are automatically unloaded, when the IDE becomes idle.<br />
* The IDE never opens two packages with the same name at the same time. When the user opens another package file with the same name as an already opened package the IDE will ask to replace the old one.<br />
* The IDE maintains two extra sets of packages: The 'installed' packages and the 'auto install' packages. The auto install packages will be linked into the IDE on next compile. It creates two new files in the config directory: staticpackages.inc and idemake.cfg. Then it calls 'make ide OPT=@/path/to/your/config/idemake.cfg' to compile itself.<br />
<br />
== Contributors and Comments ==<br />
<br />
This page has been converted from the epikwiki [http://lazarus-ccr.sourceforge.net/index.php?wiki=LazarusPackages version].</div>Slavkohttps://wiki.freepascal.org/index.php?title=Lazarus_Packages/sk&diff=26035Lazarus Packages/sk2008-01-02T16:21:20Z<p>Slavko: oprava preklepu a odkazov</p>
<hr />
<div>{{Lazarus Packages}}<br />
<br />
= Prehlad balíkového systému Lazarus =<br />
<br />
== Čo je balík v Lazaruse? ==<br />
<br />
Balíček v Lazarus je zoznam unít a komponentov, ktoré obsahujú informácie o tom ako majú byť skompilované a ako môžu byť použité inými balíkmi, alebo IDE. Oproti Delphi, balíky niesu obmedzené len na knižnice a môžu byť nezávislé od operačného systému. (Delphi: [[packages|Balíček v Delphi]] je špecialne skompilovaná knižnica používaná aplikáciami, prostredím alebo obomi. Balíky Delphi vyžadujú od prekladača špeciálnu funkciu ktorú fpc v tomto momente ešte nemá a ktorá je závislá na operačnom systéme).<br />
<br />
Momentálne podporuje prekladač [[Free Pascal]] len statické balíky. Kvôli tomu musíte skompilovať a reštartovať prostredie pri každej inštalácií alebo odinštalácií balíka.<br />
<br />
Balík lazarusu je identifikovaný menom a verziou.<br />
<br />
== Rýchly štart ==<br />
<br />
Aby ste videli balíkoví systém v akcií urobte následovné:<br />
<br />
Vytváranie nového balíku:<br />
* File->New... -> Package -> Standard Package<br />
* Otvorí sa editor balíkov<br />
* Použite tlačidlo Save hore vlavo.<br />
* V závislosti od vašeho 'naming' nastavenia v 'environment options' sa vás IDE opýta, či má uložiť súbor v malých písmenách. Stlačte Yes.<br />
Gratulujem: Práve ste vytvorili svôj prvý balík.<br />
<br />
Pridávanie nového komponentu:<br />
* Použite tlačidlo Add -> New component<br />
* Vyberte si komponent v zozname predkov typu combobox. Napr. : TBevel.<br />
* Kliknite Ok<br />
* Súbor sa pridaná do balíku a otvorí v editore.<br />
* Nainštalujte balík pomocou tlačidla 'install' na vrchu editora balíkov.<br />
* Lazarus uloží balík a spýta sa či má byť IDE prestavané. Sltačte Yes.<br />
* Balíky sú staticky linkované takže reštart IDE je potrebný.<br />
* Reštartujte Lazarus a pozrite či máte svoj komponent v lište komponentov (Napr.: TBevel1 bude na 'Additional' stránke).<br />
Gratulujem: Práve ste nainštalovaly svoj prvý balík so svojim prvým komponentom.<br />
<br />
== The IDE menu items for packages: ==<br />
<br />
* File->New... -> Package -> Standard Package<br />
Creates a new package.<br />
* Project -> Project Inspector<br />
Here you can see, what packages are required by the currently open project.<br />
You can add new dependencies and remove unneeded ones.<br />
* Run -> Compiler options -> Inherited<br />
Here you can see what compiler options are inherited from which package.<br />
<br />
Components -> 5 new items<br />
- 'Open package'<br />
A dialog shows all open packages with their state.<br />
<br />
- 'Open package file'<br />
Open a .lpk file<br />
<br />
- 'Open recent package'<br />
Open a recently open package file (lpk file)<br />
<br />
- 'Package Graph'<br />
The package graph shows all open packages and their dependencies.<br />
<br />
== The theory ==<br />
<br />
Each Lazarus package has a .lpk file. A package is identified by its name and its version. The name must correspond to the lpk filename. For example:<br />
<br />
Name: Package1, Version: 1.0, Filename: /home/.../package1.lpk.<br />
<br />
Hint: To rename a package, use 'save as'.<br />
<br />
* The IDE automatically creates the main source file (package1.pas). See below. The lpk file contains information about the required packages, the files it uses, how to compile them, and what is needed to use the package by other packages/projects. The directory where the lpk file is, is called the "package directory".<br />
* The IDE maintains a list of all package files (packagelinks.xml). Everytime a package is opened in the IDE it will be added to this list. When a package is opened, the IDE automatically opens all required packages via this list.<br />
* There are three base packages: FCL, LCL and SynEdit. These are parts of the IDE and so they are autocreated, readonly and have no lpk file.<br />
* Normally a package has a source directory with some pascal units. And normally the lpk file will be there too. A package has also an output directory. Default is the subdirectory 'lib' in the package directory.<br />
* Before a package is compiled the IDE checks all required packages and if they need update and have the auto update flag, they are compiled first. Then the IDE creates the package main source file. If the lpk file was package1.lpk, then the main source file is package1.pas. This file contains all units in the uses section plus a 'Register' procedure, which is called in the intialization section. <br />
<br />
For example:<br />
<br />
This file was automatically created by Lazarus. Do not edit!<br />
This source is only used to compile and install<br />
the package GTKOpenGL 1.0.<br><br />
unit GTKOpenGL;<br />
interface<br />
uses GTKGLArea, GTKGLArea_Int, NVGL, NVGLX, LazarusPackageIntf;<br />
implementation<br />
procedure Register;<br />
begin<br />
RegisterUnit('GTKGLArea', @GTKGLArea.Register);<br />
end;<br />
initialization<br />
RegisterPackage('GTKOpenGL', @Register)<br />
end.<br />
<br />
* Then the compiler is called and the package is compiled to the output directory.<br />
* After successful compilation the state file is created. The state file is put into the output directory. It has the name <packagename>.compiled and contains the information, how the package was compiled. This state file is used by the IDE to check if update is needed.<br />
<br />
For example: gtkopengl.compiled:<br />
<br />
<?xml version="1.0"?><br />
<CONFIG><br />
<Compiler Value="/usr/bin/ppc386" Date="781388725"/><br />
<Params Value=" -Rintel -S2cgi -CD -Ch8000000 -OG1p1<br />
-Tlinux -gl -vewnhi -l -Fu../../../lcl/units<br />
-Fu../../../lcl/units/gtk -Fu../../../packager/units<br />
-Fu. -FElib/ gtkopengl.pas"/><br />
</CONFIG><br />
<br />
* The IDE opens all needed packages automatically. This means, it opens all installed packages, all packages marked for installation (auto install), all packages with an open Editor, all packages required by the project and all packages required by one of the other packages. Unneeded packages are automatically unloaded, when the IDE becomes idle.<br />
* The IDE never opens two packages with the same name at the same time. When the user opens another package file with the same name as an already opened package the IDE will ask to replace the old one.<br />
* The IDE maintains two extra sets of packages: The 'installed' packages and the 'auto install' packages. The auto install packages will be linked into the IDE on next compile. It creates two new files in the config directory: staticpackages.inc and idemake.cfg. Then it calls 'make ide OPT=@/path/to/your/config/idemake.cfg' to compile itself.<br />
<br />
== Contributors and Comments ==<br />
<br />
This page has been converted from the epikwiki [http://lazarus-ccr.sourceforge.net/index.php?wiki=LazarusPackages version].</div>Slavkohttps://wiki.freepascal.org/index.php?title=Lazarus_Packages/sk&diff=26034Lazarus Packages/sk2008-01-02T16:19:23Z<p>Slavko: Oprava preklepov a prekladu</p>
<hr />
<div>{{Lazarus Packages}}<br />
<br />
= Prehlad balíkového systému Lazarus =<br />
<br />
== Čo je balík v Lazaruse? ==<br />
<br />
Balík v lazaruse je zoznam unít a komponentov, ktoré obsahujú informácie o tom ako majú byť skompilované a ako môžu byť použité inými balíkmi, alebo IDE. Oproti Delphi, balíky niesu obmedzené len na knižnice a môžu byť nezávislé od operačného systému. (Delphi: balík v Delphi je špecialne skompilovaná knižnica používaná aplikáciami, prostredím alebo obomi. Balíky Delphi vyžadujú od prekladača špeciálnu funkciu ktorú fpc v tomto momente ešte nemá a ktorá je závislá na operačnom systéme).<br />
<br />
Momentálne podporuje prekladač [FreePascal] len statické balíky. Kvôli tomu musíte skompilovať a reštartovať prostredie pri každej inštalácií alebo odinštalácií balíka.<br />
<br />
Balík lazarusu je identifikovaný menom a verziou.<br />
<br />
== Rýchly štart ==<br />
<br />
Aby ste videli balíkoví systém v akcií urobte následovné:<br />
<br />
Vytváranie nového balíku:<br />
* File->New... -> Package -> Standard Package<br />
* Otvorí sa editor balíkov<br />
* Použite tlačidlo Save hore vlavo.<br />
* V závislosti od vašeho 'naming' nastavenia v 'environment options' sa vás IDE opýta, či má uložiť súbor v malých písmenách. Stlačte Yes.<br />
Gratulujem: Práve ste vytvorili svôj prvý balík.<br />
<br />
Pridávanie nového komponentu:<br />
* Použite tlačidlo Add -> New component<br />
* Vyberte si komponent v zozname predkov typu combobox. Napr. : TBevel.<br />
* Kliknite Ok<br />
* Súbor sa pridaná do balíku a otvorí v editore.<br />
* Nainštalujte balík pomocou tlačidla 'install' na vrchu editora balíkov.<br />
* Lazarus uloží balík a spýta sa či má byť IDE prestavané. Sltačte Yes.<br />
* Balíky sú staticky linkované takže reštart IDE je potrebný.<br />
* Reštartujte Lazarus a pozrite či máte svoj komponent v lište komponentov (Napr.: TBevel1 bude na 'Additional' stránke).<br />
Gratulujem: Práve ste nainštalovaly svoj prvý balík so svojim prvým komponentom.<br />
<br />
== The IDE menu items for packages: ==<br />
<br />
* File->New... -> Package -> Standard Package<br />
Creates a new package.<br />
* Project -> Project Inspector<br />
Here you can see, what packages are required by the currently open project.<br />
You can add new dependencies and remove unneeded ones.<br />
* Run -> Compiler options -> Inherited<br />
Here you can see what compiler options are inherited from which package.<br />
<br />
Components -> 5 new items<br />
- 'Open package'<br />
A dialog shows all open packages with their state.<br />
<br />
- 'Open package file'<br />
Open a .lpk file<br />
<br />
- 'Open recent package'<br />
Open a recently open package file (lpk file)<br />
<br />
- 'Package Graph'<br />
The package graph shows all open packages and their dependencies.<br />
<br />
== The theory ==<br />
<br />
Each Lazarus package has a .lpk file. A package is identified by its name and its version. The name must correspond to the lpk filename. For example:<br />
<br />
Name: Package1, Version: 1.0, Filename: /home/.../package1.lpk.<br />
<br />
Hint: To rename a package, use 'save as'.<br />
<br />
* The IDE automatically creates the main source file (package1.pas). See below. The lpk file contains information about the required packages, the files it uses, how to compile them, and what is needed to use the package by other packages/projects. The directory where the lpk file is, is called the "package directory".<br />
* The IDE maintains a list of all package files (packagelinks.xml). Everytime a package is opened in the IDE it will be added to this list. When a package is opened, the IDE automatically opens all required packages via this list.<br />
* There are three base packages: FCL, LCL and SynEdit. These are parts of the IDE and so they are autocreated, readonly and have no lpk file.<br />
* Normally a package has a source directory with some pascal units. And normally the lpk file will be there too. A package has also an output directory. Default is the subdirectory 'lib' in the package directory.<br />
* Before a package is compiled the IDE checks all required packages and if they need update and have the auto update flag, they are compiled first. Then the IDE creates the package main source file. If the lpk file was package1.lpk, then the main source file is package1.pas. This file contains all units in the uses section plus a 'Register' procedure, which is called in the intialization section. <br />
<br />
For example:<br />
<br />
This file was automatically created by Lazarus. Do not edit!<br />
This source is only used to compile and install<br />
the package GTKOpenGL 1.0.<br><br />
unit GTKOpenGL;<br />
interface<br />
uses GTKGLArea, GTKGLArea_Int, NVGL, NVGLX, LazarusPackageIntf;<br />
implementation<br />
procedure Register;<br />
begin<br />
RegisterUnit('GTKGLArea', @GTKGLArea.Register);<br />
end;<br />
initialization<br />
RegisterPackage('GTKOpenGL', @Register)<br />
end.<br />
<br />
* Then the compiler is called and the package is compiled to the output directory.<br />
* After successful compilation the state file is created. The state file is put into the output directory. It has the name <packagename>.compiled and contains the information, how the package was compiled. This state file is used by the IDE to check if update is needed.<br />
<br />
For example: gtkopengl.compiled:<br />
<br />
<?xml version="1.0"?><br />
<CONFIG><br />
<Compiler Value="/usr/bin/ppc386" Date="781388725"/><br />
<Params Value=" -Rintel -S2cgi -CD -Ch8000000 -OG1p1<br />
-Tlinux -gl -vewnhi -l -Fu../../../lcl/units<br />
-Fu../../../lcl/units/gtk -Fu../../../packager/units<br />
-Fu. -FElib/ gtkopengl.pas"/><br />
</CONFIG><br />
<br />
* The IDE opens all needed packages automatically. This means, it opens all installed packages, all packages marked for installation (auto install), all packages with an open Editor, all packages required by the project and all packages required by one of the other packages. Unneeded packages are automatically unloaded, when the IDE becomes idle.<br />
* The IDE never opens two packages with the same name at the same time. When the user opens another package file with the same name as an already opened package the IDE will ask to replace the old one.<br />
* The IDE maintains two extra sets of packages: The 'installed' packages and the 'auto install' packages. The auto install packages will be linked into the IDE on next compile. It creates two new files in the config directory: staticpackages.inc and idemake.cfg. Then it calls 'make ide OPT=@/path/to/your/config/idemake.cfg' to compile itself.<br />
<br />
== Contributors and Comments ==<br />
<br />
This page has been converted from the epikwiki [http://lazarus-ccr.sourceforge.net/index.php?wiki=LazarusPackages version].</div>Slavkohttps://wiki.freepascal.org/index.php?title=Code_Conversion_Guide/sk&diff=26033Code Conversion Guide/sk2008-01-02T16:17:14Z<p>Slavko: Oprava odkazov</p>
<hr />
<div>{{Code Conversion Guide}}<br />
<br />
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.<br />
<br />
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. <br />
<br />
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.<br />
<br />
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. <br />
<br />
==Výber komponentov alebo knižnice pre konverziu==<br />
<br />
===Kde hľadať kód na konverziu===<br />
<br />
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].<br />
<br />
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].<br />
<br />
===Licencovanie===<br />
<br />
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.<br />
<br />
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.<br />
<br />
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".<br />
<br />
===Závislosti ===<br />
<br />
Ď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.<br />
<br />
===Poznámky k prekladaču===<br />
<br />
Viz:<br />
* [http://www.freepascal.org/probs.html Známe problémy]<br />
* [http://www.freepascal.org/bugs/db.php3?statusfield=Unfixed Neopravené chyby]<br />
<br />
===Poznámky k platforme a OS===<br />
<br />
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!<br />
<br />
==Konverzia ==<br />
<br />
===Nastavenie IDE Lazarus pre konverziu projektu===<br />
<br />
====Vytvorenie skúšobného projektu====<br />
* Umiestnite konvertovaný kód do podadresára (napr: convertdir)<br />
* Spusťte Lazarus<br />
* '''File->Save All''' do adresára convertdir. Zmysluplné mená pre Project a predvolenú jednotku sú voliteľné.<br />
* Otvorte "základnú" konvertovanú jednotku v convertdir<br />
* Pridajte ju do projektu: '''Project->Add Active Unit to Project'''<br />
* Spusťte '''Tools->Quick Syntax Check''' alebo '''Run->Build All''', čím začnete.<br />
<br />
====Na čo treba dať pozor====<br />
* 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'''.<br />
====Zdrojové kódy Delphi VCL a Kylix CLX v Lazarus====<br />
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'''.<br />
<br />
===Problémy konverzie a ich riešenie ===<br />
<br />
==== Ekvivalenty Delphi/Kylix súborov v Lazarus ====<br />
<br />
{|border="1" width="800" <br />
! Delphi / Kylix !! Popis !! Lazarus !! Popis<br />
|- <br />
|valign="top"| .pas<br />
<br />
.dfm/.xfm,<br />
<br />
.dcu/.dpu,<br />
<br />
.dpr(main project file),<br />
<br />
.res,<br />
<br />
.dof/.kof<br />
<br />
---<br />
<br />
---<br />
<br />
---<br />
<br />
|valign="top"| súbor zdrojového kódu Delphi,<br />
<br />
formulár Delphi,<br />
<br />
preložená jednotka Delphi,<br />
<br />
projekt Delphi,<br />
<br />
Resource súbor Windows,<br />
<br />
súbor volieb Delphi<br />
<br />
|valign="top"| .pas, .pp<br />
.lfm,<br />
<br />
.o,<br />
<br />
.lpr<br />
<br />
---<br />
<br />
---<br />
<br />
.lrs,<br />
<br />
.lpi(hlavný súbor projketu),<br />
<br />
.ppu<br />
<br />
|valign="top"| súbor jednotky Pascal,<br />
<br />
dátový súbor formulára,<br />
<br />
súbor preloženej jednotky,<br />
<br />
súbor projektu,<br />
<br />
Resource súbor,<br />
<br />
súbor volieb projektu,<br />
<br />
Resource súbor Lazarus,<br />
<br />
informačný súbor projektu Lazarus,<br />
<br />
popisný súbor jednotky FPC<br />
|}<br />
<br />
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.<br />
<br />
====Konverzia projektov/formulárov/jednotiek Delphi do Lazarus====<br />
<br />
Premenujte alebo prekopírujte súbor .dpr na súbor .lpr. Zakomentujte alebo odstráňte direktívu <br />
{$R *.res}<br />
a pridajte direktívu<br />
{$mode delphi}{$H+}<br />
alebo<br />
{$mode objfpc}{$H+}<br />
do súboru .lpr. <br />
<br />
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.<br />
<br />
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.<br />
<br />
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:<br />
<br />
# upraví veľkosť písmen v sekciách uses a iclude.<br />
# konvertuje súbory .dfm na súbory .lfm (bez kontroly obsahu, len formát)<br />
# vytvorí prázdny súbor .lrs (obsah bude pridaný neskôr)<br />
# pridá direktívu<br />
{$mode delphi}<br />
# nahradí jednotku Windows jednotkou LCLIntf<br />
# ak je to potrebné, pridá jednotku LResources<br />
# odoberie jednotku Variants<br />
# odoberie direktívu<br />
{$R *.dfm}<br />
# pridá do sekcie initialization direktívu <br />
{$i unit.lrs}<br />
<br />
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).<br />
<br />
====Výber správneho módu prekladača====<br />
<br />
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:<br />
<br />
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í.<br />
<br />
Väčšinu jednotiek Delphi môžete jednoducho preložiť pomocou [[Free Pascal]] pridaním tejto konštrukcie, hneď za meno jednotky<br />
{$IFDEF FPC}<br />
{$MODE DELPHI}<br />
{$ENDIF}<br />
<br />
Ď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].<br />
<br />
====Viac-platformové poznámky====<br />
* 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.<br />
* Neodkazujte na špecifické pamäťové miesto, ako dátová oblasť BIOS. Zistite čo kód potrebuje a skúste nájsť cezplatformovú alternatívu.<br />
* 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é.<br />
* Ak potrebujete nejaký kód, špecifický pre OS, používajte '''IFDEF'''. Viz zoznam makier neskôr.<br />
<br />
====Užitočné premenné prekladača====<br />
<br />
Pre písanie kódu, ktorý sa má správať na rôznych systémoch rôzne, môžete použiť direktívy<br />
{$IFDEF Name}<br />
Pričom Name môže byť<br />
*'''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.<br />
{$IfDef LCL}<br />
*'''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.<br />
{$IfDef FPC}<br />
*'''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.<br />
{$IfDef LCLGtk}<br />
{$IfDef LCLWin32}<br />
{$IfDef LCLQt}<br />
... <br />
*'''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ží.<br />
{$IfDef Unix}<br />
{$IfDef Win32}<br />
...<br />
: Pre prácu v Kylix použite nasledujúcu konštrukciu:<br />
{$IfDef Linux}<br />
{$Define Unix}<br />
{$EndIf}<br />
*'''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.<br />
{$IfDef ENDIAN_BIG}<br />
<br />
Ďalšie podrobnosti nájdete v [http://www.freepascal.org/docs-html/prog/prog.html#QQ2-23-21 dokumentácii Free Pascal].<br />
<br />
==== Podpora 32bit/64bit ====<br />
<br />
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:<br />
*'''PtrInt''' je 32bit Integer so znamienkom na 32bit platformách a 64bit Integer sp znamienkom na 64bit platformách.<br />
*'''PtrUInt''', je rovnaké ako predchádzajúce s tým rozdielom, že sa jedná o Integer bez znamienka.<br />
<br />
Pre kód, ktorý má pracovať s Delphi a FPC použite:<br />
{$IFNDEF FPC}<br />
type<br />
PtrInt = integer;<br />
PtrUInt = cardinal;<br />
{$ENDIF}<br />
<br />
Nahrďte všetky<br />
integer(SomePointerOrObject)<br />
týmto<br />
PtrInt(SomePointerOrObject)<br />
<br />
====Hľadanie chýbajúcich identifikátorov====<br />
<br />
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.<br />
<br />
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):<br />
<br />
grep -in ' tbutton =' lcl/*<br />
<br />
====Rozdiely v dôležitých jednotkách Lazarus a Delphi ====<br />
<br />
;Prosím dopĺňajte túto časť!;<br />
<br />
* Windows -> LCLIntf, LCLType, LCLProc, VCLGlobals, ...<br />
<br />
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ď).<br />
<br />
Jednotka '''Interfaces''' musí byť zahrnutá v súbore .lpr file pre správnu inicializáciu príslušného WidgetSet.<br />
<br />
* Messages->LMessages<br />
<br />
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'''.<br />
<br />
* Graphics, Controls->GraphTypes, GraphMath, Graphics, Controls<br />
<br />
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.<br />
<br />
Point1 := Point2 + Point3<br />
<br />
či porovnanie dvoch pravouholníkov ako<br />
<br />
if (rect1 = rect2) then ...<br />
<br />
* Mask->MaskEdit<br />
<br />
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.<br />
<br />
* StdCtrls->StdCtrls,Buttons<br />
<br />
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úť.<br />
<br />
====Rozdiely vo vlastnostiach a metódach Delphi -> FPC/LCL ====<br />
* v LCL je Canvas obsahnutý v TBitmap<br />
====Sémantické rozdiely ====<br />
<br />
===== Poradie vyhodnocovania parametrov =====<br />
<br />
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.<br />
<br />
===== Vnorené procedúry/funkcie sú procedurálne premenné =====<br />
<br />
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 premnnú.<br />
<br />
FPC vždy posiela framepointer rodičovskej procedúry ako skrytý prvý parameter, podľa aktuálnej konvecie vlanie, čo znamená, že ak voláte vnorenú procedúru ako bežnú procedirálnu premnnú, vštky parametre budú posunuté o jednu pozíciu.<br />
<br />
Inými slovami, nevolajte vnorené procedúry pomocou procedurálnych premenných.<br />
<br />
==== Syntaktické rozdiely ====<br />
<br />
;Prosím dopĺňajte túto kapitolu!<br />
<br />
Kvôli zdedenej prísnosti FPC, budú potrebné niektoré syntaktické zmeny, napriek direktíve<br />
{$Mode Delphi}<br />
pracuje oveľa pomalšie ako Delphi. Kvôli tomu oveľa viac vyhovujú pravidlá syntaxe<br />
{$Mode ObjFPC}<br />
ak je to možné, vrelo doporučujem, dokonca i keď bude kód zdieľaný medzi Delphi a LCL.<br />
<br />
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:<br />
<br />
=====Pri priraďovaní vstupného bodu obsluhy udalosti, pridajte predponu "@"=====<br />
<br />
Napríklad, môžete manuálne priradiť udalosť tlačítka<br />
{| border="1" width="800"<br />
! Delphi !! OBJFPC<br />
|-<br />
|<pascal><br />
begin<br />
if not Assigned(MyButton.OnClick) then <br />
MyButton.OnClick:= SomeFunction;<br />
//@ nie je vyžadované<br />
//ďalší kód...<br />
end;<br />
</pascal><br />
|<pascal><br />
begin<br />
if not Assigned(MyButton.OnClick) then<br />
MyButton.OnClick:= @SomeFunction;<br />
//@ je vyžadované<br />
//ďalší kód...<br />
end;<br />
</pascal><br />
|}<br />
<br />
=====Pri volaní procedurálnej premennej používajte túto syntax: theprocname()=====<br />
<br />
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<br />
{| border="1" width="800"<br />
! Delphi !! OBJFPC<br />
|-<br />
|<pascal><br />
With (SomeObject) do <br />
begin<br />
If Assigned(OnMyCallback) then<br />
OnMyCallback;<br />
//zátvorky nie sú vyžadované<br />
end;<br />
</pascal><br />
|<pascal><br />
With (SomeObject) do <br />
begin<br />
If Assigned(OnMyCallback) then<br />
OnMyCallback();<br />
//zátvorky sú vyžadované<br />
end;<br />
</pascal><br />
|}<br />
<br />
===== Pri pristupovaní k hodnotám v ukazovateli na záznam ho musíte najprv dereferencovať =====<br />
<br />
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. <br />
<br />
V FPC musí byť najprv dereferencovaný, napríklad:<br />
{| border="1" width="800"<br />
! Delphi !! OBJFPC<br />
|-<br />
|<pascal><br />
Function GetSomeValue(ARecord: PMyRecord):Integer;<br />
begin<br />
If Assigned(ARecord) then<br />
Result:=ARecord.SomeValue<br />
else<br />
Result:=0;<br />
end;<br />
</pascal><br />
|<pascal><br />
Function GetSomeValue(ARecord: PMyRecord):Integer;<br />
begin<br />
If Assigned(ARecord) then<br />
Result:=ARecord^.SomeValue<br />
else<br />
Result:=0;<br />
end;<br />
</pascal><br />
|}<br />
<br />
=====Pri pristupovaní znakov indexovaného reťazca Vlastnosti objektu, musí byť najprv uzatvorený v zátvorkách =====<br />
<br />
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.<br />
<br />
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<br />
{| border="1" width="800"<br />
! Delphi !! OBJFPC<br />
|-<br />
|<pascal><br />
Type TSomeComponent=class(TComponent)<br />
//Ďalší kód...<br />
Published<br />
Property MyString:String index 3 read GetMyString;<br />
//Ďalší kód...<br />
End;<br />
<br />
var<br />
MyChar:char;<br />
begin<br />
If Length(MyString)>2 then<br />
//nie sú potrebné zátvorky<br />
MyChar:= MyString[3];<br />
//Ďalší kód...<br />
end;<br />
</pascal><br />
|<pascal><br />
Type TSomeComponent=class(TComponent)<br />
//Ďalší kód...<br />
Published<br />
Property MyString:String index 3 read GetMyString;<br />
//Ďalší kód...<br />
End;<br />
<br />
var<br />
MyChar:char;<br />
begin<br />
If Length(MyString)>2 then<br />
//niekedy sú potrebné zátvorky<br />
MyChar:= (MyString)[3];<br />
//Ďalší kód...<br />
end;<br />
</pascal><br />
|}<br />
<br />
=====Pri použití ukazovateľov s premennými alebo funkciami, musíte ich najprv pretypovať na príslušný typ =====<br />
<br />
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. <br />
<br />
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<br />
<br />
{| border="1" width="800"<br />
! Delphi !! OBJFPC<br />
|-<br />
|<pascal><br />
Unit 1<br />
Type <br />
TSomeObject=class(TComponent)<br />
//Ďalší kód...<br />
End;<br />
<br />
Procedure DoSomething(Value: TSomeObject);<br />
Function GetSomeObject: TSomeObject;<br />
<br />
Unit 2<br />
Type <br />
TSomeComponent=class(TComponent)<br />
//Ďalší kód...<br />
Published SomeObject: Pointer;<br />
//Ďalší kód...<br />
End;<br />
<br />
Application<br />
var <br />
MyComponent: TSomeComponent;<br />
begin<br />
MyComponent.SomeObject:=GetSomeObject;<br />
//Ďalší kód...<br />
DoSomething(MyComponent.SomeObject);<br />
end;<br />
</pascal><br />
|<pascal><br />
Unit 1<br />
Type <br />
TSomeObject=class(TComponent)<br />
//Ďalší kód...<br />
End;<br />
<br />
Procedure DoSomething(Value: TSomeObject);<br />
Function GetSomeObject: TSomeObject;<br />
<br />
Unit 2<br />
Type<br />
TSomeComponent=class(TComponent)<br />
//Ďalší kód...<br />
Published SomeObject: Pointer;<br />
//Ďalší kód...<br />
End;<br />
<br />
Application<br />
var <br />
MyComponent: TSomeComponent;<br />
begin<br />
MyComponent.SomeObject:=Pointer(GetSomeObject);<br />
//Ďalší kód...<br />
DoSomething(TSomeObject(MyComponent.SomeObject));<br />
end;<br />
</pascal><br />
|}<br />
<br />
==== Resources ====<br />
<br />
Súbory zdrojov Delphi sú špecifické pre win32 a nie sú kompatibilné s Lazarus, tzakž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ť:<br />
cd lazarus/tools<br />
make install<br />
Pre pridanie resource do svojej aplikácie spusťte:<br />
lazres myresource.lrs mypix.xpm anotherpix.xpm<br />
A potom<br />
* pridajte jednotku '''LResources''' do sekcie '''Uses'''<br />
* zahrňte vami vytvorený súbor .lrs do bloku ''initialization''<br />
<br />
;Príklad:<br />
<pascal><br />
function TForm1.LoadGlyph(const GlyphName: String): TBitMap;<br />
begin<br />
Result:= TPixmap.Create;<br />
Result.LoadFromLazarusResource(GlyphName);<br />
end;<br />
//Ďalší kód...<br />
begin<br />
Speedbutton1.glyph:= LoadGlyph('mypix');<br />
//Ďalší kód...<br />
end<br />
<br />
initialization<br />
{$I unit1.lrs}<br />
{$I myresource.lrs}<br />
end.<br />
</pascal><br />
<br />
=== Iná metóda konverzie projketu Delphi/Kylix do Lazarus ===<br />
<br />
* 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)<br />
* premeujte súbor .dpr na '''.lpr'''<br />
* urobte potrebné zmeny súboru '''.lpr''':<br />
# pridajte direktívy '''{$mode delphi}{$H+}''' alebo '''{$mode objfpc}{H+}'''<br />
# pridajte jednotku '''Interfaces''' do sekcie uses<br />
# zakomentujte alebo zmažte direktívu {$R *.res} <br />
* urobte potrebné zmeny vo všetkých súboroch jednotiek '''.pas''':<br />
# pridajte direktívu '''{$mode delphi}{$H+}''' alebo '''{$mode objfpc}{H+}'''<br />
# pridajte '''LResources''' a, ak má formulár tlačítka, aj '''Buttons''' do sekcie uses<br />
# zakomentujte alebo zmažte direktívu {$R *.dfm} alebo {$R *.xfm}<br />
# pridajte sekciu '''Initialization''' nakoniec každého súboru jednotky a pridajte do nej direktívu '''{$I unitname.lrs}'''<br />
* vyberte '''Project->New Project from file'''<br />
* zvoľte súbor '''.lpr'''<br />
* v okne 'Create a new project' zvoľte 'Application'<br />
* vybudujte projekt a zaistite ďalšie potrebné opravy, v tomto okamžiku je automaticky vygenerovaný súbor .lpi.<br />
**Môžete sa stretnúť so správou 'Error reading Form', ak to nastane kliknite na 'Continue Loading'<br />
* všetko uložte a máte projekt Lazarus :-)<br />
<br />
== Získanie nápovedy ==<br />
<br />
Ak sa počas konverzie stretnete sproblémom, ktorý neviete vyriešiť, sú široké možnosti ako získať pomoc:<br />
<br />
=== Documentation ===<br />
<br />
* 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.<br />
* Pre problémy viac orientované na Lazarus, hľadajte aj v [[Main Page|Dokumentácii projektu Lazarus]].<br />
<br />
=== Partnerská podpora ===<br />
<br />
* 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.<br />
* IRC - na irc.freenode.net: [irc://irc.freenode.net/fpc #fpc] rpe FPC alebo [irc://irc.freenode.net/lazarus-ide #lazarus-ide] pre Lazarus<br />
<br />
=== Vedomostné bázy ===<br />
<br />
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:<br />
* Tamarack Associates poskytuej rýchly [http://www.tamaracka.com/search.htm vyhľadávací] stroj špecifické pre archívy Borland usenet.<br />
* Mer Systems Inc. poskytuje podobný vyhľadávací [http://www.mers.com/searchsite.html stroj].<br />
* Ď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].<br />
<br />
== Balíčkovanie a Uvoľňovanie komponentov ==<br />
<br />
=== Vytvorenie Lazarus balíčka s vašim komponentom ===<br />
<br />
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.<br />
<br />
=== Dokumentácia ===<br />
<br />
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.<br />
<br />
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.<br />
<br />
=== Tvorba Code Release stránky ===<br />
<br />
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ď.<br />
<br />
Pre vytvorenie svojej stránky Code Release vo svojom prehliadači: <br />
<br />
* prejdite na [[Release new component]]<br />
* napíšte meno komponentu do editačného poľa a kliknite na ''Create Article''<br />
* vyplňte šablónu a stlačte uložiť.<br />
* 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.<br />
<br />
=== Poslanie komponentu ===<br />
<br />
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.<br />
<br />
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]].<br />
<br />
== Contributors and Changes ==<br />
<br />
This page has been converted from the epikwiki [http://lazarus-ccr.sourceforge.net/index.php?wiki=CodeConversionGuide version].<br />
* Initial version by Tom Lisjac and Mattias Gärtner - 9/22/2003 [[User:Tom | VlxAdmin]]<br />
* Moved Getting help from the main page. T. Lisjac - 9/24/2003 [[User:Tom | VlxAdmin]]<br />
* Added documentation templates, procedure and links. 9/25/2003 [[User:Tom | VlxAdmin]]<br />
* LCLLinux was renamed to LCLIntf, [[User:Jesusrmx | Jesus Reyes]], 9/27/2003<br />
* added more information on Unit changes, [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson AndrewJohnson] 9/27/2003<br />
* Updated Syntax differences, including some examples, [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson AndrewJohnson] 9/27/2003<br />
* FPC 1.0.x doesn't support interfaces, [[User:Vincent | Vincent Snijders]] 9/28/2003<br />
* Fixed some of the examples per new WikiWord definition, 9/28/2003 [[User:Tom | VlxAdmin]]<br />
* Made code more consistant to remove last accidental Pascal WikiWord definitions, [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson AndrewJohnson] 9/27/2003<br />
* Use tables for code examples for nice blocks, and easy side by side view of Delphi->FPC differences, [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson AndrewJohnson] 10/17/2003<br />
* Use pascal stylesheet to make example code more readable, [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson AndrewJohnson] 10/18/2003</div>Slavkohttps://wiki.freepascal.org/index.php?title=Code_Conversion_Guide/sk&diff=26032Code Conversion Guide/sk2008-01-02T16:11:47Z<p>Slavko: Konečne preklad sekcie :-)</p>
<hr />
<div>{{Code Conversion Guide}}<br />
<br />
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.<br />
<br />
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. <br />
<br />
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.<br />
<br />
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. <br />
<br />
==Výber komponentov alebo knižnice pre konverziu==<br />
<br />
===Kde hľadať kód na konverziu===<br />
<br />
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].<br />
<br />
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].<br />
<br />
===Licencovanie===<br />
<br />
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.<br />
<br />
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.<br />
<br />
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".<br />
<br />
===Závislosti ===<br />
<br />
Ď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.<br />
<br />
===Poznámky k prekladaču===<br />
<br />
Viz:<br />
* [http://www.freepascal.org/probs.html Známe problémy]<br />
* [http://www.freepascal.org/bugs/db.php3?statusfield=Unfixed Neopravené chyby]<br />
<br />
===Poznámky k platforme a OS===<br />
<br />
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!<br />
<br />
==Konverzia ==<br />
<br />
===Nastavenie IDE Lazarus pre konverziu projektu===<br />
<br />
====Vytvorenie skúšobného projektu====<br />
* Umiestnite konvertovaný kód do podadresára (napr: convertdir)<br />
* Spusťte Lazarus<br />
* '''File->Save All''' do adresára convertdir. Zmysluplné mená pre Project a predvolenú jednotku sú voliteľné.<br />
* Otvorte "základnú" konvertovanú jednotku v convertdir<br />
* Pridajte ju do projektu: '''Project->Add Active Unit to Project'''<br />
* Spusťte '''Tools->Quick Syntax Check''' alebo '''Run->Build All''', čím začnete.<br />
<br />
====Na čo treba dať pozor====<br />
* 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'''.<br />
====Zdrojové kódy Delphi VCL a Kylix CLX v Lazarus====<br />
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'''.<br />
<br />
===Problémy konverzie a ich riešenie ===<br />
<br />
==== Ekvivalenty Delphi/Kylix súborov v Lazarus ====<br />
<br />
{|border="1" width="800" <br />
! Delphi / Kylix !! Popis !! Lazarus !! Popis<br />
|- <br />
|valign="top"| .pas<br />
<br />
.dfm/.xfm,<br />
<br />
.dcu/.dpu,<br />
<br />
.dpr(main project file),<br />
<br />
.res,<br />
<br />
.dof/.kof<br />
<br />
---<br />
<br />
---<br />
<br />
---<br />
<br />
|valign="top"| súbor zdrojového kódu Delphi,<br />
<br />
formulár Delphi,<br />
<br />
preložená jednotka Delphi,<br />
<br />
projekt Delphi,<br />
<br />
Resource súbor Windows,<br />
<br />
súbor volieb Delphi<br />
<br />
|valign="top"| .pas, .pp<br />
.lfm,<br />
<br />
.o,<br />
<br />
.lpr<br />
<br />
---<br />
<br />
---<br />
<br />
.lrs,<br />
<br />
.lpi(hlavný súbor projketu),<br />
<br />
.ppu<br />
<br />
|valign="top"| súbor jednotky Pascal,<br />
<br />
dátový súbor formulára,<br />
<br />
súbor preloženej jednotky,<br />
<br />
súbor projektu,<br />
<br />
Resource súbor,<br />
<br />
súbor volieb projektu,<br />
<br />
Resource súbor Lazarus,<br />
<br />
informačný súbor projektu Lazarus,<br />
<br />
popisný súbor jednotky FPC<br />
|}<br />
<br />
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.<br />
<br />
====Konverzia projektov/formulárov/jednotiek Delphi do Lazarus====<br />
<br />
Premenujte alebo prekopírujte súbor .dpr na súbor .lpr. Zakomentujte alebo odstráňte direktívu <br />
{$R *.res}<br />
a pridajte direktívu<br />
{$mode delphi}{$H+}<br />
alebo<br />
{$mode objfpc}{$H+}<br />
do súboru .lpr. <br />
<br />
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.<br />
<br />
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.<br />
<br />
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:<br />
<br />
# upraví veľkosť písmen v sekciách uses a iclude.<br />
# konvertuje súbory .dfm na súbory .lfm (bez kontroly obsahu, len formát)<br />
# vytvorí prázdny súbor .lrs (obsah bude pridaný neskôr)<br />
# pridá direktívu<br />
{$mode delphi}<br />
# nahradí jednotku Windows jednotkou LCLIntf<br />
# ak je to potrebné, pridá jednotku LResources<br />
# odoberie jednotku Variants<br />
# odoberie direktívu<br />
{$R *.dfm}<br />
# pridá do sekcie initialization direktívu <br />
{$i unit.lrs}<br />
<br />
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).<br />
<br />
====Výber správneho módu prekladača====<br />
<br />
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:<br />
<br />
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í.<br />
<br />
Väčšinu jednotiek Delphi môžete jednoducho preložiť pomocou [[Free Pascal]] pridaním tejto konštrukcie, hneď za meno jednotky<br />
{$IFDEF FPC}<br />
{$MODE DELPHI}<br />
{$ENDIF}<br />
<br />
Ď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].<br />
<br />
====Viac-platformové poznámky====<br />
* 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.<br />
* Neodkazujte na špecifické pamäťové miesto, ako dátová oblasť BIOS. Zistite čo kód potrebuje a skúste nájsť cezplatformovú alternatívu.<br />
* 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é.<br />
* Ak potrebujete nejaký kód, špecifický pre OS, používajte '''IFDEF'''. Viz zoznam makier neskôr.<br />
<br />
====Užitočné premenné prekladača====<br />
<br />
Pre písanie kódu, ktorý sa má správať na rôznych systémoch rôzne, môžete použiť direktívy<br />
{$IFDEF Name}<br />
Pričom Name môže byť<br />
*'''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.<br />
{$IfDef LCL}<br />
*'''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.<br />
{$IfDef FPC}<br />
*'''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.<br />
{$IfDef LCLGtk}<br />
{$IfDef LCLWin32}<br />
{$IfDef LCLQt}<br />
... <br />
*'''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ží.<br />
{$IfDef Unix}<br />
{$IfDef Win32}<br />
...<br />
: Pre prácu v Kylix použite nasledujúcu konštrukciu:<br />
{$IfDef Linux}<br />
{$Define Unix}<br />
{$EndIf}<br />
*'''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.<br />
{$IfDef ENDIAN_BIG}<br />
<br />
Ďalšie podrobnosti nájdete v [http://www.freepascal.org/docs-html/prog/prog.html#QQ2-23-21 dokumentácii Free Pascal].<br />
<br />
==== Podpora 32bit/64bit ====<br />
<br />
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:<br />
*'''PtrInt''' je 32bit Integer so znamienkom na 32bit platformách a 64bit Integer sp znamienkom na 64bit platformách.<br />
*'''PtrUInt''', je rovnaké ako predchádzajúce s tým rozdielom, že sa jedná o Integer bez znamienka.<br />
<br />
Pre kód, ktorý má pracovať s Delphi a FPC použite:<br />
{$IFNDEF FPC}<br />
type<br />
PtrInt = integer;<br />
PtrUInt = cardinal;<br />
{$ENDIF}<br />
<br />
Nahrďte všetky<br />
integer(SomePointerOrObject)<br />
týmto<br />
PtrInt(SomePointerOrObject)<br />
<br />
====Hľadanie chýbajúcich identifikátorov====<br />
<br />
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.<br />
<br />
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):<br />
<br />
grep -in ' tbutton =' lcl/*<br />
<br />
====Rozdiely v dôležitých jednotkách Lazarus a Delphi ====<br />
<br />
;Prosím dopĺňajte túto časť!;<br />
<br />
* Windows -> LCLIntf, LCLType, LCLProc, VCLGlobals, ...<br />
<br />
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ď).<br />
<br />
Jednotka '''Interfaces''' musí byť zahrnutá v súbore .lpr file pre správnu inicializáciu príslušného WidgetSet.<br />
<br />
* Messages->LMessages<br />
<br />
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'''.<br />
<br />
* Graphics, Controls->GraphTypes, GraphMath, Graphics, Controls<br />
<br />
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.<br />
<br />
Point1 := Point2 + Point3<br />
<br />
či porovnanie dvoch pravouholníkov ako<br />
<br />
if (rect1 = rect2) then ...<br />
<br />
* Mask->MaskEdit<br />
<br />
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.<br />
<br />
* StdCtrls->StdCtrls,Buttons<br />
<br />
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úť.<br />
<br />
====Rozdiely vo vlastnostiach a metódach Delphi -> FPC/LCL ====<br />
* v LCL je Canvas obsahnutý v TBitmap<br />
====Sémantické rozdiely ====<br />
<br />
===== Poradie vyhodnocovania parametrov =====<br />
<br />
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.<br />
<br />
===== Vnorené procedúry/funkcie sú procedurálne premenné =====<br />
<br />
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 premnnú.<br />
<br />
FPC vždy posiela framepointer rodičovskej procedúry ako skrytý prvý parameter, podľa aktuálnej konvecie vlanie, čo znamená, že ak voláte vnorenú procedúru ako bežnú procedirálnu premnnú, vštky parametre budú posunuté o jednu pozíciu.<br />
<br />
Inými slovami, nevolajte vnorené procedúry pomocou procedurálnych premenných.<br />
<br />
==== Syntaktické rozdiely ====<br />
<br />
;Prosím dopĺňajte túto kapitolu!<br />
<br />
Kvôli zdedenej prísnosti FPC, budú potrebné niektoré syntaktické zmeny, napriek direktíve<br />
{$Mode Delphi}<br />
pracuje oveľa pomalšie ako Delphi. Kvôli tomu oveľa viac vyhovujú pravidlá syntaxe<br />
{$Mode ObjFPC}<br />
ak je to možné, vrelo doporučujem, dokonca i keď bude kód zdieľaný medzi Delphi a LCL.<br />
<br />
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:<br />
<br />
=====Pri priraďovaní vstupného bodu obsluhy udalosti, pridajte predponu "@"=====<br />
<br />
Napríklad, môžete manuálne priradiť udalosť tlačítka<br />
{| border="1" width="800"<br />
! Delphi !! OBJFPC<br />
|-<br />
|<pascal><br />
begin<br />
if not Assigned(MyButton.OnClick) then <br />
MyButton.OnClick:= SomeFunction;<br />
//@ nie je vyžadované<br />
//ďalší kód...<br />
end;<br />
</pascal><br />
|<pascal><br />
begin<br />
if not Assigned(MyButton.OnClick) then<br />
MyButton.OnClick:= @SomeFunction;<br />
//@ je vyžadované<br />
//ďalší kód...<br />
end;<br />
</pascal><br />
|}<br />
<br />
=====Pri volaní procedurálnej premennej používajte túto syntax: theprocname()=====<br />
<br />
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<br />
{| border="1" width="800"<br />
! Delphi !! OBJFPC<br />
|-<br />
|<pascal><br />
With (SomeObject) do <br />
begin<br />
If Assigned(OnMyCallback) then<br />
OnMyCallback;<br />
//zátvorky nie sú vyžadované<br />
end;<br />
</pascal><br />
|<pascal><br />
With (SomeObject) do <br />
begin<br />
If Assigned(OnMyCallback) then<br />
OnMyCallback();<br />
//zátvorky sú vyžadované<br />
end;<br />
</pascal><br />
|}<br />
<br />
===== Pri pristupovaní k hodnotám v ukazovateli na záznam ho musíte najprv dereferencovať =====<br />
<br />
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. <br />
<br />
V FPC musí byť najprv dereferencovaný, napríklad:<br />
{| border="1" width="800"<br />
! Delphi !! OBJFPC<br />
|-<br />
|<pascal><br />
Function GetSomeValue(ARecord: PMyRecord):Integer;<br />
begin<br />
If Assigned(ARecord) then<br />
Result:=ARecord.SomeValue<br />
else<br />
Result:=0;<br />
end;<br />
</pascal><br />
|<pascal><br />
Function GetSomeValue(ARecord: PMyRecord):Integer;<br />
begin<br />
If Assigned(ARecord) then<br />
Result:=ARecord^.SomeValue<br />
else<br />
Result:=0;<br />
end;<br />
</pascal><br />
|}<br />
<br />
=====Pri pristupovaní znakov indexovaného reťazca Vlastnosti objektu, musí byť najprv uzatvorený v zátvorkách =====<br />
<br />
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.<br />
<br />
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<br />
{| border="1" width="800"<br />
! Delphi !! OBJFPC<br />
|-<br />
|<pascal><br />
Type TSomeComponent=class(TComponent)<br />
//Ďalší kód...<br />
Published<br />
Property MyString:String index 3 read GetMyString;<br />
//Ďalší kód...<br />
End;<br />
<br />
var<br />
MyChar:char;<br />
begin<br />
If Length(MyString)>2 then<br />
//nie sú potrebné zátvorky<br />
MyChar:= MyString[3];<br />
//Ďalší kód...<br />
end;<br />
</pascal><br />
|<pascal><br />
Type TSomeComponent=class(TComponent)<br />
//Ďalší kód...<br />
Published<br />
Property MyString:String index 3 read GetMyString;<br />
//Ďalší kód...<br />
End;<br />
<br />
var<br />
MyChar:char;<br />
begin<br />
If Length(MyString)>2 then<br />
//niekedy sú potrebné zátvorky<br />
MyChar:= (MyString)[3];<br />
//Ďalší kód...<br />
end;<br />
</pascal><br />
|}<br />
<br />
=====Pri použití ukazovateľov s premennými alebo funkciami, musíte ich najprv pretypovať na príslušný typ =====<br />
<br />
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. <br />
<br />
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<br />
<br />
{| border="1" width="800"<br />
! Delphi !! OBJFPC<br />
|-<br />
|<pascal><br />
Unit 1<br />
Type <br />
TSomeObject=class(TComponent)<br />
//Ďalší kód...<br />
End;<br />
<br />
Procedure DoSomething(Value: TSomeObject);<br />
Function GetSomeObject: TSomeObject;<br />
<br />
Unit 2<br />
Type <br />
TSomeComponent=class(TComponent)<br />
//Ďalší kód...<br />
Published SomeObject: Pointer;<br />
//Ďalší kód...<br />
End;<br />
<br />
Application<br />
var <br />
MyComponent: TSomeComponent;<br />
begin<br />
MyComponent.SomeObject:=GetSomeObject;<br />
//Ďalší kód...<br />
DoSomething(MyComponent.SomeObject);<br />
end;<br />
</pascal><br />
|<pascal><br />
Unit 1<br />
Type <br />
TSomeObject=class(TComponent)<br />
//Ďalší kód...<br />
End;<br />
<br />
Procedure DoSomething(Value: TSomeObject);<br />
Function GetSomeObject: TSomeObject;<br />
<br />
Unit 2<br />
Type<br />
TSomeComponent=class(TComponent)<br />
//Ďalší kód...<br />
Published SomeObject: Pointer;<br />
//Ďalší kód...<br />
End;<br />
<br />
Application<br />
var <br />
MyComponent: TSomeComponent;<br />
begin<br />
MyComponent.SomeObject:=Pointer(GetSomeObject);<br />
//Ďalší kód...<br />
DoSomething(TSomeObject(MyComponent.SomeObject));<br />
end;<br />
</pascal><br />
|}<br />
<br />
==== Resources ====<br />
<br />
Súbory zdrojov Delphi sú špecifické pre win32 a nie sú kompatibilné s Lazarus, tzakž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ť:<br />
cd lazarus/tools<br />
make install<br />
Pre pridanie resource do svojej aplikácie spusťte:<br />
lazres myresource.lrs mypix.xpm anotherpix.xpm<br />
A potom<br />
* pridajte jednotku '''LResources''' do sekcie '''Uses'''<br />
* zahrňte vami vytvorený súbor .lrs do bloku ''initialization''<br />
<br />
;Príklad:<br />
<pascal><br />
function TForm1.LoadGlyph(const GlyphName: String): TBitMap;<br />
begin<br />
Result:= TPixmap.Create;<br />
Result.LoadFromLazarusResource(GlyphName);<br />
end;<br />
//Ďalší kód...<br />
begin<br />
Speedbutton1.glyph:= LoadGlyph('mypix');<br />
//Ďalší kód...<br />
end<br />
<br />
initialization<br />
{$I unit1.lrs}<br />
{$I myresource.lrs}<br />
end.<br />
</pascal><br />
<br />
=== Iná metóda konverzie projketu Delphi/Kylix do Lazarus ===<br />
<br />
* 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)<br />
* premeujte súbor .dpr na '''.lpr'''<br />
* urobte potrebné zmeny súboru '''.lpr''':<br />
# pridajte direktívy '''{$mode delphi}{$H+}''' alebo '''{$mode objfpc}{H+}'''<br />
# pridajte jednotku '''Interfaces''' do sekcie uses<br />
# zakomentujte alebo zmažte direktívu {$R *.res} <br />
* urobte potrebné zmeny vo všetkých súboroch jednotiek '''.pas''':<br />
# pridajte direktívu '''{$mode delphi}{$H+}''' alebo '''{$mode objfpc}{H+}'''<br />
# pridajte '''LResources''' a, ak má formulár tlačítka, aj '''Buttons''' do sekcie uses<br />
# zakomentujte alebo zmažte direktívu {$R *.dfm} alebo {$R *.xfm}<br />
# pridajte sekciu '''Initialization''' nakoniec každého súboru jednotky a pridajte do nej direktívu '''{$I unitname.lrs}'''<br />
* vyberte '''Project->New Project from file'''<br />
* zvoľte súbor '''.lpr'''<br />
* v okne 'Create a new project' zvoľte 'Application'<br />
* vybudujte projekt a zaistite ďalšie potrebné opravy, v tomto okamžiku je automaticky vygenerovaný súbor .lpi.<br />
**Môžete sa stretnúť so správou 'Error reading Form', ak to nastane kliknite na 'Continue Loading'<br />
* všetko uložte a máte projekt Lazarus :-)<br />
<br />
== Získanie nápovedy ==<br />
<br />
Ak sa počas konverzie stretnete sproblémom, ktorý neviete vyriešiť, sú široké možnosti ako získať pomoc:<br />
<br />
=== Documentation ===<br />
<br />
* 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.<br />
* Pre problémy viac orientované na Lazarus, hľadajte aj v [[Main Page|Dokumentácii projektu Lazarus]].<br />
<br />
=== Partnerská podpora ===<br />
<br />
* 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.<br />
* IRC - na irc.freenode.net: [irc://irc.freenode.net/fpc #fpc] rpe FPC alebo [irc://irc.freenode.net/lazarus-ide #lazarus-ide] pre Lazarus<br />
<br />
=== Vedomostné bázy ===<br />
<br />
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:<br />
* Tamarack Associates poskytuej rýchly [http://www.tamaracka.com/search.htm vyhľadávací] stroj špecifické pre archívy Borland usenet.<br />
* Mer Systems Inc. poskytuje podobný vyhľadávací [http://www.mers.com/searchsite.html stroj].<br />
* Ď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].<br />
<br />
== Balíčkovanie a Uvoľňovanie komponentov ==<br />
<br />
=== Vytvorenie Lazarus balíčka s vašim komponentom ===<br />
<br />
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.<br />
<br />
=== Dokumentácia ===<br />
<br />
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.<br />
<br />
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/sl|pieskoviska]] - cvičnej oblasti.<br />
<br />
=== Tvorba Code Release stránky ===<br />
<br />
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ď.<br />
<br />
Pre vytvorenie svojej stránky Code Release vo svojom prehliadači: <br />
<br />
* prejdite na [[Release new component]]<br />
* napíšte meno komponentu do editačného poľa a kliknite na ''Create Article''<br />
* vyplňte šablónu a stlačte uložiť.<br />
* 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.<br />
<br />
=== Poslanie komponentu ===<br />
<br />
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.<br />
<br />
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]].<br />
<br />
== Contributors and Changes ==<br />
<br />
This page has been converted from the epikwiki [http://lazarus-ccr.sourceforge.net/index.php?wiki=CodeConversionGuide version].<br />
* Initial version by Tom Lisjac and Mattias Gärtner - 9/22/2003 [[User:Tom | VlxAdmin]]<br />
* Moved Getting help from the main page. T. Lisjac - 9/24/2003 [[User:Tom | VlxAdmin]]<br />
* Added documentation templates, procedure and links. 9/25/2003 [[User:Tom | VlxAdmin]]<br />
* LCLLinux was renamed to LCLIntf, [[User:Jesusrmx | Jesus Reyes]], 9/27/2003<br />
* added more information on Unit changes, [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson AndrewJohnson] 9/27/2003<br />
* Updated Syntax differences, including some examples, [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson AndrewJohnson] 9/27/2003<br />
* FPC 1.0.x doesn't support interfaces, [[User:Vincent | Vincent Snijders]] 9/28/2003<br />
* Fixed some of the examples per new WikiWord definition, 9/28/2003 [[User:Tom | VlxAdmin]]<br />
* Made code more consistant to remove last accidental Pascal WikiWord definitions, [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson AndrewJohnson] 9/27/2003<br />
* Use tables for code examples for nice blocks, and easy side by side view of Delphi->FPC differences, [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson AndrewJohnson] 10/17/2003<br />
* Use pascal stylesheet to make example code more readable, [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson AndrewJohnson] 10/18/2003</div>Slavkohttps://wiki.freepascal.org/index.php?title=Code_Conversion_Guide/sk&diff=26031Code Conversion Guide/sk2008-01-02T15:43:50Z<p>Slavko: Pridanie novej sekcie</p>
<hr />
<div>{{Code Conversion Guide}}<br />
<br />
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.<br />
<br />
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. <br />
<br />
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.<br />
<br />
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. <br />
<br />
==Výber komponentov alebo knižnice pre konverziu==<br />
<br />
===Kde hľadať kód na konverziu===<br />
<br />
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].<br />
<br />
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].<br />
<br />
===Licencovanie===<br />
<br />
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.<br />
<br />
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.<br />
<br />
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".<br />
<br />
===Závislosti ===<br />
<br />
Ď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.<br />
<br />
===Poznámky k prekladaču===<br />
<br />
Viz:<br />
* [http://www.freepascal.org/probs.html Známe problémy]<br />
* [http://www.freepascal.org/bugs/db.php3?statusfield=Unfixed Neopravené chyby]<br />
<br />
===Poznámky k platforme a OS===<br />
<br />
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!<br />
<br />
==Konverzia ==<br />
<br />
===Nastavenie IDE Lazarus pre konverziu projektu===<br />
<br />
====Vytvorenie skúšobného projektu====<br />
* Umiestnite konvertovaný kód do podadresára (napr: convertdir)<br />
* Spusťte Lazarus<br />
* '''File->Save All''' do adresára convertdir. Zmysluplné mená pre Project a predvolenú jednotku sú voliteľné.<br />
* Otvorte "základnú" konvertovanú jednotku v convertdir<br />
* Pridajte ju do projektu: '''Project->Add Active Unit to Project'''<br />
* Spusťte '''Tools->Quick Syntax Check''' alebo '''Run->Build All''', čím začnete.<br />
<br />
====Na čo treba dať pozor====<br />
* 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'''.<br />
====Zdrojové kódy Delphi VCL a Kylix CLX v Lazarus====<br />
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'''.<br />
<br />
===Problémy konverzie a ich riešenie ===<br />
<br />
==== Ekvivalenty Delphi/Kylix súborov v Lazarus ====<br />
<br />
{|border="1" width="800" <br />
! Delphi / Kylix !! Popis !! Lazarus !! Popis<br />
|- <br />
|valign="top"| .pas<br />
<br />
.dfm/.xfm,<br />
<br />
.dcu/.dpu,<br />
<br />
.dpr(main project file),<br />
<br />
.res,<br />
<br />
.dof/.kof<br />
<br />
---<br />
<br />
---<br />
<br />
---<br />
<br />
|valign="top"| súbor zdrojového kódu Delphi,<br />
<br />
formulár Delphi,<br />
<br />
preložená jednotka Delphi,<br />
<br />
projekt Delphi,<br />
<br />
Resource súbor Windows,<br />
<br />
súbor volieb Delphi<br />
<br />
|valign="top"| .pas, .pp<br />
.lfm,<br />
<br />
.o,<br />
<br />
.lpr<br />
<br />
---<br />
<br />
---<br />
<br />
.lrs,<br />
<br />
.lpi(hlavný súbor projketu),<br />
<br />
.ppu<br />
<br />
|valign="top"| súbor jednotky Pascal,<br />
<br />
dátový súbor formulára,<br />
<br />
súbor preloženej jednotky,<br />
<br />
súbor projektu,<br />
<br />
Resource súbor,<br />
<br />
súbor volieb projektu,<br />
<br />
Resource súbor Lazarus,<br />
<br />
informačný súbor projektu Lazarus,<br />
<br />
popisný súbor jednotky FPC<br />
|}<br />
<br />
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.<br />
<br />
====Konverzia projektov/formulárov/jednotiek Delphi do Lazarus====<br />
<br />
Premenujte alebo prekopírujte súbor .dpr na súbor .lpr. Zakomentujte alebo odstráňte direktívu <br />
{$R *.res}<br />
a pridajte direktívu<br />
{$mode delphi}{$H+}<br />
alebo<br />
{$mode objfpc}{$H+}<br />
do súboru .lpr. <br />
<br />
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.<br />
<br />
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.<br />
<br />
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:<br />
<br />
# upraví veľkosť písmen v sekciách uses a iclude.<br />
# konvertuje súbory .dfm na súbory .lfm (bez kontroly obsahu, len formát)<br />
# vytvorí prázdny súbor .lrs (obsah bude pridaný neskôr)<br />
# pridá direktívu<br />
{$mode delphi}<br />
# nahradí jednotku Windows jednotkou LCLIntf<br />
# ak je to potrebné, pridá jednotku LResources<br />
# odoberie jednotku Variants<br />
# odoberie direktívu<br />
{$R *.dfm}<br />
# pridá do sekcie initialization direktívu <br />
{$i unit.lrs}<br />
<br />
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).<br />
<br />
====Výber správneho módu prekladača====<br />
<br />
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:<br />
<br />
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í.<br />
<br />
Väčšinu jednotiek Delphi môžete jednoducho preložiť pomocou [[Free Pascal]] pridaním tejto konštrukcie, hneď za meno jednotky<br />
{$IFDEF FPC}<br />
{$MODE DELPHI}<br />
{$ENDIF}<br />
<br />
Ď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].<br />
<br />
====Viac-platformové poznámky====<br />
* 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.<br />
* Neodkazujte na špecifické pamäťové miesto, ako dátová oblasť BIOS. Zistite čo kód potrebuje a skúste nájsť cezplatformovú alternatívu.<br />
* 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é.<br />
* Ak potrebujete nejaký kód, špecifický pre OS, používajte '''IFDEF'''. Viz zoznam makier neskôr.<br />
<br />
====Užitočné premenné prekladača====<br />
<br />
Pre písanie kódu, ktorý sa má správať na rôznych systémoch rôzne, môžete použiť direktívy<br />
{$IFDEF Name}<br />
Pričom Name môže byť<br />
*'''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.<br />
{$IfDef LCL}<br />
*'''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.<br />
{$IfDef FPC}<br />
*'''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.<br />
{$IfDef LCLGtk}<br />
{$IfDef LCLWin32}<br />
{$IfDef LCLQt}<br />
... <br />
*'''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ží.<br />
{$IfDef Unix}<br />
{$IfDef Win32}<br />
...<br />
: Pre prácu v Kylix použite nasledujúcu konštrukciu:<br />
{$IfDef Linux}<br />
{$Define Unix}<br />
{$EndIf}<br />
*'''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.<br />
{$IfDef ENDIAN_BIG}<br />
<br />
Ďalšie podrobnosti nájdete v [http://www.freepascal.org/docs-html/prog/prog.html#QQ2-23-21 dokumentácii Free Pascal].<br />
<br />
==== Podpora 32bit/64bit ====<br />
<br />
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:<br />
*'''PtrInt''' je 32bit Integer so znamienkom na 32bit platformách a 64bit Integer sp znamienkom na 64bit platformách.<br />
*'''PtrUInt''', je rovnaké ako predchádzajúce s tým rozdielom, že sa jedná o Integer bez znamienka.<br />
<br />
Pre kód, ktorý má pracovať s Delphi a FPC použite:<br />
{$IFNDEF FPC}<br />
type<br />
PtrInt = integer;<br />
PtrUInt = cardinal;<br />
{$ENDIF}<br />
<br />
Nahrďte všetky<br />
integer(SomePointerOrObject)<br />
týmto<br />
PtrInt(SomePointerOrObject)<br />
<br />
====Hľadanie chýbajúcich identifikátorov====<br />
<br />
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.<br />
<br />
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):<br />
<br />
grep -in ' tbutton =' lcl/*<br />
<br />
====Rozdiely v dôležitých jednotkách Lazarus a Delphi ====<br />
<br />
;Prosím dopĺňajte túto časť!;<br />
<br />
* Windows -> LCLIntf, LCLType, LCLProc, VCLGlobals, ...<br />
<br />
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ď).<br />
<br />
Jednotka '''Interfaces''' musí byť zahrnutá v súbore .lpr file pre správnu inicializáciu príslušného WidgetSet.<br />
<br />
* Messages->LMessages<br />
<br />
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'''.<br />
<br />
* Graphics, Controls->GraphTypes, GraphMath, Graphics, Controls<br />
<br />
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.<br />
<br />
Point1 := Point2 + Point3<br />
<br />
či porovnanie dvoch pravouholníkov ako<br />
<br />
if (rect1 = rect2) then ...<br />
<br />
* Mask->MaskEdit<br />
<br />
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.<br />
<br />
* StdCtrls->StdCtrls,Buttons<br />
<br />
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úť.<br />
<br />
====Rozdiely vo vlastnostiach a metódach Delphi -> FPC/LCL ====<br />
* v LCL je Canvas obsahnutý v TBitmap<br />
====Sémantické rozdiely ====<br />
<br />
===== Poradie vyhodnocovania parametrov =====<br />
<br />
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.<br />
<br />
===== Vnorené procedúry/funkcie sú procedurálne premenné =====<br />
<br />
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 premnnú.<br />
<br />
FPC vždy posiela framepointer rodičovskej procedúry ako skrytý prvý parameter, podľa aktuálnej konvecie vlanie, čo znamená, že ak voláte vnorenú procedúru ako bežnú procedirálnu premnnú, vštky parametre budú posunuté o jednu pozíciu.<br />
<br />
Inými slovami, nevolajte vnorené procedúry pomocou procedurálnych premenných.<br />
<br />
==== Syntaktické rozdiely ====<br />
<br />
;Prosím dopĺňajte túto kapitolu!<br />
<br />
Kvôli zdedenej prísnosti FPC, budú potrebné niektoré syntaktické zmeny, napriek direktíve<br />
{$Mode Delphi}<br />
pracuje oveľa pomalšie ako Delphi. Kvôli tomu oveľa viac vyhovujú pravidlá syntaxe<br />
{$Mode ObjFPC}<br />
ak je to možné, vrelo doporučujem, dokonca i keď bude kód zdieľaný medzi Delphi a LCL.<br />
<br />
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:<br />
<br />
=====Pri priraďovaní vstupného bodu obsluhy udalosti, pridajte predponu "@"=====<br />
<br />
Napríklad, môžete manuálne priradiť udalosť tlačítka<br />
{| border="1" width="800"<br />
! Delphi !! OBJFPC<br />
|-<br />
|<pascal><br />
begin<br />
if not Assigned(MyButton.OnClick) then <br />
MyButton.OnClick:= SomeFunction;<br />
//@ nie je vyžadované<br />
//ďalší kód...<br />
end;<br />
</pascal><br />
|<pascal><br />
begin<br />
if not Assigned(MyButton.OnClick) then<br />
MyButton.OnClick:= @SomeFunction;<br />
//@ je vyžadované<br />
//ďalší kód...<br />
end;<br />
</pascal><br />
|}<br />
<br />
=====Pri volaní procedurálnej premennej používajte túto syntax: theprocname()=====<br />
<br />
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<br />
{| border="1" width="800"<br />
! Delphi !! OBJFPC<br />
|-<br />
|<pascal><br />
With (SomeObject) do <br />
begin<br />
If Assigned(OnMyCallback) then<br />
OnMyCallback;<br />
//zátvorky nie sú vyžadované<br />
end;<br />
</pascal><br />
|<pascal><br />
With (SomeObject) do <br />
begin<br />
If Assigned(OnMyCallback) then<br />
OnMyCallback();<br />
//zátvorky sú vyžadované<br />
end;<br />
</pascal><br />
|}<br />
<br />
===== Pri pristupovaní k hodnotám v ukazovateli na záznam ho musíte najprv dereferencovať =====<br />
<br />
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. <br />
<br />
V FPC musí byť najprv dereferencovaný, napríklad:<br />
{| border="1" width="800"<br />
! Delphi !! OBJFPC<br />
|-<br />
|<pascal><br />
Function GetSomeValue(ARecord: PMyRecord):Integer;<br />
begin<br />
If Assigned(ARecord) then<br />
Result:=ARecord.SomeValue<br />
else<br />
Result:=0;<br />
end;<br />
</pascal><br />
|<pascal><br />
Function GetSomeValue(ARecord: PMyRecord):Integer;<br />
begin<br />
If Assigned(ARecord) then<br />
Result:=ARecord^.SomeValue<br />
else<br />
Result:=0;<br />
end;<br />
</pascal><br />
|}<br />
<br />
=====Pri pristupovaní znakov indexovaného reťazca Vlastnosti objektu, musí byť najprv uzatvorený v zátvorkách =====<br />
<br />
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.<br />
<br />
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<br />
{| border="1" width="800"<br />
! Delphi !! OBJFPC<br />
|-<br />
|<pascal><br />
Type TSomeComponent=class(TComponent)<br />
//Ďalší kód...<br />
Published<br />
Property MyString:String index 3 read GetMyString;<br />
//Ďalší kód...<br />
End;<br />
<br />
var<br />
MyChar:char;<br />
begin<br />
If Length(MyString)>2 then<br />
//nie sú potrebné zátvorky<br />
MyChar:= MyString[3];<br />
//Ďalší kód...<br />
end;<br />
</pascal><br />
|<pascal><br />
Type TSomeComponent=class(TComponent)<br />
//Ďalší kód...<br />
Published<br />
Property MyString:String index 3 read GetMyString;<br />
//Ďalší kód...<br />
End;<br />
<br />
var<br />
MyChar:char;<br />
begin<br />
If Length(MyString)>2 then<br />
//niekedy sú potrebné zátvorky<br />
MyChar:= (MyString)[3];<br />
//Ďalší kód...<br />
end;<br />
</pascal><br />
|}<br />
<br />
=====Pri použití ukazovateľov s premennými alebo funkciami, musíte ich najprv pretypovať na príslušný typ =====<br />
<br />
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. <br />
<br />
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<br />
<br />
{| border="1" width="800"<br />
! Delphi !! OBJFPC<br />
|-<br />
|<pascal><br />
Unit 1<br />
Type <br />
TSomeObject=class(TComponent)<br />
//Ďalší kód...<br />
End;<br />
<br />
Procedure DoSomething(Value: TSomeObject);<br />
Function GetSomeObject: TSomeObject;<br />
<br />
Unit 2<br />
Type <br />
TSomeComponent=class(TComponent)<br />
//Ďalší kód...<br />
Published SomeObject: Pointer;<br />
//Ďalší kód...<br />
End;<br />
<br />
Application<br />
var <br />
MyComponent: TSomeComponent;<br />
begin<br />
MyComponent.SomeObject:=GetSomeObject;<br />
//Ďalší kód...<br />
DoSomething(MyComponent.SomeObject);<br />
end;<br />
</pascal><br />
|<pascal><br />
Unit 1<br />
Type <br />
TSomeObject=class(TComponent)<br />
//Ďalší kód...<br />
End;<br />
<br />
Procedure DoSomething(Value: TSomeObject);<br />
Function GetSomeObject: TSomeObject;<br />
<br />
Unit 2<br />
Type<br />
TSomeComponent=class(TComponent)<br />
//Ďalší kód...<br />
Published SomeObject: Pointer;<br />
//Ďalší kód...<br />
End;<br />
<br />
Application<br />
var <br />
MyComponent: TSomeComponent;<br />
begin<br />
MyComponent.SomeObject:=Pointer(GetSomeObject);<br />
//Ďalší kód...<br />
DoSomething(TSomeObject(MyComponent.SomeObject));<br />
end;<br />
</pascal><br />
|}<br />
<br />
==== Resources ====<br />
<br />
Súbory zdrojov Delphi sú špecifické pre win32 a nie sú kompatibilné s Lazarus, tzakž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ť:<br />
cd lazarus/tools<br />
make install<br />
Pre pridanie resource do svojej aplikácie spusťte:<br />
lazres myresource.lrs mypix.xpm anotherpix.xpm<br />
A potom<br />
* pridajte jednotku '''LResources''' do sekcie '''Uses'''<br />
* zahrňte vami vytvorený súbor .lrs do bloku ''initialization''<br />
<br />
;Príklad:<br />
<pascal><br />
function TForm1.LoadGlyph(const GlyphName: String): TBitMap;<br />
begin<br />
Result:= TPixmap.Create;<br />
Result.LoadFromLazarusResource(GlyphName);<br />
end;<br />
//Ďalší kód...<br />
begin<br />
Speedbutton1.glyph:= LoadGlyph('mypix');<br />
//Ďalší kód...<br />
end<br />
<br />
initialization<br />
{$I unit1.lrs}<br />
{$I myresource.lrs}<br />
end.<br />
</pascal><br />
<br />
=== Iná metóda konverzie projketu Delphi/Kylix do Lazarus ===<br />
<br />
* 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)<br />
* premeujte súbor .dpr na '''.lpr'''<br />
* urobte potrebné zmeny súboru '''.lpr''':<br />
# pridajte direktívy '''{$mode delphi}{$H+}''' alebo '''{$mode objfpc}{H+}'''<br />
# pridajte jednotku '''Interfaces''' do sekcie uses<br />
# zakomentujte alebo zmažte direktívu {$R *.res} <br />
* urobte potrebné zmeny vo všetkých súboroch jednotiek '''.pas''':<br />
# pridajte direktívu '''{$mode delphi}{$H+}''' alebo '''{$mode objfpc}{H+}'''<br />
# pridajte '''LResources''' a, ak má formulár tlačítka, aj '''Buttons''' do sekcie uses<br />
# zakomentujte alebo zmažte direktívu {$R *.dfm} alebo {$R *.xfm}<br />
# pridajte sekciu '''Initialization''' nakoniec každého súboru jednotky a pridajte do nej direktívu '''{$I unitname.lrs}'''<br />
* vyberte '''Project->New Project from file'''<br />
* zvoľte súbor '''.lpr'''<br />
* v okne 'Create a new project' zvoľte 'Application'<br />
* vybudujte projekt a zaistite ďalšie potrebné opravy, v tomto okamžiku je automaticky vygenerovaný súbor .lpi.<br />
**Môžete sa stretnúť so správou 'Error reading Form', ak to nastane kliknite na 'Continue Loading'<br />
* všetko uložte a máte projekt Lazarus :-)<br />
<br />
== Získanie nápovedy ==<br />
<br />
Ak sa počas konverzie stretnete sproblémom, ktorý neviete vyriešiť, sú široké možnosti ako získať pomoc:<br />
<br />
=== Documentation ===<br />
<br />
* 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.<br />
* Pre problémy viac orientované na Lazarus, hľadajte aj v [[Main Page|Dokumentácii projektu Lazarus]].<br />
<br />
=== Partnerská podpora ===<br />
<br />
* 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.<br />
* IRC - na irc.freenode.net: [irc://irc.freenode.net/fpc #fpc] rpe FPC alebo [irc://irc.freenode.net/lazarus-ide #lazarus-ide] pre Lazarus<br />
<br />
=== Vedomostné bázy ===<br />
<br />
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:<br />
* Tamarack Associates poskytuej rýchly [http://www.tamaracka.com/search.htm vyhľadávací] stroj špecifické pre archívy Borland usenet.<br />
* Mer Systems Inc. poskytuje podobný vyhľadávací [http://www.mers.com/searchsite.html stroj].<br />
* Ď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].<br />
<br />
== Packaging and Releasing your component ==<br />
<br />
=== Creating a Lazarus package for your component(s) ===<br />
<br />
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.<br />
<br />
=== Documentation ===<br />
<br />
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.<br />
<br />
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.<br />
<br />
=== Creating a Code Release Page ===<br />
<br />
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.<br />
<br />
The following procedure will let you create a Code Release Page with your browser: <br />
<br />
* Go to the [[Release new component]]<br />
* Type the name of your component in the textbox and click on ''Create Article''<br />
* Edit the template accordingly and hit save.<br />
* Edit the [[Components and Code examples]] page and add the link to your newly created page to the "Released Components" section. Save the modified page.<br />
<br />
=== Submitting the component ===<br />
<br />
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 ([[User:Tom |Tom Lisjac]] or [[User:Vincent |Vincent Snijders]]) and we'll add it to the repository. Before we upload it to SourceForge, you have to create a ''Code Release Page'' to describe your component. You can use the [[Release new component]] page, to start creating such a page.<br />
<br />
If you think you need to continue to develop on the component, we can also put it into SVN so you'll continue to have access to it. If we get tired from submitting your patches, we will give you write access to the SVN, so you can commit your patches yourself. For details see [[Using the Lazarus-ccr SVN repository]].<br />
<br />
== Contributors and Changes ==<br />
<br />
This page has been converted from the epikwiki [http://lazarus-ccr.sourceforge.net/index.php?wiki=CodeConversionGuide version].<br />
* Initial version by Tom Lisjac and Mattias Gärtner - 9/22/2003 [[User:Tom | VlxAdmin]]<br />
* Moved Getting help from the main page. T. Lisjac - 9/24/2003 [[User:Tom | VlxAdmin]]<br />
* Added documentation templates, procedure and links. 9/25/2003 [[User:Tom | VlxAdmin]]<br />
* LCLLinux was renamed to LCLIntf, [[User:Jesusrmx | Jesus Reyes]], 9/27/2003<br />
* added more information on Unit changes, [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson AndrewJohnson] 9/27/2003<br />
* Updated Syntax differences, including some examples, [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson AndrewJohnson] 9/27/2003<br />
* FPC 1.0.x doesn't support interfaces, [[User:Vincent | Vincent Snijders]] 9/28/2003<br />
* Fixed some of the examples per new WikiWord definition, 9/28/2003 [[User:Tom | VlxAdmin]]<br />
* Made code more consistant to remove last accidental Pascal WikiWord definitions, [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson AndrewJohnson] 9/27/2003<br />
* Use tables for code examples for nice blocks, and easy side by side view of Delphi->FPC differences, [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson AndrewJohnson] 10/17/2003<br />
* Use pascal stylesheet to make example code more readable, [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson AndrewJohnson] 10/18/2003</div>Slavkohttps://wiki.freepascal.org/index.php?title=Code_Conversion_Guide/sk&diff=26030Code Conversion Guide/sk2008-01-02T15:21:39Z<p>Slavko: preklep</p>
<hr />
<div>{{Code Conversion Guide}}<br />
<br />
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.<br />
<br />
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. <br />
<br />
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.<br />
<br />
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. <br />
<br />
==Výber komponentov alebo knižnice pre konverziu==<br />
<br />
===Kde hľadať kód na konverziu===<br />
<br />
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].<br />
<br />
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].<br />
<br />
===Licencovanie===<br />
<br />
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.<br />
<br />
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.<br />
<br />
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".<br />
<br />
===Závislosti ===<br />
<br />
Ď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.<br />
<br />
===Poznámky k prekladaču===<br />
<br />
Viz:<br />
* [http://www.freepascal.org/probs.html Známe problémy]<br />
* [http://www.freepascal.org/bugs/db.php3?statusfield=Unfixed Neopravené chyby]<br />
<br />
===Poznámky k platforme a OS===<br />
<br />
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!<br />
<br />
==Konverzia ==<br />
<br />
===Nastavenie IDE Lazarus pre konverziu projektu===<br />
<br />
====Vytvorenie skúšobného projektu====<br />
* Umiestnite konvertovaný kód do podadresára (napr: convertdir)<br />
* Spusťte Lazarus<br />
* '''File->Save All''' do adresára convertdir. Zmysluplné mená pre Project a predvolenú jednotku sú voliteľné.<br />
* Otvorte "základnú" konvertovanú jednotku v convertdir<br />
* Pridajte ju do projektu: '''Project->Add Active Unit to Project'''<br />
* Spusťte '''Tools->Quick Syntax Check''' alebo '''Run->Build All''', čím začnete.<br />
<br />
====Na čo treba dať pozor====<br />
* 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'''.<br />
====Zdrojové kódy Delphi VCL a Kylix CLX v Lazarus====<br />
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'''.<br />
<br />
===Problémy konverzie a ich riešenie ===<br />
<br />
==== Ekvivalenty Delphi/Kylix súborov v Lazarus ====<br />
<br />
{|border="1" width="800" <br />
! Delphi / Kylix !! Popis !! Lazarus !! Popis<br />
|- <br />
|valign="top"| .pas<br />
<br />
.dfm/.xfm,<br />
<br />
.dcu/.dpu,<br />
<br />
.dpr(main project file),<br />
<br />
.res,<br />
<br />
.dof/.kof<br />
<br />
---<br />
<br />
---<br />
<br />
---<br />
<br />
|valign="top"| súbor zdrojového kódu Delphi,<br />
<br />
formulár Delphi,<br />
<br />
preložená jednotka Delphi,<br />
<br />
projekt Delphi,<br />
<br />
Resource súbor Windows,<br />
<br />
súbor volieb Delphi<br />
<br />
|valign="top"| .pas, .pp<br />
.lfm,<br />
<br />
.o,<br />
<br />
.lpr<br />
<br />
---<br />
<br />
---<br />
<br />
.lrs,<br />
<br />
.lpi(hlavný súbor projketu),<br />
<br />
.ppu<br />
<br />
|valign="top"| súbor jednotky Pascal,<br />
<br />
dátový súbor formulára,<br />
<br />
súbor preloženej jednotky,<br />
<br />
súbor projektu,<br />
<br />
Resource súbor,<br />
<br />
súbor volieb projektu,<br />
<br />
Resource súbor Lazarus,<br />
<br />
informačný súbor projektu Lazarus,<br />
<br />
popisný súbor jednotky FPC<br />
|}<br />
<br />
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.<br />
<br />
====Konverzia projektov/formulárov/jednotiek Delphi do Lazarus====<br />
<br />
Premenujte alebo prekopírujte súbor .dpr na súbor .lpr. Zakomentujte alebo odstráňte direktívu <br />
{$R *.res}<br />
a pridajte direktívu<br />
{$mode delphi}{$H+}<br />
alebo<br />
{$mode objfpc}{$H+}<br />
do súboru .lpr. <br />
<br />
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.<br />
<br />
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.<br />
<br />
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:<br />
<br />
# upraví veľkosť písmen v sekciách uses a iclude.<br />
# konvertuje súbory .dfm na súbory .lfm (bez kontroly obsahu, len formát)<br />
# vytvorí prázdny súbor .lrs (obsah bude pridaný neskôr)<br />
# pridá direktívu<br />
{$mode delphi}<br />
# nahradí jednotku Windows jednotkou LCLIntf<br />
# ak je to potrebné, pridá jednotku LResources<br />
# odoberie jednotku Variants<br />
# odoberie direktívu<br />
{$R *.dfm}<br />
# pridá do sekcie initialization direktívu <br />
{$i unit.lrs}<br />
<br />
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).<br />
<br />
====Výber správneho módu prekladača====<br />
<br />
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:<br />
<br />
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í.<br />
<br />
Väčšinu jednotiek Delphi môžete jednoducho preložiť pomocou [[Free Pascal]] pridaním tejto konštrukcie, hneď za meno jednotky<br />
{$IFDEF FPC}<br />
{$MODE DELPHI}<br />
{$ENDIF}<br />
<br />
Ď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].<br />
<br />
====Viac-platformové poznámky====<br />
* 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.<br />
* Neodkazujte na špecifické pamäťové miesto, ako dátová oblasť BIOS. Zistite čo kód potrebuje a skúste nájsť cezplatformovú alternatívu.<br />
* 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é.<br />
* Ak potrebujete nejaký kód, špecifický pre OS, používajte '''IFDEF'''. Viz zoznam makier neskôr.<br />
<br />
====Užitočné premenné prekladača====<br />
<br />
Pre písanie kódu, ktorý sa má správať na rôznych systémoch rôzne, môžete použiť direktívy<br />
{$IFDEF Name}<br />
Pričom Name môže byť<br />
*'''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.<br />
{$IfDef LCL}<br />
*'''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.<br />
{$IfDef FPC}<br />
*'''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.<br />
{$IfDef LCLGtk}<br />
{$IfDef LCLWin32}<br />
{$IfDef LCLQt}<br />
... <br />
*'''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ží.<br />
{$IfDef Unix}<br />
{$IfDef Win32}<br />
...<br />
: Pre prácu v Kylix použite nasledujúcu konštrukciu:<br />
{$IfDef Linux}<br />
{$Define Unix}<br />
{$EndIf}<br />
*'''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.<br />
{$IfDef ENDIAN_BIG}<br />
<br />
Ďalšie podrobnosti nájdete v [http://www.freepascal.org/docs-html/prog/prog.html#QQ2-23-21 dokumentácii Free Pascal].<br />
<br />
==== Podpora 32bit/64bit ====<br />
<br />
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:<br />
*'''PtrInt''' je 32bit Integer so znamienkom na 32bit platformách a 64bit Integer sp znamienkom na 64bit platformách.<br />
*'''PtrUInt''', je rovnaké ako predchádzajúce s tým rozdielom, že sa jedná o Integer bez znamienka.<br />
<br />
Pre kód, ktorý má pracovať s Delphi a FPC použite:<br />
{$IFNDEF FPC}<br />
type<br />
PtrInt = integer;<br />
PtrUInt = cardinal;<br />
{$ENDIF}<br />
<br />
Nahrďte všetky<br />
integer(SomePointerOrObject)<br />
týmto<br />
PtrInt(SomePointerOrObject)<br />
<br />
====Hľadanie chýbajúcich identifikátorov====<br />
<br />
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.<br />
<br />
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):<br />
<br />
grep -in ' tbutton =' lcl/*<br />
<br />
====Rozdiely v dôležitých jednotkách Lazarus a Delphi ====<br />
<br />
;Prosím dopĺňajte túto časť!;<br />
<br />
* Windows -> LCLIntf, LCLType, LCLProc, VCLGlobals, ...<br />
<br />
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ď).<br />
<br />
Jednotka '''Interfaces''' musí byť zahrnutá v súbore .lpr file pre správnu inicializáciu príslušného WidgetSet.<br />
<br />
* Messages->LMessages<br />
<br />
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'''.<br />
<br />
* Graphics, Controls->GraphTypes, GraphMath, Graphics, Controls<br />
<br />
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.<br />
<br />
Point1 := Point2 + Point3<br />
<br />
či porovnanie dvoch pravouholníkov ako<br />
<br />
if (rect1 = rect2) then ...<br />
<br />
* Mask->MaskEdit<br />
<br />
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.<br />
<br />
* StdCtrls->StdCtrls,Buttons<br />
<br />
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úť.<br />
<br />
====Rozdiely vo vlastnostiach a metódach Delphi -> FPC/LCL ====<br />
* v LCL je Canvas obsahnutý v TBitmap<br />
====Sémantické rozdiely ====<br />
<br />
===== Poradie vyhodnocovania parametrov =====<br />
<br />
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.<br />
<br />
===== Vnorené procedúry/funkcie sú procedurálne premenné =====<br />
<br />
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 premnnú.<br />
<br />
FPC vždy posiela framepointer rodičovskej procedúry ako skrytý prvý parameter, podľa aktuálnej konvecie vlanie, čo znamená, že ak voláte vnorenú procedúru ako bežnú procedirálnu premnnú, vštky parametre budú posunuté o jednu pozíciu.<br />
<br />
Inými slovami, nevolajte vnorené procedúry pomocou procedurálnych premenných.<br />
<br />
==== Syntaktické rozdiely ====<br />
<br />
;Prosím dopĺňajte túto kapitolu!<br />
<br />
Kvôli zdedenej prísnosti FPC, budú potrebné niektoré syntaktické zmeny, napriek direktíve<br />
{$Mode Delphi}<br />
pracuje oveľa pomalšie ako Delphi. Kvôli tomu oveľa viac vyhovujú pravidlá syntaxe<br />
{$Mode ObjFPC}<br />
ak je to možné, vrelo doporučujem, dokonca i keď bude kód zdieľaný medzi Delphi a LCL.<br />
<br />
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:<br />
<br />
=====Pri priraďovaní vstupného bodu obsluhy udalosti, pridajte predponu "@"=====<br />
<br />
Napríklad, môžete manuálne priradiť udalosť tlačítka<br />
{| border="1" width="800"<br />
! Delphi !! OBJFPC<br />
|-<br />
|<pascal><br />
begin<br />
if not Assigned(MyButton.OnClick) then <br />
MyButton.OnClick:= SomeFunction;<br />
//@ nie je vyžadované<br />
//ďalší kód...<br />
end;<br />
</pascal><br />
|<pascal><br />
begin<br />
if not Assigned(MyButton.OnClick) then<br />
MyButton.OnClick:= @SomeFunction;<br />
//@ je vyžadované<br />
//ďalší kód...<br />
end;<br />
</pascal><br />
|}<br />
<br />
=====Pri volaní procedurálnej premennej používajte túto syntax: theprocname()=====<br />
<br />
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<br />
{| border="1" width="800"<br />
! Delphi !! OBJFPC<br />
|-<br />
|<pascal><br />
With (SomeObject) do <br />
begin<br />
If Assigned(OnMyCallback) then<br />
OnMyCallback;<br />
//zátvorky nie sú vyžadované<br />
end;<br />
</pascal><br />
|<pascal><br />
With (SomeObject) do <br />
begin<br />
If Assigned(OnMyCallback) then<br />
OnMyCallback();<br />
//zátvorky sú vyžadované<br />
end;<br />
</pascal><br />
|}<br />
<br />
===== Pri pristupovaní k hodnotám v ukazovateli na záznam ho musíte najprv dereferencovať =====<br />
<br />
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. <br />
<br />
V FPC musí byť najprv dereferencovaný, napríklad:<br />
{| border="1" width="800"<br />
! Delphi !! OBJFPC<br />
|-<br />
|<pascal><br />
Function GetSomeValue(ARecord: PMyRecord):Integer;<br />
begin<br />
If Assigned(ARecord) then<br />
Result:=ARecord.SomeValue<br />
else<br />
Result:=0;<br />
end;<br />
</pascal><br />
|<pascal><br />
Function GetSomeValue(ARecord: PMyRecord):Integer;<br />
begin<br />
If Assigned(ARecord) then<br />
Result:=ARecord^.SomeValue<br />
else<br />
Result:=0;<br />
end;<br />
</pascal><br />
|}<br />
<br />
=====Pri pristupovaní znakov indexovaného reťazca Vlastnosti objektu, musí byť najprv uzatvorený v zátvorkách =====<br />
<br />
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.<br />
<br />
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<br />
{| border="1" width="800"<br />
! Delphi !! OBJFPC<br />
|-<br />
|<pascal><br />
Type TSomeComponent=class(TComponent)<br />
//Ďalší kód...<br />
Published<br />
Property MyString:String index 3 read GetMyString;<br />
//Ďalší kód...<br />
End;<br />
<br />
var<br />
MyChar:char;<br />
begin<br />
If Length(MyString)>2 then<br />
//nie sú potrebné zátvorky<br />
MyChar:= MyString[3];<br />
//Ďalší kód...<br />
end;<br />
</pascal><br />
|<pascal><br />
Type TSomeComponent=class(TComponent)<br />
//Ďalší kód...<br />
Published<br />
Property MyString:String index 3 read GetMyString;<br />
//Ďalší kód...<br />
End;<br />
<br />
var<br />
MyChar:char;<br />
begin<br />
If Length(MyString)>2 then<br />
//niekedy sú potrebné zátvorky<br />
MyChar:= (MyString)[3];<br />
//Ďalší kód...<br />
end;<br />
</pascal><br />
|}<br />
<br />
=====Pri použití ukazovateľov s premennými alebo funkciami, musíte ich najprv pretypovať na príslušný typ =====<br />
<br />
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. <br />
<br />
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<br />
<br />
{| border="1" width="800"<br />
! Delphi !! OBJFPC<br />
|-<br />
|<pascal><br />
Unit 1<br />
Type <br />
TSomeObject=class(TComponent)<br />
//Ďalší kód...<br />
End;<br />
<br />
Procedure DoSomething(Value: TSomeObject);<br />
Function GetSomeObject: TSomeObject;<br />
<br />
Unit 2<br />
Type <br />
TSomeComponent=class(TComponent)<br />
//Ďalší kód...<br />
Published SomeObject: Pointer;<br />
//Ďalší kód...<br />
End;<br />
<br />
Application<br />
var <br />
MyComponent: TSomeComponent;<br />
begin<br />
MyComponent.SomeObject:=GetSomeObject;<br />
//Ďalší kód...<br />
DoSomething(MyComponent.SomeObject);<br />
end;<br />
</pascal><br />
|<pascal><br />
Unit 1<br />
Type <br />
TSomeObject=class(TComponent)<br />
//Ďalší kód...<br />
End;<br />
<br />
Procedure DoSomething(Value: TSomeObject);<br />
Function GetSomeObject: TSomeObject;<br />
<br />
Unit 2<br />
Type<br />
TSomeComponent=class(TComponent)<br />
//Ďalší kód...<br />
Published SomeObject: Pointer;<br />
//Ďalší kód...<br />
End;<br />
<br />
Application<br />
var <br />
MyComponent: TSomeComponent;<br />
begin<br />
MyComponent.SomeObject:=Pointer(GetSomeObject);<br />
//Ďalší kód...<br />
DoSomething(TSomeObject(MyComponent.SomeObject));<br />
end;<br />
</pascal><br />
|}<br />
<br />
==== Resources ====<br />
<br />
Súbory zdrojov Delphi sú špecifické pre win32 a nie sú kompatibilné s Lazarus, tzakž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ť:<br />
cd lazarus/tools<br />
make install<br />
Pre pridanie resource do svojej aplikácie spusťte:<br />
lazres myresource.lrs mypix.xpm anotherpix.xpm<br />
A potom<br />
* pridajte jednotku '''LResources''' do sekcie '''Uses'''<br />
* zahrňte vami vytvorený súbor .lrs do bloku ''initialization''<br />
<br />
;Príklad:<br />
<pascal><br />
function TForm1.LoadGlyph(const GlyphName: String): TBitMap;<br />
begin<br />
Result:= TPixmap.Create;<br />
Result.LoadFromLazarusResource(GlyphName);<br />
end;<br />
//Ďalší kód...<br />
begin<br />
Speedbutton1.glyph:= LoadGlyph('mypix');<br />
//Ďalší kód...<br />
end<br />
<br />
initialization<br />
{$I unit1.lrs}<br />
{$I myresource.lrs}<br />
end.<br />
</pascal><br />
<br />
== Získanie nápovedy ==<br />
<br />
Ak sa počas konverzie stretnete sproblémom, ktorý neviete vyriešiť, sú široké možnosti ako získať pomoc:<br />
* 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ël Van Canneyt a Florian Klämpfl.<br />
* Pre problémy viac orientované na Lazarus, hľadajte aj v [Main Page | Dokumentácii projektu Lazarus].<br />
* Nakoniec môžete poslať otázku do [http://www.freepascal.org/maillist.html maillistov FPC] alebo [http://community.freepascal.org:10000/bboard/ FPC forums], kde je prihlásených veľa expertov.<br />
<br />
Môžete tiež skúsiť nevybavené hľadanie a online vedomostnú bázu, ktoré môže tiež významne pomôcť s učením sa nových techník a riešenia problémov. Tamarack Associates uácza rýchly [http://www.tamaracka.com/search.htm vyhľadávač] so zameraním na archívy Borland usenet. Mer Systems Inc. poskytuje podobný [http://www.mers.com/searchsite.html vyhľadávač]. Iné zdroje informácií spolu s [http://www.efg2.com/Lab/search.htm vyhľadávacou] schopnosťou sú v [http://www.efg2.com/ Earl F. Glynn's Computer Lab and Reference Library].<br />
<br />
== Packaging and Releasing your component ==<br />
<br />
=== Creating a Lazarus package for your component(s) ===<br />
<br />
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.<br />
<br />
=== Documentation ===<br />
<br />
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.<br />
<br />
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.<br />
<br />
=== Creating a Code Release Page ===<br />
<br />
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.<br />
<br />
The following procedure will let you create a Code Release Page with your browser: <br />
<br />
* Go to the [[Release new component]]<br />
* Type the name of your component in the textbox and click on ''Create Article''<br />
* Edit the template accordingly and hit save.<br />
* Edit the [[Components and Code examples]] page and add the link to your newly created page to the "Released Components" section. Save the modified page.<br />
<br />
=== Submitting the component ===<br />
<br />
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 ([[User:Tom |Tom Lisjac]] or [[User:Vincent |Vincent Snijders]]) and we'll add it to the repository. Before we upload it to SourceForge, you have to create a ''Code Release Page'' to describe your component. You can use the [[Release new component]] page, to start creating such a page.<br />
<br />
If you think you need to continue to develop on the component, we can also put it into SVN so you'll continue to have access to it. If we get tired from submitting your patches, we will give you write access to the SVN, so you can commit your patches yourself. For details see [[Using the Lazarus-ccr SVN repository]].<br />
<br />
== Contributors and Changes ==<br />
<br />
This page has been converted from the epikwiki [http://lazarus-ccr.sourceforge.net/index.php?wiki=CodeConversionGuide version].<br />
* Initial version by Tom Lisjac and Mattias Gärtner - 9/22/2003 [[User:Tom | VlxAdmin]]<br />
* Moved Getting help from the main page. T. Lisjac - 9/24/2003 [[User:Tom | VlxAdmin]]<br />
* Added documentation templates, procedure and links. 9/25/2003 [[User:Tom | VlxAdmin]]<br />
* LCLLinux was renamed to LCLIntf, [[User:Jesusrmx | Jesus Reyes]], 9/27/2003<br />
* added more information on Unit changes, [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson AndrewJohnson] 9/27/2003<br />
* Updated Syntax differences, including some examples, [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson AndrewJohnson] 9/27/2003<br />
* FPC 1.0.x doesn't support interfaces, [[User:Vincent | Vincent Snijders]] 9/28/2003<br />
* Fixed some of the examples per new WikiWord definition, 9/28/2003 [[User:Tom | VlxAdmin]]<br />
* Made code more consistant to remove last accidental Pascal WikiWord definitions, [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson AndrewJohnson] 9/27/2003<br />
* Use tables for code examples for nice blocks, and easy side by side view of Delphi->FPC differences, [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson AndrewJohnson] 10/17/2003<br />
* Use pascal stylesheet to make example code more readable, [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson AndrewJohnson] 10/18/2003</div>Slavko