Sign in Join
Wiki copytemporary

Lazarus For Delphi Users/de: what changed

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

OldNewLine
1-\
21Zurück zu den [[Additional information/de|Zusätzlichen Informationen]].\
3-\
2+
43Diese Beschreibung ist für Leute gedacht, die an Lazarus interessiert sind und Delphi bereits kennen. Sie beschreibt die Unterschiede zwischen den beiden.
54
65## Delphi -\> Lazarus
76
87Lazarus ist ein Rapid Application Development (RAD) Tool wie Delphi. Das bedeutet, es enthält eine visuelle Komponentenbibliothek und eine IDE. Die Lazarus Component Library (LCL) ist sehr ähnlich zu Delphi's VCL. Die meisten Units, Klassen und Eigenschaften haben den selben Namen und die selbe Funktionalität. Dies macht eine Portierung (von Delphi zu Lazarus) einfach. Aber Lazarus ist kein 'Open Source Delphi Klon'. Erwarten Sie daher keine 100%ige Kompatibilität.
98
109### Die größten Unterschiede
1110
1211Lazarus ist komplett Open Source, ist plattformunabhängig geschrieben und benutzt den mächtigen [[Free Pascal/de|Free Pascal]] Compiler (FPC). FPC läuft auf mehr als 15 Plattformen. Aber nicht alle Packages und Bibliotheken sind portiert, so dass Lazarus gegenwärtig unter Linux (i386, x86_64), FreeBSD (i386), Mac OS X (powerpc, i386) und Windows (i386, x86_64) läuft.
1312
1413**Lazarus ist nicht komplett, genau so wenig wie es dieser Text ist. Wir suchen ständig neue Entwickler, Package-Entwickler, Portierer, Dokumentations-Schreiber, ... .**
1514
1615### Die erste Aktion bei der Konvertierung eines Delphi-Projekts
1716
1817Nachdem Lazarus gestartet ist, gehen Sie zu **Werkzeuge** und dann zu **Delphi- in Lazarus-Project umwandeln**. Das wird nicht alles für Sie erledigen, Sie aber ein gutes Stück weiter bringen. Beachten Sie, dass die Konvertierungstools der Lazarus-IDE generell nur Einweg-Konvertierungen durchführen. Falls Sie die Kompatibilität zu Delphi aufrecht halten müssen, sodass Sie Ihr Projekt sowohl mit Delphi als auch mit Lazarus kompilieren können, versuchen Sie stattdessen Ihre Dateien mit dem [XDev Toolkit](http://wiki.lazarus.freepascal.org/XDev_Toolkit) zu konvertieren.
1918
2019### Unicode-Unterstützung
2120
2221Die Versionen von Delphi bis zu Delphi 2007 hatten keine Unterstützung von Unicode, aber verwendeten die Windows-ANSI-Kodierung. Delphi unterstützt Unicode mit in UTF-16 kodierten Zeichenketten seit der Version 2009.
2322
2423Lazarus startete im Gegensatz dazu seine Unicode-Unterstützung früher und verwendet in UTF-8 kodierte Zeichenketten. Für weitere Informationen siehe [[LCL Unicode Support]].
2524
2625## Delphi IDE -\> Lazarus IDE
2726
2827### Projekte
2928
3029Die Hauptdatei einer Delphi Anwendung ist die .dpr Datei. Die Hauptdatei eines Lazarus Projekts ist die .lpi Datei (Lazarus Project Information). Eine .dpr Datei ist die Hauptquelle eines Programms und die Delphi IDE speichert hier einige Informationen über die Compiler-Schalter und Units. Eine Lazarus-Anwendung hat auch eine .lpr Datei, die auch die wichtigste Quelldatei ist. Aber alle anderen Informationen werden in der .lpi Datei gespeichert. Daher ist die .lpi Datei die wichtigste Datei.
3130
3231Zum Beispiel:
3332
3433Delphi speichert die Pfade der Units in der .dpr-Datei. Beispielsweise: unit1 in 'path/Unit1.pas'. Diese 'in'-Pfade sind Delphispezifisch und werden nicht von der Lazarus-IDE gelesen. Verwenden Sie sie nicht. Benutzen Sie stattdessen die Unitpfade der Compilereinstellungen.
3534
3635Delphi speichert Compilereinstellungen in der .dpr-Datei. Beispielsweise {\$APPTYPE CONSOLE}. Diese werden von der Lazarus-IDE ignoriert. Verwenden Sie sie nicht. Benutzen Sie stattdessen die Compilereinstellungen.
3736
3837Eine wichtige Regel: Es gibt *immer* ein Projekt. Der einzige Weg, um ein Projekt "zu beenden", ist, Lazarus zu beenden oder ein anderes Projekt zu öffnen. Das ist so, weil ein Lazarus Projekt auch eine "Sitzung" ist. Das bedeutet, dass die aktuellen Editoreinstellungen auch in der .lpi Datei gespeichert sind und wiederhergestellt werden, wenn sie das Projekt wieder öffnen. Zum Beispiel: Sie debuggen eine Anwendung, setzen eine Menge Haltepunkte (Breakpoints) und Lesezeichen (Bookmarks). Sie können das Projekt jederzeit speichern, Lazarus schließen oder ein anderes Projekt öffnen. Wenn Sie das Projekt wieder öffnen, sogar auf einem anderen Computer, werden alle Ihre Haltepunkte, Lesezeichen, geöffneten Dateien, Cursorpositionen, Sprunghistorie, ... wieder hergestellt.
3938
4039### Quelltext-Editor
4140
4241Nahezu alle Tasten und Tastenkürzel (short cuts) können unter 'Einstellungen -\> Editoreinstellungen -\> Tastaturbelegung' festgelegt werden.
4342
4443Die Lazarus IDE besitzt eine Menge von Werkzeugen für Quelltexte. Viele von ihnen sehen aus und arbeiten sehr ähnlich wie Delphi. Aber es gibt einen wichtigen Unterschied: Lazarus benutzt nicht den Compiler, um Code-Informationen zu erhalten. Es analysiert die Quelltexte direkt. Dies hat eine Menge von bedeutenden Vorteilen:
4544
4645Der Quelltext-Editor berücksichtigt Kommentare. Für Delphi sind die Kommentare in den Quellen einfach nur Leerzeichen im Code. Kein Code-Werkzeug funktioniert dort und wenn neuer Code automatisch eingefügt wird, dann wandern Ihre Kommentare. Unter Lazarus können Sie eine 'find declaration' sogar für Code in den Kommentaren erstellen. Obwohl dies nicht komplett zuverlässig ist, funktioniert es oftmals. Und wenn neuer Code eingefügt ist, dann benutzt die IDE einige heuristische Methoden, um Kommentare und Code zusammen zu halten. Zum Beispiel: Es wird die Zeile "c: char; // comment" nicht aufgeteilt.
4746
4847Delphi's "Code Completion" (Strg+Space) wird "Bezeichner-Vervollständigung" genannt unter Lazarus. Der Lazarus Begriff "Codevervollständigung" ist ein Werkzeug, das automatische "Klassenvervollständigung" (das gleiche wie unter Delphi), "Local Variable Completion" und "Event Assignment Completion" kombiniert. Alle von ihnen werden mit Strg+Shift+C aufgerufen und die IDE ermittelt über die Cursorposition, was gemeint ist.
4948
5049#### Beispiel für Local Variable Completion
5150
5251Nehmen wir an, dass Sie gerade eine neue Methode erzeugt haben und die Anweisung lautet "i:=3;"
5352
5453``` pascal
5554procedure TForm1.DoSomething;
5655begin
5756 i := 3;
5857end;
5958```
6059
61-Positionieren Sie den Cursor über dem Bezeichner "i" und drücken Sie <span class="kbd">Strg</span>+<span class="kbd">Shift</span>+<span class="kbd">C</span> und Sie erhalten:
60+Positionieren Sie den Cursor über dem Bezeichner "i" und drücken Sie `Strg`+`Shift`+`C` und Sie erhalten:
6261
6362``` pascal
6463procedure TForm1.DoSomething;
6564var i: Integer;
6665begin
6766 i := 3;
6867end;
6968```
7069
7170#### Beispiel für Event Assignment Completion
7271
7372Ein nettes Feature des Objektinspektors ist die automatische Erzeugung von Methoden. Das selbe können Sie im Quelltext-Editor erhalten.\
7473Zum Beispiel:
7574
7675``` pascal
7776Button1.OnClick:=
7877```
7978
80-Positionieren Sie den Cursor hinter dem Zuweisungsoperator ":=" und drücken Sie <span class="kbd">Strg</span>+<span class="kbd">Shift</span>+<span class="kbd">C</span>.
79+Positionieren Sie den Cursor hinter dem Zuweisungsoperator ":=" und drücken Sie `Strg`+`Shift`+`C`.
8180
8281#### Beispiel für Procedure Call Completion
8382
8483Angenommen Sie haben gerade folgende Anweisung geschrieben: "DoSomething(Width);"
8584
8685``` pascal
8786procedure SomeProcedure;
8887var
8988 Width: integer;
9089begin
9190 Width:=3;
9291 DoSomething(Width);
9392end;
9493```
9594
96-Positionieren Sie den Cursor über dem Bezeichner "DoSomething", drücken Sie <span class="kbd">Strg</span>+<span class="kbd">Shift</span>+<span class="kbd">C</span> und Sie erhalten:
95+Positionieren Sie den Cursor über dem Bezeichner "DoSomething", drücken Sie `Strg`+`Shift`+`C` und Sie erhalten:
9796
9897``` pascal
9998procedure DoSomething(aWidth: LongInt);
10099begin
101100
102101end;
103102
104103procedure SomeProcedure;
105104var
106105 Width: integer;
107106begin
108107 Width:=3;
109108 DoSomething(Width);
110109end;
111110```
112111
113112#### "Wortvervollständigung" Strg+W
114113
115114Sie arbeitet ähnlich wie die "Bezeichner-Vervollständigung", aber sie funktioniert nicht nur mit Pascal-Bezeichnern, sondern mit allen Wörtern. Sie lässt Sie aus allen Wörter in allen geöffneten Dateien wählen, die mit dem selben Buchstaben beginnen.
116115
117116#### Unterstützung von Include-Dateien
118117
119118Delphi unterstützt diese nicht, und daher haben Sie wahrscheinlich noch nicht viele Include-Dateien erstellt. Aber Include-Dateien haben einen großen Vorteil: Sie machen es möglich, plattform-unabhängigen Code zu schreiben ohne Ihren Code durch IFDEFs unübersichtlich zu machen. Zum Beispiel: Method jumping, Class Completion, find declaration, .. arbeiten alle mit Include-Dateien.
120119
121120Es gibt viele Optionen für die Code Features.
122121
123122### Designer
124123
125124\- Richtlinien
126125
127126#### Objektinspektor
128127
129128In den Delphi und Lazarus IDE's wird der Objektinspektor benutzt, um Komponenteneigenschaften zu editieren und Ereignisse zuzuweisen etc. Die folgenden Zeilen zeigen einige kleinere Unterschiede, auf die man achten muss:
130129
1311301. Seit Delphi5 gibt es im Objektinspektor einen Objekt-Treeview, der zum Navigieren und Auswählen von Objekten unter Darstellung ihrer Hierarchie genutzt werden kann und so wahlweise die Dropdown-Liste des Objektinspektors ersetzt. In Lazarus ist dieser Treeview fester Bestandteil des Objektinspektors und er ersetzt die Dropdown-Liste völlig. Die Anzeige kann über das Kontextmenü "Komponentenbaum anzeigen" aktiviert bzw. deaktiviert werden.
1321312. In Delphi wird ein Doppelklick auf ein leeres Ereignis automatisch eines erzeugen und den Quelltext-Editor an dieser Position öffnen, in Lazarus gibt es alternativ dazu eine Schaltfläche auf der rechten Seite der ausgewählten Drop-down-Liste, die diese Aktion ebenfalls ausführt.
1331323. In Delphi müssen Sie den Namen eines Ereignisses in der Editierzeile manuell löschen, um Anhänge zu entfernen. In Lazarus können Sie mittels Drop-down "keine" auswählen.
1341334. Ähnlich wie bei Ereignissen, wird ein Doppelklick auf normale Eigenschaften wie 'boolean' nicht den Wert ändern. Sie müssen ihn aus einer Drop-down-Liste wählen. Und um solche mit einem zugeordneten Editorformular zu öffnen, müssen Sie auf den '...'-Button rechts vom Edit/Drop-down klicken.
135134
136135#### Packages
137136
138137F: Kann Lazarus Delphi-Packages installieren und verwenden?
139138
140139A: Nein, weil diese auf die "Delphi Compiler Magie" angewiesen sind.
141140
142141F: Brauchen wir speziell für Lazarus erstellte Packages?
143142
144143A: Ja. Erzeugen Sie ein neues Package, speichern Sie es im Package-Quellen-Verzeichnis (normalerweise das selbe Verzeichnis wie das der .dpk Datei), fügen Sie die LCL als benötigtes Paket und schließlich die .pas Dateien selbst hinzu. Sie können es installieren oder es ab jetzt in ihren Projekten verwenden. Es gibt einige Unterschiede zwischen Lazarus- und Delphi-Packages, daher lesen Sie bitte
145144
146145\- die docs/Packages.txt in den Lazarus Quellen.
147146
148147### VCL -\> LCL
149148
150149Obwohl die VCL und die LCL beide meist den selben Zwecken dienen - dem einer objekt-orientierten Komponenten-Hierarchie ausgerichtet auf Rapid Application Development - sind sie nicht identisch. Während zum Beispiel die VCL viele nicht-visuelle Komponenten enthält, versucht die LCL nur visuelle Komponenten zu liefern, während die meisten nicht-visuellen Komponenten (wie zum Beispiel db access) von der FCL zur Verfügung gestellt werden, die in [[Free Pascal/de|Free Pascal]] enthalten ist.
151150
152151Zusätzlich mögen viele Bedienelemente, die in der VCL enthalten sind, nicht in der LCL existieren, oder umgekehrt. Sogar wenn Bedienelemente in beiden existieren, sind VCL und LCL keine echten Klone. Und deshalb müssen Änderungen gemacht werden in Anwendungen, Komponenten und Bedienelementen, wenn sie portiert werden.
153152
154153Das Folgende ist eine unvollständige Beschreibung der wichtigsten Unterschiede oder Inkompatibilitäten zwischen Delphi und Lazarus für Delphi-Benutzer. Es behandelt hauptsächlich die Unterschiede der VCL von D4, teilweise aber auch D5, D6, oder D7, mit der gegenwärtigen LCL, wie sie im SVN vorliegt. Insoweit können Unterschiede zu den von Ihnen verwendeten Versionen von Delphi und LCL bestehen. Sollten Ihnen Unterschiede oder Ungenauigkeiten zwischen dem Folgenden und der aktuellen LCL oder Ihrem Delphi auffallen, dann bitten wir Sie, den vorliegenden Text entsprechend zu modifizieren oder neue Abschnitte anzufügen. Wir möchten diese Beschreibung so umfassend und aktuell wie möglich für alle Lazarus-User zur Verfügung stellen.
155154
156155#### TControl.Font/TControl.ParentFont
157156
158157In der VCL ist es ziemlich einfach und normal, einen spezifischen Schriftart-Namen und Schriftart-Eigenschaften wie 'fett' und 'kursiv' für die Bedienelemente zu benutzen. In aller Regel werden diese Voreinstellungen auch entsprechend verwendet. Im laufenden Programm können sich diese Einstellungen von den Vorgaben von Windows unterscheiden. Ferner wird die TControl.ParentFont Eigenschaft mitgeliefert, die sicher stellt, dass ein Bedienelement immer der Schriftart seiner parent's folgt.
159158
160159Dies trifft in der LCL nicht immer zu. Die LCL als cross-Plattform/cross-Interface hingegen, benutzt das Widget-Toolset, das aktuell auf dem benutztem Betriebssystem verwendet wird. Wenn ihr Desktop also gerade das GTK Interface benutzt, so wird LCL immer die Themes und spezifischen Schriftarten für Schaltflächen des GTK Widget-Toolset benutzen.
161160
162161Das bedeutet, dass die meisten LCL Bedienelemente dem Desktop-Design des Zielrechners entsprechen werden. Das 'Look and feel' Ihrer Programmoberfläche kann sich also auf verschiedenen Zielrechnern auch entsprechend der Desktop-Einstellungen ändern.
163162
164163#### Bedienelemente ziehen und andocken
165164
166165In der VCL implementieren die meisten (Win-)Bedienelemente Methoden und Callback-Funktionen für die Handhabung des Ziehens (dragging) und Andockens von Bedienelementen, z.B. Ziehen eines Bedienelements von einem Panel und Andocken an einem anderen Panel zur Laufzeit.
167166
168167Diese Funktionalität ist in der LCL derzeit noch nicht implementiert/beendet. Sie befindet sich gegenwärtig im Anfangsstadium der Planung und stellt schon einen Teil der Kompatibilität für diesen Verhalten bereit, wenn auch nicht in exakt der selben Art und Weise.
169168
170169Das bedeutet derzeit, dass **kein** Bedienelement die folgenden TControl Funktionen, Prozeduren, Eigenschaften oder Ereignisse erben/benutzen wird -
171170
172171``` pascal
173172Protected
174173 function GetDockEdge(MousePos: TPoint): TAlign;
175174 function GetDragImages: TDragImageList;
176175 function GetFloating: Boolean;
177176 function GetFloatingDockSiteClass: TWinControlClass;
178177 procedure DoEndDrag(Target:TObject); X, Y: Integer);
179178 procedure DockTrackNoTarget(Source: TDragDockObject; X, Y: Integer);
180179 procedure DoEndDock(Target: TObject; X, Y: Integer);
181180 procedure DoDock(NewDockSite: TWinControl; var ARect: TRect);
182181 procedure DoStartDock(var DragObject: TDragObject);
183182 procedure DragCanceled;
184183 procedure DragOver(Source: TObject; X, Y: Integer; State: TDragState;
185184 var Accept: Boolean);
186185 procedure DoEndDrag(Target: TObject; X, Y: Integer);
187186 procedure DoStartDrag(var DragObject: TDragObject);
188187 procedure DrawDragDockImage(DragDockObject: TDragDockObject);
189188 procedure EraseDragDockImage(DragDockObject: TDragDockObject);
190189 procedure PositionDockRect(DragDockObject: TDragDockObject);
191190 procedure SetDragMode(Value: TDragMode);
192191 property DragKind: TDragKind;
193192 property DragCursor: TCursor;
194193 property DragMode: TDragMode;
195194 property OnDragDrop: TDragDropEvent;
196195 property OnDragOver: TDragOverEvent;
197196 property OnEndDock: TEndDragEvent;
198197 property OnEndDrag: TEndDragEvent;
199198 property OnStartDock: TStartDockEvent;
200199 property OnStartDrag: TStartDragEvent;
201200public
202201 function Dragging: Boolean;
203202 function ManualDock(NewDockSite: TWinControl; DropControl: TControl;
204203 ControlSide: TAlign): Boolean;
205204 function ManualFloat(ScreenPos: TRect): Boolean;
206205 function ReplaceDockedControl(Control: TControl; NewDockSite: TWinControl;
207206 DropControl: TControl; ControlSide: TAlign): Boolean;
208207 procedure BeginDrag(Immediate: Boolean; Threshold: Integer);
209208 procedure Dock(NewDockSite: TWinControl; ARect: TRect);
210209 procedure DragDrop(Source: TObject; X, Y: Integer);
211210 procedure EndDrag(Drop: Boolean);
212211 property DockOrientation: TDockOrientation;
213212 property Floating: Boolean;
214213 property FloatingDockSiteClass: TWinControlClass;
215214 property HostDockSite: TWinControl;
216215 property LRDockWidth: Integer;
217216 property TBDockHeight: Integer;
218217 property UndockHeight: Integer;
219218 property UndockWidth: Integer;
220219```
221220
222221dass die folgenden Klassen nicht existieren/nicht verwendet werden können -
223222
224223``` pascal
225224TDragImageList = class(TCustomImageList)
226225TDockZone = class
227226TDockTree = class(TInterfacedObject, IDockManager)
228227TDragObject = class(TObject)
229228TBaseDragControlObject = class(TDragObject)
230229TDragControlObject = class(TBaseDragControlObject)
231230TDragDockObject = class(TBaseDragControlObject)
232231```
233232
234233und dass die folgenden Funktionen auch nicht benutzbar/inkompatibel sind -
235234
236235``` pascal
237236function FindDragTarget(const Pos: TPoint;
238237 AllowDisabled: Boolean) : TControl;
239238procedure CancelDrag;
240239function IsDragObject(sender: TObject): Boolean;
241240```
242241
243242Der Start des Docking-Managers wird hier beschrieben: [[Anchor Docking]]
244243
245244#### TEdit/TCustomEdit
246245
247246Die Edit-Bedienelemente, die grundsätzlich gleich in der LCL wie in der VCL funktionieren, besitzen einige Besonderheiten, die bei einer Konvertierung beachtet werden sollten -
248247
2492481. Wegen Restriktionen in den Interfaces, arbeitet TEdit.PasswordChar noch nicht mit allen Interfaces (obwohl es mit der Zeit möglich sein wird), anstelle von TCustomEdit.EchoMode sollte emPassword benutzt werden, falls der Text verborgen werden muss.
2502492. On Drag/Dock Ereignisse sind noch nicht implementiert. Für mehr Informationen schauen Sie bitte im vorherigen Abschnitt Bedienelemente ziehen und andocken nach.
2512503. Font-Eigenschaften werden üblicherweise für die Interface-Konsistenz ignoriert, für eine detaillierte Beschreibung schauen Sie bitte TControl.Font/TControl.ParentFont an.
252251
253252#### TDBImage
254253
255254Delphi und Lazarus haben beide ein TDBImage-Steuerelement, das Bilder anzeigt, die in einem Datenbankfeld gespeichert sind. Zusätzlich speichert Lazarus Informationen über den Bildtyp in dem Datenbankfeld vor den eigentlichen Bilddaten. Siehe die Prozedur *TDBImage.UpdateData* Dies bedeutet, dass die Implementationen von Delphi und Lazarus nicht kompatibel zueinander sind.
256255
257256Anmerkung: Die aktuelle Entwicklerversion (r40924, April 2013) Lazarus trunk hat Änderungen implementiert, die ein Delphi-kompatibles Verhalten gestatten. Bitte sehen Sie [[Lazarus 1.2.0 release notes|Lazarus_1.2.0_release_notes#TDBImage]] für Details.
258257
259258### (optional) TSplitter -\> TPairSplitter
260259
261260**Bitte verbessern Sie mich**
262261
263262Es gibt jetzt ein [[TSplitter/de|TSplitter]] Bedienelement in der LCL, so dass kein Bedarf zum Konvertieren besteht.
264263
265264Nichtsdestoweniger, wenn Sie es doch wollen, hier ist es beschrieben:
266265
267266Das Folgende basiert lose auf den Fragen von Vincent Snijders in der Mailingliste und Antworten von [Andrew Johnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson):
268267
269268Das in Delphi enthaltene "Splitting"-Control, das zwischen zwei Komponenten platziert werden kann, um dem einen oder anderen mehr Platz zu geben, wird in der VCL durch einen TSplitter realisiert. Dieses wird oft benutzt, beispielsweise in Delphi zwischen dem angedockten Codeexplorer und dem Quelltextfenster.
270269
271270In der LCL gibt es dafür allerdings ein eigenes Control, den TPairSplitter, das den selben Zweck erfüllt, wie der TSplitter, allerdings zu diesem nicht kompatibel ist. Es sind also, wenn Sie Ihr Programm von einem TSplitter auf einen TPairsplitter ändern wollen, einige Anpassungen nötig.
272271
273272Was sind nun genau die Unterschiede?
274273
275274Der größte Unterschied ist, dass ein TSplitter keine "Kinder" besitzt. Stattdessen wird es zwischen zwei Controls positioniert, die mittels Align ausgerichtet werden. So erlaubt er während der Laufzeit die dynamische Größenanpassung dieser Controls. Um dies zu ermöglichen, muss links und rechts ein mittels Align ausgerichtetes Control vorhanden sein. (Beispielsweise ein links-ausgerichtetes Panel + ein links-ausgerichteter TSplitter + ein client-ausgerichtetes Panel).
276275
277276In der LCL ist der TPairSplitter ein spezielles Control mit zwei Panels. Er kann nur nützlich werden, wenn die zu verändernden Controls auf beiden Panels liegen. Er vergrößert bzw. verkleinert also die beiden Panels, unabhängig davon, ob sie Komponenten enthalten oder nicht.
278277
279278Der andere entscheidende Unterschied ist, dass der TSplitter der VCL seine Position relativ zu den anderen Komponenten verändert, abhängig von seiner Split-Position.
280279
281280In der LCL dagegen besitzt der TPairSplitter durch die Panels eine absolute Position, wie andere Controls auch, die sich nach den Eigenschaften top und left richtet. So verändert sich die Position nicht automatisch, wenn die Split-Position verändert wird. Ist dies erwünscht, ist es nötig, einen entsprechenden Callback zu setzen und die entsprechenden Einstellungen zu setzen.
282281
283282Beispielsweise befindet sich in einem verticalen TPairSplitter eine Komponente mit alClient. Soll diese automatisch bei Größenänderungen des Formulars im Verhältnis angepasst werden, ist es nötig, im OnResize-Ereignis des Formulars die neue Position zu setzen:
284283
285284` PairSplitter.Position := PairSplitter.Width - PairSplitter.Position; `
286285
287286Wie kann ich nun existierenden Code, der TSplitter verwendet, zu TPairSplitter konvertieren?
288287
289288Wenn der Splitter und die Bedienelemente in einer effektiven Funktion (wie form oncreate) erzeugt wurden, sollte die Konvertierung nicht zu schwierig sein, hauptsächlich Reorganisieren des Codes, um die Bedienelemente in der Reihenfolge der neuen Hierarchie zu erzeugen und die Vorgänger der Nachfolgerbedienelemente zu setzen, um in die left/top und right/bottom Eigenschaften des PairSplitter aufzuteilen. Ein Beispiel für die Änderungen ist -
290289
291-<table>
292-<tbody>
293-<tr>
294-<td class="header"><p><strong>VCL</strong></p></td>
295-<td class="header"><p><strong>LCL</strong></p></td>
296-</tr>
297-<tr>
298-<td class="code"><div class="sourceCode" id="cb1"><pre class="sourceCode pascal"><code class="sourceCode pascal"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="kw">var</span> </span>
299-<span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a> BottomPanel: TPanel;</span>
300-<span id="cb1-3"><a href="#cb1-3" aria-hidden="true" tabindex="-1"></a> VerticalSplitter: TSplitter;</span>
301-<span id="cb1-4"><a href="#cb1-4" aria-hidden="true" tabindex="-1"></a> LeftPanel: TPanel;</span>
302-<span id="cb1-5"><a href="#cb1-5" aria-hidden="true" tabindex="-1"></a> HorizontalSplitter: TSplitter;</span>
303-<span id="cb1-6"><a href="#cb1-6" aria-hidden="true" tabindex="-1"></a> MainPanel: TPanel;</span>
304-<span id="cb1-7"><a href="#cb1-7" aria-hidden="true" tabindex="-1"></a></span>
305-<span id="cb1-8"><a href="#cb1-8" aria-hidden="true" tabindex="-1"></a><span class="kw">begin</span></span>
306-<span id="cb1-9"><a href="#cb1-9" aria-hidden="true" tabindex="-1"></a> BottomPanel:= TPanel.Create(<span class="kw">Self</span>);</span>
307-<span id="cb1-10"><a href="#cb1-10" aria-hidden="true" tabindex="-1"></a> <span class="kw">with</span> (BottomPanel) <span class="kw">do</span></span>
308-<span id="cb1-11"><a href="#cb1-11" aria-hidden="true" tabindex="-1"></a> <span class="kw">begin</span></span>
309-<span id="cb1-12"><a href="#cb1-12" aria-hidden="true" tabindex="-1"></a> Parent:= <span class="kw">Self</span>;</span>
310-<span id="cb1-13"><a href="#cb1-13" aria-hidden="true" tabindex="-1"></a> Height:= <span class="dv">75</span>;</span>
311-<span id="cb1-14"><a href="#cb1-14" aria-hidden="true" tabindex="-1"></a> Align:= alBottom;</span>
312-<span id="cb1-15"><a href="#cb1-15" aria-hidden="true" tabindex="-1"></a> <span class="kw">end</span>;</span>
313-<span id="cb1-16"><a href="#cb1-16" aria-hidden="true" tabindex="-1"></a></span>
314-<span id="cb1-17"><a href="#cb1-17" aria-hidden="true" tabindex="-1"></a> VerticalSplitter:= TSplitter.Create(<span class="kw">Self</span>);</span>
315-<span id="cb1-18"><a href="#cb1-18" aria-hidden="true" tabindex="-1"></a> <span class="kw">with</span> (VerticalSplitter) <span class="kw">do</span></span>
316-<span id="cb1-19"><a href="#cb1-19" aria-hidden="true" tabindex="-1"></a> <span class="kw">begin</span></span>
317-<span id="cb1-20"><a href="#cb1-20" aria-hidden="true" tabindex="-1"></a> Parent:= <span class="kw">Self</span>;</span>
318-<span id="cb1-21"><a href="#cb1-21" aria-hidden="true" tabindex="-1"></a> Align:= alBottom;</span>
319-<span id="cb1-22"><a href="#cb1-22" aria-hidden="true" tabindex="-1"></a> <span class="kw">end</span>;</span>
320-<span id="cb1-23"><a href="#cb1-23" aria-hidden="true" tabindex="-1"></a></span>
321-<span id="cb1-24"><a href="#cb1-24" aria-hidden="true" tabindex="-1"></a> HorizontalSplitter:= TSplitter.Create(<span class="kw">Self</span>);</span>
322-<span id="cb1-25"><a href="#cb1-25" aria-hidden="true" tabindex="-1"></a> <span class="kw">with</span> (HorizontalSplitter) <span class="kw">do</span></span>
323-<span id="cb1-26"><a href="#cb1-26" aria-hidden="true" tabindex="-1"></a> <span class="kw">begin</span></span>
324-<span id="cb1-27"><a href="#cb1-27" aria-hidden="true" tabindex="-1"></a> Parent:= <span class="kw">Self</span>;</span>
325-<span id="cb1-28"><a href="#cb1-28" aria-hidden="true" tabindex="-1"></a> align:= alLeft;</span>
326-<span id="cb1-29"><a href="#cb1-29" aria-hidden="true" tabindex="-1"></a> <span class="kw">end</span>;</span>
327-<span id="cb1-30"><a href="#cb1-30" aria-hidden="true" tabindex="-1"></a></span>
328-<span id="cb1-31"><a href="#cb1-31" aria-hidden="true" tabindex="-1"></a> LeftPanel:= TPanel.Create(<span class="kw">Self</span>);</span>
329-<span id="cb1-32"><a href="#cb1-32" aria-hidden="true" tabindex="-1"></a> <span class="kw">with</span> (LeftPanel) <span class="kw">do</span></span>
330-<span id="cb1-33"><a href="#cb1-33" aria-hidden="true" tabindex="-1"></a> <span class="kw">begin</span></span>
331-<span id="cb1-34"><a href="#cb1-34" aria-hidden="true" tabindex="-1"></a> Parent:= <span class="kw">Self</span>;</span>
332-<span id="cb1-35"><a href="#cb1-35" aria-hidden="true" tabindex="-1"></a> Width:= <span class="dv">125</span>;</span>
333-<span id="cb1-36"><a href="#cb1-36" aria-hidden="true" tabindex="-1"></a> Align:= alLeft;</span>
334-<span id="cb1-37"><a href="#cb1-37" aria-hidden="true" tabindex="-1"></a> <span class="kw">end</span>;</span>
335-<span id="cb1-38"><a href="#cb1-38" aria-hidden="true" tabindex="-1"></a></span>
336-<span id="cb1-39"><a href="#cb1-39" aria-hidden="true" tabindex="-1"></a> MainPanel:= TPanel.Create(<span class="kw">Self</span>);</span>
337-<span id="cb1-40"><a href="#cb1-40" aria-hidden="true" tabindex="-1"></a> <span class="kw">with</span> (MainPanel) <span class="kw">do</span></span>
338-<span id="cb1-41"><a href="#cb1-41" aria-hidden="true" tabindex="-1"></a> <span class="kw">begin</span></span>
339-<span id="cb1-42"><a href="#cb1-42" aria-hidden="true" tabindex="-1"></a> Parent:= <span class="kw">Self</span>;</span>
340-<span id="cb1-43"><a href="#cb1-43" aria-hidden="true" tabindex="-1"></a> Align:= alClient;</span>
341-<span id="cb1-44"><a href="#cb1-44" aria-hidden="true" tabindex="-1"></a> Caption:= <span class="st">&#39;Hello&#39;</span>;</span>
342-<span id="cb1-45"><a href="#cb1-45" aria-hidden="true" tabindex="-1"></a> <span class="kw">end</span>;</span>
343-<span id="cb1-46"><a href="#cb1-46" aria-hidden="true" tabindex="-1"></a><span class="kw">end</span>;</span></code></pre></div></td>
344-<td class="code"><div class="sourceCode" id="cb2"><pre class="sourceCode pascal"><code class="sourceCode pascal"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a><span class="kw">var</span></span>
345-<span id="cb2-2"><a href="#cb2-2" aria-hidden="true" tabindex="-1"></a> BottomPanel: TPanel;</span>
346-<span id="cb2-3"><a href="#cb2-3" aria-hidden="true" tabindex="-1"></a> VerticalSplitter: TPairSplitter;</span>
347-<span id="cb2-4"><a href="#cb2-4" aria-hidden="true" tabindex="-1"></a> LeftPanel: TPanel;</span>
348-<span id="cb2-5"><a href="#cb2-5" aria-hidden="true" tabindex="-1"></a> HorizontalSplitter: TPairSplitter;</span>
349-<span id="cb2-6"><a href="#cb2-6" aria-hidden="true" tabindex="-1"></a> MainPanel: TPanel;</span>
350-<span id="cb2-7"><a href="#cb2-7" aria-hidden="true" tabindex="-1"></a></span>
351-<span id="cb2-8"><a href="#cb2-8" aria-hidden="true" tabindex="-1"></a><span class="kw">begin</span></span>
352-<span id="cb2-9"><a href="#cb2-9" aria-hidden="true" tabindex="-1"></a> VerticalSplitter:= TPairSplitter.Create(<span class="kw">Self</span>);</span>
353-<span id="cb2-10"><a href="#cb2-10" aria-hidden="true" tabindex="-1"></a> <span class="kw">with</span> (VerticalSplitter) <span class="kw">do</span></span>
354-<span id="cb2-11"><a href="#cb2-11" aria-hidden="true" tabindex="-1"></a> <span class="kw">begin</span></span>
355-<span id="cb2-12"><a href="#cb2-12" aria-hidden="true" tabindex="-1"></a> Parent:= <span class="kw">Self</span>;</span>
356-<span id="cb2-13"><a href="#cb2-13" aria-hidden="true" tabindex="-1"></a> Align:= alClient;</span>
357-<span id="cb2-14"><a href="#cb2-14" aria-hidden="true" tabindex="-1"></a> Width:= <span class="kw">Self</span>.Width;</span>
358-<span id="cb2-15"><a href="#cb2-15" aria-hidden="true" tabindex="-1"></a> Height:= <span class="kw">Self</span>.Height;</span>
359-<span id="cb2-16"><a href="#cb2-16" aria-hidden="true" tabindex="-1"></a> SplitterType:= pstVertical;</span>
360-<span id="cb2-17"><a href="#cb2-17" aria-hidden="true" tabindex="-1"></a> Position:= Height - <span class="dv">75</span>;</span>
361-<span id="cb2-18"><a href="#cb2-18" aria-hidden="true" tabindex="-1"></a> Sides[<span class="dv">0</span>].Width:= Width;</span>
362-<span id="cb2-19"><a href="#cb2-19" aria-hidden="true" tabindex="-1"></a> Sides[<span class="dv">0</span>].Height:= Position;</span>
363-<span id="cb2-20"><a href="#cb2-20" aria-hidden="true" tabindex="-1"></a> <span class="kw">end</span>;</span>
364-<span id="cb2-21"><a href="#cb2-21" aria-hidden="true" tabindex="-1"></a></span>
365-<span id="cb2-22"><a href="#cb2-22" aria-hidden="true" tabindex="-1"></a> HorizontalSplitter:= TPairSplitter.Create(<span class="kw">Self</span>);</span>
366-<span id="cb2-23"><a href="#cb2-23" aria-hidden="true" tabindex="-1"></a> <span class="kw">with</span> (HorizontalSplitter) <span class="kw">do</span></span>
367-<span id="cb2-24"><a href="#cb2-24" aria-hidden="true" tabindex="-1"></a> <span class="kw">begin</span></span>
368-<span id="cb2-25"><a href="#cb2-25" aria-hidden="true" tabindex="-1"></a> Parent:= VerticalSplitter.Sides[<span class="dv">0</span>];</span>
369-<span id="cb2-26"><a href="#cb2-26" aria-hidden="true" tabindex="-1"></a> Width:= <span class="kw">Self</span>.Width;</span>
370-<span id="cb2-27"><a href="#cb2-27" aria-hidden="true" tabindex="-1"></a> Height:= VerticalSplitter.Position;</span>
371-<span id="cb2-28"><a href="#cb2-28" aria-hidden="true" tabindex="-1"></a> align:= alClient;</span>
372-<span id="cb2-29"><a href="#cb2-29" aria-hidden="true" tabindex="-1"></a> SplitterType:= pstHorizontal;</span>
373-<span id="cb2-30"><a href="#cb2-30" aria-hidden="true" tabindex="-1"></a> Position:= <span class="dv">125</span>;</span>
374-<span id="cb2-31"><a href="#cb2-31" aria-hidden="true" tabindex="-1"></a> <span class="kw">end</span>;</span>
375-<span id="cb2-32"><a href="#cb2-32" aria-hidden="true" tabindex="-1"></a></span>
376-<span id="cb2-33"><a href="#cb2-33" aria-hidden="true" tabindex="-1"></a> LeftPanel:= TPanel.Create(<span class="kw">Self</span>);</span>
377-<span id="cb2-34"><a href="#cb2-34" aria-hidden="true" tabindex="-1"></a> <span class="kw">with</span> (LeftPanel) <span class="kw">do</span></span>
378-<span id="cb2-35"><a href="#cb2-35" aria-hidden="true" tabindex="-1"></a> <span class="kw">begin</span></span>
379-<span id="cb2-36"><a href="#cb2-36" aria-hidden="true" tabindex="-1"></a> Parent:= HorizontalSplitter.Sides[<span class="dv">0</span>];</span>
380-<span id="cb2-37"><a href="#cb2-37" aria-hidden="true" tabindex="-1"></a> Align:= alClient;</span>
381-<span id="cb2-38"><a href="#cb2-38" aria-hidden="true" tabindex="-1"></a> <span class="kw">end</span>;</span>
382-<span id="cb2-39"><a href="#cb2-39" aria-hidden="true" tabindex="-1"></a></span>
383-<span id="cb2-40"><a href="#cb2-40" aria-hidden="true" tabindex="-1"></a> MainPanel:= TPanel.Create(<span class="kw">Self</span>);</span>
384-<span id="cb2-41"><a href="#cb2-41" aria-hidden="true" tabindex="-1"></a> <span class="kw">with</span> (MainPanel) <span class="kw">do</span></span>
385-<span id="cb2-42"><a href="#cb2-42" aria-hidden="true" tabindex="-1"></a> <span class="kw">begin</span></span>
386-<span id="cb2-43"><a href="#cb2-43" aria-hidden="true" tabindex="-1"></a> Parent:= HorizontalSplitter.Sides[<span class="dv">1</span>];</span>
387-<span id="cb2-44"><a href="#cb2-44" aria-hidden="true" tabindex="-1"></a> Align:= alClient;</span>
388-<span id="cb2-45"><a href="#cb2-45" aria-hidden="true" tabindex="-1"></a> Caption:= <span class="st">&#39;Hello&#39;</span>;</span>
389-<span id="cb2-46"><a href="#cb2-46" aria-hidden="true" tabindex="-1"></a> <span class="kw">end</span>;</span>
390-<span id="cb2-47"><a href="#cb2-47" aria-hidden="true" tabindex="-1"></a></span>
391-<span id="cb2-48"><a href="#cb2-48" aria-hidden="true" tabindex="-1"></a> BottomPanel:= TPanel.Create(<span class="kw">Self</span>);</span>
392-<span id="cb2-49"><a href="#cb2-49" aria-hidden="true" tabindex="-1"></a> <span class="kw">with</span> (BottomPanel) <span class="kw">do</span></span>
393-<span id="cb2-50"><a href="#cb2-50" aria-hidden="true" tabindex="-1"></a> <span class="kw">begin</span></span>
394-<span id="cb2-51"><a href="#cb2-51" aria-hidden="true" tabindex="-1"></a> Parent:= VerticalSplitter.Sides[<span class="dv">1</span>];</span>
395-<span id="cb2-52"><a href="#cb2-52" aria-hidden="true" tabindex="-1"></a> Align:= alClient;</span>
396-<span id="cb2-53"><a href="#cb2-53" aria-hidden="true" tabindex="-1"></a> <span class="kw">end</span>;</span>
397-<span id="cb2-54"><a href="#cb2-54" aria-hidden="true" tabindex="-1"></a><span class="kw">end</span>;</span></code></pre></div></td>
398-</tr>
399-</tbody>
400-</table>
290+**VCL**
401291
292+**LCL**
293+
294+``` pascal
295+var
296+ BottomPanel: TPanel;
297+ VerticalSplitter: TSplitter;
298+ LeftPanel: TPanel;
299+ HorizontalSplitter: TSplitter;
300+ MainPanel: TPanel;
301+
302+begin
303+ BottomPanel:= TPanel.Create(Self);
304+ with (BottomPanel) do
305+ begin
306+ Parent:= Self;
307+ Height:= 75;
308+ Align:= alBottom;
309+ end;
310+
311+ VerticalSplitter:= TSplitter.Create(Self);
312+ with (VerticalSplitter) do
313+ begin
314+ Parent:= Self;
315+ Align:= alBottom;
316+ end;
317+
318+ HorizontalSplitter:= TSplitter.Create(Self);
319+ with (HorizontalSplitter) do
320+ begin
321+ Parent:= Self;
322+ align:= alLeft;
323+ end;
324+
325+ LeftPanel:= TPanel.Create(Self);
326+ with (LeftPanel) do
327+ begin
328+ Parent:= Self;
329+ Width:= 125;
330+ Align:= alLeft;
331+ end;
332+
333+ MainPanel:= TPanel.Create(Self);
334+ with (MainPanel) do
335+ begin
336+ Parent:= Self;
337+ Align:= alClient;
338+ Caption:= 'Hello';
339+ end;
340+end;
341+```
342+
343+``` pascal
344+var
345+ BottomPanel: TPanel;
346+ VerticalSplitter: TPairSplitter;
347+ LeftPanel: TPanel;
348+ HorizontalSplitter: TPairSplitter;
349+ MainPanel: TPanel;
350+
351+begin
352+ VerticalSplitter:= TPairSplitter.Create(Self);
353+ with (VerticalSplitter) do
354+ begin
355+ Parent:= Self;
356+ Align:= alClient;
357+ Width:= Self.Width;
358+ Height:= Self.Height;
359+ SplitterType:= pstVertical;
360+ Position:= Height - 75;
361+ Sides[0].Width:= Width;
362+ Sides[0].Height:= Position;
363+ end;
364+
365+ HorizontalSplitter:= TPairSplitter.Create(Self);
366+ with (HorizontalSplitter) do
367+ begin
368+ Parent:= VerticalSplitter.Sides[0];
369+ Width:= Self.Width;
370+ Height:= VerticalSplitter.Position;
371+ align:= alClient;
372+ SplitterType:= pstHorizontal;
373+ Position:= 125;
374+ end;
375+
376+ LeftPanel:= TPanel.Create(Self);
377+ with (LeftPanel) do
378+ begin
379+ Parent:= HorizontalSplitter.Sides[0];
380+ Align:= alClient;
381+ end;
382+
383+ MainPanel:= TPanel.Create(Self);
384+ with (MainPanel) do
385+ begin
386+ Parent:= HorizontalSplitter.Sides[1];
387+ Align:= alClient;
388+ Caption:= 'Hello';
389+ end;
390+
391+ BottomPanel:= TPanel.Create(Self);
392+ with (BottomPanel) do
393+ begin
394+ Parent:= VerticalSplitter.Sides[1];
395+ Align:= alClient;
396+ end;
397+end;
398+```
399+
402400Wie man sieht, ist es ziemlich konsistent mit den meisten Kontrollhierarchien. Wenn Sie mit DFM vertraut sind, sollten die notwendigen Änderungen für eine DFM -\> LFM Konversion offensichtlich sein, da sie die selbe Art von Änderungen in Parent/Owner darstellen.
403401
404402Das obige Beispiel würde in etwa so aussehen -
405403
406-<table>
407-<tbody>
408-<tr>
409-<td class="header"><p><strong>Delphi DFM</strong></p>
410-<div style="font-weight: normal">
411-<p><strong>(weitere Werte wurden entfernt)</strong></p></td>
412-<td class="header"><p><strong>Lazarus LFM</strong></p>
413-<div style="font-weight: normal">
414-<p><strong>(width, height, etc. entfernt)</strong></p></td>
415-</tr>
416-<tr>
417-<td class="code"><div class="sourceCode" id="cb1"><pre class="sourceCode pascal"><code class="sourceCode pascal"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="kw">object</span> VerticalSplitter: TSplitter</span>
418-<span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a> Height = <span class="dv">3</span></span>
419-<span id="cb1-3"><a href="#cb1-3" aria-hidden="true" tabindex="-1"></a> Cursor = crVSplit</span>
420-<span id="cb1-4"><a href="#cb1-4" aria-hidden="true" tabindex="-1"></a> Align = alBottom</span>
421-<span id="cb1-5"><a href="#cb1-5" aria-hidden="true" tabindex="-1"></a><span class="kw">end</span></span>
422-<span id="cb1-6"><a href="#cb1-6" aria-hidden="true" tabindex="-1"></a><span class="kw">object</span> HorizontalSplitter: TSplitter</span>
423-<span id="cb1-7"><a href="#cb1-7" aria-hidden="true" tabindex="-1"></a> Width = <span class="dv">3</span></span>
424-<span id="cb1-8"><a href="#cb1-8" aria-hidden="true" tabindex="-1"></a> Align = alLeft</span>
425-<span id="cb1-9"><a href="#cb1-9" aria-hidden="true" tabindex="-1"></a><span class="kw">end</span></span>
426-<span id="cb1-10"><a href="#cb1-10" aria-hidden="true" tabindex="-1"></a><span class="kw">object</span> BottomPanel: TPanel</span>
427-<span id="cb1-11"><a href="#cb1-11" aria-hidden="true" tabindex="-1"></a> Height = <span class="dv">75</span></span>
428-<span id="cb1-12"><a href="#cb1-12" aria-hidden="true" tabindex="-1"></a> Align = alBottom</span>
429-<span id="cb1-13"><a href="#cb1-13" aria-hidden="true" tabindex="-1"></a><span class="kw">end</span></span>
430-<span id="cb1-14"><a href="#cb1-14" aria-hidden="true" tabindex="-1"></a><span class="kw">object</span> LeftPanel: TPanel</span>
431-<span id="cb1-15"><a href="#cb1-15" aria-hidden="true" tabindex="-1"></a> Width = <span class="dv">125</span></span>
432-<span id="cb1-16"><a href="#cb1-16" aria-hidden="true" tabindex="-1"></a> Align = alLeft</span>
433-<span id="cb1-17"><a href="#cb1-17" aria-hidden="true" tabindex="-1"></a><span class="kw">end</span></span>
434-<span id="cb1-18"><a href="#cb1-18" aria-hidden="true" tabindex="-1"></a><span class="kw">object</span> MainPanel: TPanel</span>
435-<span id="cb1-19"><a href="#cb1-19" aria-hidden="true" tabindex="-1"></a> Align = alClient</span>
436-<span id="cb1-20"><a href="#cb1-20" aria-hidden="true" tabindex="-1"></a><span class="kw">end</span></span></code></pre></div></td>
437-<td class="code"><div class="sourceCode" id="cb2"><pre class="sourceCode pascal"><code class="sourceCode pascal"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a><span class="kw">object</span> VerticalSplitter: TPairSplitter</span>
438-<span id="cb2-2"><a href="#cb2-2" aria-hidden="true" tabindex="-1"></a> Align = alClient</span>
439-<span id="cb2-3"><a href="#cb2-3" aria-hidden="true" tabindex="-1"></a> SplitterType = pstVertical</span>
440-<span id="cb2-4"><a href="#cb2-4" aria-hidden="true" tabindex="-1"></a> Position = <span class="dv">225</span></span>
441-<span id="cb2-5"><a href="#cb2-5" aria-hidden="true" tabindex="-1"></a> Height = <span class="dv">300</span></span>
442-<span id="cb2-6"><a href="#cb2-6" aria-hidden="true" tabindex="-1"></a> Width = <span class="dv">400</span></span>
443-<span id="cb2-7"><a href="#cb2-7" aria-hidden="true" tabindex="-1"></a> <span class="kw">object</span> Pairsplitterside1: TPairSplitterIde</span>
444-<span id="cb2-8"><a href="#cb2-8" aria-hidden="true" tabindex="-1"></a> <span class="kw">object</span> HorizontalSplitter: TPairSplitter</span>
445-<span id="cb2-9"><a href="#cb2-9" aria-hidden="true" tabindex="-1"></a> Align = alClient</span>
446-<span id="cb2-10"><a href="#cb2-10" aria-hidden="true" tabindex="-1"></a> Position = <span class="dv">125</span></span>
447-<span id="cb2-11"><a href="#cb2-11" aria-hidden="true" tabindex="-1"></a> <span class="kw">object</span> Pairsplitterside3: TPairSplitterIde</span>
448-<span id="cb2-12"><a href="#cb2-12" aria-hidden="true" tabindex="-1"></a> Width = <span class="dv">125</span></span>
449-<span id="cb2-13"><a href="#cb2-13" aria-hidden="true" tabindex="-1"></a> <span class="kw">object</span> LeftPanel: TPanel</span>
450-<span id="cb2-14"><a href="#cb2-14" aria-hidden="true" tabindex="-1"></a> Align = alClient</span>
451-<span id="cb2-15"><a href="#cb2-15" aria-hidden="true" tabindex="-1"></a> Width = <span class="dv">125</span></span>
452-<span id="cb2-16"><a href="#cb2-16" aria-hidden="true" tabindex="-1"></a> <span class="kw">end</span></span>
453-<span id="cb2-17"><a href="#cb2-17" aria-hidden="true" tabindex="-1"></a> <span class="kw">end</span></span>
454-<span id="cb2-18"><a href="#cb2-18" aria-hidden="true" tabindex="-1"></a> <span class="kw">object</span> Pairsplitterside4: TPairSplitterIde</span>
455-<span id="cb2-19"><a href="#cb2-19" aria-hidden="true" tabindex="-1"></a> <span class="kw">object</span> MainPanel: TPanel</span>
456-<span id="cb2-20"><a href="#cb2-20" aria-hidden="true" tabindex="-1"></a> Align = alClient</span>
457-<span id="cb2-21"><a href="#cb2-21" aria-hidden="true" tabindex="-1"></a> <span class="kw">end</span></span>
458-<span id="cb2-22"><a href="#cb2-22" aria-hidden="true" tabindex="-1"></a> <span class="kw">end</span></span>
459-<span id="cb2-23"><a href="#cb2-23" aria-hidden="true" tabindex="-1"></a> <span class="kw">end</span></span>
460-<span id="cb2-24"><a href="#cb2-24" aria-hidden="true" tabindex="-1"></a> <span class="kw">end</span></span>
461-<span id="cb2-25"><a href="#cb2-25" aria-hidden="true" tabindex="-1"></a> <span class="kw">object</span> Pairsplitterside2: TPairSplitterIde</span>
462-<span id="cb2-26"><a href="#cb2-26" aria-hidden="true" tabindex="-1"></a> <span class="kw">object</span> BottomPanel: TPanel</span>
463-<span id="cb2-27"><a href="#cb2-27" aria-hidden="true" tabindex="-1"></a> Align = alClient</span>
464-<span id="cb2-28"><a href="#cb2-28" aria-hidden="true" tabindex="-1"></a> Height = <span class="dv">75</span></span>
465-<span id="cb2-29"><a href="#cb2-29" aria-hidden="true" tabindex="-1"></a> <span class="kw">end</span></span>
466-<span id="cb2-30"><a href="#cb2-30" aria-hidden="true" tabindex="-1"></a> <span class="kw">end</span></span>
467-<span id="cb2-31"><a href="#cb2-31" aria-hidden="true" tabindex="-1"></a><span class="kw">end</span></span></code></pre></div></td>
468-</tr>
469-</tbody>
470-</table>
404+**Delphi DFM**
405+
406+**(weitere Werte wurden entfernt)**
407+
408+**Lazarus LFM**
409+
410+**(width, height, etc. entfernt)**
411+
412+``` pascal
413+object VerticalSplitter: TSplitter
414+ Height = 3
415+ Cursor = crVSplit
416+ Align = alBottom
417+end
418+object HorizontalSplitter: TSplitter
419+ Width = 3
420+ Align = alLeft
421+end
422+object BottomPanel: TPanel
423+ Height = 75
424+ Align = alBottom
425+end
426+object LeftPanel: TPanel
427+ Width = 125
428+ Align = alLeft
429+end
430+object MainPanel: TPanel
431+ Align = alClient
432+end
433+```
434+
435+``` pascal
436+object VerticalSplitter: TPairSplitter
437+ Align = alClient
438+ SplitterType = pstVertical
439+ Position = 225
440+ Height = 300
441+ Width = 400
442+ object Pairsplitterside1: TPairSplitterIde
443+ object HorizontalSplitter: TPairSplitter
444+ Align = alClient
445+ Position = 125
446+ object Pairsplitterside3: TPairSplitterIde
447+ Width = 125
448+ object LeftPanel: TPanel
449+ Align = alClient
450+ Width = 125
451+ end
452+ end
453+ object Pairsplitterside4: TPairSplitterIde
454+ object MainPanel: TPanel
455+ Align = alClient
456+ end
457+ end
458+ end
459+ end
460+ object Pairsplitterside2: TPairSplitterIde
461+ object BottomPanel: TPanel
462+ Align = alClient
463+ Height = 75
464+ end
465+ end
466+end
467+```
471468
472469### TCustomTreeView/TTreeView
473470
474471Beide, VCL und die LCL, bieten eine TCustomTreeView/TTreeView Komponente, die für in Bäumen strukturierte Datenlisten mit mehrfachen Knoten und erweiterter Auswahl sowie für Bilderlisten benutzt wird. Und obwohl einige Features vergleichbar sind, sind nicht alle Eigenschaften völlig kompatibel. Hauptsächliche Unterschiede sind folgende -
475472
476473**Unvollständige Liste (sollte aktualisiert werden, um die TCustomTreeView-Markierungsfunktionen und geschützten Methoden zu enthalten)**
477474
4784751. Die LCL bietet TCustomTreeView.Options, eine Reihe von Optionen, die im Bedienelement eingestellt werden können, um sein Verhalten und Erscheinungbild ändern. Diese Optionen sind :
479476 - tvoAllowMultiselect - enables multi node select mode, equivalent to enabling TCustomTreeView.MultiSelect in the D6 VCL
480477 - tvoAutoExpand - Auto Expand nodes, equivalent to enabling TCustomTreeView.AutoExpand
481478 - tvoAutoInsertMark - Update the Drag preview on mouse move.
482479 - tvoAutoItemHeight - Passt die Item Höhen automatisch an.
483480 - tvoHideSelection - Markiert das gewählte Item nicht.
484481 - tvoHotTrack - use Hot Tracking, equivalent to enabling TCustomTreeview.HotTrack
485482 - tvoKeepCollapsedNodes - When shrinking/folding nodes, keep the child nodes
486483 - tvoReadOnly - make Treeview read only, equivalent to enabling TCustomTreeview.ReadOnly
487484 - tvoRightClickSelect - allow using Mouse Right Clicks to select nodes, equivalent to enabling TCustomTreeView.RightClickSelect
488485 - tvoRowSelect - Erlaubt das Auswählen von Zeilen, entsprechend der Ermöglichung von TCustomTreeView.RowSelect
489486 - tvoShowButtons - Zeigt Schaltflächen, entsprechend der Ermöglichung von TCustomTreeView.ShowButtons
490487 - tvoShowLines - show node lines, equivalent to enabling TCustomTreeView.ShowLines
491488 - tvoShowRoot - show root note, equivalent to enabling TCustomTreeView.ShowRoot
492489 - tvoShowSeparators - zeigt Begrenzungszeichen
493490 - tvoToolTips - show tooltips for individual nodes
4944912. Die LCL bietet zusätzliche Eigenschaften:
495492 - TCustomTreeView.OnSelectionChange Ereignis
496493 - TCustomTreeView.DefaultItems, für die Standardanzahl von Items
497494 - TCustomTreeView.ExpandSignType to determine sign used on expandable/collapsible nodes
4984953. Obwohl die meisten On Drag/Dock Ereignisse in der LCL verfügbar sind, funktionieren sie nicht. Für mehr Informationen lesen Ssie bitte den früheren Abschnitt über 'Bedienelemente ziehen und andocken'.
499496
500497### Nachrichten / Ereignisse
501498
502499Die Reihenfolge und Häufigkeit von Nachrichten (Messages) und Ereignissen (Events) (OnShow, OnActivate, OnEnter, ...) unterscheiden sich von der VCL und hängen vom [[Widgetset]] ab. Die LCL stellt eine Untermenge von WinAPI-ähnlichen Nachrichten zur Verfügung, um das Portieren von Delphi-Komponenten zu erleichtern, aber fast alle LCL-Nachrichten arbeiten etwas anders als die VCL/WinAPI Gegenstücke. Der größte Teil des Delphi Codes, der WinAPI-Nachrichten benutzt, benutzt sie auch deshalb, weil der VCL ein Feature fehlt oder die VCL zu langsam ist. Solcher Code funktioniert unter der LCL selten genau so und muss sorgfältig und von Hand überprüft werden. Deshalb heißen LCL Nachrichten zum Beispiel LM_SIZE (aus der Unit lmessages) und nicht WM_SIZE.
503500
504501**Anmerkung über den Umgang mit benutzerdefinierten Nachrichten!** Seit der Version 0.9.26 (Dezember 2008), unterscheidet sich der Umgang mit benutzerdefinierten WinAPI-Nachrichten (z.B. WM_HOTKEY, WM_SYSCOMMAND) von der Art, wie Delphi diese Nachrichten behandelt. Derzeit können Sie diese nicht mittels der Direktive **message** oder durch Überschreiben der *WndProc*-Methode des Formulars ansprechen. Der einzige Weg dazu besteht darin, im Formular selbst einen Hook auf Windows *windowproc* anzulegen. Lesen Sie hier weiter: [[Win32/64 Interface|Processing non-user messages in your window]]
505502
506503## Siehe auch
507504
508505- [[Code Conversion Guide|Code Conversion Guide (from Delphi &amp; Kylix)]]
509506- [[Compile With Delphi]]
510507
511508---
512509*From the Free Pascal wiki, page "Lazarus For Delphi Users/de", as it stood on 2020-02-18 after a change by Trev, 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