Difference between revisions of "Lazarus IDE Tools/ru"

From Free Pascal wiki
Jump to navigationJump to search
m
 
(44 intermediate revisions by 2 users not shown)
Line 1: Line 1:
 
{{Lazarus IDE Tools}}
 
{{Lazarus IDE Tools}}
 
----
 
<span style="color:#FF0000">ENG: '''AT THE MOMENT THIS PAGE IS UNDER TRANSLATION.''' <br /> RUS: '''В НАСТОЯЩИЙ МОМЕНТ СТРАНИЦА НАХОДИТСЯ В ПРОЦЕССЕ ПЕРЕВОДА.'''</span>
 
----
 
  
  
'''[[Lazarus_Faq/ru|Lazarus]] IDE''' - это инструменты библиотеки [[Free Pascal]] для синтаксического анализа и редактирования, называемая "codetools"[(инструменты кодинга)].
+
'''[[Lazarus_Faq/ru|Lazarus]] IDE''' - это инструменты библиотеки [[Free Pascal]] для синтаксического анализа и редактирования, называемая "codetools"[(утилиты кода)].
  
Эти инструменты предоставляют такие функции, как "Переход к объявлению", "Завершение кода", "Извлечение", "Перемещение вставки" и исходники "Украшение Паскаля". Эти функции могут сэкономить много времени и продублировать работу. Они настраиваются, и каждая функция доступна с помощью ярлыков (см. Editor Options).
+
Эти инструменты предоставляют такие функции для исходников, как "Переход к объявлению", "Завершение кода", "Извлечение", "Перемещение вставки" и "Украшение Паскаля". Эти функции могут сэкономить много времени и пустой работы. Они настраиваются, и каждая функция доступна с помощью ярлыков (см. Editor Options).
  
Поскольку они работают исключительно с источниками Pascal и понимают коды FPC, [[Delphi]] и [[Kylix]], им не требуются компилированные модули или установленный компилятор Borland/Embarcadero. Код Delphi и FPC можно редактировать одновременно с несколькими версиями Delphi и FPC. Это упрощает перенос кода Delphi в FPC/Lazarus.
+
Поскольку они работают исключительно с исходниками Pascal и понимают коды FPC, [[Delphi]] и [[Kylix]], им не требуются компилированные модули или установленный компилятор Borland/Embarcadero. Код Delphi и FPC можно редактировать одновременно с несколькими версиями Delphi и FPC. Это упрощает перенос кода Delphi в FPC/Lazarus.
  
  
Line 39: Line 35:
  
 
Для примера:
 
Для примера:
<syntaxhighlight> interface
+
<syntaxhighlight lang=pascal> interface
 
   
 
   
 
  procedure DoSomething; // Объявление процедуры
 
  procedure DoSomething; // Объявление процедуры
Line 55: Line 51:
 
Переход осуществляется на процедуру с таким же именем и списком параметров. Если нет точной такой же процедуры, то переход будет на наиболее подходящего кандидата и позиционирует курсор на первое же различие. (Для дельфийцев: Delphi не может этого сделать).
 
Переход осуществляется на процедуру с таким же именем и списком параметров. Если нет точной такой же процедуры, то переход будет на наиболее подходящего кандидата и позиционирует курсор на первое же различие. (Для дельфийцев: Delphi не может этого сделать).
 
Пример процедуры с различными типами параметров:
 
Пример процедуры с различными типами параметров:
<syntaxhighlight> interface
+
<syntaxhighlight lang=pascal> interface
 
   
 
   
 
  procedure DoSomething(p: char); // Объявление процедуры
 
  procedure DoSomething(p: char); // Объявление процедуры
Line 68: Line 64:
 
Пример:<br>
 
Пример:<br>
 
Вы переименовываете 'DoSomething' в 'MakeIt':  
 
Вы переименовываете 'DoSomething' в 'MakeIt':  
<syntaxhighlight> interface
+
<syntaxhighlight lang=pascal> interface
 
   
 
   
 
  procedure MakeIt; // Объявление процедуры
 
  procedure MakeIt; // Объявление процедуры
Line 80: Line 76:
  
 
==Включаемые файлы==
 
==Включаемые файлы==
Включаемые файлы это файлы вставленные в исходный код с помощью директив компилятора <syntaxhighlight>{$I filename}</syntaxhighlight> или <syntaxhighlight>{$INCLUDE filename}</syntaxhighlight>. 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 файле к телу метода во включаемом файле. Все инструменты для работы с кодом, такие как автозавершение кода, просматривают текст во включаемых файлах на предмет специальных связей.
Line 91: Line 87:
 
Как только IDE проанализирует модуль, она [начнет] анализировать директивы include, и [затем] IDE запоминает эти взаимосвязи. Она сохраняет эту информацию при выходе и при сохранении проекта в ~/.lazarus/includelinks.xml. В следующий раз, когда вы откроете этот include-файл и перейдете [к объявлению] или найдете [его поиском], IDE будет открывать модуль изнутри [include-файла], и переход будет работать.
 
Как только IDE проанализирует модуль, она [начнет] анализировать директивы include, и [затем] IDE запоминает эти взаимосвязи. Она сохраняет эту информацию при выходе и при сохранении проекта в ~/.lazarus/includelinks.xml. В следующий раз, когда вы откроете этот include-файл и перейдете [к объявлению] или найдете [его поиском], IDE будет открывать модуль изнутри [include-файла], и переход будет работать.
 
Вы также можете указать подсказку IDE, поставив
 
Вы также можете указать подсказку IDE, поставив
<syntaxhighlight> {%mainunit yourunit.pas}</syntaxhighlight>  
+
<syntaxhighlight lang=pascal> {%mainunit yourunit.pas}</syntaxhighlight>  
 
наверху вашего yourinclude.inc.
 
наверху вашего yourinclude.inc.
  
Line 106: Line 102:
 
Пример:
 
Пример:
 
Введите идентификатор 'classf', поставьте курсор справа от 'f' и нажмите {{keypress|Ctrl}}+{{keypress|J}}. Идентификатор 'classf' будет заменен на
 
Введите идентификатор 'classf', поставьте курсор справа от 'f' и нажмите {{keypress|Ctrl}}+{{keypress|J}}. Идентификатор 'classf' будет заменен на
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
 
  T = class(T)
 
  T = class(T)
 
  private
 
  private
Line 127: Line 123:
 
Например:
 
Например:
  
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
 
   Canvas.FillRect();
 
   Canvas.FillRect();
 
</syntaxhighlight>
 
</syntaxhighlight>
Line 199: Line 195:
 
