Difference between revisions of "IDE tricks/ja"

From Lazarus wiki
(Customize new unit / form)
m (Fixed syntax highlighting)
 
(2 intermediate revisions by 2 users not shown)
Line 104: Line 104:
 
コンボボックス上で、Ctrlとマウスクリックをすると、新規のイベントを生成せずに、継承されたメソッド本体にジャンプします。
 
コンボボックス上で、Ctrlとマウスクリックをすると、新規のイベントを生成せずに、継承されたメソッド本体にジャンプします。
  
= Events (Method properties) in the Object Inspector =
+
= オブジェクトインスペクタ上のイベント(メソッドプロパティ) =
  
Events (Method properties) are special properties, because they need as value a code address pointer, which does not exist at design time. That's why Lazarus uses the same trick as the Delphi IDE: Every method value can be type casted to TMethod, which contains ''Data'' (the object or class pointer) and the ''Code'' (the address pointer). Normally both are not nil. The IDE sets Data to a special key value for its internal lookup table and sets Code to nil. This means:
+
イベント(メソッドプロパティ)は、特別なプロパティで、アドレスポインタを必要とします。
 +
これらは、設計時には存在しません。
 +
LazarusはDelphi IDEと同じ方法を使っています。
 +
すべてのメソッドの値は、TMethodでキャストできます。
 +
TMethodは、''Data''(オブジェクトかクラスポインタ)と、''Code''(アドレスポインタ)から成っています。
 +
通常、両方ともnilではありません。IDEは''Data''に特別なキー値を設定し、Codeにはnilをセットしています。
 +
これは、次のことを意味しています。
  
*At runtime when the program loads the .lfm file the real method (Data+Code) is used
+
* 実行時は、プログラムが.lfmファイルをロードして、本当のメソッド(Data+Code)が使われます。
*At designtime a method value can either be a real method (Data<>nil and Code<>nil) or a fake method (Data<>nil,Code=nil)
+
* 設計時は、本当のメソッドか、仮のメソッド(Data<>nilでCode=nil)のどちらかになっています。
*The compiler has for Delphi compatibility some specials about comparing method values.
+
* コンパイラはDelphiとの互換性を保つ形で、メソッド値を比較する機能をもっています。
  
Do not use:
+
次のようにしてはいけません:
<Delphi>
+
<syntaxhighlight lang=pascal>
 
if OnMyEvent<>nil then OnMyEvent(...); // wrong, because it checks Data too
 
if OnMyEvent<>nil then OnMyEvent(...); // wrong, because it checks Data too
</Delphi>
+
</syntaxhighlight>
  
Because this checks both Data and Code and will execute the fake method, resulting in a jump to nil. This will only raise an exception, so it does not do much harm, but the IDE will show the user an error dialog. Use instead the Assigned function:
+
これは、DataとCodeの両方をチェックして、仮のメソッドを実行するかもしれません。結果的にnilにジャンプすることがあります。この場合、例外を生成しますので、たいした害はないかもしれませんが、IDEはユーザーにエラーダイアログを表示します。
<Delphi>
 
if Assigned(OnMyEvent) then OnMyEvent(...); // correct, checking only Code
 
</Delphi>
 
  
Do not use:
+
次のように、Assigned関数を使ってください。
<Delphi>
+
<syntaxhighlight lang=pascal>
if OnMyEvent=NewValue then exit; // wrong, because it compares only Code
+
if Assigned(OnMyEvent) then OnMyEvent(...); // Codeだけを比較するので正しい
</Delphi>
+
</syntaxhighlight>
  
Because this only compares the Code. Use instead
+
また、次のようにしてもいけません。
<Delphi>
+
<syntaxhighlight lang=pascal>
if CompareMem(@FOnMyEvent,@NewValue,SizeOf(TMethod)) then exit; // correct, checking both Data and Code
+
if OnMyEvent=NewValue then exit; // Codeだけを比較するので正しくない
</Delphi>
+
</syntaxhighlight>
 +
 
 +
なぜなら、Codeだけを比較するからです。次のようにしてください。
 +
<syntaxhighlight lang=pascal>
 +
if CompareMem(@FOnMyEvent,@NewValue,SizeOf(TMethod)) then exit; // DataとCodeの両方をチェックするので正しい。
 +
</syntaxhighlight>

Latest revision as of 08:58, 17 February 2020

Deutsch (de) English (en) français (fr) magyar (hu) 日本語 (ja) 한국어 (ko) русский (ru) slovenčina (sk)

日本語版メニュー
メインページ - Lazarus Documentation日本語版 - 翻訳ノート - 日本語障害情報

Open file で新しいファイルを作る

新しいファイルをつくって、保存することができます。または、1回の操作で新しいファイルをファイル名とファイルタイプを指定して、作成することもできます。

ただ、open file (Ctrl+o)で、存在しないファイルを指定します。たとえば、unit1.pasを指定すると、IDEはそのファイルを作るかどうか、尋ねます。

新規のユニット、フォーム

0.9.27以降の場合、'New unit' (New form)のスピードボタンを右クリックし、生成するファイルタイプを指定することができます。 IDEIntfか、project templates パッケージで指定することで、別のファイルタイプを登録することもできます。

IDE マクロ

IDE Macros in paths and filenames/ja

IDEが作成したコマンドラインパラメータをコンパイラで取得する方法

Project -> Compiler Options -> Show Options でパラメータをコピーすることができます。ここに、プロジェクトディレクトリまでの相対パスがあります。多くの場合、調整することなく、これをコピーして使うことが出来ます。

