AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Lazarus 1.2 veröffentlicht

Ein Thema von JamesTKirk · begonnen am 11. Mär 2014 · letzter Beitrag vom 20. Aug 2019
Antwort Antwort
Benutzerbild von JamesTKirk
JamesTKirk

Registriert seit: 9. Sep 2004
Ort: München
604 Beiträge
 
FreePascal / Lazarus
 
#1

AW: Lazarus 1.2 veröffentlicht

  Alt 16. Mär 2014, 18:08
Die hier zitierten Argumente relativieren das Package Problem nun auch wieder, aber für mich ist und bleibt dieses Problem auch ein interessanter Aspekt. Ich habe nämlich noch immer nicht verstanden, warum hier die totale Neuübersetzung überhaupt erforderlich ist. Mir ist klar, das dies der Fall ist, wenn die Komponenten als neue Units statisch eingebunden werden. ABER: Kann man diese nicht auch als normale Dlls einbinden, per Interfaces?
Lazarus und Delphi instanziieren die Komponenten und rufen deren Methoden auf (das csDesigning in TComponentState gibt es nicht zum Spaß). Zum Finden der Ereignisse und zum laden/speichern der LFM/DFM wird die RTTI benötigt und die Klasse muss dem Komponenten Streaming System bekannt sein.

Aus diesem Grund musst du übrigens die Lazarus IDE nur neukompilieren, wenn du entweder ein Package installierst, welches die IDE erweitert, oder, wenn du Komponenten im Formdesigner verwenden möchtest. Legst du die Komponenten nur zur Laufzeit an, dann reicht es, wenn Lazarus das Package kennt (soll heißen: du hast einmal die LPK-Datei geöffnet) und du die entsprechende Abhängigkeit im Projektinspektor einstellst.

Ein Komponentenmanager könnte so aussehen (nur Interface)

type
IComponentFactory = Interface(IInterface)
function GetComponents(Index: Integer): TComponent;
procedure SetComponents(Index: Integer; value: TComponent);
property Components[Index]: TComponentList read GetComponents write SetComponents;
property ComponentCount: Integer; //Anzahl aktuell in IDE verfügbare Komponenten
end;

Nun müssten die Komponenten von außen per dll angeschlossen werden;

Wo ist da mein Denkfehler, wenn da einer ist?
Ein ganz, ganz wichtiger Denkfehler: Ohne Dynamic Packages gilt, dass TComponent der IDE nicht das selbe TComponent der Bibliothek ist. Das heißt, für eine Komponente, die in der IDE instantiiert wird, aber in einer DLL implementiert ist, wird is TComponent innerhalb der IDE nie true zurück geben. Auch Exceptions in den Komponenten können dadurch nicht abgefangen werden, da selbst ein on e: TObject do {...} fehlschlagen würde, da auch TObject in der IDE und TObject in der DLL unterschliedliche Typen sind. Das ist einer der Hauptgründe, weswegen Dynamic Packages entwickelt wurden: dabei wird die RTL in eine eigene Bibliothek (Package) ausgelagert und sowohl IDE, als auch die Komponenten Bibliothek (Package) können diese verwenden und der Compiler kümmert sich darum, dass bezüglich Abhängigkeiten alles passt und somit auch nur eine einzige Art von TObject , Exception oder TComponent existiert.

Ganz davon abgesehen würde dies dazu führen, dass die Komponente extra für Lazarus angepasst werden müsste (ich sehe jetzt hier mal von anderen Problemen mit der Kompatibilität ab), was hieße, dass es noch weniger Komponenten für Lazarus gäbe, als es eh schon der Fall ist.

Gruß,
Sven
Sven
[Free Pascal Compiler Entwickler]
this post is printed on 100% recycled electrons
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#2

AW: Lazarus 1.2 veröffentlicht

  Alt 16. Mär 2014, 20:42
Ein ganz, ganz wichtiger Denkfehler: Ohne Dynamic Packages gilt, dass TComponent der IDE nicht das selbe TComponent der Bibliothek ist. Das heißt, für eine Komponente, die in der IDE instantiiert wird, aber in einer DLL implementiert ist, wird is TComponent innerhalb der IDE nie true zurück geben.
Aber ist das nicht eher ein Implementierungsdetail? Könnte man nicht eine ID aus Klasse, Package und ggf. Versionsnummer bilden und diese in der Klasse als Metainformation ablegen? Dann sollte man die Gleichheit bzw. Kompatiblität auch überprüfen können, wenn die Klassen nicht an der selben Stelle im Speicher stehen.

