Sign in Join
Wiki copytemporary

Lazarus IDE Tools/ru: what changed

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

OldNewLine
11**[[Lazarus Faq/ru|Lazarus]] IDE** - это инструменты библиотеки [[Free Pascal]] для синтаксического анализа и редактирования, называемая "codetools"\[(утилиты кода)\].
22
33Эти инструменты предоставляют такие функции для исходников, как "Переход к объявлению", "Завершение кода", "Извлечение", "Перемещение вставки" и "Украшение Паскаля". Эти функции могут сэкономить много времени и пустой работы. Они настраиваются, и каждая функция доступна с помощью ярлыков (см. Editor Options).
44
55Поскольку они работают исключительно с исходниками Pascal и понимают коды FPC, [[Delphi]] и [[Kylix]], им не требуются компилированные модули или установленный компилятор Borland/Embarcadero. Код Delphi и FPC можно редактировать одновременно с несколькими версиями Delphi и FPC. Это упрощает перенос кода Delphi в FPC/Lazarus.
66
77## Горячие клавиши в IDE
88
99| | |
1010|----|----|
1111| [[Lazarus IDE Tools|Переход на объявление]] | `Ctrl`+ЛКМ или `Alt`+`Up` (Переход на объявление типа или переменной) |
1212| [[Lazarus IDE Tools/ru|Переход на метод класса]] | `Ctrl`+`Shift`+`Up` (Переход туда сюда между объявлением и телом метода) |
1313| [[Lazarus IDE Tools/ru|Шаблоны кода]] | `Ctrl`+`J` |
1414| [[Lazarus IDE Tools/ru|Синхронная правка]] | `Ctrl`+`J` (Пока текст выделен) |
1515| [[Lazarus IDE Tools/ru|Завершение кода]] (Завершение класса) | `Ctrl`+`Shift`+`C` |
1616| [[Lazarus IDE Tools|Завершение идентификатора]] | `Ctrl`+`space` |
1717| [[Lazarus IDE Tools|Завершение слова]] | `Ctrl`+`W` |
1818| [[Lazarus IDE Tools/ru|Подсказка для параметров]] | `Ctrl`+`Shift`+`space` |
1919| [[Lazarus IDE Tools/ru|Последовательный поиск]] | `Ctrl`+`E` |
2020
2121## Переход между методом и его объявлением
2222
2323Для перехода между телом процедуры (begin..end) и объявлением процедуры (procedure Name;) используйте `Ctrl`+`Shift`+`Up`.
2424
2525Для примера:
2626
2727``` pascal
2828 interface
2929
3030 procedure DoSomething; // Объявление процедуры
3131
3232 implementation
3333
3434 procedure DoSomething; // Тело процедуры
3535 begin
3636 end;
3737```
3838
3939Если курсор стоит на теле процедуры и Вы нажмёте `Ctrl`+`Shift`+`Up`, то курсор перескочит на объявление, потом опять `Ctrl`+`Shift`+`Up` и курсор перескочит на тело процедуры, после 'begin'.
4040
4141Это так же работает между методами-процедурами класса.
4242
4343Подсказка: Переход осуществляется на процедуру с таким же именем и списком параметров. Если нет точной такой же процедуры, то переход будет на наиболее подходящего кандидата и позиционирует курсор на первое же различие. (Для дельфийцев: Delphi не может этого сделать). Пример процедуры с различными типами параметров:
4444
4545``` pascal
4646 interface
4747
4848 procedure DoSomething(p: char); // Объявление процедуры
4949
5050 implementation
5151
5252 procedure DoSomething(p: string); // Тело процедуры
5353 begin
5454 end;
5555```
5656
5757Переход с определения к телу процедуры будет позиционировать курсор на ключевое слово 'string'. Это можно использовать для переименования методов и / или изменения параметров.
5858
5959Пример:\
6060Вы переименовываете 'DoSomething' в 'MakeIt':
6161
6262``` pascal
6363 interface
6464
6565 procedure MakeIt; // Объявление процедуры
6666
6767 implementation
6868
6969 procedure DoSomething; // Тело процедуры
7070 begin
7171 end;
7272```
7373
7474Тогда можно перейти от MakeIt к телу. IDE ищет подходящее тело и не находит, а, следовательно, ищет нечто похожее. Так как вы переименовали только одну процедуру есть ровно одно тело без определения (DoSomething) и будет переход к DoSomething, курсор встанет справа от "DoSomething". Тогда вы можете просто переименовать его прямо там. Это работает и для параметров.
7575
7676## Включаемые файлы
7777
7878Включаемые файлы это файлы вставленные в исходный код с помощью директив компилятора
7979
8080``` pascal
8181{$I filename}
8282```
8383
8484или
8585
8686``` pascal
8787{$INCLUDE filename}
8888```
8989
9090. Lazarus и FPC используют эти вещи чтобы уменьшить избыточность и избежать нечитаемых {\$IFDEF} конструкций при поддержке различных платформ.
9191
9292В отличие от Delphi, Lazarus IDE полностью поддерживает включаемые файлы. Вы можете для примера перепрыгнуть с метода в .pas файле к телу метода во включаемом файле. Все инструменты для работы с кодом, такие как автозавершение кода, просматривают текст во включаемых файлах на предмет специальных связей.
9393
9494Например: когда автозавершение кода добавляет новое тело метода за другим телом метода, он хранит их обоих в одном файле. Таким образом, вы можете помещать целые реализации классов в файлы include, как, например LCL \[делает\] для почти всех элементов управления.
9595
9696Но \[тут\] есть ловушка для новичков: Если вы впервые откроете файл include и попробуете прыгнуть к методу или найди \[его\] объявление, вы получите сообщение об ошибке. IDE не знает, к какому модулю принадлежит файл include. Сначала вы должны открыть модуль.
9797
9898Как только IDE проанализирует модуль, она \[начнет\] анализировать директивы include, и \[затем\] IDE запоминает эти взаимосвязи. Она сохраняет эту информацию при выходе и при сохранении проекта в ~/.lazarus/includelinks.xml. В следующий раз, когда вы откроете этот include-файл и перейдете \[к объявлению\] или найдете \[его поиском\], IDE будет открывать модуль изнутри \[include-файла\], и переход будет работать. Вы также можете указать подсказку IDE, поставив
9999
100100``` pascal
101101 {%mainunit yourunit.pas}
102102```
103103
104104наверху вашего yourinclude.inc.
105105
106106Конечно, этот механизм имеет ограничения. Некоторые include-файлы включаются дважды или более. Например: lcl/include/winapih.inc.
107107
108108Переходы с объявления процедуры/метода в этом include-файле к \[их\] телу зависят от ваших последних действий. Если вы работаете в lcl/lclintf.pp, среда IDE перейдет в winapi.inc. Если вы работаете в lcl/interfacebase.pp, тогда она перейдет в lcl/include/interfacebase.inc (или в один из других включенных файлов). Если вы работаете над обоими, то вы можете запутаться. ;)
109109
110110## Шаблоны кода
111111
112112Шаблоны кода преобразуют идентификатор в текст, или фрагмент кода.
113113
114114По умолчанию горячие клавиши для шаблонов кода `Ctrl`+`J`. Вы можете ввести идентификатор, нажать `Ctrl`+`J` и идентификатор заменится на текст определенный для этого идентификатора. Шаблоны кода можно задать в Environment -\> Editor Options -\> CodeTools.
115115
116116Пример: Введите идентификатор 'classf', поставьте курсор справа от 'f' и нажмите `Ctrl`+`J`. Идентификатор 'classf' будет заменен на
117117
118118``` pascal
119119 T = class(T)
120120 private
121121
122122 public
123123 constructor Create;
124124 destructor Destroy; override;
125125 end;
126126```
127127
128128и курсор будет находится за 'T'.
129129
130130Вы можете посмотреть список шаблонов установив курсор на пустое место (не на идентификатор) и нажав `Ctrl`+`J`. Список шаблонов кода появится. Используйте стрелки, или введите несколько символов чтобы выбрать нужный шаблон. `Enter` создаст выделенный шаблон, а `Escape` закроет список шаблонов.
131131
132132Больше всего времени экономит шаблон 'b'+`Ctrl`+`J` для begin..end.
133133
134134## Подсказка для параметров
135135
136136Подсказка для параметров позволяет посмотреть список параметров для процедур и функций. Жирным шрифтом выделяется текущий параметр.
137137
138138Например:
139139
140140``` pascal
141141 Canvas.FillRect();
142142```
143143
144144Поместите курсор внутри скобок и нажмите `Ctrl`+`Shift`+`space`. Появится подсказка с параметрами процедуры FillRect.
145145
146146![](/wiki-images/c/c8/Parameterhints1.png)
147147
148148Начиная с версии 0.9.31, справа от каждой декларации имеется кнопка, вставляющая отсутствующие параметры. Это скопирует имена параметров из выбранного объявления в позицию курсора.
149149
150150![](/wiki-images/4/48/Parameterhints2.png)
151151
152152Подсказка: используйте [[Lazarus IDE Tools/ru|Автозавершение объявления переменной]], чтобы объявить переменные.
153153
154154> **Note:** Имя ярлычка - "Show code context"\[("Показать контекст кода")\].
155155
156156## Последовательный поиск
157157
158158Последовательный поиск изменяет строку состояния редактора исходного кода. Введите несколько символов, и редактор тут же будет их искать, выделяя все вхождения в тексте. Для вызова поиска, нажмите: `Ctrl`+`e`.
159159
160160- Например, нажмите `e` произведёт поиск и выделение всех букв «е» в коде.
161161- Затем, нажав `t` будет произведён поиск и выделение всех вхождений «et» и так далее.
162162- Вы можете использовать быстрый переход между найденными позициями в тексте нужной строки. Для быстрого перехода вниз по тексту, используйте `F3` (или `Ctrl`+`e` во время поиска). Для быстрого перехода вверх по тексту, используйте `Shift`+`F3`.
163163- `Backspace` удаляет последний символ
164164- `Enter` останавливает поиск без добавления новой строки в редакторе.
165165- Вы можете возобновить последний поиск, нажав `Ctrl`+`e` во второй раз, сразу же после начала последовательного поиска используя `Ctrl`+`e`. т.е. когда строка поиска пуста.
166166- Вставка `Ctrl`+`V` добавит строку из буфера обмена к текущему искомому тексту. (так же как в lazarus 0.9.27 r19824).
167167
168168### Пример использования последовательного поиска для поиска слова
169169
170170- Поместите курсор на нужное слово, не выделяя его
171171- Нажмите `Ctrl`+`C`. Редактор исходного кода выделит слово и скопирует его в буфер обмена.
172172- Нажмите `Ctrl`+`E` для начала последовательного поиска
173173- Нажмите `Ctrl`+`V` для поиска идентификатора (так же, как в 0.9.27)
174174- Используйте `F3` и `Shift`+`F3` для быстрого перехода к следующему / предыдущему найденному участку текста.
175175- Используйте любую клавишу (например курсор влево или вправо), чтобы закончить поиск
176176
177177## Синхронная правка
178178
179179Синхронная правка позволяет редактировать все места присутствия слова в тексте одновременно (синхронно). Вы просто изменяете, слово в одном месте и все остальные вхождения слова в тексте изменяются автоматически.
180180
181181Синхронная правка влияет на все слова в выделенной области текста. Пример использования:
182182
183183- Выделите блок текста
184184- Нажмите `Ctrl`+`J` или воспользуйтесь соответствующим значком. (Это работает только, если есть какие-либо слова, которые встречаются более одного раза в выделенном тексте.)
185185- Используйте клавишу `tab` для выделения слова, которое вы хотите изменить. (если было выделено несколько разных слов более одного раза)
186186- Измените слово
187187- Нажмите `Esc` для окончание работы с синхронной правкой
188188
189189См. анимированный пример [[New IDE features since|здесь]]
190190
191191> **Note:** `Ctrl`+`J` также используется для редактирования шаблона. \[Это сочетание клавиш\] переключает свое значение, если вы выберете какой-то текст.
192192
193193## Поиск следующего / предыдущего вхождения слова
194194
195195Обе функции можно найти в контекстном меню редактора исходного кода
196196
197197- Редактор кода / контекстное меню / Найти / Найти следующее вхождение слова
198198- Редактор кода / контекстное меню / Найти / Найти предыдущее вхождение слова
199199
200200Вы можете назначить данным пунктам сочетания клавиш в окне настройки редактора исходного кода. Для этого выберите меню "Сервис-\>Параметры" и в левой части появившегося окна выберите "Редактор-\>Комбинации клавиш".
201201
202202## Автозавершение Кода
203203
204204Автозавершение кода можно найти в меню IDE Edit -\> Complete Code, а так же используя сочетания клавиш: `Ctrl`+`Shift`+`C`.
205205
206206Для Делфистов: В Delphi, это называется "автозавершение кода"(code completion) - специальная функция, показывающая список идентификаторов, в текущей позиции исходного кода ((`Ctrl`+`Пробел`). В Lazarus это называется "автозавершение идентификаторов"(Identifier completion).
207207
208208Автозавершение кода сочетает в себе несколько мощных функций, например:
209209
210210- [[Lazarus IDE Tools/ru|Автозавершение класса]]: завершает объявление свойств, добавляет/обновляет тело метода, добавляет переменные и методы в раздел private класса.
211211- [[Lazarus IDE Tools/ru|Автозавершение предварительно объявленной процедуры]]: добавляет тело процедуры.
212212- [[Lazarus IDE Tools/ru|Автозавершение назначенных процедур обработки событий]]: завершает связи с событием, добавляя определения методов и их тел.
213213- [[Lazarus IDE Tools/ru|Автозавершение объявления переменной]]: добавляет определённые локальные переменные.
214214- [[Lazarus IDE Tools/ru|Автозавершение объявления вызываемой процедуры]]: добавляет новую процедуру.
215215- Reversed procedure completion: добавление объявления процедур/функций (Прим.перев. 08:28, 26 October 2018 (CEST): Раздел временно отсутствует)
216216- [[Lazarus IDE Tools/ru|Автозавершение предшествующего объявления класса]]: добавление объявления метода для тела метода внутри класса.
217217
218218Какая из этих функций будет использована, зависит от позиции курсора в редакторе кода.
219219
220220Автозавершение кода можно найти в меню IDE Edit -\> Complete Code, \[а также вызвать\] стандартным сочетанием клавиш `Ctrl`+`Shift`+`C`.
221221
222222### Автозавершение класса
223223
224224Наиболее мощная функция завершения кода является "Автозавершение класса". Вы пишете скелет класса, добавляя в него методы и свойства. Автозавершение кода автоматически завершит их объявления, добавив нужные переменные, тело для реализации метода или свойства, определит способ доступа к ним а так же поля класса.
225225
226226Например: создайте класс (для быстроты можете использовать шаблоны кода):
227227
228228``` pascal
229229 TExample = class(TObject)
230230 public
231231 constructor Create;
232232 destructor Destroy; override;
233233 end;
234234```
235235
236236Поместите курсор где-то внутри класса и нажмите `Ctrl`+`Shift`+`C`. Это позволит создать скелет для реализации методов и поместит курсор внутри тела метода:
237237
238238``` pascal
239239 { TExample }
240240
241241 constructor TExample.Create;
242242 begin
243243 |
244244 end;
245245
246246 destructor TExample.Destroy;
247247 begin
248248 inherited Destroy;
249249 end;
250250```
251251
252252> **Note:** символом '\|' обозначена позиция курсора в коде.
253253
254254Подсказка: Вы можете переключаться между методом и его телом, используя клавиши `Ctrl`+`Shift`+`Up`.
255255
256256Вы можете увидеть, что IDE добавило вызов 'inherited Destroy'. Это происходит, когда в объявлении метода используется ключевое слово 'override'.
257257
258258Теперь добавьте метод DoSomething:
259259
260260``` pascal
261261 TExample = class(TObject)
262262 public
263263 constructor Create;
264264 procedure DoSomething(i: integer);
265265 destructor Destroy; override;
266266 end;
267267```
268268
269269Нажмите `Ctrl`+`Shift`+`C` и IDE завершит его, добавив:
270270
271271``` pascal
272272 procedure TExample.DoSomething(i: integer);
273273 begin
274274 |
275275 end;
276276```
277277
278278Вы можете определить поведение вставки кода в Environment \> Codetools Options -\> Code Creation.
279279
280280**Завершение свойств**\
281281Добавьте свойство AnInteger:
282282
283283``` pascal
284284 TExample = class(TObject)
285285 public
286286 constructor Create;
287287 procedure DoSomething(i: integer);
288288 destructor Destroy; override;
289289 property AnInteger: Integer;
290290 end;
291291```
292292
293293Нажмите Ctrl+Shift+C и вы получите:
294294
295295``` pascal
296296 procedure TExample.SetAnInteger(const AValue: integer);
297297 begin
298298 |if FAnInteger=AValue then exit;
299299 FAnInteger:=AValue;
300300 end;
301301```
302302
303303Функция автозавершения кода добавила поля класса и метод, используемые при обращении к свойству. Нажмите `Ctrl`+`Shift`+`Up` для просмотра определения класса:
304304
305305``` pascal
306306 TExample = class(TObject)
307307 private
308308 FAnInteger: integer;
309309 procedure SetAnInteger(const AValue: integer);
310310 public
311311 constructor Create;
312312 procedure DoSomething(i: integer);
313313 destructor Destroy; override;
314314 property AnInteger: integer read FAnInteger write SetAnInteger;
315315 end;
316316```
317317
318318Свойство было изменено. Добавлены ключевые слова Read и Write. Класс получил новый раздел 'private' с полем 'FAnInteger' и методом 'SetAnInteger'. Это общий стиль Delphi, использовать в названиях полей букву 'F' (Field). И в методах на запись слово 'Set'. Данные настройки можно изменить в Environment \> Codetools Options -\> Code Creation.
319319
320320Создание свойства только для чтения:
321321
322322``` pascal
323323 property PropName: PropType read;
324324```
325325
326326Будет расширено до:
327327
328328``` pascal
329329 property PropName: PropType read FPropName;
330330```
331331
332332Создание свойства только для записи:
333333
334334``` pascal
335335 property PropName: PropType write;
336336```
337337
338338Будет расширено до:
339339
340340``` pascal
341341 property PropName: PropType write SetPropName;
342342```
343343
344344Создание свойства только для чтения с указанием метода:
345345
346346``` pascal
347347 property PropName: PropType read GetPropName;
348348```
349349
350350Будет добавлена функция GetPropName:
351351
352352``` pascal
353353 function GetpropName: PropType;
354354```
355355
356356Создание свойства с ключевым словом stored:
357357
358358``` pascal
359359 property PropName: PropType stored;
360360```
361361
362362Будет расширено до:
363363
364364``` pascal
365365 property PropName: PropType read FPropName write SetPropName stored PropNameIsStored;
366366```
367367
368368Так как ключевое слово `stored` используется для потокового чтения и записи, нужные поля и процедуры также будут добавлены автоматически.
369369
370370Подсказка: Автозавершение идентификатора также распознает неполные свойства и \[взамен\] предлагает имена по умолчанию. Например:
371371
372372``` pascal
373373property PropName: PropType read |;
374374```
375375
376376Поместите курсор сразу за ключевым словом **read** и нажмите `Ctrl`+`Space` для автозавершения идентификатора. Он предоставит вам переменную **FPropName** и процедуру **SetPropName**.
377377
378378### Автозавершение предварительно объявленной процедуры
379379
380380"Автозавершение предварительно объявленной процедуры" является частью автозавершения кода и добавляет отсутствующее тело процедуры. Оно вызывается, когда курсор находится в объявлении заданной процедуры.
381381
382382Например: Добавьте новую процедуру в раздел интерфейса:
383383
384384``` pascal
385385 procedure DoSomething;
386386```
387387
388388Поместите в нее курсор и нажмите `Ctrl`+`Shift`+`C` для автозавершения кода. Он будет создан в разделе реализации:
389389
390390``` pascal
391391 procedure DoSomething;
392392 begin
393393 |
394394 end;
395395```
396396
397397Подсказка: вы можете быстро перемещаться между объявлением процедуры и ее телом с помощью `Ctrl`+`Shift`+`Up`.
398398
399399Новое тело процедуры будет добавлено перед методами класса. Если в интерфейсе уже есть некоторые процедуры, IDE попытается сохранить \[их\] порядок. Например:
400400
401401``` pascal
402402 procedure Proc1;
403403 procedure Proc2; // новая процедура
404404 procedure Proc3;
405405```
406406
407407Если тела Proc1 и Proc3 уже существуют, то тело Proc2 будет вставлено между телами Proc1 и Proc3. Такое поведение можно настроить в Environment \> Codetools Options -\> Code Creation.
408408
409409Несколько процедур:
410410
411411``` pascal
412412 procedure Proc1_Old; // тело [процедуры уже] существует
413413 procedure Proc2_New; // тело [процедуры еще] не существует
414414 procedure Proc3_New; // "
415415 procedure Proc4_New; // "
416416 procedure Proc5_Old; // тело [процедуры уже] существует
417417```
418418
419419Автозавершение кода добавит тела всех 3 процедур(Proc2_New, Proc3_New, Proc4_New).
420420
421421Почему это называется "Автозавершение предварительно объявленной процедуры"?
422422
423423Потому что это работает не только для процедур, определенных в интерфейсе, но и для процедур\[, определенных\] с помощью "предварительно объявленного" модификатора. И потому что утилиты кода обрабатывают процедуры в интерфейсе как имеющие неявный "предварительно объявленный" модификатор.
424424
425425### Автозавершение назначенных процедур обработки событий
426426
427427"Автозавершение назначенных процедур обработки событий" является частью автозавершения кода и завершает единственный оператор Event:=\|. Он вызывается, когда курсор находится за назначенным событием.
428428
429429Например: В методе, скажем, событие FormCreate, добавьте строку 'OnPaint:=':
430430
431431``` pascal
432432procedure TForm1.Form1Create(Sender: TObject);
433433begin
434434 OnPaint:=|
435435end;
436436```
437437
438438'\|' - это курсор, и его не следует вводить. Затем нажмите `Ctrl`+`Shift`+`C` для завершения кода. Оператор будет завершен
439439
440440``` pascal
441441OnPaint:=@Form1Paint;
442442```
443443
444444Новый метод Form1Paint будет добавлен в класс TForm1. Затем запустится автозавершение класса, и вы получите:
445445
446446``` pascal
447447procedure TForm1.Form1Paint(Sender: TObject);
448448begin
449449 |
450450end;
451451```
452452
453453Это работает так же, как добавление методов в инспекторе объектов.
454454
455455> **Note:** Вы должны поместить курсор сразу после оператора присваивания ':='. Если вы поместите курсор на идентификатор (например, OnPaint), то автозавершение кода вызовет «Автозавершение локальной переменной», что не удастся, поскольку OnPaint уже определен.
456456
457457Подсказка:\
458458*Вы можете выбрать видимость по умолчанию для нового метода в разделе Tools / Options / Codetools / Class Completion / Default (начиная с версии 1.8)
459459
460460- Вы можете определить имя нового метода самостоятельно. Например:
461461
462462``` pascal
463463 OnPaint:=@ThePaintMethod;
464464```
465465
466466Начиная с 0.9.31 Lazarus автозавершает параметры процедуры. Например
467467
468468``` pascal
469469procedure TForm1.FormCreate(Sender: TObject);
470470var
471471 List: TList;
472472begin
473473 List:=TList.Create;
474474 List.Sort(@MySortFunction|);
475475end;
476476```
477477
478478Поместите курсор на 'MySortFunction' и нажмите `Ctrl`+`Shift`+`C` для автозавершения кода. Вы получите новую процедуру:
479479
480480``` pascal
481481function MySortFunction(Item1, Item2: Pointer): Integer;
482482begin
483483 |
484484end;
485485
486486procedure TForm1.FormCreate(Sender: TObject);
487487var
488488 List: TList;
489489begin
490490 List:=TList.Create;
491491 List.Sort(@MySortFunction);
492492end;
493493```
494494
495495### Автозавершение объявления переменной
496496
497497"Автозавершение объявления переменной" является частью завершения кода и добавляет определение локальной переменной для \[оператора\] `Identifier:=Term` \[(Идентификатор:=Выражение)\]. Он вызывается, когда курсор находится на идентификаторе присвоения или параметра.
498498
499499Например:
500500
501501``` pascal
502502procedure TForm1.Form1Create(Sender: TObject);
503503begin
504504 i:=3;
505505end;
506506```
507507
508508Поместите курсор на '`i`' или сразу за ним. Затем нажмите `Ctrl`+`Shift`+`C` для автозавершения кода, и вы получите:
509509
510510``` pascal
511511procedure TForm1.Form1Create(Sender: TObject);
512512var
513513 i: Integer;
514514begin
515515 i:=3;
516516end;
517517```
518518
519519Утилиты кода сначала проверяют код \[на наличие объявления\] идентификатора '`i`', и если \[таковой не найден\], то добавляют объявление '`var i: integer;`'. Тип идентификатора угадывается из выражения\[, расположенного\] справа от оператора присвоения '`:=`'. Числа, такие как 3, по умолчанию \[будут иметь тип\] Integer.
520520
521521Другой пример:
522522
523523``` pascal
524524type
525525 TWhere = (Behind, Middle, InFront);
526526
527527 procedure TForm1.Form1Create(Sender: TObject);
528528 var
529529 a: array[TWhere] of char;
530530 begin
531531 for Where:=Low(a) to High(a) do writeln(a[Where]);
532532 end;
533533```
534534
535535Поместите курсор на 'Where' и нажмите `Ctrl`+`Shift`+`C` для автозавершения кода. Вы получите:
536536
537537``` pascal
538538 procedure TForm1.Form1Create(Sender: TObject);
539539 var
540540 a: array[TWhere] of char;
541541 Where: TWhere;
542542 begin
543543 for Where:=Low(a) to High(a) do writeln(a[Where]);
544544 end;
545545```
546546
547547Начиная с 0.9.11 Lazarus также автозавершает параметры. Например
548548
549549``` pascal
550550 procedure TForm1.FormPaint(Sender: TObject);
551551 begin
552552 with Canvas do begin
553553 Line(x1,y1,x2,y2);
554554 end;
555555 end;
556556```
557557
558558Поместите курсор на 'x1' и нажмите `Ctrl`+`Shift`+`C` для автозавершения кода. Вы получите:
559559
560560``` pascal
561561 procedure TForm1.FormPaint(Sender: TObject);
562562 var
563563 x1: integer;
564564 begin
565565 with Canvas do begin
566566 Line(x1,y1,x2,y2);
567567 end;
568568 end;
569569```
570570
571571Начиная с 0.9.31 Lazarus автозавершает параметры указателя. Например
572572
573573``` pascal
574574 procedure TForm1.FormCreate(Sender: TObject);
575575 begin
576576 CreateIconIndirect(@IconInfo);
577577 end;
578578```
579579
580580Поместите курсор в 'IconInfo' и нажмите `Ctrl`+`Shift`+`C` для автозавершения кода. Вы получите:
581581
582582``` pascal
583583 procedure TForm1.FormCreate(Sender: TObject);
584584 var
585585 IconInfo: TIconInfo;
586586 begin
587587 CreateIconIndirect(@IconInfo);
588588 end;
589589```
590590
591591Во всех приведенных выше примерах вы можете использовать `Ctrl`+`Shift`+`X`, чтобы отобразить диалоговое окно создания кода, в котором вы можете установить дополнительные параметры.
592592
593593### Автозавершение объявления вызываемой процедуры
594594
595595\[Механизм\] автозавершение кода может создать \[тело\] новой процедуры из места ее объявления.
596596
597597Допустим, вы просто написали объявление "`DoSomething(Width);`"
598598
599599``` pascal
600600procedure SomeProcedure;
601601var
602602 Width: integer;
603603begin
604604 Width:=3;
605605 DoSomething(Width);
606606end;
607607```
608608
609609Поместите курсор над идентификатором "DoSomething" и нажмите `Ctrl`+`Shift`+`C`, чтобы получить:
610610
611611``` pascal
612612procedure DoSomething(aWidth: LongInt);
613613begin
614614
615615end;
616616
617617procedure SomeProcedure;
618618var
619619 Width: integer;
620620begin
621621 Width:=3;
622622 DoSomething(Width);
623623end;
624624```
625625
626626Это еще не создает функции или методы.
627627
628628### Автозавершение предшествующего объявления класса
629629
630630"Автозавершение предшествующего объявления класса" является частью **Code Completion** \[(Автозавершения кода), который\] добавляет объявление для текущего тела метода в private \[разделе интерфейсной части модуля\]. Он вызывается, когда курсор находится в теле метода, еще не определенном в классе. Эта функция доступна с Lazarus 0.9.21.
631631
632632Например:
633633
634634``` pascal
635635 procedure TForm1.DoSomething(Sender: TObject);
636636 begin
637637 end;
638638```
639639
640640Метод DoSomething еще не объявлен в TForm1. Нажмите `Ctrl`+`Shift`+`C`, и в IDE будет добавлена "`procedure DoSomething(Sender: TObject);`" в private-разделе TForm1.
641641
642642Для дельфийцев: Автозавершение класса работает в Lazarus всегда одним способом: от класса интерфейсного \[раздела модуля\] к \[разделу\] реализации или наоборот, от класса в \[разделе\] реализации к \[разделу\] интерфейса. Delphi всегда вызывает оба направления. Недостаток способа Delphi заключается в том, что при опечатке легко создать новый метод, не заметив \[этого\].
643643
644644------------------------------------------------------------------------
645645
646646Прим.перев. 09:08, 30 October 2018 (CET): Очевидно имеется ввиду следующее: в Lazarus'е достаточно чуть изменить название метода (справедливо и для параметров) в интерфейсной части модуля и нажать `Ctrl`+`Shift`+`C`, и механизм Code Completion автоматически внесет правки в название уже имеющегося тела метода в разделе implementation. То же справедливо и для случая, когда меняется название метода (справедливо и для параметров) в разделе implementation, а затем вызывается Code Completion - в разделе interface будут внесены соответствующие правки.
647647
648648В Delphi, если тело метода уже существует, то изменение имени метода в разделе interface приведет к созданию тела метода в разделе implementation с измененным именем в дополнению к уже имеющемуся со старым именем. Это, естественно, вызовет ошибку при компиляции проекта.
649649
650650------------------------------------------------------------------------
651651
652652### Комментарии и автозавершение кода
653653
654654Автозавершение кода пытается сохранять комментарии, принадлежащие \[завершаемому коду\]. Например:
655655
656656``` pascal
657657 FList: TList; // список TComponent
658658 FInt: integer;
659659```
660660
661661При вставке новой переменной между FList и FInd комментарий сохраняется в строке FList. То же самое верно для
662662
663663``` pascal
664664 FList: TList; { список TComponent
665665 Это комментарий по нескольким строкам, начиная
666666    со строки FList, поэтому codetools предполагает, что он принадлежит
667667    к линии FLIst и не будет [терять с ним]
668668    связь. Код добавляется за комментарием.}
669669 FInt: integer;
670670```
671671
672672Если комментарий начинается со следующей строки, он будет обрабатываться так, как если бы он принадлежал коду ниже. Например:
673673
674674``` pascal
675675 FList: TList; // список TComponent
676676 { Этот комментарий относится к приведенному ниже операнду.
677677      Новый код вставлен над этим комментарием и
678678      позади комментария [для] FList.}
679679 FInt: integer;
680680```
681681
682682### Обновление метода
683683
684684Обычно автозавершение класса добавляет все отсутствующие тела методов. (Начиная с 0.9.27). Но если именно один метод отличается между \[объявлением в\] классе и теле, то тело метода обновляется. Например: у вас есть метод *DoSomething*.
685685
686686``` pascal
687687 public
688688 procedure DoSomething;
689689 end;
690690
691691procedure TForm.DoSomething;
692692begin
693693end;
694694```
695695
696696Теперь добавляем параметр:
697697
698698``` pascal
699699 public
700700 procedure DoSomething(i: integer);
701701 end;
702702```
703703
704704и вызываем автозавершение кода (`Ctrl`+`Shift`+`C`). Тело метода будет обновлено, а новый параметр будет скопирован:
705705
706706``` pascal
707707procedure TForm.DoSomething(i: integer);
708708begin
709709end;
710710```
711711
712712## Рефакторинг \[реорганизация кода\]
713713
714714### Инверсия присвоения
715715
716716Аннотация
717717
718718"Invert Assignments" \[("Инверсия присвоения")\] берет некоторые выбранные инструкции pascal и инвертирует все операнды из этого кода. Этот инструмент полезен для преобразования кода "save" в "load" и обратную операцию.
719719
720720Например:\
721721
722722``` pascal
723723procedure DoSomething;
724724begin
725725 AValueStudio:= BValueStudio;
726726 AValueAppartment :=BValueAppartment;
727727 AValueHouse:=BValueHouse;
728728end;
729729```
730730
731731Выделите строки с назначением (между началом и концом) и сделайте инвертирование назначений. Все назначения будут инвертированы, а идентификация будет добавлена автоматически. Например:
732732
733733Результат:
734734
735735``` pascal
736736procedure DoSomething;
737737begin
738738 BValueStudio := AValueStudio;
739739 BValueAppartment := AValueAppartment;
740740 BValueHouse := AValueHouse;
741741end;
742742```
743743
744744------------------------------------------------------------------------
745745
746746Прим.перев. 14:37, 1 November 2018 (CET): По умолчанию шоткаты для данной операции отсутствуют. Их легко определить самим, вызвав меню Tools --\> Options --\> Editor --\> Key Mappings --\> CodeTools Command --\> Invert Assignment
747747
748748------------------------------------------------------------------------
749749
750750### Заключить выделение \[в какую-либо конструкцию\]
751751
752752Выберите текст и вызовите \[эту команду (ПКМ --\> Enclose Selection) или `Ctrl`+`Shift`+`N`\]. Появится диалоговое окно, в котором вы можете выбрать, следует ли включить выделение в **try..finally** или многие другие общие блоки.
753753
754754### Переименование идентификатора
755755
756756Поместите курсор на идентификатор и вызовите \[эту команду (ПКМ --\> Rename Identifier) или `F2`\]. Появится диалоговое окно, в котором вы можете настроить область поиска и новое имя.
757757
758758- Это переименует все вхождения и только те, которые фактически используют это объявление. Это означает, что он не переименовывает объявления с тем же именем.
759759- И это сначала проверит конфликты имен.
760760- Ограничения: Это работает только с исходниками pascal, но не переименовывает файлы, не поддерживает ни файлы lfm/lrs, ни файлы lazdoc.
761761
762762### Поиски ссылок на идентификатор
763763
764764Поместите курсор на идентификатор и вызовите \[эту процедуру (ПКМ --\> Find --\> Find Identifier References) или `Ctrl`+`Shift`+`I`\]. Появится диалоговое окно, в котором вы можете настроить область поиска. Затем IDE будет искать все вхождения и только те, которые фактически используют это объявление. Это означает, что эта \[процедура\] не отображает другие объявления с таким же именем.
765765
766766### Показ абстрактных методов
767767
768768Эта функция перечисляет и автоматически завершает виртуальные, абстрактные методы, которые необходимо реализовать. Поместите курсор на объявление класса и вызовите \[эту функцию (ПКМ --\> Refactoring --\> Abstract Methods)\]. Если отсутствуют абстрактные методы, появится диалоговое окно с их перечислением. Выберите методы для реализации, и среда IDE создаст заглушки метода. Начиная с \[версии\] 1.3 Lazarus также добавляет недостающие методы *интерфейса класса*.
769769
770770### Извлечение процедуры
771771
772772См. [[IDE Window: Extract Procedure/ru|Extract Procedure]].
773773
774774## Поиск объявлений
775775
776776Поместите курсор на идентификатор и выполните 'Find Declaration' \[("Найти объявление")\]. Тогда это запустит поиск объявления этого идентификатора, откроет файл и перейдет к нему. Если курсор уже находится в объявлении, он перейдет к предыдущему объявлению с тем же именем. Это позволяет находить переназначения и переопределения.
777777
778778Каждое найденное объявление устанавливает точку перехода. Это означает, что вы прыгнете с найденного объявления \[к следующему найденному\] объявлению и легко вернетесь \[назад\] с помощью Search -\> Jump back.
779779
780780Существуют некоторые отличия от Delphi: утилиты кода работают с исходниками, следующим правилам обычного паскаля, вместо использования выходных \[файлов\] компилятора. Компилятор возвращает конечный тип. Утилиты кода видят исходники и все шаги между ними. Например:
781781
782782Свойство *Visible* сначала определяется в *TControl* (controls.pp), затем переопределяется в TCustomForm и, наконец, переопределяется в TForm. Вызов поиска объявления для \[свойства\] Visible сначала приведет вас к Visible в TForm. Затем вы снова можете вызвать Find Declaration \[("Поиск объявления")\], чтобы перейти к \[свойству\] Visible в TCustomForm, и снова, \[чтобы\] перейти к \[свойству\] Visible в TControl.
783783
784784То же самое верно и для таких типов, как *TColor*. Для компилятора это просто \[тип\] 'longint'. Но в исходниках он определяется как
785785
786786``` pascal
787787TGraphicsColor = -$7FFFFFFF-1..$7FFFFFFF;
788788TColor = TGraphicsColor;
789789```
790790
791791И то же самое \[справедливо\] для **forward defined classes** \[("предшествующего определения классов")\]: например, в *TControl*, есть private-переменная
792792
793793``` pascal
794794FHostDockSite: TWinControl;
795795```
796796
797797Поиск объявления в TWinControl перескочит в предшествующее определение
798798
799799``` pascal
800800TWinControl = class;
801801```
802802
803803А вызов его снова переведет к реальной реализации
804804
805805``` pascal
806806TWinControl = class(TControl)
807807```
808808
809809Таким образом вы можете отслеживать каждый идентификатор и находить каждую \[его\] перегрузку.
810810
811811### Подсказки
812812
813813- перейти назад `Ctrl`+`H`.
814814- местоположениям через меню: View -\> "jump history"
815815- для 5-кнопочной мыши добавьте две дополнительные кнопки для перемещения вперед/назад между посещенными точками
816816
817817
818818используя [[IDE Window: EditorMouseOptionsAdvanced|advanced mouse options]], кнопки можно переназначить.
819819
820820## Автозавершение идентификатора
821821
822822"Identifier Completion" \[("автозавершение идентификатора")\] вызывается \[комбинацией клавиш\] `Ctrl`+`space`. Это отображает все идентификаторы в области видимости. Например:
823823
824824``` pascal
825825procedure TForm1.FormCreate(Sender: TObject);
826826begin
827827 |
828828end;
829829```
830830
831831Поместите курсор между *begin* и *end* и нажмите `Ctrl`+`space`. IDE/Утилиты кода теперь будут анализировать весь доступный код и представлять список всех найденных идентификаторов. Утилиты кода кэшируют результаты, поэтому повторное использование этого кода будет намного быстрее.
832832
833833> **Note:** для Дельфийцев: в Дельфи это называется *Автозавершение кода*.
834834
835835Некоторые идентификаторы, такие как 'Write', 'ReadLn', 'Low', 'SetLength', 'Self', 'Result', 'Copy' встроены в компилятор и не определены нигде в исходниках. В автозавершении идентификатора также есть много таких вещей. Если вы обнаружите, что хоть один отсутствует, просто создайте запрос функции в багтрекере.
836836
837837*Автозавершение идентификатора* не автозавершает все *ключевые слова*. Поэтому вы не можете использовать его для автозавершения \[ключевого слова\] 'repe' до 'repeat'. Для этого используйте `Ctrl`+`W` [[Lazarus IDE Tools/ru|Автозавершение слова]] или `Ctrl`+`J` [[Lazarus IDE Tools/ru|Шаблоны кода]]. Начиная с версии 0.9.27 *автозавершение идентификатора* автозавершает некоторые ключевые слова.
838838
839839Автозавершение идентификатора показывает даже те идентификаторы, которые несовместимы.
840840
841841### Сопоставление только первой части слова
842842
843843Вы можете вызвать автозавершение идентификатора только по первым нескольким символам в слове. Поместите курсор внутри слова. Для поиска идентификаторов будут использоваться *только символы слева от курсора*. Например:
844844
845845``` pascal
846846procedure TForm1.FormCreate(Sender: TObject);
847847begin
848848 Ca|ption
849849end;
850850```
851851
852852Во \[всплывающем\] поле будут показаны только идентификаторы, начинающиеся с 'Ca' (\| указывает позицию курсора).
853853
854854### Клавиши
855855
856856- Буква или цифра: добавьте символ в редактор исходного кода и текущий префикс. Это обновит список.
857857- Backspace: удалит последний символ из исходного редактора и префикса. Обновляет список.
858858- Return: заменяет целое слово под курсором на выбранный идентификатор и закрывает всплывающее окно.
859859- Shift+Return: как *Return*, но заменяет только префикс (левая часть) слова под курсором.
860860- Up/Down: перемещает выделение
861861- Escape: закрывает всплывающее окно без изменений
862862- Tab: завершает префикс для следующего выбора. Например: текущий префикс 'But', а завершение идентификатора показывает только 'Button1' и 'Button1Click'. Тогда нажатие *Tab* завершит префикс 'Button1'.
863863- Else: как *Return* и добавляет символ в редактор исходного кода
864864
865865### Методы
866866
867867Когда курсор находится в определении класса, и ваш идентификатор завершает метод, определенный в классе предков, параметры и ключевое слово переопределения будут добавляться автоматически. Например:
868868
869869``` pascal
870870TMainForm = class(TForm)
871871protected
872872 mous|
873873end;
874874```
875875
876876Завершение **MouseDown** дает:
877877
878878``` pascal
879879TMainForm = class(TForm)
880880protected
881881 procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X,
882882 Y: Integer); override;
883883end;
884884```
885885
886886### Свойства
887887
888888``` pascal
889889property MyInt: integer read |;
890890```
891891
892892Автозавершение идентификатора покажет **FMyInt** и **GetMyInt**.
893893
894894``` pascal
895895property MyInt: integer write |;
896896```
897897
898898Автозавершение идентификатора покажет **FMyInt** и **SetMyInt**.
899899
900900### Секции Uses / Имена модулей
901901
902902В разделах uses автозавершение идентификатора будет отображать имена файлов всех модулей в пути поиска. Они все будут отображаться строчными буквами (например, *avl_tree*), потому что большинство модулей имеют имена файлов в нижнем регистре. По автозавершении они вставляются в том регистре, \[в каком модуль назван\] (например, *AVL_Tree*).
903903
904904### Операторы
905905
906906``` pascal
907907procedure TMainForm.Button1Click(Sender: TObject);
908908begin
909909 ModalRe|;
910910end;
911911```
912912
913913будет выглядеть так:
914914
915915``` pascal
916916procedure TMainForm.Button1Click(Sender: TObject);
917917begin
918918 ModalResult:=|;
919919end;
920920```
921921
922922### Иконки в окне автозавершения
923923
924924В Lazarus 1.9+ существует опция для отображения значков вместо "типов", для строк в окне автозавершения. На рисунке показаны эти значки:
925925
926-<img src="ide_completion_icons.png" title="ide_completion_icons.png" width="250" />
926+![](/wiki-images/e/e6/Ide_completion_icons.png)
927927
928928------------------------------------------------------------------------
929929
930930Прим.перев. 21:20, 6 November 2018 (CET): По умолчанию показ иконок отключен. Чтобы включить их, необходимо в меню Tools --\> Options --\> Codetools --\> Identifier Completion (Сервис --\> Параметры --\> Code tools --\> Завершение идентификаторов) в разделе Appearance (Внешний вид) отметить галочкой чекбокс "Icons in code completion box" ("Значки в окне автозавершения кода").
931931
932-<img src="icon_in_code_completion.png" title="icon_in_code_completion.png" width="500" />
932+![](/wiki-images/e/eb/Icon_in_code_completion.png)
933933
934934------------------------------------------------------------------------
935935
936936## Автозавершение слова
937937
938938*Word Completion* \[(автозавершение слова)\] вызывается \[сочетанием клавиш\] `Ctrl`+`W`. Оно отображает все слова всех открытых в настоящее время редакторов и поэтому может использоваться в не паскалевских исходниках, в комментариях и ключевых словах.
939939
940940В противном случае это работает так же, как и автозавершение идентификатора.
941941
942942## Словарь Модулей / Идентификатор (Cody)
943943
944944Это диалоговое окно позволяет вам искать идентификаторы в других модулях. Модули не должны использоваться вашим кодом.
945945
946946Эта функция является частью пакета "Cody". Чтобы активировать функцию, установите пакет.
947947
948948## Переход в директиву Include
949949
950950"Goto Include Directive" \[(переход в директиву Include)\] в меню поиска IDE переходит к выражению {\$I filename}, в котором используется текущий файл include.
951951
952952## Публикация проекта
953953
954954Создает копию всего проекта. Если вы хотите отправить кому-то только исходники и параметры компилятора вашего кода, эта функция является вашим другом.
955955
956956Обычный каталог проекта содержит много информации. Большинство из них не нужно публиковать: файл .lpi может содержать информацию о сеансе (например, позицию каретки и закладки закрытых блоков), а каталог проекта содержит много файлов .ppu, .o и исполняемый файл. Чтобы создать файл lpi только с базовой информацией, \[а также создать\] только исходники со всеми подкаталогами, используйте \[опцию\] "Publish Project" \[(опубликовать проект)\].
957957
958958> **Note:** Начиная с версии 0.9.13, есть новая \[опция в \] *Project Option*, которая позволяет хранить информацию о сеансе в \[другом\] файле отдельно от обычного файла .lpi. Этот новый файл заканчивается расширением .lps и содержит только информацию о сеансе, что значительно упрощает ваш файл .lpi.
959959
960960В диалоговом окне вы можете настроить фильтр для включения и исключения определенных файлов; с \[возможным выполнением\] команды после того, как вы архивируете выходные файлы.
961961
962962## Советы по комментариям
963963
964964В нескольких местах IDE показывает подсказки для идентификатора. Например, при перемещении мыши по идентификатору в редакторе исходного кода и ожидании нескольких секунд. Когда IDE показывает подсказку для идентификатора, она ищет объявление его и всех его предков, \[а также\] ищет комментарии и файлы fpdoc. Существует много стилей кодирования и много стилей комментариев. Чтобы поддерживать многие общие стили комментариев, среда IDE использует следующий \[механизм\] эвристики:
965965
966966### Комментарии, показанные в подсказке
967967
968968Комментарии перед объявлением без пустой строки и не начинающиеся со знака *\<*:
969969
970970``` pascal
971971var
972972 {Комментарий}
973973 Identifier: integer;
974974```
975975
976976Комментарии с знаком *\<* принадлежит к предыдущему идентификатору.
977977
978978Комментарии за идентификатором в одной строке:
979979
980980``` pascal
981981var
982982 identifier, // Комментарий
983983 other,
984984```
985985
986986Комментарии позади определения в той же строке:
987987
988988``` pascal
989989var
990990 identifier:
991991 char; // Комментарий
992992```
993993
994994Пример для знака **\<**:
995995
996996``` pascal
997997const
998998 a = 1;
999999 //< комментарий для a
10001000 b = 2;
10011001 // комментарий для c
10021002 c = 3;
10031003```
10041004
10051005Поддерживаются все три типа комментариев:
10061006
10071007``` pascal
10081008 {Комментарий}(*Комментарий*)//Комментарий
10091009 c = 1;
10101010```
10111011
10121012### Комментарии, не показываемые в подсказке
10131013
10141014Комментарии, начинающиеся с **\$** или **%**, игнорируются. Например, *//% Hiddden*, *//\$ Hidden*, *(*\$ Hidden*)*.
10151015
10161016Комментарии спереди, разделенные пустой строкой, рассматриваются как не относящиеся к следующему идентификатору. Например, следующий комментарий заголовка класса не отображается в подсказке:
10171017
10181018``` pascal
10191019type
10201020 { TMyClass }
10211021
10221022 TMyClass = class
10231023```
10241024
10251025Комментарии заголовка класса создаются при завершении класса. Вы можете отключить эту \[опцию\] в *Options / Codetools / Class completion / Header comment for class* (*Параметры / Code tools / Завершение классов / Комментарий перед заголовком класса*). Если вы хотите показать комментарий заголовка в подсказке, просто удалите пустую строку.
10261026
10271027Следующий комментарий будет показан для GL_TRUE, но не для GL_FALSE:
10281028
10291029``` pascal
10301030 // Boolean
10311031 GL_TRUE = 1;
10321032 GL_FALSE = 0;
10331033```
10341034
10351035## Быстрые исправления
10361036
10371037Быстрые исправления - это пункты меню для конкретных сообщений компилятора. Они помогают быстро решить проблему. Выберите сообщение в окне «Сообщения» и щелкните правой кнопкой мыши или щелкните правой кнопкой мыши в редакторе исходного кода на значке слева.
10381038
10391039- Unit not found \[модуль не найден\]: удалите из раздела uses
10401040- Unit not found \[модуль не найден\]: найдите модуль в загруженных пакетах и разрешите автоматическое добавление зависимости пакета
10411041- Constructing a class "\$1" with abstract method "\$2" \[Создание класса "\$1" с абстрактным методом "\$2"\]: показ диалогового окна для переопределения всех абстрактных методов
10421042- Local variable "\$1" not used \[Локальная переменная "\$1" не используется\]: удалите определение
10431043- Circular unit reference between \$1 and \$2 \[циркулярная ссылка модуля между \$1 и \$2\]: показывает диалоговое окно зависимостей с полным путем между двумя модулями
10441044- Identifier not found \[Идентификатор не найден\]: поиск через браузер кода
10451045- Identifier not found \[Идентификатор не найден\]: поиск через словарь Cody (нужен пакет [[Cody]])
10461046- Identifier not found \[Идентификатор не найден\]: добавьте локальную переменную
10471047- Recompiling \$1, checksum changed for \$2 \[Перекомпиляция \$1, контрольная сумма изменена для \$2\]: показать диалог с путями поиска и другой информацией
10481048- IDE warning: other sources path of package %s contains directory... \[Предупреждение IDE: другие пути исходников пакета %s содержит каталог ...:\]: откройте пакет
10491049- any hint, note, warning \[любые подсказки, примечания, предупреждения\]: добавьте директиву IDE {%H-}
10501050- any hint, note, warning \[любые подсказки, примечания, предупреждения\]: добавьте директиву компилятора {\$warn id off} (начиная с 1.7)
10511051- any hint, note, warning \[любые подсказки, примечания, предупреждения\]: добавьте опцию компилятора -vm\<messageid\>
10521052- Local variable "i" does not seem to be initialized \[Локальная переменная "i", похоже, не инициализирована\]: вставьте присвоение (начиная с 1.5)
10531053- Inherited method is hidden \[Унаследованный метод скрыт\]: добавьте модификатор override, overload, или reintroduce (начиная с 1.9)
10541054
10551055## Контур
10561056
10571057Этот параметр находится в диалоговом окне Options --\> Editor --\> Display --\> Markup and Matches --\> Outline (global) \[Параметры --\> Редактор --\> Отображение --\> Подсветка и соответствия --\> Отображать контур блока(глобально)\].
10581058
10591059Он выделяет ключевые слова Pascal вместе со своими операторными(begin-end) скобками. Это позволяет видеть вложенность больших блоков.
10601060
10611061Например, для такого тела процедуры:
10621062
10631063``` pascal
10641064 with ADockObject do
10651065 begin
10661066 if DropAlign = alNone then
10671067 begin
10681068 if DropOnControl <> nil then
10691069 DropAlign := DropOnControl.GetDockEdge(DropOnControl.ScreenToClient(DragPos))
10701070 else
10711071 DropAlign := Control.GetDockEdge(DragTargetPos);
10721072 end;
10731073 PositionDockRect(Control, DropOnControl, DropAlign, FDockRect);
10741074 end;
10751075```
10761076
10771077он подсвечивает:
10781078
10791079- внешний with-do-begin-end оранжевым
10801080- следующий if-then-begin-end зеленым
10811081- внутренний if-then-else голубым
10821082
10831083![](/wiki-images/3/3c/Ide_outline.png)
10841084
10851085---
10861086*From the Free Pascal wiki, page "Lazarus IDE Tools/ru", as it stood on 2021-11-19 after a change by AMXS52, 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