Sign in Join
Wiki copytemporary

Code Conversion Guide/de: what changed

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

OldNewLine
11Diese Seite handelt davon, wie man bestehenden Delphi oder Kylix Code konvertiert oder portiert, um ihn mit dem [[Free Pascal/de|Free Pascal]] Compiler und der Lazarus IDE zum Laufen zu bringen. Obwohl Lazarus und der Free Pascal Compiler gemeinsame Aspekte mit Delphi und Kylix haben, sind sie keine Klone. Es gibt eine Anzahl von Bibliotheksaufrufen und Konventionsunterschieden... und in einigen Bereichen ist FPC erweitert und kann im Hinblick auf korrekte Syntax anspruchsvoller sein. Bitte schauen Sie im [[Lazarus For Delphi Users/de|Lazarus für Delphi-Benutzer]] Handbuch für eine Beschreibung einiger funktioneller Unterschiede nach.
22
33Der Zweck dieses Handbuchs ist es, einige der spezifischen Unterschiede zu dokumentieren, die häufig während des Codekonvertierungsprozesses auftreten, wenn existierender Code von Delphi nach Lazarus übersetzt wird.
44
55Dieses Dokument wurde im Bereich Wissensbasis des Wikis platziert, so dass es einfach von jedem erweitert werden kann, der auf ein einzigartiges Problem gestoßen ist und andere darauf aufmerksam machen möchte.
66
77## Auswahl einer Komponente oder Bibliothek für die Konvertierung
88
99### Wo Code zum Konvertieren zu finden ist
1010
1111Im Internet ist eine MENGE Code verfügbar, der für die Verwendung mit FPC und Lazarus konvertiert werden kann. Hier ist eine [[Page Of Code Sites|Seite]], die einfach ein Anfang ist. Bitte erweitern Sie die Seite, wenn Sie weitere Stellen kennen. TurboPower Software hat vor kurzem ihr gesamtes kommerzielles Angebot unter der MPL heraus gegeben. Eine Liste der verfügbaren Packages ist [hier](http://sourceforge.net/users/tpsfadmin/) zu finden.
1212
1313Um doppelten Aufwand zu vermeiden, sind bereits konvertierte Packages auf der [[Components and Code examples]] Seite aufgeführt. Wenn Sie ein Package konvertiert haben oder daran arbeiten, dann fügen Sie bitte eine Notiz auf der [[Current conversion projects]] Seite hinzu.
1414
1515### Lizenzierung
1616
1717Lizenzen für existierenden Code reichen von Freeware/Public Domain bis zu eingeschränkten Versionen, welche Modifizierung, Weiterverteilung und kommerzielle Verwendung verbieten. Bevor Sie irgendein Package konvertieren, ist es eine gute Idee, seine Lizenz zu überprüfen und sicherzustellen, dass sie mit Lazarus und dem Free Pascal Compiler kompatibel ist. Lizenzauswahl ist bei Komponenten besonders wichtig, seit das Ablegen auf einem Formular eine nicht gewollte oder inkompatible Lizenz für die gesamte Anwendung aufbürden kann.
1818
1919Wenn Sie Komponenten konvertieren, respektieren Sie bitte die Wünsche des Originalautors und belassen alle Copyright- und Lizenz-Header mit Email-Adressen und URl's. Es gehört zum guten Ton und ist oft hilfreich, um den Autor zu informieren, dass seine Komponente konvertiert wurde... besonders wenn sich die Komponente unter einer restriktiven Lizenz befindet. Neues Interesse an einer alten oder vergessenen Komponente kann manchmal die Autoren inspirieren, ihr Original und die allzu restriktive Lizenzierung zu überarbeiten.
2020
2121Im Allgemeinen sind Public Domain (Freeware) und die LGPL/MPL Komponenten die flexibelsten zum Vertreiben. Für mehr Information ist die [Open Source Definition](http://www.opensource.org/docs/definition.php) ein guter Platz zum Starten. Dort gibt es auch verschiedene Vergleiche, die verdeutlichen, was die verschiedenen Lizenztypen bedeuten und welchen Einfluss sie auf den Code haben, auf den sie sich beziehen. Suchen Sie nach "open source license comparison"
2222
2323### Abhängigkeiten
2424
2525Ein anderer Schritt vor einer Konvertierung ist, dass Sie überprüfen, ob der Code verborgene Abhängigkeiten von anderen Packages enthält, die vielleicht nicht verfügbar sind oder einen beträchtlichen Konvertierungsaufwand darstellen. Einige Freeware-Angebote sind gebunden an oder erweitern proprietäre Packages, die häufig nicht mehr erhältlich sind oder mit ungeeigneten Lizenzen versehen sind.
2626
2727### Compiler Probleme
2828
2929Siehe:
3030
3131- [bekannte Probleme](http://www.freepascal.org/probs.html)
3232- [Nichtbereinigte Bugs](http://www.freepascal.org/bugs/db.php3?statusfield=Unfixed)
3333
3434### Plattformen und OS Probleme
3535
3636Lazarus und der Free Pascal Compiler sind [[Glossary|cross-platform]] und cross-architecture Entwicklungswerkzeuge. Im Gegensatz dazu wurde der existierende Delphi-Code meistens speziell für einen Intel Prozessor unter Win32 entwickelt. Wenn Ihr Kandidat sehr viel Win32 spezifischen Code enthält, ist es häufig günstiger, nach einer weniger plattformabhängigen Alternative zu suchen. Aber lassen Sie sich davon nicht entmutigen. Es ist erstaunlich, was die LCL unterstützt!
3737
3838## Durchführen der Konvertierung
3939
4040### Einrichten der Lazarus Umgebung für ein Konvertierungs-Projekt
4141
4242#### Erstellen eines Testprojekts
4343
4444- Kopieren Sie den zu konvertierenden Code in ein Unterverzeichnis (z.B.: convertdir)
4545- Starten Sie Lazarus
4646- Datei -\> Alles speichern in das convertdir Unterverzeichnis. Aussagekräftige Namen für Projekt und Units sind optional.
4747- Öffnen Sie die zu konvertierende "main" Unit in convertdir
4848- Fügen Sie zum Projekt hinzu: Projekt -\> Datei im Editor ins Projekt aufnehmen
4949- Starten Sie Werkzeuge -\> Schnelle Syntaxüberprüfung oder Start -\> Alles neu erstellen um loszulegen.
5050
5151#### Grundsätzlich beachten
5252
5353- Groß- und Kleinschreibung von Dateinamen werden unter der Version 1.0.x des Compilers unterschieden. Wenn Sie mit dieser Version arbeiten, schreiben Sie alle Dateinamen klein. Sie werden "File not found" Fehler bekommen, wenn Sie es nicht tun.
5454
5555#### Delphi VCL, Kylix CLX Quellen in Lazarus
5656
5757Während der Konvertierung von Delphi/Kylix Quellen ist es oft hilfreich, eine 'find declaration' zu machen, um zu sehen, was eine bestimmte Funktion macht. Die Lazarus IDE kann die Delphi/Kylix Quellen analysieren. Um dies zu tun, werden einige Suchpfade und Compilereinstellungen benötigt. Sie können dies einfach einrichten unter
5858
5959Einstellungen -\> CodeTools Defines Editor -\> Vorlage einfügen
6060
6161### Konvertierungsprobleme und Lösungen
6262
6363#### Delphi / Kylix Datei-Entsprechungen in Lazarus
6464
6565| | | |
6666|----|----|----|
6767| Delphi / Kylix | Lazarus | Beschreibung |
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 Datei Formulardaten Datei Compilierte Unit Datei Projektdatei Ressourcendatei Projektoptionen Datei Lazarus Ressourcen Datei Lazarus Projekt Informations Datei FPC Unit Beschreibungsdatei |
6969
7070#### Konvertierung von Delphi Projekten/Formularen/Units nach Lazarus
7171
7272Benennen Sie die .dpr Datei in eine .lpr Datei um. Kommentieren Sie die
7373
74-<div class="dir">
75-
7674{\$R *.res}
7775
78-</div>
79-
8076Direktive aus oder entfernen Sie und fügen eine
8177
82-<div class="dir">
83-
8478{\$mode delphi}{\$H+}
8579
86-</div>
87-
8880oder
8981
90-<div class="dir">
91-
9282{\$mode objfpc}{\$H+}
9383
94-</div>
95-
9684Direktive zur .lpr Datei hinzu. Die Lazarus IDE kann diese Konversion mit dem Tools-Menüpunkt "Convert Delphi Project to Lazarus Project" unterstützen. Sie fragt nach einer .dpr (Delphi Project) Datei und konvertiert sie in eine .lpr; außerdem erzeugt sie die .lpi Datei und konvertiert alle Units.
9785
9886Viele existierende Delphi Formulare können durch Verwendung des in die IDE eingebauten .dfm to .lfm form Umwandlers konvertiert werden, damit sie mit Lazarus richtig funktionieren. Er ist im Werkzeuge Menü als "Convert DFM file to LFM" zu finden. Öffnen Sie den file Dialog, wählen Sie die dfm Datei aus und der Umwandler wird den Rest erledigen.
9987
10088Wenn Sie die ganze Unit konvertieren müssen (mit oder ohne ein Formular), enthält Lazarus auch ein eingebautes "Convert Delphi unit to Lazarus unit", welches das folgende für Sie erledigt -
10189
102901. berichtigt die Schreibweise (groß/klein) der include Dateinamen und uses Abschnitte.
103912. konvertiert die .dfm Datei in eine .lfm Datei (gegenwärtig ohne Inhaltsprüfung, nur Formatierung)
104923. erzeugt eine leere .lrs Datei (der Inhalt wird später erzeugt)
105934. fügt die
106- <div class="dir">
107-
10894 {\$mode delphi}
10995
110- </div>
111-
11296 Direktive hinzu
113975. ersetzt die windows Unit durch LCLIntf
114986. fügt die LResources Unit hinzu falls erforderlich (i.e., if unit.lrs is to be used;
115- <div class="dir">
116-
11799 uses LResources
118100
119- </div>
120-
121101 can be in the implementation part)
1221027. entfernt die variants Unit
1231038. entfernt die
124- <div class="dir">
125-
126104 {\$R *.dfm}
127105
128- </div>
129-
130106 Direktive
1311079. fügt den initialization Abschnitt und die
132- <div class="dir">
133-
134108 {\$i unit.lrs}
135109
136- </div>
137-
138110 Direktive hinzu
139111
140112#### Auswahl des richtigen Compilermodus
141113
142114Der [[Free Pascal/de|Free Pascal]] Compiler unterstützt 5 unterschiedliche Pascal Modi. Zum Beispiel TP für Turbo Pascal, lässt Sie Turbo Pascal Units kompilieren. Es gibt auch einen DELPHI Kompatibilitäts-Modus, der gesetzt werden kann, um bestehenden Code einfacher zu konvertieren. Lazarus bevorzugt den OBJFPC Modus, welcher fast dem DELPHI Modus gleicht, aber weniger mehrdeutig als die Delphi Syntax ist. Hier sind die wichtigen Punkte:
143115
144116Der Modus kann auf der Befehlszeile oder beim Start der Quelle gewählt werden. Die Verwendung der Befehlszeile hat den Vorteil, dass Sie die Quelle nicht ändern müssen, aber den Nachteil, dass anderes erzählt werden muss.
145117
146118Die meisten Delphi Units können mit dem [[Free Pascal/de|Free Pascal]] Compiler kompiliert werden, wenn man gleich nach dem Unitnamen folgendes hinzufügt:
147119
148120`{$IFDEF FPC}`\
149121`  {$MODE DELPHI}`\
150122`{$ENDIF}`
151123
152124Für mehr Details über die [[Free Pascal/de|Free Pascal]] Modi siehe die [Free Pascal Dokumentation](http://www.freepascal.org/docs-html/prog/progap4.html#progse62.html). Für Information zu Laufzeitvariablen des Compilers (z.B. aktueller Modus) siehe [Free Pascal Dokumentation](http://www.freepascal.org/docs-html/prog/progap7.html#x310-311000G).
153125
154126#### Cross-Plattform Überlegungen
155127
156128- Das Verwenden von Inline Assembler ist immer problematisch, weil der Code dann nur auf Intel-Rechnern läuft. Es kommt auch vor, dass Entwickler Code in Pascal schreiben, aber eine optimierte Alternative in Assembler entwickeln, die durch ifdef-Konstrukte nur für Intel-Rechner gilt. Auch TurboPower selbst verwendet diese Technik an verschiedenen Stellen. Wenn das bei einem Package, das Sie übernehmen der Fall ist, schalten Sie auf den Modus Pascal.
157129- Verwenden Sie keine spezielle Speicheradressen, wie z. B. aus dem BIOS Datenbereich. Finden Sie heraus, was der Code erreichen will und suchen Sie nach einer Alternative, die für alle Plattformen funktioniert.
158130- Verwenden Sie keine Prozessor-spezifischen Tricks (wie z. B. die Intel TSC-Register), ohne dass Sie den Code in einem ifdef-Konstrukt als Plattform spezifisch markieren und entwickeln Sie eine Alternative für die anderen Plattformen.
159131- Generell gilt also: Wenn Sie Betriebssystem-spezifischen Code benötigen, dann müssen Sie IFDEFs verwenden. Siehe unten für eine Liste der Makros.
160132
161133#### Hilfreiche Compiler Variablen / Defines / Makros
162134
163135Um Code zu schreiben, der sich auf verschiedenen Systemen unterschiedlich verhält, können Sie die
164136
165-<div class="dir">
166-
167137{\$IFDEF Name}
168138
169-</div>
170-
171139Anweisungen verwenden.
172140
173-- <div class="dir">
174-
175- {\$IfDef LCL}
176-
177- </div>
141+- {\$IfDef LCL}
178142
179143Diese Variable ist definiert, wenn das LCL Package verwendet wird. Hilfreich, um Code zu schreiben, der mit der LCL und Delphi funktioniert. For compatibility reasons FPC defines the DELPHI makro in mode Delphi. So you can **not use {\$IFNDEF DELPHI}**.
180144
181-- <div class="dir">
182-
183- {\$IfDef LCL}
184-
185- </div>
145+- {\$IfDef LCL}
186146
187147This variable is defined, when using the LCL package. Useful to write code, that works with the LCL and Delphi.
188148
189-- <div class="dir">
190-
191- {\$IfDef LCLGtk}
192-
193- </div>
149+- {\$IfDef LCLGtk}
194150
195151 ,
196152
197- <div class="dir">
198-
199153 {\$IfDef LCLWin32}
200154
201- </div>
202-
203155 ,
204156
205- <div class="dir">
206-
207157 {\$IfDef LCLQt}
208158
209- </div>
210-
211159 , ...
212160
213161Diese Variable ist definiert, wenn das LCL Package verwendet wird und das spezifische Widgetset benutzt wird. Hilfreich um Code zu schreiben, der mit der LCL auf einer spezifischen Plattform funktioniert.
214162
215-- <div class="dir">
216-
217- {\$IfDef FPC}
218-
219- </div>
163+- {\$IfDef FPC}
220164
221165Diese Variable ist definiert, wenn der FPC Compiler verwendet wird. Hilfreich um Code zu schreiben, der mit FPC und Delphi funktioniert.
222166
223-- <div class="dir">
224-
225- {\$IfDef Unix}
226-
227- </div>
167+- {\$IfDef Unix}
228168
229169 ,
230170
231- <div class="dir">
232-
233171 {\$IfDef Win32}
234172
235- </div>
236-
237173 , ...
238174
239175Von FPC für das aktuelle Ziel OS definiert. Delphi definiert "Linux", "Win32" und "MSWindows". [[Free Pascal/de|Free Pascal]] läuft auf viel mehr Plattformen und daher wird empfohlen, allgemeinere Begriffe zu verwenden. Zum Beispiel ist "Unix" definiert für Linux, FreeBSD, NetBSD und OpenBSD, wo Lazarus bereits läuft. Verwenden Sie
240176
241177`{$IfDef Linux}`\
242178`  {$Define Unix}`\
243179`{$EndIf}`
244180
245181als "work around" für Kylix.
246182
247-- <div class="dir">
248-
249- {\$IfDef ENDIAN_BIG}
250-
251- </div>
183+- {\$IfDef ENDIAN_BIG}
252184
253185Diese Variable wird auf Prozessoren wie dem PowerPC definiert (zum Beispiel ältere Apple Computer, bis MacOSX 10.2), die eine im Vergleich zu Intel-Prozessoren umgekehrte Byte Order haben.
254186
255-- <div class="dir">
256-
257- {\$IfDef ENDIAN_BIG}
258-
259- </div>
187+- {\$IfDef ENDIAN_BIG}
260188
261189Für mehr Details siehe die [Free Pascal Dokumentation](http://www.freepascal.org/docs-html/prog/prog.html#QQ2-23-21).
262190
263191#### 32 bit / 64 bit Unterstützung
264192
265193Pointers under 64bit need 8 bytes instead of 4 on 32bit. The 'Integer' type remains for compatibility 32bit. This means you can no longer typecast pointers into integers and back. FPC defines two new types: PtrInt and PtrUInt. PtrInt is a 32bit signed integer on 32 bit platforms and a 64bit signed integer on 64bit platforms. The same for PtrUInt, but *unsigned* integer instead. Use for code that should work with Delphi and FPC:
266194
267195` {$IFNDEF FPC}`\
268196` type`\
269197`   PtrInt = integer;`\
270198`   PtrUInt = cardinal;`\
271199` {$ENDIF}`
272200
273201Ersetzen Sie alle **integer(SomePointerOrObject)** mit **PtrInt(SomePointerOrObject)**.
274202
275203#### Finden eines fehlenden Bezeichners
276204
277205Es gibt Unterschiede darin, wie die LCL organisiert ist im Vergleich zur Delphi VCL. Wenn Sie einen "not found" Compilerfehler erhalten über eine wichtige Klasse oder Bezeichner, stehen die Chancen gut, dass Sie die Klasse oder den Bezeichner in einer anderen Unit finden könne. Eine komplette Cross-Reference können Sie finden, indem Sie grep auf das Verzeichnis lazarus/docs/xml oder das Unterverzeichnis lcl anwenden.
278206
279207Zum Beispiel erzeugt der häufig verwendete TButton üblicherweise einen Fehler im Delphi Code, weil er sich in der Unit buttons.pp befindet. Das folgende Kommando findet die richtige Unit sehr schnell (im Lazarus Quellenverzeichnis):
280208
281209` grep -in ' tbutton =' lcl/*`
282210
283211#### Wichtige Unit Unterschiede zwischen Lazarus und Delphi
284212
285213**Bitte ergänzen Sie diesen Abschnitt!**
286214
287215- Windows-\>Interfaces, LCLIntf, LCLType, LCLProc, VCLGlobals, ...)
288216
289217Da die LCL nicht Windows-spezifisch ist, ist der Code, der sich in der Delphi Windows Unit für den direkten Zugriff auf das Win32 API befindet, abstrahiert in separate Schnittstellen, auf welche mit der LCLIntf Unit Zugriff genommen werden kann. Beachten Sie, dass Lazarus nicht win32 emuliert, so dass mehrere Funktionen fehlen und einige nicht wie ihre win32-Gegenstücke funktionieren. Diese Funktionen existieren nur für die Delphi-Kompatibilität und sollten nur für Quick&Dirty-Portierungen benutzt werden. LCL beinhaltet auch viele Typen nicht, so dass oftmals LCLType und manchmal VCLGlobals benötigt werden. LCLProc enthält auch ein paar Funktionen, die hilfreich sein können für maschinennahere Bearbeitung wie "FreeThenNil" wie in Delphi 5 und höher, "DeleteAmpersands" um zusätzliche Et-Zeichen aus Zeichenketten für Kontrollen zu entfernen (vs && etc). Die Interfaces-Unit muss in der .lpr Datei enthalten sein, um das passende Widgetset zu initialisieren.
290218
291219- Messages-\>LMessages
292220
293221TControl-Messages für win32-Ereignis-Callbacks vom Format WM_CALLBACK und die Structs, die dazugehören, finden sich oftmals in der Messages-Unit in Delphi. In LCL befinden diese sich meistens in LMessages, üblicherweise mit einer Namensänderung von WM zu LM, zum Beispiel WM_MOUSEENTER wird LM_MOUSEENTER, und TWMMouse wird TLMMouse.
294222
295223- Graphics, Controls-\>GraphTypes, GraphMath, Graphics, Controls
296224
297225Um einige Sachen zu vereinfachen und die Komplexität von Kreisabhängigkeiten zwischen Units zu verringern, wurden einige Typen in einer gemeinsamen Unit namens GraphType abstrahiert, die sich in Delphi in Graphics oder Controls befinden, bspw. das bvNone usw. von Panels. Deswegen müssen Sie diese Unit gelegentlich einbinden. Eine weitere Unit, leider inkompatibel zu Delphi, liefert zusätzliche Funktionalität, GraphMath. Sie ermöglicht TFloatPoints für präzise Berechnungen, verschiedene Routinen für den Umgang mit Beziers, Linien und Kreisbögen, sowie überladene Operatoren zur Benutzung mit TPoints und TRect, um Punkte derart zu addieren Point1 := Point2 + Point3 oder Rechtecke zu vergleichen if(rect1 = rect2) then ...
298226
299227- Mask-\>MaskEdit
300228
301229Aus Überlegungen für eine bessere Benennung wurde die Unit für TMaskEdit \[MaskEdit \|\] anstelle des leicht unklareren Mask wie in vielen Delphi Versionen.
302230
303231- StdCtrls-\>StdCtrls,Buttons
304232
305233In vielen Delphi Versionen befindet sich TButton in StdCtrls, während TSpeedButton und TBitBtn sich in Buttons befinden. Für eine Stetigkeit und Einfachheit steckt die LCL alle Buttontypen in Buttons, was gelegentlich die Code-Konvertierung ins Leere laufen lassen kann -- es ist also eine gute Idee, diese einzubinden.
306234
307235#### Eigenschaften und Methoden Unterschiede Delphi -\> FPC/LCL
308236
309237- TBitmap verfügt über eine Kanvas in der LCL
310238
311239#### Semantische Unterschiede
312240
313241##### Reihenfolge der Parameter-Auswertung
314242
315243Delphi stellt sicher, dass alle Parameter von links nach rechts ausgewertet werden. FPC macht dies nicht so, sondern wertet alle Parameter so aus, dass der Code optimal schnell läuft.
316244
317245##### Verschachtelte Prozeduren/Funktionen als Prozedurvariablen
318246
319247Delphi übergibt einen Pointer des aufrufenden Prozesses immer an den Stack, dieser entfernt ihn später auch wieder. Das bedeutet, dass es möglich ist, diesen Pointer auch an eine andere Funktion zu übergeben, die dann das rufenden Programm aufruft, wie jede andere Funktion auch. Das geht natürlich nur, solange man die Variablen der Prozedur nicht benötigt.
320248
321249Im Gegensatz dazu übergibt in FPC das rufende Programm den Pointer als ein verstecktes Argument entsprechend der jeweiligen Calling-Konvention. Das bedeutet, dass bei der Übergabe dieses Stacks an ein anderes Programm alle Parameter um eine Position verschoben sind.
322250
323251Kurz gesagt: Vermeiden Sie es, prozedurale Variablen an andere Prozeduren zu übergeben.
324252
325253#### Syntax Unterschiede
326254
327255**Bitte fügen Sie weitere Informationen zu diesem Thema hinzu!**
328256
329257Wegen der inhärenten Striktheit des FPC sind manche Syntaxänderungen notwendig, obwohl
330258
331-<div class="dir">
332-
333259{\$Mode Delphi}
334260
335-</div>
336-
337261mehr Nachlässigkeit als in Delphi erlaubt. Aus diesem Grund ist es in höchstem Maße empfehlenswert, soweit wie möglich den Syntaxregeln von
338262
339-<div class="dir">
340-
341263{\$Mode ObjFPC}
342264
343-</div>
344-
345265zu entsprechen, auch wenn die Codebasis weiterhin von Delphi und LCL gemeinsam benutzt wird. Einiges davon entspricht einfach besserer Code-Praxis, anderes liegt an dem gelegentlich inakuraten Delphi-Modus und manchmal funktioniert Code von Delphi mit FPC nicht so wie erwartet, auch wenn er sich kompilieren lässt. Letztlich sollte die folgende Liste als verbindlich betrachtet werden, auch wenn nicht alle Änderungen zwingend notwendig sind:
346266
347267##### Bei der Zuweisung eines Ereignis-Handler-Einstiegspunkts ist diesem ein "@" voranstellen
348268
349269Zum Beispiel, wenn Sie einen Button-Callback manuell zuweisen
350270
351-<table>
352-<tbody>
353-<tr>
354-<td class="header"><p>Delphi</p></td>
355-<td class="header"><p>FPC</p></td>
356-</tr>
357-<tr>
358-<td class="code"><div class="key">
359-<p>begin</p>
360-</div>
361-<div class="key">
362-<p>if not</p>
363-</div>
364-<p>Assigned(MyButton.OnClick)</p>
365-<div class="key">
366-<p>then</p>
367-</div>
368-<p><code>    MyButton.OnClick:= SomeFunction; </code></p>
369-<div class="cmt">
370-<p>//@ wird nicht benötigt</p>
371-</div>
372-<div class="cmt">
373-<p>//weiterer Code...</p>
374-</div>
375-<div class="key">
376-<p>end</p>
377-</div>
378-<p>;</p></td>
379-<td data-clag="code"><div class="key">
380-<p>begin</p>
381-</div>
382-<div class="key">
383-<p>if not</p>
384-</div>
385-<p>Assigned(MyButton.OnClick)</p>
386-<div class="key">
387-<p>then</p>
388-</div>
389-<p><code>    MyButton.OnClick:= @SomeFunction; </code></p>
390-<div class="cmt">
391-<p>//@ wird benötigt</p>
392-</div>
393-<div class="cmt">
394-<p>//weiterer Code...</p>
395-</div>
396-<div class="key">
397-<p>end</p>
398-</div>
399-<p>;</p></td>
400-</tr>
401-</tbody>
402-</table>
271+Delphi
403272
273+FPC
274+
275+begin
276+
277+if not
278+
279+Assigned(MyButton.OnClick)
280+
281+then
282+
283+`    MyButton.OnClick:= SomeFunction; `
284+
285+//@ wird nicht benötigt
286+
287+//weiterer Code...
288+
289+end
290+
291+;
292+
293+begin
294+
295+if not
296+
297+Assigned(MyButton.OnClick)
298+
299+then
300+
301+`    MyButton.OnClick:= @SomeFunction; `
302+
303+//@ wird benötigt
304+
305+//weiterer Code...
306+
307+end
308+
309+;
310+
404311**Hinweis:** Bei Fehlern gibt der Compiler einen Typ-Fehler aus (siehe Hinweis im nächsten Abschnitt).
405312
406313##### Wenn Sie eine Prozedurenvariable aufrufen, verwenden Sie diese Syntax: theprocname()
407314
408315In Delphi gibt es keinen Unterschied zwischen dem Ergebnis einer Funktion und einer Variablen, jedoch gibt es in FPC einen. Um eine Funktion aufzurufen, selbst wenn sie keine Parameter hat, müssen Sie eine runde Klammer anhängen. Zum Beispiel -
409316
410-<table>
411-<tbody>
412-<tr>
413-<td class="header"><p>Delphi</p></td>
414-<td class="header"><p>FPC</p></td>
415-</tr>
416-<tr>
417-<td class="code"><div class="key">
418-<p>With</p>
419-</div>
420-<p>(SomeObject)</p>
421-<div class="key">
422-<p>do begin</p>
423-</div>
424-<div class="key">
425-<p>If</p>
426-</div>
427-<p>Assigned(OnMyCallback)</p>
428-<div class="key">
429-<p>then</p>
430-</div>
431-<p><code>    OnMyCallback; </code></p>
432-<div class="cmt">
433-<p>//runde Klammer nicht benötigt</p>
434-</div>
435-<div class="key">
436-<p>end</p>
437-</div>
438-<p>;</p></td>
439-<td class="code"><div class="key">
440-<p>With</p>
441-</div>
442-<p>(SomeObject)</p>
443-<div class="key">
444-<p>do begin</p>
445-</div>
446-<div class="key">
447-<p>If</p>
448-</div>
449-<p>Assigned(OnMyCallback)</p>
450-<div class="key">
451-<p>then</p>
452-</div>
453-<p><code>    OnMyCallback(); </code></p>
454-<div class="cmt">
455-<p>//runde Klammer benötigt</p>
456-</div>
457-<div class="key">
458-<p>end</p>
459-</div>
460-<p>;</p></td>
461-</tr>
462-</tbody>
463-</table>
317+Delphi
464318
319+FPC
320+
321+With
322+
323+(SomeObject)
324+
325+do begin
326+
327+If
328+
329+Assigned(OnMyCallback)
330+
331+then
332+
333+`    OnMyCallback; `
334+
335+//runde Klammer nicht benötigt
336+
337+end
338+
339+;
340+
341+With
342+
343+(SomeObject)
344+
345+do begin
346+
347+If
348+
349+Assigned(OnMyCallback)
350+
351+then
352+
353+`    OnMyCallback(); `
354+
355+//runde Klammer benötigt
356+
357+end
358+
359+;
360+
465361**Hinweis:** Falls nicht im *Delphi* oder *TP* Modus, und die Klammern werden vergessen, so gibt der Compiler einen Typ-Fehler aus. Zum Beispiel
466362
467363Error: Incompatible types: got "\<procedure variable type of function:SmallInt;Register\>" expected "SmallInt"
468364
469365Diese Fehlermeldung ist hier zwar wenig aussagekräftig aber logisch.
470366
471367##### Beim Zugriff auf den Wert eines Record mittels eines Zeigers muss dieser zuerst dereferenziert werden
472368
473369In Delphi ist es nicht nötig, einen Zeiger auf einen Record zu dereferenzieren, um auf einen Wert darin zuzugreifen. Tatsächlich kann ein Zeiger wie der Record selbst oder wie jedes andere Objekt behandelt werden. In FPC muss er zuerst dereferenziert werden. Beispiel:
474370
475-<table>
476-<tbody>
477-<tr>
478-<td class="header"><p>Delphi</p></td>
479-<td class="header"><p>FPC</p></td>
480-</tr>
481-<tr>
482-<td class="code"><div class="key">
483-<p>Function</p>
484-</div>
485-<p>GetSomeValue(ARecord: PMyRecord)</p>
486-<div class="symbol">
487-<dl>
488-<dt></dt>
489-<dd>
490-</div>
491-<p>Integer;</p>
492-</dd>
493-</dl>
494-<div class="key">
495-<p>begin</p>
496-</div>
497-<div class="key">
498-<p>If</p>
499-</div>
500-<p>Assigned(ARecord)</p>
501-<div class="key">
502-<p>then</p>
503-</div>
504-<p><code>    Result</code></p>
505-<div class="symbol">
506-<dl>
507-<dt></dt>
508-<dd>
371+Delphi
372+
373+FPC
374+
375+Function
376+
377+GetSomeValue(ARecord: PMyRecord)
378+
379+
380+Integer;
381+
382+begin
383+
384+If
385+
386+Assigned(ARecord)
387+
388+then
389+
390+`    Result`
391+
392+
509393=
510-</div>
511-<p>ARecord.SomeValue</p>
512-</dd>
513-</dl>
514-<div class="key">
515-<p>else</p>
516-</div>
517-<p><code>    Result:= </code></p>
518-<div class="int">
519-<p>0</p>
520-</div>
521-<p>;</p>
522-<div class="key">
523-<p>end</p>
524-</div>
525-<p>;</p></td>
526-<td class="code"><div class="key">
527-<p>Function</p>
528-</div>
529-<p>GetSomeValue(ARecord: PMyRecord)</p>
530-<div class="symbol">
531-<dl>
532-<dt></dt>
533-<dd>
534-</div>
535-<p>Integer;</p>
536-</dd>
537-</dl>
538-<div class="key">
539-<p>begin</p>
540-</div>
541-<div class="key">
542-<p>If</p>
543-</div>
544-<p>Assigned(ARecord)</p>
545-<div class="key">
546-<p>then</p>
547-</div>
548-<p><code>    Result</code></p>
549-<div class="symbol">
550-<dl>
551-<dt></dt>
552-<dd>
394+
395+ARecord.SomeValue
396+
397+else
398+
399+`    Result:= `
400+
401+0
402+
403+;
404+
405+end
406+
407+;
408+
409+Function
410+
411+GetSomeValue(ARecord: PMyRecord)
412+
413+
414+Integer;
415+
416+begin
417+
418+If
419+
420+Assigned(ARecord)
421+
422+then
423+
424+`    Result`
425+
426+
553427=
554-</div>
555-<p>ARecord^.SomeValue</p>
556-</dd>
557-</dl>
558-<div class="key">
559-<p>else</p>
560-</div>
561-<p><code>    Result:= </code></p>
562-<div class="int">
563-<p>0</p>
564-</div>
565-<p>;</p>
566-<div class="key">
567-<p>end</p>
568-</div>
569-<p>;</p></td>
570-</tr>
571-</tbody>
572-</table>
573428
429+ARecord^.SomeValue
430+
431+else
432+
433+`    Result:= `
434+
435+0
436+
437+;
438+
439+end
440+
441+;
442+
574443##### Beim Zugriff auf Zeichen einer indizierten Zeichenketten-Eigenschaft eines Objektes muss dieses in runden Klammern stehen
575444
576445Mit Delphi ist es möglich, eine Eigenschaft genauso zu behandeln wie andere Konstanten oder Variablen, z.B. beim direkten Zugriff auf einzelne Zeichen einer Zeichenkette, wogegen das mit FPC nicht immer möglich ist, speziell bei indizierten Eigenschaften. Stattdessen muss die entsprechende Eigenschaft zur besseren Unterscheidung in runden Klammer stehen. Dies mag zwar nicht immer nötig sein, es ist dennoch eine gute Praxis, das so zu machen. Beispiel:
577446
578-<table>
579-<tbody>
580-<tr>
581-<td class="header"><p>Delphi</p></td>
582-<td class="header"><p>FPC</p></td>
583-</tr>
584-<tr>
585-<td class="code"><div class="key">
586-<p>Type</p>
587-</div>
588-<p>TSomeComponent=</p>
589-<div class="key">
590-<p>class</p>
591-</div>
592-<p>(TComponent)</p>
593-<div class="cmt">
594-<p>//weiterer Code...</p>
595-</div>
596-<div class="key">
597-<p>Published</p>
598-</div>
599-<div class="key">
600-<p>Property</p>
601-</div>
602-<p>MyString:</p>
603-<div class="key">
604-<p>String</p>
605-</div>
606-<div class="key">
607-<p>index</p>
608-</div>
609-<div class="int">
610-<p>3</p>
611-</div>
612-<div class="key">
613-<p>read</p>
614-</div>
615-<p>GetMyString;</p>
616-<div class="cmt">
617-<p>//weiterer Code...</p>
618-</div>
619-<div class="key">
620-<p>End</p>
621-</div>
622-<p>;</p>
623-<div>
624-</div>
625-<div class="key">
626-<p>var</p>
627-</div>
628-<p><code>  MyChar</code></p>
629-<div class="symbol">
630-<dl>
631-<dt></dt>
632-<dd>
633-</div>
634-<p>char;</p>
635-</dd>
636-</dl>
637-<div class="key">
638-<p>begin</p>
639-</div>
640-<div class="key">
641-<p>If</p>
642-</div>
643-<p>Length(MyString)&gt;</p>
644-<div class="int">
645-<p>2</p>
646-</div>
647-<div class="key">
648-<p>then</p>
649-</div>
650-<div class="cmt">
651-<p>//no parenthesis needed</p>
652-</div>
653-<p><code>    MyChar:= MyString[</code></p>
654-<div class="int">
655-<p>3</p>
656-</div>
657-<p>];</p>
658-<div class="cmt">
659-<p>//weiterer Code...</p>
660-</div>
661-<div class="key">
662-<p>end</p>
663-</div>
664-<p>;</p></td>
665-<td class="code"><div class="key">
666-<p>Type</p>
667-</div>
668-<p>TSomeComponent=</p>
669-<div class="key">
670-<p>class</p>
671-</div>
672-<p>(TComponent)</p>
673-<div class="cmt">
674-<p>//weiterer Code...</p>
675-</div>
676-<div class="key">
677-<p>Published</p>
678-</div>
679-<div class="key">
680-<p>Property</p>
681-</div>
682-<p>MyString:</p>
683-<div class="key">
684-<p>String</p>
685-</div>
686-<div class="key">
687-<p>index</p>
688-</div>
689-<div class="int">
690-<p>3</p>
691-</div>
692-<div class="key">
693-<p>read</p>
694-</div>
695-<p>GetMyString;</p>
696-<div class="cmt">
697-<p>//weiterer Code...</p>
698-</div>
699-<div class="key">
700-<p>End</p>
701-</div>
702-<p>;</p>
703-<div>
704-</div>
705-<div class="key">
706-<p>var</p>
707-</div>
708-<p><code>  MyChar</code></p>
709-<div class="symbol">
710-<dl>
711-<dt></dt>
712-<dd>
713-</div>
714-<p>char;</p>
715-</dd>
716-</dl>
717-<div class="key">
718-<p>begin</p>
719-</div>
720-<div class="key">
721-<p>If</p>
722-</div>
723-<p>Length(MyString)&gt;</p>
724-<div class="int">
725-<p>2</p>
726-</div>
727-<div class="key">
728-<p>then</p>
729-</div>
730-<div class="cmt">
731-<p>//parenthesis sometimes needed</p>
732-</div>
733-<p><code>    MyChar:= (MyString)[</code></p>
734-<div class="int">
735-<p>3</p>
736-</div>
737-<p>];</p>
738-<div class="cmt">
739-<p>//weiterer Code...</p>
740-</div>
741-<div class="key">
742-<p>end</p>
743-</div>
744-<p>;</p></td>
745-</tr>
746-</tbody>
747-</table>
447+Delphi
748448
449+FPC
450+
451+Type
452+
453+TSomeComponent=
454+
455+class
456+
457+(TComponent)
458+
459+//weiterer Code...
460+
461+Published
462+
463+Property
464+
465+MyString:
466+
467+String
468+
469+index
470+
471+3
472+
473+read
474+
475+GetMyString;
476+
477+//weiterer Code...
478+
479+End
480+
481+;
482+
483+var
484+
485+`  MyChar`
486+
487+
488+char;
489+
490+begin
491+
492+If
493+
494+Length(MyString)\>
495+
496+2
497+
498+then
499+
500+//no parenthesis needed
501+
502+`    MyChar:= MyString[`
503+
504+3
505+
506+\];
507+
508+//weiterer Code...
509+
510+end
511+
512+;
513+
514+Type
515+
516+TSomeComponent=
517+
518+class
519+
520+(TComponent)
521+
522+//weiterer Code...
523+
524+Published
525+
526+Property
527+
528+MyString:
529+
530+String
531+
532+index
533+
534+3
535+
536+read
537+
538+GetMyString;
539+
540+//weiterer Code...
541+
542+End
543+
544+;
545+
546+var
547+
548+`  MyChar`
549+
550+
551+char;
552+
553+begin
554+
555+If
556+
557+Length(MyString)\>
558+
559+2
560+
561+then
562+
563+//parenthesis sometimes needed
564+
565+`    MyChar:= (MyString)[`
566+
567+3
568+
569+\];
570+
571+//weiterer Code...
572+
573+end
574+
575+;
576+
749577##### Sie müssen eine Typumwandlung von Zeigern in den tatsächlichen Typ vornehmen, wird dieser Zeiger mit einer Variablen oder Funktion dieses Typs benutzt
750578
751579In Delphi haben Sie manchmal einen Null-Zeiger-Variable, die ein Objekt repräsentiert. Auch wenn es nach einer gestellten Situation aussieht, ist es gängige Praxis gerade in großen Komponenten-Paketen, um zu viele Kreisreferenzen zwischen Objekten verschiedener Units zu vermeiden. In Delphi ist es möglich, diesen Null-Zeiger einer Funktion zu schicken, die ein Objekt dieses Typs erwartet, ohne sich mit einer Typenumwandlung beschäftigen zu müssen. In FPC muss eine solche Typenumwandlung stattfinden
752580
753581Zum Beispiel -
754582
755-<table>
756-<tbody>
757-<tr>
758-<td class="header"><p>Delphi</p></td>
759-<td class="header"><p>FPC</p></td>
760-</tr>
761-<tr>
762-<td class="code"><p>Unit 1</p>
763-<div class="key">
764-<p>Type</p>
765-</div>
766-<p>TSomeObject=</p>
767-<div class="key">
768-<p>class</p>
769-</div>
770-<p>(TComponent)</p>
771-<div class="cmt">
772-<p>//weiterer Code...</p>
773-</div>
774-<div class="key">
775-<p>End</p>
776-</div>
777-<p>;</p>
778-<div>
779-</div>
780-<div class="key">
781-<p>Procedure</p>
782-</div>
783-<p>DoSomething(Value: TSomeObject);</p>
784-<div class="key">
785-<p>Function</p>
786-</div>
787-<p>GetSomeObject: TSomeObject;</p>
788-<div>
789-</div>
790-<div class="symbol">
791-<p>Unit 2</p>
792-</div>
793-<div class="key">
794-<p>Type</p>
795-</div>
796-<p>TSomeComponent=</p>
797-<div class="key">
798-<p>class</p>
799-</div>
800-<p>(TComponent)</p>
801-<div class="cmt">
802-<p>//weiterer Code...</p>
803-</div>
804-<div class="key">
805-<p>Published</p>
806-</div>
807-<p><code>  SomeObject: Pointer</code></p>
808-<div class="symbol">
809-<p>;</p>
810-</div>
811-<div class="cmt">
812-<p>//weiterer Code...</p>
813-</div>
814-<div class="key">
815-<p>End</p>
816-</div>
817-<p>;</p>
818-<div>
819-</div>
820-<div class="symbol">
821-<p>Application</p>
822-</div>
823-<div class="key">
824-<p>var</p>
825-</div>
826-<p><code>  MyComponent: TSomeComponent</code></p>
827-<div class="symbol">
828-<p>;</p>
829-</div>
830-<div class="key">
831-<p>begin</p>
832-</div>
833-<p><code>  MyComponent.SomeObject</code></p>
834-<div class="symbol">
835-<dl>
836-<dt></dt>
837-<dd>
583+Delphi
584+
585+FPC
586+
587+Unit 1
588+
589+Type
590+
591+TSomeObject=
592+
593+class
594+
595+(TComponent)
596+
597+//weiterer Code...
598+
599+End
600+
601+;
602+
603+Procedure
604+
605+DoSomething(Value: TSomeObject);
606+
607+Function
608+
609+GetSomeObject: TSomeObject;
610+
611+Unit 2
612+
613+Type
614+
615+TSomeComponent=
616+
617+class
618+
619+(TComponent)
620+
621+//weiterer Code...
622+
623+Published
624+
625+`  SomeObject: Pointer`
626+
627+;
628+
629+//weiterer Code...
630+
631+End
632+
633+;
634+
635+Application
636+
637+var
638+
639+`  MyComponent: TSomeComponent`
640+
641+;
642+
643+begin
644+
645+`  MyComponent.SomeObject`
646+
647+
838648=
839-</div>
840-<p>GetSomeObject;</p>
841-</dd>
842-</dl>
843-<div class="cmt">
844-<p>//weiterer Code...</p>
845-</div>
846-<p><code>  DoSomething(MyComponent.SomeObject)</code></p>
847-<div class="symbol">
848-<p>;</p>
849-</div>
850-<div class="key">
851-<p>end</p>
852-</div>
853-<p>;</p></td>
854-<td class="code"><p>Unit 1</p>
855-<div class="key">
856-<p>Type</p>
857-</div>
858-<p>TSomeObject=</p>
859-<div class="key">
860-<p>class</p>
861-</div>
862-<p>(TComponent)</p>
863-<div class="cmt">
864-<p>//weiterer Code...</p>
865-</div>
866-<div class="key">
867-<p>End</p>
868-</div>
869-<p>;</p>
870-<div>
871-</div>
872-<div class="key">
873-<p>Procedure</p>
874-</div>
875-<p>DoSomething(Value: TSomeObject);</p>
876-<div class="key">
877-<p>Function</p>
878-</div>
879-<p>GetSomeObject: TSomeObject;</p>
880-<div>
881-</div>
882-<div class="symbol">
883-<p>Unit 2</p>
884-</div>
885-<div class="key">
886-<p>Type</p>
887-</div>
888-<p>TSomeComponent=</p>
889-<div class="key">
890-<p>class</p>
891-</div>
892-<p>(TComponent)</p>
893-<div class="cmt">
894-<p>//weiterer Code...</p>
895-</div>
896-<div class="key">
897-<p>Published</p>
898-</div>
899-<p><code>  SomeObject: Pointer</code></p>
900-<div class="symbol">
901-<p>;</p>
902-</div>
903-<div class="cmt">
904-<p>//weiterer Code...</p>
905-</div>
906-<div class="key">
907-<p>End</p>
908-</div>
909-<p>;</p>
910-<div>
911-</div>
912-<div class="symbol">
913-<p>Application</p>
914-</div>
915-<div class="key">
916-<p>var</p>
917-</div>
918-<p><code> MyComponent: TSomeComponent</code></p>
919-<div class="symbol">
920-<p>;</p>
921-</div>
922-<div class="key">
923-<p>begin</p>
924-</div>
925-<p><code>  MyComponent.SomeObject</code></p>
926-<div class="symbol">
927-<dl>
928-<dt></dt>
929-<dd>
649+
650+GetSomeObject;
651+
652+//weiterer Code...
653+
654+`  DoSomething(MyComponent.SomeObject)`
655+
656+;
657+
658+end
659+
660+;
661+
662+Unit 1
663+
664+Type
665+
666+TSomeObject=
667+
668+class
669+
670+(TComponent)
671+
672+//weiterer Code...
673+
674+End
675+
676+;
677+
678+Procedure
679+
680+DoSomething(Value: TSomeObject);
681+
682+Function
683+
684+GetSomeObject: TSomeObject;
685+
686+Unit 2
687+
688+Type
689+
690+TSomeComponent=
691+
692+class
693+
694+(TComponent)
695+
696+//weiterer Code...
697+
698+Published
699+
700+`  SomeObject: Pointer`
701+
702+;
703+
704+//weiterer Code...
705+
706+End
707+
708+;
709+
710+Application
711+
712+var
713+
714+` MyComponent: TSomeComponent`
715+
716+;
717+
718+begin
719+
720+`  MyComponent.SomeObject`
721+
722+
930723=
931-</div>
932-<p>Pointer(GetSomeObject);</p>
933-</dd>
934-</dl>
935-<div class="cmt">
936-<p>//weiterer Code...</p>
937-</div>
938-<p><code>  DoSomething(TSomeObject(MyComponent.SomeObject))</code></p>
939-<div class="symbol">
940-<p>;</p>
941-</div>
942-<div class="key">
943-<p>end</p>
944-</div>
945-<p>;</p></td>
946-</tr>
947-</tbody>
948-</table>
949724
725+Pointer(GetSomeObject);
726+
727+//weiterer Code...
728+
729+`  DoSomething(TSomeObject(MyComponent.SomeObject))`
730+
731+;
732+
733+end
734+
735+;
736+
950737#### Ressourcen
951738
952739Delphi Ressourcendateien sind Win32-spezifisch und nicht kompatibel mit Lazarus, so dass Sie sie neu erstellen und mit Lazres kompilieren müssen. Lazres ist im lazarus/tools Unterverzeichnis zu finden. Wenn Sie die Lazarus Quellen heruntergeladen haben, müssen sie es erst kompilieren.
953740
954741- cd lazarus/tools
955742- make install
956743
957744Um eine Ressource zu Ihrer Anwendung hinzuzufügen:
958745
959746- lazres myresource.lrs mypix.xpm anotherpix.xpm
960747- Fügen Sie die LResources Unit zu Ihrem Uses Abschnitt hinzu
961748- Nehmen Sie die von Ihnen erstellte .lrs Datei unter dem initialization Abschnitt auf
962749
963750Beispiel:
964751
965-<table>
966-<tbody>
967-<tr>
968-<td class="code"><div class="key">
969-<p>function</p>
970-</div>
971-<p>TForm1.LoadGlyph(</p>
972-<div class="key">
973-<p>const</p>
974-</div>
975-<p>GlyphName:</p>
976-<div class="key">
977-<p>String</p>
978-</div>
979-<p>): TBitMap;</p>
980-<div class="key">
981-<p>begin</p>
982-</div>
983-<p><code>  Result:= TPixmap.Create</code></p>
984-<div class="symbol">
985-<p>;</p>
986-</div>
987-<p><code>  Result.LoadFromLazarusResource(GlyphName)</code></p>
988-<div class="symbol">
989-<p>;</p>
990-</div>
991-<div class="key">
992-<p>end</p>
993-</div>
994-<p>;</p>
995-<div class="cmt">
996-<p>//weiterer Code...</p>
997-</div>
998-<div class="key">
999-<p>begin</p>
1000-</div>
1001-<p><code>  Speedbutton1.glyph:= LoadGlyph('mypix')</code></p>
1002-<div class="symbol">
1003-<p>;</p>
1004-</div>
1005-<div class="cmt">
1006-<p>//weiterer Code...</p>
1007-</div>
1008-<div class="key">
1009-<p>end</p>
1010-</div>
1011-<p>;</p>
1012-<div>
1013-</div>
1014-<div class="key">
1015-<p>initialization</p>
1016-</div>
1017-<div class="dir">
1018-<p>{$I unit1.lrs}</p>
1019-</div>
1020-<div class="dir">
1021-<p>{$I myresource.lrs}</p>
1022-</div>
1023-<div class="key">
1024-<p>end</p>
1025-</div>
1026-<p>.</p></td>
1027-</tr>
1028-</tbody>
1029-</table>
752+function
753+
754+TForm1.LoadGlyph(
755+
756+const
757+
758+GlyphName:
759+
760+String
761+
762+): TBitMap;
763+
764+begin
765+
766+`  Result:= TPixmap.Create`
767+
768+;
769+
770+`  Result.LoadFromLazarusResource(GlyphName)`
771+
772+;
773+
774+end
775+
776+;
777+
778+//weiterer Code...
779+
780+begin
781+
782+`  Speedbutton1.glyph:= LoadGlyph('mypix')`
783+
784+;
785+
786+//weiterer Code...
787+
788+end
789+
790+;
791+
792+initialization
793+
794+{\$I unit1.lrs}
795+
796+{\$I myresource.lrs}
797+
798+end
799+
800+.
1030801
1031802### Eine andere Methode um ein Delphi- oder Kylix-Projekt nach Lazarus zu konvertieren
1032803
1033804- Benennen Sie alle .dfm oder .xfm Dateien in .lfm um. (Dies funktioniert nicht mit frühen Delphi Versionen da sie keine textbasierte .dfm Datei erstellen.)
1034805- Benennen Sie die .dpr Datei in .lpr um.
1035806- Nehmen Sie notwendige Änderungen in der .lpr Datei vor:
1036807
10378081. Fügen Sie {\$mode delphi}{\$H+} oder {\$mode objfpc}{H+} Direktiven hinzu.
10388092. Fügen Sie 'Interfaces' zum uses Abschnitt hinzu.
10398103. Kommentieren Sie die {\$R *.res} Direktive aus oder löschen Sie diese.
1040811
1041812- Nehmen Sie notwendige Änderungen in allen .pas Unit Dateien vor:
1042813
10438141. Fügen sie die {\$mode delphi}{\$H+} oder {\$mode objfpc}{H+} Direktiven hinzu.
10448152. Fügen Sie 'LResources', und wenn das Formular Buttons hat, 'Buttons' zum uses Abschnitt hinzu.
10458163. Kommentieren Sie die {\$R *.dfm} oder {\$R *.xfm} Direktive aus oder löschen Sie diese.
10468174. Fügen Sie einen 'Initialization' Abschnitt am Ende jeder Datei hinzu, und fügen die {\$I unitname.lrs} Direktive darin hinzu.
1047818
1048819- Wählen Sie Projekt -\> Neues Projekt von Datei
1049820- Wählen Sie die .lpr Datei
1050821- Im 'Erzeuge neues Projekt' Fenster wählen Sie 'Anwendung'
1051822- Erzeugen Sie das Projekt und nehmen Sie weitere notwendige Korrekturen vor um eine ordentliche Kompilierung zu erhalten, an diesem Punkt wird die .lpi Datei automatisch generiert. Sie erhalten vielleicht 'Error reading Form' Meldungen. Klicken Sie auf 'Continue Loading' falls dem so ist.
1052823- Speichern Sie alles und Sie haben ein Lazarus Projekt :-)
1053824
1054825## Hilfe erhalten
1055826
1056827Wenn Sie während der Konvertierung auf ein Problem stoßen, das Sie gerade nicht lösen können, gibt es eine große Auswahl von Orten, um Hilfe zu erhalten:
1057828
1058829### Dokumentation
1059830
1060831Für reine Object Pascal und FPC Probleme, ist der beste Ort zu beginnen die Free Pascal [Dokumentation](http://www.freepascal.org/docs-html/)von Michaël Van Canneyt und Florian Klämpfl.
1061832
1062833Für mehr Lazarus orientierte Probleme ist die Lazarus Projekt Dokumentation in der [[Main Page/de|Lazarus-CCR Knowledgebase]] der nächste Ort zum Nachschauen. Schließlich können Sie eine Frage posten in einer der [Mailing Listen](http://www.freepascal.org/maillist.html)für den Free Pascal Compiler oder den [FPC Foren](http://community.freepascal.org:10000/bboard/), wo eine Menge Experten eingeschrieben sind.
1063834
1064835### Unterstützung durch andere User
1065836
1066837Mailing-Listen: Man kann eine Frage stellen unter einer der [Mailing-Listen für den Freien Pascal Compiler](http://www.freepascal.org/maillist.html) oder das [FPC/Lazarus forums](http://forum.lazarus.freepascal.org/index.php?action=forum) wo eine Reihe von Experten antworten.
1067838
1068839Bei Zugriff auf IRC: bei irc.freenode.net: [\#fpc](irc://irc.freenode.net/fpc) for FPC, oder [\#lazarus-ide](irc://irc.freenode.net/lazarus-ide) für Lazarus
1069840
1070841### Wissensbasis
1071842
1072843Es gibt einige hervorragende Such- und Wissensdatenbanken im Internet, die ebenfalls eine große Hilfe beim Erlernen neuer Techniken und beim Lösen von Problemen sein können:
1073844
1074845- Tamarack Associates enthält eine schnelle \[ <http://codenewsfast.com/> search\] Suche speziell für das Borland usenet Archiv.
1075846- Mer Systems Inc. liefert eine ähnliche Suchseite [engine](http://www.mers.com/searchsite.html).
1076847- Eine weitere herausragende Informationsquelle sowie eine standortübergreifende [search](http://www.efg2.com/Lab/search.htm)Möglichkeit ist Earl F. Glynn's Computer Lab and Reference [Library](http://www.efg2.com/).
1077848
1078849## Erstellen eines Packages und Veröffentlichung Ihrer Komponente
1079850
1080851### Erstellen eines Lazarus Packages für Ihre Komponente(n)
1081852
1082853Das Erstellen eines Packages macht die Installation Ihres konvertierten Codes viel einfacher - besonders wenn Sie mehr als eine Komponente anbieten. Mattias Gärtner hat eine Übersicht über [[Lazarus Packages/de|Lazarus Packages]] geschrieben, die Sie lesen sollten bevor Sie mit diesem Prozess beginnen.
1083854
1084855### Dokumentation
1085856
1086857Der Zweck dieser Seite und des Wiki-Formats ist, die Generierung einer professionellen Dokumentation zu einem einfachen und schnellen Vorgang zu machen. Das Wiki erlaubt es auch, die Resultate Ihrer Posting unverzüglich zu sehen und erlaubt Ihnen, Änderungen in Echtzeit zu machen.
1087858
1088859Die Verwendung des Lazarus-CCR Wiki um eine schön anzuschauende Dokumentation zu erstellen ist sehr einfach. Wenn Sie noch nie zuvor die Wiki Sprache verwendet haben, können Sie sich in dem [[Sand Box]] Übungsbereich damit vertraut machen.
1089860
1090861### Erzeugen einer Code Release Page
1091862
1092863Die Code Release Page enthält grundlegende Informationen über Ihre Komponente, die ein potenzieller Nutzer wird wissen wollen, wie Lizenz, vorgesehene Plattform, Status (alpha, beta, stable...), wo sie herunterzuladen ist, wer sie geschrieben hat, ob Support verfügbar ist... etc.
1093864
1094865Die folgende Prozedur lässt Sie eine Code Release Seite mit Ihrem Browser erzeugen:
1095866
1096867- Gehen Sie zu [[Release new component]]
1097868- Tippen Sie den Namen Ihrer Komponente in die Textbox und klicken auf *Create Article*
1098869- Füllen Sie die Vorlage aus und vergessen Sie nicht zu speichern.
1099870- Bearbeiten Sie die [[Components and Code examples]] Seite und fügen Sie einen Link zu Ihrer gerade erzeugten Seite hinzu im "Released Components" Abschnitt. Speichern Sie die geänderte Seite.
1100871
1101872### Einreichen der Komponente
1102873
1103874Wenn Sie die Rechte eines Lazarus-Release-Verwalters besitzen, laden Sie ihre Komponente in das SourceForge File Release System hoch und fügen Sie sie zur Liste der Release-Packages hinzu. Andernfalls senden Sie die Komponente an einen der Projektadministratoren (Tom Lisjac oder Vincent Snijders) und wir werden sie zum Repository hinzufügen. Bevor wir sie zu SourceForge hochladen, müssen Sie eine *Code Release Page* erstellen, um Ihre Komponente zu beschreiben. Sie können die [[Release new component]] Seite verwenden, um mit der Erzeugung einer solchen Seite zu beginnen.
1104875
1105876Falls Sie vorhaben, dass Sie die Entwicklung der Komponente fortsetzen, dann können wir sie auch in SVN einstellen, sodass Sie auch weiterhin Zugriff auf Ihre Komponente haben. Wenn wir es leid sind, immer Ihre Patches zu übermitteln, werden wir Ihnen die Schreibrechte zum SVN einräumen, damit Sie Ihre Patches dann selbst betreuen können. Für Details siehe [[Using the Lazarus-ccr SVN repository]].
1106877
1107878## Mitwirkende und Änderungen
1108879
1109880Diese Seite wurde von der epikwiki [Version](http://lazarus-ccr.sourceforge.net/index.php?wiki=CodeConversionGuide) konvertiert.
1110881
1111882- Anfangsversion von Tom Lisjac und Mattias Gärtner - 9/22/2003 VlxAdmin
1112883- Moved Getting help from the main page. T. Lisjac - 9/24/2003 VlxAdmin
1113884- Added documentation templates, procedure and links. 9/25/2003 VlxAdmin
1114885- LCLLinux wurde in LCLIntf umbenannt, Jesus Reyes, 9/27/2003
1115886- added more information on Unit changes, [AndrewJohnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 9/27/2003
1116887- Updated Syntax differences, including some examples, [AndrewJohnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 9/27/2003
1117888- FPC 1.0.x doesn't support interfaces, Vincent Snijders 9/28/2003
1118889- Fixed some of the examples per new WikiWord definition, 9/28/2003 VlxAdmin
1119890- Made code more consistant to remove last accidental Pascal WikiWord definitions, [AndrewJohnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 9/27/2003
1120891- 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
1121892- Use pascal stylesheet to make example code more readable, [AndrewJohnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 10/18/2003
1122893- Abschnitt 'Another method to convert a Delphi or Kylix project to Lazarus' hinzugefügt , George Lober, 2/17/2006
1123894
1124895---
1125896*From the Free Pascal wiki, page "Code Conversion Guide/de", as it stood on 2023-03-15 after a change by Kornelius, 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