Sign in Join
Wiki copytemporary

Code Conversion Guide/ja: what changed

Revision 1 to 2. 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
74-<div class="dir">
75-
7674{\$R *.res}
7775
78-</div>
79-
8076ディレクティブをコメントアウトするか、削除して、
8177
82-<div class="dir">
83-
8478{\$mode delphi}{\$H+}
8579
86-</div>
87-
8880か
8981
90-<div class="dir">
91-
9282{\$mode objfpc}{\$H+}
9383
94-</div>
95-
9684ディレクティブを.lprファイルへ加えます。
9785
9886Toolsメニューの中には、変換に便利な"Convert Delphi Project to Lazarus Project"という項目があり、lazarus IDEは変換を手助けします。 この項目を実行すると、.dprファイルを.lprに変換するかどうか聞きます。そして、.lpiファイルを作って、全てのユニットを変換します。多くのすでにあるDelphiフォームは、Lazarusが .dfmを.lfmフォームに変換します。これは、Toolsメニューの"Convert DFM file to LFM"という項目で出来ます。ファイルダイアログが立ち上がり、dfmファイルを選択すると、自動で変換をおこないます。
9987
10088もしフォームであろうがなかろうが、全ユニットを変換する場合、Lazarusの"Convert Delphi unit to Lazarus unit"では次のようにおこないます。
10189
102901. includeのファイル名とuses部分の大文字小文字を修正します。
10391
104922. .dfm ファイルを .lfm ファイルに変換します。(currently without content check, just format)
10593
106943. 空の.lrs ファイルを作成します。 (中身は後で生成されます。)
10795
108-4. <div class="dir">
109-
110- {\$mode delphi}
111-
112- </div>
96+4. {\$mode delphi}
11397
11498 ディレクティブを追加します。
11599
1161005. windowsユニットをLCLIntfに置き換えます。
117101
1181026. 必要であれば LResources ユニットを付け加えます。(もし unit.lrs が使われている場合
119- <div class="dir">
120-
121103 uses LResources
122104
123- </div>
124-
125105 をimplementation 部分に入れます)
126106
1271077. variants ユニットは削除します。
128108
129-8. <div class="dir">
130-
131- {\$R *.dfm}
132-
133- </div>
109+8. {\$R *.dfm}
134110
135111 ディレクティブは削除します。
136112
1371139. initialization 部分に
138- <div class="dir">
139-
140114 {\$i unit.lrs}
141115
142- </div>
143-
144116 ディレクティブを加えます。
145117
146118この方法でほとんどのユニットをDelphiフォーマットをLazarusフォーマットへ迅速に変換できます。この方法は、正当性のチェックや、自動的な文法の変換をするものではありませんが、いろいろなウイザードがそのようなことや変換などををするので、文法上の変換したり、他のユニット名を変換したり、コンポーネントやコントロールの違いで、dfm/pasファイルを手で変更する必要はありません。
147119
148120#### 正しいコンパイラモードを選択する
149121
150122[[Free Pascal|Free Pascalコンパイラには]]5つの異なったパスカルモードがあります。たとえば、TPはTurbo Pascal互換モードですが、これをつかってTurbo Pascalのユニットをコンパイルできます。また、DELPHI互換モードがあり、既存のDELPHIコードの変換を簡単にします。Lazarusにおいては、DELPHIモードよりもOBJFPCモードをお勧めします。このモードはほとんどDELPHIのモードと似ていますが、DELPHIの文法よりもあいまいさがすくなくなっています。 下記に重要な点を示します。
151123
152124モードはコマンドラインか、もしくは、ソースコードの最初に指定します。もしソースを変更する必要が無いなら、コマンドラインを使うほうが良いですが、他の諸々を指定しなくてはならない場合は、使わないほうが良いでしょう。
153125
154126ほとんどのDelphiのユニットは下記のようにすることで[[Free Pascal|Free Pascalでコンパイルできます]]。
155127
156128`{$IFDEF FPC}`\
157129`  {$MODE DELPHI}`\
158130`{$ENDIF}`
159131
160132ユニット名の直後におきます。
161133
162134[[Free Pascal|Free Pascalのモードについて]]、詳しくは、[Free Pascal Documentation](http://www.freepascal.org/docs-html/prog/progap4.html#progse62.html) をご覧下さい。
163135
164136#### クロスプラットホームで考慮すべきこと
165137
166138- インラインアセンブラは、大抵の場合インテルアーキテクチャに依存しているので問題を引き起こします。ある開発者たちは、Pascalでプロトタイプを書いて、IFDEFでアセンブラで最適化しています。幸いなことにTurboPower社では、そのように多くのコードを書いています。もしこういう場合を見つけたら、IFDEFでPascalに戻すようにしてください。
167139
168140- BIOSの特定のデータエリアを参照しないでください。コードが何をしようとしているのか見つけて、クロスプラットホーム環境ではどのように書いたらいいか、挑戦してみてください。
169141
170142(訳注:おもにシリアル通信やパラレルの制御などで、特定のIOポートやハードウエアを制御していることがあるが、APIやエスケープファンクションに置換することができるが、そのようなものまでクロスプラットホームにできるようにPascalの標準IFが準備されているわけもないので、ある程度OSには依存してしまうだろう。)
171143
172144- 固有のプラットホームのためのIFDEFで囲むことなく、プロセッサの特殊な機能(IntelのTSC命令のような)を使わないでください。そして、別のハードウエアの環境のために、代わりとなる方法を提供できるようにしてください。
173145
174146- OSに依存するコードが必要なばあい、IFDEFを使ってください。下記にそのマクロのリストを示します。
175147
176148#### 便利なコンパイラ変数
177149
178150異なったシステムで異なった動きをするコードを書くために、
179151
180-<div class="dir">
181-
182152{\$IFDEF Name}
183153
184-</div>
185-
186154指令を使うことができます。
187155
188-- <div class="dir">
189-
190- {\$IfDef LCL}
191-
192- </div>
156+- {\$IfDef LCL}
193157
194158この値はLCLパッケージを使っているときに定義されています。LCLとDelphiの両方で動くコードを書くときに便利です。
195159
196-- <div class="dir">
197-
198- {\$IfDef LCLGtk}
199-
200- </div>
160+- {\$IfDef LCLGtk}
201161
202162 ,
203163
204- <div class="dir">
205-
206164 {\$IfDef LCLWin32}
207165
208- </div>
209-
210166 ,
211167
212- <div class="dir">
213-
214168 {\$IfDef LCLQt}
215169
216- </div>
217-
218170 , ...
219171
220172これらの値は、LCLが特定のwidgetsetで使われているときに定義されています。 LCLが特定のプラットホームで動くときのコードを書くときに便利です。
221173
222-- <div class="dir">
223-
224- {\$IfDef FPC}
225-
226- </div>
174+- {\$IfDef FPC}
227175
228176この値はFPCコンパイラ定数を使っているときに定義されています。FPCとDelphiの両方で動くコードを書くときに便利です。
229177
230-- <div class="dir">
231-
232- {\$IfDef Unix}
233-
234- </div>
178+- {\$IfDef Unix}
235179
236180 ,
237181
238- <div class="dir">
239-
240182 {\$IfDef Win32}
241183
242- </div>
243-
244184 , ...
245185
246186FPCによって現在のターゲットOSのために定義されています。Delphi(やKylix)は"Linux", "Win32" and "MSWindows"を定義します。[[Free Pascal|Free Pascalはさらに]]多くのプラットホームで動作し、一般的に使われることが推奨されています。 たとえば、LazarusのプラットホームであるLinux、FreeBSD,NetBSD、OpenBSDでは"Unix"が定義されています。同じソースコードが、KylixでもLazarusでも動くようにするためには、
247187
248188`{$IfDef Linux}`\
249189`  {$Define Unix}`\
250190`{$EndIf}`
251191
252192などとしてください。
253193
254194もっと詳しいことは、こちらをみてください。[Free Pascal Documentation](http://www.freepascal.org/docs-html/prog/prog.html#QQ2-23-21).
255195
256196#### 失った識別子を見つける
257197
258198Delphi VCLと、LCLを比較すると構成の方法に違いがあります。 もし、"not found"というコンパイラエラーが、主要なクラスや識別子で出たときは、多くの場合異なったユニットにあります。
259199
260200完全なクロスリファレンスは、lazarus/docs/xml か LCLのサブディレクトリをgrepしてください。
261201
262202たとえば、一般的によく使われるTButtonのDelphiのコードは、Lazarusではbuttons.ppというユニットにあるので、コンパイル時にエラーになります。 次のコマンドは、正しいユニットをLazarusのソースディレクトリから高速に見つけ出します。
263203
264204` grep -in ' tbutton =' lcl/*`
265205
266206#### LazarusとDelphiの主要なユニットの違い
267207
268208**このトピックに書き加えてください。**
269209
270210- Windows-\>Interfaces, LCLIntf, LCLType, LCLProc, VCLGlobals, ...)に置き換えます。
271211
272212LCLはWindowsに限ったものではないので、DelphiのWin32APIに直接アクセスするためのWindowsユニットは、インターフェースに抽象化されてLCLIntfユニットからアクセスするようになります。 覚えておいて頂きたいことは、Lazarusはwin32をエミュレートするのではないので、多くの関数が欠落していたり、Win32と同等な働きをしない関数があります。これらの関数はDelphiとの互換性だけのためにあり、とにかく移植するだけのためにあります。LCLは多くの型を利用し、LCLTypeやVCLGlobalsを必要とします。LCLProcは、FreeThenNilのようなDelphi5以降で導入された便利ないくつかの関数や、コントロールのばめに余分なアンパーサンドを取り除くDeleteAmpersandsのようなものを含みます。 Interfacesユニットは、適切なwidgetsetを初期化するための.lprファイルをインクルードするために必要です。
273213
274214- Messages-\>LMessagesに置き換えます。
275215
276216Delphiでは、TControlメッセージ(Win32イベントコールバックでは、WM_CALLBACK形式になっています。)とそれらに関連するメッセージはMessageユニットにあります。 LCLでは、これらの型やメッセージ、構造体などの定義は、LMessagesユニットにあります。大抵の場合、WM_MOUSEENTER は LM_MOUSEENTER に、TWMMouse は TLMMouseに、といった具合に、WMをLMに変更されています。
277217
278218- Graphics, Controls-\>GraphTypes, GraphMath, Graphics, Controls に置き換えます。
279219
280220(グラフィックスのための)いくつかの事柄を簡素にしたり、ユニット間の複雑さの連鎖を断ち切るため、GraphTypeと呼ばれる共有ユニットで、いくつかの型が抽象化されました。それは、Delphiの中では、GraphicsやControlで定義されていたものを含んでいます。たとえば、PanelのbvNoneなどの定義などで、そのため、GraphTypeはインクルードしなくてはなりません。また、Delphiと互換性はありませんが、GraphMathという便利な機能をもつユニットがあります。それは、小数点の位置をもてるTFloatPointや、ベジェ曲線、直線、円弧などを扱えます。また、TPointやTRectの演算子オーバーロードをおこなっていますので、 点の位置を加算するのに  Point1 := Point2 + Point3 としたり、 2個の矩形を比較するのに、  if (rect1 = rect2) then ... と書くことができるようになります。
281221
282222- Mask-\>MaskEdit に置き換えます。
283223
284224TMaskEditのためのユニットは、多くのバージョンのDelphiのようにMaskという安直なものではなく、よりよい名前を考えると、\[MaskEdit\|\] と呼んだほうがよいでしょう。
285225
286226- StdCtrls-\>StdCtrls,Buttons に置き換えます。
287227
288228多くのバージョンのDelphiでは、TButtonはStdCtrlsにありますが、TSpeedButtonやTBitBtnはButtonsユニットにあります。LCLでは、一貫性と簡潔性から、全てのボタンの定義はButtonでおこなっています。これは、includeするのにいいアイディアだと思いますよ。
289229
290230#### Delphiのプロパティとメソッドの違い -\> FPC/LCL
291231
292232- LCLではTBitmapにCanvasがあります。
293233
294234#### 文法上の違い
295235
296236**このトピックに気づいたものを加えてください**
297237
298-<div class="dir">
299-
300238{\$Mode Delphi}
301239
302-</div>
303-
304240で、Delphiと互換性をもてるよう、いくつかの文法上の許容をしても、FPCの文法上の厳密さから、プログラムの構文の変更が必要になることがあります。その理由は、FPCでは、DelphiとLCLの両方で共有されるソースであっても、なるべくなら、
305241
306-<div class="dir">
307-
308242{\$Mode ObjFPC}
309243
310-</div>
311-
312244を用いるよう、高く推奨されているからです。
313245
314246これは、単により良いコーディングの習慣をつけるということと、Delphiモードは必ずしも(文法が)正確ではなく、または、いくつかの例では、Delphi互換コードはコンパイルされてもFPCほど機能的でないためです。このため、すべてを厳密に要求するわけではありませんが、次のことは考慮してください。
315247
316248イベントハンドラ関数を登録するときは、関数の前に"@"をつけてください。
317249
318250(訳注:@は、後に続く変数や関数のアドレスを明示的に示します。関数の前につけることで、関数のエントリアドレスを得ることができ、それをイベントハンドラを示す変数(=ポインタ)に代入するコードを書きます。関数の呼び出しと、参照を明確に区別することができます。)
319251
320252たとえば、ボタンのイベントを手動で登録するには、次のようにおこないます。
321253
322-<table>
323-<tbody>
324-<tr>
325-<td class="header"><p>Delphi</p></td>
326-<td class="header"><p>FPC</p></td>
327-</tr>
328-<tr>
329-<td class="code"><div class="key">
330-<p>begin</p>
331-</div>
332-<div class="key">
333-<p>if not</p>
334-</div>
335-<p>Assigned(MyButton.OnClick)</p>
336-<div class="key">
337-<p>then</p>
338-</div>
339-<p><code>    MyButton.OnClick:= SomeFunction; </code></p>
340-<div class="cmt">
341-<p>//@ not required</p>
342-</div>
343-<div class="cmt">
344-<p>//more code...</p>
345-</div>
346-<div class="key">
347-<p>end</p>
348-</div>
349-<p>;</p></td>
350-<td class="code"><div class="key">
351-<p>begin</p>
352-</div>
353-<div class="key">
354-<p>if not</p>
355-</div>
356-<p>Assigned(MyButton.OnClick)</p>
357-<div class="key">
358-<p>then</p>
359-</div>
360-<p><code>    MyButton.OnClick:= @SomeFunction; </code></p>
361-<div class="cmt">
362-<p>//@ IS required</p>
363-</div>
364-<div class="cmt">
365-<p>//more code...</p>
366-</div>
367-<div class="key">
368-<p>end</p>
369-</div>
370-<p>;</p></td>
371-</tr>
372-</tbody>
373-</table>
254+Delphi
374255
256+FPC
257+
258+begin
259+
260+if not
261+
262+Assigned(MyButton.OnClick)
263+
264+then
265+
266+`    MyButton.OnClick:= SomeFunction; `
267+
268+//@ not required
269+
270+//more code...
271+
272+end
273+
274+;
275+
276+begin
277+
278+if not
279+
280+Assigned(MyButton.OnClick)
281+
282+then
283+
284+`    MyButton.OnClick:= @SomeFunction; `
285+
286+//@ IS required
287+
288+//more code...
289+
290+end
291+
292+;
293+
375294イベント変数で、関数をコールするには、次のような文で書きます。: theprocname()
376295
377296Delphiの文法では、イベント変数に関して、関数の結果を得るのと、変数を区別する方法がありません。しかし、FPCではそれができます。そのために、関数として呼び出す場合は、パラメータが無くても、括弧をつけてください。 たとえば -
378297
379-<table>
380-<tbody>
381-<tr>
382-<td class="header"><p>Delphi</p></td>
383-<td class="header"><p>FPC</p></td>
384-</tr>
385-<tr>
386-<td class="code"><div class="key">
387-<p>With</p>
388-</div>
389-<p>(SomeObject)</p>
390-<div class="key">
391-<p>do begin</p>
392-</div>
393-<div class="key">
394-<p>If</p>
395-</div>
396-<p>Assigned(OnMyCallback)</p>
397-<div class="key">
398-<p>then</p>
399-</div>
400-<p><code>    OnMyCallback; </code></p>
401-<div class="cmt">
402-<p>//parenthesis not required</p>
403-</div>
404-<div class="key">
405-<p>end</p>
406-</div>
407-<p>;</p></td>
408-<td class="code"><div class="key">
409-<p>With</p>
410-</div>
411-<p>(SomeObject)</p>
412-<div class="key">
413-<p>do begin</p>
414-</div>
415-<div class="key">
416-<p>If</p>
417-</div>
418-<p>Assigned(OnMyCallback)</p>
419-<div class="key">
420-<p>then</p>
421-</div>
422-<p><code>    OnMyCallback(); </code></p>
423-<div class="cmt">
424-<p>//parenthesis required</p>
425-</div>
426-<div class="key">
427-<p>end</p>
428-</div>
429-<p>;</p></td>
430-</tr>
431-</tbody>
432-</table>
298+Delphi
433299
300+FPC
301+
302+With
303+
304+(SomeObject)
305+
306+do begin
307+
308+If
309+
310+Assigned(OnMyCallback)
311+
312+then
313+
314+`    OnMyCallback; `
315+
316+//parenthesis not required
317+
318+end
319+
320+;
321+
322+With
323+
324+(SomeObject)
325+
326+do begin
327+
328+If
329+
330+Assigned(OnMyCallback)
331+
332+then
333+
334+`    OnMyCallback(); `
335+
336+//parenthesis required
337+
338+end
339+
340+;
341+
434342When accessing values in a pointer to a record you must dereference first
435343
436344レコードポインタで、値をアクセスするときは、(^)をつけて逆参照しなくてはなりません。
437345
438346Delphiの文法では、ポインタの逆参照記号は必ずしも必要とされません。実際に、ポインタはレコードやオブジェクトそのものとして扱うことができます。FPCでは、逆参照記号を付ける必要があります。 たとえば、
439347
440-<table>
441-<tbody>
442-<tr>
443-<td class="header"><p>Delphi</p></td>
444-<td class="header"><p>FPC</p></td>
445-</tr>
446-<tr>
447-<td class="code"><div class="key">
448-<p>Function</p>
449-</div>
450-<p>GetSomeValue(ARecord: PMyRecord)</p>
451-<div class="symbol">
452-<dl>
453-<dt></dt>
454-<dd>
455-</div>
456-<p>Integer;</p>
457-</dd>
458-</dl>
459-<div class="key">
460-<p>begin</p>
461-</div>
462-<div class="key">
463-<p>If</p>
464-</div>
465-<p>Assigned(ARecord)</p>
466-<div class="key">
467-<p>then</p>
468-</div>
469-<p><code>    Result</code></p>
470-<div class="symbol">
471-<dl>
472-<dt></dt>
473-<dd>
348+Delphi
349+
350+FPC
351+
352+Function
353+
354+GetSomeValue(ARecord: PMyRecord)
355+
356+
357+Integer;
358+
359+begin
360+
361+If
362+
363+Assigned(ARecord)
364+
365+then
366+
367+`    Result`
368+
369+
474370=
475-</div>
476-<p>ARecord.SomeValue</p>
477-</dd>
478-</dl>
479-<div class="key">
480-<p>else</p>
481-</div>
482-<p><code>    Result:= </code></p>
483-<div class="int">
484-<p>0</p>
485-</div>
486-<p>;</p>
487-<div class="key">
488-<p>end</p>
489-</div>
490-<p>;</p></td>
491-<td class="code"><div class="key">
492-<p>Function</p>
493-</div>
494-<p>GetSomeValue(ARecord: PMyRecord)</p>
495-<div class="symbol">
496-<dl>
497-<dt></dt>
498-<dd>
499-</div>
500-<p>Integer;</p>
501-</dd>
502-</dl>
503-<div class="key">
504-<p>begin</p>
505-</div>
506-<div class="key">
507-<p>If</p>
508-</div>
509-<p>Assigned(ARecord)</p>
510-<div class="key">
511-<p>then</p>
512-</div>
513-<p><code>    Result</code></p>
514-<div class="symbol">
515-<dl>
516-<dt></dt>
517-<dd>
371+
372+ARecord.SomeValue
373+
374+else
375+
376+`    Result:= `
377+
378+0
379+
380+;
381+
382+end
383+
384+;
385+
386+Function
387+
388+GetSomeValue(ARecord: PMyRecord)
389+
390+
391+Integer;
392+
393+begin
394+
395+If
396+
397+Assigned(ARecord)
398+
399+then
400+
401+`    Result`
402+
403+
518404=
519-</div>
520-<p>ARecord^.SomeValue</p>
521-</dd>
522-</dl>
523-<div class="key">
524-<p>else</p>
525-</div>
526-<p><code>    Result:= </code></p>
527-<div class="int">
528-<p>0</p>
529-</div>
530-<p>;</p>
531-<div class="key">
532-<p>end</p>
533-</div>
534-<p>;</p></td>
535-</tr>
536-</tbody>
537-</table>
538405
406+ARecord^.SomeValue
407+
408+else
409+
410+`    Result:= `
411+
412+0
413+
414+;
415+
416+end
417+
418+;
419+
539420When accessing chars of an indexed string Property of an object, it must be enclosed in parentheses\
540421オブジェクトの配列化された文字列プロパティのキャラクタにアクセスするときは、括弧でくくります。
541422
542423Delphiでは、文字列のプロパティの個々のキャラクタにアクセスするときでも、constやvarのように直接扱うことができますが、FPCでは常時そのことが可能ではありません。特に、配列化されたプロパティでは不可能です。この場合、区別するために、括弧でくくることで可能です。 この方法はいつでも正しいとは限りませんが、とにかく、良い習慣だといえます。
543424
544425たとえば
545426
546-<table>
547-<tbody>
548-<tr>
549-<td class="header"><p>Delphi</p></td>
550-<td class="header"><p>FPC</p></td>
551-</tr>
552-<tr>
553-<td class="code"><div class="key">
554-<p>Type</p>
555-</div>
556-<p>TSomeComponent=</p>
557-<div class="key">
558-<p>class</p>
559-</div>
560-<p>(TComponent)</p>
561-<div class="cmt">
562-<p>//More code...</p>
563-</div>
564-<div class="key">
565-<p>Published</p>
566-</div>
567-<div class="key">
568-<p>Property</p>
569-</div>
570-<p>MyString:</p>
571-<div class="key">
572-<p>String</p>
573-</div>
574-<div class="key">
575-<p>index</p>
576-</div>
577-<div class="int">
578-<p>3</p>
579-</div>
580-<div class="key">
581-<p>read</p>
582-</div>
583-<p>GetMyString;</p>
584-<div class="cmt">
585-<p>//More code...</p>
586-</div>
587-<div class="key">
588-<p>End</p>
589-</div>
590-<p>;</p>
591-<div>
592-</div>
593-<div class="key">
594-<p>var</p>
595-</div>
596-<p><code>  MyChar</code></p>
597-<div class="symbol">
598-<dl>
599-<dt></dt>
600-<dd>
601-</div>
602-<p>char;</p>
603-</dd>
604-</dl>
605-<div class="key">
606-<p>begin</p>
607-</div>
608-<div class="key">
609-<p>If</p>
610-</div>
611-<p>Length(MyString)&gt;</p>
612-<div class="int">
613-<p>2</p>
614-</div>
615-<div class="key">
616-<p>then</p>
617-</div>
618-<div class="cmt">
619-<p>//no parenthesis needed</p>
620-</div>
621-<p><code>    MyChar:= MyString[</code></p>
622-<div class="int">
623-<p>3</p>
624-</div>
625-<p>];</p>
626-<div class="cmt">
627-<p>//More code...</p>
628-</div>
629-<div class="key">
630-<p>end</p>
631-</div>
632-<p>;</p></td>
633-<td class="code"><div class="key">
634-<p>Type</p>
635-</div>
636-<p>TSomeComponent=</p>
637-<div class="key">
638-<p>class</p>
639-</div>
640-<p>(TComponent)</p>
641-<div class="cmt">
642-<p>//More code...</p>
643-</div>
644-<div class="key">
645-<p>Published</p>
646-</div>
647-<div class="key">
648-<p>Property</p>
649-</div>
650-<p>MyString:</p>
651-<div class="key">
652-<p>String</p>
653-</div>
654-<div class="key">
655-<p>index</p>
656-</div>
657-<div class="int">
658-<p>3</p>
659-</div>
660-<div class="key">
661-<p>read</p>
662-</div>
663-<p>GetMyString;</p>
664-<div class="cmt">
665-<p>//More code...</p>
666-</div>
667-<div class="key">
668-<p>End</p>
669-</div>
670-<p>;</p>
671-<div>
672-</div>
673-<div class="key">
674-<p>var</p>
675-</div>
676-<p><code>  MyChar</code></p>
677-<div class="symbol">
678-<dl>
679-<dt></dt>
680-<dd>
681-</div>
682-<p>char;</p>
683-</dd>
684-</dl>
685-<div class="key">
686-<p>begin</p>
687-</div>
688-<div class="key">
689-<p>If</p>
690-</div>
691-<p>Length(MyString)&gt;</p>
692-<div class="int">
693-<p>2</p>
694-</div>
695-<div class="key">
696-<p>then</p>
697-</div>
698-<div class="cmt">
699-<p>//parenthesis sometimes needed</p>
700-</div>
701-<p><code>    MyChar:= (MyString)[</code></p>
702-<div class="int">
703-<p>3</p>
704-</div>
705-<p>];</p>
706-<div class="cmt">
707-<p>//More code...</p>
708-</div>
709-<div class="key">
710-<p>end</p>
711-</div>
712-<p>;</p></td>
713-</tr>
714-</tbody>
715-</table>
427+Delphi
716428
429+FPC
430+
431+Type
432+
433+TSomeComponent=
434+
435+class
436+
437+(TComponent)
438+
439+//More code...
440+
441+Published
442+
443+Property
444+
445+MyString:
446+
447+String
448+
449+index
450+
451+3
452+
453+read
454+
455+GetMyString;
456+
457+//More code...
458+
459+End
460+
461+;
462+
463+var
464+
465+`  MyChar`
466+
467+
468+char;
469+
470+begin
471+
472+If
473+
474+Length(MyString)\>
475+
476+2
477+
478+then
479+
480+//no parenthesis needed
481+
482+`    MyChar:= MyString[`
483+
484+3
485+
486+\];
487+
488+//More code...
489+
490+end
491+
492+;
493+
494+Type
495+
496+TSomeComponent=
497+
498+class
499+
500+(TComponent)
501+
502+//More code...
503+
504+Published
505+
506+Property
507+
508+MyString:
509+
510+String
511+
512+index
513+
514+3
515+
516+read
517+
518+GetMyString;
519+
520+//More code...
521+
522+End
523+
524+;
525+
526+var
527+
528+`  MyChar`
529+
530+
531+char;
532+
533+begin
534+
535+If
536+
537+Length(MyString)\>
538+
539+2
540+
541+then
542+
543+//parenthesis sometimes needed
544+
545+`    MyChar:= (MyString)[`
546+
547+3
548+
549+\];
550+
551+//More code...
552+
553+end
554+
555+;
556+
717557変数や関数のポインタは型キャストをおこなって、実際の型として扱う必要があります。
718558
719559時々Delphiでは、型なしポインタ変数としてオブジェクトを示すことがあります。 複雑な状況では、これは、特に大きなコンポーネントパックなどで、多くのユニット間の循環参照を解消するために、一般的な手法です。Delphiでは、オブジェクトを期待している関数にこの型なしポインタを型キャストなしに送ることができますが、FPCでは型キャストが必要です。
720560
721561たとえば、 -
722562
723-<table>
724-<tbody>
725-<tr>
726-<td class="header"><p>Delphi</p></td>
727-<td class="header"><p>FPC</p></td>
728-</tr>
729-<tr>
730-<td class="code"><p>Unit 1</p>
731-<div class="key">
732-<p>Type</p>
733-</div>
734-<p>TSomeObject=</p>
735-<div class="key">
736-<p>class</p>
737-</div>
738-<p>(TComponent)</p>
739-<div class="cmt">
740-<p>//More code...</p>
741-</div>
742-<div class="key">
743-<p>End</p>
744-</div>
745-<p>;</p>
746-<div>
747-</div>
748-<div class="key">
749-<p>Procedure</p>
750-</div>
751-<p>DoSomething(Value: TSomeObject);</p>
752-<div class="key">
753-<p>Function</p>
754-</div>
755-<p>GetSomeObject: TSomeObject;</p>
756-<div>
757-</div>
758-<div class="symbol">
759-<p>Unit 2</p>
760-</div>
761-<div class="key">
762-<p>Type</p>
763-</div>
764-<p>TSomeComponent=</p>
765-<div class="key">
766-<p>class</p>
767-</div>
768-<p>(TComponent)</p>
769-<div class="cmt">
770-<p>//More code...</p>
771-</div>
772-<div class="key">
773-<p>Published</p>
774-</div>
775-<p><code>  SomeObject: Pointer</code></p>
776-<div class="symbol">
777-<p>;</p>
778-</div>
779-<div class="cmt">
780-<p>//More code...</p>
781-</div>
782-<div class="key">
783-<p>End</p>
784-</div>
785-<p>;</p>
786-<div>
787-</div>
788-<div class="symbol">
789-<p>Application</p>
790-</div>
791-<div class="key">
792-<p>var</p>
793-</div>
794-<p><code>  MyComponent: TSomeComponent</code></p>
795-<div class="symbol">
796-<p>;</p>
797-</div>
798-<div class="key">
799-<p>begin</p>
800-</div>
801-<p><code>  MyComponent.SomeObject</code></p>
802-<div class="symbol">
803-<dl>
804-<dt></dt>
805-<dd>
563+Delphi
564+
565+FPC
566+
567+Unit 1
568+
569+Type
570+
571+TSomeObject=
572+
573+class
574+
575+(TComponent)
576+
577+//More code...
578+
579+End
580+
581+;
582+
583+Procedure
584+
585+DoSomething(Value: TSomeObject);
586+
587+Function
588+
589+GetSomeObject: TSomeObject;
590+
591+Unit 2
592+
593+Type
594+
595+TSomeComponent=
596+
597+class
598+
599+(TComponent)
600+
601+//More code...
602+
603+Published
604+
605+`  SomeObject: Pointer`
606+
607+;
608+
609+//More code...
610+
611+End
612+
613+;
614+
615+Application
616+
617+var
618+
619+`  MyComponent: TSomeComponent`
620+
621+;
622+
623+begin
624+
625+`  MyComponent.SomeObject`
626+
627+
806628=
807-</div>
808-<p>GetSomeObject;</p>
809-</dd>
810-</dl>
811-<div class="cmt">
812-<p>//More code...</p>
813-</div>
814-<p><code>  DoSomething(MyComponent.SomeObject)</code></p>
815-<div class="symbol">
816-<p>;</p>
817-</div>
818-<div class="key">
819-<p>end</p>
820-</div>
821-<p>;</p></td>
822-<td class="code"><p>Unit 1</p>
823-<div class="key">
824-<p>Type</p>
825-</div>
826-<p>TSomeObject=</p>
827-<div class="key">
828-<p>class</p>
829-</div>
830-<p>(TComponent)</p>
831-<div class="cmt">
832-<p>//More code...</p>
833-</div>
834-<div class="key">
835-<p>End</p>
836-</div>
837-<p>;</p>
838-<div>
839-</div>
840-<div class="key">
841-<p>Procedure</p>
842-</div>
843-<p>DoSomething(Value: TSomeObject);</p>
844-<div class="key">
845-<p>Function</p>
846-</div>
847-<p>GetSomeObject: TSomeObject;</p>
848-<div>
849-</div>
850-<div class="symbol">
851-<p>Unit 2</p>
852-</div>
853-<div class="key">
854-<p>Type</p>
855-</div>
856-<p>TSomeComponent=</p>
857-<div class="key">
858-<p>class</p>
859-</div>
860-<p>(TComponent)</p>
861-<div class="cmt">
862-<p>//More code...</p>
863-</div>
864-<div class="key">
865-<p>Published</p>
866-</div>
867-<p><code>  SomeObject: Pointer</code></p>
868-<div class="symbol">
869-<p>;</p>
870-</div>
871-<div class="cmt">
872-<p>//More code...</p>
873-</div>
874-<div class="key">
875-<p>End</p>
876-</div>
877-<p>;</p>
878-<div>
879-</div>
880-<div class="symbol">
881-<p>Application</p>
882-</div>
883-<div class="key">
884-<p>var</p>
885-</div>
886-<p><code> MyComponent: TSomeComponent</code></p>
887-<div class="symbol">
888-<p>;</p>
889-</div>
890-<div class="key">
891-<p>begin</p>
892-</div>
893-<p><code>  MyComponent.SomeObject</code></p>
894-<div class="symbol">
895-<dl>
896-<dt></dt>
897-<dd>
629+
630+GetSomeObject;
631+
632+//More code...
633+
634+`  DoSomething(MyComponent.SomeObject)`
635+
636+;
637+
638+end
639+
640+;
641+
642+Unit 1
643+
644+Type
645+
646+TSomeObject=
647+
648+class
649+
650+(TComponent)
651+
652+//More code...
653+
654+End
655+
656+;
657+
658+Procedure
659+
660+DoSomething(Value: TSomeObject);
661+
662+Function
663+
664+GetSomeObject: TSomeObject;
665+
666+Unit 2
667+
668+Type
669+
670+TSomeComponent=
671+
672+class
673+
674+(TComponent)
675+
676+//More code...
677+
678+Published
679+
680+`  SomeObject: Pointer`
681+
682+;
683+
684+//More code...
685+
686+End
687+
688+;
689+
690+Application
691+
692+var
693+
694+` MyComponent: TSomeComponent`
695+
696+;
697+
698+begin
699+
700+`  MyComponent.SomeObject`
701+
702+
898703=
899-</div>
900-<p>Pointer(GetSomeObject);</p>
901-</dd>
902-</dl>
903-<div class="cmt">
904-<p>//More code...</p>
905-</div>
906-<p><code>  DoSomething(TSomeObject(MyComponent.SomeObject))</code></p>
907-<div class="symbol">
908-<p>;</p>
909-</div>
910-<div class="key">
911-<p>end</p>
912-</div>
913-<p>;</p></td>
914-</tr>
915-</tbody>
916-</table>
917704
705+Pointer(GetSomeObject);
706+
707+//More code...
708+
709+`  DoSomething(TSomeObject(MyComponent.SomeObject))`
710+
711+;
712+
713+end
714+
715+;
716+
918717#### リソース
919718
920719Delphiのリソースファイルはwin32形式であり、Lazarusのものと互換性がありません。 ですから、Lazarusで使うためには、再生成してコンパイルします。Lazresというツールが、lazarus/toolsサブディレクトリにあります。もし、Lazarusのソースをダウンロードしているなら、まず、次のようにコンパイルします。
921720
922721- cd lazarus/tools
923722- make install
924723
925724リソースをアプリケーションに追加するために:
926725
927726- lazres myresource.lrs mypix.xpm anotherpix.xpm
928727- Uses節に LResources ユニットを追加してください。
929728- .lrs ファイルをinitializationブロックにインクルードするようにしてください。
930729
931730例:
932731
933-<table>
934-<tbody>
935-<tr>
936-<td class="code"><div class="key">
937-<p>function</p>
938-</div>
939-<p>TForm1.LoadGlyph(</p>
940-<div class="key">
941-<p>const</p>
942-</div>
943-<p>GlyphName:</p>
944-<div class="key">
945-<p>String</p>
946-</div>
947-<p>): TBitMap;</p>
948-<div class="key">
949-<p>begin</p>
950-</div>
951-<p><code>  Result:= TPixmap.Create</code></p>
952-<div class="symbol">
953-<p>;</p>
954-</div>
955-<p><code>  Result.LoadFromLazarusResource(GlyphName)</code></p>
956-<div class="symbol">
957-<p>;</p>
958-</div>
959-<div class="key">
960-<p>end</p>
961-</div>
962-<p>;</p>
963-<div class="cmt">
964-<p>//More code...</p>
965-</div>
966-<div class="key">
967-<p>begin</p>
968-</div>
969-<p><code>  Speedbutton1.glyph:= LoadGlyph('mypix')</code></p>
970-<div class="symbol">
971-<p>;</p>
972-</div>
973-<div class="cmt">
974-<p>//More code...</p>
975-</div>
976-<div class="key">
977-<p>end</p>
978-</div>
979-<p>;</p>
980-<div>
981-</div>
982-<div class="key">
983-<p>initialization</p>
984-</div>
985-<div class="dir">
986-<p>{$I unit1.lrs}</p>
987-</div>
988-<div class="dir">
989-<p>{$I myresource.lrs}</p>
990-</div>
991-<div class="key">
992-<p>end</p>
993-</div>
994-<p>.</p></td>
995-</tr>
996-</tbody>
997-</table>
732+function
733+
734+TForm1.LoadGlyph(
735+
736+const
737+
738+GlyphName:
739+
740+String
741+
742+): TBitMap;
743+
744+begin
745+
746+`  Result:= TPixmap.Create`
747+
748+;
749+
750+`  Result.LoadFromLazarusResource(GlyphName)`
751+
752+;
753+
754+end
755+
756+;
757+
758+//More code...
759+
760+begin
761+
762+`  Speedbutton1.glyph:= LoadGlyph('mypix')`
763+
764+;
765+
766+//More code...
767+
768+end
769+
770+;
771+
772+initialization
773+
774+{\$I unit1.lrs}
775+
776+{\$I myresource.lrs}
777+
778+end
779+
780+.
998781
999782### DelphiやKylixプロジェクトをLazarusに変換する他の方法
1000783
1001784- .dfmや.xfmファイルを.lfmファイルにリネームするかコピーします。(初期のバージョンのDelphiはテキストベースの.dfmファイルを生成しません。変換ユーティリティが \binフォルダにあれば、まず.dfmファイルを変換します。)
1002785- .dprファイルを .lprファイルにリネームするかコピーします。
1003786- .lprファイルに適切な変更をおこないます。
1004787
10057881. {\$mode delphi}{\$H+} か、 {\$mode objfpc}{H+} 指令を加えます。
10067892. 'Interfaces'をuses節に加えます。
10077903. {\$R *.res}や相当する指令をコメントアウトするか、削除します。
1008791
1009792- すべての.pasファイルに必要な変更をおこないます:
1010793
10117941. {\$mode delphi}{\$H+} か、 {\$mode objfpc}{H+} 指令を加えます。
10127952. uses節に'LResources'を加え、もしフォームにボタンがあれば、さらに'Buttons'も加えます。
10137963. {\$R *.dfm}や{\$R *.xfm}指令をコメントアウトするか、削除します。
10147974. 'Initialization'セクションをユニットの最後に加え、その中に{\$I unitname.lrs}指令を入れます。
1015798
1016799- \[プロジェクト\]-\>\[ファイルから新規プロジェクト\]を選択します。
1017800- .lpr ファイルを選択します。
1018801- "新規プロジェクトを作成"ウインドウで、'アプリケーション'を選択します。
1019802- \[プロジェクトの構築\]を実行して、更に、適切なコンパイルのために必要な訂正をおこないます。この時点で、.lpiファイルが自動的に生成されます。
1020803
1021804'Error reading Form'メッセージを受け取るかもしれませんが、続行する場合は'読み込みを続行'を押し続けてください。
1022805
1023806- 全て保存すると、Lazarusプロジェクトが完成します。:-)
1024807
1025808## ヘルプを見つける
1026809
1027810もし、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/)の検索を可能にしています。
1028811
1029812## コンポーネントをパッケージしてリリースする
1030813
1031814### コンポーネントのLazarusパッケージを作る
1032815
1033816あなたが変換したコードの中に特に一つ以上のコンポーネントがある場合、、パッケージを作って配布すると、他の人がインストールするのが簡単になります。 Mattias Gärtner が概要を [[Lazarus Packages|Lazarus Packagesで]]書いていますので、パッケージを作成する場合は、一度事前に読んで下さい。
1034817
1035818### 文書
1036819
1037820このサイトの目的と、Wiki形式で運用している理由は、より簡単に、速く、本格的なドキュメントを作成することです。Wikiは、あなたが投稿したり、修正した結果をすぐに反映します。
1038821
1039822Lazarus-CCRのwikiを使って、見栄えの良い文書を作ることは簡単です。wikiのマークアップを使ったことがなければ、[[Sand Box]] で試しに色々と使ってみて下さい。
1040823
1041824### コードリリースページを作る
1042825
1043826コードリリースページは、あなたの製作したコンポーネントのライセンス、想定している動作プラットホーム、状態(α版、β版、安定版)、どこでダウンロードできるか、著者、サポート情報....などの生きた情報を、ダウンロードしようとしている人たちに提供します。
1044827
1045828ブラウザであなたの作ったコンポーネントのコードリリースページを作る方法を紹介しましょう。
1046829
1047830- [[Release new component|Release new componentへ]]行きます。
1048831- あなたの生成したコンポーネント名を入力し、*Create Article*を押します。
1049832- テンプレートに入力し、保存してください。
1050833- [[Components and Code examples|Components and Code examplesを]]編集し、"Released Components"セクションに新しく作ったページのリンクを加えてください。そして保存します。
1051834
1052835### コンポーネントをサブミットする
1053836
1054837もし、プロジェクトのリリース技術者であれば、あなたのコンポーネントをSourceForgeファイルリリースシステムにアップロードして、リリースパッケージのリストに含めてください。そうでなければ、我々プロジェクト管理者(Tom Lisjac or Vincent Snijders)に送っていただければ、リポジトリに加えます。
1055838
1056839もし、コンポーネントの開発を続ける必要性があるなら、CVSにおきます。そうすれば、それにアクセスし続けることができます。(訳注:現在はCVSではなくsub versionで管理している)
1057840
1058841## Contributors and Changes
1059842
1060843This page has been converted from the epikwiki [version](http://lazarus-ccr.sourceforge.net/index.php?wiki=CodeConversionGuide).
1061844
1062845- Initial version by Tom Lisjac and Mattias Gärtner - 9/22/2003 VlxAdmin
1063846- Moved Getting help from the main page. T. Lisjac - 9/24/2003 VlxAdmin
1064847- Added documentation templates, procedure and links. 9/25/2003 VlxAdmin
1065848- LCLLinux was renamed to LCLIntf, Jesus Reyes, 9/27/2003
1066849- added more information on Unit changes, [AndrewJohnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 9/27/2003
1067850- Updated Syntax differences, including some examples, [AndrewJohnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 9/27/2003
1068851- FPC 1.0.x doesn't support interfaces, Vincent Snijders 9/28/2003
1069852- Fixed some of the examples per new WikiWord definition, 9/28/2003 VlxAdmin
1070853- Made code more consistant to remove last accidental Pascal WikiWord definitions, [AndrewJohnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 9/27/2003
1071854- 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
1072855- Use pascal stylesheet to make example code more readable, [AndrewJohnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 10/18/2003
1073856- Added 'Another method to convert a Delphi or Kylix project to Lazarus' section , George Lober, 2/17/2006
1074857
1075858---
1076859*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