Eine eigene LIBRARY anlegen

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
Lorca
Beiträge: 196
Registriert: Di 3. Nov 2020, 12:25

Eine eigene LIBRARY anlegen

Beitrag von Lorca »

Hallo zusammen,

ich würde gerne eine eigene LIBRARY anlegen um dort einige Klassen abzulegen.
Diese neue LIBRARY würde ich dann gerne mit {$R xxx.RES} bzw. mit LoadLibrary ins Hauptprogramm einbinden / hochladen

Nun gibt es jedoch unter Datei / Neu ... keinen Eintrag für LIBRARY. Also habe ich eine Unit genommen und dann das Schlüsselwort von UNIT in LIBRARY geändert. Das funzt aber nicht. Der Compiler mekkert :(

Im I-Net habe ich dann gelesen das ich hierzu ein Package anlegen soll.

Nun meine Frage:
Geht es auch ohne Package?
Wie gesagt, ich will diese dann z.B. abhängig von der Programmversion des Hauptprogramms einbinden und nicht etwa über die Component Palette im Designer einbinden.

Kann mir jemand dazu etwas sagen?


Gruß
Lorca

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Eine eigene LIBRARY anlegen

Beitrag von theo »

Datei -> Neu -> Projekt -> Bibliothek
gibt es bei dir nicht?

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Eine eigene LIBRARY anlegen

Beitrag von af0815 »

Lorca hat geschrieben:
Mi 21. Sep 2022, 11:16
ich würde gerne eine eigene LIBRARY anlegen um dort einige Klassen abzulegen.
Weisst du genau warum du das so machen willst oder willst du nur Struktur in den Source bringen ?

Das kennst du https://wiki.freepascal.org/Lazarus/FPC_Libraries ?
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Lorca
Beiträge: 196
Registriert: Di 3. Nov 2020, 12:25

Re: Eine eigene LIBRARY anlegen

Beitrag von Lorca »

Hallo Theo,

SRY, ja.
Habe ich noch nie drauf geachtet, weil ich immer nur Anwendungen aus diesem Menü angelegt habe.

Nun habe ich das Problem: wie spreche ich die Klasse in meinem Hauptprogramm an???????????

Mit {$R} lässt sich die Library nicht ins Hauptprogramm einbinden. Schade.
Mit LoadLibrary wird mir das Handle zurück gegeben. Mit Handles habe ich jedoch so gut wie keine Erfahrung.
Was muss ich tun, um die exportierte Variable LIB_Band bzw. die Funktion Create_Lib_Band im Hauptprogramm ansprechen zu können?

Die Funktion GetProcedureAddress liefert einen Pointer zurück. Ein Casting auf eine Funktion mit Function( xxx ) funzt nicht.
Gibt es irgendwo Beispiele?

Gruß
Lorca

Hier mal die Library:
LIBRARY MC_LIB_Band;
{$mode objfpc}{$H+}
USES
Classes
;


TYPE
TCL_MC_Band = CLASS( TObject )
PRIVATE
PROTECTED
PUBLIC
CONSTRUCTOR Create; VIRTUAL;
DESTRUCTOR Destroy; OVERRIDE;
END ;

VAR
LIB_Band : TCL_MC_Band;

CONSTRUCTOR TCL_MC_Band.Create;
BEGIN
INHERITED Create;
END;

DESTRUCTOR TCL_MC_Band.Destroy;
BEGIN
INHERITED Destroy;
END;

FUNCTION Create_Lib_Band : TCL_MC_Band;
BEGIN
LIB_Band := TCL_MC_Band.Create;
Result := LIB_Band;
END;


EXPORTS
LIB_Band,
Create_Lib_Band;

END.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1432
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Eine eigene LIBRARY anlegen

Beitrag von fliegermichl »

Klassen kann man nicht aus Bibliotheken in das Programm exportieren. Für jede Klasse wird eine Virtual Method Table angelegt und zwar getrennt in der Bibliothek als auch im Programm an sich.

Du kannst natürlich in deiner Bibliothek Klassen verwenden und für die Schnittstellen zum Programm einfache Datentypen (aber auch Records) oder Zeiger darauf exportieren.

charlytango
Beiträge: 843
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: Eine eigene LIBRARY anlegen

Beitrag von charlytango »

Lorca hat geschrieben:
Mi 21. Sep 2022, 11:16
Nun meine Frage:
Geht es auch ohne Package?
Wie gesagt, ich will diese dann z.B. abhängig von der Programmversion des Hauptprogramms einbinden und nicht etwa über die Component Palette im Designer einbinden.
Ich habe es immer als Vorteil angesehen, Codeteile (füher)in Delphi und (jetzt) in Lazarus sehr einfach strukturieren und wiederverwenden zu können OHNE irgend ein Gefrickel mit Libraries (also DLLs So und wie sie alle heißen)

Ich strukturiere (wohl wie alle hier) Codeteile (also quasi lose Prozeduren und Funktionen) sowie Klassen je nach Verwendungszweck oder Thema in Dateien (die heissen bei Lazarus eben units). Programmübergreifende Units liegen bei mir in einer übergeordneten Verzeichnisstruktur (heisst bei mir sinnigerweise _shared) und ich binde sie je nach Notwendigkeit einzeln über die uses-Klausel ein das jeweilige Programm ein.
Fertig -- keine Bibliotheken, keine Installation von DLLs und Konsorten.
af0815 hat geschrieben:
Mi 21. Sep 2022, 12:11
Weisst du genau warum du das so machen willst oder willst du nur Struktur in den Source bringen ?
Die Frage von af0815 zielte IMHO genau darauf hin ab, genauer heraus zu bekommen WARUM genau du so ein Konstrukt verwenden möchtest, bevor wieder mal Kanonen geladen werden um auf arme Spatzen loszugehen ;-)

