<div dir="ltr"><div dir="ltr"><div class="gmail_default" style="font-size:small"><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sat, 28 Aug 2021 at 14:05, Tobias Boege via User <<a href="mailto:user@lists.gambas-basic.org">user@lists.gambas-basic.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">On Sat, 28 Aug 2021, Bruce Steers wrote:<br>
> Is it ,, could it possibly be possible to run a function from a String?<br>
> It would open up all sorts of possibilities.<br>
> <br>
> What i mean is for example maybe i want to make a timer to trigger a<br>
> function so i want to supply the function name but not run the function at<br>
> that time.<br>
> Eg.<br>
> Public Sub DeferCommand_Click()<br>
>   sFunctionName="RunNow"<br>
>   sFunctionArgs="a message"<br>
>   tFunctionTimer.Start()<br>
> End<br>
> <br>
> Public Sub FunctionTimer_Timer()<br>
>   Last.Stop<br>
> <br>
> '' This bit is where we hit a wall because i don't think anything like it<br>
> is possible, but would be sooo useful if it was.<br>
>   FMain.Functions[sFunctionName].Call(sFunctionArgs)<br>
> <br>
> End<br>
> <br>
> Public Sub RunNow(sMessage As String)<br>
>   Print "Running Now\n" & sMessage<br>
> End<br>
> -------------<br>
> <br>
> I should imaging the 3 dots ... could be utilized to transmit any number of<br>
> arguments<br>
> I of course have no real clue where to even begin to implement anything<br>
> like this.<br>
> That would be our Benoits bag of amazing insights :)<br>
> (<-- stands back and waits for the "nope, not ever!" :'( ;) )<br>
> <br>
> Any kind of way to implement something like that would be incredibly useful.<br>
> I hope I have been clear in my wish here.<br>
> kinda like bash 'eval' can turn a string into a function and run it.<br>
> <br>
<br>
Eval() exists in Gambas as well, but in this case I would use Object.Call().<br>
Your FMain.Functions[sFunctionName].Call(aFunctionArgs) becomes<br>
<br>
  Object.Call(FMain, sFunctionName, aFunctionArgs) ' arguments are an Array<br>
<br>
Remember that Gambas has almost no "functions". It has objects which have<br>
methods. It's better to think about it that way. It also implies that you<br>
need to have an object available to call a method on. An automatically<br>
created one like FMain suffices.<br>
<br>
Best,<br>
Tobias<br>
<br>
-- <br>
"There's an old saying: Don't change anything... ever!" -- Mr. Monk<br></blockquote><div><br></div><div style="font-size:small" class="gmail_default">Aaah , that's fantastic Tobias , many thanks.</div><div style="font-size:small" class="gmail_default"><br></div><div style="font-size:small" class="gmail_default">So now I've made a simple class file called RunFree.class ...</div><div style="font-size:small" class="gmail_default"><br></div><div style="font-size:small" class="gmail_default"><b>' Gambas class file<br>Export<br>Static Private $Timer As Timer<br>Static Private $Parent As Object<br>Static Private $Method As String<br>Static Private $ArgArray As Variant[]<br><br>Static Public Sub _init()<br>  <br>  $Timer = New Timer As "Timer"<br>  $Timer.Delay = 0<br><br>End<br><br><br>Static Public Sub _call(Parent As Object, Method As String, Optional ArgArray As Variant[])<br><br>  $Parent = Parent<br>  $Method = Method<br>  $ArgArray = ArgArray<br>  $Timer.Start<br><br>End<br><br>Static Public Sub Timer_Timer()<br><br>$Timer.Stop</b><br><b>Object.Call($Parent, $Method, $ArgArray)<br><br>End</b></div><div style="font-size:small" class="gmail_default"><br></div><div style="font-size:small" class="gmail_default"><br></div><div style="font-size:small" class="gmail_default">Now during my Event handler i can simply use</div><div style="font-size:small" class="gmail_default"><br></div><div style="font-size:small" class="gmail_default">RunFree(Me, "MyFunctionName", ["Plus", "Args"])</div><div style="font-size:small" class="gmail_default"><br></div><div style="font-size:small" class="gmail_default">That way the function (sorry Method, thanks for the correlation correction :) ) is run asynchronous of the event handler that is freed to move on :)<br></div><div style="font-size:small" class="gmail_default"><br></div><div style="font-size:small" class="gmail_default">The answer to my current set of prayers :)</div><div style="font-size:small" class="gmail_default"><br></div><div style="font-size:small" class="gmail_default">Awesome stuff , that's going to open up some options for me now :)</div><div style="font-size:small" class="gmail_default">Thanks again Tobias :)</div><div style="font-size:small" class="gmail_default">Respects</div><div style="font-size:small" class="gmail_default">BruceS</div><div style="font-size:small" class="gmail_default"><br></div></div></div>