Sign in Join
Wiki copytemporary

Code Conversion Guide/ja: what changed

Revision 2 to 3. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11このページでは、すでにDelphiやKylixで書いたコードを [[Free Pascal|Free PascalコンパイラやLazarus]] IDEで動くようにするための方法を説明します。 LazarusとFree PascalコンパイラはDelphiやKylixと同じ方向性をもっていますが、**LazarusやFree Pascalは、それらのクローンではありません**。 沢山のライブラリコールや使い方に違いがあります。そして、いくつかの場面において、FPCは拡張されており、また、より正しい文法を要求することがあります。
22
33[[Lazarus For Delphi Users/ja]] を見て、機能的な違いを確認してください。
44
55このガイドの目的は、Delphiの既存のコードをLazarusに変換するときに、よく出会う特徴的な違いを、きちんと文書化することです。
66
77この文書はWikiの知識ベースに置かれていますので、だれでも問題に出会ったときに他の人にも知らせることができるよう、拡張できます。
88
99## 変換時のコンポーネントやライブラリの選択
1010
1111### 変換するコードの場所を見つける
1212
1313ネット上には、変換すればFPCやLazarusで使える、沢山の利用可能なコードがあります。たとえば、このページ[[Page Of Code Sites|Page Of Code Sitesがスタートとなるでしょう]]。他のもっといいコードサイトのURLなどを知っていれば書き加えてください。
1414
1515TurboPowerソフトウエア社は、最近彼らの商用製品をMPLのライセンスの元でリリースしました。使えるパッケージは、http://sourceforge.net/users/tpsfadmin/ ここ\]にあります。 作業が重複するのを避けるため、変換されたパッケージは[[Components and Code examples|Components and Code examplesページにあります]]。 もし、あなたが変換したパッケージや、変換中のものがあれば、[[Current conversion projects]] ページに書き加えてください。
1616
1717### ライセンス
1818
1919Licenses for existing code range from freeware/public domain to restrictive versions that prohibit modification, re-distribution and commercial use. Before converting any package, it's a good idea to examine its licensing and make sure it's going to be compatible with Lazarus and the Free Pascal Compiler. License selection is especially important with components since dropping one on a form can impose an unwanted or incompatible license on an entire application.
2020
2121When converting components, please respect the wishes of the original author and retain all copyright and licensing headers along with email addresses and url's. It's courteous and often useful to inform the author that their component is being converted... especially if the component is under a restrictive license. New interest in an old or forgotten component can sometimes inspire authors to revise their original and overly restrictive licensing.
2222
2323In general, Public Domain (freeware), and the LGPL/MPL are the the most flexible for distributing components. For more information, the [Open Source Definition](http://www.opensource.org/docs/definition.php) is a good place to start. There are also several comparisons available to help clarify how the various types of licenses work and what impact they'll have on code they're linked to. Search for "open source license comparison"
2424
2525### 依存関係
2626
2727変換をはじめる前のもう一つのステップは、それらのコードが、利用できないか、簡単には変換できそうもない他のパッケージと深い依存関係をもっていないことを確認することです。 いくつかのフリーウエアはいまや使われないような利用できないパッケージや、あるいは適切でないライセンスをもつパッケージと結合しているか、拡張されていることがあります。
2828
2929### コンパイラの問題
3030
3131下記を見てください:
3232
3333- [Known problems](http://www.freepascal.org/probs.html)
3434- [Unfixed bugs](http://www.freepascal.org/bugs/db.php3?statusfield=Unfixed)
3535
3636### プラットホームとOSの問題
3737
3838LazarusとFree Pascal Compilerはクロスプラットホームであり、クロスプラットホームアーキテクチャ開発ツールです。DelphiのほとんどのコードはWin32でのインテルCPUで実行されるように設計されていることと比較してみてください。 もし、あなたのコンポーネントが多くのWin32に特化したコードを使っていれば、すこしでもプラットホームに依存しないようにしてみることをお勧めします。 しかし、多くのWindowsに特化したコードをつかっているからといって、LCLへの挑戦をためらわないで下さい。本当にLCLはすばらしい機能を提供しています。
3939
4040## 変換をおこなう
4141
4242### 変換するプロジェクトのためのLazarusの環境を設定する
4343
4444#### テストプロジェクトを作成する
4545
4646- サブディレクトリ(例: convertdir)に、変換されるほうのコードを置く。
4747- Lazarusを起動する
4848- File-\>Save All でthe convertdirのサブディレクトリに保存する。 プロジェクト名に意味の名前を付ける。デフォルトユニットの名前をつけるのは好きにしてよい。
4949- converdirで、変換するメインとなるユニットを開く。
5050- それをプロジェクトに加える。: Project-\>Add Active Unit
5151- Run Tools-\>Quick Syntax Check をするか、 Run Build All で開始してみる。
5252
5353#### 最初に目を向ける事柄
5454
5555- 1.0.x系のコンパイラでは、ファイル名は大文字小文字を判別します。もし、このバージョンで作業していたら、全ファイル名を小文字にしてください。そうしなかったら、 "File not found" エラーになります。
5656
5757#### Lazarus上でのDelphi VCL, Kylix CLXのソース
5858
5959DelphiやKylixのソースを変換しているとき、特定の機能の関数がなにをやっているか、宣言を探すことは、よく役に立ちます。LazarusのIDEは、DelphiやKylixのソースコードを解析できます。これをするためには、検索パスとコンパイラ設定をきちんとおこなわなくてはなりません。これらは、Environment-\>CodeTools Defines Editor-\>Insert Templateで簡単におこなうことができます。
6060
6161### 変換に関する問題と解決方法
6262
6363#### LazarusでのDelphi / Kylix ファイルとの対応
6464
6565| | | |
6666|----|----|----|
6767| Delphi / Kylix | Lazarus | Description |
6868| .pas .dfm / .xfm .dcu / .dpu .dpr (main project file) .res .dof / .kof --- --- --- | .pas, .pp .lfm .o .lpr --- --- .lrs .lpi (main project file) .ppu | Pascal unit file Form data file Compiled unit file Project file Resource file Project options file Lazarus resource file Lazarus project information file FPC unit description file |
6969
7070#### Delphi プロジェクト/フォーム/ユニットを Lazarus に変換する
7171
7272.dprファイルを.lprへcopyするか、名前を変更します。
7373
7474{\$R *.res}
7575
7676ディレクティブをコメントアウトするか、削除して、
7777
7878{\$mode delphi}{\$H+}
7979
8080か
8181
8282{\$mode objfpc}{\$H+}
8383
8484ディレクティブを.lprファイルへ加えます。
8585
8686Toolsメニューの中には、変換に便利な"Convert Delphi Project to Lazarus Project"という項目があり、lazarus IDEは変換を手助けします。 この項目を実行すると、.dprファイルを.lprに変換するかどうか聞きます。そして、.lpiファイルを作って、全てのユニットを変換します。多くのすでにあるDelphiフォームは、Lazarusが .dfmを.lfmフォームに変換します。これは、Toolsメニューの"Convert DFM file to LFM"という項目で出来ます。ファイルダイアログが立ち上がり、dfmファイルを選択すると、自動で変換をおこないます。
8787
8888もしフォームであろうがなかろうが、全ユニットを変換する場合、Lazarusの"Convert Delphi unit to Lazarus unit"では次のようにおこないます。
8989
90901. includeのファイル名とuses部分の大文字小文字を修正します。
9191
92922. .dfm ファイルを .lfm ファイルに変換します。(currently without content check, just format)
9393
94943. 空の.lrs ファイルを作成します。 (中身は後で生成されます。)
9595
96964. {\$mode delphi}
9797
9898 ディレクティブを追加します。
9999
1001005. windowsユニットをLCLIntfに置き換えます。
101101
1021026. 必要であれば LResources ユニットを付け加えます。(もし unit.lrs が使われている場合
103103 uses LResources
104104
105105 をimplementation 部分に入れます)
106106
1071077. variants ユニットは削除します。
108108
1091098. {\$R *.dfm}
110110
111111 ディレクティブは削除します。
112112
1131139. initialization 部分に
114114 {\$i unit.lrs}
115115
116116 ディレクティブを加えます。
117117
118118この方法でほとんどのユニットをDelphiフォーマットをLazarusフォーマットへ迅速に変換できます。この方法は、正当性のチェックや、自動的な文法の変換をするものではありませんが、いろいろなウイザードがそのようなことや変換などををするので、文法上の変換したり、他のユニット名を変換したり、コンポーネントやコントロールの違いで、dfm/pasファイルを手で変更する必要はありません。
119119
120120#### 正しいコンパイラモードを選択する
121121
122122[[Free Pascal|Free Pascalコンパイラには]]5つの異なったパスカルモードがあります。たとえば、TPはTurbo Pascal互換モードですが、これをつかってTurbo Pascalのユニットをコンパイルできます。また、DELPHI互換モードがあり、既存のDELPHIコードの変換を簡単にします。Lazarusにおいては、DELPHIモードよりもOBJFPCモードをお勧めします。このモードはほとんどDELPHIのモードと似ていますが、DELPHIの文法よりもあいまいさがすくなくなっています。 下記に重要な点を示します。
123123
124124モードはコマンドラインか、もしくは、ソースコードの最初に指定します。もしソースを変更する必要が無いなら、コマンドラインを使うほうが良いですが、他の諸々を指定しなくてはならない場合は、使わないほうが良いでしょう。
125125
126126ほとんどのDelphiのユニットは下記のようにすることで[[Free Pascal|Free Pascalでコンパイルできます]]。
127127
128-`{$IFDEF FPC}`\
129-`  {$MODE DELPHI}`\
130-`{$ENDIF}`
128+```
129+{$IFDEF FPC}
130+ {$MODE DELPHI}
131+{$ENDIF}
132+```
131133
132134ユニット名の直後におきます。
133135
134136[[Free Pascal|Free Pascalのモードについて]]、詳しくは、[Free Pascal Documentation](http://www.freepascal.org/docs-html/prog/progap4.html#progse62.html) をご覧下さい。
135137
136138#### クロスプラットホームで考慮すべきこと
137139
138140- インラインアセンブラは、大抵の場合インテルアーキテクチャに依存しているので問題を引き起こします。ある開発者たちは、Pascalでプロトタイプを書いて、IFDEFでアセンブラで最適化しています。幸いなことにTurboPower社では、そのように多くのコードを書いています。もしこういう場合を見つけたら、IFDEFでPascalに戻すようにしてください。
139141
140142- BIOSの特定のデータエリアを参照しないでください。コードが何をしようとしているのか見つけて、クロスプラットホーム環境ではどのように書いたらいいか、挑戦してみてください。
141143
142144(訳注:おもにシリアル通信やパラレルの制御などで、特定のIOポートやハードウエアを制御していることがあるが、APIやエスケープファンクションに置換することができるが、そのようなものまでクロスプラットホームにできるようにPascalの標準IFが準備されているわけもないので、ある程度OSには依存してしまうだろう。)
143145
144146- 固有のプラットホームのためのIFDEFで囲むことなく、プロセッサの特殊な機能(IntelのTSC命令のような)を使わないでください。そして、別のハードウエアの環境のために、代わりとなる方法を提供できるようにしてください。
145147
146148- OSに依存するコードが必要なばあい、IFDEFを使ってください。下記にそのマクロのリストを示します。
147149
148150#### 便利なコンパイラ変数
149151
150152異なったシステムで異なった動きをするコードを書くために、
151153
152154{\$IFDEF Name}
153155
154156指令を使うことができます。
155157
156158- {\$IfDef LCL}
157159
158160この値はLCLパッケージを使っているときに定義されています。LCLとDelphiの両方で動くコードを書くときに便利です。
159161
160162- {\$IfDef LCLGtk}
161163
162164 ,
163165
164166 {\$IfDef LCLWin32}
165167
166168 ,
167169
168170 {\$IfDef LCLQt}
169171
170172 , ...
171173
172174これらの値は、LCLが特定のwidgetsetで使われているときに定義されています。 LCLが特定のプラットホームで動くときのコードを書くときに便利です。
173175
174176- {\$IfDef FPC}
175177
176178この値はFPCコンパイラ定数を使っているときに定義されています。FPCとDelphiの両方で動くコードを書くときに便利です。
177179
178180- {\$IfDef Unix}
179181
180182 ,
181183
182184 {\$IfDef Win32}
183185
184186 , ...
185187
186188FPCによって現在のターゲットOSのために定義されています。Delphi(やKylix)は"Linux", "Win32" and "MSWindows"を定義します。[[Free Pascal|Free Pascalはさらに]]多くのプラットホームで動作し、一般的に使われることが推奨されています。 たとえば、LazarusのプラットホームであるLinux、FreeBSD,NetBSD、OpenBSDでは"Unix"が定義されています。同じソースコードが、KylixでもLazarusでも動くようにするためには、
187189
188-`{$IfDef Linux}`\
189-`  {$Define Unix}`\
190-`{$EndIf}`
190+```
191+{$IfDef Linux}
192+ {$Define Unix}
193+{$EndIf}
194+```
191195
192196などとしてください。
193197
194198もっと詳しいことは、こちらをみてください。[Free Pascal Documentation](http://www.freepascal.org/docs-html/prog/prog.html#QQ2-23-21).
195199
196200#### 失った識別子を見つける
197201
198202Delphi VCLと、LCLを比較すると構成の方法に違いがあります。 もし、"not found"というコンパイラエラーが、主要なクラスや識別子で出たときは、多くの場合異なったユニットにあります。
199203
200204完全なクロスリファレンスは、lazarus/docs/xml か LCLのサブディレクトリをgrepしてください。
201205
202206たとえば、一般的によく使われるTButtonのDelphiのコードは、Lazarusではbuttons.ppというユニットにあるので、コンパイル時にエラーになります。 次のコマンドは、正しいユニットをLazarusのソースディレクトリから高速に見つけ出します。
203207
204-` grep -in ' tbutton =' lcl/*`
208+```
209+ grep -in ' tbutton =' lcl/*
210+```
205211
206212#### LazarusとDelphiの主要なユニットの違い
207213
208214**このトピックに書き加えてください。**
209215
210216- Windows-\>Interfaces, LCLIntf, LCLType, LCLProc, VCLGlobals, ...)に置き換えます。
211217
212218LCLはWindowsに限ったものではないので、DelphiのWin32APIに直接アクセスするためのWindowsユニットは、インターフェースに抽象化されてLCLIntfユニットからアクセスするようになります。 覚えておいて頂きたいことは、Lazarusはwin32をエミュレートするのではないので、多くの関数が欠落していたり、Win32と同等な働きをしない関数があります。これらの関数はDelphiとの互換性だけのためにあり、とにかく移植するだけのためにあります。LCLは多くの型を利用し、LCLTypeやVCLGlobalsを必要とします。LCLProcは、FreeThenNilのようなDelphi5以降で導入された便利ないくつかの関数や、コントロールのばめに余分なアンパーサンドを取り除くDeleteAmpersandsのようなものを含みます。 Interfacesユニットは、適切なwidgetsetを初期化するための.lprファイルをインクルードするために必要です。
213219
214220- Messages-\>LMessagesに置き換えます。
215221
216222Delphiでは、TControlメッセージ(Win32イベントコールバックでは、WM_CALLBACK形式になっています。)とそれらに関連するメッセージはMessageユニットにあります。 LCLでは、これらの型やメッセージ、構造体などの定義は、LMessagesユニットにあります。大抵の場合、WM_MOUSEENTER は LM_MOUSEENTER に、TWMMouse は TLMMouseに、といった具合に、WMをLMに変更されています。
217223
218224- Graphics, Controls-\>GraphTypes, GraphMath, Graphics, Controls に置き換えます。
219225
220226(グラフィックスのための)いくつかの事柄を簡素にしたり、ユニット間の複雑さの連鎖を断ち切るため、GraphTypeと呼ばれる共有ユニットで、いくつかの型が抽象化されました。それは、Delphiの中では、GraphicsやControlで定義されていたものを含んでいます。たとえば、PanelのbvNoneなどの定義などで、そのため、GraphTypeはインクルードしなくてはなりません。また、Delphiと互換性はありませんが、GraphMathという便利な機能をもつユニットがあります。それは、小数点の位置をもてるTFloatPointや、ベジェ曲線、直線、円弧などを扱えます。また、TPointやTRectの演算子オーバーロードをおこなっていますので、 点の位置を加算するのに  Point1 := Point2 + Point3 としたり、 2個の矩形を比較するのに、  if (rect1 = rect2) then ... と書くことができるようになります。
221227
222228- Mask-\>MaskEdit に置き換えます。
223229
224230TMaskEditのためのユニットは、多くのバージョンのDelphiのようにMaskという安直なものではなく、よりよい名前を考えると、\[MaskEdit\|\] と呼んだほうがよいでしょう。
225231
226232- StdCtrls-\>StdCtrls,Buttons に置き換えます。
227233
228234多くのバージョンのDelphiでは、TButtonはStdCtrlsにありますが、TSpeedButtonやTBitBtnはButtonsユニットにあります。LCLでは、一貫性と簡潔性から、全てのボタンの定義はButtonでおこなっています。これは、includeするのにいいアイディアだと思いますよ。
229235
230236#### Delphiのプロパティとメソッドの違い -\> FPC/LCL
231237
232238- LCLではTBitmapにCanvasがあります。
233239
234240#### 文法上の違い
235241
236242**このトピックに気づいたものを加えてください**
237243
238244{\$Mode Delphi}
239245
240246で、Delphiと互換性をもてるよう、いくつかの文法上の許容をしても、FPCの文法上の厳密さから、プログラムの構文の変更が必要になることがあります。その理由は、FPCでは、DelphiとLCLの両方で共有されるソースであっても、なるべくなら、
241247
242248{\$Mode ObjFPC}
243249
244250を用いるよう、高く推奨されているからです。
245251
246252これは、単により良いコーディングの習慣をつけるということと、Delphiモードは必ずしも(文法が)正確ではなく、または、いくつかの例では、Delphi互換コードはコンパイルされてもFPCほど機能的でないためです。このため、すべてを厳密に要求するわけではありませんが、次のことは考慮してください。
247253
248254イベントハンドラ関数を登録するときは、関数の前に"@"をつけてください。
249255
250256(訳注:@は、後に続く変数や関数のアドレスを明示的に示します。関数の前につけることで、関数のエントリアドレスを得ることができ、それをイベントハンドラを示す変数(=ポインタ)に代入するコードを書きます。関数の呼び出しと、参照を明確に区別することができます。)
251257
252258たとえば、ボタンのイベントを手動で登録するには、次のようにおこないます。
253259
254260Delphi
255261
256262FPC
257263
258264begin
259265
260266if not
261267
262268Assigned(MyButton.OnClick)
263269
264270then
265271
266272`    MyButton.OnClick:= SomeFunction; `
267273
268274//@ not required
269275
270276//more code...
271277
272278end
273279
274280;
275281
276282begin
277283
278284if not
279285
280286Assigned(MyButton.OnClick)
281287
282288then
283289
284290`    MyButton.OnClick:= @SomeFunction; `
285291
286292//@ IS required
287293
288294//more code...
289295
290296end
291297
292298;
293299
294300イベント変数で、関数をコールするには、次のような文で書きます。: theprocname()
295301
296302Delphiの文法では、イベント変数に関して、関数の結果を得るのと、変数を区別する方法がありません。しかし、FPCではそれができます。そのために、関数として呼び出す場合は、パラメータが無くても、括弧をつけてください。 たとえば -
297303
298304Delphi
299305
300306FPC
301307
302308With
303309
304310(SomeObject)
305311
306312do begin
307313
308314If
309315
310316Assigned(OnMyCallback)
311317
312318then
313319
314320`    OnMyCallback; `
315321
316322//parenthesis not required
317323
318324end
319325
320326;
321327
322328With
323329
324330(SomeObject)
325331
326332do begin
327333
328334If
329335
330336Assigned(OnMyCallback)
331337
332338then
333339
334340`    OnMyCallback(); `
335341
336342//parenthesis required
337343
338344end
339345
340346;
341347
342348When accessing values in a pointer to a record you must dereference first
343349
344350レコードポインタで、値をアクセスするときは、(^)をつけて逆参照しなくてはなりません。
345351
346352Delphiの文法では、ポインタの逆参照記号は必ずしも必要とされません。実際に、ポインタはレコードやオブジェクトそのものとして扱うことができます。FPCでは、逆参照記号を付ける必要があります。 たとえば、
347353
348354Delphi
349355
350356FPC
351357
352358Function
353359
354360GetSomeValue(ARecord: PMyRecord)
355361
356362
357363Integer;
358364
359365begin
360366
361367If
362368
363369Assigned(ARecord)
364370
365371then
366372
367373`    Result`
368374
369375
370376=
371377
372378ARecord.SomeValue
373379
374380else
375381
376382`    Result:= `
377383
3783840
379385
380386;
381387
382388end
383389
384390;
385391
386392Function
387393
388394GetSomeValue(ARecord: PMyRecord)
389395
390396
391397Integer;
392398
393399begin
394400
395401If
396402
397403Assigned(ARecord)
398404
399405then
400406
401407`    Result`
402408
403409
404410=
405411
406412ARecord^.SomeValue
407413
408414else
409415
410416`    Result:= `
411417
4124180
413419
414420;
415421
416422end
417423
418424;
419425
420426When accessing chars of an indexed string Property of an object, it must be enclosed in parentheses\
421427オブジェクトの配列化された文字列プロパティのキャラクタにアクセスするときは、括弧でくくります。
422428
423429Delphiでは、文字列のプロパティの個々のキャラクタにアクセスするときでも、constやvarのように直接扱うことができますが、FPCでは常時そのことが可能ではありません。特に、配列化されたプロパティでは不可能です。この場合、区別するために、括弧でくくることで可能です。 この方法はいつでも正しいとは限りませんが、とにかく、良い習慣だといえます。
424430
425431たとえば
426432
427433Delphi
428434
429435FPC
430436
431437Type
432438
433439TSomeComponent=
434440
435441class
436442
437443(TComponent)
438444
439445//More code...
440446
441447Published
442448
443449Property
444450
445451MyString:
446452
447453String
448454
449455index
450456
4514573
452458
453459read
454460
455461GetMyString;
456462
457463//More code...
458464
459465End
460466
461467;
462468
463469var
464470
465471`  MyChar`
466472
467473
468474char;
469475
470476begin
471477
472478If
473479
474480Length(MyString)\>
475481
4764822
477483
478484then
479485
480486//no parenthesis needed
481487
482488`    MyChar:= MyString[`
483489
4844903
485491
486492\];
487493
488494//More code...
489495
490496end
491497
492498;
493499
494500Type
495501
496502TSomeComponent=
497503
498504class
499505
500506(TComponent)
501507
502508//More code...
503509
504510Published
505511
506512Property
507513
508514MyString:
509515
510516String
511517
512518index
513519
5145203
515521
516522read
517523
518524GetMyString;
519525
520526//More code...
521527
522528End
523529
524530;
525531
526532var
527533
528534`  MyChar`
529535
530536
531537char;
532538
533539begin
534540
535541If
536542
537543Length(MyString)\>
538544
5395452
540546
541547then
542548
543549//parenthesis sometimes needed
544550
545551`    MyChar:= (MyString)[`
546552
5475533
548554
549555\];
550556
551557//More code...
552558
553559end
554560
555561;
556562
557563変数や関数のポインタは型キャストをおこなって、実際の型として扱う必要があります。
558564
559565時々Delphiでは、型なしポインタ変数としてオブジェクトを示すことがあります。 複雑な状況では、これは、特に大きなコンポーネントパックなどで、多くのユニット間の循環参照を解消するために、一般的な手法です。Delphiでは、オブジェクトを期待している関数にこの型なしポインタを型キャストなしに送ることができますが、FPCでは型キャストが必要です。
560566
561567たとえば、 -
562568
563569Delphi
564570
565571FPC
566572
567573Unit 1
568574
569575Type
570576
571577TSomeObject=
572578
573579class
574580
575581(TComponent)
576582
577583//More code...
578584
579585End
580586
581587;
582588
583589Procedure
584590
585591DoSomething(Value: TSomeObject);
586592
587593Function
588594
589595GetSomeObject: TSomeObject;
590596
591597Unit 2
592598
593599Type
594600
595601TSomeComponent=
596602
597603class
598604
599605(TComponent)
600606
601607//More code...
602608
603609Published
604610
605611`  SomeObject: Pointer`
606612
607613;
608614
609615//More code...
610616
611617End
612618
613619;
614620
615621Application
616622
617623var
618624
619625`  MyComponent: TSomeComponent`
620626
621627;
622628
623629begin
624630
625631`  MyComponent.SomeObject`
626632
627633
628634=
629635
630636GetSomeObject;
631637
632638//More code...
633639
634640`  DoSomething(MyComponent.SomeObject)`
635641
636642;
637643
638644end
639645
640646;
641647
642648Unit 1
643649
644650Type
645651
646652TSomeObject=
647653
648654class
649655
650656(TComponent)
651657
652658//More code...
653659
654660End
655661
656662;
657663
658664Procedure
659665
660666DoSomething(Value: TSomeObject);
661667
662668Function
663669
664670GetSomeObject: TSomeObject;
665671
666672Unit 2
667673
668674Type
669675
670676TSomeComponent=
671677
672678class
673679
674680(TComponent)
675681
676682//More code...
677683
678684Published
679685
680686`  SomeObject: Pointer`
681687
682688;
683689
684690//More code...
685691
686692End
687693
688694;
689695
690696Application
691697
692698var
693699
694700` MyComponent: TSomeComponent`
695701
696702;
697703
698704begin
699705
700706`  MyComponent.SomeObject`
701707
702708
703709=
704710
705711Pointer(GetSomeObject);
706712
707713//More code...
708714
709715`  DoSomething(TSomeObject(MyComponent.SomeObject))`
710716
711717;
712718
713719end
714720
715721;
716722
717723#### リソース
718724
719725Delphiのリソースファイルはwin32形式であり、Lazarusのものと互換性がありません。 ですから、Lazarusで使うためには、再生成してコンパイルします。Lazresというツールが、lazarus/toolsサブディレクトリにあります。もし、Lazarusのソースをダウンロードしているなら、まず、次のようにコンパイルします。
720726
721727- cd lazarus/tools
722728- make install
723729
724730リソースをアプリケーションに追加するために:
725731
726732- lazres myresource.lrs mypix.xpm anotherpix.xpm
727733- Uses節に LResources ユニットを追加してください。
728734- .lrs ファイルをinitializationブロックにインクルードするようにしてください。
729735
730736例:
731737
732738function
733739
734740TForm1.LoadGlyph(
735741
736742const
737743
738744GlyphName:
739745
740746String
741747
742748): TBitMap;
743749
744750begin
745751
746752`  Result:= TPixmap.Create`
747753
748754;
749755
750756`  Result.LoadFromLazarusResource(GlyphName)`
751757
752758;
753759
754760end
755761
756762;
757763
758764//More code...
759765
760766begin
761767
762768`  Speedbutton1.glyph:= LoadGlyph('mypix')`
763769
764770;
765771
766772//More code...
767773
768774end
769775
770776;
771777
772778initialization
773779
774780{\$I unit1.lrs}
775781
776782{\$I myresource.lrs}
777783
778784end
779785
780786.
781787
782788### DelphiやKylixプロジェクトをLazarusに変換する他の方法
783789
784790- .dfmや.xfmファイルを.lfmファイルにリネームするかコピーします。(初期のバージョンのDelphiはテキストベースの.dfmファイルを生成しません。変換ユーティリティが \binフォルダにあれば、まず.dfmファイルを変換します。)
785791- .dprファイルを .lprファイルにリネームするかコピーします。
786792- .lprファイルに適切な変更をおこないます。
787793
7887941. {\$mode delphi}{\$H+} か、 {\$mode objfpc}{H+} 指令を加えます。
7897952. 'Interfaces'をuses節に加えます。
7907963. {\$R *.res}や相当する指令をコメントアウトするか、削除します。
791797
792798- すべての.pasファイルに必要な変更をおこないます:
793799
7948001. {\$mode delphi}{\$H+} か、 {\$mode objfpc}{H+} 指令を加えます。
7958012. uses節に'LResources'を加え、もしフォームにボタンがあれば、さらに'Buttons'も加えます。
7968023. {\$R *.dfm}や{\$R *.xfm}指令をコメントアウトするか、削除します。
7978034. 'Initialization'セクションをユニットの最後に加え、その中に{\$I unitname.lrs}指令を入れます。
798804
799805- \[プロジェクト\]-\>\[ファイルから新規プロジェクト\]を選択します。
800806- .lpr ファイルを選択します。
801807- "新規プロジェクトを作成"ウインドウで、'アプリケーション'を選択します。
802808- \[プロジェクトの構築\]を実行して、更に、適切なコンパイルのために必要な訂正をおこないます。この時点で、.lpiファイルが自動的に生成されます。
803809
804810'Error reading Form'メッセージを受け取るかもしれませんが、続行する場合は'読み込みを続行'を押し続けてください。
805811
806812- 全て保存すると、Lazarusプロジェクトが完成します。:-)
807813
808814## ヘルプを見つける
809815
810816もし、Lazarusへの移植中に解決できない問題にぶつかったとき、助けとなるWEBが沢山あります。 純粋に、Object PascalとFPCの問題である場合、FreePascalの文書から調べてみるのが良いでしょう。[Documentation](http://www.freepascal.org/docs-html/) by Michaël Van Canneyt and Florian Klämpfl. さらに、Lazarusが中心の問題であれば、Lazarusに関する文書をLazarus-CCR 知識ベース[[Main Page|Main Pageで]]、 探すのがよいでしょう。 最後に、質問を [mailing lists for the Free Pascal Compiler](http://www.freepascal.org/maillist.html) や、[FPC forums](http://community.freepascal.org:10000/bboard/)へ投稿することができます。沢山のエキスパートがこれらのメーリングリストに登録しています。 他の検索やオンラインの知識データベースなども、問題解決やあたしい技術を学ぶ上で大変役に立ちます。 Tamarack Associates \[ <http://codenewsfast.com/> search\] では、Borland usenet archivesに特化した高速な検索エンジンを使うことができます。operates a Mer Systems Inc. [engine](http://www.mers.com/searchsite.html)では、同じような検索を提供しています。 もうひとつ、外部の情報源として、[search](http://www.efg2.com/Lab/search.htm) では、Earl F. Glynn's Computer Lab and Reference [Library](http://www.efg2.com/)の検索を可能にしています。
811817
812818## コンポーネントをパッケージしてリリースする
813819
814820### コンポーネントのLazarusパッケージを作る
815821
816822あなたが変換したコードの中に特に一つ以上のコンポーネントがある場合、、パッケージを作って配布すると、他の人がインストールするのが簡単になります。 Mattias Gärtner が概要を [[Lazarus Packages|Lazarus Packagesで]]書いていますので、パッケージを作成する場合は、一度事前に読んで下さい。
817823
818824### 文書
819825
820826このサイトの目的と、Wiki形式で運用している理由は、より簡単に、速く、本格的なドキュメントを作成することです。Wikiは、あなたが投稿したり、修正した結果をすぐに反映します。
821827
822828Lazarus-CCRのwikiを使って、見栄えの良い文書を作ることは簡単です。wikiのマークアップを使ったことがなければ、[[Sand Box]] で試しに色々と使ってみて下さい。
823829
824830### コードリリースページを作る
825831
826832コードリリースページは、あなたの製作したコンポーネントのライセンス、想定している動作プラットホーム、状態(α版、β版、安定版)、どこでダウンロードできるか、著者、サポート情報....などの生きた情報を、ダウンロードしようとしている人たちに提供します。
827833
828834ブラウザであなたの作ったコンポーネントのコードリリースページを作る方法を紹介しましょう。
829835
830836- [[Release new component|Release new componentへ]]行きます。
831837- あなたの生成したコンポーネント名を入力し、*Create Article*を押します。
832838- テンプレートに入力し、保存してください。
833839- [[Components and Code examples|Components and Code examplesを]]編集し、"Released Components"セクションに新しく作ったページのリンクを加えてください。そして保存します。
834840
835841### コンポーネントをサブミットする
836842
837843もし、プロジェクトのリリース技術者であれば、あなたのコンポーネントをSourceForgeファイルリリースシステムにアップロードして、リリースパッケージのリストに含めてください。そうでなければ、我々プロジェクト管理者(Tom Lisjac or Vincent Snijders)に送っていただければ、リポジトリに加えます。
838844
839845もし、コンポーネントの開発を続ける必要性があるなら、CVSにおきます。そうすれば、それにアクセスし続けることができます。(訳注:現在はCVSではなくsub versionで管理している)
840846
841847## Contributors and Changes
842848
843849This page has been converted from the epikwiki [version](http://lazarus-ccr.sourceforge.net/index.php?wiki=CodeConversionGuide).
844850
845851- Initial version by Tom Lisjac and Mattias Gärtner - 9/22/2003 VlxAdmin
846852- Moved Getting help from the main page. T. Lisjac - 9/24/2003 VlxAdmin
847853- Added documentation templates, procedure and links. 9/25/2003 VlxAdmin
848854- LCLLinux was renamed to LCLIntf, Jesus Reyes, 9/27/2003
849855- added more information on Unit changes, [AndrewJohnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 9/27/2003
850856- Updated Syntax differences, including some examples, [AndrewJohnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 9/27/2003
851857- FPC 1.0.x doesn't support interfaces, Vincent Snijders 9/28/2003
852858- Fixed some of the examples per new WikiWord definition, 9/28/2003 VlxAdmin
853859- Made code more consistant to remove last accidental Pascal WikiWord definitions, [AndrewJohnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 9/27/2003
854860- Use tables for code examples for nice blocks, and easy side by side view of Delphi-\>FPC differences, [AndrewJohnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 10/17/2003
855861- Use pascal stylesheet to make example code more readable, [AndrewJohnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 10/18/2003
856862- Added 'Another method to convert a Delphi or Kylix project to Lazarus' section , George Lober, 2/17/2006
857863
858864---
859865*From the Free Pascal wiki, page "Code Conversion Guide/ja", as it stood on 2016-12-22 after a change by E-ric, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history