Sollte deine Absicht sein etwas mehr Struktur in deinen Code zu bringen empfehle ich die Variante mit den Units, denn ich sehe keinerlei Vorteil darin Source nicht direkt ins Programm zu kompilieren wenn der Code ohnedies als Unit vorliegt.

Lorca
Beiträge: 196
Registriert: Di 3. Nov 2020, 12:25

Re: Eine eigene LIBRARY anlegen

Beitrag von Lorca »

Hi zusammen, :)

zunächst einmal danke schön für eure Antworten.
Nun ja, somit ist meine Idee mit Library's erst ein mal vom Tisch.

Also warum ich diese Idee hatte (mit dem Hintergrund das ich Lazarus noch nicht völlig überblicke ).

Ich schreibe derzeit ein Programm mit vielen Registerkarten und sehr, sehr vielen Feldern und Buttons, auf jedem dieser TabSheets.
Meine Idee war nun, für jede Registerkarte eine Library anzulegen welche dann das jeweilige TabSheet behandelt. (Speichern, Ändern etc. PP)

Einbinden wollte ich dann diese Lib Dynamisch. Für das Statische Einbinden wollte ich nur das "KnowHow".

Der Vorteil Vorteil: Dieses Dinger sind kompiliert und lauffähig. Da ich noch in der Entwicklungsphase bin, kann sich durchaus noch einiges an den Klassen ändern. In einem solchen Fall ist das Programm jedoch für jede dieser Registerkarten mit fertiger DLL lauffähig.

Wie war doch gleich das Motto? Write Once, Compile Anywhere

Einen Einwand, gegen den Einsatz einer DLL, halte ich persönlich für Unsinn. Diese Dinger sind austauschbar und im falle von Upgrades sehr nützlich und zeitsparend. Es muß nicht immer das gesamte Coding compiliert und getestet werden. :)

Schade das die Weiterentwicklung der Librarys stoppt und keine Klassen exportiert werden können.

Viele Grüße
Lorca

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Eine eigene LIBRARY anlegen

Beitrag von af0815 »

So wie du es schreibst, ist für mich ein Thema für Frames.

Wenn man ein Konzept für dynamische Frames sich zugelegt, so will man es nicht mehr missen. Ich entwickle sehr viel mit Frames und verwende die gerne. Oft habe ich Frames in Frames in Frames. Für Datenanzeigen oft ganze Framesarrays :D

Einmal entwickeln und gut testen, dann nur mehr verwenden.

Klingt Oberlehrerhaft: Man sollte die Konzepte verstehen, die man verwenden will. :mrgreen:

Dein Beispiel weiter oben macht mit Frames keinen Sinn. Da gibt nichts visuelles.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

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

Re: Eine eigene LIBRARY anlegen

Beitrag von wp_xyz »

Lorca hat geschrieben:
Do 22. Sep 2022, 16:55
Ich schreibe derzeit ein Programm mit vielen Registerkarten und sehr, sehr vielen Feldern und Buttons, auf jedem dieser TabSheets.
Meine Idee war nun, für jede Registerkarte eine Library anzulegen welche dann das jeweilige TabSheet behandelt. (Speichern, Ändern etc. PP)
Wie af0815 schon sagte: das ist eine typische Anwendung von Frames: du erzeugst einen Frame für jedes TabSheet und fügst dann zur Laufzeit den Frame in den entsprechenden Tab ein. Alle Controls auf einem Frame sind dann in ihrer eigenen Unit und sauber getrennt, und diese Details kontaminieren nicht das Hauptformular.

Ein relativ umfangreiches Beispiel mit Frames ist das ChartEditor-Demo im Ordner components/tachart/demo/charteditor der Lazarus-Installation (seit, ich glaube, v2.0).

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Eine eigene LIBRARY anlegen

Beitrag von m.fuchs »

Lorca hat geschrieben:
Do 22. Sep 2022, 16:55
Schade das die Weiterentwicklung der Librarys stoppt und keine Klassen exportiert werden können.
Da ist keine Weiterentwicklung gestoppt, es war schlicht und einfach niemals vorgesehen im Konzept DLL.
Da die Umsetzung von Objektorientierung in so vielen Sprachen ganz unterschiedlich ist, sehe ich hier auch kaum eine Möglichkeit so etwas auf einfachem Wege umzusetzen.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

