Difference between revisions of "Lazarus IDE Tools/ru"

From Free Pascal wiki
Jump to navigationJump to search
m
 
(132 intermediate revisions by 7 users not shown)
Line 1: Line 1:
 
{{Lazarus IDE Tools}}
 
{{Lazarus IDE Tools}}
  
==Обзор==
 
IDE использует библиотеку парсинга исходников Паскаль и инструменты редактирования под названием "codetools". Эти инструменты обеспечивают поиск объявлений по образцу, завершение кода, извлечение, перемещение вставки и украшение кода Паскаль. Эти функции экономят Ваше время и спасают от двойной работы. Всё это настраивается и каждая возможность доступна через сочетание клавиш (см "Окружение -> Параметры...").
 
  
Поскольку они взаимодействую исключительно с исходниками и понимают код fpc, delphi и kylix, то не требуют никаких откомпилированых модулей или установки компилятора Борланд. Вы можете редактировать код Delphi и FPC в любое время. Вы так же можете работать с любыми версиями Delphi и FPC. Это делает перенесение кода Delphi довольно лёгким делом.
+
'''[[Lazarus_Faq/ru|Lazarus]] IDE''' - это инструменты библиотеки [[Free Pascal]] для синтаксического анализа и редактирования, называемая "codetools"[(утилиты кода)].
 +
 
 +
Эти инструменты предоставляют такие функции для исходников, как "Переход к объявлению", "Завершение кода", "Извлечение", "Перемещение вставки" и  "Украшение Паскаля". Эти функции могут сэкономить много времени и пустой работы. Они настраиваются, и каждая функция доступна с помощью ярлыков (см. Editor Options).
 +
 
 +
Поскольку они работают исключительно с исходниками Pascal и понимают коды FPC, [[Delphi]] и [[Kylix]], им не требуются компилированные модули или установленный компилятор Borland/Embarcadero. Код Delphi и FPC можно редактировать одновременно с несколькими версиями Delphi и FPC. Это упрощает перенос кода Delphi в FPC/Lazarus.
 +
 
  
 
==Горячие клавиши в IDE==
 
==Горячие клавиши в IDE==
 
