Zitat von
hanspeter:
Zitat von
Elvis:
Weil ein unschuldiger Mitleser sonst den falschen Eindruck bekäme, dass Pseudo-Modularisierug mit Packages wirkliche Flexibilität bringen würde und einem nicht 70% der Haarpracht kostet.
Da muss ich Elvis aus leidvoller Erfahrung voll zustimmen. Ich halte die
BPL für den größten Design Fehler in Delphi.
Sie machen Sinn für die
IDE, sie machen keinen Sinn außerhalb der
IDE.
Zitat:
Arbeite ich nur mit
Dll und verwende keine Laufzeitbibliotheken, dann lauert noch eine andere Falle.
Viele Componenten registrieren ihren Namen mit Registerclass bei Windows.
Falsch, RegisterClass registriert esin der
RTL. Und die kann man für jede
DLL & Exe getrennt haben. Ohne Laufzeitpackages sind sie sogar immer getrennt.
Zitat:
Ist so eine Klasse einmal registriert, kann sie in keiner weiteren
dll verwendet werden.
Bestes Beispiel
dll A verwendet Fastreport. Alles geht.
Jetzt wird
dll B geladen, die auch den Fastreport verwendet und es knallt. (Class bereits registriert.)
Wie gesagt: ohne Laufzeit-Packages hast du das Problem nicht. Aber du musst dann halt mit Interfaces arbeiten, nicht mit Delphi-Klassen.
Wenn du also ein Control auf dein Form aus einer
DLL laden willst, musst du per SetParent dann das Control in den jeweiligen Container packen. Aber das kann man einmalig hübsch OO verpacken, so dass die
DLL nur eine Interface-reference liefern muss, die das Control verpackt und die man dann einem anderen Control per SetParent as Child hinzufügt.
Für non-visuelle macht es mehr Sinn von vorn herein auch innerhalb der Exe auf einer Interface-basierte
API aufzubauen.
Zum Beispiel sowas (aus den Fingern gesaugt)
Delphi-Quellcode:
var
menu : IMenuProvider;
menuItem : IMenuItem;
begin
menu := Services.GetService(IMenuProvider) as IMenuProvider;
menuItem := menu['Edit'].AddItem('Copy');
menuItem.Caption := '&Copy';
menuItem.Click := @CopyClickHandler;
end;
Auf die Art hat man genau die Art
Dog-Fooding, die nötig ist damit Plugins genügend Möglichkeiten haben um wirklich sinnvoll zu sein. Denn wenn die
API, die auch die Plugins nutzen, nicht mächtig genug ist, merkst du das schon während du deine HauptApp schreibst.