Difference between revisions of "Lazarus IDE Tools/ru"

From Free Pascal wiki
Jump to navigationJump to search
m
 
(4 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 212: Line 208:
 
Например: создайте класс (для быстроты можете использовать шаблоны кода):
 
Например: создайте класс (для быстроты можете использовать шаблоны кода):
  
<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 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 411: Line 407:
  
 
Другой пример:
 
Другой пример:
<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 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 603: Line 599:
 
Начиная с [версии] 1.3 Lazarus также добавляет недостающие методы ''интерфейса класса''.
 
Начиная с [версии] 1.3 Lazarus также добавляет недостающие методы ''интерфейса класса''.
  
===Извлечь процедуру===
+
===Извлечение процедуры===
  
См. [[IDE Window: Extract Procedure|Extract Procedure]].
+
См. [[IDE Window: Extract Procedure/ru|Extract Procedure]].
  
 
==Поиск объявлений==
 
==Поиск объявлений==
Line 618: Line 614:
  
 
То же самое верно и для таких типов, как ''TColor''. Для компилятора это просто [тип] 'longint'. Но в исходниках он определяется как
 
То же самое верно и для таких типов, как ''TColor''. Для компилятора это просто [тип] 'longint'. Но в исходниках он определяется как
<syntaxhighlight>TGraphicsColor = -$7FFFFFFF-1..$7FFFFFFF;
+
<syntaxhighlight lang=pascal>TGraphicsColor = -$7FFFFFFF-1..$7FFFFFFF;
 
TColor = TGraphicsColor;</syntaxhighlight>
 
TColor = TGraphicsColor;</syntaxhighlight>
  
 
И то же самое [справедливо] для '''forward defined classes''' [("предшествующего определения  классов")]: например, в ''TControl'', есть private-переменная
 
И то же самое [справедливо] для '''forward defined classes''' [("предшествующего определения  классов")]: например, в ''TControl'', есть private-переменная
<syntaxhighlight>FHostDockSite: TWinControl;</syntaxhighlight>
+
<syntaxhighlight lang=pascal>FHostDockSite: TWinControl;</syntaxhighlight>
 
Поиск объявления в TWinControl перескочит в предшествующее определение
 
Поиск объявления в TWinControl перескочит в предшествующее определение
<syntaxhighlight>TWinControl = class;</syntaxhighlight>
+
<syntaxhighlight lang=pascal>TWinControl = class;</syntaxhighlight>
 
А вызов его снова переведет к реальной реализации
 
А вызов его снова переведет к реальной реализации
<syntaxhighlight>TWinControl = class(TControl)</syntaxhighlight>
+
<syntaxhighlight lang=pascal>TWinControl = class(TControl)</syntaxhighlight>
 
Таким образом вы можете отслеживать каждый идентификатор и находить каждую [его] перегрузку.
 
Таким образом вы можете отслеживать каждый идентификатор и находить каждую [его] перегрузку.
  
Line 638: Line 634:
 
"Identifier Completion" [("автозавершение идентификатора")] вызывается [комбинацией клавиш] {{keypress|Ctrl|space}}. Это  отображает все идентификаторы в области видимости. Например:
 
"Identifier Completion" [("автозавершение идентификатора")] вызывается [комбинацией клавиш] {{keypress|Ctrl|space}}. Это  отображает все идентификаторы в области видимости. Например:
  
<syntaxhighlight>procedure TForm1.FormCreate(Sender: TObject);
+
<syntaxhighlight lang=pascal>procedure TForm1.FormCreate(Sender: TObject);
 
begin
 
begin
 
   |
 
   |
Line 656: Line 652:
 
Вы можете вызвать автозавершение идентификатора только по первым нескольким символам в слове. Поместите курсор внутри слова. Для поиска идентификаторов будут использоваться ''только символы слева от курсора''. Например:
 
Вы можете вызвать автозавершение идентификатора только по первым нескольким символам в слове. Поместите курсор внутри слова. Для поиска идентификаторов будут использоваться ''только символы слева от курсора''. Например:
  
<syntaxhighlight>procedure TForm1.FormCreate(Sender: TObject);
+
<syntaxhighlight lang=pascal>procedure TForm1.FormCreate(Sender: TObject);
 
begin
 
begin
 
   Ca|ption
 
   Ca|ption
Line 676: Line 672:
 
Когда курсор находится в определении класса, и ваш идентификатор завершает метод, определенный в классе предков, параметры и ключевое слово переопределения будут добавляться автоматически. Например:
 
Когда курсор находится в определении класса, и ваш идентификатор завершает метод, определенный в классе предков, параметры и ключевое слово переопределения будут добавляться автоматически. Например:
  
<syntaxhighlight>TMainForm = class(TForm)
+
<syntaxhighlight lang=pascal>TMainForm = class(TForm)
 
protected
 
protected
 
   mous|
 
   mous|
Line 683: Line 679:
 
Завершение '''MouseDown''' дает:
 
Завершение '''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 690: Line 686:
  
 
===Свойства===
 
===Свойства===
<syntaxhighlight>property MyInt: integer read |;</syntaxhighlight>
+
<syntaxhighlight lang=pascal>property MyInt: integer read |;</syntaxhighlight>
  
 
Автозавершение идентификатора покажет '''FMyInt''' и '''GetMyInt'''.
 
Автозавершение идентификатора покажет '''FMyInt''' и '''GetMyInt'''.
  
<syntaxhighlight>property MyInt: integer write |;</syntaxhighlight>
+
<syntaxhighlight lang=pascal>property MyInt: integer write |;</syntaxhighlight>
  
 
Автозавершение идентификатора покажет '''FMyInt''' и '''SetMyInt'''.
 
Автозавершение идентификатора покажет '''FMyInt''' и '''SetMyInt'''.
Line 702: Line 698:
  
 
===Операторы===
 
===Операторы===
<syntaxhighlight>procedure TMainForm.Button1Click(Sender: TObject);
+
<syntaxhighlight lang=pascal>procedure TMainForm.Button1Click(Sender: TObject);
 
begin
 
begin
 
   ModalRe|;
 
   ModalRe|;
Line 709: Line 705:
 
будет выглядеть так:
 
будет выглядеть так:
  
<syntaxhighlight>procedure TMainForm.Button1Click(Sender: TObject);
+
<syntaxhighlight lang=pascal>procedure TMainForm.Button1Click(Sender: TObject);
 
begin
 
begin
 
   ModalResult:=|;
 
   ModalResult:=|;
Line 719: Line 715:
 
На рисунке показаны эти значки:
 
На рисунке показаны эти значки:
  
[[Image:ide_completion_icons.png]]
+
[[Image:ide_completion_icons.png|250px]]
  
  
Line 726: Line 722:
 
[[User:Zoltanleo|Прим.перев.]] 21:20, 6 November 2018 (CET): По умолчанию показ иконок отключен. Чтобы включить их, необходимо в меню Tools --> Options --> Codetools --> Identifier Completion (Сервис --> Параметры --> Code tools --> Завершение идентификаторов) в разделе Appearance (Внешний вид) отметить галочкой чекбокс "Icons in code completion box" ("Значки в окне автозавершения кода").
 
[[User:Zoltanleo|Прим.перев.]] 21:20, 6 November 2018 (CET): По умолчанию показ иконок отключен. Чтобы включить их, необходимо в меню Tools --> Options --> Codetools --> Identifier Completion (Сервис --> Параметры --> Code tools --> Завершение идентификаторов) в разделе Appearance (Внешний вид) отметить галочкой чекбокс "Icons in code completion box" ("Значки в окне автозавершения кода").
  
 +
[[File:icon_in_code_completion.png|500px]]
 
----
 
----
  
Line 757: Line 754:
 
Комментарии перед объявлением без пустой строки и не начинающиеся со знака ''<'':
 
Комментарии перед объявлением без пустой строки и не начинающиеся со знака ''<'':
  
<syntaxhighlight>var
+
<syntaxhighlight lang=pascal>var
 
   {Комментарий}
 
   {Комментарий}
 
   Identifier: integer;</syntaxhighlight>
 
   Identifier: integer;</syntaxhighlight>
Line 765: Line 762:
 
Комментарии за идентификатором в одной строке:
 
Комментарии за идентификатором в одной строке:
  
<syntaxhighlight>var  
+
<syntaxhighlight lang=pascal>var  
 
   identifier, // Комментарий
 
   identifier, // Комментарий
 
   other,</syntaxhighlight>
 
   other,</syntaxhighlight>
Line 771: Line 768:
 
Комментарии позади определения в той же строке:
 
Комментарии позади определения в той же строке:
  
<syntaxhighlight>var
+
<syntaxhighlight lang=pascal>var
 
   identifier:  
 
   identifier:  
 
     char; // Комментарий</syntaxhighlight>
 
     char; // Комментарий</syntaxhighlight>
Line 777: Line 774:
 
Пример для знака '''<''':
 
Пример для знака '''<''':
  
<syntaxhighlight>const
+
<syntaxhighlight lang=pascal>const
 
   a = 1;
 
   a = 1;
 
   //< комментарий для a
 
   //< комментарий для a
Line 785: Line 782:
  
 
Поддерживаются все три типа комментариев:
 
Поддерживаются все три типа комментариев:
<syntaxhighlight>  {Комментарий}(*Комментарий*)//Комментарий
+
<syntaxhighlight lang=pascal>  {Комментарий}(*Комментарий*)//Комментарий
 
   c = 1;</syntaxhighlight>
 
   c = 1;</syntaxhighlight>
  
Line 793: Line 790:
 
Комментарии спереди, разделенные пустой строкой, рассматриваются как не относящиеся к следующему идентификатору. Например, следующий комментарий заголовка класса не отображается в подсказке:
 
Комментарии спереди, разделенные пустой строкой, рассматриваются как не относящиеся к следующему идентификатору. Например, следующий комментарий заголовка класса не отображается в подсказке:
  
<syntaxhighlight>type
+
<syntaxhighlight lang=pascal>type
 
   { TMyClass }
 
   { TMyClass }
 
    
 
    
Line 802: Line 799:
 
Следующий комментарий будет показан для GL_TRUE, но не для 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>
Line 831: Line 828:
  
 
Например, для такого тела процедуры:
 
Например, для такого тела процедуры:
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
 
   with ADockObject do
 
   with ADockObject do
 
   begin
 
   begin

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