{|
 
{|
 
|-
 
|-
| [[Lazarus_IDE_Tools#Find Declaration|Переход на объявление]] || {{keypress|Ctrl}}+Click или {{keypress|Alt}}+{{keypress|Up}} (Переход на объявление типа или переменной)
+
| [[Lazarus_IDE_Tools#Find Declaration|Переход на объявление]] || {{keypress|Ctrl}}+ЛКМ или {{keypress|Alt}}+{{keypress|Up}} (Переход на объявление типа или переменной)
 
|-
 
|-
| [[Lazarus_IDE_Tools#Method Jumping|Переход на метод класса]] || {{keypress|Ctrl}}+{{keypress|Shift}}+{{keypress|Up}} (Переход туда сюда между объявлением и телом метода)
+
| [[Lazarus_IDE_Tools/ru#Переход между методом и его объявлением|Переход на метод класса]] || {{keypress|Ctrl}}+{{keypress|Shift}}+{{keypress|Up}} (Переход туда сюда между объявлением и телом метода)
 
|-
 
|-
| [[Lazarus_IDE_Tools#Code Templates|Шаблоны кода]] || {{keypress|Ctrl}}+{{keypress|J}}
+
| [[Lazarus_IDE_Tools/ru#Шаблоны кода|Шаблоны кода]] || {{keypress|Ctrl}}+{{keypress|J}}
 
|-
 
|-
| [[Lazarus_IDE_Tools#Syncro Edit|Syncro Edit]] || {{keypress|Ctrl}}+{{keypress|J}} (Пока текст выделен)
+
| [[Lazarus_IDE_Tools/ru#Синхронная правка|Синхронная правка]] || {{keypress|Ctrl}}+{{keypress|J}} (Пока текст выделен)
 
|-
 
|-
| [[Lazarus_IDE_Tools#Code Completion|Завершение кода]] (Завершение класса) || {{keypress|Ctrl}}+{{keypress|Shift}}+{{keypress|C}}
+
| [[Lazarus_IDE_Tools/ru#Автозавершение Кода|Завершение кода]] (Завершение класса) || {{keypress|Ctrl}}+{{keypress|Shift}}+{{keypress|C}}
 
|-
 
|-
 
| [[Lazarus_IDE_Tools#Identifier Completion|Завершение идентификатора]] || {{keypress|Ctrl}}+{{keypress|space}}
 
| [[Lazarus_IDE_Tools#Identifier Completion|Завершение идентификатора]] || {{keypress|Ctrl}}+{{keypress|space}}
Line 23: Line 26:
 
| [[Lazarus_IDE_Tools#Word Completion|Завершение слова]] || {{keypress|Ctrl}}+{{keypress|W}}
 
| [[Lazarus_IDE_Tools#Word Completion|Завершение слова]] || {{keypress|Ctrl}}+{{keypress|W}}
 
|-
 
|-
| [[Lazarus_IDE_Tools#Parameter Hints|Подсказка по параметру]] || {{keypress|Ctrl}}+{{keypress|Shift}}+{{keypress|space}}
+
| [[Lazarus_IDE_Tools/ru#Подсказка для параметров|Подсказка для параметров]] || {{keypress|Ctrl}}+{{keypress|Shift}}+{{keypress|space}}
 
|-
 
|-
| [[Lazarus_IDE_Tools#Incremental Search|Поэтапный поиск]] || {{keypress|Ctrl}}+{{keypress|E}}
+
| [[Lazarus_IDE_Tools/ru#Последовательный поиск|Последовательный поиск]] || {{keypress|Ctrl}}+{{keypress|E}}
 
|}
 
|}
  
Line 32: Line 35:
  
 
Для примера:
 
Для примера:
interface
+
<syntaxhighlight lang=pascal> interface
 
   
 
   
 
  procedure DoSomething; // Объявление процедуры
 
  procedure DoSomething; // Объявление процедуры
Line 40: Line 43:
 
  procedure DoSomething; // Тело процедуры  
 
  procedure DoSomething; // Тело процедуры  
 
  begin
 
  begin
  end;
+
  end;</syntaxhighlight>
Если курсор стоит на теле процедуры и Вы нажмёте {{keypress|Ctrl}}+{{keypress|Shift}}+{{keypress|Up}}, то курсор перескочет на объявление, потом опять {{keypress|Ctrl}}+{{keypress|Shift}}+{{keypress|Up}} и курсор перескочит на тело процедуры, после 'begin'.
+
Если курсор стоит на теле процедуры и Вы нажмёте {{keypress|Ctrl}}+{{keypress|Shift}}+{{keypress|Up}}, то курсор перескочит на объявление, потом опять {{keypress|Ctrl}}+{{keypress|Shift}}+{{keypress|Up}} и курсор перескочит на тело процедуры, после 'begin'.
  
 
Это так же работает между методами-процедурами класса.
 
Это так же работает между методами-процедурами класса.
Line 48: Line 51:
 
Переход осуществляется на процедуру с таким же именем и списком параметров. Если нет точной такой же процедуры, то переход будет на наиболее подходящего кандидата и позиционирует курсор на первое же различие. (Для дельфийцев: Delphi не может этого сделать).
 
Переход осуществляется на процедуру с таким же именем и списком параметров. Если нет точной такой же процедуры, то переход будет на наиболее подходящего кандидата и позиционирует курсор на первое же различие. (Для дельфийцев: Delphi не может этого сделать).
 
Пример процедуры с различными типами параметров:
 
Пример процедуры с различными типами параметров:
interface
+
<syntaxhighlight lang=pascal> interface
 
   
 
   
 
  procedure DoSomething(p: char); // Объявление процедуры
 
  procedure DoSomething(p: char); // Объявление процедуры
Line 56: Line 59:
 
  procedure DoSomething(p: string); // Тело процедуры
 
  procedure DoSomething(p: string); // Тело процедуры
 
  begin
 
  begin
  end;
+
  end;</syntaxhighlight>
 
Переход с определения к телу процедуры будет позиционировать курсор на ключевое слово 'string'. Это можно использовать для переименования методов и / или изменения параметров.
 
Переход с определения к телу процедуры будет позиционировать курсор на ключевое слово 'string'. Это можно использовать для переименования методов и / или изменения параметров.
  
 
Пример:<br>
 
Пример:<br>
 
Вы переименовываете 'DoSomething' в 'MakeIt':  
 
Вы переименовываете 'DoSomething' в 'MakeIt':  
interface
+
<syntaxhighlight lang=pascal> interface
 
   
 
   
 
  procedure MakeIt; // Объявление процедуры
 
  procedure MakeIt; // Объявление процедуры
Line 69: Line 72:
 
  procedure DoSomething; // Тело процедуры
 
  procedure DoSomething; // Тело процедуры
 
  begin
 
  begin
  end;
+
  end;</syntaxhighlight>
 
Тогда можно перейти от MakeIt к телу. IDE ищет подходящее тело и не находит, а, следовательно, ищет нечто похожее. Так как вы переименовали только одну процедуру есть ровно одно тело без определения (DoSomething) и будет переход к DoSomething, курсор встанет справа от "DoSomething". Тогда вы можете просто переименовать его прямо там. Это работает и для параметров.
 
Тогда можно перейти от MakeIt к телу. IDE ищет подходящее тело и не находит, а, следовательно, ищет нечто похожее. Так как вы переименовали только одну процедуру есть ровно одно тело без определения (DoSomething) и будет переход к DoSomething, курсор встанет справа от "DoSomething". Тогда вы можете просто переименовать его прямо там. Это работает и для параметров.
  
 
==Включаемые файлы==
 
==Включаемые файлы==
Включаемые файлы это файлы вставленные в исходный код с помощью директив компилятора {$I filename} или {$INCLUDE filename}. Lazarus и FPC используют эти вещи чтобы уменьшить избыточность и избежать нечитаемых {$IFDEF} конструкций при поддержке различных платформ.  
+
Включаемые файлы это файлы вставленные в исходный код с помощью директив компилятора <syntaxhighlight lang=pascal>{$I filename}</syntaxhighlight> или <syntaxhighlight lang=pascal>{$INCLUDE filename}</syntaxhighlight>. Lazarus и FPC используют эти вещи чтобы уменьшить избыточность и избежать нечитаемых {$IFDEF} конструкций при поддержке различных платформ.  
  
В отличии от Delphi, Lazarus IDE полностью поддерживает включаемые файлы. Вы можете для примера перепрыгнуть с метода в .pas файле к телу метода во включаемом файле. Все инструменты для работы с кодом, такие как автозавершение кода, просматривают текст во включаемых файлах на предмет специальных связей.
+
В отличие от Delphi, Lazarus IDE полностью поддерживает включаемые файлы. Вы можете для примера перепрыгнуть с метода в .pas файле к телу метода во включаемом файле. Все инструменты для работы с кодом, такие как автозавершение кода, просматривают текст во включаемых файлах на предмет специальных связей.
  
For instance: When code completion adds a new method body behind another method body, it keeps them both in the same file. This way you can put whole class implementations in include files, like the LCL does for nearly all controls.
+
Например: когда автозавершение кода добавляет новое тело метода за другим телом метода, он хранит их обоих в одном файле. Таким образом, вы можете помещать целые реализации классов в файлы include, как, например LCL [делает] для почти всех элементов управления.
  
But there is a newbie trap:
+
Но [тут] есть ловушка для новичков:
If you open an include file for the first time and try method jumping or find declaration you will get an error. The IDE does not know to which unit the include file belongs. You must open the unit first.
+
Если вы впервые откроете файл include и попробуете прыгнуть к методу или найди [его] объявление, вы получите сообщение об ошибке. IDE не знает, к какому модулю принадлежит файл include. Сначала вы должны открыть модуль.
  
As soon as the IDE parses the unit, it will parse the include directives there and the IDE will remember this relationship. It saves this information on exit and on project save to ~/.lazarus/includelinks.xml. The next time you open this include file and jump or do a find declaration, the IDE will internally open the unit and the jump will work.
+
Как только IDE проанализирует модуль, она [начнет] анализировать директивы include, и [затем] IDE запоминает эти взаимосвязи. Она сохраняет эту информацию при выходе и при сохранении проекта в ~/.lazarus/includelinks.xml. В следующий раз, когда вы откроете этот include-файл и перейдете [к объявлению] или найдете [его поиском], IDE будет открывать модуль изнутри [include-файла], и переход будет работать.
You can also hint the IDE by putting
+
Вы также можете указать подсказку IDE, поставив
{%mainunit yourunit.pas}  
+
<syntaxhighlight lang=pascal> {%mainunit yourunit.pas}</syntaxhighlight>
on the top of yourinclude.inc.
+
наверху вашего yourinclude.inc.
  
This mechanism has of course limits. Some include files are included twice or more. For example: lcl/include/winapih.inc.
+
Конечно, этот механизм имеет ограничения. Некоторые include-файлы включаются дважды или более. Например: lcl/include/winapih.inc.
  
Jumping from the procedure/method definitions in this include file to the bodies depends on your last actions. If you worked on lcl/lclintf.pp the IDE will jump to winapi.inc. If you worked on lcl/interfacebase.pp, then it will jump to lcl/include/interfacebase.inc (or one of the other include files). If you are working on both, then you can get confused. ;)
+
Переходы с объявления процедуры/метода в этом include-файле к [их] телу зависят от ваших последних действий. Если вы работаете в lcl/lclintf.pp, среда IDE перейдет в winapi.inc. Если вы работаете в lcl/interfacebase.pp, тогда она перейдет в lcl/include/interfacebase.inc (или в один из других включенных файлов). Если вы работаете над обоими, то вы можете запутаться. ;)
'''Bold text'''
 
  
 
==Шаблоны кода==
 
==Шаблоны кода==
Code Templates converts an identifier into a text or code fragment.
+
Шаблоны кода преобразуют идентификатор в текст, или фрагмент кода.
 +
 
  
Code Templates default short cut is {{keypress|Ctrl}}+{{keypress|J}}. You can type an identifier, press {{keypress|Ctrl}}+{{keypress|J}} and the identifier is replaced by the text defined for the identifier. Code Templates can be defined in Environment -> Editor Options -> CodeTools.
+
По умолчанию горячие клавиши для шаблонов кода {{keypress|Ctrl}}+{{keypress|J}}. Вы можете ввести идентификатор, нажать {{keypress|Ctrl}}+{{keypress|J}} и идентификатор заменится на текст определенный для этого идентификатора. Шаблоны кода можно задать в Environment -> Editor Options -> CodeTools.
  
Example:
+
Пример:
Write the identifier 'classf', leave the cursor right behind the 'f' and press {{keypress|Ctrl}}+{{keypress|J}}. The 'classf' will be replaced by
+
Введите идентификатор 'classf', поставьте курсор справа от 'f' и нажмите {{keypress|Ctrl}}+{{keypress|J}}. Идентификатор 'classf' будет заменен на
 +
<syntaxhighlight lang=pascal>
 
  T = class(T)
 
  T = class(T)
 
  private
 
  private
Line 106: Line 110:
 
   destructor Destroy; override;
 
   destructor Destroy; override;
 
  end;
 
  end;
and the cursor is behind the 'T'.
+
</syntaxhighlight>
You can get the list of templates by positioning the cursor on space (not on an identifier) and pressing {{keypress|Ctrl}}+{{keypress|J}}. The list of code templates will pop up. Use the cursor keys or type some chars to choose one. Return creates the selected template and Escape closes the pop up.
+
и курсор будет находится за 'T'.
  
The biggest time savers are templates 'b'+{{keypress|Ctrl}}+{{keypress|J}} for begin..end.
+
Вы можете посмотреть список шаблонов установив курсор на пустое место (не на идентификатор) и нажав {{keypress|Ctrl}}+{{keypress|J}}. Список шаблонов кода появится. Используйте стрелки, или введите несколько символов чтобы выбрать нужный шаблон. {{keypress|Enter}} создаст выделенный шаблон, а {{keypress|Escape}} закроет список шаблонов.
  
==Parameter Hints==
+
Больше всего времени экономит шаблон 'b'+{{keypress|Ctrl}}+{{keypress|J}} для begin..end.
  
Parameter Hints shows a hint box with the parameter declarations for the current parameter list.
+
==Подсказка для параметров==
  
For example
+
Подсказка для параметров позволяет посмотреть список параметров для процедур и функций. Жирным шрифтом выделяется текущий параметр.
  
  Canvas.FillRect(|);
+
Например:
  
Place the cursor in the brackets and press {{keypress|Ctrl}}+{{keypress|Shift}}+{{keypress|space}}. A hint box will show up showing the parameters of FillRect.
+
<syntaxhighlight lang=pascal>
 +
  Canvas.FillRect();
 +
</syntaxhighlight>
  
==Incremental Search==
+
Поместите курсор внутри скобок и нажмите {{keypress|Ctrl}}+{{keypress|Shift}}+{{keypress|space}}. Появится подсказка с параметрами процедуры FillRect.
  
Incremental Search changes the statusbar of the source editor. Type some characters and the editor will search and highlight immediately all occurrences in the text. Shortcut is {{keypress|Ctrl}}+{{keypress|e}}.
+
[[Image:Parameterhints1.png]]
*For example pressing {{keypress|e}} will search and highlight all occurrences of 'e'.
 
*Then pressing {{keypress|t}} will search and highlight all occurrences of 'et' and so forth.
 
*You can jump to the next with {{keypress|F3}} (or {{keypress|Ctrl}}+{{keypress|e}} while in search) and the previous with {{keypress|Shift}}+{{keypress|F3}}.
 
*Backspace deletes the last character
 
*return stops the search without adding a new line in the editor.
 
*You can resume the last search by pressing {{keypress|Ctrl}}+{{keypress|e}} a second time, immediately after you started incr-search with {{keypress|Ctrl}}+{{keypress|e}}. that is while the search term is still empty.
 
*Paste {{keypress|Ctrl}}+{{keypress|V}} will append the text from the clipboard to the current search text (since lazarus 0.9.27 r19824).
 
  
===Hint: Quick searching an identifier with incremental search===
+
Начиная с версии 0.9.31, справа от каждой декларации имеется кнопка, вставляющая отсутствующие параметры. Это скопирует имена параметров из выбранного объявления в позицию курсора.
  
*Place text cursor on identifier (do not select anything)
+
[[Image:Parameterhints2.png]]
*Press {{keypress|Ctrl}}+{{keypress|C}}. The source editor will select the identifier and copy it to the clipboard
 
*Press {{keypress|Ctrl}}+{{keypress|E}} to start incremental search
 
*Press {{keypress|Ctrl}}+{{keypress|V}} to search for the identifier (since 0.9.27)
 
*Use {{keypress|F3}} and {{keypress|Shift}}+{{keypress|F3}} to quickly jump to next/previous.
 
*Use any key (for example cursor left or right) to end the search
 
  
==Syncro Edit==
+
Подсказка: используйте [[Lazarus_IDE_Tools/ru#Автозавершение объявления переменной|Автозавершение объявления переменной]], чтобы объявить переменные.
  
Syncro Edit allows you to edit all occurrences of a word at the same time (synchronized). You simple edit the word in one place, and as you type, all other occurrences of the word are updated too.
+
{{Note| Имя ярлычка - "Show code context"[("Показать контекст кода")].}}
  
Syncro Edit works on all words in a selected area:
+
==Последовательный поиск==
* Select a block of text
 
* press {{keypress|Ctrl}}+{{keypress|J}} or click the icon in the gutter. (This only work, if there are any words that occur more than once in the selection.
 
* use the {{keypress|tab}} key to select the word you want to edit (if several different words occurred more than once)
 
* Edit the word
 
* Press {{keypress|Esc}} to finish
 
  
See an animated example [[New_IDE_features_since#Syncron-Edit|here]]
+
Последовательный поиск изменяет строку состояния редактора исходного кода. Введите несколько символов, и редактор тут же будет их искать, выделяя все вхождения в тексте. Для вызова поиска, нажмите: {{keypress|Ctrl}}+{{keypress|e}}.
 +
*Например, нажмите {{keypress|e}} произведёт поиск и выделение всех букв «е» в коде.
 +
*Затем, нажав {{keypress|t}} будет произведён поиск и выделение всех вхождений «et» и так далее.
 +
*Вы можете использовать быстрый переход между найденными позициями в тексте нужной строки. Для быстрого перехода вниз по тексту, используйте {{keypress|F3}} (или {{keypress|Ctrl}}+{{keypress|e}} во время поиска). Для быстрого перехода вверх по тексту, используйте {{keypress|Shift}}+{{keypress|F3}}.
 +
*{{keypress|Backspace}} удаляет последний символ
 +
*{{keypress|Enter}} останавливает поиск без добавления новой строки в редакторе.
 +
*Вы можете возобновить последний поиск, нажав {{keypress|Ctrl}}+{{keypress|e}} во второй раз, сразу же после начала последовательного поиска используя {{keypress|Ctrl}}+{{keypress|e}}. т.е. когда строка поиска пуста.
 +
*Вставка {{keypress|Ctrl}}+{{keypress|V}} добавит строку из буфера обмена к текущему искомому тексту. (так же как в lazarus 0.9.27 r19824).
  
* Note: {{keypress|Ctrl}}+{{keypress|J}}  is also used for template edit. It switches it's meaning if you select some text.
+
===Пример использования последовательного поиска для поиска слова===
  
==Find next / previous word occurrence==
+
*Поместите курсор на нужное слово, не выделяя его
 +
*Нажмите {{keypress|Ctrl}}+{{keypress|C}}. Редактор исходного кода выделит слово и скопирует его в буфер обмена.
 +
*Нажмите {{keypress|Ctrl}}+{{keypress|E}} для начала последовательного поиска
 +
*Нажмите {{keypress|Ctrl}}+{{keypress|V}} для поиска идентификатора (так же, как в 0.9.27)
 +
*Используйте {{keypress|F3}} и {{keypress|Shift}}+{{keypress|F3}} для быстрого перехода к следующему / предыдущему найденному участку текста.
 +
*Используйте любую клавишу (например курсор влево или вправо), чтобы закончить поиск
  
The two functions can be found in the popup menu of the source editor
+
==Синхронная правка==
  
*Source editor / popup menu / Find / Find next word occurrence
+
Синхронная правка позволяет редактировать все места присутствия слова в тексте одновременно (синхронно). Вы просто изменяете, слово в одном месте и все остальные вхождения слова в тексте изменяются автоматически.
*Source editor / popup menu / Find / Find previous word occurrence
 
  
And you can assign them shortcuts in the editor options.
+
Синхронная правка влияет на все слова в выделенной области текста. Пример использования:
 +
* Выделите блок текста
 +
* Нажмите {{keypress|Ctrl}}+{{keypress|J}} или воспользуйтесь соответствующим значком. (Это работает только, если есть какие-либо слова, которые встречаются более одного раза в выделенном тексте.)
 +
* Используйте клавишу {{keypress|tab}} для выделения слова, которое вы хотите изменить. (если было выделено несколько разных слов более одного раза)
 +
* Измените слово
 +
* Нажмите {{keypress|Esc}} для окончание работы с синхронной правкой
  
==Code Completion==
+
См. анимированный пример [[New_IDE_features_since#Syncron-Edit|здесь]]
Code Completion can be found in the IDE menu Edit -> Complete Code and has as standard short cut {{keypress|Ctrl|Shift|C}}.
 
  
For Delphians:
+
{{Note| {{keypress|Ctrl}}+{{keypress|J}} также используется для редактирования шаблона. [Это сочетание клавиш] переключает свое значение, если вы выберете какой-то текст. }}
Delphi calls "code completion" the function showing the list of identifiers at the current source position ({{keypress|Ctrl|Space}}). Under Lazarus this is called "Identifier completion".
 
  
Code Completion combines several powerful functions. Examples:
+
==Поиск следующего / предыдущего вхождения слова==
* Class Completion: completes properties, adds/updates method bodies, add private variables and private access methods
 
* Forward Procedure Completion: adds procedure bodies
 
* Event Assignment Completion: completes event assignments and adds method definition and body
 
* Variable Declaration Completion: adds local variable definitions
 
* Procedure Call Completion: adds a new procedure
 
* Reversed procedure completion: adds procedure declarations for procedure/function bodies
 
* Reversed class completion: adds method declarations for method bodies
 
  
Which function is used, depends on the cursor position in the editor and will be explained below.
+
Обе функции можно найти в контекстном меню редактора исходного кода
  
Code Completion can be found in the IDE menu Edit -> Complete Code and has as standard short cut {{keypress|Ctrl|Shift|C}}.
+
*Редактор кода / контекстное меню / Найти / Найти следующее вхождение слова
 +
*Редактор кода / контекстное меню / Найти / Найти предыдущее вхождение слова
  
===Class Completion===
+
Вы можете назначить данным пунктам сочетания клавиш в окне настройки редактора исходного кода. Для этого выберите меню "Сервис->Параметры" и в левой части появившегося окна выберите  "Редактор->Комбинации клавиш".
  
The most powerful code completion feature is "Class Completion". You write a class, add the methods and properties and Code Completion will add the method bodies, the property access methods/variables and the private variables.  
+
==Автозавершение Кода==
 +
Автозавершение кода можно найти в меню IDE Edit -> Complete Code, а так же используя сочетания клавиш: {{keypress|Ctrl|Shift|C}}.
  
For example: Create a class (see Code Templates to save you some type work):
+
Для Делфистов:
 +
В Delphi, это называется "автозавершение кода"(code completion) - специальная функция, показывающая список идентификаторов, в текущей позиции исходного кода (({{keypress|Ctrl|Пробел}}). В Lazarus это называется "автозавершение идентификаторов"(Identifier completion).
  
 +
Автозавершение кода сочетает в себе несколько мощных функций, например:
 +
* [[Lazarus_IDE_Tools/ru#Автозавершение класса|Автозавершение класса]]: завершает объявление свойств, добавляет/обновляет тело метода, добавляет переменные и методы в раздел private класса.
 +
* [[Lazarus_IDE_Tools/ru#Автозавершение предварительно объявленной процедуры|Автозавершение предварительно объявленной процедуры]]: добавляет тело процедуры.
 +
* [[Lazarus_IDE_Tools/ru#Автозавершение назначенных процедур обработки событий|Автозавершение назначенных процедур обработки событий]]: завершает связи с событием, добавляя определения методов и их тел.
 +
* [[Lazarus_IDE_Tools/ru#Автозавершение объявления переменной|Автозавершение объявления переменной]]: добавляет определённые локальные переменные.
 +
* [[Lazarus_IDE_Tools/ru#Автозавершение объявления вызываемой процедуры|Автозавершение объявления вызываемой процедуры]]: добавляет новую процедуру.
 +
* [[#Reversed Procedure Completion|Reversed procedure completion]]: добавление объявления процедур/функций ([[User:Zoltanleo|Прим.перев.]] 08:28, 26 October 2018 (CEST): Раздел временно отсутствует)
 +
* [[Lazarus_IDE_Tools/ru#Автозавершение предшествующего объявления класса|Автозавершение предшествующего объявления класса]]: добавление объявления метода для тела метода внутри класса.
 +
 +
Какая из этих функций будет использована, зависит от позиции курсора в редакторе кода.
 +
 +
Автозавершение кода можно найти в меню IDE Edit -> Complete Code, [а также вызвать] стандартным сочетанием клавиш {{keypress|Ctrl|Shift|C}}.
 +
 +
===Автозавершение класса===
 +
 +
Наиболее мощная функция завершения кода является "Автозавершение класса". Вы пишете скелет класса, добавляя в него методы и свойства. Автозавершение кода автоматически завершит их объявления, добавив нужные переменные, тело для реализации метода или свойства, определит способ доступа к ним а так же поля класса.
 +
 +
Например: создайте класс (для быстроты можете использовать шаблоны кода):
 +
 +
<syntaxhighlight lang=pascal>
 
  TExample = class(TObject)
 
  TExample = class(TObject)
 
  public
 
  public
 
   constructor Create;
 
   constructor Create;
 
   destructor Destroy; override;
 
   destructor Destroy; override;
  end;
+
  end;</syntaxhighlight>
Position the cursor somewhere in the class and press {{keypress|Ctrl|Shift|C}}. This will create the method missing bodies and move the cursor to the first created method body, so you can just start writing the class code:  
+
Поместите курсор где-то внутри класса и нажмите {{keypress|Ctrl|Shift|C}}. Это позволит создать скелет для реализации методов и поместит курсор внутри тела метода:
  
{ TExample }
+
<syntaxhighlight lang=pascal> { TExample }
 
   
 
   
 
  constructor TExample.Create;
 
  constructor TExample.Create;
Line 207: Line 226:
 
  begin
 
  begin
 
   inherited Destroy;
 
   inherited Destroy;
  end;
+
  end;</syntaxhighlight>
Note: The '|' is the cursor and is not added.  
+
 
 +
{{Note| символом '&#124;' обозначена позиция курсора в коде.}}
  
Hint: You can jump between a method and its body with {{keypress|Ctrl|Shift|Up}}.  
+
Подсказка: Вы можете переключаться между методом и его телом, используя клавиши {{keypress|Ctrl|Shift|Up}}.  
  
You can see, that the IDE added the 'inherited Destroy' call too. This is done, if there is an 'override' keyword in the class definition.  
+
Вы можете увидеть, что IDE добавило вызов 'inherited Destroy'. Это происходит, когда в объявлении метода используется ключевое слово  'override'.
  
Now add a method DoSomething:  
+
Теперь добавьте метод DoSomething:  
  
TExample = class(TObject)
+
<syntaxhighlight lang=pascal> TExample = class(TObject)
 
  public
 
  public
 
   constructor Create;
 
   constructor Create;
 
   procedure DoSomething(i: integer);
 
   procedure DoSomething(i: integer);
 
   destructor Destroy; override;
 
   destructor Destroy; override;
  end;
+
  end;</syntaxhighlight>
  
Then press {{keypress|Ctrl|Shift|C}} and the IDE will add
+
Нажмите {{keypress|Ctrl|Shift|C}} и IDE завершит его, добавив:
  
procedure TExample.DoSomething(i: integer);
+
<syntaxhighlight lang=pascal> procedure TExample.DoSomething(i: integer);
 
  begin
 
  begin
 
   |
 
   |
  end;
+
  end;</syntaxhighlight>
You can see, that the new method body is inserted between Create and Destroy, exactly as in the class definition. This way the bodies keep the same logical ordering as you define. You can define the insertion policy in Environment > Codetools Options -> Code Creation.  
+
Вы можете определить поведение вставки кода в Environment > Codetools Options -> Code Creation.
  
'''Complete Properties'''<br>
+
'''Завершение свойств'''<br>
Add a property AnInteger:
+
Добавьте свойство AnInteger:
TExample = class(TObject)
+
<syntaxhighlight lang=pascal> TExample = class(TObject)
 
  public
 
  public
 
   constructor Create;
 
   constructor Create;
Line 239: Line 259:
 
   destructor Destroy; override;
 
   destructor Destroy; override;
 
   property AnInteger: Integer;
 
   property AnInteger: Integer;
  end;
+
  end;</syntaxhighlight>
Press Ctrl+Shift+C and you will get:
+
Нажмите Ctrl+Shift+C и вы получите:
procedure TExample.SetAnInteger(const AValue: integer);
+
<syntaxhighlight lang=pascal> procedure TExample.SetAnInteger(const AValue: integer);
 
  begin
 
  begin
 
   |if FAnInteger=AValue then exit;
 
   |if FAnInteger=AValue then exit;
 
   FAnInteger:=AValue;
 
   FAnInteger:=AValue;
  end;
+
  end;</syntaxhighlight>
The code completion has added a Write access modifier and added some common code.
+
Функция автозавершения кода добавила поля класса и метод, используемые при обращении к свойству.
Jump to the class with {{keypress|Ctrl|Shift|Up}} to see the new class:
+
Нажмите {{keypress|Ctrl|Shift|Up}} для просмотра определения класса:
TExample = class(TObject)
+
<syntaxhighlight lang=pascal> TExample = class(TObject)
 
  private
 
  private
 
   FAnInteger: integer;
 
   FAnInteger: integer;
Line 257: Line 277:
 
   destructor Destroy; override;
 
   destructor Destroy; override;
 
   property AnInteger: integer read FAnInteger write SetAnInteger;
 
   property AnInteger: integer read FAnInteger write SetAnInteger;
  end;
+
  end;</syntaxhighlight>
The property was extended by a Read and Write access modifier. The class got the new section 'private' with a Variable 'FAnInteger' and the method 'SetAnInteger'.
+
Свойство было изменено. Добавлены ключевые слова Read и Write. Класс получил новый раздел 'private' с полем 'FAnInteger' и методом 'SetAnInteger'.
It is a common Delphi style rule to prepend private variables with an 'F' and the write method with a 'Set'. If you don't like that, you can change this in Environment > Codetools Options -> Code Creation.
+
Это общий стиль Delphi, использовать в названиях полей букву 'F' (Field). И в методах на запись слово 'Set'. Данные настройки можно изменить в Environment > Codetools Options -> Code Creation.
  
Creating a read only property:
+
Создание свойства только для чтения:
property PropName: PropType read;
+
<syntaxhighlight lang=pascal> property PropName: PropType read;</syntaxhighlight>
Will be expanded to
+
Будет расширено до:
property PropName: PropType read FPropName;
+
<syntaxhighlight lang=pascal> property PropName: PropType read FPropName;</syntaxhighlight>
Creating a write only property:
+
Создание свойства только для записи:
  property PropName: PropType write;
+
<syntaxhighlight lang=pascal>  property PropName: PropType write;</syntaxhighlight>
Will be expanded to
+
Будет расширено до:
property PropName: PropType write SetPropName;
+
<syntaxhighlight lang=pascal> property PropName: PropType write SetPropName;</syntaxhighlight>
Creating a read only property with a Read method:
+
Создание свойства только для чтения с указанием метода:
property PropName: PropType read GetPropName;
+
<syntaxhighlight lang=pascal> property PropName: PropType read GetPropName;</syntaxhighlight>
Will be kept and a GetPropName function will be added:
+
Будет добавлена функция GetPropName:
function GetpropName: PropType;
+
<syntaxhighlight lang=pascal> function GetpropName: PropType;</syntaxhighlight>
Creating a property with a stored modifier:
+
Создание свойства с ключевым словом stored:
property PropName: PropType stored;
+
<syntaxhighlight lang=pascal> property PropName: PropType stored;</syntaxhighlight>
Will be expanded to
+
Будет расширено до:
property PropName: PropType read FPropName write SetPropName stored PropNameIsStored;
+
<syntaxhighlight lang=pascal> property PropName: PropType read FPropName write SetPropName stored PropNameIsStored;</syntaxhighlight>
Because stored is used for streaming read and write modifiers are automatically added as well.
+
Так как ключевое слово <tt>stored</tt> используется для потокового чтения и записи, нужные  поля и процедуры также будут добавлены автоматически.
  
Hint:
+
Подсказка:
Identifier completion also recognizes incomplete properties and will suggest the default names. For example:
+
Автозавершение идентификатора также распознает неполные свойства и [взамен] предлагает имена по умолчанию. Например:
property PropName: PropType read |;
+
<syntaxhighlight lang=pascal>property PropName: PropType read |;</syntaxhighlight>
Place the cursor one space behind the 'read' keyword and press Ctrl+Space for the identifier completion. It will present you the variable 'FPropName' and the procedure 'SetPropName'.
+
Поместите курсор сразу за ключевым словом '''read''' и нажмите {{keypress|Ctrl}}+{{keypress|Space}} для автозавершения идентификатора. Он предоставит вам переменную '''FPropName''' и процедуру '''SetPropName'''.
  
===Forward Procedure Completion===
+
===Автозавершение предварительно объявленной процедуры===
"Forward Procedure Completion" is part of the Code Completion and adds missing procedure bodies. It is invoked, when the cursor is on a forward defined procedure.
+
"Автозавершение предварительно объявленной процедуры" является частью автозавершения кода и добавляет отсутствующее тело процедуры. Оно вызывается, когда курсор находится в объявлении заданной процедуры.
  
For example:
+
Например:
Add a new procedure to the interface section:
+
Добавьте новую процедуру в раздел интерфейса:
procedure DoSomething;
+
<syntaxhighlight lang=pascal> procedure DoSomething;</syntaxhighlight>
Place the cursor on it and press {{keypress|Ctrl|Shift|C}} for code completion. It will create in the implementation section:
+
Поместите в нее курсор и нажмите {{keypress|Ctrl|Shift|C}} для автозавершения кода. Он будет создан в разделе реализации:
procedure DoSomething;
+
<syntaxhighlight lang=pascal> procedure DoSomething;
 
  begin
 
  begin
 
   |
 
   |
  end;
+
  end;</syntaxhighlight>
Hint: You can jump between a procedure definition and its body with {{keypress|Ctrl|Shift|Up}}.
+
Подсказка: вы можете быстро перемещаться между объявлением процедуры и ее телом с помощью {{keypress|Ctrl|Shift|Up}}.
  
The new procedure body will be added in front of the class methods. If there are already some procedures in the interface the IDE tries to keep the ordering. For example:
+
Новое тело процедуры будет добавлено перед методами класса. Если в интерфейсе уже есть некоторые процедуры, IDE попытается сохранить [их] порядок. Например:
  procedure Proc1;
+
<syntaxhighlight lang=pascal>  procedure Proc1;
   procedure Proc2; // new proc
+
   procedure Proc2; // новая процедура
   procedure Proc3;
+
   procedure Proc3;</syntaxhighlight>
If the bodies of Proc1 and Proc3 already exists, then the Proc2 body will be inserted between the bodies of Proc1 and Proc3. This behaviour can be setup in Environment > Codetools Options -> Code Creation.
+
Если тела Proc1 и Proc3 уже существуют, то тело Proc2 будет вставлено между телами Proc1 и Proc3. Такое поведение можно настроить в Environment > Codetools Options -> Code Creation.
  
Multiple procedures:
+
Несколько процедур:
procedure Proc1_Old; // body exists
+
<syntaxhighlight lang=pascal> procedure Proc1_Old; // тело [процедуры уже] существует
  procedure Proc2_New; // body does not exists
+
  procedure Proc2_New; // тело [процедуры еще] не существует
 
  procedure Proc3_New; //  "
 
  procedure Proc3_New; //  "
 
  procedure Proc4_New; //  "
 
  procedure Proc4_New; //  "
  procedure Proc5_Old; // body exists
+
  procedure Proc5_Old; // тело [процедуры уже] существует</syntaxhighlight>
Code Completion will add all 3 procedure bodies (Proc2_New, Proc3_New, Proc4_New).
+
Автозавершение кода добавит тела всех 3 процедур(Proc2_New, Proc3_New, Proc4_New).
 +
 
 +
Почему это называется "Автозавершение предварительно объявленной процедуры"?
 +
 
 +
Потому что это работает не только для процедур, определенных в интерфейсе, но и для процедур[, определенных] с помощью "предварительно объявленного" модификатора. И потому что утилиты кода обрабатывают процедуры в интерфейсе как имеющие неявный "предварительно объявленный" модификатор.
 +
 
 +
===Автозавершение назначенных процедур обработки событий===
 +
"Автозавершение назначенных процедур обработки событий" является частью автозавершения кода и завершает единственный оператор Event:=|. Он вызывается, когда курсор находится за назначенным событием.
 +
 
 +
Например:
 +
В методе, скажем, событие FormCreate, добавьте строку 'OnPaint:=':
 +
<syntaxhighlight lang=pascal>procedure TForm1.Form1Create(Sender: TObject);
 +
begin
 +
  OnPaint:=|
 +
end;</syntaxhighlight>
 +
 
 +
'|' - это курсор, и его не следует вводить.
 +
Затем нажмите {{keypress|Ctrl}}+{{keypress|Shift}}+{{keypress|C}}  для завершения кода. Оператор будет завершен
 +
<syntaxhighlight lang=pascal>OnPaint:=@Form1Paint;</syntaxhighlight>
 +
Новый метод Form1Paint будет добавлен в класс TForm1. Затем запустится автозавершение класса, и вы получите:
 +
<syntaxhighlight lang=pascal>procedure TForm1.Form1Paint(Sender: TObject);
 +
begin
 +
  |
 +
end;</syntaxhighlight>
 +
Это работает так же, как добавление методов в инспекторе объектов.
  
Why calling it "Forward Procedure Completion"?
+
{{Note| Вы должны поместить курсор сразу после оператора присваивания ':&#61;'. Если вы поместите курсор на идентификатор (например, OnPaint), то автозавершение кода вызовет «Автозавершение локальной переменной», что не удастся, поскольку OnPaint уже определен.}}
  
Because it does not only work for procedures defined in the interface, but for procedures with the "forward" modifier as well. And because the codetools treats procedures in the interface as having an implicit 'forward' modifier.
+
Подсказка:<br>
 +
*Вы можете выбрать видимость по умолчанию для нового метода в разделе Tools / Options / Codetools / Class Completion / Default (начиная с версии 1.8)
 +
* Вы можете определить имя нового метода самостоятельно. Например:
 +
<syntaxhighlight lang=pascal>  OnPaint:=@ThePaintMethod;</syntaxhighlight>
  
===Event Assignment Completion===
 
"Event Assignment Completion" is part of the Code Completion and completes a single Event:=| statement. It is invoked, when the cursor is behind an assignment to an event.
 
  
For example:
+
Начиная с 0.9.31 Lazarus автозавершает параметры процедуры. Например
In a method, say the FormCreate event, add a line 'OnPaint:=':
 
procedure TForm1.Form1Create(Sender: TObject);
 
begin
 
  OnPaint:=|
 
end;
 
The '|' is the cursor and should not be typed.
 
Then press Ctrl+Shift+C for code completion. The statement will be completed to
 
OnPaint:=@Form1Paint;
 
A new method Form1Paint will be added to the TForm1 class. Then class completion is started and you get:
 
procedure TForm1.Form1Paint(Sender: TObject);
 
begin
 
  |
 
end;
 
This works just like adding methods in the object inspector.
 
  
Note:<br>
+
<syntaxhighlight lang=pascal>procedure TForm1.FormCreate(Sender: TObject);
You must place the cursor behind the ':=' assignment operator. If you place the cursor on the identifier (e.g. OnPaint) code completion will invoke "Local Variable Completion", which fails, because OnPaint is already defined.
+
var
 +
  List: TList;
 +
begin
 +
  List:=TList.Create;
 +
  List.Sort(@MySortFunction|);
 +
end;</syntaxhighlight>
  
Hint:<br>
+
Поместите курсор на 'MySortFunction' и нажмите {{keypress|Ctrl|Shift|C}} для автозавершения кода. Вы получите новую процедуру:
You can define the new method name by yourself. For example:
 
  OnPaint:=@ThePaintMethod;
 
  
===Variable Declaration Completion===
+
<syntaxhighlight lang=pascal>function MySortFunction(Item1, Item2: Pointer): Integer;
"Variable Declaration Completion" is part of the Code Completion and adds a local variable definition for a Identifier:=Term; statement. It is invoked, when the cursor is on the identifier of an assignment or a parameter.
+
begin
 +
  |
 +
end;
  
For example:
+
procedure TForm1.FormCreate(Sender: TObject);
<delphi>
+
var
procedure TForm1.Form1Create(Sender: TObject);
+
  List: TList;
 +
begin
 +
  List:=TList.Create;
 +
  List.Sort(@MySortFunction);
 +
end;</syntaxhighlight>
 +
 
 +
===Автозавершение объявления переменной===
 +
"Автозавершение объявления переменной" является частью завершения кода и добавляет определение локальной переменной для [оператора] <tt>Identifier:=Term</tt> [(Идентификатор:=Выражение)]. Он вызывается, когда курсор находится на идентификаторе присвоения или параметра.
 +
 
 +
Например:
 +
<syntaxhighlight lang=pascal>procedure TForm1.Form1Create(Sender: TObject);
 
begin
 
begin
 
   i:=3;
 
   i:=3;
end;
+
end;</syntaxhighlight>
</delphi>
+
Поместите курсор на '<tt>i</tt>' или сразу за ним. Затем нажмите {{keypress|Ctrl|Shift|C}} для автозавершения кода, и вы получите:
Place the cursor on the 'i' or just behind it. Then press {{keypress|Ctrl|Shift|C}} for code completion and you will get:
+
<syntaxhighlight lang=pascal>procedure TForm1.Form1Create(Sender: TObject);
<delphi>
 
procedure TForm1.Form1Create(Sender: TObject);
 
 
var
 
var
 
   i: Integer;
 
   i: Integer;
 
begin
 
begin
 
   i:=3;
 
   i:=3;
end;
+
end;</syntaxhighlight>
</delphi>
+
 
The codetools first checks, if the identifier 'i' is already defined and if not it will add the declaration 'var i: integer;'. The type of the identifier is guessed from the term right to the assignment ':=' operator. Numbers like the 3 defaults to Integer.
+
Утилиты кода сначала проверяют код [на наличие объявления] идентификатора '<tt>i</tt>', и если [таковой не найден], то добавляют объявление '<tt>var i: integer;</tt>'. Тип идентификатора угадывается из выражения[, расположенного] справа от оператора присвоения '<tt>:=</tt>'. Числа, такие как 3, по умолчанию [будут иметь тип] Integer.
  
Another example:
+
Другой пример:
<delphi>
+
<syntaxhighlight lang=pascal>type
type
 
 
   TWhere = (Behind, Middle, InFront);
 
   TWhere = (Behind, Middle, InFront);
 
   
 
   
Line 372: Line 415:
 
   begin
 
   begin
 
     for Where:=Low(a) to High(a) do writeln(a[Where]);
 
     for Where:=Low(a) to High(a) do writeln(a[Where]);
   end;
+
   end;</syntaxhighlight>
</delphi>
+
 
Place the cursor on 'Where' and press {{keypress|Ctrl|Shift|C}} for code completion. You get:
+
Поместите курсор на 'Where' и нажмите {{keypress|Ctrl|Shift|C}} для автозавершения кода. Вы получите:
<delphi>
+
<syntaxhighlight lang=pascal> procedure TForm1.Form1Create(Sender: TObject);
  procedure TForm1.Form1Create(Sender: TObject);
 
 
   var
 
   var
 
     a: array[TWhere] of char;
 
     a: array[TWhere] of char;
Line 382: Line 424:
 
   begin
 
   begin
 
     for Where:=Low(a) to High(a) do writeln(a[Where]);
 
     for Where:=Low(a) to High(a) do writeln(a[Where]);
   end;
+
   end;</syntaxhighlight>
</delphi>
 
  
Since 0.9.11 Lazarus also completes parameters. For example
+
Начиная с 0.9.11 Lazarus также автозавершает параметры. Например
<delphi>
+
<syntaxhighlight lang=pascal> procedure TForm1.FormPaint(Sender: TObject);
  procedure TForm1.FormPaint(Sender: TObject);
 
 
   begin
 
   begin
 
     with Canvas do begin
 
     with Canvas do begin
 
       Line(x1,y1,x2,y2);
 
       Line(x1,y1,x2,y2);
 
     end;
 
     end;
   end;
+
   end;</syntaxhighlight>
</delphi>
+
 
Place the cursor on 'x1' and press {{keypress|Ctrl|Shift|C}} for code completion. You get:
+
Поместите курсор на 'x1' и нажмите {{keypress|Ctrl|Shift|C}} для автозавершения кода. Вы получите:
<delphi>
+
<syntaxhighlight lang=pascal> procedure TForm1.FormPaint(Sender: TObject);
  procedure TForm1.FormPaint(Sender: TObject);
 
 
   var
 
   var
 
     x1: integer;
 
     x1: integer;
Line 403: Line 442:
 
       Line(x1,y1,x2,y2);
 
       Line(x1,y1,x2,y2);
 
     end;
 
     end;
   end;
+
   end;</syntaxhighlight>
</delphi>
+
 
 +
Начиная с 0.9.31 Lazarus автозавершает параметры указателя. Например
 +
 
 +
<syntaxhighlight lang=pascal>  procedure TForm1.FormCreate(Sender: TObject);
 +
  begin
 +
    CreateIconIndirect(@IconInfo);
 +
  end;</syntaxhighlight>
 +
 
 +
Поместите курсор в 'IconInfo' и нажмите {{keypress|Ctrl|Shift|C}} для автозавершения кода. Вы получите:
 +
<syntaxhighlight lang=pascal>  procedure TForm1.FormCreate(Sender: TObject);
 +
  var
 +
    IconInfo: TIconInfo;
 +
  begin
 +
    CreateIconIndirect(@IconInfo);
 +
  end;</syntaxhighlight>
 +
 
 +
Во всех приведенных выше примерах вы можете использовать {{keypress|Ctrl|Shift|X}}, чтобы отобразить диалоговое окно создания кода, в котором вы можете установить дополнительные параметры.
  
===Procedure Call Completion===
+
===Автозавершение объявления вызываемой процедуры===
Code completion can create a new procedure from a call statement itself.
+
[Механизм] автозавершение кода может создать [тело] новой процедуры из места ее объявления.
  
Assume you just wrote the statement "DoSomething(Width);"
+
Допустим, вы просто написали объявление "<tt>DoSomething(Width);</tt>"
<delphi>
+
<syntaxhighlight lang=pascal>procedure SomeProcedure;
procedure SomeProcedure;
 
 
var
 
var
 
   Width: integer;
 
   Width: integer;
Line 417: Line 471:
 
   Width:=3;
 
   Width:=3;
 
   DoSomething(Width);
 
   DoSomething(Width);
end;
+
end;</syntaxhighlight>
</delphi>
 
  
Position the cursor over the identifier "DoSomething" and press {{keypress|Ctrl|Shift|C}} to get:
+
Поместите курсор над идентификатором "DoSomething" и нажмите {{keypress|Ctrl|Shift|C}}, чтобы получить:
  
<delphi>
+
<syntaxhighlight lang=pascal>procedure DoSomething(aWidth: LongInt);
procedure DoSomething(aWidth: LongInt);
 
 
begin
 
begin
  
Line 434: Line 486:
 
   Width:=3;
 
   Width:=3;
 
   DoSomething(Width);
 
   DoSomething(Width);
end;
+
end;</syntaxhighlight>
</delphi>
 
  
It does not yet create functions nor methods.
+
Это еще не создает функции или методы.
  
===Reversed Class Completion===
+
===Автозавершение предшествующего объявления класса===
  
"Reversed Class Completion" is part of the '''Code Completion''' and adds a private method declaration for the current method body. It is invoked, when the cursor is in a method body, not yet defined in the class.
+
"Автозавершение предшествующего объявления класса" является частью '''Code Completion''' [(Автозавершения кода), который] добавляет объявление для текущего тела метода в private [разделе интерфейсной части модуля]. Он вызывается, когда курсор находится в теле метода, еще не определенном в классе.
This feature is available since Lazarus 0.9.21.
+
Эта функция доступна с Lazarus 0.9.21.
  
For example:
+
Например:
  procedure TForm1.DoSomething(Sender: TObject);
+
<syntaxhighlight lang=pascal>  procedure TForm1.DoSomething(Sender: TObject);
 
   begin
 
   begin
   end;
+
   end;</syntaxhighlight>
 +
 
 +
Метод DoSomething еще не объявлен в TForm1. Нажмите {{keypress|Ctrl|Shift|C}}, и в IDE будет добавлена "<tt>procedure DoSomething(Sender: TObject);</tt>" в private-разделе TForm1.
 +
 
 +
Для дельфийцев:
 +
Автозавершение класса работает в Lazarus всегда одним способом: от класса интерфейсного [раздела модуля] к [разделу]  реализации или наоборот, от класса в [разделе] реализации к [разделу] интерфейса. Delphi всегда вызывает оба направления. Недостаток способа Delphi заключается в том, что при опечатке легко создать новый метод, не заметив [этого].
 +
 
  
The method DoSomething is not yet declared in TForm1. Press {{keypress|Ctrl|Shift|C}} and the IDE will add "procedure DoSomething(Sender: TObject);" to the private methods of TForm1.
+
----
 +
[[User:Zoltanleo|Прим.перев.]] 09:08, 30 October 2018 (CET):  Очевидно имеется ввиду следующее: в Lazarus'е достаточно чуть изменить название метода (справедливо и для параметров) в интерфейсной части модуля и нажать {{keypress|Ctrl|Shift|C}}, и механизм Code Completion автоматически внесет правки в название уже имеющегося тела метода в разделе implementation. То же справедливо и для случая, когда меняется название метода (справедливо и для параметров) в разделе implementation, а затем вызывается Code Completion - в разделе interface будут внесены соответствующие правки.
  
For Delphians:
+
В Delphi, если тело метода уже существует, то изменение имени метода в разделе interface приведет к созданию тела метода в разделе implementation с измененным именем в дополнению к уже имеющемуся со старым именем. Это, естественно, вызовет ошибку при компиляции проекта.
Class completion works under Lazarus always in one way: From class interface to implementation or backwards/reversed from class implementation to interface. Delphi always invokes both directions. The Delphi way has the disadvantage, that if a typo will easily create a new method stub without noticing.
+
----
  
===Comments and Code Completion===
+
===Комментарии и автозавершение кода===
Code completion tries to keep comments where they belong.  
+
Автозавершение кода пытается сохранять комментарии, принадлежащие [завершаемому коду].
For example:
+
Например:
  FList: TList; // list of TComponent
+
<syntaxhighlight lang=pascal>  FList: TList; // список TComponent
   FInt: integer;
+
   FInt: integer;</syntaxhighlight>
When inserting a new variable between FList and FInt, the comment is kept in the FList line. Same is true for
+
При вставке новой переменной между FList и FInd комментарий сохраняется в строке FList. То же самое верно для
  FList: TList; { list of TComponent
+
<syntaxhighlight lang=pascal>  FList: TList; { список TComponent
     This is a comment over several lines, starting
+
     Это комментарий по нескольким строкам, начиная
    in the FList line, so codetools assumes it belongs
+
    со строки FList, поэтому codetools предполагает, что он принадлежит
    to the FLIst line and will not break this
+
    к линии FLIst и не будет [терять с ним]
    relationship. Code is inserted behind the comment. }
+
    связь. Код добавляется за комментарием.}
   FInt: integer;
+
   FInt: integer;</syntaxhighlight>
If the comment starts in the next line, then it will be treated as if it belongs to the code below. For example:
+
Если комментарий начинается со следующей строки, он будет обрабатываться так, как если бы он принадлежал коду ниже. Например:
  FList: TList; // list of TComponent
+
<syntaxhighlight lang=pascal>  FList: TList; // список TComponent
     { This comment belongs to the statement below.  
+
     { Этот комментарий относится к приведенному ниже операнду.
      New code is inserted above this comment and
+
      Новый код вставлен над этим комментарием и
      behind the comment of the FList line. }
+
      позади комментария [для] FList.}
   FInt: integer;
+
   FInt: integer;</syntaxhighlight>
  
===Method update===
+
===Обновление метода===
Normally class completion will add all missing method bodies. (Since 0.9.27) But if exactly one method differ between class and bodies then the method body is updated. For example: You have a method ''DoSomething''.
+
Обычно автозавершение класса добавляет все отсутствующие тела методов. (Начиная с 0.9.27). Но если именно один метод отличается между [объявлением в] классе и теле, то тело метода обновляется. Например: у вас есть метод ''DoSomething''.
<Delphi>
+
<syntaxhighlight lang=pascal> public
  public
 
 
     procedure DoSomething;
 
     procedure DoSomething;
 
   end;
 
   end;
Line 482: Line 539:
 
procedure TForm.DoSomething;
 
procedure TForm.DoSomething;
 
begin
 
begin
end;
+
end;</syntaxhighlight>
</Delphi>
 
  
Now add a parameter:
+
Теперь добавляем параметр:
  
<Delphi>
+
<syntaxhighlight lang=pascal> public
  public
 
 
     procedure DoSomething(i: integer);
 
     procedure DoSomething(i: integer);
   end;
+
   end;</syntaxhighlight>
</Delphi>
 
  
and invoke Code Completion ({{keypress|Ctrl|Shift|C}}). The method body will be updated and the new parameter will be copied:
+
и вызываем автозавершение кода ({{keypress|Ctrl|Shift|C}}). Тело метода будет обновлено, а новый параметр будет скопирован:
  
<Delphi>
+
<syntaxhighlight lang=pascal>procedure TForm.DoSomething(i: integer);
procedure TForm.DoSomething(i: integer);
 
 
begin
 
begin
end;
+
end;</syntaxhighlight>
</Delphi>
+
 
 +
==Рефакторинг [реорганизация кода]==
 +
 
 +
===Инверсия присвоения===
  
==Refactoring==
+
;Аннотация: : "Invert Assignments" [("Инверсия присвоения")] берет некоторые выбранные инструкции pascal и инвертирует все операнды из этого кода. Этот инструмент полезен для преобразования кода "save" в "load" и обратную операцию.
  
===Invert Assignments===
+
Например:<br>
 +
<syntaxhighlight lang=pascal>procedure DoSomething;
 +
begin
 +
  AValueStudio:= BValueStudio;
 +
  AValueAppartment :=BValueAppartment;
 +
  AValueHouse:=BValueHouse;
 +
end;</syntaxhighlight>
  
;Abstract: : "Invert Assignments" takes some selected pascal statements and inverts all assignments from this code. This tool is usefull for transforming a "save" code to a "load" one and inverse operation.
+
Выделите строки с назначением (между началом и концом) и сделайте инвертирование назначений. Все назначения будут инвертированы, а идентификация будет добавлена автоматически. Например:
  
Example:<br>
+
Результат:
procedure DoSomething;
+
<syntaxhighlight lang=pascal>procedure DoSomething;
begin
+
begin
  AValueStudio:= BValueStudio;
+
  BValueStudio    := AValueStudio;
  AValueAppartment :=BValueAppartment;
+
  BValueAppartment := AValueAppartment;
  AValueHouse:=BValueHouse;
+
  BValueHouse      := AValueHouse;
end;
+
end;</syntaxhighlight>
Select the lines with assignments (between begin and end) and do Invert Assignments. All assignments will be inverted and identation will be add automatically. For example:
 
  
Result:
 
procedure DoSomething;
 
begin
 
  BValueStudio    := AValueStudio;
 
  BValueAppartment := AValueAppartment;
 
  BValueHouse      := AValueHouse;
 
end;
 
===Enclose Selection===
 
Select some text and invoke it. A dialog will popup where you can select if the selection should be enclosed into '''try..finally''' or many other common blocks.
 
  
===Rename Identifier===
+
----
Place the cursor on an identifier and invoke it. A dialog will appear, where you can setup the search scope and the new name.
+
[[User:Zoltanleo|Прим.перев.]] 14:37, 1 November 2018 (CET): По умолчанию шоткаты для данной операции отсутствуют. Их легко определить самим, вызвав меню Tools --> Options --> Editor --> Key Mappings --> CodeTools Command --> Invert Assignment
* It will rename all occurences and only those that actually use this declaration. That means it does not rename declarations with the same name.  
+
----
* And it will first check for name conflicts.
 
* Limits: It only works on pascal sources, does not yet rename files nor adapt lfm/lrs files nor lazdoc files.
 
  
===Find Identifier References===
+
===Заключить выделение [в какую-либо конструкцию]===
Place the cursor on an identifier and invoke it. A dialog will appear, where you can setup the search scope. The IDE will then search for all occurences and only those that actually use this declaration. That means it does not show other declarations with the same name.
+
Выберите текст и вызовите [эту команду (ПКМ --> Enclose Selection) или {{keypress|Ctrl|Shift|N}}]. Появится диалоговое окно, в котором вы можете выбрать, следует ли включить выделение в '''try..finally''' или многие другие общие блоки.
  
===Show abstract methods===
+
===Переименование идентификатора===
This feature lists and auto completes virtual, abstracts methods that need to be implemented.
+
Поместите курсор на идентификатор и вызовите [эту команду (ПКМ --> Rename Identifier) или {{keypress|F2}}]. Появится диалоговое окно, в котором вы можете настроить область поиска и новое имя.
Place the cursor on a class declaration and invoke it. If there are missing abstract methods a dialog will appear listing them. Select the methods to implement and the IDE creates the method stubs.
+
* Это переименует все вхождения и только те, которые фактически используют это объявление. Это означает, что он не переименовывает объявления с тем же именем.
 +
* И это сначала проверит конфликты имен.
 +
* Ограничения: Это работает только с исходниками pascal, но не переименовывает файлы, не поддерживает ни файлы lfm/lrs, ни файлы lazdoc.
  
===Extract Procedure===
+
===Поиски ссылок на идентификатор===
 +
Поместите курсор на идентификатор и вызовите [эту процедуру (ПКМ --> Find --> Find Identifier References) или {{keypress|Ctrl|Shift|I}}]. Появится диалоговое окно, в котором вы можете настроить область поиска. Затем IDE будет искать все вхождения и только те, которые фактически используют это объявление. Это означает, что эта [процедура] не отображает другие объявления с таким же именем.
  
See [[IDE_Window:_Extract_Procedure|Extract Procedure]]
+
===Показ абстрактных методов===
 +
Эта функция перечисляет и автоматически завершает виртуальные, абстрактные методы, которые необходимо реализовать.
 +
Поместите курсор на объявление класса и вызовите [эту функцию (ПКМ --> Refactoring --> Abstract Methods)]. Если отсутствуют абстрактные методы, появится диалоговое окно с их перечислением. Выберите методы для реализации, и среда IDE создаст заглушки метода.
 +
Начиная с [версии] 1.3 Lazarus также добавляет недостающие методы ''интерфейса класса''.
  
==Find Declaration==
+
===Извлечение процедуры===
Position the cursor on an identifier and do 'Find Declaration'. Then it will search the declaration of this identifier, open the file and jump to it.
 
  
Every find declaration sets a Jump Point. That means you jump with find declaration to the declaration and easily jump back with Search -> Jump back.
+
См. [[IDE Window: Extract Procedure/ru|Extract Procedure]].
  
There are some differences to Delphi:
+
==Поиск объявлений==
The codetools work on sources following the normal pascal rules, instead of using the compiler output. The compiler returns the final type. The codetools see the sources and all steps in between. For example:
+
Поместите курсор на идентификатор и выполните 'Find Declaration' [("Найти объявление")]. Тогда это запустит поиск  объявления этого идентификатора, откроет файл и перейдет к нему. Если курсор уже находится в объявлении, он перейдет к предыдущему объявлению с тем же именем. Это позволяет находить переназначения и переопределения.
  
The ''Visible'' property is first defined in TControl (controls.pp), then redefined in TCustomForm and finally redefined in TForm.
+
Каждое найденное объявление устанавливает точку перехода. Это означает, что вы прыгнете с найденного объявления [к следующему найденному] объявлению и легко вернетесь [назад] с помощью Search -> Jump back.
Invoking find declaration on Visible will you first bring to Visible in TForm. Then you can invoke Find Declaration again to jump to Visible in TCustomForm and again to jump to Visible in TControl.
 
  
Same is true for types like TColor.
+
Существуют некоторые отличия от Delphi: утилиты кода работают с исходниками, следующим правилам обычного паскаля, вместо использования выходных [файлов] компилятора. Компилятор возвращает конечный тип. Утилиты кода видят исходники и все шаги между ними. Например:
For the compiler it is simply a 'longint'. But in the sources it is defined as
 
TGraphicsColor = -$7FFFFFFF-1..$7FFFFFFF;
 
TColor = TGraphicsColor;
 
  
And the same for '''forward defined classes''':
+
Свойство ''Visible'' сначала определяется в ''TControl'' (controls.pp), затем переопределяется в TCustomForm и, наконец, переопределяется в TForm.
For instance in TControl, there is a private variable
+
Вызов поиска объявления для [свойства] Visible сначала приведет вас к Visible в TForm. Затем вы снова можете вызвать Find Declaration [("Поиск объявления")], чтобы перейти к [свойству] Visible в TCustomForm, и снова, [чтобы] перейти к [свойству] Visible в TControl.
FHostDockSite: TWinControl;
 
Find declaration on TWinControl jumps to the forward definition
 
TWinControl = class;
 
And invoking it again jumps to the real implementation
 
TWinControl = class(TControl)
 
This way you can track down every identifier and find every overload.
 
  
'''Hints:'''  
+
То же самое верно и для таких типов, как ''TColor''. Для компилятора это просто [тип] 'longint'. Но в исходниках он определяется как
* You can jump back with {{keypress|Ctrl|H}}.
+
<syntaxhighlight lang=pascal>TGraphicsColor = -$7FFFFFFF-1..$7FFFFFFF;
* You can view/navigate all visited locations via Menu: View -> "jump history"
+
TColor = TGraphicsColor;</syntaxhighlight>
* With a 5 button Mouse you can use the 2 extra buttons to go forward/backward between the visited points
 
:(you can remap the buttons using [[IDE_Window:_EditorMouseOptionsAdvanced#Change_History_Jumps_for_3_button_Mouse_.28follow_back_the_.22Source_Link.22_trail.29|advanced mouse options]])
 
  
==Identifier Completion==
+
И то же самое [справедливо] для '''forward defined classes''' [("предшествующего определения  классов")]: например, в ''TControl'', есть private-переменная
"Identifier Completion" is invoked by {{keypress|Ctrl|space}}. It shows all identifiers in scope. For example:
+
<syntaxhighlight lang=pascal>FHostDockSite: TWinControl;</syntaxhighlight>
 +
Поиск объявления в TWinControl перескочит в предшествующее определение
 +
<syntaxhighlight lang=pascal>TWinControl = class;</syntaxhighlight>
 +
А вызов его снова переведет к реальной реализации
 +
<syntaxhighlight lang=pascal>TWinControl = class(TControl)</syntaxhighlight>
 +
Таким образом вы можете отслеживать каждый идентификатор и находить каждую [его] перегрузку.
  
  procedure TForm1.FormCreate(Sender: TObject);
+
===Подсказки===
  begin
+
* перейти назад {{keypress|Ctrl|H}}.
    |
+
* местоположениям через меню: View -> "jump history"
  end;
+
* для 5-кнопочной мыши добавьте две дополнительные кнопки для перемещения вперед/назад между посещенными точками
 +
:используя [[IDE_Window:_EditorMouseOptionsAdvanced#Change_History_Jumps_for_3_button_Mouse_.28follow_back_the_.22Source_Link.22_trail.29|advanced mouse options]], кнопки можно переназначить.
  
Place the cursor between ''begin'' and ''end'' and press {{keypress|Ctrl|space}}. The IDE/CodeTools will now parse all reachable code and present you a list of all found identifiers. The CodeTools cache the results, so invoking it a second time will be much faster.
+
==Автозавершение идентификатора==
 +
"Identifier Completion" [("автозавершение идентификатора")] вызывается [комбинацией клавиш] {{keypress|Ctrl|space}}. Это  отображает все идентификаторы в области видимости. Например:
  
'''Note for Delphians:''' Delphi calls it ''Code completion''.
+
<syntaxhighlight lang=pascal>procedure TForm1.FormCreate(Sender: TObject);
 +
begin
 +
  |
 +
end;</syntaxhighlight>
  
Some identifiers like 'Write', 'ReadLn', 'Low', 'SetLength', 'Self', 'Result', 'Copy' are built into the compiler and are not defined anywhere in source. The identifier completion has a lot of these things built in as well. If you find one missing, just create a feature request in the bug tracker.
+
Поместите курсор между ''begin'' и ''end'' и нажмите {{keypress|Ctrl|space}}. IDE/Утилиты кода теперь будут анализировать весь доступный код и представлять список всех найденных идентификаторов. Утилиты кода кэшируют результаты, поэтому повторное использование этого кода будет намного быстрее.
  
''Identifier completion'' does not complete all '''keywords'''. So you can not use it to complete 'repe' to 'repeat'. For these things use {{keypress|Ctrl|W}} [[#Word Completion|Word Completion]] or {{keypress|Ctrl|J}} [[#Code Templates|Code Templates]]. Since 0.9.27 ''identifier completion'' completes some keywords.
+
{{Note| для Дельфийцев: в Дельфи  это называется ''Автозавершение кода''.}}
  
Identifier completion shows even those identifiers, that are not compatible.
+
Некоторые идентификаторы, такие как 'Write', 'ReadLn', 'Low', 'SetLength', 'Self', 'Result', 'Copy' встроены в компилятор и не определены нигде в исходниках. В автозавершении идентификатора также есть много таких вещей. Если вы обнаружите, что хоть один отсутствует, просто создайте запрос функции в багтрекере.
  
===Prefix===
+
''Автозавершение идентификатора'' не автозавершает все ''ключевые слова''. Поэтому вы не можете использовать его для автозавершения [ключевого слова] 'repe' до 'repeat'. Для этого используйте {{keypress|Ctrl|W}} [[Lazarus_IDE_Tools/ru#Автозавершение слова|Автозавершение слова]] или {{keypress|Ctrl|J}} [[Lazarus_IDE_Tools/ru#Шаблоны кода|Шаблоны кода]]. Начиная с версии 0.9.27 ''автозавершение идентификатора'' автозавершает некоторые ключевые слова.
You can start identifier completion in a word. Then the letters to the left will be taken as prefix. For example:
 
  
  procedure TForm1.FormCreate(Sender: TObject);
+
Автозавершение идентификатора показывает даже те идентификаторы, которые несовместимы.
  begin
 
    Ca|ption
 
  end;
 
  
The box will show you only the identifiers beginning with 'Ca'.
+
===Сопоставление только первой части слова===
 +
Вы можете вызвать автозавершение идентификатора только по первым нескольким символам в слове. Поместите курсор внутри слова. Для поиска идентификаторов будут использоваться ''только символы слева от курсора''. Например:
  
===Keys===
+
<syntaxhighlight lang=pascal>procedure TForm1.FormCreate(Sender: TObject);
 +
begin
 +
  Ca|ption
 +
end;</syntaxhighlight>
  
* Letter or number: add the character to the source editor and the current prefix. This will update the list.
+
Во [всплывающем] поле будут показаны только идентификаторы, начинающиеся с 'Ca' (| указывает позицию курсора).
* Backspace: remove the last character from source editor and prefix. Updates the list.
 
* Return: replace the whole word at cursor with the selected identifier and close the popup window.
 
* Shift+Return: as ''Return'', but replaces only the prefix (left part) of the word at the cursor.
 
* Up/Down: move selection
 
* Escape: close popup without change
 
* Tab: completes the prefix to next choice. For example: The current prefix is 'But' and the identifier completion only shows 'Button1' and 'Button1Click'. Then pressing ''Tab'' will complete the prefix to 'Button1'.
 
* Else: as ''Return'' and add the character to the source editor
 
  
===Methods===
+
===Клавиши===
 +
* Буква или цифра: добавьте символ в редактор исходного кода и текущий префикс. Это обновит список.
 +
* Backspace: удалит последний символ из исходного редактора и префикса. Обновляет список.
 +
* Return: заменяет целое слово под курсором на выбранный идентификатор и закрывает всплывающее окно.
 +
* Shift+Return: как ''Return'', но заменяет только префикс (левая часть) слова под курсором.
 +
* Up/Down: перемещает выделение
 +
* Escape: закрывает всплывающее окно без изменений
 +
* Tab: завершает префикс для следующего выбора. Например: текущий префикс 'But', а завершение идентификатора показывает только 'Button1' и 'Button1Click'. Тогда нажатие ''Tab'' завершит префикс 'Button1'.
 +
* Else: как ''Return'' и добавляет символ в редактор исходного кода
  
When cursor is in a class definition and you identifier complete a method defined in an ancestor class the parameters and the override keyword will be added automatically. For example:
+
===Методы===
 +
Когда курсор находится в определении класса, и ваш идентификатор завершает метод, определенный в классе предков, параметры и ключевое слово переопределения будут добавляться автоматически. Например:
  
<Delphi>
+
<syntaxhighlight lang=pascal>TMainForm = class(TForm)
TMainForm = class(TForm)
 
 
protected
 
protected
 
   mous|
 
   mous|
end;
+
end;</syntaxhighlight>
</DELPHI>
 
  
Completing '''MouseDown''' gives:
+
Завершение '''MouseDown''' дает:
  
<Delphi>
+
<syntaxhighlight lang=pascal>TMainForm = class(TForm)
TMainForm = class(TForm)
 
 
protected
 
protected
 
   procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X,
 
   procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X,
 
         Y: Integer); override;
 
         Y: Integer); override;
end;
+
end;</syntaxhighlight>
</DELPHI>
 
 
 
===Properties===
 
 
 
<Delphi>
 
property MyInt: integer read |;
 
</DELPHI>
 
 
 
Identifier completion will show '''FMyInt''' and '''GetMyInt'''.
 
  
<Delphi>
+
===Свойства===
property MyInt: integer write |;
+
<syntaxhighlight lang=pascal>property MyInt: integer read |;</syntaxhighlight>
</DELPHI>
 
  
Identifier completion will show '''FMyInt''' and '''SetMyInt'''.
+
Автозавершение идентификатора покажет '''FMyInt''' и '''GetMyInt'''.
  
===Uses section / Unit names===
+
<syntaxhighlight lang=pascal>property MyInt: integer write |;</syntaxhighlight>
  
In uses sections the identifier completion will show the filenames of all units in the search path. These will show all lowercase (e.g. '''avl_tree'''), because most units have lowercase filenames. On completion it will insert the nice case of the unit (e.g. '''AVL_Tree''').
+
Автозавершение идентификатора покажет '''FMyInt''' и '''SetMyInt'''.
  
===Statements===
+
===Секции Uses / Имена модулей===
 +
В разделах uses автозавершение идентификатора будет отображать имена файлов всех модулей в пути поиска. Они все будут отображаться строчными буквами (например, ''avl_tree''), потому что большинство модулей имеют имена файлов в нижнем регистре. По автозавершении они вставляются в том регистре, [в каком модуль назван] (например, ''AVL_Tree'').
  
<DELPHI>
+
===Операторы===
procedure TMainForm.Button1Click(Sender: TObject);
+
<syntaxhighlight lang=pascal>procedure TMainForm.Button1Click(Sender: TObject);
 
begin
 
begin
 
   ModalRe|;
 
   ModalRe|;
end;
+
end;</syntaxhighlight>
</DELPHI>
 
  
becomes:
+
будет выглядеть так:
  
<DELPHI>
+
<syntaxhighlight lang=pascal>procedure TMainForm.Button1Click(Sender: TObject);
procedure TMainForm.Button1Click(Sender: TObject);
 
 
begin
 
begin
 
   ModalResult:=|;
 
   ModalResult:=|;
end;
+
end;</syntaxhighlight>
</DELPHI>
+
 
 +
===Иконки в окне автозавершения===
 +
 
 +
В Lazarus 1.9+ существует опция для отображения значков вместо "типов", для строк в окне автозавершения.
 +
На рисунке показаны эти значки:
 +
 
 +
[[Image:ide_completion_icons.png|250px]]
 +
 
 +
 
 +
----
 +
 
 +
[[User:Zoltanleo|Прим.перев.]] 21:20, 6 November 2018 (CET): По умолчанию показ иконок отключен. Чтобы включить их, необходимо в меню Tools --> Options --> Codetools --> Identifier Completion (Сервис --> Параметры --> Code tools --> Завершение идентификаторов) в разделе Appearance (Внешний вид) отметить галочкой чекбокс "Icons in code completion box" ("Значки в окне автозавершения кода").
 +
 
 +
[[File:icon_in_code_completion.png|500px]]
 +
----
 +
 
 +
==Автозавершение слова==
 +
''Word Completion'' [(автозавершение слова)] вызывается [сочетанием клавиш] {{keypress|Ctrl|W}}. Оно отображает все слова всех открытых в настоящее время редакторов и поэтому может использоваться в не паскалевских исходниках, в комментариях и ключевых словах.
  
==Word Completion==
+
В противном случае это работает так же, как и автозавершение идентификатора.
"Word Completion" is invoked by {{keypress|Ctrl|W}}. It shows all words of all currently open editors and can therefore be used in non pascal sources, in comments and for keywords.
 
  
Otherwise it works the same as identifier completion.
+
==Словарь Модулей / Идентификатор (Cody)==
 +
Это диалоговое окно позволяет вам искать идентификаторы в других модулях. Модули не должны использоваться вашим кодом.
  
==Goto Include Directive==
+
Эта функция является частью пакета "Cody". Чтобы активировать функцию, установите пакет.
"Goto Include Directive" in the search menu of the IDE jumps to {$I filename} statement where the current include file is used.
 
  
==Publish Project==
+
==Переход в директиву Include==
Creates a copy of the whole project. If you want to send someone just the sources and compiler settings of your code, this function is your friend.
+
"Goto Include Directive" [(переход в директиву Include)] в меню поиска IDE переходит к выражению {$I filename}, в котором используется текущий файл include.
  
A normal project directory contains a lot of information. Most of it is not needed to be published:
+
==Публикация проекта==
The .lpi file contains session information (like caret position and bookmarks of closed units) and the project directory contains a lot of .ppu, .o files and the executable.
+
Создает копию всего проекта. Если вы хотите отправить кому-то только исходники и параметры компилятора вашего кода, эта функция является вашим другом.
To create a lpi file with only the base information and only the sources, along with all sub directories use "Publish Project".
 
  
'''Note''': Since version 0.9.13 there is a new ''Project Option'' that allows you to store session information in a seperate file from the normal .lpi file. This new file ends with the .lps extension and only contains session information, which will leave you .lpi file much cleaner.
+
Обычный каталог проекта содержит много информации. Большинство из них не нужно публиковать: файл .lpi может содержать информацию о сеансе (например, позицию каретки и закладки закрытых блоков), а каталог проекта содержит много файлов .ppu, .o и исполняемый файл. Чтобы создать файл lpi только с базовой информацией, [а также создать] только исходники со всеми подкаталогами, используйте [опцию] "Publish Project" [(опубликовать проект)].
  
In the dialog you can setup the exclude and include filter, and with the command after you can compress the output into one archive.
+
{{Note| Начиная с версии 0.9.13, есть новая [опция в ] ''Project Option'', которая позволяет хранить информацию о сеансе в [другом] файле отдельно от обычного файла .lpi. Этот новый файл заканчивается расширением .lps и содержит только информацию о сеансе, что значительно упрощает ваш файл .lpi.}}
  
==Hints from comments==
+
В диалоговом окне вы можете настроить фильтр для включения и исключения определенных файлов; с [возможным выполнением] команды после того, как вы архивируете выходные файлы.
  
At several places the IDE shows hints for an identifier. For example when moving the mouse over an identifier in the source editor and waiting a few seconds.
+
==Советы по комментариям==
When the IDE shows a hints for an identifier it searches the declaration and all its ancestors and looks for comments and fpdoc files. There are many coding styles and many commenting styles. In order to support many of the common comment styles the IDE uses the following heuristics:
 
  
===Comments shown in the hint===
+
В нескольких местах IDE показывает подсказки для идентификатора. Например, при перемещении мыши по идентификатору в редакторе исходного кода и ожидании нескольких секунд. Когда IDE показывает подсказку для идентификатора, она ищет объявление его и всех его предков, [а также] ищет комментарии и файлы fpdoc. Существует много стилей кодирования и много стилей комментариев. Чтобы поддерживать многие общие стили комментариев, среда IDE использует следующий [механизм] эвристики:
  
Comments in front of a declaration, without empty line and not starting with the '''<''' sign:
+
===Комментарии, показанные в подсказке===
 +
Комментарии перед объявлением без пустой строки и не начинающиеся со знака ''<'':
  
<Delphi>
+
<syntaxhighlight lang=pascal>var
var
+
   {Комментарий}
   {Comment}
+
   Identifier: integer;</syntaxhighlight>
   Identifier: integer;
 
</Delphi>
 
  
Comments with the '''<''' sign belong to the prior identifier.
+
Комментарии с знаком ''<'' принадлежит к предыдущему идентификатору.
  
Comments behind an identifier on the same line:
+
Комментарии за идентификатором в одной строке:
  
<Delphi>
+
<syntaxhighlight lang=pascal>var  
var  
+
   identifier, // Комментарий
   identifier, // Comment
+
   other,</syntaxhighlight>
   other,
 
</Delphi>
 
  
Comments behind the definition on the same line:
+
Комментарии позади определения в той же строке:
  
<Delphi>
+
<syntaxhighlight lang=pascal>var
var
 
 
   identifier:  
 
   identifier:  
     char; // Comment
+
     char; // Комментарий</syntaxhighlight>
</Delphi>
 
  
An example for '''<''' sign:
+
Пример для знака '''<''':
  
<Delphi>
+
<syntaxhighlight lang=pascal>const
const
 
 
   a = 1;
 
   a = 1;
   //< comment for a
+
   //< комментарий для a
 
   b = 2;
 
   b = 2;
   // comment for c
+
   // комментарий для c
   c = 3;
+
   c = 3;</syntaxhighlight>
</Delphi>
 
 
 
All three comment types are supported:
 
<Delphi>
 
  {Comment}(*Comment*)//Comment
 
  c = 1;
 
</Delphi>
 
  
Comments starting with '''$''' and '''%''' are ignored.
+
Поддерживаются все три типа комментариев:
 +
<syntaxhighlight lang=pascal>  {Комментарий}(*Комментарий*)//Комментарий
 +
  c = 1;</syntaxhighlight>
  
===Comments not shown in the hint===
+
===Комментарии, не показываемые в подсказке===
 +
Комментарии, начинающиеся с '''$''' или '''%''', игнорируются. Например, ''//% Hiddden'', ''//$ Hidden'', ''(*$ Hidden*)''.
  
Comments in front separated with an empty line are treated as not specific to the following identifier. For example the following class header comment is not shown in the hint:
+
Комментарии спереди, разделенные пустой строкой, рассматриваются как не относящиеся к следующему идентификатору. Например, следующий комментарий заголовка класса не отображается в подсказке:
  
<Delphi>
+
<syntaxhighlight lang=pascal>type
type
 
 
   { TMyClass }
 
   { TMyClass }
 
    
 
    
   TMyClass = class
+
   TMyClass = class</syntaxhighlight>
</Delphi>
 
  
The class header comments are created on class completion. You can turn this off in the ''Options / Codetools / Class completion / Header comment for class''. If you want to show the header comment in the hint, just remove the empty line.
+
Комментарии заголовка класса создаются при завершении класса. Вы можете отключить эту [опцию] в ''Options / Codetools / Class completion / Header comment for class'' (''Параметры / Code tools / Завершение классов / Комментарий перед заголовком класса''). Если вы хотите показать комментарий заголовка в подсказке, просто удалите пустую строку.
  
The following comment will be shown for GL_TRUE, but not for GL_FALSE:
+
Следующий комментарий будет показан для GL_TRUE, но не для GL_FALSE:
  
<Delphi>
+
<syntaxhighlight lang=pascal> // Boolean
  // Boolean
 
 
   GL_TRUE                          = 1;
 
   GL_TRUE                          = 1;
   GL_FALSE                          = 0;
+
   GL_FALSE                          = 0;</syntaxhighlight>
</Delphi>
+
 
 +
==Быстрые исправления==
 +
Быстрые исправления - это пункты меню для конкретных сообщений компилятора. Они помогают быстро решить проблему. Выберите сообщение в окне «Сообщения» и щелкните правой кнопкой мыши или щелкните правой кнопкой мыши в редакторе исходного кода на значке слева.
 +
*Unit not found [модуль не найден]: удалите из раздела uses
 +
*Unit not found [модуль не найден]: найдите модуль в загруженных пакетах и разрешите автоматическое добавление зависимости пакета
 +
*Constructing a class "$1" with abstract method "$2" [Создание класса "$1" с абстрактным методом "$2"]: показ диалогового окна для переопределения всех абстрактных методов
 +
*Local variable "$1" not used [Локальная переменная "$1" не используется]: удалите определение
 +
*Circular unit reference between $1 and $2 [циркулярная ссылка модуля между $1 и $2]: показывает диалоговое окно зависимостей с полным путем между двумя модулями
 +
*Identifier not found [Идентификатор не найден]: поиск через браузер кода
 +
*Identifier not found [Идентификатор не найден]: поиск через словарь Cody (нужен пакет [[Cody]])
 +
*Identifier not found [Идентификатор не найден]: добавьте локальную переменную
 +
*Recompiling $1, checksum changed for $2 [Перекомпиляция $1, контрольная сумма изменена для $2]: показать диалог с путями поиска и другой информацией
 +
*IDE warning: other sources path of package %s contains directory... [Предупреждение IDE: другие пути исходников пакета %s содержит каталог ...:]: откройте пакет
 +
*any hint, note, warning [любые подсказки, примечания, предупреждения]: добавьте директиву IDE {%H-}
 +
*any hint, note, warning [любые подсказки, примечания, предупреждения]: добавьте директиву компилятора {$warn id off} (начиная с 1.7)
 +
*any hint, note, warning [любые подсказки, примечания, предупреждения]: добавьте опцию компилятора -vm<messageid>
 +
*Local variable "i" does not seem to be initialized [Локальная переменная "i", похоже, не инициализирована]: вставьте присвоение (начиная с 1.5)
 +
*Inherited method is hidden [Унаследованный метод скрыт]: добавьте модификатор override, overload, или reintroduce (начиная с 1.9)
 +
 
 +
==Контур==
 +
 
 +
Этот параметр находится в диалоговом окне Options --> Editor --> Display --> Markup and Matches --> Outline (global) [Параметры --> Редактор --> Отображение --> Подсветка и соответствия --> Отображать контур блока(глобально)].
 +
 
 +
Он выделяет ключевые слова Pascal вместе со своими операторными(begin-end) скобками. Это позволяет видеть вложенность больших блоков.
 +
 
 +
Например, для такого тела процедуры:
 +
<syntaxhighlight lang=pascal>
 +
  with ADockObject do
 +
  begin
 +
    if DropAlign = alNone then
 +
    begin
 +
      if DropOnControl <> nil then
 +
        DropAlign := DropOnControl.GetDockEdge(DropOnControl.ScreenToClient(DragPos))
 +
      else
 +
        DropAlign := Control.GetDockEdge(DragTargetPos);
 +
    end;
 +
    PositionDockRect(Control, DropOnControl, DropAlign, FDockRect);
 +
  end;
 +
</syntaxhighlight>
 +
 
 +
он подсвечивает:
 +
 
 +
* внешний with-do-begin-end оранжевым
 +
* следующий if-then-begin-end зеленым
 +
* внутренний if-then-else голубым
 +
 
 +
[[Image:ide_outline.png]]

Latest revision as of 19:35, 19 November 2021

Deutsch (de) English (en) español (es) suomi (fi) français (fr) 日本語 (ja) 한국어 (ko) Nederlands (nl) português (pt) русский (ru) slovenčina (sk) 中文(中国大陆)‎ (zh_CN)


Lazarus IDE - это инструменты библиотеки Free Pascal для синтаксического анализа и редактирования, называемая "codetools"[(утилиты кода)].

Эти инструменты предоставляют такие функции для исходников, как "Переход к объявлению", "Завершение кода", "Извлечение", "Перемещение вставки" и "Украшение Паскаля". Эти функции могут сэкономить много времени и пустой работы. Они настраиваются, и каждая функция доступна с помощью ярлыков (см. Editor Options).

Поскольку они работают исключительно с исходниками Pascal и понимают коды FPC, Delphi и Kylix, им не требуются компилированные модули или установленный компилятор Borland/Embarcadero. Код Delphi и FPC можно редактировать одновременно с несколькими версиями Delphi и FPC. Это упрощает перенос кода Delphi в FPC/Lazarus.


Горячие клавиши в IDE

Переход на объявление Ctrl+ЛКМ или Alt+ (Переход на объявление типа или переменной)
Переход на метод класса Ctrl+ Shift+ (Переход туда сюда между объявлением и телом метода)
Шаблоны кода Ctrl+J
Синхронная правка Ctrl+J (Пока текст выделен)
Завершение кода (Завершение класса) Ctrl+ Shift+C
Завершение идентификатора Ctrl+space
Завершение слова Ctrl+W
Подсказка для параметров Ctrl+ Shift+space
Последовательный поиск Ctrl+E

Переход между методом и его объявлением

Для перехода между телом процедуры (begin..end) и объявлением процедуры (procedure Name;) используйте Ctrl+ Shift+.

Для примера:

 interface
 
 procedure DoSomething; // Объявление процедуры
  
 implementation
  
 procedure DoSomething; // Тело процедуры 
 begin
 end;

Если курсор стоит на теле процедуры и Вы нажмёте Ctrl+ Shift+, то курсор перескочит на объявление, потом опять Ctrl+ Shift+ и курсор перескочит на тело процедуры, после 'begin'.

Это так же работает между методами-процедурами класса.

Подсказка: Переход осуществляется на процедуру с таким же именем и списком параметров. Если нет точной такой же процедуры, то переход будет на наиболее подходящего кандидата и позиционирует курсор на первое же различие. (Для дельфийцев: Delphi не может этого сделать). Пример процедуры с различными типами параметров:

 interface
 
 procedure DoSomething(p: char); // Объявление процедуры
 
 implementation
   
 procedure DoSomething(p: string); // Тело процедуры
 begin
 end;

Переход с определения к телу процедуры будет позиционировать курсор на ключевое слово 'string'. Это можно использовать для переименования методов и / или изменения параметров.

Пример:
Вы переименовываете 'DoSomething' в 'MakeIt':

 interface
 
 procedure MakeIt; // Объявление процедуры
 
 implementation
 
 procedure DoSomething; // Тело процедуры
 begin
 end;

Тогда можно перейти от MakeIt к телу. IDE ищет подходящее тело и не находит, а, следовательно, ищет нечто похожее. Так как вы переименовали только одну процедуру есть ровно одно тело без определения (DoSomething) и будет переход к DoSomething, курсор встанет справа от "DoSomething". Тогда вы можете просто переименовать его прямо там. Это работает и для параметров.

Включаемые файлы

Включаемые файлы это файлы вставленные в исходный код с помощью директив компилятора

{$I filename}

или

{$INCLUDE filename}

. Lazarus и FPC используют эти вещи чтобы уменьшить избыточность и избежать нечитаемых {$IFDEF} конструкций при поддержке различных платформ.

В отличие от Delphi, Lazarus IDE полностью поддерживает включаемые файлы. Вы можете для примера перепрыгнуть с метода в .pas файле к телу метода во включаемом файле. Все инструменты для работы с кодом, такие как автозавершение кода, просматривают текст во включаемых файлах на предмет специальных связей.

Например: когда автозавершение кода добавляет новое тело метода за другим телом метода, он хранит их обоих в одном файле. Таким образом, вы можете помещать целые реализации классов в файлы include, как, например LCL [делает] для почти всех элементов управления.

Но [тут] есть ловушка для новичков: Если вы впервые откроете файл include и попробуете прыгнуть к методу или найди [его] объявление, вы получите сообщение об ошибке. IDE не знает, к какому модулю принадлежит файл include. Сначала вы должны открыть модуль.

Как только IDE проанализирует модуль, она [начнет] анализировать директивы include, и [затем] IDE запоминает эти взаимосвязи. Она сохраняет эту информацию при выходе и при сохранении проекта в ~/.lazarus/includelinks.xml. В следующий раз, когда вы откроете этот include-файл и перейдете [к объявлению] или найдете [его поиском], IDE будет открывать модуль изнутри [include-файла], и переход будет работать. Вы также можете указать подсказку IDE, поставив

 {%mainunit yourunit.pas}

наверху вашего yourinclude.inc.

Конечно, этот механизм имеет ограничения. Некоторые include-файлы включаются дважды или более. Например: lcl/include/winapih.inc.

Переходы с объявления процедуры/метода в этом include-файле к [их] телу зависят от ваших последних действий. Если вы работаете в lcl/lclintf.pp, среда IDE перейдет в winapi.inc. Если вы работаете в lcl/interfacebase.pp, тогда она перейдет в lcl/include/interfacebase.inc (или в один из других включенных файлов). Если вы работаете над обоими, то вы можете запутаться. ;)

Шаблоны кода

Шаблоны кода преобразуют идентификатор в текст, или фрагмент кода.


По умолчанию горячие клавиши для шаблонов кода Ctrl+J. Вы можете ввести идентификатор, нажать Ctrl+J и идентификатор заменится на текст определенный для этого идентификатора. Шаблоны кода можно задать в Environment -> Editor Options -> CodeTools.

Пример: Введите идентификатор 'classf', поставьте курсор справа от 'f' и нажмите Ctrl+J. Идентификатор 'classf' будет заменен на

 T = class(T)
 private
 
 public
   constructor Create;
   destructor Destroy; override;
 end;

и курсор будет находится за 'T'.

Вы можете посмотреть список шаблонов установив курсор на пустое место (не на идентификатор) и нажав Ctrl+J. Список шаблонов кода появится. Используйте стрелки, или введите несколько символов чтобы выбрать нужный шаблон. Enter создаст выделенный шаблон, а Escape закроет список шаблонов.

Больше всего времени экономит шаблон 'b'+Ctrl+J для begin..end.

Подсказка для параметров

Подсказка для параметров позволяет посмотреть список параметров для процедур и функций. Жирным шрифтом выделяется текущий параметр.

Например:

  Canvas.FillRect();

Поместите курсор внутри скобок и нажмите Ctrl+ Shift+space. Появится подсказка с параметрами процедуры FillRect.

Parameterhints1.png

Начиная с версии 0.9.31, справа от каждой декларации имеется кнопка, вставляющая отсутствующие параметры. Это скопирует имена параметров из выбранного объявления в позицию курсора.

Parameterhints2.png

Подсказка: используйте Автозавершение объявления переменной, чтобы объявить переменные.

Light bulb  Примечание: Имя ярлычка - "Show code context"[("Показать контекст кода")].

Последовательный поиск

Последовательный поиск изменяет строку состояния редактора исходного кода. Введите несколько символов, и редактор тут же будет их искать, выделяя все вхождения в тексте. Для вызова поиска, нажмите: Ctrl+e.

  • Например, нажмите e произведёт поиск и выделение всех букв «е» в коде.
  • Затем, нажав t будет произведён поиск и выделение всех вхождений «et» и так далее.
  • Вы можете использовать быстрый переход между найденными позициями в тексте нужной строки. Для быстрого перехода вниз по тексту, используйте F3 (или Ctrl+e во время поиска). Для быстрого перехода вверх по тексту, используйте Shift+F3.
  • ← Backspace удаляет последний символ
  • Enter останавливает поиск без добавления новой строки в редакторе.
  • Вы можете возобновить последний поиск, нажав Ctrl+e во второй раз, сразу же после начала последовательного поиска используя Ctrl+e. т.е. когда строка поиска пуста.
  • Вставка Ctrl+V добавит строку из буфера обмена к текущему искомому тексту. (так же как в lazarus 0.9.27 r19824).

Пример использования последовательного поиска для поиска слова

  • Поместите курсор на нужное слово, не выделяя его
  • Нажмите Ctrl+C. Редактор исходного кода выделит слово и скопирует его в буфер обмена.
  • Нажмите Ctrl+E для начала последовательного поиска
  • Нажмите Ctrl+V для поиска идентификатора (так же, как в 0.9.27)
  • Используйте F3 и Shift+F3 для быстрого перехода к следующему / предыдущему найденному участку текста.
  • Используйте любую клавишу (например курсор влево или вправо), чтобы закончить поиск

Синхронная правка

Синхронная правка позволяет редактировать все места присутствия слова в тексте одновременно (синхронно). Вы просто изменяете, слово в одном месте и все остальные вхождения слова в тексте изменяются автоматически.

Синхронная правка влияет на все слова в выделенной области текста. Пример использования:

  • Выделите блок текста
  • Нажмите Ctrl+J или воспользуйтесь соответствующим значком. (Это работает только, если есть какие-либо слова, которые встречаются более одного раза в выделенном тексте.)
  • Используйте клавишу Tab для выделения слова, которое вы хотите изменить. (если было выделено несколько разных слов более одного раза)
  • Измените слово
  • Нажмите Esc для окончание работы с синхронной правкой

См. анимированный пример здесь

Light bulb  Примечание: Ctrl+J также используется для редактирования шаблона. [Это сочетание клавиш] переключает свое значение, если вы выберете какой-то текст.

Поиск следующего / предыдущего вхождения слова

Обе функции можно найти в контекстном меню редактора исходного кода

  • Редактор кода / контекстное меню / Найти / Найти следующее вхождение слова
  • Редактор кода / контекстное меню / Найти / Найти предыдущее вхождение слова

Вы можете назначить данным пунктам сочетания клавиш в окне настройки редактора исходного кода. Для этого выберите меню "Сервис->Параметры" и в левой части появившегося окна выберите "Редактор->Комбинации клавиш".

Автозавершение Кода

Автозавершение кода можно найти в меню IDE Edit -> Complete Code, а так же используя сочетания клавиш: Ctrl+ Shift+C.

Для Делфистов: В Delphi, это называется "автозавершение кода"(code completion) - специальная функция, показывающая список идентификаторов, в текущей позиции исходного кода ((Ctrl+Пробел). В Lazarus это называется "автозавершение идентификаторов"(Identifier completion).

Автозавершение кода сочетает в себе несколько мощных функций, например:

Какая из этих функций будет использована, зависит от позиции курсора в редакторе кода.

Автозавершение кода можно найти в меню IDE Edit -> Complete Code, [а также вызвать] стандартным сочетанием клавиш Ctrl+ Shift+C.

Автозавершение класса

Наиболее мощная функция завершения кода является "Автозавершение класса". Вы пишете скелет класса, добавляя в него методы и свойства. Автозавершение кода автоматически завершит их объявления, добавив нужные переменные, тело для реализации метода или свойства, определит способ доступа к ним а так же поля класса.

Например: создайте класс (для быстроты можете использовать шаблоны кода):

 TExample = class(TObject)
 public
   constructor Create;
   destructor Destroy; override;
 end;

Поместите курсор где-то внутри класса и нажмите Ctrl+ Shift+C. Это позволит создать скелет для реализации методов и поместит курсор внутри тела метода:

 { TExample }
 
 constructor TExample.Create;
 begin
   |
 end;
 
 destructor TExample.Destroy;
 begin
   inherited Destroy;
 end;
Light bulb  Примечание: символом '|' обозначена позиция курсора в коде.

Подсказка: Вы можете переключаться между методом и его телом, используя клавиши Ctrl+ Shift+.

Вы можете увидеть, что IDE добавило вызов 'inherited Destroy'. Это происходит, когда в объявлении метода используется ключевое слово 'override'.

Теперь добавьте метод DoSomething:

 TExample = class(TObject)
 public
   constructor Create;
   procedure DoSomething(i: integer);
   destructor Destroy; override;
 end;

Нажмите Ctrl+ Shift+C и IDE завершит его, добавив:

 procedure TExample.DoSomething(i: integer);
 begin
   |
 end;

Вы можете определить поведение вставки кода в Environment > Codetools Options -> Code Creation.

Завершение свойств
Добавьте свойство AnInteger:

 TExample = class(TObject)
 public
   constructor Create;
   procedure DoSomething(i: integer);
   destructor Destroy; override;
   property AnInteger: Integer;
 end;

Нажмите Ctrl+Shift+C и вы получите:

 procedure TExample.SetAnInteger(const AValue: integer);
 begin
   |if FAnInteger=AValue then exit;
   FAnInteger:=AValue;
 end;

Функция автозавершения кода добавила поля класса и метод, используемые при обращении к свойству. Нажмите Ctrl+ Shift+ для просмотра определения класса:

 TExample = class(TObject)
 private
   FAnInteger: integer;
   procedure SetAnInteger(const AValue: integer);
 public
   constructor Create;
   procedure DoSomething(i: integer);
   destructor Destroy; override;
   property AnInteger: integer read FAnInteger write SetAnInteger;
 end;

Свойство было изменено. Добавлены ключевые слова Read и Write. Класс получил новый раздел 'private' с полем 'FAnInteger' и методом 'SetAnInteger'. Это общий стиль Delphi, использовать в названиях полей букву 'F' (Field). И в методах на запись слово 'Set'. Данные настройки можно изменить в Environment > Codetools Options -> Code Creation.

Создание свойства только для чтения:

 property PropName: PropType read;

Будет расширено до:

 property PropName: PropType read FPropName;

Создание свойства только для записи:

  property PropName: PropType write;

Будет расширено до:

 property PropName: PropType write SetPropName;

Создание свойства только для чтения с указанием метода:

 property PropName: PropType read GetPropName;

Будет добавлена функция GetPropName:

 function GetpropName: PropType;

Создание свойства с ключевым словом stored:

 property PropName: PropType stored;

Будет расширено до:

 property PropName: PropType read FPropName write SetPropName stored PropNameIsStored;

Так как ключевое слово stored используется для потокового чтения и записи, нужные поля и процедуры также будут добавлены автоматически.

Подсказка: Автозавершение идентификатора также распознает неполные свойства и [взамен] предлагает имена по умолчанию. Например:

property PropName: PropType read |;

Поместите курсор сразу за ключевым словом read и нажмите Ctrl+Space для автозавершения идентификатора. Он предоставит вам переменную FPropName и процедуру SetPropName.

Автозавершение предварительно объявленной процедуры

"Автозавершение предварительно объявленной процедуры" является частью автозавершения кода и добавляет отсутствующее тело процедуры. Оно вызывается, когда курсор находится в объявлении заданной процедуры.

Например: Добавьте новую процедуру в раздел интерфейса:

 procedure DoSomething;

Поместите в нее курсор и нажмите Ctrl+ Shift+C для автозавершения кода. Он будет создан в разделе реализации:

 procedure DoSomething;
 begin
   |
 end;

Подсказка: вы можете быстро перемещаться между объявлением процедуры и ее телом с помощью Ctrl+ Shift+.

Новое тело процедуры будет добавлено перед методами класса. Если в интерфейсе уже есть некоторые процедуры, IDE попытается сохранить [их] порядок. Например:

  procedure Proc1;
  procedure Proc2; // новая процедура
  procedure Proc3;

Если тела Proc1 и Proc3 уже существуют, то тело Proc2 будет вставлено между телами Proc1 и Proc3. Такое поведение можно настроить в Environment > Codetools Options -> Code Creation.

Несколько процедур:

 procedure Proc1_Old; // тело [процедуры уже] существует
 procedure Proc2_New; // тело [процедуры еще] не существует
 procedure Proc3_New; //  "
 procedure Proc4_New; //  "
 procedure Proc5_Old; // тело [процедуры уже] существует

Автозавершение кода добавит тела всех 3 процедур(Proc2_New, Proc3_New, Proc4_New).

Почему это называется "Автозавершение предварительно объявленной процедуры"?

Потому что это работает не только для процедур, определенных в интерфейсе, но и для процедур[, определенных] с помощью "предварительно объявленного" модификатора. И потому что утилиты кода обрабатывают процедуры в интерфейсе как имеющие неявный "предварительно объявленный" модификатор.

Автозавершение назначенных процедур обработки событий

"Автозавершение назначенных процедур обработки событий" является частью автозавершения кода и завершает единственный оператор Event:=|. Он вызывается, когда курсор находится за назначенным событием.

Например: В методе, скажем, событие FormCreate, добавьте строку 'OnPaint:=':

procedure TForm1.Form1Create(Sender: TObject);
begin
  OnPaint:=|
end;

'|' - это курсор, и его не следует вводить. Затем нажмите Ctrl+ Shift+C для завершения кода. Оператор будет завершен

OnPaint:=@Form1Paint;

Новый метод Form1Paint будет добавлен в класс TForm1. Затем запустится автозавершение класса, и вы получите:

procedure TForm1.Form1Paint(Sender: TObject);
begin
  |
end;

Это работает так же, как добавление методов в инспекторе объектов.

Light bulb  Примечание: Вы должны поместить курсор сразу после оператора присваивания ':='. Если вы поместите курсор на идентификатор (например, OnPaint), то автозавершение кода вызовет «Автозавершение локальной переменной», что не удастся, поскольку OnPaint уже определен.

Подсказка:

  • Вы можете выбрать видимость по умолчанию для нового метода в разделе Tools / Options / Codetools / Class Completion / Default (начиная с версии 1.8)
  • Вы можете определить имя нового метода самостоятельно. Например:
  OnPaint:=@ThePaintMethod;


Начиная с 0.9.31 Lazarus автозавершает параметры процедуры. Например

procedure TForm1.FormCreate(Sender: TObject);
var
  List: TList;
begin
  List:=TList.Create;
  List.Sort(@MySortFunction|);
end;

Поместите курсор на 'MySortFunction' и нажмите Ctrl+ Shift+C для автозавершения кода. Вы получите новую процедуру:

function MySortFunction(Item1, Item2: Pointer): Integer;
begin
  |
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  List: TList;
begin
  List:=TList.Create;
  List.Sort(@MySortFunction);
end;

Автозавершение объявления переменной

"Автозавершение объявления переменной" является частью завершения кода и добавляет определение локальной переменной для [оператора] Identifier:=Term [(Идентификатор:=Выражение)]. Он вызывается, когда курсор находится на идентификаторе присвоения или параметра.

Например:

procedure TForm1.Form1Create(Sender: TObject);
begin
  i:=3;
end;

Поместите курсор на 'i' или сразу за ним. Затем нажмите Ctrl+ Shift+C для автозавершения кода, и вы получите:

procedure TForm1.Form1Create(Sender: TObject);
var
  i: Integer;
begin
  i:=3;
end;

Утилиты кода сначала проверяют код [на наличие объявления] идентификатора 'i', и если [таковой не найден], то добавляют объявление 'var i: integer;'. Тип идентификатора угадывается из выражения[, расположенного] справа от оператора присвоения ':='. Числа, такие как 3, по умолчанию [будут иметь тип] Integer.

Другой пример:

type
  TWhere = (Behind, Middle, InFront);
 
  procedure TForm1.Form1Create(Sender: TObject);
  var
    a: array[TWhere] of char;
  begin
    for Where:=Low(a) to High(a) do writeln(a[Where]);
  end;

Поместите курсор на 'Where' и нажмите Ctrl+ Shift+C для автозавершения кода. Вы получите:

  procedure TForm1.Form1Create(Sender: TObject);
  var
    a: array[TWhere] of char;
    Where: TWhere;
  begin
    for Where:=Low(a) to High(a) do writeln(a[Where]);
  end;

Начиная с 0.9.11 Lazarus также автозавершает параметры. Например

  procedure TForm1.FormPaint(Sender: TObject);
  begin
    with Canvas do begin
      Line(x1,y1,x2,y2);
    end;
  end;

Поместите курсор на 'x1' и нажмите Ctrl+ Shift+C для автозавершения кода. Вы получите:

  procedure TForm1.FormPaint(Sender: TObject);
  var
    x1: integer;
  begin
    with Canvas do begin
      Line(x1,y1,x2,y2);
    end;
  end;

Начиная с 0.9.31 Lazarus автозавершает параметры указателя. Например

  procedure TForm1.FormCreate(Sender: TObject);
  begin
    CreateIconIndirect(@IconInfo);
  end;

Поместите курсор в 'IconInfo' и нажмите Ctrl+ Shift+C для автозавершения кода. Вы получите:

  procedure TForm1.FormCreate(Sender: TObject);
  var
    IconInfo: TIconInfo;
  begin
    CreateIconIndirect(@IconInfo);
  end;

Во всех приведенных выше примерах вы можете использовать Ctrl+ Shift+X, чтобы отобразить диалоговое окно создания кода, в котором вы можете установить дополнительные параметры.

Автозавершение объявления вызываемой процедуры

[Механизм] автозавершение кода может создать [тело] новой процедуры из места ее объявления.

Допустим, вы просто написали объявление "DoSomething(Width);"

procedure SomeProcedure;
var
  Width: integer;
begin
  Width:=3;
  DoSomething(Width);
end;

Поместите курсор над идентификатором "DoSomething" и нажмите Ctrl+ Shift+C, чтобы получить:

procedure DoSomething(aWidth: LongInt);
begin

end;

procedure SomeProcedure;
var
  Width: integer;
begin
  Width:=3;
  DoSomething(Width);
end;

Это еще не создает функции или методы.

Автозавершение предшествующего объявления класса

"Автозавершение предшествующего объявления класса" является частью Code Completion [(Автозавершения кода), который] добавляет объявление для текущего тела метода в private [разделе интерфейсной части модуля]. Он вызывается, когда курсор находится в теле метода, еще не определенном в классе. Эта функция доступна с Lazarus 0.9.21.

Например:

  procedure TForm1.DoSomething(Sender: TObject);
  begin
  end;

Метод DoSomething еще не объявлен в TForm1. Нажмите Ctrl+ Shift+C, и в IDE будет добавлена "procedure DoSomething(Sender: TObject);" в private-разделе TForm1.

Для дельфийцев: Автозавершение класса работает в Lazarus всегда одним способом: от класса интерфейсного [раздела модуля] к [разделу] реализации или наоборот, от класса в [разделе] реализации к [разделу] интерфейса. Delphi всегда вызывает оба направления. Недостаток способа Delphi заключается в том, что при опечатке легко создать новый метод, не заметив [этого].



Прим.перев. 09:08, 30 October 2018 (CET): Очевидно имеется ввиду следующее: в Lazarus'е достаточно чуть изменить название метода (справедливо и для параметров) в интерфейсной части модуля и нажать Ctrl+ Shift+C, и механизм Code Completion автоматически внесет правки в название уже имеющегося тела метода в разделе implementation. То же справедливо и для случая, когда меняется название метода (справедливо и для параметров) в разделе implementation, а затем вызывается Code Completion - в разделе interface будут внесены соответствующие правки.

В Delphi, если тело метода уже существует, то изменение имени метода в разделе interface приведет к созданию тела метода в разделе implementation с измененным именем в дополнению к уже имеющемуся со старым именем. Это, естественно, вызовет ошибку при компиляции проекта.


Комментарии и автозавершение кода

Автозавершение кода пытается сохранять комментарии, принадлежащие [завершаемому коду]. Например:

  FList: TList; // список TComponent
  FInt: integer;

При вставке новой переменной между FList и FInd комментарий сохраняется в строке FList. То же самое верно для

  FList: TList; { список TComponent
    Это комментарий по нескольким строкам, начиная
    со строки FList, поэтому codetools предполагает, что он принадлежит
    к линии FLIst и не будет [терять с ним]
    связь. Код добавляется за комментарием.}
  FInt: integer;

Если комментарий начинается со следующей строки, он будет обрабатываться так, как если бы он принадлежал коду ниже. Например:

  FList: TList; // список TComponent
    { Этот комментарий относится к приведенному ниже операнду.
      Новый код вставлен над этим комментарием и
      позади комментария [для] FList.}
  FInt: integer;

Обновление метода

Обычно автозавершение класса добавляет все отсутствующие тела методов. (Начиная с 0.9.27). Но если именно один метод отличается между [объявлением в] классе и теле, то тело метода обновляется. Например: у вас есть метод DoSomething.

  public
    procedure DoSomething;
  end;

procedure TForm.DoSomething;
begin
end;

Теперь добавляем параметр:

  public
    procedure DoSomething(i: integer);
  end;

и вызываем автозавершение кода (Ctrl+ Shift+C). Тело метода будет обновлено, а новый параметр будет скопирован:

procedure TForm.DoSomething(i: integer);
begin
end;

Рефакторинг [реорганизация кода]

Инверсия присвоения

Аннотация
: "Invert Assignments" [("Инверсия присвоения")] берет некоторые выбранные инструкции pascal и инвертирует все операнды из этого кода. Этот инструмент полезен для преобразования кода "save" в "load" и обратную операцию.

Например:

procedure DoSomething;
begin
  AValueStudio:= BValueStudio;
  AValueAppartment :=BValueAppartment;
  AValueHouse:=BValueHouse;
end;

Выделите строки с назначением (между началом и концом) и сделайте инвертирование назначений. Все назначения будут инвертированы, а идентификация будет добавлена автоматически. Например:

Результат:

procedure DoSomething;
begin
  BValueStudio     := AValueStudio;
  BValueAppartment := AValueAppartment;
  BValueHouse      := AValueHouse;
end;



Прим.перев. 14:37, 1 November 2018 (CET): По умолчанию шоткаты для данной операции отсутствуют. Их легко определить самим, вызвав меню Tools --> Options --> Editor --> Key Mappings --> CodeTools Command --> Invert Assignment


Заключить выделение [в какую-либо конструкцию]

Выберите текст и вызовите [эту команду (ПКМ --> Enclose Selection) или Ctrl+ Shift+N]. Появится диалоговое окно, в котором вы можете выбрать, следует ли включить выделение в try..finally или многие другие общие блоки.

Переименование идентификатора

Поместите курсор на идентификатор и вызовите [эту команду (ПКМ --> Rename Identifier) или F2]. Появится диалоговое окно, в котором вы можете настроить область поиска и новое имя.

  • Это переименует все вхождения и только те, которые фактически используют это объявление. Это означает, что он не переименовывает объявления с тем же именем.
  • И это сначала проверит конфликты имен.
  • Ограничения: Это работает только с исходниками pascal, но не переименовывает файлы, не поддерживает ни файлы lfm/lrs, ни файлы lazdoc.

Поиски ссылок на идентификатор

Поместите курсор на идентификатор и вызовите [эту процедуру (ПКМ --> Find --> Find Identifier References) или Ctrl+ Shift+I]. Появится диалоговое окно, в котором вы можете настроить область поиска. Затем IDE будет искать все вхождения и только те, которые фактически используют это объявление. Это означает, что эта [процедура] не отображает другие объявления с таким же именем.

Показ абстрактных методов

Эта функция перечисляет и автоматически завершает виртуальные, абстрактные методы, которые необходимо реализовать. Поместите курсор на объявление класса и вызовите [эту функцию (ПКМ --> Refactoring --> Abstract Methods)]. Если отсутствуют абстрактные методы, появится диалоговое окно с их перечислением. Выберите методы для реализации, и среда IDE создаст заглушки метода. Начиная с [версии] 1.3 Lazarus также добавляет недостающие методы интерфейса класса.

Извлечение процедуры

См. Extract Procedure.

Поиск объявлений

Поместите курсор на идентификатор и выполните 'Find Declaration' [("Найти объявление")]. Тогда это запустит поиск объявления этого идентификатора, откроет файл и перейдет к нему. Если курсор уже находится в объявлении, он перейдет к предыдущему объявлению с тем же именем. Это позволяет находить переназначения и переопределения.

Каждое найденное объявление устанавливает точку перехода. Это означает, что вы прыгнете с найденного объявления [к следующему найденному] объявлению и легко вернетесь [назад] с помощью Search -> Jump back.

Существуют некоторые отличия от Delphi: утилиты кода работают с исходниками, следующим правилам обычного паскаля, вместо использования выходных [файлов] компилятора. Компилятор возвращает конечный тип. Утилиты кода видят исходники и все шаги между ними. Например:

Свойство Visible сначала определяется в TControl (controls.pp), затем переопределяется в TCustomForm и, наконец, переопределяется в TForm. Вызов поиска объявления для [свойства] Visible сначала приведет вас к Visible в TForm. Затем вы снова можете вызвать Find Declaration [("Поиск объявления")], чтобы перейти к [свойству] Visible в TCustomForm, и снова, [чтобы] перейти к [свойству] Visible в TControl.

То же самое верно и для таких типов, как TColor. Для компилятора это просто [тип] 'longint'. Но в исходниках он определяется как

TGraphicsColor = -$7FFFFFFF-1..$7FFFFFFF;
TColor = TGraphicsColor;

И то же самое [справедливо] для forward defined classes [("предшествующего определения классов")]: например, в TControl, есть private-переменная

FHostDockSite: TWinControl;

Поиск объявления в TWinControl перескочит в предшествующее определение

TWinControl = class;

А вызов его снова переведет к реальной реализации

TWinControl = class(TControl)

Таким образом вы можете отслеживать каждый идентификатор и находить каждую [его] перегрузку.

Подсказки

  • перейти назад Ctrl+H.
  • местоположениям через меню: View -> "jump history"
  • для 5-кнопочной мыши добавьте две дополнительные кнопки для перемещения вперед/назад между посещенными точками
используя advanced mouse options, кнопки можно переназначить.

Автозавершение идентификатора

"Identifier Completion" [("автозавершение идентификатора")] вызывается [комбинацией клавиш] Ctrl+space. Это отображает все идентификаторы в области видимости. Например:

procedure TForm1.FormCreate(Sender: TObject);
begin
  |
end;

Поместите курсор между begin и end и нажмите Ctrl+space. IDE/Утилиты кода теперь будут анализировать весь доступный код и представлять список всех найденных идентификаторов. Утилиты кода кэшируют результаты, поэтому повторное использование этого кода будет намного быстрее.

Light bulb  Примечание: для Дельфийцев: в Дельфи это называется Автозавершение кода.

Некоторые идентификаторы, такие как 'Write', 'ReadLn', 'Low', 'SetLength', 'Self', 'Result', 'Copy' встроены в компилятор и не определены нигде в исходниках. В автозавершении идентификатора также есть много таких вещей. Если вы обнаружите, что хоть один отсутствует, просто создайте запрос функции в багтрекере.

Автозавершение идентификатора не автозавершает все ключевые слова. Поэтому вы не можете использовать его для автозавершения [ключевого слова] 'repe' до 'repeat'. Для этого используйте Ctrl+W Автозавершение слова или Ctrl+J Шаблоны кода. Начиная с версии 0.9.27 автозавершение идентификатора автозавершает некоторые ключевые слова.

Автозавершение идентификатора показывает даже те идентификаторы, которые несовместимы.

Сопоставление только первой части слова

Вы можете вызвать автозавершение идентификатора только по первым нескольким символам в слове. Поместите курсор внутри слова. Для поиска идентификаторов будут использоваться только символы слева от курсора. Например:

procedure TForm1.FormCreate(Sender: TObject);
begin
  Ca|ption
end;

Во [всплывающем] поле будут показаны только идентификаторы, начинающиеся с 'Ca' (| указывает позицию курсора).

Клавиши

  • Буква или цифра: добавьте символ в редактор исходного кода и текущий префикс. Это обновит список.
  • Backspace: удалит последний символ из исходного редактора и префикса. Обновляет список.
  • Return: заменяет целое слово под курсором на выбранный идентификатор и закрывает всплывающее окно.
  • Shift+Return: как Return, но заменяет только префикс (левая часть) слова под курсором.
  • Up/Down: перемещает выделение
  • Escape: закрывает всплывающее окно без изменений
  • Tab: завершает префикс для следующего выбора. Например: текущий префикс 'But', а завершение идентификатора показывает только 'Button1' и 'Button1Click'. Тогда нажатие Tab завершит префикс 'Button1'.
  • Else: как Return и добавляет символ в редактор исходного кода

Методы

Когда курсор находится в определении класса, и ваш идентификатор завершает метод, определенный в классе предков, параметры и ключевое слово переопределения будут добавляться автоматически. Например:

TMainForm = class(TForm)
protected
  mous|
end;

Завершение MouseDown дает:

TMainForm = class(TForm)
protected
  procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X,
         Y: Integer); override;
end;

Свойства

property MyInt: integer read |;

Автозавершение идентификатора покажет FMyInt и GetMyInt.

property MyInt: integer write |;

Автозавершение идентификатора покажет FMyInt и SetMyInt.

Секции Uses / Имена модулей

В разделах uses автозавершение идентификатора будет отображать имена файлов всех модулей в пути поиска. Они все будут отображаться строчными буквами (например, avl_tree), потому что большинство модулей имеют имена файлов в нижнем регистре. По автозавершении они вставляются в том регистре, [в каком модуль назван] (например, AVL_Tree).

Операторы

procedure TMainForm.Button1Click(Sender: TObject);
begin
  ModalRe|;
end;

будет выглядеть так:

procedure TMainForm.Button1Click(Sender: TObject);
begin
  ModalResult:=|;
end;

Иконки в окне автозавершения

В Lazarus 1.9+ существует опция для отображения значков вместо "типов", для строк в окне автозавершения. На рисунке показаны эти значки:

ide completion icons.png



Прим.перев. 21:20, 6 November 2018 (CET): По умолчанию показ иконок отключен. Чтобы включить их, необходимо в меню Tools --> Options --> Codetools --> Identifier Completion (Сервис --> Параметры --> Code tools --> Завершение идентификаторов) в разделе Appearance (Внешний вид) отметить галочкой чекбокс "Icons in code completion box" ("Значки в окне автозавершения кода").

icon in code completion.png


Автозавершение слова

Word Completion [(автозавершение слова)] вызывается [сочетанием клавиш] Ctrl+W. Оно отображает все слова всех открытых в настоящее время редакторов и поэтому может использоваться в не паскалевских исходниках, в комментариях и ключевых словах.

В противном случае это работает так же, как и автозавершение идентификатора.

Словарь Модулей / Идентификатор (Cody)

Это диалоговое окно позволяет вам искать идентификаторы в других модулях. Модули не должны использоваться вашим кодом.

Эта функция является частью пакета "Cody". Чтобы активировать функцию, установите пакет.

Переход в директиву Include

"Goto Include Directive" [(переход в директиву Include)] в меню поиска IDE переходит к выражению {$I filename}, в котором используется текущий файл include.

Публикация проекта

Создает копию всего проекта. Если вы хотите отправить кому-то только исходники и параметры компилятора вашего кода, эта функция является вашим другом.

Обычный каталог проекта содержит много информации. Большинство из них не нужно публиковать: файл .lpi может содержать информацию о сеансе (например, позицию каретки и закладки закрытых блоков), а каталог проекта содержит много файлов .ppu, .o и исполняемый файл. Чтобы создать файл lpi только с базовой информацией, [а также создать] только исходники со всеми подкаталогами, используйте [опцию] "Publish Project" [(опубликовать проект)].

Light bulb  Примечание: Начиная с версии 0.9.13, есть новая [опция в ] Project Option, которая позволяет хранить информацию о сеансе в [другом] файле отдельно от обычного файла .lpi. Этот новый файл заканчивается расширением .lps и содержит только информацию о сеансе, что значительно упрощает ваш файл .lpi.

В диалоговом окне вы можете настроить фильтр для включения и исключения определенных файлов; с [возможным выполнением] команды после того, как вы архивируете выходные файлы.

Советы по комментариям

В нескольких местах IDE показывает подсказки для идентификатора. Например, при перемещении мыши по идентификатору в редакторе исходного кода и ожидании нескольких секунд. Когда IDE показывает подсказку для идентификатора, она ищет объявление его и всех его предков, [а также] ищет комментарии и файлы fpdoc. Существует много стилей кодирования и много стилей комментариев. Чтобы поддерживать многие общие стили комментариев, среда IDE использует следующий [механизм] эвристики:

Комментарии, показанные в подсказке

Комментарии перед объявлением без пустой строки и не начинающиеся со знака <:

var
  {Комментарий}
  Identifier: integer;

Комментарии с знаком < принадлежит к предыдущему идентификатору.

Комментарии за идентификатором в одной строке:

var 
  identifier, // Комментарий
  other,

Комментарии позади определения в той же строке:

var
  identifier: 
    char; // Комментарий

Пример для знака <:

const
  a = 1;
  //< комментарий для a
  b = 2;
  // комментарий для c
  c = 3;

Поддерживаются все три типа комментариев:

  {Комментарий}(*Комментарий*)//Комментарий
  c = 1;

Комментарии, не показываемые в подсказке

Комментарии, начинающиеся с $ или %, игнорируются. Например, //% Hiddden, //$ Hidden, (*$ Hidden*).

Комментарии спереди, разделенные пустой строкой, рассматриваются как не относящиеся к следующему идентификатору. Например, следующий комментарий заголовка класса не отображается в подсказке:

type
  { TMyClass }
  
  TMyClass = class

Комментарии заголовка класса создаются при завершении класса. Вы можете отключить эту [опцию] в Options / Codetools / Class completion / Header comment for class (Параметры / Code tools / Завершение классов / Комментарий перед заголовком класса). Если вы хотите показать комментарий заголовка в подсказке, просто удалите пустую строку.

Следующий комментарий будет показан для GL_TRUE, но не для GL_FALSE:

  // Boolean
  GL_TRUE                           = 1;
  GL_FALSE                          = 0;

Быстрые исправления

Быстрые исправления - это пункты меню для конкретных сообщений компилятора. Они помогают быстро решить проблему. Выберите сообщение в окне «Сообщения» и щелкните правой кнопкой мыши или щелкните правой кнопкой мыши в редакторе исходного кода на значке слева.

  • Unit not found [модуль не найден]: удалите из раздела uses
  • Unit not found [модуль не найден]: найдите модуль в загруженных пакетах и разрешите автоматическое добавление зависимости пакета
  • Constructing a class "$1" with abstract method "$2" [Создание класса "$1" с абстрактным методом "$2"]: показ диалогового окна для переопределения всех абстрактных методов
  • Local variable "$1" not used [Локальная переменная "$1" не используется]: удалите определение
  • Circular unit reference between $1 and $2 [циркулярная ссылка модуля между $1 и $2]: показывает диалоговое окно зависимостей с полным путем между двумя модулями
  • Identifier not found [Идентификатор не найден]: поиск через браузер кода
  • Identifier not found [Идентификатор не найден]: поиск через словарь Cody (нужен пакет Cody)
  • Identifier not found [Идентификатор не найден]: добавьте локальную переменную
  • Recompiling $1, checksum changed for $2 [Перекомпиляция $1, контрольная сумма изменена для $2]: показать диалог с путями поиска и другой информацией
  • IDE warning: other sources path of package %s contains directory... [Предупреждение IDE: другие пути исходников пакета %s содержит каталог ...:]: откройте пакет
  • any hint, note, warning [любые подсказки, примечания, предупреждения]: добавьте директиву IDE {%H-}
  • any hint, note, warning [любые подсказки, примечания, предупреждения]: добавьте директиву компилятора {$warn id off} (начиная с 1.7)
  • any hint, note, warning [любые подсказки, примечания, предупреждения]: добавьте опцию компилятора -vm<messageid>
  • Local variable "i" does not seem to be initialized [Локальная переменная "i", похоже, не инициализирована]: вставьте присвоение (начиная с 1.5)
  • Inherited method is hidden [Унаследованный метод скрыт]: добавьте модификатор override, overload, или reintroduce (начиная с 1.9)

Контур

Этот параметр находится в диалоговом окне Options --> Editor --> Display --> Markup and Matches --> Outline (global) [Параметры --> Редактор --> Отображение --> Подсветка и соответствия --> Отображать контур блока(глобально)].

Он выделяет ключевые слова Pascal вместе со своими операторными(begin-end) скобками. Это позволяет видеть вложенность больших блоков.

Например, для такого тела процедуры:

  with ADockObject do
  begin
    if DropAlign = alNone then
    begin
      if DropOnControl <> nil then
        DropAlign := DropOnControl.GetDockEdge(DropOnControl.ScreenToClient(DragPos))
      else
        DropAlign := Control.GetDockEdge(DragTargetPos);
    end;
    PositionDockRect(Control, DropOnControl, DropAlign, FDockRect);
  end;

он подсвечивает:

  • внешний with-do-begin-end оранжевым
  • следующий if-then-begin-end зеленым
  • внутренний if-then-else голубым

ide outline.png