Lazarus IDE Tools/ja

From Free Pascal wiki
Revision as of 00:08, 19 March 2024 by Ariben (talk | contribs) (→‎定義検索)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigationJump to search

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でそのポップアップが閉じます。

コード補完

コード補完はIDEメニューの編集 -> コード補完で呼び出すことができ、標準ショートカットはCtrl+Shift+Cです。

Delphiユーザーへ: Delphiでは"コード補完"と呼ばれている機能は、現在のソースの位置で(Ctrl+Space)すると識別子のリストが示されるもので、Lazarusでは"識別子補完"と呼ばれているものです。

コード補完はいくつかの強力な機能を組み合わせたものです。例:

  • クラス補完: プロパティを補完し、メソッド本体を加え、プライベートな変数とアクセスメソッドを加えるものです。
  • 前方手続き補完: 手続きの本体を加えます。
  • イベント代入補完: イベント代入を補完し、メソッド定義と本体を加えます。
  • 変数宣言補完: ローカル変数定義を加えます。

どの機能が作動するかはエディタ内のカーソルの位置によります。

クラス補完

最も強力なコード補完機能は「クラス補完」です。クラスとメソッドとプロパティを書くと、コード補完はメソッド本体とプロパティアクセスメソッド/変数とプライベートな変数を追加します。

例えば: クラスを作成し、(タイピングを少なくするにはコードテンプレートを参照):

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;

注意: '|'はカーソルを表し、文字は挿入されません。

ヒント: Ctrl+Shift+Upでメソッドとその本体とを移動移動できます。

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;

クラス定義と同じくCreateとDestroyの間に新しいメソッド本体が挿入されたのがわかりますね。このようにして本体はあなたが定義したのと同じ論理的順序で作成されます。挿入ポリシーは、環境 -> コードツールオプション -> コード作成で設定できます。

プロパティの補完 プロパティ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;

コード補完はWriteアクセス指定子と数行の共通コードを追加しました。 新しいクラスを見るにはCtrl+Shift+Upでそのクラスに移動します。

 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アクセス指定子が追加されています。そのクラスはFAnInteger変数と'SetAnInteger'メソッドを有する'private'という新しいセクションを得ました。 変数に接頭文字F、メソッドにSetを付けるのはDelphiの共通スタイル規則です。もしこれがお気に召さなければ、環境 > コードツールオプション -> コード補完でこれを変更できます。


読み込み専用プロパティを作成する場合:

property PropName: PropType read;

が以下のように拡張されます。

property PropName: PropType read FPropName;

書き込み専用プロパティを作成する場合:

property PropName: PropType write;

が以下のように拡張されます。

property PropName: PropType write SetPropName;

Read メソッドを持つ読み込み専用プロパティを作成する場合:

property PropName: PropType read GetPropName;

これはそのままで、GetPropName関数が追加されます:

function GetpropName: PropType;

stored指定子を持つプロパティを作成する場合:

property PropName: PropType stored;

が次のように拡張されます。

property PropName: PropType read FPropName write SetPropName stored PropNameIsStored;

storedはストリーミングに用いられるため、readとwrite指定子が同様に自動的に追加されます。

ヒント: 識別子補完は不完全なプロパティも認識し、デフォルトの名前を提案します。例:

property PropName: PropType read |;

カーソルを'read'キーワードより1スペース後ろに置き、Ctrl+Spaceを押すと識別子補完が作動します。識別子補完は変数'FPropName'と手続き'SetPropName'を提案します。

前方手続き補完

"前方手続き補完"はコード補完機能の一部で、不足している手続き本体を追加します。カーソルが前方に定義された手続き宣言の上にあるときに有効となります。

例: 宣言部に新しい手続き宣言を追加します: procedure DoSomething; カーソルをその上に置き、Ctrl+Shift+Cを押してコード補完を呼び出すと、実行部が作成されます:

procedure DoSomething; begin

  |

end; ヒント: Ctrl+Shift+Upでメソッドとその本体とを移動移動できます。

新しい手続き本体がクラスメソッドの前に追加されます。もし宣言部に既にいくつかの手続きがあれば、IDEはその順序を維持しようとします。 例:

procedure Proc1;
procedure Proc2; // 新しい proc
procedure Proc3;

もしProc1とProc3の本体が既に存在すれば、Proc2の本体はProc1とProc3の間に挿入されます。この動作は環境 -> コードツールオプション ->コード作成 で設定できます。

Multiple procedures:
 procedure Proc1_Old; // 本体が存在
 procedure Proc2_New; // 本体がまだない
 procedure Proc3_New; //  "
 procedure Proc4_New; //  "
 procedure Proc5_Old; // 本体が存在

コード補完は3つの手続き本体 (Proc2_New, Proc3_New, Proc4_New)を追加します。

なぜそれを前方手続き補完と呼ぶのでしょうか?

なぜならそれは宣言部に定義された手続きにのみ作用するのではなく、"forward" 指定子をもつ手続きにも同様に作用するからです。そしてそのコードツールが宣言部内の暗黙の'forward' 指定子をもつ手続きを扱うからです。


イベント 代入補完