PascalDragon
Beiträge: 825
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Eine eigene LIBRARY anlegen

Beitrag von PascalDragon »

Lorca hat geschrieben:
Do 22. Sep 2022, 16:55
Ich schreibe derzeit ein Programm mit vielen Registerkarten und sehr, sehr vielen Feldern und Buttons, auf jedem dieser TabSheets.
Meine Idee war nun, für jede Registerkarte eine Library anzulegen welche dann das jeweilige TabSheet behandelt. (Speichern, Ändern etc. PP)

Einbinden wollte ich dann diese Lib Dynamisch. Für das Statische Einbinden wollte ich nur das "KnowHow".

Der Vorteil Vorteil: Dieses Dinger sind kompiliert und lauffähig. Da ich noch in der Entwicklungsphase bin, kann sich durchaus noch einiges an den Klassen ändern. In einem solchen Fall ist das Programm jedoch für jede dieser Registerkarten mit fertiger DLL lauffähig.
Nein, so etwas wäre einfach nur mit zu vielen Problemen behaftet. Ordinäre Bibliotheken ermöglichen einfach nur prozeduralen Zugriff, alles andere ist einfach nur viel Heckmeck und Ärger für die Zukunft.
Lorca hat geschrieben:
Do 22. Sep 2022, 16:55
Schade das die Weiterentwicklung der Librarys stoppt und keine Klassen exportiert werden können.
Das ist eben all das, was mit ordinären Bibliotheken sicher erreicht werden kann.

Wenn FPC in Zukunft mal Dynamische Pakete unterstützt (in Entwicklung, aber fehlt noch ein bisschen was), dann kannst du Klassen auslagern, allerdings hat das zur Folge, dass auch die komplette RTL, FCL und LCL als Paket vorliegen muss (du kannst also nicht selektiv nur einzelne Teile auslagern, weil wir dann wieder an dem Punkt sind, dass dies so einfach nicht machbar ist).
FPC Compiler Entwickler

Lorca
Beiträge: 196
Registriert: Di 3. Nov 2020, 12:25

Re: Eine eigene LIBRARY anlegen

Beitrag von Lorca »

Hi zusammen,

coole Diskussion. Danke für eure Ideen und Kommentare.

Ja mit den Frames (und auch Frames in Frames) habe ich es versucht und auch reichlich Probleme gehabt.
Daher habe ich dieses Vorgehen erst einmal beiseite geschoben und bin dann auf die Idee mit den DLL's gekommen.
Nun muss ich mich doch durch die Probleme mit den Frames durch beißen. :(

Das Beispiel von wp_xyz werde ich mir mal reinziehen :). (Danke dafür)
Und nein, ich finde hier ist niemand "Oberlehrerhaft" :)

Was ich bei den Frames nicht so toll finde, ist die Tatsache das die eingebundenen SUB-Frames und alle anderen platzierten Komponenten nicht gekapselt sind. Also überall Verfügbar.
Vllt. schlaut mich ja das Beispiel ein wenig auf,


Viele Grüße
Lorca

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Eine eigene LIBRARY anlegen

Beitrag von af0815 »

Lorca hat geschrieben:
Sa 24. Sep 2022, 09:16
Was ich bei den Frames nicht so toll finde, ist die Tatsache das die eingebundenen SUB-Frames und alle anderen platzierten Komponenten nicht gekapselt sind. Also überall Verfügbar.
Vllt. schlaut mich ja das Beispiel ein wenig auf,
Grafische Komponenten kann man per se nicht Kapseln, solange man die IDE zum editieren verwendet. Ganz streng Kapseln kann man nur dann etwas, wenn man es zur Laufzeit erzeugt, das aber dann komplett.

Wenn ich Frames verwende, sehe ich die SubFrames nicht, weil diese auch wieder zur Laufzeit erzeugt werden. Die Komponneten bleiben natürlich sichtbar. Das spielt mir aber keine Rolle. Ich gereife nur über Schnittstelle zu und verwende Callbacks, wenn das Frame dem Elternteil etwas mitteilen muss/will. Ich weise den Komponenten im Frame niemals was direkt zu. Ich teste das mit einem speziellen Programm wo ich mein FrameUnderTest aufrufe und nur die Schnittstellen und Callbacks bediene. Damit kann ich das Verhalten austesten und auch die Schnittstellen. In der fertigen Applikation wird das ganze genauso hineingehängt. Wenn ich einen Fehler suche, dann verwende ich wieder das spezielle Programm und kann dort die Schnittstellen mit vermutlich Fehlerauslösenden Werten befüllen. Damit kann man sehr stabile Frames haben, die man bedenkenlos in verschiedenen Projekten verwenden kann. Allerdings, wenn ein Frame dann anderes reagieren soll, so muss man ein neues Frame machen, da sonst andere Programme/Projekte beeinflusst werden. Das darf man niemals vergessen, wenn man mit so Baukästen arbeitet. Ansonsten kommt man in die Versionshölle.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten