Seite 2 von 2
Re: dynamischer Aufruf von Modulen
Verfasst: 07.02.2014 14:09
von NicTheQuick
ts-soft hat geschrieben:NicTheQuick hat geschrieben:Ach, tatsächlich. Und ich dachte das passiert nur, wenn man UseModule nutzt.
Code: Alles auswählen
DeclareModule test
Declare GetBla()
EndDeclareModule
...
War nicht nötig. Hab's ja schon bestätigt.
NicTheQuick hat geschrieben:Man kann dann nur immer noch nicht dynamisch ein Modul nach Namen "starten" oder nicht. Das legt dann der Quellcode fest.
Wenn ich jetzt wüßte, was dynamisches Starten eines Modules sein soll? Module werden statisch gelinkt, sind also immer
vorhanden.
Ja, ich weiß das auch nicht so genau. Ich habe das vom Threadstarter eben so verstanden, dass er gerne Module fast wie DLLs dynamisch laden und entladen kann. Ich denke er möchte sowas ähnliches machen wie es mit OOP möglich wäre. Man hat eine abstrakte Klasse "Plugin" und dann mehrere Klassen "Plugin1" bis "PluginX", die von dieser erben und sie erweitern. Dann kann man dynamisch Objekte von einem beliebigen Plugin erstellen, sie aber dem Typ "Plugin" zuordnen.
Aber stimmt schon. Module sind dafür eben nur begrenzt nutzbar, weil sie eben statisch sind.
Ich hab trotzdem versucht SBond irgendwie eine Möglichkeit für seinen Ansatz zu geben. Möglicherweise muss er aber auch nochmal komplett umdenken bei dem, was er vorhat.
Re: dynamischer Aufruf von Modulen
Verfasst: 07.02.2014 14:53
von helpy
Hier mal ein Code zum Testen:
Code: Alles auswählen
EnableExplicit
DeclareModule modTools
EnableExplicit
Declare AddInitProcedure( *InitProcedure, ModuleName.s )
Declare CallInitProcedures()
Macro SetInitProcedure()
If Defined( Init, #PB_Procedure )
modTools::AddInitProcedure( @Init(), #PB_Compiler_Module )
EndIf
EndMacro
EndDeclareModule
Module modTools
Prototype pInitProcedure()
Structure tInitProcedure
ModuleName.s
*InitProcedure.pInitProcedure
EndStructure
Global NewList InitProcedures.tInitProcedure()
Procedure AddInitProcedure( *InitProcedure, ModuleName.s )
If *InitProcedure
LastElement( InitProcedures() )
AddElement( InitProcedures() )
With InitProcedures()
\InitProcedure = *InitProcedure
\ModuleName = ModuleName
EndWith
EndIf
EndProcedure
Procedure CallInitProcedures()
Protected result
ForEach InitProcedures()
Debug "Call InitProcedure in module " + InitProcedures()\ModuleName
result = InitProcedures()\InitProcedure()
Debug " --> Result: " + Str(result)
Next
EndProcedure
EndModule
DeclareModule mod1
EnableExplicit
EndDeclareModule
Module mod1
Procedure Init()
Debug "Start of " + #PB_Compiler_Module + "::" + #PB_Compiler_Procedure
ProcedureReturn 10
EndProcedure
modTools::SetInitProcedure()
EndModule
DeclareModule mod2
EnableExplicit
EndDeclareModule
Module mod2
Procedure Init()
Debug "Start of " + #PB_Compiler_Module + "::" + #PB_Compiler_Procedure
ProcedureReturn 20
EndProcedure
modTools::SetInitProcedure()
EndModule
DeclareModule mod3
EnableExplicit
EndDeclareModule
Module mod3
Procedure Init()
Debug "Start of " + #PB_Compiler_Module + "::" + #PB_Compiler_Procedure
ProcedureReturn 30
EndProcedure
modTools::SetInitProcedure()
EndModule
modTools::CallInitProcedures()
Re: dynamischer Aufruf von Modulen
Verfasst: 07.02.2014 17:05
von SBond
...da wird ja doch recht komplex.
Hintergrund für mein Beispiel mit den Plugins, ist die eigentlich der Wunsch nach Quellcode-Optimierung

Ich stehe immer wieder vor dem Problem größere Projekte sauber zu strukturieren. Die Module habe ich erst vor kurzem bewusst wahr genommen.
Sie bieten eine gute Möglichkeit Prozeduren und Variablen zu kapseln. Daher kam mir der Gedanke, ob man das auch dynamisch umsetzen kann.
NicTheQuick hat schon richtig erkannt, wie ich es gemeint habe

.
...aber eventuell ist das ja wirklich zu weit hergeholt, als dass es einen praktischen Sinn erfüllt.
Re: dynamischer Aufruf von Modulen
Verfasst: 07.02.2014 17:16
von ts-soft
Bei Modulen gilt das Motto: Ganz oder garnicht
Das einzig geeignete wären UserLibraries, solange Du diese selbst erstelltst, sollten die ja auch kein
Problem darstellen.
UserLibraries werden nur hinzugelinkt, wenn verwendet und dann auch nur die erforderlichen Funktionen.
Die anderen Vorteile der Module wie Kapselung usw. stehen Dir dann auch zur Verfügung.
Einen anderen Weg sehe ich zur Zeit nicht.
Gruß
Thomas