Sign in Join
Wiki copytemporary

Code Conversion Guide/ja: what changed

Revision 3 to 4. 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-```
128+```text
129129{$IFDEF FPC}
130130 {$MODE DELPHI}
131131{$ENDIF}
132132```
133133
134134ユニット名の直後におきます。
135135
136136[[Free Pascal|Free Pascalのモードについて]]、詳しくは、[Free Pascal Documentation](http://www.freepascal.org/docs-html/prog/progap4.html#progse62.html) をご覧下さい。
137137
138138#### クロスプラットホームで考慮すべきこと
139139
140140- インラインアセンブラは、大抵の場合インテルアーキテクチャに依存しているので問題を引き起こします。ある開発者たちは、Pascalでプロトタイプを書いて、IFDEFでアセンブラで最適化しています。幸いなことにTurboPower社では、そのように多くのコードを書いています。もしこういう場合を見つけたら、IFDEFでPascalに戻すようにしてください。
141141
142142- BIOSの特定のデータエリアを参照しないでください。コードが何をしようとしているのか見つけて、クロスプラットホーム環境ではどのように書いたらいいか、挑戦してみてください。
143143
144144(訳注:おもにシリアル通信やパラレルの制御などで、特定のIOポートやハードウエアを制御していることがあるが、APIやエスケープファンクションに置換することができるが、そのようなものまでクロスプラットホームにできるようにPascalの標準IFが準備されているわけもないので、ある程度OSには依存してしまうだろう。)
145145
146146- 固有のプラットホームのためのIFDEFで囲むことなく、プロセッサの特殊な機能(IntelのTSC命令のような)を使わないでください。そして、別のハードウエアの環境のために、代わりとなる方法を提供できるようにしてください。
147147
148148- OSに依存するコードが必要なばあい、IFDEFを使ってください。下記にそのマクロのリストを示します。
149149
150150#### 便利なコンパイラ変数
151151
152152異なったシステムで異なった動きをするコードを書くために、
153153
154154{\$IFDEF Name}
155155
156156指令を使うことができます。
157157
158158- {\$IfDef LCL}
159159
160160この値はLCLパッケージを使っているときに定義されています。LCLとDelphiの両方で動くコードを書くときに便利です。
161161
162162- {\$IfDef LCLGtk}
163163
164164 ,
165165
166166 {\$IfDef LCLWin32}
167167
168168 ,
169169
170170 {\$IfDef LCLQt}
171171
172172 , ...
173173
174174これらの値は、LCLが特定のwidgetsetで使われているときに定義されています。 LCLが特定のプラットホームで動くときのコードを書くときに便利です。
175175
176176- {\$IfDef FPC}
177177
178178この値はFPCコンパイラ定数を使っているときに定義されています。FPCとDelphiの両方で動くコードを書くときに便利です。
179179
180180- {\$IfDef Unix}
181181
182182 ,
183183
184184 {\$IfDef Win32}
185185
186186 , ...
187187
188188FPCによって現在のターゲットOSのために定義されています。Delphi(やKylix)は"Linux", "Win32" and "MSWindows"を定義します。[[Free Pascal|Free Pascalはさらに]]多くのプラットホームで動作し、一般的に使われることが推奨されています。 たとえば、LazarusのプラットホームであるLinux、FreeBSD,NetBSD、OpenBSDでは"Unix"が定義されています。同じソースコードが、KylixでもLazarusでも動くようにするためには、
189189
190-```
190+```text
191191{$IfDef Linux}
192192 {$Define Unix}
193193{$EndIf}
194194```
195195
196196などとしてください。
197197
198198もっと詳しいことは、こちらをみてください。[Free Pascal Documentation](http://www.freepascal.org/docs-html/prog/prog.html#QQ2-23-21).
199199
200200#### 失った識別子を見つける
201201
202202Delphi VCLと、LCLを比較すると構成の方法に違いがあります。 もし、"not found"というコンパイラエラーが、主要なクラスや識別子で出たときは、多くの場合異なったユニットにあります。
203203
204204完全なクロスリファレンスは、lazarus/docs/xml か LCLのサブディレクトリをgrepしてください。
205205
206206たとえば、一般的によく使われるTButtonのDelphiのコードは、Lazarusではbuttons.ppというユニットにあるので、コンパイル時にエラーになります。 次のコマンドは、正しいユニットをLazarusのソースディレクトリから高速に見つけ出します。
207207
208-```
208+```text
209209 grep -in ' tbutton =' lcl/*
210210```
211211
212212#### LazarusとDelphiの主要なユニットの違い
213213
214214**このトピックに書き加えてください。**
215215
216216- Windows-\>Interfaces, LCLIntf, LCLType, LCLProc, VCLGlobals, ...)に置き換えます。
217217
218218LCLはWindowsに限ったものではないので、DelphiのWin32APIに直接アクセスするためのWindowsユニットは、インターフェースに抽象化されてLCLIntfユニットからアクセスするようになります。 覚えておいて頂きたいことは、Lazarusはwin32をエミュレートするのではないので、多くの関数が欠落していたり、Win32と同等な働きをしない関数があります。これらの関数はDelphiとの互換性だけのためにあり、とにかく移植するだけのためにあります。LCLは多くの型を利用し、LCLTypeやVCLGlobalsを必要とします。LCLProcは、FreeThenNilのようなDelphi5以降で導入された便利ないくつかの関数や、コントロールのばめに余分なアンパーサンドを取り除くDeleteAmpersandsのようなものを含みます。 Interfacesユニットは、適切なwidgetsetを初期化するための.lprファイルをインクルードするために必要です。
219219
220220- Messages-\>LMessagesに置き換えます。
221221
222222Delphiでは、TControlメッセージ(Win32イベントコールバックでは、WM_CALLBACK形式になっています。)とそれらに関連するメッセージはMessageユニットにあります。 LCLでは、これらの型やメッセージ、構造体などの定義は、LMessagesユニットにあります。大抵の場合、WM_MOUSEENTER は LM_MOUSEENTER に、TWMMouse は TLMMouseに、といった具合に、WMをLMに変更されています。
223223
224224- Graphics, Controls-\>GraphTypes, GraphMath, Graphics, Controls に置き換えます。
225225
226226(グラフィックスのための)いくつかの事柄を簡素にしたり、ユニット間の複雑さの連鎖を断ち切るため、GraphTypeと呼ばれる共有ユニットで、いくつかの型が抽象化されました。それは、Delphiの中では、GraphicsやControlで定義されていたものを含んでいます。たとえば、PanelのbvNoneなどの定義などで、そのため、GraphTypeはインクルードしなくてはなりません。また、Delphiと互換性はありませんが、GraphMathという便利な機能をもつユニットがあります。それは、小数点の位置をもてるTFloatPointや、ベジェ曲線、直線、円弧などを扱えます。また、TPointやTRectの演算子オーバーロードをおこなっていますので、 点の位置を加算するのに  Point1 := Point2 + Point3 としたり、 2個の矩形を比較するのに、  if (rect1 = rect2) then ... と書くことができるようになります。
227227
228228- Mask-\>MaskEdit に置き換えます。
229229
230230TMaskEditのためのユニットは、多くのバージョンのDelphiのようにMaskという安直なものではなく、よりよい名前を考えると、\[MaskEdit\|\] と呼んだほうがよいでしょう。
231231
232232- StdCtrls-\>StdCtrls,Buttons に置き換えます。
233233
234234多くのバージョンのDelphiでは、TButtonはStdCtrlsにありますが、TSpeedButtonやTBitBtnはButtonsユニットにあります。LCLでは、一貫性と簡潔性から、全てのボタンの定義はButtonでおこなっています。これは、includeするのにいいアイディアだと思いますよ。
235235
236236#### Delphiのプロパティとメソッドの違い -\> FPC/LCL
237237
238238- LCLではTBitmapにCanvasがあります。
239239
240240#### 文法上の違い
241241
242242**このトピックに気づいたものを加えてください**
243243
244244{\$Mode Delphi}
245245
246246で、Delphiと互換性をもてるよう、いくつかの文法上の許容をしても、FPCの文法上の厳密さから、プログラムの構文の変更が必要になることがあります。その理由は、FPCでは、DelphiとLCLの両方で共有されるソースであっても、なるべくなら、
247247
248248{\$Mode ObjFPC}
249249
250250を用いるよう、高く推奨されているからです。
251251
252252これは、単により良いコーディングの習慣をつけるということと、Delphiモードは必ずしも(文法が)正確ではなく、または、いくつかの例では、Delphi互換コードはコンパイルされてもFPCほど機能的でないためです。このため、すべてを厳密に要求するわけではありませんが、次のことは考慮してください。
253253
254254イベントハンドラ関数を登録するときは、関数の前に"@"をつけてください。
255255
256256(訳注:@は、後に続く変数や関数のアドレスを明示的に示します。関数の前につけることで、関数のエントリアドレスを得ることができ、それをイベントハンドラを示す変数(=ポインタ)に代入するコードを書きます。関数の呼び出しと、参照を明確に区別することができます。)
257257
258258たとえば、ボタンのイベントを手動で登録するには、次のようにおこないます。
259259
260260Delphi
261261
262262FPC
263263
264264begin
265265
266266if not
267267
268268Assigned(MyButton.OnClick)
269269
270270then
271271
272272`    MyButton.OnClick:= SomeFunction; `
273273
274274//@ not required
275275
276276//more code...
277277
278278end
279279
280280;
281281
282282begin
283283
284284if not
285285
286286Assigned(MyButton.OnClick)
287287
288288then
289289
290290`    MyButton.OnClick:= @SomeFunction; `
291291
292292//@ IS required
293293
294294//more code...
295295
296296end
297297
298298;
299299
300300イベント変数で、関数をコールするには、次のような文で書きます。: theprocname()
301301
302302Delphiの文法では、イベント変数に関して、関数の結果を得るのと、変数を区別する方法がありません。しかし、FPCではそれができます。そのために、関数として呼び出す場合は、パラメータが無くても、括弧をつけてください。 たとえば -
303303
304304Delphi
305305
306306FPC
307307
308308With
309309
310310(SomeObject)
311311
312312do begin
313313
314314If
315315
316316Assigned(OnMyCallback)
317317
318318then
319319
320320`    OnMyCallback; `
321321
322322//parenthesis not required
323323
324324end
325325
326326;
327327
328328With
329329
330330(SomeObject)
331331
332332do begin
333333
334334If
335335
336336Assigned(OnMyCallback)
337337
338338then
339339
340340`    OnMyCallback(); `
341341
342342//parenthesis required
343343
344344end
345345
346346;
347347
348348When accessing values in a pointer to a record you must dereference first
349349
350350レコードポインタで、値をアクセスするときは、(^)をつけて逆参照しなくてはなりません。
351351
352352Delphiの文法では、ポインタの逆参照記号は必ずしも必要とされません。実際に、ポインタはレコードやオブジェクトそのものとして扱うことができます。FPCでは、逆参照記号を付ける必要があります。 たとえば、
353353
354354Delphi
355355
356356FPC
357357
358358Function
359359
360360GetSomeValue(ARecord: PMyRecord)
361361
362362
363363Integer;
364364
365365begin
366366
367367If
368368
369369Assigned(ARecord)
370370
371371then
372372
373373`    Result`
374374
375375
376376=
377377
378378ARecord.SomeValue
379379
380380else
381381
382382`    Result:= `
383383
3843840
385385
386386;
387387
388388end
389389
390390;
391391
392392Function
393393
394394GetSomeValue(ARecord: PMyRecord)
395395
396396
397397Integer;
398398
399399begin
400400
401401If
402402
403403Assigned(ARecord)
404404
405405then
406406
407407`    Result`
408408
409409
410410=
411411
412412ARecord^.SomeValue
413413
414414else
415415
416416`    Result:= `
417417
4184180
419419
420420;
421421
422422end
423423
424424;
425425
426426When accessing chars of an indexed string Property of an object, it must be enclosed in parentheses\
427427オブジェクトの配列化された文字列プロパティのキャラクタにアクセスするときは、括弧でくくります。
428428
429429Delphiでは、文字列のプロパティの個々のキャラクタにアクセスするときでも、constやvarのように直接扱うことができますが、FPCでは常時そのことが可能ではありません。特に、配列化されたプロパティでは不可能です。この場合、区別するために、括弧でくくることで可能です。 この方法はいつでも正しいとは限りませんが、とにかく、良い習慣だといえます。
430430
431431たとえば
432432
433433Delphi
434434
435435FPC
436436
437437Type
438438
439439TSomeComponent=
440440
441441class
442442
443443(TComponent)
444444
445445//More code...
446446
447447Published
448448
449449Property
450450
451451MyString:
452452
453453String
454454
455455index
456456
4574573
458458
459459read
460460
461461GetMyString;
462462
463463//More code...
464464
465465End
466466
467467;
468468
469469var
470470
471471`  MyChar`
472472
473473
474474char;
475475
476476begin
477477
478478If
479479
480480Length(MyString)\>
481481
4824822
483483
484484then
485485
486486//no parenthesis needed
487487
488488`    MyChar:= MyString[`
489489
4904903
491491
492492\];
493493
494494//More code...
495495
496496end
497497
498498;
499499
500500Type
501501
502502TSomeComponent=
503503
504504class
505505
506506(TComponent)
507507
508508//More code...
509509
510510Published
511511
512512Property
513513
514514MyString:
515515
516516String
517517
518518index
519519
5205203
521521
522522read
523523
524524GetMyString;
525525
526526//More code...
527527
528528End
529529
530530;
531531
532532var
533533
534534`  MyChar`
535535
536536
537537char;
538538
539539begin
540540
541541If
542542
543543Length(MyString)\>
544544
5455452
546546
547547then
548548
549549//parenthesis sometimes needed
550550
551551`    MyChar:= (MyString)[`
552552
5535533
554554
555555\];
556556
557557//More code...
558558
559559end
560560
561561;
562562
563563変数や関数のポインタは型キャストをおこなって、実際の型として扱う必要があります。
564564
565565時々Delphiでは、型なしポインタ変数としてオブジェクトを示すことがあります。 複雑な状況では、これは、特に大きなコンポーネントパックなどで、多くのユニット間の循環参照を解消するために、一般的な手法です。Delphiでは、オブジェクトを期待している関数にこの型なしポインタを型キャストなしに送ることができますが、FPCでは型キャストが必要です。
566566
567567たとえば、 -
568568
569569Delphi
570570
571571FPC
572572
573573Unit 1
574574
575575Type
576576
577577TSomeObject=
578578
579579class
580580
581581(TComponent)
582582
583583//More code...
584584
585585End
586586
587587;
588588
589589Procedure
590590
591591DoSomething(Value: TSomeObject);
592592
593593Function
594594
595595GetSomeObject: TSomeObject;
596596
597597Unit 2
598598
599599Type
600600
601601TSomeComponent=
602602
603603class
604604
605605(TComponent)
606606
607607//More code...
608608
609609Published
610610
611611`  SomeObject: Pointer`
612612
613613;
614614
615615//More code...
616616
617617End
618618
619619;
620620
621621Application
622622
623623var
624624
625625`  MyComponent: TSomeComponent`
626626
627627;
628628
629629begin
630630
631631`  MyComponent.SomeObject`
632632
633633
634634=
635635
636636GetSomeObject;
637637
638638//More code...
639639
640640`  DoSomething(MyComponent.SomeObject)`
641641
642642;
643643
644644end
645645
646646;
647647
648648Unit 1
649649
650650Type
651651
652652TSomeObject=
653653
654654class
655655
656656(TComponent)
657657
658658//More code...
659659
660660End
661661
662662;
663663
664664Procedure
665665
666666DoSomething(Value: TSomeObject);
667667
668668Function
669669
670670GetSomeObject: TSomeObject;
671671
672672Unit 2
673673
674674Type
675675
676676TSomeComponent=
677677
678678class
679679
680680(TComponent)
681681
682682//More code...
683683
684684Published
685685
686686`  SomeObject: Pointer`
687687
688688;
689689
690690//More code...
691691
692692End
693693
694694;
695695
696696Application
697697
698698var
699699
700700` MyComponent: TSomeComponent`
701701
702702;
703703
704704begin
705705
706706`  MyComponent.SomeObject`
707707
708708
709709=
710710
711711Pointer(GetSomeObject);
712712
713713//More code...
714714
715715`  DoSomething(TSomeObject(MyComponent.SomeObject))`
716716
717717;
718718
719719end
720720
721721;
722722
723723#### リソース
724724
725725Delphiのリソースファイルはwin32形式であり、Lazarusのものと互換性がありません。 ですから、Lazarusで使うためには、再生成してコンパイルします。Lazresというツールが、lazarus/toolsサブディレクトリにあります。もし、Lazarusのソースをダウンロードしているなら、まず、次のようにコンパイルします。
726726
727727- cd lazarus/tools
728728- make install
729729
730730リソースをアプリケーションに追加するために:
731731
732732- lazres myresource.lrs mypix.xpm anotherpix.xpm
733733- Uses節に LResources ユニットを追加してください。
734734- .lrs ファイルをinitializationブロックにインクルードするようにしてください。
735735
736736例:
737737
738738function
739739
740740TForm1.LoadGlyph(
741741
742742const
743743
744744GlyphName:
745745
746746String
747747
748748): TBitMap;
749749
750750begin
751751
752752`  Result:= TPixmap.Create`
753753
754754;
755755
756756`  Result.LoadFromLazarusResource(GlyphName)`
757757
758758;
759759
760760end
761761
762762;
763763
764764//More code...
765765
766766begin
767767
768768`  Speedbutton1.glyph:= LoadGlyph('mypix')`
769769
770770;
771771
772772//More code...
773773
774774end
775775
776776;
777777
778778initialization
779779
780780{\$I unit1.lrs}
781781
782782{\$I myresource.lrs}
783783
784784end
785785
786786.
787787
788788### DelphiやKylixプロジェクトをLazarusに変換する他の方法
789789
790790- .dfmや.xfmファイルを.lfmファイルにリネームするかコピーします。(初期のバージョンのDelphiはテキストベースの.dfmファイルを生成しません。変換ユーティリティが \binフォルダにあれば、まず.dfmファイルを変換します。)
791791- .dprファイルを .lprファイルにリネームするかコピーします。
792792- .lprファイルに適切な変更をおこないます。
793793
7947941. {\$mode delphi}{\$H+} か、 {\$mode objfpc}{H+} 指令を加えます。
7957952. 'Interfaces'をuses節に加えます。
7967963. {\$R *.res}や相当する指令をコメントアウトするか、削除します。
797797
798798- すべての.pasファイルに必要な変更をおこないます:
799799
8008001. {\$mode delphi}{\$H+} か、 {\$mode objfpc}{H+} 指令を加えます。
8018012. uses節に'LResources'を加え、もしフォームにボタンがあれば、さらに'Buttons'も加えます。
8028023. {\$R *.dfm}や{\$R *.xfm}指令をコメントアウトするか、削除します。
8038034. 'Initialization'セクションをユニットの最後に加え、その中に{\$I unitname.lrs}指令を入れます。
804804
805805- \[プロジェクト\]-\>\[ファイルから新規プロジェクト\]を選択します。
806806- .lpr ファイルを選択します。
807807- "新規プロジェクトを作成"ウインドウで、'アプリケーション'を選択します。
808808- \[プロジェクトの構築\]を実行して、更に、適切なコンパイルのために必要な訂正をおこないます。この時点で、.lpiファイルが自動的に生成されます。
809809
810810'Error reading Form'メッセージを受け取るかもしれませんが、続行する場合は'読み込みを続行'を押し続けてください。
811811
812812- 全て保存すると、Lazarusプロジェクトが完成します。:-)
813813
814814## ヘルプを見つける
815815
816816もし、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/)の検索を可能にしています。
817817
818818## コンポーネントをパッケージしてリリースする
819819
820820### コンポーネントのLazarusパッケージを作る
821821
822822あなたが変換したコードの中に特に一つ以上のコンポーネントがある場合、、パッケージを作って配布すると、他の人がインストールするのが簡単になります。 Mattias Gärtner が概要を [[Lazarus Packages|Lazarus Packagesで]]書いていますので、パッケージを作成する場合は、一度事前に読んで下さい。
823823
824824### 文書
825825
826826このサイトの目的と、Wiki形式で運用している理由は、より簡単に、速く、本格的なドキュメントを作成することです。Wikiは、あなたが投稿したり、修正した結果をすぐに反映します。
827827
828828Lazarus-CCRのwikiを使って、見栄えの良い文書を作ることは簡単です。wikiのマークアップを使ったことがなければ、[[Sand Box]] で試しに色々と使ってみて下さい。
829829
830830### コードリリースページを作る
831831
832832コードリリースページは、あなたの製作したコンポーネントのライセンス、想定している動作プラットホーム、状態(α版、β版、安定版)、どこでダウンロードできるか、著者、サポート情報....などの生きた情報を、ダウンロードしようとしている人たちに提供します。
833833
834834ブラウザであなたの作ったコンポーネントのコードリリースページを作る方法を紹介しましょう。
835835
836836- [[Release new component|Release new componentへ]]行きます。
837837- あなたの生成したコンポーネント名を入力し、*Create Article*を押します。
838838- テンプレートに入力し、保存してください。
839839- [[Components and Code examples|Components and Code examplesを]]編集し、"Released Components"セクションに新しく作ったページのリンクを加えてください。そして保存します。
840840
841841### コンポーネントをサブミットする
842842
843843もし、プロジェクトのリリース技術者であれば、あなたのコンポーネントをSourceForgeファイルリリースシステムにアップロードして、リリースパッケージのリストに含めてください。そうでなければ、我々プロジェクト管理者(Tom Lisjac or Vincent Snijders)に送っていただければ、リポジトリに加えます。
844844
845845もし、コンポーネントの開発を続ける必要性があるなら、CVSにおきます。そうすれば、それにアクセスし続けることができます。(訳注:現在はCVSではなくsub versionで管理している)
846846
847847## Contributors and Changes
848848
849849This page has been converted from the epikwiki [version](http://lazarus-ccr.sourceforge.net/index.php?wiki=CodeConversionGuide).
850850
851851- Initial version by Tom Lisjac and Mattias Gärtner - 9/22/2003 VlxAdmin
852852- Moved Getting help from the main page. T. Lisjac - 9/24/2003 VlxAdmin
853853- Added documentation templates, procedure and links. 9/25/2003 VlxAdmin
854854- LCLLinux was renamed to LCLIntf, Jesus Reyes, 9/27/2003
855855- added more information on Unit changes, [AndrewJohnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 9/27/2003
856856- Updated Syntax differences, including some examples, [AndrewJohnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 9/27/2003
857857- FPC 1.0.x doesn't support interfaces, Vincent Snijders 9/28/2003
858858- Fixed some of the examples per new WikiWord definition, 9/28/2003 VlxAdmin
859859- Made code more consistant to remove last accidental Pascal WikiWord definitions, [AndrewJohnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 9/27/2003
860860- 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
861861- Use pascal stylesheet to make example code more readable, [AndrewJohnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 10/18/2003
862862- Added 'Another method to convert a Delphi or Kylix project to Lazarus' section , George Lober, 2/17/2006
863863
864864---
865865*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