Sign in Join
Wiki copytemporary

Lazarus IDE Tools/ru: what changed

Revision 1 to 2. 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|----|----|
11-| [[Lazarus IDE Tools|Переход на объявление]] | <span class="kbd">Ctrl</span>+ЛКМ или <span class="kbd">Alt</span>+<span class="kbd">Up</span> (Переход на объявление типа или переменной) |
12-| [[Lazarus IDE Tools/ru|Переход на метод класса]] | <span class="kbd">Ctrl</span>+<span class="kbd">Shift</span>+<span class="kbd">Up</span> (Переход туда сюда между объявлением и телом метода) |
13-| [[Lazarus IDE Tools/ru|Шаблоны кода]] | <span class="kbd">Ctrl</span>+<span class="kbd">J</span> |
14-| [[Lazarus IDE Tools/ru|Синхронная правка]] | <span class="kbd">Ctrl</span>+<span class="kbd">J</span> (Пока текст выделен) |
15-| [[Lazarus IDE Tools/ru|Завершение кода]] (Завершение класса) | <span class="kbd">Ctrl</span>+<span class="kbd">Shift</span>+<span class="kbd">C</span> |
16-| [[Lazarus IDE Tools|Завершение идентификатора]] | <span class="kbd">Ctrl</span>+<span class="kbd">space</span> |
17-| [[Lazarus IDE Tools|Завершение слова]] | <span class="kbd">Ctrl</span>+<span class="kbd">W</span> |
18-| [[Lazarus IDE Tools/ru|Подсказка для параметров]] | <span class="kbd">Ctrl</span>+<span class="kbd">Shift</span>+<span class="kbd">space</span> |
19-| [[Lazarus IDE Tools/ru|Последовательный поиск]] | <span class="kbd">Ctrl</span>+<span class="kbd">E</span> |
11+| [[Lazarus IDE Tools|Переход на объявление]] | `Ctrl`+ЛКМ или `Alt`+`Up` (Переход на объявление типа или переменной) |
12+| [[Lazarus IDE Tools/ru|Переход на метод класса]] | `Ctrl`+`Shift`+`Up` (Переход туда сюда между объявлением и телом метода) |
13+| [[Lazarus IDE Tools/ru|Шаблоны кода]] | `Ctrl`+`J` |
14+| [[Lazarus IDE Tools/ru|Синхронная правка]] | `Ctrl`+`J` (Пока текст выделен) |
15+| [[Lazarus IDE Tools/ru|Завершение кода]] (Завершение класса) | `Ctrl`+`Shift`+`C` |
16+| [[Lazarus IDE Tools|Завершение идентификатора]] | `Ctrl`+`space` |
17+| [[Lazarus IDE Tools|Завершение слова]] | `Ctrl`+`W` |
18+| [[Lazarus IDE Tools/ru|Подсказка для параметров]] | `Ctrl`+`Shift`+`space` |
19+| [[Lazarus IDE Tools/ru|Последовательный поиск]] | `Ctrl`+`E` |
2020
2121## Переход между методом и его объявлением
2222
23-Для перехода между телом процедуры (begin..end) и объявлением процедуры (procedure Name;) используйте <span class="kbd">Ctrl</span>+<span class="kbd">Shift</span>+<span class="kbd">Up</span>.
23+Для перехода между телом процедуры (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
39-Если курсор стоит на теле процедуры и Вы нажмёте <span class="kbd">Ctrl</span>+<span class="kbd">Shift</span>+<span class="kbd">Up</span>, то курсор перескочит на объявление, потом опять <span class="kbd">Ctrl</span>+<span class="kbd">Shift</span>+<span class="kbd">Up</span> и курсор перескочит на тело процедуры, после 'begin'.
39+Если курсор стоит на теле процедуры и Вы нажмёте `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
114-По умолчанию горячие клавиши для шаблонов кода <span class="kbd">Ctrl</span>+<span class="kbd">J</span>. Вы можете ввести идентификатор, нажать <span class="kbd">Ctrl</span>+<span class="kbd">J</span> и идентификатор заменится на текст определенный для этого идентификатора. Шаблоны кода можно задать в Environment -\> Editor Options -\> CodeTools.
114+По умолчанию горячие клавиши для шаблонов кода `Ctrl`+`J`. Вы можете ввести идентификатор, нажать `Ctrl`+`J` и идентификатор заменится на текст определенный для этого идентификатора. Шаблоны кода можно задать в Environment -\> Editor Options -\> CodeTools.
115115
116-Пример: Введите идентификатор 'classf', поставьте курсор справа от 'f' и нажмите <span class="kbd">Ctrl</span>+<span class="kbd">J</span>. Идентификатор 'classf' будет заменен на
116+Пример: Введите идентификатор '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
130-Вы можете посмотреть список шаблонов установив курсор на пустое место (не на идентификатор) и нажав <span class="kbd">Ctrl</span>+<span class="kbd">J</span>. Список шаблонов кода появится. Используйте стрелки, или введите несколько символов чтобы выбрать нужный шаблон. <span class="kbd">Enter</span> создаст выделенный шаблон, а <span class="kbd">Escape</span> закроет список шаблонов.
130+Вы можете посмотреть список шаблонов установив курсор на пустое место (не на идентификатор) и нажав `Ctrl`+`J`. Список шаблонов кода появится. Используйте стрелки, или введите несколько символов чтобы выбрать нужный шаблон. `Enter` создаст выделенный шаблон, а `Escape` закроет список шаблонов.
131131
132-Больше всего времени экономит шаблон 'b'+<span class="kbd">Ctrl</span>+<span class="kbd">J</span> для begin..end.
132+Больше всего времени экономит шаблон 'b'+`Ctrl`+`J` для begin..end.
133133
134134## Подсказка для параметров
135135
136136Подсказка для параметров позволяет посмотреть список параметров для процедур и функций. Жирным шрифтом выделяется текущий параметр.
137137
138138Например:
139139
140140``` pascal
141141 Canvas.FillRect();
142142```
143143
144-Поместите курсор внутри скобок и нажмите <span class="kbd">Ctrl</span>+<span class="kbd">Shift</span>+<span class="kbd">space</span>. Появится подсказка с параметрами процедуры FillRect.
144+Поместите курсор внутри скобок и нажмите `Ctrl`+`Shift`+`space`. Появится подсказка с параметрами процедуры FillRect.
145145
146-<figure>
147-<img src="Parameterhints1.png" title="Parameterhints1.png" />
148-<figcaption>Parameterhints1.png</figcaption>
149-</figure>
146+![](/wiki-images/c/c8/Parameterhints1.png)
150147
151148Начиная с версии 0.9.31, справа от каждой декларации имеется кнопка, вставляющая отсутствующие параметры. Это скопирует имена параметров из выбранного объявления в позицию курсора.
152149
153-<figure>
154-<img src="Parameterhints2.png" title="Parameterhints2.png" />
155-<figcaption>Parameterhints2.png</figcaption>
156-</figure>
150+![](/wiki-images/4/48/Parameterhints2.png)
157151
158152Подсказка: используйте [[Lazarus IDE Tools/ru|Автозавершение объявления переменной]], чтобы объявить переменные.
159153
160154> **Note:** Имя ярлычка - "Show code context"\[("Показать контекст кода")\].
161155
162156## Последовательный поиск
163157
164-Последовательный поиск изменяет строку состояния редактора исходного кода. Введите несколько символов, и редактор тут же будет их искать, выделяя все вхождения в тексте. Для вызова поиска, нажмите: <span class="kbd">Ctrl</span>+<span class="kbd">e</span>.
158+Последовательный поиск изменяет строку состояния редактора исходного кода. Введите несколько символов, и редактор тут же будет их искать, выделяя все вхождения в тексте. Для вызова поиска, нажмите: `Ctrl`+`e`.
165159
166-- Например, нажмите <span class="kbd">e</span> произведёт поиск и выделение всех букв «е» в коде.
167-- Затем, нажав <span class="kbd">t</span> будет произведён поиск и выделение всех вхождений «et» и так далее.
168-- Вы можете использовать быстрый переход между найденными позициями в тексте нужной строки. Для быстрого перехода вниз по тексту, используйте <span class="kbd">F3</span> (или <span class="kbd">Ctrl</span>+<span class="kbd">e</span> во время поиска). Для быстрого перехода вверх по тексту, используйте <span class="kbd">Shift</span>+<span class="kbd">F3</span>.
169-- <span class="kbd">Backspace</span> удаляет последний символ
170-- <span class="kbd">Enter</span> останавливает поиск без добавления новой строки в редакторе.
171-- Вы можете возобновить последний поиск, нажав <span class="kbd">Ctrl</span>+<span class="kbd">e</span> во второй раз, сразу же после начала последовательного поиска используя <span class="kbd">Ctrl</span>+<span class="kbd">e</span>. т.е. когда строка поиска пуста.
172-- Вставка <span class="kbd">Ctrl</span>+<span class="kbd">V</span> добавит строку из буфера обмена к текущему искомому тексту. (так же как в lazarus 0.9.27 r19824).
160+- Например, нажмите `e` произведёт поиск и выделение всех букв «е» в коде.
161+- Затем, нажав `t` будет произведён поиск и выделение всех вхождений «et» и так далее.
162+- Вы можете использовать быстрый переход между найденными позициями в тексте нужной строки. Для быстрого перехода вниз по тексту, используйте `F3` (или `Ctrl`+`e` во время поиска). Для быстрого перехода вверх по тексту, используйте `Shift`+`F3`.
163+- `Backspace` удаляет последний символ
164+- `Enter` останавливает поиск без добавления новой строки в редакторе.
165+- Вы можете возобновить последний поиск, нажав `Ctrl`+`e` во второй раз, сразу же после начала последовательного поиска используя `Ctrl`+`e`. т.е. когда строка поиска пуста.
166+- Вставка `Ctrl`+`V` добавит строку из буфера обмена к текущему искомому тексту. (так же как в lazarus 0.9.27 r19824).
173167
174168### Пример использования последовательного поиска для поиска слова
175169
176170- Поместите курсор на нужное слово, не выделяя его
177-- Нажмите <span class="kbd">Ctrl</span>+<span class="kbd">C</span>. Редактор исходного кода выделит слово и скопирует его в буфер обмена.
178-- Нажмите <span class="kbd">Ctrl</span>+<span class="kbd">E</span> для начала последовательного поиска
179-- Нажмите <span class="kbd">Ctrl</span>+<span class="kbd">V</span> для поиска идентификатора (так же, как в 0.9.27)
180-- Используйте <span class="kbd">F3</span> и <span class="kbd">Shift</span>+<span class="kbd">F3</span> для быстрого перехода к следующему / предыдущему найденному участку текста.
171+- Нажмите `Ctrl`+`C`. Редактор исходного кода выделит слово и скопирует его в буфер обмена.
172+- Нажмите `Ctrl`+`E` для начала последовательного поиска
173+- Нажмите `Ctrl`+`V` для поиска идентификатора (так же, как в 0.9.27)
174+- Используйте `F3` и `Shift`+`F3` для быстрого перехода к следующему / предыдущему найденному участку текста.
181175- Используйте любую клавишу (например курсор влево или вправо), чтобы закончить поиск
182176
183177## Синхронная правка
184178
185179Синхронная правка позволяет редактировать все места присутствия слова в тексте одновременно (синхронно). Вы просто изменяете, слово в одном месте и все остальные вхождения слова в тексте изменяются автоматически.
186180
187181Синхронная правка влияет на все слова в выделенной области текста. Пример использования:
188182
189183- Выделите блок текста
190-- Нажмите <span class="kbd">Ctrl</span>+<span class="kbd">J</span> или воспользуйтесь соответствующим значком. (Это работает только, если есть какие-либо слова, которые встречаются более одного раза в выделенном тексте.)
191-- Используйте клавишу <span class="kbd">tab</span> для выделения слова, которое вы хотите изменить. (если было выделено несколько разных слов более одного раза)
184+- Нажмите `Ctrl`+`J` или воспользуйтесь соответствующим значком. (Это работает только, если есть какие-либо слова, которые встречаются более одного раза в выделенном тексте.)
185+- Используйте клавишу `tab` для выделения слова, которое вы хотите изменить. (если было выделено несколько разных слов более одного раза)
192186- Измените слово
193-- Нажмите <span class="kbd">Esc</span> для окончание работы с синхронной правкой
187+- Нажмите `Esc` для окончание работы с синхронной правкой
194188
195189См. анимированный пример [[New IDE features since|здесь]]
196190
197-> **Note:** <span class="kbd">Ctrl</span>+<span class="kbd">J</span> также используется для редактирования шаблона. \[Это сочетание клавиш\] переключает свое значение, если вы выберете какой-то текст.
191+> **Note:** `Ctrl`+`J` также используется для редактирования шаблона. \[Это сочетание клавиш\] переключает свое значение, если вы выберете какой-то текст.
198192
199193## Поиск следующего / предыдущего вхождения слова
200194
201195Обе функции можно найти в контекстном меню редактора исходного кода
202196
203197- Редактор кода / контекстное меню / Найти / Найти следующее вхождение слова
204198- Редактор кода / контекстное меню / Найти / Найти предыдущее вхождение слова
205199
206200Вы можете назначить данным пунктам сочетания клавиш в окне настройки редактора исходного кода. Для этого выберите меню "Сервис-\>Параметры" и в левой части появившегося окна выберите "Редактор-\>Комбинации клавиш".
207201
208202## Автозавершение Кода
209203
210-Автозавершение кода можно найти в меню IDE Edit -\> Complete Code, а так же используя сочетания клавиш: <span class="kbd">Ctrl</span>+<span class="kbd">Shift</span>+<span class="kbd">C</span>.
204+Автозавершение кода можно найти в меню IDE Edit -\> Complete Code, а так же используя сочетания клавиш: `Ctrl`+`Shift`+`C`.
211205
212-Для Делфистов: В Delphi, это называется "автозавершение кода"(code completion) - специальная функция, показывающая список идентификаторов, в текущей позиции исходного кода ((<span class="kbd">Ctrl</span>+<span class="kbd">Пробел</span>). В Lazarus это называется "автозавершение идентификаторов"(Identifier completion).
206+Для Делфистов: В Delphi, это называется "автозавершение кода"(code completion) - специальная функция, показывающая список идентификаторов, в текущей позиции исходного кода ((`Ctrl`+`Пробел`). В Lazarus это называется "автозавершение идентификаторов"(Identifier completion).
213207
214208Автозавершение кода сочетает в себе несколько мощных функций, например:
215209
216210- [[Lazarus IDE Tools/ru|Автозавершение класса]]: завершает объявление свойств, добавляет/обновляет тело метода, добавляет переменные и методы в раздел private класса.
217211- [[Lazarus IDE Tools/ru|Автозавершение предварительно объявленной процедуры]]: добавляет тело процедуры.
218212- [[Lazarus IDE Tools/ru|Автозавершение назначенных процедур обработки событий]]: завершает связи с событием, добавляя определения методов и их тел.
219213- [[Lazarus IDE Tools/ru|Автозавершение объявления переменной]]: добавляет определённые локальные переменные.
220214- [[Lazarus IDE Tools/ru|Автозавершение объявления вызываемой процедуры]]: добавляет новую процедуру.
221215- Reversed procedure completion: добавление объявления процедур/функций (Прим.перев. 08:28, 26 October 2018 (CEST): Раздел временно отсутствует)
222216- [[Lazarus IDE Tools/ru|Автозавершение предшествующего объявления класса]]: добавление объявления метода для тела метода внутри класса.
223217
224218Какая из этих функций будет использована, зависит от позиции курсора в редакторе кода.
225219
226-Автозавершение кода можно найти в меню IDE Edit -\> Complete Code, \[а также вызвать\] стандартным сочетанием клавиш <span class="kbd">Ctrl</span>+<span class="kbd">Shift</span>+<span class="kbd">C</span>.
220+Автозавершение кода можно найти в меню IDE Edit -\> Complete Code, \[а также вызвать\] стандартным сочетанием клавиш `Ctrl`+`Shift`+`C`.
227221
228222### Автозавершение класса
229223
230224Наиболее мощная функция завершения кода является "Автозавершение класса". Вы пишете скелет класса, добавляя в него методы и свойства. Автозавершение кода автоматически завершит их объявления, добавив нужные переменные, тело для реализации метода или свойства, определит способ доступа к ним а так же поля класса.
231225
232226Например: создайте класс (для быстроты можете использовать шаблоны кода):
233227
234228``` pascal
235229 TExample = class(TObject)
236230 public
237231 constructor Create;
238232 destructor Destroy; override;
239233 end;
240234```
241235
242-Поместите курсор где-то внутри класса и нажмите <span class="kbd">Ctrl</span>+<span class="kbd">Shift</span>+<span class="kbd">C</span>. Это позволит создать скелет для реализации методов и поместит курсор внутри тела метода:
236+Поместите курсор где-то внутри класса и нажмите `Ctrl`+`Shift`+`C`. Это позволит создать скелет для реализации методов и поместит курсор внутри тела метода:
243237
244238``` pascal
245239 { TExample }
246240
247241 constructor TExample.Create;
248242 begin
249243 |
250244 end;
251245
252246 destructor TExample.Destroy;
253247 begin
254248 inherited Destroy;
255249 end;
256250```
257251
258252> **Note:** символом '\|' обозначена позиция курсора в коде.
259253
260-Подсказка: Вы можете переключаться между методом и его телом, используя клавиши <span class="kbd">Ctrl</span>+<span class="kbd">Shift</span>+<span class="kbd">Up</span>.
254+Подсказка: Вы можете переключаться между методом и его телом, используя клавиши `Ctrl`+`Shift`+`Up`.
261255
262256Вы можете увидеть, что IDE добавило вызов 'inherited Destroy'. Это происходит, когда в объявлении метода используется ключевое слово 'override'.
263257
264258Теперь добавьте метод DoSomething:
265259
266260``` pascal
267261 TExample = class(TObject)
268262 public
269263 constructor Create;
270264 procedure DoSomething(i: integer);
271265 destructor Destroy; override;
272266 end;
273267```
274268
275-Нажмите <span class="kbd">Ctrl</span>+<span class="kbd">Shift</span>+<span class="kbd">C</span> и IDE завершит его, добавив:
269+Нажмите `Ctrl`+`Shift`+`C` и IDE завершит его, добавив:
276270
277271``` pascal
278272 procedure TExample.DoSomething(i: integer);
279273 begin
280274 |
281275 end;
282276```
283277
284278Вы можете определить поведение вставки кода в Environment \> Codetools Options -\> Code Creation.
285279
286280**Завершение свойств**\
287281Добавьте свойство AnInteger:
288282
289283``` pascal
290284 TExample = class(TObject)
291285 public
292286 constructor Create;
293287 procedure DoSomething(i: integer);
294288 destructor Destroy; override;
295289 property AnInteger: Integer;
296290 end;
297291```
298292
299293Нажмите Ctrl+Shift+C и вы получите:
300294
301295``` pascal
302296 procedure TExample.SetAnInteger(const AValue: integer);
303297 begin
304298 |if FAnInteger=AValue then exit;
305299 FAnInteger:=AValue;
306300 end;
307301```
308302
309-Функция автозавершения кода добавила поля класса и метод, используемые при обращении к свойству. Нажмите <span class="kbd">Ctrl</span>+<span class="kbd">Shift</span>+<span class="kbd">Up</span> для просмотра определения класса:
303+Функция автозавершения кода добавила поля класса и метод, используемые при обращении к свойству. Нажмите `Ctrl`+`Shift`+`Up` для просмотра определения класса:
310304
311305``` pascal
312306 TExample = class(TObject)
313307 private
314308 FAnInteger: integer;
315309 procedure SetAnInteger(const AValue: integer);
316310 public
317311 constructor Create;
318312 procedure DoSomething(i: integer);
319313 destructor Destroy; override;
320314 property AnInteger: integer read FAnInteger write SetAnInteger;
321315 end;
322316```
323317
324318Свойство было изменено. Добавлены ключевые слова Read и Write. Класс получил новый раздел 'private' с полем 'FAnInteger' и методом 'SetAnInteger'. Это общий стиль Delphi, использовать в названиях полей букву 'F' (Field). И в методах на запись слово 'Set'. Данные настройки можно изменить в Environment \> Codetools Options -\> Code Creation.
325319
326320Создание свойства только для чтения:
327321
328322``` pascal
329323 property PropName: PropType read;
330324```
331325
332326Будет расширено до:
333327
334328``` pascal
335329 property PropName: PropType read FPropName;
336330```
337331
338332Создание свойства только для записи:
339333
340334``` pascal
341335 property PropName: PropType write;
342336```
343337
344338Будет расширено до:
345339
346340``` pascal
347341 property PropName: PropType write SetPropName;
348342```
349343
350344Создание свойства только для чтения с указанием метода:
351345
352346``` pascal
353347 property PropName: PropType read GetPropName;
354348```
355349
356350Будет добавлена функция GetPropName:
357351
358352``` pascal
359353 function GetpropName: PropType;
360354```
361355
362356Создание свойства с ключевым словом stored:
363357
364358``` pascal
365359 property PropName: PropType stored;
366360```
367361
368362Будет расширено до:
369363
370364``` pascal
371365 property PropName: PropType read FPropName write SetPropName stored PropNameIsStored;
372366```
373367
374368Так как ключевое слово `stored` используется для потокового чтения и записи, нужные поля и процедуры также будут добавлены автоматически.
375369
376370Подсказка: Автозавершение идентификатора также распознает неполные свойства и \[взамен\] предлагает имена по умолчанию. Например:
377371
378372``` pascal
379373property PropName: PropType read |;
380374```
381375
382-Поместите курсор сразу за ключевым словом **read** и нажмите <span class="kbd">Ctrl</span>+<span class="kbd">Space</span> для автозавершения идентификатора. Он предоставит вам переменную **FPropName** и процедуру **SetPropName**.
376+Поместите курсор сразу за ключевым словом **read** и нажмите `Ctrl`+`Space` для автозавершения идентификатора. Он предоставит вам переменную **FPropName** и процедуру **SetPropName**.
383377
384378### Автозавершение предварительно объявленной процедуры
385379
386380"Автозавершение предварительно объявленной процедуры" является частью автозавершения кода и добавляет отсутствующее тело процедуры. Оно вызывается, когда курсор находится в объявлении заданной процедуры.
387381
388382Например: Добавьте новую процедуру в раздел интерфейса:
389383
390384``` pascal
391385 procedure DoSomething;
392386```
393387
394-Поместите в нее курсор и нажмите <span class="kbd">Ctrl</span>+<span class="kbd">Shift</span>+<span class="kbd">C</span> для автозавершения кода. Он будет создан в разделе реализации:
388+Поместите в нее курсор и нажмите `Ctrl`+`Shift`+`C` для автозавершения кода. Он будет создан в разделе реализации:
395389
396390``` pascal
397391 procedure DoSomething;
398392 begin
399393 |
400394 end;
401395```
402396
403-Подсказка: вы можете быстро перемещаться между объявлением процедуры и ее телом с помощью <span class="kbd">Ctrl</span>+<span class="kbd">Shift</span>+<span class="kbd">Up</span>.
397+Подсказка: вы можете быстро перемещаться между объявлением процедуры и ее телом с помощью `Ctrl`+`Shift`+`Up`.
404398
405399Новое тело процедуры будет добавлено перед методами класса. Если в интерфейсе уже есть некоторые процедуры, IDE попытается сохранить \[их\] порядок. Например:
406400
407401``` pascal
408402 procedure Proc1;
409403 procedure Proc2; // новая процедура
410404 procedure Proc3;
411405```
412406
413407Если тела Proc1 и Proc3 уже существуют, то тело Proc2 будет вставлено между телами Proc1 и Proc3. Такое поведение можно настроить в Environment \> Codetools Options -\> Code Creation.
414408
415409Несколько процедур:
416410
417411``` pascal
418412 procedure Proc1_Old; // тело [процедуры уже] существует
419413 procedure Proc2_New; // тело [процедуры еще] не существует
420414 procedure Proc3_New; // "
421415 procedure Proc4_New; // "
422416 procedure Proc5_Old; // тело [процедуры уже] существует
423417```
424418
425419Автозавершение кода добавит тела всех 3 процедур(Proc2_New, Proc3_New, Proc4_New).
426420
427421Почему это называется "Автозавершение предварительно объявленной процедуры"?
428422
429423Потому что это работает не только для процедур, определенных в интерфейсе, но и для процедур\[, определенных\] с помощью "предварительно объявленного" модификатора. И потому что утилиты кода обрабатывают процедуры в интерфейсе как имеющие неявный "предварительно объявленный" модификатор.
430424
431425### Автозавершение назначенных процедур обработки событий
432426
433427"Автозавершение назначенных процедур обработки событий" является частью автозавершения кода и завершает единственный оператор Event:=\|. Он вызывается, когда курсор находится за назначенным событием.
434428
435429Например: В методе, скажем, событие FormCreate, добавьте строку 'OnPaint:=':
436430
437431``` pascal
438432procedure TForm1.Form1Create(Sender: TObject);
439433begin
440434 OnPaint:=|
441435end;
442436```
443437
444-'\|' - это курсор, и его не следует вводить. Затем нажмите <span class="kbd">Ctrl</span>+<span class="kbd">Shift</span>+<span class="kbd">C</span> для завершения кода. Оператор будет завершен
438+'\|' - это курсор, и его не следует вводить. Затем нажмите `Ctrl`+`Shift`+`C` для завершения кода. Оператор будет завершен
445439
446440``` pascal
447441OnPaint:=@Form1Paint;
448442```
449443
450444Новый метод Form1Paint будет добавлен в класс TForm1. Затем запустится автозавершение класса, и вы получите:
451445
452446``` pascal
453447procedure TForm1.Form1Paint(Sender: TObject);
454448begin
455449 |
456450end;
457451```
458452
459453Это работает так же, как добавление методов в инспекторе объектов.
460454
461455> **Note:** Вы должны поместить курсор сразу после оператора присваивания ':='. Если вы поместите курсор на идентификатор (например, OnPaint), то автозавершение кода вызовет «Автозавершение локальной переменной», что не удастся, поскольку OnPaint уже определен.
462456
463457Подсказка:\
464458*Вы можете выбрать видимость по умолчанию для нового метода в разделе Tools / Options / Codetools / Class Completion / Default (начиная с версии 1.8)
465459
466460- Вы можете определить имя нового метода самостоятельно. Например:
467461
468462``` pascal
469463 OnPaint:=@ThePaintMethod;
470464```
471465
472466Начиная с 0.9.31 Lazarus автозавершает параметры процедуры. Например
473467
474468``` pascal
475469procedure TForm1.FormCreate(Sender: TObject);
476470var
477471 List: TList;
478472begin
479473 List:=TList.Create;
480474 List.Sort(@MySortFunction|);
481475end;
482476```
483477
484-Поместите курсор на 'MySortFunction' и нажмите <span class="kbd">Ctrl</span>+<span class="kbd">Shift</span>+<span class="kbd">C</span> для автозавершения кода. Вы получите новую процедуру:
478+Поместите курсор на 'MySortFunction' и нажмите `Ctrl`+`Shift`+`C` для автозавершения кода. Вы получите новую процедуру:
485479
486480``` pascal
487481function MySortFunction(Item1, Item2: Pointer): Integer;
488482begin
489483 |
490484end;
491485
492486procedure TForm1.FormCreate(Sender: TObject);
493487var
494488 List: TList;
495489begin
496490 List:=TList.Create;
497491 List.Sort(@MySortFunction);
498492end;
499493```
500494
501495### Автозавершение объявления переменной
502496
503497"Автозавершение объявления переменной" является частью завершения кода и добавляет определение локальной переменной для \[оператора\] `Identifier:=Term` \[(Идентификатор:=Выражение)\]. Он вызывается, когда курсор находится на идентификаторе присвоения или параметра.
504498
505499Например:
506500
507501``` pascal
508502procedure TForm1.Form1Create(Sender: TObject);
509503begin
510504 i:=3;
511505end;
512506```
513507
514-Поместите курсор на '`i`' или сразу за ним. Затем нажмите <span class="kbd">Ctrl</span>+<span class="kbd">Shift</span>+<span class="kbd">C</span> для автозавершения кода, и вы получите:
508+Поместите курсор на '`i`' или сразу за ним. Затем нажмите `Ctrl`+`Shift`+`C` для автозавершения кода, и вы получите:
515509
516510``` pascal
517511procedure TForm1.Form1Create(Sender: TObject);
518512var
519513 i: Integer;
520514begin
521515 i:=3;
522516end;
523517```
524518
525519Утилиты кода сначала проверяют код \[на наличие объявления\] идентификатора '`i`', и если \[таковой не найден\], то добавляют объявление '`var i: integer;`'. Тип идентификатора угадывается из выражения\[, расположенного\] справа от оператора присвоения '`:=`'. Числа, такие как 3, по умолчанию \[будут иметь тип\] Integer.
526520
527521Другой пример:
528522
529523``` pascal
530524type
531525 TWhere = (Behind, Middle, InFront);
532526
533527 procedure TForm1.Form1Create(Sender: TObject);
534528 var
535529 a: array[TWhere] of char;
536530 begin
537531 for Where:=Low(a) to High(a) do writeln(a[Where]);
538532 end;
539533```
540534
541-Поместите курсор на 'Where' и нажмите <span class="kbd">Ctrl</span>+<span class="kbd">Shift</span>+<span class="kbd">C</span> для автозавершения кода. Вы получите:
535+Поместите курсор на 'Where' и нажмите `Ctrl`+`Shift`+`C` для автозавершения кода. Вы получите:
542536
543537``` pascal
544538 procedure TForm1.Form1Create(Sender: TObject);
545539 var
546540 a: array[TWhere] of char;
547541 Where: TWhere;
548542 begin
549543 for Where:=Low(a) to High(a) do writeln(a[Where]);
550544 end;
551545```
552546
553547Начиная с 0.9.11 Lazarus также автозавершает параметры. Например
554548
555549``` pascal
556550 procedure TForm1.FormPaint(Sender: TObject);
557551 begin
558552 with Canvas do begin
559553 Line(x1,y1,x2,y2);
560554 end;
561555 end;
562556```
563557
564-Поместите курсор на 'x1' и нажмите <span class="kbd">Ctrl</span>+<span class="kbd">Shift</span>+<span class="kbd">C</span> для автозавершения кода. Вы получите:
558+Поместите курсор на 'x1' и нажмите `Ctrl`+`Shift`+`C` для автозавершения кода. Вы получите:
565559
566560``` pascal
567561 procedure TForm1.FormPaint(Sender: TObject);
568562 var
569563 x1: integer;
570564 begin
571565 with Canvas do begin
572566 Line(x1,y1,x2,y2);
573567 end;
574568 end;
575569```
576570
577571Начиная с 0.9.31 Lazarus автозавершает параметры указателя. Например
578572
579573``` pascal
580574 procedure TForm1.FormCreate(Sender: TObject);
581575 begin
582576 CreateIconIndirect(@IconInfo);
583577 end;
584578```
585579
586-Поместите курсор в 'IconInfo' и нажмите <span class="kbd">Ctrl</span>+<span class="kbd">Shift</span>+<span class="kbd">C</span> для автозавершения кода. Вы получите:
580+Поместите курсор в 'IconInfo' и нажмите `Ctrl`+`Shift`+`C` для автозавершения кода. Вы получите:
587581
588582``` pascal
589583 procedure TForm1.FormCreate(Sender: TObject);
590584 var
591585 IconInfo: TIconInfo;
592586 begin
593587 CreateIconIndirect(@IconInfo);
594588 end;
595589```
596590
597-Во всех приведенных выше примерах вы можете использовать <span class="kbd">Ctrl</span>+<span class="kbd">Shift</span>+<span class="kbd">X</span>, чтобы отобразить диалоговое окно создания кода, в котором вы можете установить дополнительные параметры.
591+Во всех приведенных выше примерах вы можете использовать `Ctrl`+`Shift`+`X`, чтобы отобразить диалоговое окно создания кода, в котором вы можете установить дополнительные параметры.
598592
599593### Автозавершение объявления вызываемой процедуры
600594
601595\[Механизм\] автозавершение кода может создать \[тело\] новой процедуры из места ее объявления.
602596
603597Допустим, вы просто написали объявление "`DoSomething(Width);`"
604598
605599``` pascal
606600procedure SomeProcedure;
607601var
608602 Width: integer;
609603begin
610604 Width:=3;
611605 DoSomething(Width);
612606end;
613607```
614608
615-Поместите курсор над идентификатором "DoSomething" и нажмите <span class="kbd">Ctrl</span>+<span class="kbd">Shift</span>+<span class="kbd">C</span>, чтобы получить:
609+Поместите курсор над идентификатором "DoSomething" и нажмите `Ctrl`+`Shift`+`C`, чтобы получить:
616610
617611``` pascal
618612procedure DoSomething(aWidth: LongInt);
619613begin
620614
621615end;
622616
623617procedure SomeProcedure;
624618var
625619 Width: integer;
626620begin
627621 Width:=3;
628622 DoSomething(Width);
629623end;
630624```
631625
632626Это еще не создает функции или методы.
633627
634628### Автозавершение предшествующего объявления класса
635629
636630"Автозавершение предшествующего объявления класса" является частью **Code Completion** \[(Автозавершения кода), который\] добавляет объявление для текущего тела метода в private \[разделе интерфейсной части модуля\]. Он вызывается, когда курсор находится в теле метода, еще не определенном в классе. Эта функция доступна с Lazarus 0.9.21.
637631
638632Например:
639633
640634``` pascal
641635 procedure TForm1.DoSomething(Sender: TObject);
642636 begin
643637 end;
644638```
645639
646-Метод DoSomething еще не объявлен в TForm1. Нажмите <span class="kbd">Ctrl</span>+<span class="kbd">Shift</span>+<span class="kbd">C</span>, и в IDE будет добавлена "`procedure DoSomething(Sender: TObject);`" в private-разделе TForm1.
640+Метод DoSomething еще не объявлен в TForm1. Нажмите `Ctrl`+`Shift`+`C`, и в IDE будет добавлена "`procedure DoSomething(Sender: TObject);`" в private-разделе TForm1.
647641
648642Для дельфийцев: Автозавершение класса работает в Lazarus всегда одним способом: от класса интерфейсного \[раздела модуля\] к \[разделу\] реализации или наоборот, от класса в \[разделе\] реализации к \[разделу\] интерфейса. Delphi всегда вызывает оба направления. Недостаток способа Delphi заключается в том, что при опечатке легко создать новый метод, не заметив \[этого\].
649643
650644------------------------------------------------------------------------
651645
652-Прим.перев. 09:08, 30 October 2018 (CET): Очевидно имеется ввиду следующее: в Lazarus'е достаточно чуть изменить название метода (справедливо и для параметров) в интерфейсной части модуля и нажать <span class="kbd">Ctrl</span>+<span class="kbd">Shift</span>+<span class="kbd">C</span>, и механизм Code Completion автоматически внесет правки в название уже имеющегося тела метода в разделе implementation. То же справедливо и для случая, когда меняется название метода (справедливо и для параметров) в разделе implementation, а затем вызывается Code Completion - в разделе interface будут внесены соответствующие правки.
646+Прим.перев. 09:08, 30 October 2018 (CET): Очевидно имеется ввиду следующее: в Lazarus'е достаточно чуть изменить название метода (справедливо и для параметров) в интерфейсной части модуля и нажать `Ctrl`+`Shift`+`C`, и механизм Code Completion автоматически внесет правки в название уже имеющегося тела метода в разделе implementation. То же справедливо и для случая, когда меняется название метода (справедливо и для параметров) в разделе implementation, а затем вызывается Code Completion - в разделе interface будут внесены соответствующие правки.
653647
654648В Delphi, если тело метода уже существует, то изменение имени метода в разделе interface приведет к созданию тела метода в разделе implementation с измененным именем в дополнению к уже имеющемуся со старым именем. Это, естественно, вызовет ошибку при компиляции проекта.
655649
656650------------------------------------------------------------------------
657651
658652### Комментарии и автозавершение кода
659653
660654Автозавершение кода пытается сохранять комментарии, принадлежащие \[завершаемому коду\]. Например:
661655
662656``` pascal
663657 FList: TList; // список TComponent
664658 FInt: integer;
665659```
666660
667661При вставке новой переменной между FList и FInd комментарий сохраняется в строке FList. То же самое верно для
668662
669663``` pascal
670664 FList: TList; { список TComponent
671665 Это комментарий по нескольким строкам, начиная
672666    со строки FList, поэтому codetools предполагает, что он принадлежит
673667    к линии FLIst и не будет [терять с ним]
674668    связь. Код добавляется за комментарием.}
675669 FInt: integer;
676670```
677671
678672Если комментарий начинается со следующей строки, он будет обрабатываться так, как если бы он принадлежал коду ниже. Например:
679673
680674``` pascal
681675 FList: TList; // список TComponent
682676 { Этот комментарий относится к приведенному ниже операнду.
683677      Новый код вставлен над этим комментарием и
684678      позади комментария [для] FList.}
685679 FInt: integer;
686680```
687681
688682### Обновление метода
689683
690684Обычно автозавершение класса добавляет все отсутствующие тела методов. (Начиная с 0.9.27). Но если именно один метод отличается между \[объявлением в\] классе и теле, то тело метода обновляется. Например: у вас есть метод *DoSomething*.
691685
692686``` pascal
693687 public
694688 procedure DoSomething;
695689 end;
696690
697691procedure TForm.DoSomething;
698692begin
699693end;
700694```
701695
702696Теперь добавляем параметр:
703697
704698``` pascal
705699 public
706700 procedure DoSomething(i: integer);
707701 end;
708702```
709703
710-и вызываем автозавершение кода (<span class="kbd">Ctrl</span>+<span class="kbd">Shift</span>+<span class="kbd">C</span>). Тело метода будет обновлено, а новый параметр будет скопирован:
704+и вызываем автозавершение кода (`Ctrl`+`Shift`+`C`). Тело метода будет обновлено, а новый параметр будет скопирован:
711705
712706``` pascal
713707procedure TForm.DoSomething(i: integer);
714708begin
715709end;
716710```
717711
718712## Рефакторинг \[реорганизация кода\]
719713
720714### Инверсия присвоения
721715
722716Аннотация
723717
724718"Invert Assignments" \[("Инверсия присвоения")\] берет некоторые выбранные инструкции pascal и инвертирует все операнды из этого кода. Этот инструмент полезен для преобразования кода "save" в "load" и обратную операцию.
725719
726720Например:\
727721
728722``` pascal
729723procedure DoSomething;
730724begin
731725 AValueStudio:= BValueStudio;
732726 AValueAppartment :=BValueAppartment;
733727 AValueHouse:=BValueHouse;
734728end;
735729```
736730
737731Выделите строки с назначением (между началом и концом) и сделайте инвертирование назначений. Все назначения будут инвертированы, а идентификация будет добавлена автоматически. Например:
738732
739733Результат:
740734
741735``` pascal
742736procedure DoSomething;
743737begin
744738 BValueStudio := AValueStudio;
745739 BValueAppartment := AValueAppartment;
746740 BValueHouse := AValueHouse;
747741end;
748742```
749743
750744------------------------------------------------------------------------
751745
752746Прим.перев. 14:37, 1 November 2018 (CET): По умолчанию шоткаты для данной операции отсутствуют. Их легко определить самим, вызвав меню Tools --\> Options --\> Editor --\> Key Mappings --\> CodeTools Command --\> Invert Assignment
753747
754748------------------------------------------------------------------------
755749
756750### Заключить выделение \[в какую-либо конструкцию\]
757751
758-Выберите текст и вызовите \[эту команду (ПКМ --\> Enclose Selection) или <span class="kbd">Ctrl</span>+<span class="kbd">Shift</span>+<span class="kbd">N</span>\]. Появится диалоговое окно, в котором вы можете выбрать, следует ли включить выделение в **try..finally** или многие другие общие блоки.
752+Выберите текст и вызовите \[эту команду (ПКМ --\> Enclose Selection) или `Ctrl`+`Shift`+`N`\]. Появится диалоговое окно, в котором вы можете выбрать, следует ли включить выделение в **try..finally** или многие другие общие блоки.
759753
760754### Переименование идентификатора
761755
762-Поместите курсор на идентификатор и вызовите \[эту команду (ПКМ --\> Rename Identifier) или <span class="kbd">F2</span>\]. Появится диалоговое окно, в котором вы можете настроить область поиска и новое имя.
756+Поместите курсор на идентификатор и вызовите \[эту команду (ПКМ --\> Rename Identifier) или `F2`\]. Появится диалоговое окно, в котором вы можете настроить область поиска и новое имя.
763757
764758- Это переименует все вхождения и только те, которые фактически используют это объявление. Это означает, что он не переименовывает объявления с тем же именем.
765759- И это сначала проверит конфликты имен.
766760- Ограничения: Это работает только с исходниками pascal, но не переименовывает файлы, не поддерживает ни файлы lfm/lrs, ни файлы lazdoc.
767761
768762### Поиски ссылок на идентификатор
769763
770-Поместите курсор на идентификатор и вызовите \[эту процедуру (ПКМ --\> Find --\> Find Identifier References) или <span class="kbd">Ctrl</span>+<span class="kbd">Shift</span>+<span class="kbd">I</span>\]. Появится диалоговое окно, в котором вы можете настроить область поиска. Затем IDE будет искать все вхождения и только те, которые фактически используют это объявление. Это означает, что эта \[процедура\] не отображает другие объявления с таким же именем.
764+Поместите курсор на идентификатор и вызовите \[эту процедуру (ПКМ --\> Find --\> Find Identifier References) или `Ctrl`+`Shift`+`I`\]. Появится диалоговое окно, в котором вы можете настроить область поиска. Затем IDE будет искать все вхождения и только те, которые фактически используют это объявление. Это означает, что эта \[процедура\] не отображает другие объявления с таким же именем.
771765
772766### Показ абстрактных методов
773767
774768Эта функция перечисляет и автоматически завершает виртуальные, абстрактные методы, которые необходимо реализовать. Поместите курсор на объявление класса и вызовите \[эту функцию (ПКМ --\> Refactoring --\> Abstract Methods)\]. Если отсутствуют абстрактные методы, появится диалоговое окно с их перечислением. Выберите методы для реализации, и среда IDE создаст заглушки метода. Начиная с \[версии\] 1.3 Lazarus также добавляет недостающие методы *интерфейса класса*.
775769
776770### Извлечение процедуры
777771
778772См. [[IDE Window: Extract Procedure/ru|Extract Procedure]].
779773
780774## Поиск объявлений
781775
782776Поместите курсор на идентификатор и выполните 'Find Declaration' \[("Найти объявление")\]. Тогда это запустит поиск объявления этого идентификатора, откроет файл и перейдет к нему. Если курсор уже находится в объявлении, он перейдет к предыдущему объявлению с тем же именем. Это позволяет находить переназначения и переопределения.
783777
784778Каждое найденное объявление устанавливает точку перехода. Это означает, что вы прыгнете с найденного объявления \[к следующему найденному\] объявлению и легко вернетесь \[назад\] с помощью Search -\> Jump back.
785779
786780Существуют некоторые отличия от Delphi: утилиты кода работают с исходниками, следующим правилам обычного паскаля, вместо использования выходных \[файлов\] компилятора. Компилятор возвращает конечный тип. Утилиты кода видят исходники и все шаги между ними. Например:
787781
788782Свойство *Visible* сначала определяется в *TControl* (controls.pp), затем переопределяется в TCustomForm и, наконец, переопределяется в TForm. Вызов поиска объявления для \[свойства\] Visible сначала приведет вас к Visible в TForm. Затем вы снова можете вызвать Find Declaration \[("Поиск объявления")\], чтобы перейти к \[свойству\] Visible в TCustomForm, и снова, \[чтобы\] перейти к \[свойству\] Visible в TControl.
789783
790784То же самое верно и для таких типов, как *TColor*. Для компилятора это просто \[тип\] 'longint'. Но в исходниках он определяется как
791785
792786``` pascal
793787TGraphicsColor = -$7FFFFFFF-1..$7FFFFFFF;
794788TColor = TGraphicsColor;
795789```
796790
797791И то же самое \[справедливо\] для **forward defined classes** \[("предшествующего определения классов")\]: например, в *TControl*, есть private-переменная
798792
799793``` pascal
800794FHostDockSite: TWinControl;
801795```
802796
803797Поиск объявления в TWinControl перескочит в предшествующее определение
804798
805799``` pascal
806800TWinControl = class;
807801```
808802
809803А вызов его снова переведет к реальной реализации
810804
811805``` pascal
812806TWinControl = class(TControl)
813807```
814808
815809Таким образом вы можете отслеживать каждый идентификатор и находить каждую \[его\] перегрузку.
816810
817811### Подсказки
818812
819-- перейти назад <span class="kbd">Ctrl</span>+<span class="kbd">H</span>.
813+- перейти назад `Ctrl`+`H`.
820814- местоположениям через меню: View -\> "jump history"
821815- для 5-кнопочной мыши добавьте две дополнительные кнопки для перемещения вперед/назад между посещенными точками
822816
823817
824818используя [[IDE Window: EditorMouseOptionsAdvanced|advanced mouse options]], кнопки можно переназначить.
825819
826820## Автозавершение идентификатора
827821
828-"Identifier Completion" \[("автозавершение идентификатора")\] вызывается \[комбинацией клавиш\] <span class="kbd">Ctrl</span>+<span class="kbd">space</span>. Это отображает все идентификаторы в области видимости. Например:
822+"Identifier Completion" \[("автозавершение идентификатора")\] вызывается \[комбинацией клавиш\] `Ctrl`+`space`. Это отображает все идентификаторы в области видимости. Например:
829823
830824``` pascal
831825procedure TForm1.FormCreate(Sender: TObject);
832826begin
833827 |
834828end;
835829```
836830
837-Поместите курсор между *begin* и *end* и нажмите <span class="kbd">Ctrl</span>+<span class="kbd">space</span>. IDE/Утилиты кода теперь будут анализировать весь доступный код и представлять список всех найденных идентификаторов. Утилиты кода кэшируют результаты, поэтому повторное использование этого кода будет намного быстрее.
831+Поместите курсор между *begin* и *end* и нажмите `Ctrl`+`space`. IDE/Утилиты кода теперь будут анализировать весь доступный код и представлять список всех найденных идентификаторов. Утилиты кода кэшируют результаты, поэтому повторное использование этого кода будет намного быстрее.
838832
839833> **Note:** для Дельфийцев: в Дельфи это называется *Автозавершение кода*.
840834
841835Некоторые идентификаторы, такие как 'Write', 'ReadLn', 'Low', 'SetLength', 'Self', 'Result', 'Copy' встроены в компилятор и не определены нигде в исходниках. В автозавершении идентификатора также есть много таких вещей. Если вы обнаружите, что хоть один отсутствует, просто создайте запрос функции в багтрекере.
842836
843-*Автозавершение идентификатора* не автозавершает все *ключевые слова*. Поэтому вы не можете использовать его для автозавершения \[ключевого слова\] 'repe' до 'repeat'. Для этого используйте <span class="kbd">Ctrl</span>+<span class="kbd">W</span> [[Lazarus IDE Tools/ru|Автозавершение слова]] или <span class="kbd">Ctrl</span>+<span class="kbd">J</span> [[Lazarus IDE Tools/ru|Шаблоны кода]]. Начиная с версии 0.9.27 *автозавершение идентификатора* автозавершает некоторые ключевые слова.
837+*Автозавершение идентификатора* не автозавершает все *ключевые слова*. Поэтому вы не можете использовать его для автозавершения \[ключевого слова\] 'repe' до 'repeat'. Для этого используйте `Ctrl`+`W` [[Lazarus IDE Tools/ru|Автозавершение слова]] или `Ctrl`+`J` [[Lazarus IDE Tools/ru|Шаблоны кода]]. Начиная с версии 0.9.27 *автозавершение идентификатора* автозавершает некоторые ключевые слова.
844838
845839Автозавершение идентификатора показывает даже те идентификаторы, которые несовместимы.
846840
847841### Сопоставление только первой части слова
848842
849843Вы можете вызвать автозавершение идентификатора только по первым нескольким символам в слове. Поместите курсор внутри слова. Для поиска идентификаторов будут использоваться *только символы слева от курсора*. Например:
850844
851845``` pascal
852846procedure TForm1.FormCreate(Sender: TObject);
853847begin
854848 Ca|ption
855849end;
856850```
857851
858852Во \[всплывающем\] поле будут показаны только идентификаторы, начинающиеся с 'Ca' (\| указывает позицию курсора).
859853
860854### Клавиши
861855
862856- Буква или цифра: добавьте символ в редактор исходного кода и текущий префикс. Это обновит список.
863857- Backspace: удалит последний символ из исходного редактора и префикса. Обновляет список.
864858- Return: заменяет целое слово под курсором на выбранный идентификатор и закрывает всплывающее окно.
865859- Shift+Return: как *Return*, но заменяет только префикс (левая часть) слова под курсором.
866860- Up/Down: перемещает выделение
867861- Escape: закрывает всплывающее окно без изменений
868862- Tab: завершает префикс для следующего выбора. Например: текущий префикс 'But', а завершение идентификатора показывает только 'Button1' и 'Button1Click'. Тогда нажатие *Tab* завершит префикс 'Button1'.
869863- Else: как *Return* и добавляет символ в редактор исходного кода
870864
871865### Методы
872866
873867Когда курсор находится в определении класса, и ваш идентификатор завершает метод, определенный в классе предков, параметры и ключевое слово переопределения будут добавляться автоматически. Например:
874868
875869``` pascal
876870TMainForm = class(TForm)
877871protected
878872 mous|
879873end;
880874```
881875
882876Завершение **MouseDown** дает:
883877
884878``` pascal
885879TMainForm = class(TForm)
886880protected
887881 procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X,
888882 Y: Integer); override;
889883end;
890884```
891885
892886### Свойства
893887
894888``` pascal
895889property MyInt: integer read |;
896890```
897891
898892Автозавершение идентификатора покажет **FMyInt** и **GetMyInt**.
899893
900894``` pascal
901895property MyInt: integer write |;
902896```
903897
904898Автозавершение идентификатора покажет **FMyInt** и **SetMyInt**.
905899
906900### Секции Uses / Имена модулей
907901
908902В разделах uses автозавершение идентификатора будет отображать имена файлов всех модулей в пути поиска. Они все будут отображаться строчными буквами (например, *avl_tree*), потому что большинство модулей имеют имена файлов в нижнем регистре. По автозавершении они вставляются в том регистре, \[в каком модуль назван\] (например, *AVL_Tree*).
909903
910904### Операторы
911905
912906``` pascal
913907procedure TMainForm.Button1Click(Sender: TObject);
914908begin
915909 ModalRe|;
916910end;
917911```
918912
919913будет выглядеть так:
920914
921915``` pascal
922916procedure TMainForm.Button1Click(Sender: TObject);
923917begin
924918 ModalResult:=|;
925919end;
926920```
927921
928922### Иконки в окне автозавершения
929923
930924В Lazarus 1.9+ существует опция для отображения значков вместо "типов", для строк в окне автозавершения. На рисунке показаны эти значки:
931925
932-<figure>
933926<img src="ide_completion_icons.png" title="ide_completion_icons.png" width="250" />
934-<figcaption>ide_completion_icons.png</figcaption>
935-</figure>
936927
937928------------------------------------------------------------------------
938929
939930Прим.перев. 21:20, 6 November 2018 (CET): По умолчанию показ иконок отключен. Чтобы включить их, необходимо в меню Tools --\> Options --\> Codetools --\> Identifier Completion (Сервис --\> Параметры --\> Code tools --\> Завершение идентификаторов) в разделе Appearance (Внешний вид) отметить галочкой чекбокс "Icons in code completion box" ("Значки в окне автозавершения кода").
940931
941-<figure>
942932<img src="icon_in_code_completion.png" title="icon_in_code_completion.png" width="500" />
943-<figcaption>icon_in_code_completion.png</figcaption>
944-</figure>
945933
946934------------------------------------------------------------------------
947935
948936## Автозавершение слова
949937
950-*Word Completion* \[(автозавершение слова)\] вызывается \[сочетанием клавиш\] <span class="kbd">Ctrl</span>+<span class="kbd">W</span>. Оно отображает все слова всех открытых в настоящее время редакторов и поэтому может использоваться в не паскалевских исходниках, в комментариях и ключевых словах.
938+*Word Completion* \[(автозавершение слова)\] вызывается \[сочетанием клавиш\] `Ctrl`+`W`. Оно отображает все слова всех открытых в настоящее время редакторов и поэтому может использоваться в не паскалевских исходниках, в комментариях и ключевых словах.
951939
952940В противном случае это работает так же, как и автозавершение идентификатора.
953941
954942## Словарь Модулей / Идентификатор (Cody)
955943
956944Это диалоговое окно позволяет вам искать идентификаторы в других модулях. Модули не должны использоваться вашим кодом.
957945
958946Эта функция является частью пакета "Cody". Чтобы активировать функцию, установите пакет.
959947
960948## Переход в директиву Include
961949
962950"Goto Include Directive" \[(переход в директиву Include)\] в меню поиска IDE переходит к выражению {\$I filename}, в котором используется текущий файл include.
963951
964952## Публикация проекта
965953
966954Создает копию всего проекта. Если вы хотите отправить кому-то только исходники и параметры компилятора вашего кода, эта функция является вашим другом.
967955
968956Обычный каталог проекта содержит много информации. Большинство из них не нужно публиковать: файл .lpi может содержать информацию о сеансе (например, позицию каретки и закладки закрытых блоков), а каталог проекта содержит много файлов .ppu, .o и исполняемый файл. Чтобы создать файл lpi только с базовой информацией, \[а также создать\] только исходники со всеми подкаталогами, используйте \[опцию\] "Publish Project" \[(опубликовать проект)\].
969957
970958> **Note:** Начиная с версии 0.9.13, есть новая \[опция в \] *Project Option*, которая позволяет хранить информацию о сеансе в \[другом\] файле отдельно от обычного файла .lpi. Этот новый файл заканчивается расширением .lps и содержит только информацию о сеансе, что значительно упрощает ваш файл .lpi.
971959
972960В диалоговом окне вы можете настроить фильтр для включения и исключения определенных файлов; с \[возможным выполнением\] команды после того, как вы архивируете выходные файлы.
973961
974962## Советы по комментариям
975963
976964В нескольких местах IDE показывает подсказки для идентификатора. Например, при перемещении мыши по идентификатору в редакторе исходного кода и ожидании нескольких секунд. Когда IDE показывает подсказку для идентификатора, она ищет объявление его и всех его предков, \[а также\] ищет комментарии и файлы fpdoc. Существует много стилей кодирования и много стилей комментариев. Чтобы поддерживать многие общие стили комментариев, среда IDE использует следующий \[механизм\] эвристики:
977965
978966### Комментарии, показанные в подсказке
979967
980968Комментарии перед объявлением без пустой строки и не начинающиеся со знака *\<*:
981969
982970``` pascal
983971var
984972 {Комментарий}
985973 Identifier: integer;
986974```
987975
988976Комментарии с знаком *\<* принадлежит к предыдущему идентификатору.
989977
990978Комментарии за идентификатором в одной строке:
991979
992980``` pascal
993981var
994982 identifier, // Комментарий
995983 other,
996984```
997985
998986Комментарии позади определения в той же строке:
999987
1000988``` pascal
1001989var
1002990 identifier:
1003991 char; // Комментарий
1004992```
1005993
1006994Пример для знака **\<**:
1007995
1008996``` pascal
1009997const
1010998 a = 1;
1011999 //< комментарий для a
10121000 b = 2;
10131001 // комментарий для c
10141002 c = 3;
10151003```
10161004
10171005Поддерживаются все три типа комментариев:
10181006
10191007``` pascal
10201008 {Комментарий}(*Комментарий*)//Комментарий
10211009 c = 1;
10221010```
10231011
10241012### Комментарии, не показываемые в подсказке
10251013
10261014Комментарии, начинающиеся с **\$** или **%**, игнорируются. Например, *//% Hiddden*, *//\$ Hidden*, *(*\$ Hidden*)*.
10271015
10281016Комментарии спереди, разделенные пустой строкой, рассматриваются как не относящиеся к следующему идентификатору. Например, следующий комментарий заголовка класса не отображается в подсказке:
10291017
10301018``` pascal
10311019type
10321020 { TMyClass }
10331021
10341022 TMyClass = class
10351023```
10361024
10371025Комментарии заголовка класса создаются при завершении класса. Вы можете отключить эту \[опцию\] в *Options / Codetools / Class completion / Header comment for class* (*Параметры / Code tools / Завершение классов / Комментарий перед заголовком класса*). Если вы хотите показать комментарий заголовка в подсказке, просто удалите пустую строку.
10381026
10391027Следующий комментарий будет показан для GL_TRUE, но не для GL_FALSE:
10401028
10411029``` pascal
10421030 // Boolean
10431031 GL_TRUE = 1;
10441032 GL_FALSE = 0;
10451033```
10461034
10471035## Быстрые исправления
10481036
10491037Быстрые исправления - это пункты меню для конкретных сообщений компилятора. Они помогают быстро решить проблему. Выберите сообщение в окне «Сообщения» и щелкните правой кнопкой мыши или щелкните правой кнопкой мыши в редакторе исходного кода на значке слева.
10501038
10511039- Unit not found \[модуль не найден\]: удалите из раздела uses
10521040- Unit not found \[модуль не найден\]: найдите модуль в загруженных пакетах и разрешите автоматическое добавление зависимости пакета
10531041- Constructing a class "\$1" with abstract method "\$2" \[Создание класса "\$1" с абстрактным методом "\$2"\]: показ диалогового окна для переопределения всех абстрактных методов
10541042- Local variable "\$1" not used \[Локальная переменная "\$1" не используется\]: удалите определение
10551043- Circular unit reference between \$1 and \$2 \[циркулярная ссылка модуля между \$1 и \$2\]: показывает диалоговое окно зависимостей с полным путем между двумя модулями
10561044- Identifier not found \[Идентификатор не найден\]: поиск через браузер кода
10571045- Identifier not found \[Идентификатор не найден\]: поиск через словарь Cody (нужен пакет [[Cody]])
10581046- Identifier not found \[Идентификатор не найден\]: добавьте локальную переменную
10591047- Recompiling \$1, checksum changed for \$2 \[Перекомпиляция \$1, контрольная сумма изменена для \$2\]: показать диалог с путями поиска и другой информацией
10601048- IDE warning: other sources path of package %s contains directory... \[Предупреждение IDE: другие пути исходников пакета %s содержит каталог ...:\]: откройте пакет
10611049- any hint, note, warning \[любые подсказки, примечания, предупреждения\]: добавьте директиву IDE {%H-}
10621050- any hint, note, warning \[любые подсказки, примечания, предупреждения\]: добавьте директиву компилятора {\$warn id off} (начиная с 1.7)
10631051- any hint, note, warning \[любые подсказки, примечания, предупреждения\]: добавьте опцию компилятора -vm\<messageid\>
10641052- Local variable "i" does not seem to be initialized \[Локальная переменная "i", похоже, не инициализирована\]: вставьте присвоение (начиная с 1.5)
10651053- Inherited method is hidden \[Унаследованный метод скрыт\]: добавьте модификатор override, overload, или reintroduce (начиная с 1.9)
10661054
10671055## Контур
10681056
10691057Этот параметр находится в диалоговом окне Options --\> Editor --\> Display --\> Markup and Matches --\> Outline (global) \[Параметры --\> Редактор --\> Отображение --\> Подсветка и соответствия --\> Отображать контур блока(глобально)\].
10701058
10711059Он выделяет ключевые слова Pascal вместе со своими операторными(begin-end) скобками. Это позволяет видеть вложенность больших блоков.
10721060
10731061Например, для такого тела процедуры:
10741062
10751063``` pascal
10761064 with ADockObject do
10771065 begin
10781066 if DropAlign = alNone then
10791067 begin
10801068 if DropOnControl <> nil then
10811069 DropAlign := DropOnControl.GetDockEdge(DropOnControl.ScreenToClient(DragPos))
10821070 else
10831071 DropAlign := Control.GetDockEdge(DragTargetPos);
10841072 end;
10851073 PositionDockRect(Control, DropOnControl, DropAlign, FDockRect);
10861074 end;
10871075```
10881076
10891077он подсвечивает:
10901078
10911079- внешний with-do-begin-end оранжевым
10921080- следующий if-then-begin-end зеленым
10931081- внутренний if-then-else голубым
10941082
1095-<figure>
1096-<img src="ide_outline.png" title="ide_outline.png" />
1097-<figcaption>ide_outline.png</figcaption>
1098-</figure>
1083+![](/wiki-images/3/3c/Ide_outline.png)
10991084
11001085---
11011086*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