Seite 1 von 2

String auflösen

Verfasst: 12.03.2013 20:26
von Skiller
hi experts,
habe diesmal wirklch lange gewühlt und ist mit Sicherheit auch supersimpel, aber wie kann ich einen String auflösen, um ihn als Procedure auszuführen.

Code: Alles auswählen

Procedure Func_1()
  Debug "Das ist Function 01"
EndProcedure

Macro _Macro(Multi_Funcs)
  Multi_Funcs
EndMacro

_Macro("Func_"+STR(1)+"()")
DANKE!!!

Re: String auflösen

Verfasst: 12.03.2013 20:34
von edel
Als String leider gar nicht, zumindest nicht ohne Umwege.

Code: Alles auswählen

Procedure Func_1()
  Debug "Das ist Function 01"
EndProcedure

Macro _Macro(num)
  Func_#num
EndMacro

_Macro(1)()

Re: String auflösen

Verfasst: 12.03.2013 20:37
von TroaX
Mit Makro geht es leider nicht, da das Makro den Code 1zu1 übernimmt. Es wird also folgendes draus:

Code: Alles auswählen

Macro _Macro(Multi_Funcs)
  "func_l()"
EndMacro
Mir fällt im Grunde nur eine CallDynamicFunktion mit Select-Case ein als Wrapper ein.

Re: String auflösen

Verfasst: 12.03.2013 20:43
von cxAlex
Mit Maps & Prototypes und einem Macro zur schöneren Schreibweise kein Problem:

Code: Alles auswählen

EnableExplicit

Prototype __Func()

Structure ___Func_Dummy
  *__caller.__Func
EndStructure

Global NewMap __Func.___Func_Dummy()

Macro RegisterFunc(_Name, FunctionPointer)
  __Func(_Name)\__caller = FunctionPointer
EndMacro

Macro Func(_n)
  __Func(_n)\__caller
EndMacro



; Test ...


Procedure Func1()
  Debug "Das ist Funktion 1"
EndProcedure

Procedure Func2()
  Debug "Das ist Funktion 2"
EndProcedure



RegisterFunc("1", @Func1())
RegisterFunc("2", @Func2())

Func("1")()
Func("2")()
Gruß, Alex

Re: String auflösen

Verfasst: 12.03.2013 20:47
von TroaX
Neee wie geil Danke. Genau das brauche ich auch. Supi! :-)

Auf die Idee wäre ich nie gekommen. LOL :-D

Re: String auflösen

Verfasst: 12.03.2013 21:06
von cxAlex
Auch wenn das jetzt vielleicht übertrieben ist, damit kann man natürlich nur Proceduren mit genau dieser Signatur (keine Parameter) aufrufen. Hier ein kleiner Code mit dem man verschiedene solcher "Funktionspools" mit definierbaren Parametern anlegen kann, die Handhabung sollte klar sein (hoffe ich):

Code: Alles auswählen

EnableExplicit

CompilerIf Not Defined(__macrobuilder, #PB_Constant)
  #__macrobuilder = #True
  Macro _Macro1
    M
  EndMacro
  
  Macro _Macro2
    acro
  EndMacro
  
  Macro _Macro
    : _Macro1#_Macro2
  EndMacro
  
  Macro _EndOfMacro1
    EndM
  EndMacro
  
  Macro _EndOfMacro
    : _EndOfMacro1#_Macro2
  EndMacro
CompilerEndIf

Macro NewFunctionPool(__PoolName, __Proto)

  Prototype __pro_#__PoolName#__Proto

  Structure ___Func_#__PoolName#_Dummy
    *__caller.__pro_#__PoolName
  EndStructure

  Global NewMap __Func_#__PoolName.___Func_#__PoolName#_Dummy()

  _Macro Register#__PoolName(_n, FunctionPointer)
    __Func_#__PoolName#(_n)\__caller = FunctionPointer#_EndOfMacro

  _Macro __PoolName#(_n)
  __Func_#__PoolName(_n)\__caller#_EndOfMacro

EndMacro


; Test ...


NewFunctionPool(Func, ())
NewFunctionPool(ExFunc, (String$, Number.l))



Procedure Func1()
  Debug "Das ist Funktion 1"
EndProcedure

Procedure Func2()
  Debug "Das ist Funktion 2"
EndProcedure


RegisterFunc("1", @Func1())
RegisterFunc("2", @Func2())

Func("1")()
Func("2")()



Procedure ExtendedFunc(Name$, Alter.l)
  Debug "Name: " + Name$ + " Alter: " + Str(Alter)
EndProcedure


RegisterExFunc("Ausgabe", @ExtendedFunc())

ExFunc("Ausgabe")("Herbert", 48)
Gruß, Alex

Re: String auflösen

Verfasst: 12.03.2013 21:20
von TroaX
Perfekt Danke! Hatte zwar die Frage nicht gestellt. Aber genial ist es trotzdem :-D

EINFALL: Man könnte natürlich auch alle seine Funktionen in eine DLL auslagern und die Funktionen mit CallFunction("NAME_DER_FUNKTION", PARAMETER) aufrufen. Das würde noch schneller gehen ;-)

Re: String auflösen

Verfasst: 12.03.2013 21:30
von cxAlex
TroaX hat geschrieben: EINFALL: Man könnte natürlich auch alle seine Funktionen in eine DLL auslagern und die Funktionen mit CallFunction("NAME_DER_FUNKTION", PARAMETER) aufrufen. Das würde noch schneller gehen ;-)
Nein, CallFunction() würde die Funktion "NAME_DER_FUNKTION" jedesmal in der Export - Tabelle der DLL auflösen, wobei man sowieso bei DLLs bevorzugt mit GetFunction() und Prototypes arbeiten sollte. Also hierbei mit RegisterFunc("blabla", GetFunction(hDLL, "NAME_DER_FUNKTION")), sollte schneller sein als jedesmal die Export - Table absuchen zu lassen.

Gruß, Alex

Re: String auflösen

Verfasst: 12.03.2013 21:38
von TroaX
Stimmt. Mit den Funktions-Pointern geht es schneller mit einer DLL. So muss jede Funktion nur einmal gesucht werden.

Re: String auflösen

Verfasst: 13.03.2013 10:28
von Skiller
Das es nun soooo einfach ist.... :freak: trotzdem Superr, Danke !!!!
-----------------------------------------------------------------------------
Jetzt noch mal was Anderes:

Code: Alles auswählen

#PB_Key_Minus
reagiert ab der 4.51 nicht... zumindest bei mir.
Könnt Ihr das mal checken? Gruß Skiller