"イベント代入補完"はコード補完機能の一部で、単一のイベント:=| 文を補います。これはカーソルがイベントへの代入のすぐ後ろにあるときに呼び出されます。

例: あるメソッド, 例えばFormCreateイベントで、'OnPaint:='という行を追加してみます:

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

'|'はカーソルを表しており、タイプすべきものではありません。 ここでCtrl+Shift+Cと押してコード補完を呼び出します。その文は次のように補完されます。

OnPaint:=@Form1Paint;

新しいメソッドForm1PaintがTForm1クラスに追加されます。それからクラス補完が作動し、次のようになります:

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

これはちょうどオブジェクトインスペクタでメソッドを追加するような動作です。

注意: カーソルは':='代入の後ろに置いてください。カーソルをその識別子 (e.g. OnPaint)の上に置いた場合、 コード補完は"ローカル変数補完"を呼び出してしまいます(そしてそれは失敗します。なぜならOnPaintは既に宣言されているから)。

ヒント: 新しいメソッド名をあなた自身で定義することもできます。例えば:

 OnPaint:=@ThePaintMethod;

変数宣言補完

"変数宣言補完"もコード補完の一部で、ローカル変数定義を識別子:=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;

コメントとコード補完

コード補完はコメントをそれが属する場所に留めようとします。 例:

  FList: TList; //TComponentのリスト
  FInt: integer;

新しい変数をFListとFIntの間に挿入しようとすると、そのコメントはFListの行に保たれます。これは次のような場合にも同様です。

  FList: TList; {TComponentのリスト
    これはFListの行から始まる数行に渡るコメントで、
    コードツールはこれがFListの行に属するものとして 
    扱い、この関係を壊しません。コードはこのコメントの 
    後ろに挿入されます。}
  FInt: integer;

コメントが次の行から始まっている場合、それはそれがそれ以下のコードに属するものとして扱われます。 例:

  FList: TList; // list of TComponent
    {このコメントはこれ以下に属します。 
      新しいコードはこのコメントの上で、
      FListの行の後に挿入されます。}
  FInt: integer;

リファクタリング

逆代入

要約 : "逆代入"はいくつかの選択された文を取り上げ、すべての代入を逆にします。このツールは保存用コードから読み込み用コードに変換する際に演算を逆にしたいときに便利です。

例:

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

代入を行っている行(beginとendの間)を選択し、逆代入します。すべての代入は逆になりインデントが自動的に追加されます。 例の結果:

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

手続きの抽出

Extract Procedureを参照のこと

定義検索

カーソルをある識別子の上に置き、'定義検索'をすると、コードツールは識別子の宣言を検索し、そのファイルを開き、そこに移動します。

定義検索は毎回移動位置をセットします。このことは定義検索で宣言に移動した後、検索->後方へ飛ぶ で簡単に戻れることを意味しています。 Delphiといくつか異なる点があります: コードツールは、コンパイラ出力を用いる代わりに通常のpascal規則に従ってソースに作用します。コンパイラは最終の型を返します。コードツールはソースを読み、その間でステップします。 例: Visible プロパティは初めにTControl (controls.pp)で定義され、TCustomFormで再定義され、さらにTFormで最終的に再定義されます。定義検索をVisibleについて呼び出すとまずTFormのVisibleが表示されます。それから再び定義検索を呼び出すとTCustomFormのVisibleが表示されます。さらに呼び出すとTControlのVisibleに移動します。

TColorのような型についても同様です。 コンパイラにとってはそれは単なるlongintです。しかしソースには次のように定義されています。

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

そして前方定義クラスについても同様です。 例えばTControlにprivate 変数

 FHostDockSite: TWinControl;

があります。TWinControlに対する定義検索は前方定義

 TWinControl = class;

そしてそれを再び呼び出すと実装の

 TWinControl = class(TControl)

に移動します。このようにすべての識別子について追跡でき、すべてのオーバーロードを見つけることができます。

ヒント: Ctrl+Hで元の位置に戻れます。

インクルード指令に行く

IDEの検索メニューの"インクルード指令に行く"は現在のインクルードファイルが用いられている{$I filename}文に移動します。

プロジェクトの発行

プロジェクト全体のコピーを作成します。誰かにコードのソースとコンパイラ設定だけを送りたいときにはこの機能はとても便利です。

通常のプロジェクトディレクトリは多くの情報を含んでいます。そのほとんどは発行する際には不要です。 .lpiファイルは (キャレット位置や閉じられているユニットのブックマークのような)セッション情報を含んでおり、プロジェクトディレクトリは多くの.ppu、.oファイルと実行ファイルを含んでいます。 すべてのサブディレクトリとともに基本的な情報のみを含むlpiファイルとそのソースのみを作成するには、"プロジェクトを発行する(パブリッシュプロジェクト)"を使ってください。

注意: バージョン0.9.13以降、セッション情報を通常の.lpiファイルとは別個のファイルに記録できる新しいプロジェクトオプションができました。この新しいファイルは.lps拡張子で終わりセッション情報のみを含んでおり、.lpiファイルをより簡潔にすることができます。

そのダイアログで除外および包含フィルタを設定でき、そのコマンドにより出力を一つのアーカイブに圧縮することができます。

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