[Gambas-user] Passing ... parameters
Bruce Bruen
bbruen at ...2308...
Fri Dec 9 23:00:45 CET 2011
Fabian and Jussi,
Thanks guys, this is now so close it hurts!
On Fri, 2011-12-09 at 20:04 +0200, Jussi Lahtinen wrote:
> Perhaps you need something like this:
>
> Public Function F1(...) As Integer
>
> Return F2(Param.All)
>
> End
>
That (Param.All) appears to be the big part of the solution.
However, it has a little problem in my particular situation that's way
down the bottom of this post.
On Fri, 2011-12-09 at 20:04 +0200, Jussi Lahtinen wrote:
> But even better if you can change the structure of your program so that you
> don't have to re-pass all the parameters.
> BTW. Do you know command TypeOf() ? It may be useful with this case.
On Fri, 2011-12-09 at 13:30 +0100, Fabien Bodard wrote:
> to use "..." it's really rare it's for polymorphe call via a hard
> coded function :
>
> F2(toto, tata, titi)
> F2(toto,tata)
>
> but it not seem to be your case
Here's the real situation, which explains what I'm trying to do.
I have 5 production systems in gambas 2 that are represented by over 80
gambas projects. They
each use one of three gb2 components to do database access. These 3
libraries are very similar
functionally, they implement the Create, Read, Update and Delete actions
on the database and some
other utility functions (like checking if a row exists for a primary key
value).
In moving these to gambas3, I am trying to merge the three gb2
components into a single gb3 library.
This has been 99% successful, everything but the Read functions have
been rationalised, merged and
now all these functions work using common function calls.
Read is the problem, one gb2 component's Read function uses an array of
primary key values, one uses a
"pseudo query" string and one uses a class that represents a "query by
example" structure. There are
hundreds, possibly thousands, of calls to the Read function spread
throughout all these gb2 projects. The
signatures look like this:
Public Function DBRead(oTarget as Object, vPKey as Variant[]) as
Boolean
Public Function DBRead(oTarget as Object,sQuery as String, Optional
sSort as String) as Boolean
Public Function DBRead(oQBE as QBE) as Boolean
where oTarget is the object that the data will be loaded into.
The functionality of the three Reads is the same - the rows read from
the database end up in the target
object. The only differences are the calling signature and how the
target is specified (in the QBE example it
is inside the oQBE class).
So, here's my desire:
Rather then go through all the projects and "fix" all of the calls to a
common signature, I thought I could
make a "wrapper" function in the new library:
Public Function DBRead(...) as Boolean
that would look at the Params and call an appropriate internal function
to handle each type. I think that would
be a lot quicker.
As usual, I have complicated the problem by putting the wrapper function
in a class that inherits the base DBAccess
class. The reason being that at some time in the future, the calls will
all be rationalised to a single signature. For
instance, I'll possibly retire the QBE method as it is overly complex.
The pseudo code for the public DBRead now looks like this:
Public Function DBRead(...) as Boolean
Dim localtarget as Object
Dim localquery as String
Dim localsort as String
If Param.Count = 1 and Param[0] is QBE then
decipher_QBE(Param[0],localtarget,localquery,localsort)
Return Super.DBRead(localobject,localquery,localsort)
else
Return Super.DBRead(Param.All)
Endif
The base class DBRead(...) theortically can decipher which call type
it's got OK.
BUT~!
I can't debug it???
When I try and display the Param class in the debugger or include things
like Debug Param[0] it shows an "Out Of Bounds" error.
Is this something I've done or a gb3 issue?
regards
Bruce
More information about the User
mailing list