[Gambas-user] Sub and Function hijack ?? is this possible ?

olivier coquet ocoquet at 3d-phenomen.fr
Wed Feb 17 09:31:27 CET 2021


Hello Brian,
Have you tried the code I sent and does it work for you?
What do you think about it?

friendship
Olivier C.

Le 17/02/2021 à 01:28, Brian G a écrit :
> It is trying to be dynamic with loaded classes on the fly, not bound 
> at compile time
>
> The attached script gives a demo or what I think we are talking about.
> More like this example:
>
> class xx
> Public sub _Call()
>   print "form"
> end
> Public sub MySub()
>   Print "form MySub"
> end
> Public Sub _new()
> ' stuff
> end
> end class
>
> class yy
> Public sub _Call()
> print "sub form"
> end
> Public sub MySub()
>   Print "sub form MySub"
> end
> Public sub _new()
> ' stuff
> end
> end class
>
> class vv
> Public sub _Call()
>  print "Sub Sub Form"
> end
> Public sub MySub()
>   Print "sub sub form MySub"
> end
> Public sub _new()
> 'stuff
> end
> end class
>
> 'Of course we could load a library or componant before creating an 
> instance of the contained class'
>
> Public sub main()
>    dim cButtons as new variant[]
>    dim oNew as variant
>    oNew = new xx
>    cButtons.add(oNew)
>    oNew = new yy
>    cButtons.add(oNew)
>    oNew = new vv
>    cButtons.add(oNew)
>
>   for each mButton as object in cButtons
>    ' call the same interface for each class
>    ' Using the same object or button assigned to the form
>      mButton()
>      mButton.MySub()
>   next
>
>   cButtons[1]()
>   cButtons[1].MySub()
>
>   ' mButton could be any object with the correct interface
>   ' display form with plugin button or redefined button
>
>
> end
>
> Thank You
> Brian G
>
> ------------------------------------------------------------------------
> *From: *"Brian" <brian at westwoodsvcs.com>
> *To: *"Gambas mailing list" <user at lists.gambas-basic.org>
> *Sent: *Tuesday, February 16, 2021 4:19:49 PM
> *Subject: *Re: [Gambas-user] Sub and Function hijack ?? is this possible ?
>
> or like this:
>
>
>
> Thank You
> Brian G
>
> From: "Jeff P. Zacher" <adsicks at gmail.com>
> To: "Gambas mailing list" <user at lists.gambas-basic.org>
> Sent: Tuesday, February 16, 2021 11:42:50 AM
> Subject: Re: [Gambas-user] Sub and Function hijack ?? is this possible ?
>
> If I run this code:
> ' In Form1
> Public Sub Test()
>   Print "form"
> End
>
>
> Public Sub Form_Open()
> Public sub _Call()
>   print "form"
> end
>
> Public sub MySub()
>   Print "form MySub"class xx
> end
>
> Public Sub _new()
> ' stuff
> end
>
> end class
>
> class yy
> Public sub _Call()
> print "sub form"
> end
>
> Public sub MySub()
>   Print "sub form MySub"
> end
>
> Public sub _new()
> ' stuff
> end
>
> end class
>
> class vv
> Public sub _Call()
>  print "Sub Sub Form"
> end
>
> Public sub MySub()
>   Print "sub sub form MySub"
> end
>
> Public sub _new()
> 'stuff
> end
>
> end class
>
> Public sub main()
>    dim cClasses as object[] 'get the classes instantiated
>    cClasses.add(new xx)   ' execute the init for each class
>    cClasses.add(new yy)
>    cClasses.add(new xx)
>
>   for each mClass as object in cClasses
>      mClass()
>      mClass.MySub()
>   next
>
>
> end
>
>
> Public sub _Call()
>   print "form"
> end
>
> Public sub MySub()
>   Print "form MySub"class xx
> end
>
> Public Sub _new()
> ' stuff
> end
>
> end class
>
> class yy
> Public sub _Call()
> print "sub form"
> end
>
> Public sub MySub()
>   Print "sub form MySub"
> end
>
> Public sub _new()
> ' stuff
> end
>
> end class
>
> class vv
> Public sub _Call()
>  print "Sub Sub Form"
> end
>
> Public sub MySub()
>   Print "sub sub form MySub"
> end
>
> Public sub _new()
> 'stuff
> end
>
> end class
>
> Public sub main()
>    dim cClasses as object[] 'get the classes instantiated
>    cClasses.add(new xx)   ' execute the init for each class
>    cClasses.add(new yy)
>    cClasses.add(new xx)
>
>   for each mClass as object in cClasses
>      mClass()
>      mClass.MySub()
>   next
>
>
> end
>
>
>
>   Test()
>
> End
>
>
> ' In Class1
>
> Public Sub Test()
>   Print "class"
> Endclass xxPublic sub _Call()
>   print "form"
> end
>
> Public sub MySub()
>   Print "form MySub"class xx
> end
>
> Public Sub _new()
> ' stuff
> end
>
> end class
>
> class yy
> Public sub _Call()
> print "sub form"
> end
>
> Public sub MySub()
>   Print "sub form MySub"
> end
>
> Public sub _new()
> ' stuff
> end
>
> end class
>
> class vv
> Public sub _Call()
>  print "Sub Sub Form"
> end
>
> Public sub MySub()
>   Print "sub sub form MySub"
> end
>
> Public sub _new()
> 'stuff
> end
>
> end class
>
> Public sub main()
>    dim cClasses as object[] 'get the classes instantiated
>    cClasses.add(new xx)   ' execute the init for each class
>    cClasses.add(new yy)
>    cClasses.add(new xx)
>
>   for each mClass as object in cClasses
>      mClass()
>      mClass.MySub()
>   next
>
>
> end
>
>
>
> Public sub _Call()
>   print "form"
> end
>
> Public sub MySub()Public sub _Call()
>   print "form"
> end
>
> Public sub MySub()
>   Print "form MySub"class xx
> end
>
> Public Sub _new()
> ' stuff
> end
>
> end class
>
> class yy
> Public sub _Call()
> print "sub form"
> end
>
> Public sub MySub()
>   Print "sub form MySub"
> end
>
> Public sub _new()
> ' stuff
> end
>
> end class
>
> class vv
> Public sub _Call()
>  print "Sub Sub Form"
> end
>
> Public sub MySub()
>   Print "sub sub form MySub"
> end
>
> Public sub _new()
> 'stuff
> end
>
> end class
>
> Public sub main()
>    dim cClasses as object[] 'get the classes instantiated
>    cClasses.add(new xx)   ' execute the init for each class
>    cClasses.add(new yy)
>    cClasses.add(new xx)
>
>   for each mClass as object in cClasses
>      mClass()
>      mClass.MySub()
>   next
>
>
> end
>
>
>
>   Print "form MySub"
> end
>
> Public Sub _init()
> ' stuff
> end
>
> end class
>
> class yy
> Public sub _Call()
> print "sub form"
> end
> Public sub _Call()
>   print "form"
> end
>
> Public sub MySub()
>   Print "form MySub"class xx
> end
>
> Public Sub _new()
> ' stuff
> end
>
> end class
>
> class yy
> Public sub _Call()
> print "sub form"
> end
>
> Public sub MySub()
>   Print "sub form MySub"
> end
>
> Public sub _new()
> ' stuff
> end
>
> end class
>
> class vv
> Public sub _Call()
>  print "Sub Sub Form"
> end
>
> Public sub MySub()
>   Print "sub sub form MySub"
> end
>
> Public sub _new()
> 'stuff
> end
>
> end class
>
> Public sub main()
>    dim cClasses as object[] 'get the classes instantiated
>    cClasses.add(new xx)   ' execute the init for each class
>    cClasses.add(new yy)
>    cClasses.add(new xx)
>
>   for each mClass as object in cClasses
>      mClass()
>      mClass.MySub()
>   next
>
>
> end
>
>
>
> Public sub MySub()
>   Print "sub form MySub"
> end
>
> Public sub _init()
> ' stuff
> end
>
> end class
>
> class vv
> Public sub _Call()
>  print "Sub Sub Form"
> end
>
> Public sub MySub()
>   Print "sub sub form MySub"
> end
>
> Public sub _init()
> 'stuff
> end
>
> end class
>
> Public sub main()
>    dim cClasses as object[] 'get the classes instantiated
>    cClasses.add(new xx)   ' execute the init for each class
>    cClasses.add(new yy)
>    cClasses.add(new xx)
>
>   for each mClass as object in cClasses
>      mClass()
>      mClass.MySub()
>   next
>
>
> end sub
>
> end
>
>
>
>
> Thank You
> Brian G
>
> From: "Jeff P. Zacher" <adsicks at gmail.com>
> To: "Gambas mailing list" <user at lists.gambas-basic.org>
> Sent: Tuesday, February 16, 2021 11:42:50 AM
> Subject: Re: [Gambas-user] Sub and Function hijack ?? is this possible ?
>
> If I run this code:
> ' In Form1
> Public Sub Test()
>   Print "form"
> End
>
>
> Public Sub Form_Open()
>
>   Test()
>
> End
>
>
> ' In Class1
>
> Public Sub Test()
>   Print "class"
> End
> ' stuff
> end
>
> end class
>
> class yy
> Public sub _Call()
> print "sub form"
> end
>
> Public sub MySub()
>   Print "sub form MySub"
> end
>
> Public sub _init()
> ' stuff
> end
>
> end class
>
> class vv
> Public sub _Call()
>  print "Sub Sub Form"
> end
>
> Public sub MySub()
>   Print "sub sub form MySub"
> end
>
> Public sub _init()
> 'stuff
> end
>
> end class
>
> Public sub main()
>    dim cClasses as object[] 'get the classes instantiated
>    cClasses.add(new xx)   ' execute the init for each class
> cClasses.add(new yy)
> cClasses.add(new xx)class xx
> Public sub _Call()
>   print "form"
> end
>
> Public sub MySub()
>   Print "form MySub"
> end
>
> Public Sub _init()
> ' stuff
> end
>
> end class
>
> class yy
> Public sub _Call()
> print "sub form"
> end
>
> Public sub MySub()
>   Print "sub form MySub"
> end
>
> Public sub _init()
> ' stuff
> end
>
> end class
>
> class vv
> Public sub _Call()
>  print "Sub Sub Form"
> end
>
> Public sub MySub()
>   Print "sub sub form MySub"
> end
>
> Public sub _init()
> 'stuff
> end
>
> end class
>
> Public sub main()
>    dim cClasses as object[] 'get the classes instantiated
>    cClasses.add(new xx)   ' execute the init for each class
>    cClasses.add(new yy)
>    cClasses.add(new xx)
>
>   for each mClass as object in cClasses
>      mClass()
>      mClass.MySub()
>   next
>
>
> end sub
>
> end
>
>
>
>
> Thank You
> Brian G
>
> From: "Jeff P. Zacher" <adsicks at gmail.com>
> To: "Gambas mailing list" <user at lists.gambas-basic.org>
> Sent: Tuesday, February 16, 2021 11:42:50 AM
> Subject: Re: [Gambas-user] Sub and Function hijack ?? is this possible ?
>
> If I run this code:
> ' In Form1
> Public Sub Test()
>   Print "form"
> End
>
>
> Public Sub Form_Open()
>
>   Test()
>
> End
>
>
> ' In Class1
>
> Public Sub Test()
>   Print "class"
> Endclass xx
> Public sub _Call()
>   print "form"
> end
>
> Public sub MySub()
>   Print "form MySub"
> end
>
> Public Sub _init()
> ' stuff
> end
>
> end class
>
> class yy
> Public sub _Call()
> print "sub form"
> end
>
> Public sub MySub()
>   Print "sub form MySub"
> end
>
> Public sub _init()
> ' stuff
> end
>
> end class
>
> class vv
> Public sub _Call()
>  print "Sub Sub Form"
> end
>
> Public sub MySub()
>   Print "sub sub form MySub"
> end
>
> Public sub _init()
> 'stuff
> end
>
> end class
>
> Public sub main()
>    dim cClasses as object[] 'get the classes instantiated
>    cClasses.add(new xx)   ' execute the init for each class
>    cClasses.add(new yy)
>    cClasses.add(new xx)
>
>   for each mClass as object in cClasses
>      mClass()
>      mClass.MySub()
>   next
>
>
> end sub
>
> end
>
>
>
>
> Thank You
> Brian G
>
> From: "Jeff P. Zacher" <adsicks at gmail.com>
> To: "Gambas mailing list" <user at lists.gambas-basic.org>
> Sent: Tuesday, February 16, 2021 11:42:50 AM
> Subject: Re: [Gambas-user] Sub and Function hijack ?? is this possible ?
>
> If I run this code:
> ' In Form1
> Public Sub Test()
>   Print "form"
> End
>
>
> Public Sub Form_Open()
>
>   Test()
>
> End
>
>
> ' In Class1
>
> Public Sub Test()
>   Print "class"
> End
>
> for each mClass as object in cClasses
>  mClass()
>  mClass.MySub()
> next
>
>
> end sub
>
> end
>
>
>
>
> Thank You
> Brian G
>
> ------------------------------------------------------------------------
> *From: *"Jeff P. Zacher" <adsicks at gmail.com>
> *To: *"Gambas mailing list" <user at lists.gambas-basic.org>
> *Sent: *Tuesday, February 16, 2021 11:42:50 AM
> *Subject: *Re: [Gambas-user] Sub and Function hijack ?? is this possible ?
>
> If I run this code:
>
> ' In Form1
>
> Public Sub Test()
>
>   Print "form"
>
> End
>
>
> Public Sub Form_Open()
>
>   Test()
>
> End
>
>
> ' In Class1
>
> Public Sub Test()
>
>   Print "class"
>
> End
>
> I get the following output:
>
> form
>
> What am I missing? This is what I would expect.
>
>
> If you want to overload, just create a class that inherts a form class 
> and overload it....
>
>
> On 2/15/21 10:58 AM, Brian G wrote:
>
>     Are you adding dynamic classes as plugins? Not sure when this
>     would be needed? Or are you defining classes on the fly in you code?
>
>     Would be interesting to know how your using it!
>
>     It is a simple way of writing once and basically having a sort of
>     self modifying code. That is any module or class can change the
>     actual destination of a call without the main process knowing
>     about it.
>
>
>     Thank You
>     Brian G
>
>     ------------------------------------------------------------------------
>     *From: *"olivier coquet" <ocoquet at 3d-phenomen.fr>
>     *To: *"Gambas mailing list" <user at lists.gambas-basic.org>
>     *Sent: *Monday, February 15, 2021 5:35:10 AM
>     *Subject: *Re: [Gambas-user] Sub and Function hijack ?? is this
>     possible ?
>
>     Le 14/02/2021 à 21:44, Jussi Lahtinen a écrit :
>
>
>
>         On Sun, Feb 14, 2021 at 10:05 AM olivier coquet
>         <ocoquet at 3d-phenomen.fr <mailto:ocoquet at 3d-phenomen.fr>> wrote:
>
>             Le 13/02/2021 à 20:45, Christof Thalhofer a écrit :
>
>                     Am 13.02.21 um 09:08 schrieb olivier coquet:
>
>                         A question to specialists, is it possible to hijack a procedure or
>                         function?
>                         Let me explain:
>                         in my FMain class, I have a procedure:
>
>                         public sub maprocédure()
>
>                     This "é" should nor be allowed in the name of a symbol.
>
>                         print "toto"
>                         end sub
>
>                         in a maclasse class, I have a second procedure:
>                         public sub maprocédure()
>                         print "titi"
>                         end sub
>
>                         I would like that during a call: maprocédure() in the FMain class, it is
>                         the one of the maclasse class that runs and not the one of FMain.
>
>                         Is this possible?
>                         and how?
>
>                     No. The only possibility is that in Fmail you call
>                     this: maclasse.maprocedure()
>
>                 Hello Christof and thank you for your answer.
>
>                 As I'm French, I'm stubborn :)
>                 So I dug a little bit into the problem and I found a solution.
>
>                 Just declare a public variable (*varfct*) of type object in fmain and initialize it with "Me".
>                 In Fmain we call the procedure in this way:
>
>                 /varfct.maprocedure()/
>
>                 In the main() of the class added next, I change the value of*varfct*  by "Me" (the one of the new class), and it's done, the call changes destination without changing the main() code.
>
>                 Not very elegant but it works.
>
>                 Friendship
>                 Olivier Coquet
>
>                 Translated withwww.DeepL.com/Translator  <http://www.DeepL.com/Translator>  (free version)
>
>
>         I don't quite understand what you are trying to achieve, but
>         "Me" can refer to any class (here FMain or maclasse).
>         So, even when your variable name stays the same (varfct), you
>         are essentially doing the same as this:
>
>         FMain.maprocedure
>         maclasse.maprocedure
>
>         or perhaps more enlightingly:
>
>         Dim hObj as object
>
>         hObj = FMain
>         hObj.maprocedure
>
>         hObj = maclasse
>         hObj.maprocedure
>
>
>         Jussi
>
>     Hi jussi,
>
>     Thank you for your response,
>     To answer your question, I have been working for 3 months on a
>     home automation project that involves the use of several elements.
>     The first one, an http server that is simple to implement and that
>     integrates perfectly with a gambas program has been made as a
>     gambas component (see my messages about this) is perfectly
>     operational.
>     The second one is the main program that takes care of the
>     management of the connected objects, the scenarios and the launch
>     schedule of each scenario is also operational (well almost, still
>     some bugs).
>     The third one is a system that would allow to add functions at
>     will to the main program without rewriting it.
>     It is on this last point that I am working on, a plugin system
>     that installs itself and joins the main program. To do this, I use
>     a component that I made in a special way.
>     Its functions:
>     - Able to create new buttons on the interface of the main program.
>     - Manage these buttons.
>     - To be able to substitute its own functions and procedures to
>     those of the main program without modifying it.
>     - Do not disturb the main program if the plugin is not installed.
>
>     Hence my last question and the answer I gave there this weekend
>     So my plugin system is now operational, if someone is interested,
>     I can send the sources of a test plugin and the sources of an
>     example program implementing it.
>
>     Friendship
>     Olivier COQUET
>
>
>     Translated with www.DeepL.com/Translator (free version)
>
>
>
>     ----[ http://gambaswiki.org/wiki/doc/netiquette ]----
>
>     ----[http://gambaswiki.org/wiki/doc/netiquette  ]----
>
>
>
> ----[ http://gambaswiki.org/wiki/doc/netiquette ]----
>
>
> ----[ http://gambaswiki.org/wiki/doc/netiquette ]----


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.gambas-basic.org/pipermail/user/attachments/20210217/7929da92/attachment-0001.htm>


More information about the User mailing list