Unit in die Hauptunit einbinden, wie?

Für Fragen rund um die Ide und zum Debugger
TLazarus
Beiträge: 5
Registriert: Mi 29. Sep 2010, 13:58

Unit in die Hauptunit einbinden, wie?

Beitrag von TLazarus »

Hallo, liebe Programmierer,

ich möchte in Lazarus eine Unit mit eigenen Funktionen einbinden.

Bei Delphi war das ganz einfach, da gabs unter DATEI die Option 'Unit einbinden'.

Bei Lazarus fehlt diese Option. Aber es müßte irgendwie machbar sein. Wer weiß Rat?

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

Re: Unit in die Hauptunit einbinden, wie?

Beitrag von theo »

Verstehe nicht genau, was du meinst.
Normalerweise reicht es, eine Unit in die Uses Klausel aufzunehmen, wenn sie im gleichen Verzeichnis liegt.
uses MyUnit;

Wenn du sie in versch. Projekten brauchst, machst du am Besten ein Package daraus, das du dann als Abhängigkeit ins Projekt aufnehmen kannst.
Uses ... brauchst du dann auch noch, aber damit ist der Pfad geregelt.
http://wiki.lazarus.freepascal.org/Lazarus_Packages/de

TLazarus
Beiträge: 5
Registriert: Mi 29. Sep 2010, 13:58

Re: Unit in die Hauptunit einbinden, wie?

Beitrag von TLazarus »

theo hat geschrieben:Verstehe nicht genau, was du meinst.
Normalerweise reicht es, eine Unit in die Uses Klausel aufzunehmen, wenn sie im gleichen Verzeichnis liegt.
uses MyUnit;

Wenn du sie in versch. Projekten brauchst, machst du am Besten ein Package daraus, das du dann als Abhängigkeit ins Projekt aufnehmen kannst.
Uses ... brauchst du dann auch noch, aber damit ist der Pfad geregelt.
http://wiki.lazarus.freepascal.org/Lazarus_Packages/de


Danke theo,

Ich hatte gedacht, die Unit in einen separaten Ordner abzulegen, damit ich von verschiedenen Proggis aus darauf zugreifen kann, sozusagen, damit ich die Unit nicht in jeden neuen Ordner kopieren muß, wenn ich was Neues programmieren will.

Somit würde sich ein Package wohl anbieten. Irgendwie mache ich beim Erstellen eines Packages wohl was falsch.

Also, ich starte Lazarus, gehe auf 'Neu', dann auf 'Package'. Speichere es im separaten Ordner ab. Und jetzt auf 'DFateien hinzufügen'.
Muß ich das Package jetzt kompilieren? Und muß ich dann nur

uses meinPackage;

eingeben?

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

Re: Unit in die Hauptunit einbinden, wie?

Beitrag von theo »

Projekt -> Projektinspektor -> Hinzufügen -> Neue Anforderung
und dann noch in die Uses aufnehmen.

Bei visuellen Komponenten reicht das "auf's Formular ziehen".

am2
Lazarusforum e. V.
Beiträge: 116
Registriert: Di 21. Dez 2010, 09:59
OS, Lazarus, FPC: Win (L 0.9.26 beta FPC 2.2.2)
CPU-Target: 32 Bit

Re: Unit in die Hauptunit einbinden, wie?

Beitrag von am2 »

Bleiben wir mal bei der ersten Variante:

Ich habe eine Handvoll "Hilfsfunktionen" geschrieben, die ich in all meinen Projekten benutzen will.

Ich möchte kein Package anlegen. Die Gründe dafür sind vielfältig:
- Die IDE muss neu kompiliert werden. Möglicherweise fehlen aber die Rechte, die EXE auszutauschen
- (Fast)jede Erweiterung des Moduls erfordert jedesmal, dass die IDE neu kompiliert muss
- Ich bin gerade dabei, mir Projekt- Templates zu bauen. Ich habe keine Ahnung, wie gut das System damit zurecht kommt, wenn sich diese "Hilfsfunktionen" weiterentwickeln

Daher möchte ich idealerweise etwas tun, wie
uses 'verzeichnis_fuer_alle\meine_hilfsfunktionen.pas'

Das geht doch sicher irgendwie, oder?

PascalDragon
Beiträge: 830
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: Unit in die Hauptunit einbinden, wie?

Beitrag von PascalDragon »

am2 hat geschrieben:
Do 7. Okt 2021, 13:53
Ich möchte kein Package anlegen. Die Gründe dafür sind vielfältig:
- Die IDE muss neu kompiliert werden. Möglicherweise fehlen aber die Rechte, die EXE auszutauschen
- (Fast)jede Erweiterung des Moduls erfordert jedesmal, dass die IDE neu kompiliert muss
Falsch. So lange dein Package keine Komponenten hat, die zur Entwurfszeit innerhalb der IDE zur Verfügung stehen sollen oder ein solches Package deinen Code benötigt, so lange musst du auch nichts installieren. Um ein Package in einem Projekt zu verwenden reicht es voll und ganz aus, wenn du dein Package einmal öffnest (was ja implizit der Fall ist, wenn du es in der IDE erstellst) und schon kannst du es als Abhängigkeit nutzen.

