WSStdCtrls

Rund um die LCL und andere Komponenten
Antworten
braunbär
Beiträge: 369
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: 64Bit
Wohnort: Wien

WSStdCtrls

Beitrag von braunbär »

Hallo

nach vielen Jahren Delphi Programmierung habe ich von der Preispolitik von Emba endgültig die Nase voll und begonnen, mir Lazarus / Free Pascal genauer anzuschauen. DIe Oberfläche ist natürlich anders als Delphi und deshalb für mich ungewohnt, scheint aber in Summe nicht entscheidend weniger zu können. Ich bin jetzt eigentlich sehr angenehm überrascht.

Als erstes möchte ich natürlich meine selbst geschriebenen Komponenten unter Lazarus zum Laufen bringen und habe mir angeschaut, wie die Original-Komponenten der LCL aussehen. Dabei bin ich über die WSStdCtrls Unit gestopert.

Kann mir jemand sagen, wozu die gut ist? Hat es IRGEND EINEN SINN, die Getter und Setter der Komponenten in eine separate Unit auszulagern und dummy Getter und Setter als Klassenmethoden in extra Klassen einzuführen, die dann extra vererbt und überschrieben werden? Es würde mich wirklich interessieren, weil ich mich einerseits beim Portieren meiner Komponenten an die "Gepflogenheiten" der Lazarus-Community anlehnen möchte, andererseits aber in dieser Vorgangsweise nur eine Verkomplizierung ohne den geringsten Nutzen erkennen kann. Für eine Aufklärung wäre ich sehr dankbar.

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: WSStdCtrls

Beitrag von wp_xyz »

Die LCL-Komponenten von Lazarus sind komplexer als die von Delphi, weil sie mehrere Plattformen unterstützen - d.h. im Idealfall kannst du mit demselben Quellcode ein Programm für Windows, Linux und/oder Mac erzeugen. Deshalb wird eine Zwischenschicht zwischen den für den Programmierer zugänglichen LCL-Komponenten (unit StdCtrls) und dem Betriebssystem/Plattform benötigt - Widgetset. Wenn also eine Komponente z.b. die Paint-Methode implementiert, so wird diese an das Widgetset delegiert, und das wiederrum ruft die entsprechende plattformspezifische Routine auf. WSStdCtrls sind die Vorfahren der WidgetSet-Controls für die in StdCtrls implementierten Komponenten. Für jede Plattform sind im entsprechenden interfaces-Unterorder (z.B. (lazarus)/lcl/interfaces/win32) nochmals Klassen abgeleitet, die dann die Plattform-Aufrufe machen; in deinem Fall wäre das in der Unit Win32WSStdCtrls. Durch diese Architektur wird es relativ unübersichtlich, die Funktion von LCL-Komponenten zu verfolgen - wie oft habe ich schon in der entsprechenden LCL-Unit nachgesehen und das Gesuchte nicht gefunden...

Aber normalerweise hat man damit zum Glück nichts zu tun. Viele Komponenten, die nur die von Vorfahren geerbten Methoden aufrufen, sind oft direkt in Lazarus anwendbar. Bei Messages sind die Konstanten WM_XXXXX durch LM_XXXXX und die Methoden WMXXXX durch LMXXXXX zu ersetzen (unit LMessages in "uses"), also "procedure WMPaint(...) message WM_PAINT" --> "procedure LMPaint(...) message LM_PAINT".

Für plattformunabhängige Komponenten ersetze die Units Windows, Types und Messages durch LCLIntf, LCLType und LMessages, die eine plattformunabhängige Implementierung der entsprechenden Funktionen bereitstellen.

Es gibt auch einen Delphi-zu-Lazarus-Konverter (Menü "Werkzeuge" > "Delphi-Umwandlung"). Vorher unbedingt ein Backup des Original-Quelltexts machen, denn der Konverter hat seine Tücken und erschließt sich nicht immer.

Beginne mit "kleinen" Komponenten. Melde dich nochmals mit konkreten Problemen - ich kann hier nicht alle Eventualitäten aufschreiben.

Eine Anleitung für das Erstellen des Package für die Installation findest du unter http://wiki.lazarus.freepascal.org/How_ ... _Component.

braunbär
Beiträge: 369
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: 64Bit
Wohnort: Wien

Re: WSStdCtrls

Beitrag von braunbär »

Danke dir für die ausführliche Antwort. Das erklärt natürlich diesen etwas eigenwilligen Programmierstil. Nachdem auf absehbare Zeit für mich andere Plattformen als Windows kein Thema sind, werde ich mich jetzt einmal um diese Dinge nicht kümmern. Sollte ich einmal auf andere Plattformen wechseln müssen, kann ich die entsprechenden Anpassungen meiner Komponenten immer noch machen, das wäre dann wohl nicht mehr Aufwand als jetzt. Zumindest verstehe ich jetzt, wozu das gut ist, es war mir wirklich völlig rätselhaft.

Antworten