* [[Lazarus_IDE_Tools/ru#Автозавершение объявления переменной|Автозавершение объявления переменной]]: добавляет определённые локальные переменные.  
 
* [[Lazarus_IDE_Tools/ru#Автозавершение объявления переменной|Автозавершение объявления переменной]]: добавляет определённые локальные переменные.  
 
* [[Lazarus_IDE_Tools/ru#Автозавершение объявления вызываемой процедуры|Автозавершение объявления вызываемой процедуры]]: добавляет новую процедуру.  
 
* [[Lazarus_IDE_Tools/ru#Автозавершение объявления вызываемой процедуры|Автозавершение объявления вызываемой процедуры]]: добавляет новую процедуру.  
* [[#Reversed Procedure Completion|Reversed procedure completion]]: добавление объявления процедур/функций ([[User:Zoltanleo|Zoltanleo]] 08:28, 26 October 2018 (CEST): Раздел временно отсутствует)
+
* [[#Reversed Procedure Completion|Reversed procedure completion]]: добавление объявления процедур/функций ([[User:Zoltanleo|Прим.перев.]] 08:28, 26 October 2018 (CEST): Раздел временно отсутствует)
 
* [[Lazarus_IDE_Tools/ru#Автозавершение предшествующего объявления класса|Автозавершение предшествующего объявления класса]]: добавление объявления метода для тела метода внутри класса.
 
* [[Lazarus_IDE_Tools/ru#Автозавершение предшествующего объявления класса|Автозавершение предшествующего объявления класса]]: добавление объявления метода для тела метода внутри класса.
  
Line 208: Line 204:
 
===Автозавершение класса===
 
===Автозавершение класса===
  
Наиболее мощная функция завершения кода является "Завершение класса". Вы пишете скелет класса, добавляя в него методы и свойства. Автозавершение кода автоматически завершит их объявления, добавив нужные переменные, тело для реализации метода или свойства, определит способ доступа к ним а так же поля класса.
+
Наиболее мощная функция завершения кода является "Автозавершение класса". Вы пишете скелет класса, добавляя в него методы и свойства. Автозавершение кода автоматически завершит их объявления, добавив нужные переменные, тело для реализации метода или свойства, определит способ доступа к ним а так же поля класса.
  
 
Например: создайте класс (для быстроты можете использовать шаблоны кода):
 
Например: создайте класс (для быстроты можете использовать шаблоны кода):
  
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
 
  TExample = class(TObject)
 
  TExample = class(TObject)
 
  public
 
  public
Line 220: Line 216:
 
Поместите курсор где-то внутри класса и нажмите {{keypress|Ctrl|Shift|C}}. Это позволит создать скелет для реализации методов и поместит курсор внутри тела метода:
 
Поместите курсор где-то внутри класса и нажмите {{keypress|Ctrl|Shift|C}}. Это позволит создать скелет для реализации методов и поместит курсор внутри тела метода:
  
<syntaxhighlight> { TExample }
+
<syntaxhighlight lang=pascal> { TExample }
 
   
 
   
 
  constructor TExample.Create;
 
  constructor TExample.Create;
Line 240: Line 236:
 
Теперь добавьте метод DoSomething:  
 
Теперь добавьте метод DoSomething:  
  
<syntaxhighlight> TExample = class(TObject)
+
<syntaxhighlight lang=pascal> TExample = class(TObject)
 
  public
 
  public
 
   constructor Create;
 
   constructor Create;
Line 249: Line 245:
 
Нажмите {{keypress|Ctrl|Shift|C}} и IDE завершит его, добавив:
 
Нажмите {{keypress|Ctrl|Shift|C}} и IDE завершит его, добавив:
  
<syntaxhighlight> procedure TExample.DoSomething(i: integer);
+
<syntaxhighlight lang=pascal> procedure TExample.DoSomething(i: integer);
 
  begin
 
  begin
 
   |
 
   |
Line 257: Line 253:
 
'''Завершение свойств'''<br>
 
'''Завершение свойств'''<br>
 
Добавьте свойство AnInteger:
 
Добавьте свойство AnInteger:
<syntaxhighlight> TExample = class(TObject)
+
<syntaxhighlight lang=pascal> TExample = class(TObject)
 
  public
 
  public
 
   constructor Create;
 
   constructor Create;
Line 265: Line 261:
 
  end;</syntaxhighlight>
 
  end;</syntaxhighlight>
 
Нажмите Ctrl+Shift+C и вы получите:
 
Нажмите Ctrl+Shift+C и вы получите:
<syntaxhighlight> 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;
Line 272: Line 268:
 
Функция автозавершения кода добавила поля класса и метод, используемые при обращении к свойству.
 
Функция автозавершения кода добавила поля класса и метод, используемые при обращении к свойству.
 
Нажмите {{keypress|Ctrl|Shift|Up}} для просмотра определения класса:
 
Нажмите {{keypress|Ctrl|Shift|Up}} для просмотра определения класса:
<syntaxhighlight> TExample = class(TObject)
+
<syntaxhighlight lang=pascal> TExample = class(TObject)
 
  private
 
  private
 
   FAnInteger: integer;
 
   FAnInteger: integer;
Line 286: Line 282:
  
 
Создание свойства только для чтения:
 
Создание свойства только для чтения:
<syntaxhighlight> property PropName: PropType read;</syntaxhighlight>
+
<syntaxhighlight lang=pascal> property PropName: PropType read;</syntaxhighlight>
 
Будет расширено до:
 
Будет расширено до:
<syntaxhighlight> property PropName: PropType read FPropName;</syntaxhighlight>
+
<syntaxhighlight lang=pascal> property PropName: PropType read FPropName;</syntaxhighlight>
 
Создание свойства только для записи:
 
Создание свойства только для записи:
<syntaxhighlight>  property PropName: PropType write;</syntaxhighlight>
+
<syntaxhighlight lang=pascal>  property PropName: PropType write;</syntaxhighlight>
 
Будет расширено до:
 
Будет расширено до:
<syntaxhighlight> property PropName: PropType write SetPropName;</syntaxhighlight>
+
<syntaxhighlight lang=pascal> property PropName: PropType write SetPropName;</syntaxhighlight>
 
Создание свойства только для чтения с указанием метода:
 
Создание свойства только для чтения с указанием метода:
<syntaxhighlight> property PropName: PropType read GetPropName;</syntaxhighlight>
+
<syntaxhighlight lang=pascal> property PropName: PropType read GetPropName;</syntaxhighlight>
 
Будет добавлена функция GetPropName:
 
Будет добавлена функция GetPropName:
<syntaxhighlight> function GetpropName: PropType;</syntaxhighlight>
+
<syntaxhighlight lang=pascal> function GetpropName: PropType;</syntaxhighlight>
 
Создание свойства с ключевым словом stored:
 
Создание свойства с ключевым словом stored:
<syntaxhighlight> property PropName: PropType stored;</syntaxhighlight>
+
<syntaxhighlight lang=pascal> property PropName: PropType stored;</syntaxhighlight>
 
Будет расширено до:
 
Будет расширено до:
<syntaxhighlight> property PropName: PropType read FPropName write SetPropName stored PropNameIsStored;</syntaxhighlight>
+
<syntaxhighlight lang=pascal> property PropName: PropType read FPropName write SetPropName stored PropNameIsStored;</syntaxhighlight>
 
Так как ключевое слово <tt>stored</tt> используется для потокового чтения и записи, нужные  поля и процедуры также будут добавлены автоматически.
 
Так как ключевое слово <tt>stored</tt> используется для потокового чтения и записи, нужные  поля и процедуры также будут добавлены автоматически.
  
 
Подсказка:
 
Подсказка:
 
Автозавершение идентификатора также распознает неполные свойства и [взамен] предлагает имена по умолчанию. Например:
 
Автозавершение идентификатора также распознает неполные свойства и [взамен] предлагает имена по умолчанию. Например:
<syntaxhighlight>property PropName: PropType read |;</syntaxhighlight>
+
<syntaxhighlight lang=pascal>property PropName: PropType read |;</syntaxhighlight>
 
Поместите курсор сразу за ключевым словом '''read''' и нажмите {{keypress|Ctrl}}+{{keypress|Space}} для автозавершения идентификатора. Он предоставит вам переменную '''FPropName''' и процедуру '''SetPropName'''.
 
Поместите курсор сразу за ключевым словом '''read''' и нажмите {{keypress|Ctrl}}+{{keypress|Space}} для автозавершения идентификатора. Он предоставит вам переменную '''FPropName''' и процедуру '''SetPropName'''.
  
Line 313: Line 309:
 
Например:
 
Например:
 
Добавьте новую процедуру в раздел интерфейса:
 
Добавьте новую процедуру в раздел интерфейса:
<syntaxhighlight> procedure DoSomething;</syntaxhighlight>
+
<syntaxhighlight lang=pascal> procedure DoSomething;</syntaxhighlight>
 
Поместите в нее курсор и нажмите {{keypress|Ctrl|Shift|C}} для автозавершения кода. Он будет создан в разделе реализации:
 
Поместите в нее курсор и нажмите {{keypress|Ctrl|Shift|C}} для автозавершения кода. Он будет создан в разделе реализации:
<syntaxhighlight> procedure DoSomething;
+
<syntaxhighlight lang=pascal> procedure DoSomething;
 
  begin
 
  begin
 
   |
 
   |
Line 322: Line 318:
  
 
Новое тело процедуры будет добавлено перед методами класса. Если в интерфейсе уже есть некоторые процедуры, IDE попытается сохранить [их] порядок. Например:
 
Новое тело процедуры будет добавлено перед методами класса. Если в интерфейсе уже есть некоторые процедуры, IDE попытается сохранить [их] порядок. Например:
<syntaxhighlight>  procedure Proc1;
+
<syntaxhighlight lang=pascal>  procedure Proc1;
 
   procedure Proc2; // новая процедура
 
   procedure Proc2; // новая процедура
 
   procedure Proc3;</syntaxhighlight>
 
   procedure Proc3;</syntaxhighlight>
Line 328: Line 324:
  
 
Несколько процедур:
 
Несколько процедур:
<syntaxhighlight> procedure Proc1_Old; // тело [процедуры уже] существует
+
<syntaxhighlight lang=pascal> procedure Proc1_Old; // тело [процедуры уже] существует
 
  procedure Proc2_New; // тело [процедуры еще] не существует
 
  procedure Proc2_New; // тело [процедуры еще] не существует
 
  procedure Proc3_New; //  "
 
  procedure Proc3_New; //  "
Line 337: Line 333:
 
Почему это называется "Автозавершение предварительно объявленной процедуры"?
 
Почему это называется "Автозавершение предварительно объявленной процедуры"?
  
Потому что это работает не только для процедур, определенных в интерфейсе, но и для процедур[, определенных] с помощью "предварительно объявленного" модификатора. И потому что инструменты кодинга обрабатывают процедуры в интерфейсе как имеющие неявный "предварительно объявленный" модификатор.
+
Потому что это работает не только для процедур, определенных в интерфейсе, но и для процедур[, определенных] с помощью "предварительно объявленного" модификатора. И потому что утилиты кода обрабатывают процедуры в интерфейсе как имеющие неявный "предварительно объявленный" модификатор.
  
 
===Автозавершение назначенных процедур обработки событий===
 
===Автозавершение назначенных процедур обработки событий===
Line 344: Line 340:
 
Например:
 
Например:
 
В методе, скажем, событие FormCreate, добавьте строку 'OnPaint:=':
 
В методе, скажем, событие FormCreate, добавьте строку 'OnPaint:=':
<syntaxhighlight>procedure TForm1.Form1Create(Sender: TObject);
+
<syntaxhighlight lang=pascal>procedure TForm1.Form1Create(Sender: TObject);
 
begin
 
begin
 
   OnPaint:=|
 
   OnPaint:=|
Line 351: Line 347:
 
'|' - это курсор, и его не следует вводить.
 
'|' - это курсор, и его не следует вводить.
 
Затем нажмите {{keypress|Ctrl}}+{{keypress|Shift}}+{{keypress|C}}  для завершения кода. Оператор будет завершен
 
Затем нажмите {{keypress|Ctrl}}+{{keypress|Shift}}+{{keypress|C}}  для завершения кода. Оператор будет завершен
<syntaxhighlight>OnPaint:=@Form1Paint;</syntaxhighlight>
+
<syntaxhighlight lang=pascal>OnPaint:=@Form1Paint;</syntaxhighlight>
 
Новый метод Form1Paint будет добавлен в класс TForm1. Затем запустится автозавершение класса, и вы получите:
 
Новый метод Form1Paint будет добавлен в класс TForm1. Затем запустится автозавершение класса, и вы получите:
<syntaxhighlight>procedure TForm1.Form1Paint(Sender: TObject);
+
<syntaxhighlight lang=pascal>procedure TForm1.Form1Paint(Sender: TObject);
 
begin
 
begin
 
   |
 
   |
Line 364: Line 360:
 
*Вы можете выбрать видимость по умолчанию для нового метода в разделе Tools / Options / Codetools / Class Completion / Default (начиная с версии 1.8)
 
*Вы можете выбрать видимость по умолчанию для нового метода в разделе Tools / Options / Codetools / Class Completion / Default (начиная с версии 1.8)
 
* Вы можете определить имя нового метода самостоятельно. Например:
 
* Вы можете определить имя нового метода самостоятельно. Например:
<syntaxhighlight>  OnPaint:=@ThePaintMethod;</syntaxhighlight>
+
<syntaxhighlight lang=pascal>  OnPaint:=@ThePaintMethod;</syntaxhighlight>
  
  
 
Начиная с 0.9.31 Lazarus автозавершает параметры процедуры. Например
 
Начиная с 0.9.31 Lazarus автозавершает параметры процедуры. Например
  
<syntaxhighlight>procedure TForm1.FormCreate(Sender: TObject);
+
<syntaxhighlight lang=pascal>procedure TForm1.FormCreate(Sender: TObject);
 
var
 
var
 
   List: TList;
 
   List: TList;
Line 379: Line 375:
 
Поместите курсор на 'MySortFunction' и нажмите {{keypress|Ctrl|Shift|C}} для автозавершения кода. Вы получите новую процедуру:
 
Поместите курсор на 'MySortFunction' и нажмите {{keypress|Ctrl|Shift|C}} для автозавершения кода. Вы получите новую процедуру:
  
<syntaxhighlight>function MySortFunction(Item1, Item2: Pointer): Integer;
+
<syntaxhighlight lang=pascal>function MySortFunction(Item1, Item2: Pointer): Integer;
 
begin
 
begin
 
   |
 
   |
Line 396: Line 392:
  
 
Например:
 
Например:
<syntaxhighlight>procedure TForm1.Form1Create(Sender: TObject);
+
<syntaxhighlight lang=pascal>procedure TForm1.Form1Create(Sender: TObject);
 
begin
 
begin
 
   i:=3;
 
   i:=3;
 
end;</syntaxhighlight>
 
end;</syntaxhighlight>
 
Поместите курсор на '<tt>i</tt>' или сразу за ним. Затем нажмите {{keypress|Ctrl|Shift|C}} для автозавершения кода, и вы получите:
 
Поместите курсор на '<tt>i</tt>' или сразу за ним. Затем нажмите {{keypress|Ctrl|Shift|C}} для автозавершения кода, и вы получите:
<syntaxhighlight>procedure TForm1.Form1Create(Sender: TObject);
+
<syntaxhighlight lang=pascal>procedure TForm1.Form1Create(Sender: TObject);
 
var
 
var
 
   i: Integer;
 
   i: Integer;
Line 408: Line 404:
 
end;</syntaxhighlight>
 
end;</syntaxhighlight>
  
Инструменты кодинга сначала проверяют код [на наличие объявления] идентификатора '<tt>i</tt>', и если [таковой не найден], то добавляют объявление '<tt>var i: integer;</tt>'. Тип идентификатора угадывается из выражения[, расположенного] справа от оператора присвоения '<tt>:=</tt>'. Числа, такие как 3, по умолчанию [будут иметь тип] Integer.
+
Утилиты кода сначала проверяют код [на наличие объявления] идентификатора '<tt>i</tt>', и если [таковой не найден], то добавляют объявление '<tt>var i: integer;</tt>'. Тип идентификатора угадывается из выражения[, расположенного] справа от оператора присвоения '<tt>:=</tt>'. Числа, такие как 3, по умолчанию [будут иметь тип] Integer.
  
 
Другой пример:
 
Другой пример:
<syntaxhighlight>type
+
<syntaxhighlight lang=pascal>type
 
   TWhere = (Behind, Middle, InFront);
 
   TWhere = (Behind, Middle, InFront);
 
   
 
   
Line 422: Line 418:
  
 
Поместите курсор на 'Where' и нажмите {{keypress|Ctrl|Shift|C}} для автозавершения кода. Вы получите:
 
Поместите курсор на 'Where' и нажмите {{keypress|Ctrl|Shift|C}} для автозавершения кода. Вы получите:
<syntaxhighlight>  procedure TForm1.Form1Create(Sender: TObject);
+
<syntaxhighlight lang=pascal>  procedure TForm1.Form1Create(Sender: TObject);
 
   var
 
   var
 
     a: array[TWhere] of char;
 
     a: array[TWhere] of char;
Line 431: Line 427:
  
 
Начиная с 0.9.11 Lazarus также автозавершает параметры. Например
 
Начиная с 0.9.11 Lazarus также автозавершает параметры. Например
<syntaxhighlight>  procedure TForm1.FormPaint(Sender: TObject);
+
<syntaxhighlight lang=pascal>  procedure TForm1.FormPaint(Sender: TObject);
 
   begin
 
   begin
 
     with Canvas do begin
 
     with Canvas do begin
Line 439: Line 435:
  
 
Поместите курсор на 'x1' и нажмите {{keypress|Ctrl|Shift|C}} для автозавершения кода. Вы получите:
 
Поместите курсор на 'x1' и нажмите {{keypress|Ctrl|Shift|C}} для автозавершения кода. Вы получите:
<syntaxhighlight>  procedure TForm1.FormPaint(Sender: TObject);
+
<syntaxhighlight lang=pascal>  procedure TForm1.FormPaint(Sender: TObject);
 
   var
 
   var
 
     x1: integer;
 
     x1: integer;
Line 450: Line 446:
 
Начиная с 0.9.31 Lazarus автозавершает параметры указателя. Например
 
Начиная с 0.9.31 Lazarus автозавершает параметры указателя. Например
  
<syntaxhighlight>  procedure TForm1.FormCreate(Sender: TObject);
+
<syntaxhighlight lang=pascal>  procedure TForm1.FormCreate(Sender: TObject);
 
   begin
 
   begin
 
     CreateIconIndirect(@IconInfo);
 
     CreateIconIndirect(@IconInfo);
Line 456: Line 452:
  
 
Поместите курсор в 'IconInfo' и нажмите {{keypress|Ctrl|Shift|C}} для автозавершения кода. Вы получите:
 
Поместите курсор в 'IconInfo' и нажмите {{keypress|Ctrl|Shift|C}} для автозавершения кода. Вы получите:
<syntaxhighlight>  procedure TForm1.FormCreate(Sender: TObject);
+
<syntaxhighlight lang=pascal>  procedure TForm1.FormCreate(Sender: TObject);
 
   var
 
   var
 
     IconInfo: TIconInfo;
 
     IconInfo: TIconInfo;
Line 469: Line 465:
  
 
Допустим, вы просто написали объявление "<tt>DoSomething(Width);</tt>"
 
Допустим, вы просто написали объявление "<tt>DoSomething(Width);</tt>"
<syntaxhighlight>procedure SomeProcedure;
+
<syntaxhighlight lang=pascal>procedure SomeProcedure;
 
var
 
var
 
   Width: integer;
 
   Width: integer;
Line 479: Line 475:
 
Поместите курсор над идентификатором "DoSomething" и нажмите {{keypress|Ctrl|Shift|C}}, чтобы получить:
 
Поместите курсор над идентификатором "DoSomething" и нажмите {{keypress|Ctrl|Shift|C}}, чтобы получить:
  
<syntaxhighlight>procedure DoSomething(aWidth: LongInt);
+
<syntaxhighlight lang=pascal>procedure DoSomething(aWidth: LongInt);
 
begin
 
begin
  
Line 500: Line 496:
  
 
Например:
 
Например:
<syntaxhighlight>  procedure TForm1.DoSomething(Sender: TObject);
+
<syntaxhighlight lang=pascal>  procedure TForm1.DoSomething(Sender: TObject);
 
   begin
 
   begin
 
   end;</syntaxhighlight>
 
   end;</syntaxhighlight>
Line 511: Line 507:
  
 
----
 
----
[[User:Zoltanleo|Zoltanleo]] 09:08, 30 October 2018 (CET):  Очевидно имеется ввиду следующее: в Lazarus'е достаточно чуть изменить название метода (справедливо и для параметров) в интерфейсной части модуля и нажать {{keypress|Ctrl|Shift|C}}, и механизм Code Completion автоматически внесет правки в название уже имеющегося тела метода в разделе implementation. То же справедливо и для случая, когда меняется название метода (справедливо и для параметров) в разделе implementation, а затем вызывается Code Completion - в разделе interface будут внесены соответствующие правки.
+
[[User:Zoltanleo|Прим.перев.]] 09:08, 30 October 2018 (CET):  Очевидно имеется ввиду следующее: в Lazarus'е достаточно чуть изменить название метода (справедливо и для параметров) в интерфейсной части модуля и нажать {{keypress|Ctrl|Shift|C}}, и механизм Code Completion автоматически внесет правки в название уже имеющегося тела метода в разделе implementation. То же справедливо и для случая, когда меняется название метода (справедливо и для параметров) в разделе implementation, а затем вызывается Code Completion - в разделе interface будут внесены соответствующие правки.
  
 
В Delphi, если тело метода уже существует, то изменение имени метода в разделе interface приведет к созданию тела метода в разделе implementation с измененным именем в дополнению к уже имеющемуся со старым именем. Это, естественно, вызовет ошибку при компиляции проекта.
 
В Delphi, если тело метода уже существует, то изменение имени метода в разделе interface приведет к созданию тела метода в разделе implementation с измененным именем в дополнению к уже имеющемуся со старым именем. Это, естественно, вызовет ошибку при компиляции проекта.
Line 519: Line 515:
 
Автозавершение кода пытается сохранять комментарии, принадлежащие [завершаемому коду].
 
Автозавершение кода пытается сохранять комментарии, принадлежащие [завершаемому коду].
 
Например:
 
Например:
<syntaxhighlight>  FList: TList; // список TComponent
+
<syntaxhighlight lang=pascal>  FList: TList; // список TComponent
 
   FInt: integer;</syntaxhighlight>
 
   FInt: integer;</syntaxhighlight>
 
При вставке новой переменной между FList и FInd комментарий сохраняется в строке FList. То же самое верно для
 
При вставке новой переменной между FList и FInd комментарий сохраняется в строке FList. То же самое верно для
<syntaxhighlight>  FList: TList; { список TComponent
+
<syntaxhighlight lang=pascal>  FList: TList; { список TComponent
 
     Это комментарий по нескольким строкам, начиная
 
     Это комментарий по нескольким строкам, начиная
 
    со строки FList, поэтому codetools предполагает, что он принадлежит
 
    со строки FList, поэтому codetools предполагает, что он принадлежит
Line 529: Line 525:
 
   FInt: integer;</syntaxhighlight>
 
   FInt: integer;</syntaxhighlight>
 
Если комментарий начинается со следующей строки, он будет обрабатываться так, как если бы он принадлежал коду ниже. Например:
 
Если комментарий начинается со следующей строки, он будет обрабатываться так, как если бы он принадлежал коду ниже. Например:
<syntaxhighlight>  FList: TList; // список TComponent
+
<syntaxhighlight lang=pascal>  FList: TList; // список TComponent
 
     { Этот комментарий относится к приведенному ниже операнду.
 
     { Этот комментарий относится к приведенному ниже операнду.
 
      Новый код вставлен над этим комментарием и
 
      Новый код вставлен над этим комментарием и
Line 537: Line 533:
 
===Обновление метода===
 
===Обновление метода===
 
Обычно автозавершение класса добавляет все отсутствующие тела методов. (Начиная с 0.9.27). Но если именно один метод отличается между [объявлением в] классе и теле, то тело метода обновляется. Например: у вас есть метод ''DoSomething''.
 
Обычно автозавершение класса добавляет все отсутствующие тела методов. (Начиная с 0.9.27). Но если именно один метод отличается между [объявлением в] классе и теле, то тело метода обновляется. Например: у вас есть метод ''DoSomething''.
<syntaxhighlight>  public
+
<syntaxhighlight lang=pascal>  public
 
     procedure DoSomething;
 
     procedure DoSomething;
 
   end;
 
   end;
Line 547: Line 543:
 
Теперь добавляем параметр:
 
Теперь добавляем параметр:
  
<syntaxhighlight>  public
+
<syntaxhighlight lang=pascal>  public
 
     procedure DoSomething(i: integer);
 
     procedure DoSomething(i: integer);
 
   end;</syntaxhighlight>
 
   end;</syntaxhighlight>
Line 553: Line 549:
 
и вызываем автозавершение кода ({{keypress|Ctrl|Shift|C}}). Тело метода будет обновлено, а новый параметр будет скопирован:
 
и вызываем автозавершение кода ({{keypress|Ctrl|Shift|C}}). Тело метода будет обновлено, а новый параметр будет скопирован:
  
<syntaxhighlight>procedure TForm.DoSomething(i: integer);
+
<syntaxhighlight lang=pascal>procedure TForm.DoSomething(i: integer);
 
begin
 
begin
 
end;</syntaxhighlight>
 
end;</syntaxhighlight>
Line 564: Line 560:
  
 
Например:<br>
 
Например:<br>
<syntaxhighlight>procedure DoSomething;
+
<syntaxhighlight lang=pascal>procedure DoSomething;
 
begin
 
begin
 
   AValueStudio:= BValueStudio;
 
   AValueStudio:= BValueStudio;
Line 574: Line 570:
  
 
Результат:
 
Результат:
<syntaxhighlight>procedure DoSomething;
+
<syntaxhighlight lang=pascal>procedure DoSomething;
 
begin
 
begin
 
   BValueStudio    := AValueStudio;
 
   BValueStudio    := AValueStudio;
Line 583: Line 579:
  
 
----
 
----
[[User:Zoltanleo|Zoltanleo]] 14:37, 1 November 2018 (CET): По умолчанию шоткаты для данной операции отсутствуют. Их легко определить самим, вызвав меню Tools --> Options --> Editor --> Key Mappings --> CodeTools Command --> Invert Assignment
+
[[User:Zoltanleo|Прим.перев.]] 14:37, 1 November 2018 (CET): По умолчанию шоткаты для данной операции отсутствуют. Их легко определить самим, вызвав меню Tools --> Options --> Editor --> Key Mappings --> CodeTools Command --> Invert Assignment
 
----
 
----
  
Line 589: Line 585:
 
Выберите текст и вызовите [эту команду (ПКМ --> Enclose Selection) или {{keypress|Ctrl|Shift|N}}]. Появится диалоговое окно, в котором вы можете выбрать, следует ли включить выделение в '''try..finally''' или многие другие общие блоки.
 
Выберите текст и вызовите [эту команду (ПКМ --> Enclose Selection) или {{keypress|Ctrl|Shift|N}}]. Появится диалоговое окно, в котором вы можете выбрать, следует ли включить выделение в '''try..finally''' или многие другие общие блоки.
  
===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.  
+
Поместите курсор на идентификатор и вызовите [эту команду (ПКМ --> Rename Identifier) или {{keypress|F2}}]. Появится диалоговое окно, в котором вы можете настроить область поиска и новое имя.
* 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.
+
* Ограничения: Это работает только с исходниками pascal, но не переименовывает файлы, не поддерживает ни файлы lfm/lrs, ни файлы lazdoc.
  
===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.
+
Поместите курсор на идентификатор и вызовите [эту процедуру (ПКМ --> Find --> Find Identifier References) или {{keypress|Ctrl|Shift|I}}]. Появится диалоговое окно, в котором вы можете настроить область поиска. Затем IDE будет искать все вхождения и только те, которые фактически используют это объявление. Это означает, что эта [процедура] не отображает другие объявления с таким же именем.
  
===Show abstract methods===
+
===Показ абстрактных методов===
This feature lists and auto completes virtual, abstracts methods that need to be implemented.
+
Эта функция перечисляет и автоматически завершает виртуальные, абстрактные методы, которые необходимо реализовать.
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.
+
Поместите курсор на объявление класса и вызовите [эту функцию (ПКМ --> Refactoring --> Abstract Methods)]. Если отсутствуют абстрактные методы, появится диалоговое окно с их перечислением. Выберите методы для реализации, и среда IDE создаст заглушки метода.
Since Lazarus 1.3 it adds missing ''class interface'' methods too.
+
Начиная с [версии] 1.3 Lazarus также добавляет недостающие методы ''интерфейса класса''.
  
===Extract Procedure===
+
===Извлечение процедуры===
  
See [[IDE Window: Extract Procedure|Extract Procedure]].
+
См. [[IDE Window: Extract Procedure/ru|Extract Procedure]].
  
==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. If the cursor is already at a declaration it will jump to the previous declaration with the same name. This allows to find redefinitions and overrides.
+
Поместите курсор на идентификатор и выполните 'Find Declaration' [("Найти объявление")]. Тогда это запустит поиск  объявления этого идентификатора, откроет файл и перейдет к нему. Если курсор уже находится в объявлении, он перейдет к предыдущему объявлению с тем же именем. Это позволяет находить переназначения и переопределения.
  
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.
+
Каждое найденное объявление устанавливает точку перехода. Это означает, что вы прыгнете с найденного объявления [к следующему найденному] объявлению и легко вернетесь [назад] с помощью Search -> Jump back.
  
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:
+
Существуют некоторые отличия от Delphi: утилиты кода работают с исходниками, следующим правилам обычного паскаля, вместо использования выходных [файлов] компилятора. Компилятор возвращает конечный тип. Утилиты кода видят исходники и все шаги между ними. Например:
  
The ''Visible'' property is first defined in ''TControl'' (controls.pp), then redefined in TCustomForm and finally redefined in TForm.
+
Свойство ''Visible'' сначала определяется в ''TControl'' (controls.pp), затем переопределяется в TCustomForm и, наконец, переопределяется в TForm.
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.
+
Вызов поиска объявления для [свойства] Visible сначала приведет вас к Visible в TForm. Затем вы снова можете вызвать Find Declaration [("Поиск объявления")], чтобы перейти к [свойству] Visible в TCustomForm, и снова, [чтобы] перейти к [свойству] Visible в TControl.
  
Same is true for types like ''TColor''. For the compiler it is simply a 'longint'. But in the sources it is defined as
+
То же самое верно и для таких типов, как ''TColor''. Для компилятора это просто [тип] 'longint'. Но в исходниках он определяется как
<syntaxhighlight>TGraphicsColor = -$7FFFFFFF-1..$7FFFFFFF;
+
<syntaxhighlight lang=pascal>TGraphicsColor = -$7FFFFFFF-1..$7FFFFFFF;
 
TColor = TGraphicsColor;</syntaxhighlight>
 
TColor = TGraphicsColor;</syntaxhighlight>
  
And the same for '''forward defined classes''': for instance in ''TControl'', there is a private variable
+
И то же самое [справедливо] для '''forward defined classes''' [("предшествующего определения  классов")]: например, в ''TControl'', есть private-переменная
<syntaxhighlight>FHostDockSite: TWinControl;</syntaxhighlight>
+
<syntaxhighlight lang=pascal>FHostDockSite: TWinControl;</syntaxhighlight>
Find declaration on TWinControl jumps to the forward definition
+
Поиск объявления в TWinControl перескочит в предшествующее определение
<syntaxhighlight>TWinControl = class;</syntaxhighlight>
+
<syntaxhighlight lang=pascal>TWinControl = class;</syntaxhighlight>
And invoking it again jumps to the real implementation
+
А вызов его снова переведет к реальной реализации
<syntaxhighlight>TWinControl = class(TControl)</syntaxhighlight>
+
<syntaxhighlight lang=pascal>TWinControl = class(TControl)</syntaxhighlight>
This way you can track down every identifier and find every overload.
+
Таким образом вы можете отслеживать каждый идентификатор и находить каждую [его] перегрузку.
  
===Hints===  
+
===Подсказки===  
* ump back with {{keypress|Ctrl|H}}.
+
* перейти назад {{keypress|Ctrl|H}}.
* view/navigate all visited locations via Menu: View -> "jump history"
+
* местоположениям через меню: View -> "jump history"
* With a 5 button Mouse the 2 extra buttons to go forward/backward between the visited points
+
* для 5-кнопочной мыши добавьте две дополнительные кнопки для перемещения вперед/назад между посещенными точками
:using [[IDE_Window:_EditorMouseOptionsAdvanced#Change_History_Jumps_for_3_button_Mouse_.28follow_back_the_.22Source_Link.22_trail.29|advanced mouse options]] the buttons can be remapped.
+
:используя [[IDE_Window:_EditorMouseOptionsAdvanced#Change_History_Jumps_for_3_button_Mouse_.28follow_back_the_.22Source_Link.22_trail.29|advanced mouse options]], кнопки можно переназначить.
  
==Identifier Completion==
+
==Автозавершение идентификатора==
"Identifier Completion" is invoked by {{keypress|Ctrl|space}}. It shows all identifiers in scope. For example:
+
"Identifier Completion" [("автозавершение идентификатора")] вызывается [комбинацией клавиш] {{keypress|Ctrl|space}}. Это  отображает все идентификаторы в области видимости. Например:
  
<syntaxhighlight>procedure TForm1.FormCreate(Sender: TObject);
+
<syntaxhighlight lang=pascal>procedure TForm1.FormCreate(Sender: TObject);
 
begin
 
begin
 
   |
 
   |
 
end;</syntaxhighlight>
 
end;</syntaxhighlight>
  
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.
+
Поместите курсор между ''begin'' и ''end'' и нажмите {{keypress|Ctrl|space}}. IDE/Утилиты кода теперь будут анализировать весь доступный код и представлять список всех найденных идентификаторов. Утилиты кода кэшируют результаты, поэтому повторное использование этого кода будет намного быстрее.
  
{{Note| for Delphians: Delphi calls it ''Code completion''.}}
+
{{Note| для Дельфийцев: в Дельфи  это называется ''Автозавершение кода''.}}
  
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.
+
Некоторые идентификаторы, такие как 'Write', 'ReadLn', 'Low', 'SetLength', 'Self', 'Result', 'Copy' встроены в компилятор и не определены нигде в исходниках. В автозавершении идентификатора также есть много таких вещей. Если вы обнаружите, что хоть один отсутствует, просто создайте запрос функции в багтрекере.
  
''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.
+
''Автозавершение идентификатора'' не автозавершает все ''ключевые слова''. Поэтому вы не можете использовать его для автозавершения [ключевого слова] 'repe' до 'repeat'. Для этого используйте {{keypress|Ctrl|W}} [[Lazarus_IDE_Tools/ru#Автозавершение слова|Автозавершение слова]] или {{keypress|Ctrl|J}} [[Lazarus_IDE_Tools/ru#Шаблоны кода|Шаблоны кода]]. Начиная с версии 0.9.27 ''автозавершение идентификатора'' автозавершает некоторые ключевые слова.
  
Identifier completion shows even those identifiers, that are not compatible.
+
Автозавершение идентификатора показывает даже те идентификаторы, которые несовместимы.
  
===Matching only the first part of a word===
+
===Сопоставление только первой части слова===
You can invoke identifier completion only on the first few characters in a word. Position the cursor within a word. ''Only characters to the left of the cursor'' will be used to look up identifiers. For example:
+
Вы можете вызвать автозавершение идентификатора только по первым нескольким символам в слове. Поместите курсор внутри слова. Для поиска идентификаторов будут использоваться ''только символы слева от курсора''. Например:
  
<syntaxhighlight>procedure TForm1.FormCreate(Sender: TObject);
+
<syntaxhighlight lang=pascal>procedure TForm1.FormCreate(Sender: TObject);
 
begin
 
begin
 
   Ca|ption
 
   Ca|ption
 
end;</syntaxhighlight>
 
end;</syntaxhighlight>
  
The box will show you only identifiers beginning with 'Ca' ( | indicates the cursor position).
+
Во [всплывающем] поле будут показаны только идентификаторы, начинающиеся с 'Ca' (| указывает позицию курсора).
  
===Keys===
+
===Клавиши===
* Letter or number: add the character to the source editor and the current prefix. This will update the list.
+
* Буква или цифра: добавьте символ в редактор исходного кода и текущий префикс. Это обновит список.
* Backspace: remove the last character from source editor and prefix. Updates the list.
+
* Backspace: удалит последний символ из исходного редактора и префикса. Обновляет список.
* Return: replace the whole word at cursor with the selected identifier and close the popup window.
+
* Return: заменяет целое слово под курсором на выбранный идентификатор и закрывает всплывающее окно.
* Shift+Return: as ''Return'', but replaces only the prefix (left part) of the word at the cursor.
+
* Shift+Return: как ''Return'', но заменяет только префикс (левая часть) слова под курсором.
* Up/Down: move selection
+
* Up/Down: перемещает выделение
* Escape: close popup without change
+
* Escape: закрывает всплывающее окно без изменений
* 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'.
+
* Tab: завершает префикс для следующего выбора. Например: текущий префикс 'But', а завершение идентификатора показывает только 'Button1' и 'Button1Click'. Тогда нажатие ''Tab'' завершит префикс 'Button1'.
* Else: as ''Return'' and add the character to the source editor
+
* Else: как ''Return'' и добавляет символ в редактор исходного кода
  
===Methods===
+
===Методы===
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:
+
Когда курсор находится в определении класса, и ваш идентификатор завершает метод, определенный в классе предков, параметры и ключевое слово переопределения будут добавляться автоматически. Например:
  
<syntaxhighlight>TMainForm = class(TForm)
+
<syntaxhighlight lang=pascal>TMainForm = class(TForm)
 
protected
 
protected
 
   mous|
 
   mous|
 
end;</syntaxhighlight>
 
end;</syntaxhighlight>
  
Completing '''MouseDown''' gives:
+
Завершение '''MouseDown''' дает:
  
<syntaxhighlight>TMainForm = class(TForm)
+
<syntaxhighlight lang=pascal>TMainForm = class(TForm)
 
protected
 
protected
 
   procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X,
 
   procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X,
Line 689: Line 685:
 
end;</syntaxhighlight>
 
end;</syntaxhighlight>
  
===Properties===
+
===Свойства===
<syntaxhighlight>property MyInt: integer read |;</syntaxhighlight>
+
<syntaxhighlight lang=pascal>property MyInt: integer read |;</syntaxhighlight>
  
Identifier completion will show '''FMyInt''' and '''GetMyInt'''.
+
Автозавершение идентификатора покажет '''FMyInt''' и '''GetMyInt'''.
  
<syntaxhighlight>property MyInt: integer write |;</syntaxhighlight>
+
<syntaxhighlight lang=pascal>property MyInt: integer write |;</syntaxhighlight>
  
Identifier completion will show '''FMyInt''' and '''SetMyInt'''.
+
Автозавершение идентификатора покажет '''FMyInt''' и '''SetMyInt'''.
  
===Uses section / Unit names===
+
===Секции Uses / Имена модулей===
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 case of the unit (e.g. ''AVL_Tree'').
+
В разделах uses автозавершение идентификатора будет отображать имена файлов всех модулей в пути поиска. Они все будут отображаться строчными буквами (например, ''avl_tree''), потому что большинство модулей имеют имена файлов в нижнем регистре. По автозавершении они вставляются в том регистре, [в каком модуль назван] (например, ''AVL_Tree'').
  
===Statements===
+
===Операторы===
<syntaxhighlight>procedure TMainForm.Button1Click(Sender: TObject);
+
<syntaxhighlight lang=pascal>procedure TMainForm.Button1Click(Sender: TObject);
 
begin
 
begin
 
   ModalRe|;
 
   ModalRe|;
 
end;</syntaxhighlight>
 
end;</syntaxhighlight>
  
becomes:
+
будет выглядеть так:
  
<syntaxhighlight>procedure TMainForm.Button1Click(Sender: TObject);
+
<syntaxhighlight lang=pascal>procedure TMainForm.Button1Click(Sender: TObject);
 
begin
 
begin
 
   ModalResult:=|;
 
   ModalResult:=|;
 
end;</syntaxhighlight>
 
end;</syntaxhighlight>
  
===Icons in completion window===
+
===Иконки в окне автозавершения===
 +
 
 +
В 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" ("Значки в окне автозавершения кода").
  
In Lazarus 1.9+, option exists to show icons instead of "types", for lines in the completion window.
+
[[File:icon_in_code_completion.png|500px]]
Picture shows these icons:
+
----
  
[[Image:ide_completion_icons.png]]
+
==Автозавершение слова==
 +
''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)==
 +
Это диалоговое окно позволяет вам искать идентификаторы в других модулях. Модули не должны использоваться вашим кодом.
  
==Unit / Identifier Dictionary (Cody)==
+
Эта функция является частью пакета "Cody". Чтобы активировать функцию, установите пакет.
This dialog lets you search for identifiers in other units. The units do not yet have to be used by your code.
 
  
This feature is part of the package "Cody". To activate the feature install the package.
+
==Переход в директиву Include==
 +
"Goto Include Directive" [(переход в директиву Include)] в меню поиска IDE переходит к выражению {$I filename}, в котором используется текущий файл include.
  
==Goto Include Directive==
+
==Публикация проекта==
"Goto Include Directive" in the search menu of the IDE jumps to {$I filename} statement where the current include file is used.
+
Создает копию всего проекта. Если вы хотите отправить кому-то только исходники и параметры компилятора вашего кода, эта функция является вашим другом.
  
==Publish Project==
+
Обычный каталог проекта содержит много информации. Большинство из них не нужно публиковать: файл .lpi может содержать информацию о сеансе (например, позицию каретки и закладки закрытых блоков), а каталог проекта содержит много файлов .ppu, .o и исполняемый файл. Чтобы создать файл lpi только с базовой информацией, [а также создать] только исходники со всеми подкаталогами, используйте [опцию] "Publish Project" [(опубликовать проект)].
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.
 
  
A normal project directory contains a lot of information. Most of it is not needed to be published: the .lpi file can contain 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| Начиная с версии 0.9.13, есть новая [опция в ] ''Project Option'', которая позволяет хранить информацию о сеансе в [другом] файле отдельно от обычного файла .lpi. Этот новый файл заканчивается расширением .lps и содержит только информацию о сеансе, что значительно упрощает ваш файл .lpi.}}
  
{{Note| Since version 0.9.13 there is a new ''Project Option'' that allows you to store session information in a separate file from the normal .lpi file.  This new file ends with the .lps extension and only contains session information, which will leave your .lpi file much cleaner.}}
+
В диалоговом окне вы можете настроить фильтр для включения и исключения определенных файлов; с [возможным выполнением] команды после того, как вы архивируете выходные файлы.
  
In the dialog you can setup a filter to include and exclude certain files; with the command after you can compress the output into one archive.
+
==Советы по комментариям==
  
==Hints from comments==
+
В нескольких местах IDE показывает подсказки для идентификатора. Например, при перемещении мыши по идентификатору в редакторе исходного кода и ожидании нескольких секунд. Когда IDE показывает подсказку для идентификатора, она ищет объявление его и всех его предков, [а также] ищет комментарии и файлы fpdoc. Существует много стилей кодирования и много стилей комментариев. Чтобы поддерживать многие общие стили комментариев, среда IDE использует следующий [механизм] эвристики:
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 hint 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===
+
===Комментарии, показанные в подсказке===
Comments in front of a declaration, without empty line and not starting with the ''<'' sign:
+
Комментарии перед объявлением без пустой строки и не начинающиеся со знака ''<'':
  
<syntaxhighlight>var
+
<syntaxhighlight lang=pascal>var
   {Comment}
+
   {Комментарий}
 
   Identifier: integer;</syntaxhighlight>
 
   Identifier: integer;</syntaxhighlight>
  
Comments with the ''<'' sign belong to the prior identifier.
+
Комментарии с знаком ''<'' принадлежит к предыдущему идентификатору.
  
Comments behind an identifier on the same line:
+
Комментарии за идентификатором в одной строке:
  
<syntaxhighlight>var  
+
<syntaxhighlight lang=pascal>var  
   identifier, // Comment
+
   identifier, // Комментарий
 
   other,</syntaxhighlight>
 
   other,</syntaxhighlight>
  
Comments behind the definition on the same line:
+
Комментарии позади определения в той же строке:
  
<syntaxhighlight>var
+
<syntaxhighlight lang=pascal>var
 
   identifier:  
 
   identifier:  
     char; // Comment</syntaxhighlight>
+
     char; // Комментарий</syntaxhighlight>
  
An example for '''<''' sign:
+
Пример для знака '''<''':
  
<syntaxhighlight>const
+
<syntaxhighlight lang=pascal>const
 
   a = 1;
 
   a = 1;
   //< comment for a
+
   //< комментарий для a
 
   b = 2;
 
   b = 2;
   // comment for c
+
   // комментарий для c
 
   c = 3;</syntaxhighlight>
 
   c = 3;</syntaxhighlight>
  
All three comment types are supported:
+
Поддерживаются все три типа комментариев:
<syntaxhighlight>  {Comment}(*Comment*)//Comment
+
<syntaxhighlight lang=pascal>  {Комментарий}(*Комментарий*)//Комментарий
 
   c = 1;</syntaxhighlight>
 
   c = 1;</syntaxhighlight>
  
===Comments not shown in the hint===
+
===Комментарии, не показываемые в подсказке===
Comments starting with '''$''' or '''%''' are ignored. For example ''//% Hiddden'', ''//$ Hidden'', ''(*$ Hidden*)''.
+
Комментарии, начинающиеся с '''$''' или '''%''', игнорируются. Например, ''//% 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:
+
Комментарии спереди, разделенные пустой строкой, рассматриваются как не относящиеся к следующему идентификатору. Например, следующий комментарий заголовка класса не отображается в подсказке:
  
<syntaxhighlight>type
+
<syntaxhighlight lang=pascal>type
 
   { TMyClass }
 
   { TMyClass }
 
    
 
    
 
   TMyClass = class</syntaxhighlight>
 
   TMyClass = class</syntaxhighlight>
  
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:
  
<syntaxhighlight>  // Boolean
+
<syntaxhighlight lang=pascal>  // Boolean
 
   GL_TRUE                          = 1;
 
   GL_TRUE                          = 1;
 
   GL_FALSE                          = 0;</syntaxhighlight>
 
   GL_FALSE                          = 0;</syntaxhighlight>
  
==Quick Fixes==
+
==Быстрые исправления==
Quick Fixes are menu items for specific compiler messages. They help you to quickly fix the problem. Select a message in the ''Messages'' window and right click, or right click in the source editor on the icon to the left.  
+
Быстрые исправления - это пункты меню для конкретных сообщений компилятора. Они помогают быстро решить проблему. Выберите сообщение в окне «Сообщения» и щелкните правой кнопкой мыши или щелкните правой кнопкой мыши в редакторе исходного кода на значке слева.  
*Unit not found: remove from uses section
+
*Unit not found [модуль не найден]: удалите из раздела uses
*Unit not found: find unit in loaded packages and allow to auto add package dependency
+
*Unit not found [модуль не найден]: найдите модуль в загруженных пакетах и разрешите автоматическое добавление зависимости пакета
*Constructing a class "$1" with abstract method "$2": show dialog to override all abstract methods
+
*Constructing a class "$1" with abstract method "$2" [Создание класса "$1" с абстрактным методом "$2"]: показ диалогового окна для переопределения всех абстрактных методов
*Local variable "$1" not used: remove definition
+
*Local variable "$1" not used [Локальная переменная "$1" не используется]: удалите определение
*Circular unit reference between $1 and $2: show Unit Dependencies dialog with full path between the two units
+
*Circular unit reference between $1 and $2 [циркулярная ссылка модуля между $1 и $2]: показывает диалоговое окно зависимостей с полным путем между двумя модулями
*Identifier not found: search via Code Browser
+
*Identifier not found [Идентификатор не найден]: поиск через браузер кода
*Identifier not found: search via Cody Dictionary (needs package [[Cody]])
+
*Identifier not found [Идентификатор не найден]: поиск через словарь Cody (нужен пакет [[Cody]])
*Identifier not found: add local variable
+
*Identifier not found [Идентификатор не найден]: добавьте локальную переменную
*Recompiling $1, checksum changed for $2: show a dialog with search paths and other information
+
*Recompiling $1, checksum changed for $2 [Перекомпиляция $1, контрольная сумма изменена для $2]: показать диалог с путями поиска и другой информацией
*IDE warning: other sources path of package %s contains directory...: open package
+
*IDE warning: other sources path of package %s contains directory... [Предупреждение IDE: другие пути исходников пакета %s содержит каталог ...:]: откройте пакет
*any hint, note, warning: add IDE directive {%H-}
+
*any hint, note, warning [любые подсказки, примечания, предупреждения]: добавьте директиву IDE {%H-}
*any hint, note, warning: add compiler directive {$warn id off} (since 1.7)
+
*any hint, note, warning [любые подсказки, примечания, предупреждения]: добавьте директиву компилятора {$warn id off} (начиная с 1.7)
*any hint, note, warning: add compiler option -vm<messageid>
+
*any hint, note, warning [любые подсказки, примечания, предупреждения]: добавьте опцию компилятора -vm<messageid>
*Local variable "i" does not seem to be initialized: insert assignment (since 1.5)
+
*Local variable "i" does not seem to be initialized [Локальная переменная "i", похоже, не инициализирована]: вставьте присвоение (начиная с 1.5)
*Inherited method is hidden: add modifier override, overload, or reintroduce (since 1.9)
+
*Inherited method is hidden [Унаследованный метод скрыт]: добавьте модификатор override, overload, или reintroduce (начиная с 1.9)
  
==Outline==
+
==Контур==
  
This option is located in the IDE Options dialog, Editor - Display - Markup and Matches - Outline (global).
+
Этот параметр находится в диалоговом окне Options --> Editor --> Display --> Markup and Matches --> Outline (global) [Параметры --> Редактор --> Отображение --> Подсветка и соответствия --> Отображать контур блока(глобально)].
  
It makes highlighting of Pascal keywords together with their begin-end brackets. This allows to see nesting of big blocks.
+
Он выделяет ключевые слова Pascal вместе со своими операторными(begin-end) скобками. Это позволяет видеть вложенность больших блоков.
For example, for such procedure body:
+
 
<syntaxhighlight>
+
Например, для такого тела процедуры:
 +
<syntaxhighlight lang=pascal>
 
   with ADockObject do
 
   with ADockObject do
 
   begin
 
   begin
Line 836: Line 842:
 
</syntaxhighlight>
 
</syntaxhighlight>
 
    
 
    
it highlights:
+
он подсвечивает:
  
* outer with-do-begin-end in orange
+
* внешний with-do-begin-end оранжевым
* next if-then-begin-end in green
+
* следующий if-then-begin-end зеленым
* inner if-then-else in cyan
+
* внутренний if-then-else голубым
  
 
[[Image:ide_outline.png]]
 
[[Image:ide_outline.png]]
 
 
 
[[Category:Russian (unfinished translation)]]
 

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