Sign in Join
Wiki copytemporary

Lazarus IDE Tools/nl: what changed

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

OldNewLine
11## Overzicht
22
33De IDE gebruikt een verzameling tools voor het "parsen" (uit elkaar pluizen) van de source code en bewerken van tekst, de zogenaamde "codetools". Deze tools bieden functionaliteiten als het vinden van een declaratie, code completion en allerlei andere code bewerkingsfuncties. Deze tools kunnen je een hoop tijd en dubbel werk besparen. Je kunt ze helemaal naar eigen inzicht inrichten en iedere functies is bereikbaar via een "short cut" (Zie de Editor Options!).
44
55De tools werken alleen met source code en begrijpen de verschillende Pascal varianten (FPC, Delphi en Kylix) dus zijn gecompileerde units of een compiler niet nodig. Je kunt tegelijkertijd Delphi en FPC code bewerken en zelfs met verschillende Delphi en FPC versies tegelijkertijd. Hierdoor wordt het overzetten van Delphi code naar Lazarus nog makkelijker.
66
77## Ovezicht van IDE shortcuts
88
99| | |
1010|----|----|
1111| Method Jumping | Ctrl+Shift+Up (Schakelt tussen de definitie en the implementatie van een method) |
1212| Code Templates | Ctrl+J |
1313| Code Completion (Class Completion)   | Ctrl+Shift+C |
1414| Identifier Completion | Ctrl+Space |
1515
1616## Method Jumping
1717
1818Om te springen van de definitie van een procedure (of function) naar de implementatie hiervan kun je Ctrl+Shift+Up gebruiken.
1919
2020Bijvoorbeeld:
2121
2222`interface`\
23-\
23+
2424`procedure DoSomething; // procedure definition`\
2525` `\
2626`implementation`\
2727` `\
2828`procedure DoSomething; // procedure body `\
2929`begin`\
3030`end;`
3131
3232Als de cursor ergens in de procedure "body" staat en je geeft Ctrl+Shift+Up, dan zal de cursor naar de definitie van de procedure springen. Druk je nogmaals op Ctrl+Shift+Up dan gaat de cursor weer naar de implementatie van de procedure net achter de eerste 'begin'.
3333
3434Dit werkt natuurlijk ook bij methods (procedures van een classe).
3535
3636Hint: 'Method Jumping' springt naar de procedure met dezelfde naam en parameter lijst. Als er echter geen procedure gevonden kan worden die precies gelijk is, wordt er gesprongen naar een procedure die het meest overeenkomt, de cursor wordt dan geplaatst op het punt waar de eerste afwijking is gevonden, in Delphi gebeurt dit helaas niet. Dit kan handig zijn bij het wijzigen van de parameterlijst.
3737
3838Bijvoorbeeld een procedure met een andere parameterlijst:
3939
4040`interface`\
41-\
41+
4242`procedure DoSomething(p: char); // procedure definition`\
43-\
43+
4444`implementation`\
4545`  `\
4646`procedure DoSomething(p: string); // procedure body`\
4747`begin`\
4848`end;`
4949
5050Hier zal de cursor dus geplaatst worden voor 'string' als er gebruik gemaakt wordt van Method Jumping. Ook het wijzigen van een procedure naam is hiermee eenvoudiger:
5151
5252Bijvoorbeeld:\
5353Je hebt de procedure 'DoSomething' hernoemd naar 'MakeIt':
5454
5555`interface`\
56-\
56+
5757`procedure MakeIt; // procedure definition`\
58-\
58+
5959`implementation`\
60-\
60+
6161`procedure DoSomething; // procedure body`\
6262`begin`\
6363`end;`
6464
6565Als je dan op ctrl+shift+C drukt, zal de IDE beginnen met zoeken naar de juiste body. Omdat het die niet exact kan vinden zal het gaan zoeken naar een andere geschikte kandidaat. Omdat je maar een procudure wijzigde zal de oude DoSomething procedure de enige zijn zonder een definitie en zal de IDE hiernaar toe springen en de cursor plaatsen voor 'DoSomething'.
6666
6767## Include Files
6868
6969Met behulp van de {\$I bestandsnaam} directive kunnen bestanden als onderdeel van de source worden opgenomen. Lazarus en FPC maken erg veel gebruik van deze zogenaamde "Include files", omdat ze de code leesbaarder houden en de code redundancy verminderen. De leesbaarheid wordt verhoogt doordat er geen onoverzichtelijke {\$IFDEF} constructies gebruikt hoeven worden voor de ondersteuning van meerdere platforms.
7070
7171De Lazarus IDE kent een goede ondersteuning van het gebruik van include files. Als bijvoorbeeld de implementatie van een Unit in een inlcude file is opgenomen, zal het springen van de definitie naar de implementatie ook dan goed gaan en de IDE zal dus de include file openen en daar de implementatie van de procedure vinden!
7272
7373Ook code completion houdt hier rekening mee. Als de implementatie van een classe in een Include file is geplaatst zal het toevoegen van een method in de definitie, de automatisch implementatie (ctrl+shift+C) ook in de include file plaatsen. Je kunt dus de volledige implementatie van ee class in een include file doen. (Dit is in Lazarus eigenlijk altijd zo gedaan.)
7474
7575Pas op! Als wel de include file is geopend met de implementatie van een classe zal Method Jumping of Find Decleration niet de unit openen waarin de include file is opgenomen. Dus altijd eerst de unit zelf openen en pas dan de include file met de implementatie.
7676
7777De IDE analyseert de code en controleert daarbij de include directives. Voor later gebruik wordt de informatie over de relaties tussen units en include files opgeslagen in een bestand (includelinks.xml). Als je dan een volgende keer de include file opent zal de IDE bij een Find Declaration of een Method Jump weten welke unit geopend moet worden.
7878
7979## Code Templates
8080
8181"Code templates" zijn stukjes tekst die met een bepaalde toets-combinatie worden omgezet naar een stuk code.
8282
8383De standaard toets-combinatie voor Code Templates is Ctrl+J. De stukjes tekst (templates) definieer je via Environment -\> Editor Options -\> CodeTools. Voor het gebruik ervan tik je dan de tekst gevolgd door ctrl+J.
8484
8585Bijvoorbeeld: Als je 'classf' intikt, de cursor achter de f laat staan en dan op Ctrl+J drukt, zal 'classf' worden vervangen door
8686
8787`T = class(T)`\
8888`private`\
89-\
89+
9090`public`\
9191`  constructor Create;`\
9292`  destructor Destroy; override;`\
9393`end;`
9494
9595waarbij de cursor achter de eerste T staat.
9696
9797Je kunt ook in de IDE een lijst met templates op vragen door de cursor op een lege plek te plaatsen en dan op ctrl+J te drukken. Er zal dan een popup veschijnen met een lijst van de beschikbare templates. Door het gebruik van de pijltjes-toetsen of door het intikken van een aantal letters kun je een keuze maken. Deze keuze bevestig je dan met Enter waarbij de gekozen template wordt uitgevoerd. Zoals gewoonlijk kun je met ESC de popup sluiten, zonder dat er een template wordt uitgevoerd.
9898
9999## Code Completion
100100
101101Code Completion kan via het menu (Edit -\> Complete Code) of via de short cut Ctrl+Shift+C opgeroepen woden.
102102
103103Verschil met Delphi: De functionaliteit die in Delphi "Code Completion" heet, is in Lazarus opgenomen als "Identifier completion". Deze functie wordt in beide omgevingen opgeroepen met Ctrl+Spatie.
104104
105105Code completion kent een aantal varianten:
106106
107107- **Class Completion**: completes properties, adds method bodies, add private variables and private access methods
108108- **Forward Procedure Completion**: adds procedure bodies
109109- **Event Assignment Completion**: completes event assignments and adds method definition and body
110110- **Local Variable Completion**: adds local variable definitions
111111
112112Welke variant wordt opgeroepen is afhankelijk van de cursor positie in de Editor.
113113
114114### Class Completion
115115
116116Class completion is de meest veelzijdige functie. Je schrijft een class en voegt de methodes en properties toe en Code Completion zal de methode implementaties, de methodes voor het lezen en schrijven van de properties en de bijbehorende private vrariabelen voor je toevoegen.
117117
118118Bijvoorbeeld. Definieer een class (Gebruik de code templates om je wat tikwerk te besparen):
119119
120120`TExample = class(TObject)`\
121121`public`\
122122`  constructor Create;`\
123123`  destructor Destroy; override;`\
124124`end;`
125125
126126Zet daarna de cursor ergens in deze tekst en druk op Ctrl+Shift+C. Het gevolg zal zijn dat in de implementatie sectie van je unit de volgende tekst is verschenen, zodat je gelijk verder kunt met het schrijven van de Create method::
127127
128128`{ TExample }`\
129-\
129+
130130`constructor TExample.Create;`\
131131`begin`\
132132`  |`\
133133`end;`\
134-\
134+
135135`destructor TExample.Destroy;`\
136136`begin`\
137137`  inherited Destroy;`\
138138`end;`
139139
140140Let op: De '\|' geeft hier de plaats van de cursor aan!
141141
142142Hint: Zoals we gezien hebben kunnen je met Ctrl+Shift+Up heen en weer schakelen tussen de definitie en de implementatie.
143143
144-Zoals je ziet heeft de IDE ook een aanroep naar 'inherited Destroy' toegevoegd. Dit gebeurt als een methode met <b>override</b> is gedefinieerd in de ancestor (de class waar jouw class van is afgeleid).
144+Zoals je ziet heeft de IDE ook een aanroep naar 'inherited Destroy' toegevoegd. Dit gebeurt als een methode met override is gedefinieerd in de ancestor (de class waar jouw class van is afgeleid).
145145
146146Voeg nu de method DoSomething toe aan de class definitie:
147147
148148`TExample = class(TObject)`\
149149`public`\
150150`  constructor Create;`\
151151`  procedure DoSomething(i: integer);`\
152152`  destructor Destroy; override;`\
153153`end;`
154154
155155en druk op Ctrl+Shift+C. De IDE zal het volgende toevoegen
156156
157157`procedure TExample.DoSomething(i: integer);`\
158158`begin`\
159159`  |`\
160160`end;`
161161
162162Afhankelijk van de door jouw ingestelde voorkeur wordt deze methode toegevoegd tussen Create and Destroy zoals in de class definitie of op alfabetische volgorde. Deze voorkeur kun je instellen in Environment \> Codetools Options -\> Code Creation.
163163
164164**Complete Properties**\
165165Voeg een property toe aan de class:
166166
167167`TExample = class(TObject)`\
168168`public`\
169169`  constructor Create;`\
170170`  procedure DoSomething(i: integer);`\
171171`  destructor Destroy; override;`\
172172`  property AnInteger: Integer;`\
173173`end;`
174174
175175Druk op Ctrl+Shift+C en het volgende wordt in de implementatie sectie toegevoegd:
176176
177177`procedure TExample.SetAnInteger(const AValue: integer);`\
178178`begin`\
179179`  |if FAnInteger=AValue then exit;`\
180180`  FAnInteger:=AValue;`\
181181`end;`
182182
183183Code completion heeft een Schrijf methode toegevoegd en daarin wat algemene code gezet. Maar dat is niet het enige! Druk op Ctrl+Shift+Up om terug te keren naar de class definitie en zie wat daar is gewijzigd:
184184
185185`TExample = class(TObject)`\
186186`private`\
187187`  FAnInteger: integer;`\
188188`  procedure SetAnInteger(const AValue: integer);`\
189189`public`\
190190`  constructor Create;`\
191191`  procedure DoSomething(i: integer);`\
192192`  destructor Destroy; override;`\
193193`  property AnInteger: integer read FAnInteger write SetAnInteger;`\
194194`end;`
195195
196196Het toegevoegde property is uitgebreid door aan te geven welke private variabele door dit property gelezen wordt en zoals gezegd de schrijf methode voor die variabele. We zien ook de nieuwe private sectie waarin deze variabele en de bijbehorende schrijfmethode (ook wel 'setter' genoemd) zijn opgenomen. Het is algemeen gebruikelijk om de naam van private variabelen vooraf te laten gaan door een 'F' en de schrijfmethode (setter) te laten beginnen met 'Set'. Mocht je dat anders willen dan kun je dit wijzigen in Environment \> Codetools Options -\> Code Creation.
197197
198198Je kunt ook een "read only" property maken door:
199199
200200`property PropName: PropType read;`
201201
202202in te tikken. Als je dan Ctrl+Shift+C drukt wordt dit
203203
204204`property PropName: PropType read FPropName;`
205205
206206In theorie kun je een "write only" property maken door:
207207
208208` property PropName: PropType write;`
209209
210210in te tikken, wat dan door Code Completion wordt aangevuld tot
211211
212212`property PropName: PropType write SetPropName;`
213213
214214Het nut van een property dat je alleen kunt schrijven is mij niet helemaal duidelijk, maar het is dus mogelijk. Een "read only" property met een lees methode (ook wel 'Getter' genoemd):
215215
216216`property PropName: PropType read GetPropName;`
217217
218218Deze regel wordt dan niet veranderd, maar code completion zal wel de GetPropName function toevoegen:
219219
220220`function GetpropName: PropType;`
221221
222222Je kunt ook een property maken met een "stored" modifier:
223223
224224`property PropName: PropType stored;`
225225
226226dit zal worden uitgebreid door CodeCompletion tot:
227227
228228`property PropName: PropType read FPropName write SetPropName stored PropNameIsStored;`
229229
230230De stored modifier bepaald of een property wordt opgeslagen met de form definitie. Als het niet is opgegeven wordt de waarde True aangenomen.
231231
232232Tip: Identifier completion herkent ook incomplete properties en zal de standaard namen voorstellen. Dus bijvoorbeeld::
233233
234234`property PropName: PropType read |;`
235235
236236Als de cursor een spatie achter 'read' staat en je drukt op Ctrl+Space dan krijg je een lijstje te zien met de variable 'FPropName' en de 'setter' 'SetPropName'.
237237
238238### Forward Procedure Completion
239239
240240"Forward Procedure Completion" is een onderdeel van de Code Completion en voegt procedure implementaties toe die missen. Dit onderdeel van Code Completion wordt opgeroepen als de cursor op een procedure definitie is geplaatst.
241241
242242Bijvoorbeeld: Voeg een nieuwe procedure toe aan de interface sectie:
243243
244244`procedure DoSomething;`
245245
246246Zet de cursor er op en druk Ctrl+Shift+C. Er zal dan in de implementatie sectie een raamwerk voor de procedure worden gemaakt:
247247
248248`procedure DoSomething;`\
249249`begin`\
250250`  |`\
251251`end;`
252252
253253Tip: Ook hier kun je tussen de definitie en de implementatie heen en weer springen met Ctrl+Shift+Up.
254254
255255Waar de nieuwe procedure implementatie wordt geplaatst is afhankelijk van de voorkeur zoals die is ingesteld in Environment \> Codetools Options -\> Code Creation. Als er al een aantal procedures zijn opgenomen, zal de IDE proberen de implementaties in dezelfde volgorde te zetten als de definities. Bijvoorbeeld:
256256
257257` procedure Proc1;`\
258258` procedure Proc2; // Nieuw`\
259259` procedure Proc3;`
260260
261261Als de implementaties van Proc1 en Proc3 al aanwezig zijn, zal de implementatie van Proc2 hier tussen geplaatst worden.
262262
263263Meerdere procedures in een keer kan ook:
264264
265265`procedure Proc1_Old; // Bestaat al, implementatie aanwezig.`\
266266`procedure Proc2_New; // Implementatie niet aanwezig.`\
267267`procedure Proc3_New; //  "`\
268268`procedure Proc4_New; //  "`\
269269`procedure Proc5_Old; // Bestaat al, implementatie aanwezig.`
270270
271271In dit geval zullen er door Code Completion 3 procedure implementaties worden toegevoegd (Proc2_New, Proc3_New, Proc4_New).
272272
273273Waarom heet dit nu "Forward Procedure Completion"? Eigenlijk heel simpel, omdat het ook werkt bij procedures die met de "forward" modifier zijn gedefinieerd!
274274
275275### Event Assignment Completion
276276
277277"Event Assignment Completion" is ook een onderdeel van de Code Completion en completeerd een
278278
279279`Event := |`
280280
281281statement. Druk je nu op Ctrl+Shift+C zoals in het volgende voorbeeld:
282282
283283`procedure TForm1.Form1Create(Sender: TObject);`\
284284`begin`\
285285`  OnPaint:=|`\
286286`end;`
287287
288288De '\|' is natuurlijk weer de plaats van de cursor! Als je nu op press Ctrl+Shift+C drukt het statement zal worden gecompleteerd tot:
289289
290290`OnPaint:=@Form1Paint;`
291291
292292In de definitie van TForm1 zal deze methode worden opgenomen en in de implementatie sectie zal het skelet van de procedure gezet worden:
293293
294294`procedure TForm1.Form1Paint(Sender: TObject);`\
295295`begin`\
296296`  |`\
297297`end;`
298298
299299Eigenlijk precies zo als bij het toevoegen van een methode in de Object Inspector.
300300
301301Let op:\
302302De cursor moet achter de ':=' staan, omdat anders "Local Variable Completion" zal worden aangeroepen. Dit zal echter mislukken want OnPaint is immers al gedefinieerd.
303303
304304Tip:\
305305Je kunt zelf de naam van de method bepalen door bijvoorbeeld:
306306
307307` OnPaint:=@ThePaintMethod;`
308308
309309te typen en daarna Ctrl+Shift+C te geven.
310310
311311### Local Variable Completion
312312
313313"Local Variable Completion" is het onderdeel van Code Completion dat een lokale variabele toevoegt voor een Identifier := Waarde; statement. Je kunt het oproepen als de cursor op de identifier staat.
314314
315315Bijvoorbeeld:
316316
317317`procedure TForm1.Form1Create(Sender: TObject);`\
318318`begin`\
319319`  i:=3;`\
320320`end;`
321321
322322Plaats de cursor op de 'i' of er net achter, druk dan op Ctrl+Shift+C en dit is het resultaat:
323323
324324`procedure TForm1.Form1Create(Sender: TObject);`\
325325`var`\
326326`  i: Integer;`\
327327`begin`\
328328`  i:=3;`\
329329`end;`
330330
331331Code Completion controleert eerst of de identifier 'i' al gedefinieerd is en zo niet dan zal het de declaratie 'var i: integer;' toevoegen. Het type van de identifier is gebaseerd op de toegekende waarde. Getallen worden standaard een Integer.
332332
333333Een ander voorbeeld, die wat meer de ingebouwde intelligentie aantoont: type
334334
335335` TWhere = (Behind, Middle, InFront);`\
336-\
336+
337337` procedure TForm1.Form1Create(Sender: TObject);`\
338338` var`\
339339`   a: array[TWhere] of char;`\
340340` begin`\
341341`   for Where:=Low(a) to High(a) do writeln(a[Where]);`\
342342` end;`
343343
344344Plaats de cursor op 'Where' en druk op Ctrl+Shift+C. Je krijgt dan:
345345
346346`procedure TForm1.Form1Create(Sender: TObject);`\
347347`var`\
348348`  a: array[TWhere] of char;`\
349349`  Where: TWhere;`\
350350`begin`\
351351`  for Where:=Low(a) to High(a) do writeln(a[Where]);`\
352352`end;`
353353
354354### Commentaar en Code Completion
355355
356356Code Completion zal het commentaar zoveel mogelijk daar houden waar het hoort. Bij voorbeeld:
357357
358358` FList: TList; // lijst van TComponent`\
359359` FInt: integer;`
360360
361361Als er een nieuwe variabele tussen wordt gezet, zal het commentaar op de regel van FList blijven. Het zelfde geldt voor
362362
363363` FList: TList; { lijst van TComponent`\
364364`   Dit is commentaar over meerdere regels, dat begint`\
365365`   op de FList regel, so Code Completion neemt aan dat `\
366366`   het bij FList hoort en zal deze deze relatie niet`\
367367`   verbreken. Nieuwe code wordt hierna geplaatst. }`\
368368` FInt: integer;`
369369
370370Maar in het volgende voorbeeld:
371371
372372` FList: TList; // list of TComponent`\
373373`   { Dit commentaar behoort tot het volgende statement.`\
374374`     Nieuwe code kan dus hierboven worden toegevoegd en`\
375375`     na het commentaar van de FList regel. }`\
376376` FInt: integer;`
377377
378378## Refactoring
379379
380380### Invert Assignments
381381
382382Samenvatting
383383
384384"Invert Assignments" draait geselecteerde pascal statements om. Je kunt het gebruiken voor het omvormen van "bewaar" code naar "inlees" code.
385385
386386Een voorbeeld zal een en ander wat duidelijker maken:\
387387procedure DoSomething;
388388
389389`begin`\
390390`  AValueStudio:= BValueStudio;`\
391391`  AValueAppartment :=BValueAppartment;`\
392392`  AValueHouse:=BValueHouse;`\
393393`end;`
394394
395395Selecteer de regels met toekenningen (assignments) en kies dan voor "Invert Assignments". Dit vind je door rechts te klikken in de geselecteerde code en dan te kiezen voor "Refactoring". Alle toekennen zullen nu worden omgedraaid. Het resultaat ziet er dan als volgt uit:
396396
397397`procedure DoSomething;`\
398398`begin`\
399399`  BValueStudio     := AValueStudio;`\
400400`  BValueAppartment := AValueAppartment;`\
401401`  BValueHouse      := AValueHouse;`\
402402`end;`
403403
404404### Extract Procedure
405405
406406Samenvatting
407407
408408"Extract Procedure" maakt van de geselecteerde code een nieuwe procedure. Dit is makkelijk bij het splitsen van een hele grote procedure in een aantal kleinere of het maken van een nieuwe procedure omdat de betreffende code op meerdere plaatsen gebruikt wordt. Extract procedure kun je oproepen via Edit -\> Extract Procedure of via Rechtermuisklik -\> Refactoring -\> Extract Procedure.
409409
410410*De basis:*\
411411procedure DoSomething;
412412
413413`begin`\
414414`  Statement1;`\
415415`  Statement2;`\
416416`  Statement3;`\
417417`end;`
418418
419419Selecteer de regels tussen begin en end. Kies dan voor Extract Procedure. Er zal dan een dialoog waarmee je het type procedure kunt kiezen en een naam voor de procedure kunt invoeren. Bijvoorbeeld: procedure, "NewProc". Result:
420420
421421`procedure NewProc;`\
422422`begin`\
423423`  Statement1;`\
424424`  Statement2;`\
425425`  Statement3;`\
426426`end;`\
427-\
427+
428428`procedure DoSomething;`\
429429`begin`\
430430`  NewProc;`\
431431`end;`
432432
433433Zoals je ziet is er een nieuwe procedure gemaakt "NewProc", met de geselecteerd statements en is de oorspronkelijke code vervangen door een aanroep van de nieuwe procedure. Had je voor het type "Private Method" gekozen, dan was er in de type definitie van je klasse in de private sectie een definitie van de nieuwe procedure gemaakt naast natuurlijk de implementatie van deze procedure.
434434
435435*Lokale Variabelen en Parameters:*\
436436"Extract Procedure" zal automatisch de code scannen voor lokale variabele en deze aanmaken. Ook eventuele parameters worden automatisch aangemaakt. Bijvoorbeeld:
437437
438438`procedure TForm1.DoSomething(var Ernie, Bert: integer);`\
439439`var`\
440440`  I: Integer; // Commentaar`\
441441`begin`\
442442`  Ernie:=Ernie+Bert;`\
443443`  for I:=Ernie to 5 do begin`\
444444`  |`\
445445`  end;`\
446446`end;`
447447
448448Selecteer nu de for-loop selecteert en maak met behulp van "Extract Procedure" een nieuwe procedure "NewProc" aan. Omdat de variabele I alleen in de geselecteerde code wordt gebruikt, wordt deze naar de nieuwe procedure verplaatst. Ernie wordt echter ook nog in de resterende code gebruikt dus zal het een parameter worden.
449449
450450Het resultaat:\
451451procedure NewProc(const Erni: integer);
452452
453453`var`\
454454`  i: Integer; // Commentaar`\
455455`begin`\
456456`  for i:=Ernie to 5 do begin`\
457457`  |`\
458458`  end;`\
459459`end;`\
460-\
460+
461461`procedure TForm1.DoSomething(var Erni, Bert: integer);`\
462462`begin`\
463463`  Ernie:=Ernie+Bert;`\
464464`  NewProc(Ernie);`\
465465`end;`
466466
467467Zoals je ziet is de I in zijn geheel verplaatst naar de nieuwe procedure inclusief het bijbehorende commentaar.
468468
469469Beperkingen:\
470470Omdat pascal een hoop mogelijkheden heeft, moet je niet verwachten dat het altijd even goed werkt. Huidige beperkingen en "ToDo"s:
471471
472472- Controle op het overeenkomen van selectie grenzen met statement grenzen
473473- betere bepaling van het type van de parameters. Op het moment zijn parameters "const", als het "var" moeten zijn, moet je dat zelf wijzigen.
474474- "with" statements
475475
476476## Find Declaration
477477
478478Find Declaration kun je oproepen via Search -\> Find Declaration at cursor of via Rechtermuisklik -\> Find Declaration of via ctrl+muisklik. (In het laatste geval verschijnt er een lijn onder een identifier als de ctrl-toets is ingedrukt en de muiscursor komt boven de identifier. Hoe dan ook, de IDE gaat op zoek naar de declaratie van deze identifier, opent (indien nodig) de file en plaats de cursor op de regel waar de identifier is gedefinieerd.
479479
480480Iedere zoek opdracht (Find Declaration) zorgt er voor dat er een Jump Point wordt gezet. Je kunt dus eenvoudig terug springen naar het punt waar je de zoek aktie heb gestart via Search -\> Jump back (ctrl+H).
481481
482482De codetools houden rekening met de "normale" pascal regels. Hoewel de compiler alleen het laatste resultaat geeft, zien de codetools alle tussenliggende stappen. Bijvoorbeeld:
483483
484484De 'Visible' property wordt voor het eerst gedefinieerd in TControl (controls.pp), later nog eens opnieuw in TCustomForm en uiteindelijk nog eens in TForm. Gebruik je dus Find Declaration op de Visible property van een Form, dan zal er eerst naar de definitie van TForm gesprongen worden, vandaar kun je dan springen naar de declaratie van TCustomForm en dan pas naar het visible property van TControl.
485485
486486Iets soort gelijks geldt bijvoorbeeld voor TColor. Uiteindelijk is TColor niets anders dan een 'longint'. Maar in de sources is het als volgt gedefinieerd:
487487
488488`TGraphicsColor = -$7FFFFFFF-1..$7FFFFFFF;`\
489489`TColor = TGraphicsColor;`
490490
491491Een voorbeeld van een 'forward' gedefinieerd control. In TControl is een private variabele gedefinieerd:
492492
493493`FHostDockSite: TWinControl;`
494494
495495Gebruik je in TControl Find declaration voor TWinControl, dan zal er naar de forward definitie gesprongen worden.
496496
497497`TWinControl = class;`
498498
499499Gebruik je hier dan nog eens de Find Declaratie, pas dan zal er naar de werkelijke definitie gesprongen worden:
500500
501501`TWinControl = class(TControl)`
502502
503503Het mag duidelijk zijn dat je op deze manier iedere identifier kunt opsporen en iedere overload terugvinden.
504504
505505## Goto Include Directive
506506
507507"Goto Include Directive" te vinden in het search menu van de IDE springt naar het {\$I filename} statement waar het huidige bestand wordt gebruikt.
508508
509509## Publish Project
510510
511511Maakt een kopie van je hele project. Als je iemand de code van je project wilt sturen is dit een handige functie. Ook voor het maken van een backup van je sources is dit natuurlijk uitermate geschikt.
512512
513513In de project directory staat een helehoop informatie. Het meeste daarvan is niet strikt noodzakelijk voor het project, maar maken dat je als je het project opnieuw opent precies op dat punt bent waar je was bij het sluiten ervan. De .lpi file bevat deze sessie informatie (zoals de positie van de tekst cursor en bookmarks van gesloten units). Daarnaast staan er in de project directory een aantal .ppu en .o bestanden en natuurlijk de executable zelf. De .ppu en .o zijn tussenbestanden die gemaakt worden tijdens het compileren van je programma. Publish Project maakt dus een lpi file met de hoogstnodige informatie en plaatst deze met alle source files in een aparte subdirectory.
514514
515515In de dialoog die verschijnt als je deze functie start kun je een filter opgeven van de bestanden die meegenomen moeten worden of juist niet. Met het "command after" zou je de bestanden eventueel direct in een zip of soortegelijk archief kunnen zetten.
516516
517517---
518518*From the Free Pascal wiki, page "Lazarus IDE Tools/nl", as it stood on 2010-01-30 after a change by Dataforger, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history