これらのパラメータは *.compiled ファイルにも保存されます。たとえば、test1.lpiというプロジェクトに対しては、test1.compiledというファイルが生成されます。これは、単純なテキストのxmlファイルになっていて、オプションやパスを簡単に他のコンピュータにコピーすることができます。 このファイルは実行ファイルが作成されるのと同じディレクトリにおかれます。

パッケージも同じ仕組みになっています。

このように、lazarus IDEがなくても、(願わくばバグがなく、動く)コードをコンパイルすることができます。

1つを残して、他のエディタファイルをすべて閉じる方法

gtk環境においては、ソースエディタページは、ページ名の右側に閉じるボタンがあります。Ctrlキーを押しながら、そのボタンを押すと、クリックしたもの以外の全ファイルが閉じます。

コンポーネントパレット

パレットの中のコンポーネントを見つける

どのページになるかしならくても、コンポーネントの名前を一部でも知っていれば、コンポーネントを見つけることができます。 コンポーネントパレット上で右クリックをして、popupメニューを出します。'Find component'を選択します。 名前の一部をタイプすると、リストがフィルタされます。

パレットのコンポーネントのパッケージを開く

コンポーネントパレット上で右クリックをして、popupメニューを出します。'Open package'を選択します。

パレットのコンポーネントの宣言を見つける

コンポーネントパレット上で右クリックをして、popupメニューを出します。'Open unit'を選択します。

リナックスで、デバッグ中にアプリケーションがフリーズします。

マウスを捕捉しているアプリケーションがgdb(デバッガ)によって停止させられると、X (デスクトップ) がフリーズすることがあります。

2番目のXセッションを使う

2番目のXを次のように開始することができます。

  X :1 &

Ctrl-Alt-F7 で、:0 へ切り替えることができます。同様に、 Ctrl-Alt-F8 で :1 へ切り替えることができます。

この後で、2番目のgnomeセッションを次のように開始します。

  gnome-session --display=:1 &

VNCを使う

tightvncserver/realvncserverによる VNCサーバ/クライアントをインストールすることで使うことも出来ます。

サーバを開始するには、

  vncserver :1

セッションも同時に開始されます。vncviewerを通してvncserverに接続します。

アプリケーションをセカンドサーバでデバッグする

Lazarusではプロジェクトのrun parameterで、"use display"にチェックを入れて  :1を入力してください。

これでアプリケーションは2番目のXサーバで実行されます。アプリケーションがデバッグされて停止することがあっても、2番目のXサーバがフリーズするだけで、最初のXサーバーには影響することがないでしょう。

IDEのコンパイルを速くする

Lazarus自身を開発する作業をしていると、IDEを何度もリビルドすることがあります。 もし、次のような裏技をつかうと、沢山のメモリと最新のCPUがあれば、あっという間にIDEをコンパイルすることができます。

  • Lazarusのソースは高速なハードディスクにおいてください。ネットワーク上におくと遅くなります。
  • 必要なパッケージのみインストールしてください。
  • USESVN2REVISIONINC=0 にして、revision.incのアップデートをスキップしてください。
  • 部分だけをコンパイルしてください。パッケージ登録が再コンパイルされると、全てのインストールされているパッケージも再コンパイルされます。IDEIntfが再コンパイルされると、すべての設計時パッケージが再コンパイルされます。

IDEウインドウのソースファイルを探す

  • IDE ウインドウを開きます.
  • Ctrl+Shift+F1を押してヘルプエディタを開きます。
  • ウインドウのクラス名を覚えて、閉じます。
  • 'Find In Files'を使って、そのクラスのソースファイルを探します。

オブジェクトインスペクタ: Events: Frames: 継承されたイベントにジャンプする

オブジェクトインスペクタは、ClassName.MethodNameとして継承されたイベントを表示します。 ダブルクリックすることで、新規のイベントを生成します。 コンボボックス上で、Ctrlとマウスクリックをすると、新規のイベントを生成せずに、継承されたメソッド本体にジャンプします。

オブジェクトインスペクタ上のイベント(メソッドプロパティ)

イベント(メソッドプロパティ)は、特別なプロパティで、アドレスポインタを必要とします。 これらは、設計時には存在しません。 LazarusはDelphi IDEと同じ方法を使っています。 すべてのメソッドの値は、TMethodでキャストできます。 TMethodは、Data(オブジェクトかクラスポインタ)と、Code(アドレスポインタ)から成っています。 通常、両方ともnilではありません。IDEはDataに特別なキー値を設定し、Codeにはnilをセットしています。 これは、次のことを意味しています。

  • 実行時は、プログラムが.lfmファイルをロードして、本当のメソッド(Data+Code)が使われます。
  • 設計時は、本当のメソッドか、仮のメソッド(Data<>nilでCode=nil)のどちらかになっています。
  • コンパイラはDelphiとの互換性を保つ形で、メソッド値を比較する機能をもっています。

次のようにしてはいけません:

if OnMyEvent<>nil then OnMyEvent(...); // wrong, because it checks Data too

これは、DataとCodeの両方をチェックして、仮のメソッドを実行するかもしれません。結果的にnilにジャンプすることがあります。この場合、例外を生成しますので、たいした害はないかもしれませんが、IDEはユーザーにエラーダイアログを表示します。

次のように、Assigned関数を使ってください。

if Assigned(OnMyEvent) then OnMyEvent(...); // Codeだけを比較するので正しい

また、次のようにしてもいけません。

if OnMyEvent=NewValue then exit; // Codeだけを比較するので正しくない

なぜなら、Codeだけを比較するからです。次のようにしてください。

if CompareMem(@FOnMyEvent,@NewValue,SizeOf(TMethod)) then exit; // DataとCodeの両方をチェックするので正しい。