Und selbst wenn du dein Package in der IDE installierst: du musst nicht bei jeder Änderung die IDE neu erstellen, sondern nur, wenn du weißt, dass die Änderungen jetzt auch in der IDE benötigt werden davor läuft alles wie oben.
FPC Compiler Entwickler

am2
Lazarusforum e. V.
Beiträge: 116
Registriert: Di 21. Dez 2010, 09:59
OS, Lazarus, FPC: Win (L 0.9.26 beta FPC 2.2.2)
CPU-Target: 32 Bit

Re: Unit in die Hauptunit einbinden, wie?

Beitrag von am2 »

Klappt bei mir nicht, weiß noch nicht, warum nicht. Gibt es irgendwo ein Tutorial, was man minimal tun muss, um erfolgreich eine Funktion oder eine Klasse in einem Package unterzubringen und später wieder einzubinden?
Bei aller Liebe zu gekapselten Dingen, aber die Mechanismen sind manchmal unnütz kompliziert. Ich will ein Modul schreiben, das irgendwo für alles ablegen und dann von mehreren Projekten darauf verweisen. Thats it :(

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Unit in die Hauptunit einbinden, wie?

Beitrag von Winni »

Hi!

Projektinspector --> Hinzufügen --> Datei aus Dateisystem hinzufügen

Fertig.

Uses ..... nicht vergessen.

Winni

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

Re: Unit in die Hauptunit einbinden, wie?

Beitrag von wp_xyz »

am2 hat geschrieben:
Fr 8. Okt 2021, 10:26
Klappt bei mir nicht, weiß noch nicht, warum nicht. Gibt es irgendwo ein Tutorial, was man minimal tun muss, um erfolgreich eine Funktion oder eine Klasse in einem Package unterzubringen und später wieder einzubinden?
Bei aller Liebe zu gekapselten Dingen, aber die Mechanismen sind manchmal unnütz kompliziert. Ich will ein Modul schreiben, das irgendwo für alles ablegen und dann von mehreren Projekten darauf verweisen. Thats it :(
Um das Package zu erzeugen:
  • Klicke auf "Package" > "Neues Package" --> Der Package-Editor erscheint.
  • Dateinamen und Pfad angeben --> Das leere Package wird an diesem Ort gespeichert. Datei-Endung: .lpk
  • Klicke im Package-Editor auf "Hinzufügen" > "Datei aus dem Dateisystem hinzufügen". Navigiere zu deinen Units, die du im Package haben möchtest. Wähle sie aus > OK. Die Frage über die Erweiterung des Suchpfades bejahen. Nun stehen die Dateinamen der hinzugefügten Units in der Baumansicht des Package-Editor unter "Dateien".
  • Eigentlich bist du jetzt fertig. Aber das Package wird möglicherweise nicht kompilierbar sein, weil deine Units von anderen Units abhängen, und das Package weiß nicht, wo diese sind. Du benötigst noch die Namen der Packages, in denen diese Units enthalten sind - diese sind unter "Benötigte Packages" einzutragen. Normale Lazarus-Units sind im Package "LCL" enthalten. Um dieses hinzuzufügen, klicke wieder auf "Hinzufügen", aber nun "Neue Anforderung". Scrolle in der Listbox runter bis zum Eintrag "LCL" and wähle ihn aus -> OK. Nun steht "LCL" unter "Benötigte Packages". Denselben Vorgang musst du wiederholen, wenn noch andere Packages in deinen Units benötigt werden.
  • Nicht unbedingt nötig, aber um zu prüfen, ob alles passt, kannst du "Kompilieren" klicken, und das Package übersetzen lassen. Möglicherweise fehlt noch eine Abhängigkeit, dann erhältst du eine Meldung dafür.
  • Der Menüpunkt "Verwenden" > "Installieren" ist nötig, wenn dein Package neue selbst erstellte Komponenten enthält, die du in der Komponenten-Palette haben möchtest. In diesem Fall wird die IDE neu kompiliert (das ist anders als bei Delphi); nach dem automatischen Neustart hast du dann deine Komponenten in der Palette.
  • Nun kannst du den Package-Editor schließen.
  • Falls du später etwas an deinem Package ändern möchtest, um z.B. eine weitere Unit hinzuzufügen, dann kannst du das Package über den Menüpunkt "Package" > "Package-Datei öffnen (.lpk)". Navigiere zu deinem Package, und du hast es wieder im Package-Editor.
Um das neue Package in einem Projekt zu verwenden:
  • Öffne dein Projekt. Klicke auf "Projekt" > "Projektinspektor"
  • Der Projektinspektor sieht ganz ähnlich aus wie der Package-Editor. Es gibt einen Baum, oben stehen die "Dateien" und darunter die "Benötigten Packages". Gehe wieder auf "Hinzufügen" > "Neue Anforderung" > Wähle in der Listbox nun DEIN Package aus > OK.
  • Nun weiß dein Projekt, wo sich deine allgemein verwendeten Units befinden, die du wie üblich per "uses" im Code verfügbar machen kannst.
  • Wenn dein Projekt bei der Erstellung des Package schon offen war, kannst du auch im Package-Editor (siehe erster Teil dieser Nachricht) den Punkt "Verwenden" > "Zum Projekt hinzufügen" nehmen.
Zuletzt geändert von wp_xyz am Sa 9. Okt 2021, 10:21, insgesamt 1-mal geändert.

Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 334
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon (Windows wenn notwendig), Lazarus 3.0 FPC 3.3.1

Re: Unit in die Hauptunit einbinden, wie?

Beitrag von Niesi »

Winni hat geschrieben:
Fr 8. Okt 2021, 11:37
Hi!

Projektinspector --> Hinzufügen --> Datei aus Dateisystem hinzufügen

Fertig.

Uses ..... nicht vergessen.

Winni
Ich mach' das immer nur so ...
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Unit in die Hauptunit einbinden, wie?

Beitrag von Winni »

Niesi hat geschrieben:
Fr 8. Okt 2021, 12:11
Winni hat geschrieben:
Fr 8. Okt 2021, 11:37
Hi!

Projektinspector --> Hinzufügen --> Datei aus Dateisystem hinzufügen

Fertig.

Uses ..... nicht vergessen.

Winni
Ich mach' das immer nur so ...
Hi!

Ja - neben Dir und mir gibt es aber Menschen, die es kompliziert mögen.

Winni

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

Re: Unit in die Hauptunit einbinden, wie?

Beitrag von wp_xyz »

Falls du meinen längeren Beitrag meinst: Der Fragesteller kommt offensichtlich von Delphi, wo Packages eine ganze andere Rolle spielen, und hat insgesamt von den Lazarus-Packages keine Vorstellung (was ja keine Schande ist). Meinst du allen Ernstes, dass er mit drei Satzfragmenten und zwei Pfeilen dazwischen verstanden hat, worum es geht?

Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 334
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon (Windows wenn notwendig), Lazarus 3.0 FPC 3.3.1

Re: Unit in die Hauptunit einbinden, wie?

Beitrag von Niesi »

Moin,

also, ich möchte niemanden ärgern oder verstimmen, weil ich dieses Forum und die Menschen hier sehr mag.
Aber: als ich gelesen habe, was als Antworten kamen, blieb mir der Mund so lange offen stehen, bis ein Speichelfaden runterlief.

Meint Ihr nicht auch, dass der einfache, unkomplizierte Weg der beste Weg ist?

Herzlichen Gruß
Harald
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...

hum4n0id3
Beiträge: 301
Registriert: So 5. Mai 2019, 15:23

Re: Unit in die Hauptunit einbinden, wie?

Beitrag von hum4n0id3 »

Ich glaube hier liegt ein Missverständniss vor. Kann passieren :)

Ich erstelle eine neue Unit und schreibe dort meine Klassen oder Funktionen hin. Danach ergänze ich im

Code: Alles auswählen

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, [b]MyUnit[/b];
Und kann es nutzen.

Fertig

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: Unit in die Hauptunit einbinden, wie?

Beitrag von charlytango »

TLazarus hat geschrieben:
So 8. Apr 2012, 16:07
ich möchte in Lazarus eine Unit mit eigenen Funktionen einbinden.

Bei Delphi war das ganz einfach, da gabs unter DATEI die Option 'Unit einbinden'.

Bei Lazarus fehlt diese Option. Aber es müßte irgendwie machbar sein. Wer weiß Rat?
Die Funktion fehlt nicht, sie ist nur woanders untergebracht und hat eine etwas andere Logik

Eine im Projekt befindliche Unit "einzubinden" geht auf unterschiedliche Arten.

Menü: Quelltext - Unit zum Uses Abschnitt hinzufügen (Alt-F11)

Dann kannst du in einem Fenster aussuchen welche (Projekt-)Unit du wohin schreiben willst (wahlweise im Interface oder implementation-Teil)
Voraussetzung dazu ist, dass die Unit bereits dem Projekt bekannt ist.
Dazu nutzt du die Anweisung von Winni im Projektinspektor.

Menü: Projekt - Projektinspektor
Winni hat geschrieben:
Fr 8. Okt 2021, 11:37
Projektinspector --> Hinzufügen --> Datei aus Dateisystem hinzufügen
Fertig.
Uses ..... nicht vergessen.
Wenn die Unit dem Projekt hinzugefügt wurde kannst du auch einfach im Code den Namen der Unit in die jeweilige Uses-Klausel schreiben -- (Alt-F11 macht ja auch nichts anderes)

Beim Hinzufügen aus dem Dateisystem ist es unerheblich wo die Datei liegt, Lazarus kümmert sich um das Hinzufügen des Pfades, was bei Delphi imho anders war.

Bislang komme ich auch bei großen Projekten ohne Package zurecht und meine wiederverwendbaren Codeteile liegen schön strukturiert in einem eigenen Verzeichnis. Bei Bedarf binde ich Units und ggfs auch Formulare ins Projekt ein und benutze sie per Eintrag in den Uses-Bereich.

Hoffe das entwirrt einige Posts -- ist aber nur meine persönliche Meinung

Antworten