Difference between revisions of "Lazarus IDE Tools/ja"

From Lazarus wiki
Jump to navigationJump to search
Line 81: Line 81:
 
このインクルードファイルの手続きもしくはメソッド定義からその本体への移動は直前の動作次第です。もしlcl/lclintf.ppに取り組んでいるのであれば、IDEはwinapi.incに移動します。もしlcl/interfacebase.ppを扱っているのであれば、IDEはlcl/include/interfacebase.inc (もしくはその他のインクルードファイル)に移動します。それらの両方に取り組んでいるのであれば...混乱してしまいますね ;)
 
このインクルードファイルの手続きもしくはメソッド定義からその本体への移動は直前の動作次第です。もしlcl/lclintf.ppに取り組んでいるのであれば、IDEはwinapi.incに移動します。もしlcl/interfacebase.ppを扱っているのであれば、IDEはlcl/include/interfacebase.inc (もしくはその他のインクルードファイル)に移動します。それらの両方に取り組んでいるのであれば...混乱してしまいますね ;)
  
== コードテンプレート ==
+
==コードテンプレート==
Code Templates converts an identifier into a text or code fragment.
+
コードテンプレートは、ある識別子からあるテキストもしくはコードの断片に変換します。
 
+
コードテンプレートのデフォルトのショートカットはCtrl+Jです。識別子をタイプして、Ctrl+Jを押すと識別子は識別子に応じて設定されたテキストに置き換えられます。コードテンプレートは環境 -> コードテンプレートで設定できます。
Code Templates default short cut is Ctrl+J. You can type an identifier, press Ctrl+J and the identifier is replaced by the text defined for the identifier. Code Templates can be defined in Environment -> Editor Options -> CodeTools.
 
  
 
例:
 
例:
Write the identifier 'classf', leave the cursor right behind the 'f' and press Ctrl+J. The 'classf' will be replaced by
+
識別子'classf'を書き、カーソルをfのすぐ後ろに置いて、Ctrl+Jを押すと、'classf'は以下に置き換えられます。
 
  T = class(T)
 
  T = class(T)
 
  private
 
  private
Line 95: Line 94:
 
   destructor Destroy; override;
 
   destructor Destroy; override;
 
  end;
 
  end;
and the cursor is behind the 'T'.
+
そしてカーソルは'T'の後ろに来ます。
You can get the list of templates by positioning the cursor on space (not on an identifier) and pressing Ctrl+J. The list of code templates will pop up. Use the cursor keys or type some chars to choose one. Return creates the selected template and Escape closes the pop up.
+
カーソルを空白に置いて(識別子の上でなく)Ctrl+Jを押すとテンプレートのリストがポップアップで示されます。カーソルキーもしくはいくつかの文字をタイプしてその中のどれかを選択してください。リターンキーを押せば選択されたテンプレートが挿入され、Escでそのポップアップが閉じます。
  
 
== コード補完 ==
 
== コード補完 ==

Revision as of 13:49, 18 September 2006

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 Documentation日本語版 - 翻訳ノート - 日本語障害情報


概要

IDEは"コードツール"と呼ばれる、pascalソースの構文解析と編集のためのツールのライブラリを使用しています。これらのツールは宣言の探索、コード補完、抽出、pascalのソースの移動・挿入、美化といった機能を提供します。これらの機能は、多くの時間の節約につながり、効率を倍加させてくれます。これらはカスタマイズでき、どの機能もショートカットで利用できます(エディタオプションを見てください)。それらの機能はソースにのみ作用し、fpcやdelphiやkylixコードを解釈するだけなので、コンパイルされたユニットやBorlandコンパイラを必要としません。 あなたはDelphiとFPCコードを同時に編集できます。あなたはいくつかのバージョンのDelphiとFPCコードに同時に取り組むことさえできます。このことがDelphiコードの移植をより容易にします。

IDE ショートカットの要約テーブル

宣言への移動 Ctrl+Click or Alt+Up (型や変数の宣言への移動)
メソッドへの移動 Ctrl+Shift+Up (宣言と本体との切り替え)
コードテンプレート Ctrl+J
コード補完 (クラス補完) Ctrl+Shift+C
識別子補完 Ctrl+Space
語句補完 Ctrl+W

メソッドへの移動

手続きの本体(begin..end)と手続き宣言(procedure Name;)の間の移動にはCtrl+Shift+Upを用いてください。 例えば:

interface

procedure DoSomething; // procedure definition
 
implementation
 
procedure DoSomething; // 手続き本体 
begin
end;

カーソルが手続きの本体にあるときにCtrl+Shift+Upすると、カーソルが手続き宣言に移動します。もう一度 Ctrl+Shift+Upを押すと本体のbeginのあとに移動します。 この機能はメソッド(クラスの手続き)でも使えます。

ヒント: 'メソッドへの移動'は同じ名前と引数リストをもつ同じ手続きに移動します。もし合致する手続きがなければ最良の候補の中の最初に異なる部分に移動します。(Delphiユーザーへ: Delphiにはない機能です).

異なる引数型をもつ手続きの例:

interface

procedure DoSomething(p: char); // procedure definition

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}構造体を避けるためにインクルードファイルはコンパイラ指令を用いています。

例えば、.pasファイルの中のメソッドからインクルードファイル内のメソッド本体へ移動できます。 コード補完のようなすべてのコードツールはインクルードファイルを特殊な拘束条件とみなします。

例:コード補完がもうひとつのメソッド本体のうしろに新しいメソッドを追加すると、コード補完は双方を同じファイル内に保持します。このようにして、LCLがほぼ全てのコントロールにそうやって管理しているのと同様に、すべてのクラス実装をインクルードファイル内に置くことができます。 しかし、初心者が陥りやすい罠があります: インクルードファイルを最初に開き、メソッド移動もしくは定義検索をしようとすると、エラーが発生します。IDEはどのユニットにインクルードファイルが属するかを知りません。まず初めに対象とするユニットを開かなければなりません。


IDEがユニットを構文解析するとすぐに、そこのインクルード指令を解釈し、IDEはこの関係を記憶します。IDEはこの情報を終了時やプロジェクト保存時に‾/.lazarus/includelinks.xmlに保存します。次にこのインクルードファイルを開き、移動や定義検索をしようとすると、IDEは内部的にそのユニットを開き、移動機能が作動します。

このメカニズムにはもちろん限界があります。いくつかのインクルードファイルは2回かそれ以上インクルードされます。例: lcl/include/winapih.inc.

このインクルードファイルの手続きもしくはメソッド定義からその本体への移動は直前の動作次第です。もしlcl/lclintf.ppに取り組んでいるのであれば、IDEはwinapi.incに移動します。もしlcl/interfacebase.ppを扱っているのであれば、IDEはlcl/include/interfacebase.inc (もしくはその他のインクルードファイル)に移動します。それらの両方に取り組んでいるのであれば...混乱してしまいますね ;)

コードテンプレート

コードテンプレートは、ある識別子からあるテキストもしくはコードの断片に変換します。 コードテンプレートのデフォルトのショートカットはCtrl+Jです。識別子をタイプして、Ctrl+Jを押すと識別子は識別子に応じて設定されたテキストに置き換えられます。コードテンプレートは環境 -> コードテンプレートで設定できます。

例: 識別子'classf'を書き、カーソルをfのすぐ後ろに置いて、Ctrl+Jを押すと、'classf'は以下に置き換えられます。

T = class(T)
private

public
  constructor Create;
  destructor Destroy; override;
end;

そしてカーソルは'T'の後ろに来ます。 カーソルを空白に置いて(識別子の上でなく)Ctrl+Jを押すとテンプレートのリストがポップアップで示されます。カーソルキーもしくはいくつかの文字をタイプしてその中のどれかを選択してください。リターンキーを押せば選択されたテンプレートが挿入され、Escでそのポップアップが閉じます。

コード補完

Code Completion can be found in the IDE menu Edit -> Complete Code and has as standard short cut Ctrl+Shift+C.

For Delphians: Delphi calls "code completion" the function showing the list of identifiers at the current source position (Ctrl+Space). Under Lazarus this is called "Identifier completion".

Code Completion combines several powerful functions. Examples:

  • Class Completion: completes properties, adds method bodies, add private variables and private access methods
  • Forward Procedure Completion: adds procedure bodies
  • Event Assignment Completion: completes event assignments and adds method definition and body
  • Variable Declaration Completion: adds local variable definitions

Which function is used, depends on the cursor position in the editor.

Code Completion can be found in the IDE menu Edit -> Complete Code and has as standard short cut Ctrl+Shift+C.

Class Completion

The most powerful code completion feature is "Class Completion". You write a class, add the methods and properties and Code Completion will add the method bodies, the property access methods/variables and the private variables.

For example: Create a class (see Code Templates to save you some type work):

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

Position the cursor somewhere in the class and press Ctrl+Shift+C. This will create the method missing bodies and move the cursor to the first created method body, so you can just start writing the class code:

{ TExample }

constructor TExample.Create;
begin
  |
end;

destructor TExample.Destroy;
begin
  inherited Destroy;
end;

Note: The '|' is the cursor and is not added.

Hint: You can jump between a method and its body with Ctrl+Shift+Up.

You can see, that the IDE added the 'inherited Destroy' call too. This is done, if there is an 'override' keyword in the class definition.

Now add a method DoSomething:

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

Then press Ctrl+Shift+C and the IDE will add

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

You can see, that the new method body is inserted between Create and Destroy, exactly as in the class definition. This way the bodies keep the same logical ordering as you define. You can define the insertion policy in Environment > Codetools Options -> Code Creation.

Complete Properties
Add a property AnInteger:

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

Press Ctrl+Shift+C and you will get:

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

The code completion has added a Write access modifier and added some common code. Jump to the class with Ctrl+Shift+Up to see the new class:

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;

The property was extended by a Read and Write access modifier. The class got the new section 'private' with a Variable 'FAnInteger' and the method 'SetAnInteger'. It is a common Delphi style rule to prepend private variables with an 'F' and the write method with a 'Set'. If you don't like that, you can change this in Environment > Codetools Options -> Code Creation.

Creating a read only property:

property PropName: PropType read;

Will be expanded to

property PropName: PropType read FPropName;

Creating a write only property:

 property PropName: PropType write;

Will be expanded to

property PropName: PropType write SetPropName;

Creating a read only property with a Read method:

property PropName: PropType read GetPropName;

Will be kept and a GetPropName function will be added:

function GetpropName: PropType;

Creating a property with a stored modifier:

property PropName: PropType stored;

Will be expanded to

property PropName: PropType read FPropName write SetPropName stored PropNameIsStored;

Because stored is used for streaming read and write modifiers are automatically added as well.

Hint: Identifier completion also recognizes incomplete properties and will suggest the default names. For example:

property PropName: PropType read |;

Place the cursor one space behind the 'read' keyword and press Ctrl+Space for the identifier completion. It will present you the variable 'FPropName' and the procedure 'SetPropName'.

Forward Procedure Completion

"Forward Procedure Completion" is part of the Code Completion and adds missing procedure bodies. It is invoked, when the cursor is on a forward defined procedure.

For example: Add a new procedure to the interface section:

procedure DoSomething;

Place the cursor on it and press Ctrl+Shift+C for code completion. It will create in the implementation section:

procedure DoSomething;
begin
  |
end;

Hint: You can jump between a procedure definition and its body with Ctrl+Shift+Up.

The new procedure body will be added in front of the class methods. If there are already some procedures in the interface the IDE tries to keep the ordering. For example:

 procedure Proc1;
 procedure Proc2; // new proc
 procedure Proc3;

If the bodies of Proc1 and Proc3 already exists, then the Proc2 body will be inserted between the bodies of Proc1 and Proc3. This behaviour can be setup in Environment > Codetools Options -> Code Creation.

Multiple procedures:

procedure Proc1_Old; // body exists
procedure Proc2_New; // body does not exists
procedure Proc3_New; //  "
procedure Proc4_New; //  "
procedure Proc5_Old; // body exists

Code Completion will add all 3 procedure bodies (Proc2_New, Proc3_New, Proc4_New).

Why calling it "Forward Procedure Completion"?

Because it does not only work for procedures defined in the interface, but for procedures with the "forward" modifier as well. And because the codetools treats procedures in the interface as having an implicit 'forward' modifier.

Event Assignment Completion

"Event Assignment Completion" is part of the Code Completion and completes a single Event:=| statement. It is invoked, when the cursor is behind an assignment to an event.

For example: In a method, say the FormCreate event, add a line 'OnPaint:=':

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

The '|' is the cursor and should not be typed. Then press Ctrl+Shift+C for code completion. The statement will be completed to

OnPaint:=@Form1Paint;

A new method Form1Paint will be added to the TForm1 class. Then class completion is started and you get:

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

This works just like adding methods in the object inspector.

Note:
You must place the cursor behind the ':=' assignment operator. If you place the cursor on the identifier (e.g. OnPaint) code completion will invoke "Local Variable Completion", which fails, because OnPaint is already defined.

Hint:
You can define the new method name by yourself. For example:

 OnPaint:=@ThePaintMethod;

Variable Declaration Completion

"Variable Declaration Completion" is part of the Code Completion and adds a local variable definition for a Identifier:=Term; statement. It is invoked, when the cursor is on the identifier of an assignment or a parameter.

For example:

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

Place the cursor on the 'i' or just behind it. Then press Ctrl+Shift+C for code completion and you will get:

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

The codetools first checks, if the identifier 'i' is already defined and if not it will add the declaration 'var i: integer;'. The type of the identifier is guessed from the term right to the assignment ':=' operator. Numbers like the 3 defaults to Integer.

Another example: 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;

Place the cursor on 'Where' and press Ctrl+Shift+C for code completion. You get:

 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;

Since 0.9.11 Lazarus also completes parameters. For example

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

Place the cursor on 'x1' and press Ctrl+Shift+C for code completion. You get:

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

Comments and Code Completion

Code completion tries to keep comments where they belong. For example:

 FList: TList; // list of TComponent
 FInt: integer;

When inserting a new variable between FList and FInt, the comment is kept in the FList line. Same is true for

 FList: TList; { list of TComponent
   This is a comment over several lines, starting
   in the FList line, so codetools assumes it belongs 
   to the FLIst line and will not break this 
   relationship. Code is inserted behind the comment. }
 FInt: integer;

If the comment starts in the next line, then it will be treated as if it belongs to the code below. For example:

 FList: TList; // list of TComponent
   { This comment belongs to the statement below. 
     New code is inserted above this comment and 
     behind the comment of the FList line. }
 FInt: integer;

Refactoring

Invert Assignments

Abstract
: "Invert Assignments" takes some selected pascal statements and inverts all assignments from this code. This tool is usefull for transforming a "save" code to a "load" one and inverse operation.

Example:

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

Select the lines with assignments (between begin and end) and do Invert Assignments. All assignments will be inverted and identation will be add automatically. For example:

Result:

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

Extract Procedure

See 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.

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.

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:

The Visible property is first defined in TControl (controls.pp), then redefined in TCustomForm and finally redefined in 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.

Same is true for types like TColor. For the compiler it is simply a 'longint'. But in the sources it is defined as

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

And the same for forward defined classes: For instance in TControl, there is a private variable

FHostDockSite: TWinControl;

Find declaration on TWinControl jumps to the forward definition

TWinControl = class;

And invoking it again jumps to the real implementation

TWinControl = class(TControl)

This way you can track down every identifier and find every overload.

Hints: You can jump back with Ctrl+H.

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

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 contains session information (like caret position and bookmarks of closed units) and the project directory contains a lot of .ppu, .o files and the executable. To create a lpi file with only the base information and only the sources, along with all sub directories use "Publish Project".

Note: Since version 0.9.13 there is a new Project Option that allows you to store session information in a seperate file from the normal .lpi file. This new file ends with the .lps extension and only contains session information, which will leave you .lpi file much cleaner.

In the dialog you can setup the exclude and include filter, and with the command after you can compress the output into one archive.

Original contributors

This page has been converted from the epikwiki version.

  • Created page and initial template - 4/6/2004 VlxAdmin
  • Initial content posted - 4/10/2004 MattiasG
  • Small wiki and formatting fixes - 4/11/2004 VlxAdmin
  • Added a summary table for IdeTools shortcuts - 12 July 2004 User:Kirkpatc