So ähnlich macht man es ja bei Interfaces mit den GUIDs auch. Prinzipiell sollte das doch auch bei Klassen funktionieren, oder nicht?

Ein Problem sehe ich nur, wenn verschiedene Packages von unterschiedlichen Versionen eines gemeinsam genutzten Packages ausgehen. Aber das dürfte dann bei dynamischen Packages ebenfalls Probleme geben, denke ich mal.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.332 Beiträge
 
Delphi 12 Athens
 
#3

AW: Lazarus 1.2 veröffentlicht

  Alt 16. Mär 2014, 23:05
Nein.

In einem Package kann man mehrere Klassen haben, die gleich heißen.
Und es könnte auch andere Packages geben, welche den selben Namen haben.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#4

AW: Lazarus 1.2 veröffentlicht

  Alt 16. Mär 2014, 23:16
In einem Package kann man mehrere Klassen haben, die gleich heißen.
Der Name muss natürlich vollständig qualifiziert sein, also auch die Unit und ggf. die Oberklasse und Routine enthalten, wo die Klasse deklariert wurde.
Und es könnte auch andere Packages geben, welche den selben Namen haben.
Das Problem hat man doch so oder so.
  Mit Zitat antworten Zitat
Benutzerbild von JamesTKirk
JamesTKirk

Registriert seit: 9. Sep 2004
Ort: München
604 Beiträge
 
FreePascal / Lazarus
 
#5

AW: Lazarus 1.2 veröffentlicht

  Alt 17. Mär 2014, 07:39
Aber ist das nicht eher ein Implementierungsdetail? Könnte man nicht eine ID aus Klasse, Package und ggf. Versionsnummer bilden und diese in der Klasse als Metainformation ablegen? Dann sollte man die Gleichheit bzw. Kompatiblität auch überprüfen können, wenn die Klassen nicht an der selben Stelle im Speicher stehen.
Warum soll man eine ID bilden müssen, wenn man eine perfekte ID bereits hat: der VMT Zeiger. Man sollte ein System nicht unnötig kompliziert machen... Ganz davon abgesehen müsstest du die ganze RTL erstmal anpassen, dass die das verwendet... Außerdem hast du immernoch das Problem mit der RTTI und dem Streaming System.

Ein Problem sehe ich nur, wenn verschiedene Packages von unterschiedlichen Versionen eines gemeinsam genutzten Packages ausgehen. Aber das dürfte dann bei dynamischen Packages ebenfalls Probleme geben, denke ich mal.
Der Compiler stopft die Packages mit den nötigen Metainformationen voll, so dass zur Laufzeit überprüft werden kann, ob alles passt. Nicht umsonst gibt es den berühmten Dialog beim Start von Delphi, dass dieses und jenes Package aus irgendeinem Grund nicht geladen werden konnte...

Warum etwas neues erfinden, wenn es etwas Funktionierendes bereits gibt, dass nur noch implementiert werden muss? Und wie gesagt, so aufwendig ist das neukompilieren von Lazarus auch nicht...

Gruß,
Sven
Sven
[Free Pascal Compiler Entwickler]
this post is printed on 100% recycled electrons
  Mit Zitat antworten Zitat
AlexII

Registriert seit: 28. Apr 2008
1.717 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Lazarus 1.2 veröffentlicht

  Alt 24. Jun 2015, 10:28
Inzwischen haben wir schon Latarus 1.4!
Bin Hobbyprogrammierer! Meine Fragen beziehen sich meistens auf Lazarus!
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.992 Beiträge
 
Delphi 12 Athens
 
#7

AW: Lazarus 1.2 veröffentlicht

  Alt 24. Jun 2015, 17:01
Inzwischen haben wir schon Latarus 1.4!
Haben sie Packages?
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Insider2004
(Gast)

n/a Beiträge
 
#8

AW: Lazarus 1.2 veröffentlicht

  Alt 24. Jun 2015, 17:42
FPC 3.1 und Lazarus 1.4 laufen wie geölt!
  Mit Zitat antworten Zitat
warschonweg

Registriert seit: 2. Okt 2014
31 Beiträge
 
#9

AW: Lazarus 1.2 veröffentlicht

  Alt 20. Aug 2019, 11:00
Lazarus 2.0 ist auch performant und (mit dem Dockingpaket) gut benutzbar.
Nach Diktat verreist,
[war schon weg].
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:29 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz