[Gambas-user] Custom Control

Doriano Blengino doriano.blengino at ...1909...
Mon Nov 30 10:22:50 CET 2009


Benoît Minisini ha scritto:
>> Benoît Minisini wrote:
>>     
>>> In Gambas 3, the /control directory must be put inside the "Project"
>>> section.
>>>       
>> Okay, that worked. I was using the control directory automatically
>> created when I first created the project. Thanks.
>>
>>     
>>> Please provide the details of what you have done, and maybe I will tell
>>> you.
>>>       
>> I'm referring to code used when programming the component itself.
>>
>> For example, in the component code:
>>
>> Public Sub _new(lVal1 As Long, lVal2 As Long, Optional lVal3 As Long)
>>
>> If I make the component and try to use it in a project, I have to also
>> pass the parent container name. So, if I use:
>>
>> oVar = New ComponentName(lVal1, lVal2, lVal3, FMain)
>>
>> It works fine. But if I try to leave out the *optional* argument:
>>
>> oVar = New ComponentName(lVal1, lVal2, FMain)
>>
>> I will get "Not enough arguments" from the IDE. If I try:
>>
>> oVar = New ComponentName(lVal1, lVal2, , FMain)
>>
>> I will get "Unexpected Comma" from the IDE. And, of course, if I pass
>> NUll as the optional argument, it's the incorrect data type for the
>> argument. I understand why I'm getting the messages I'm getting. I'm
>> just asking is there any way to use an *optional* argument to the _new
>> sub of a component.
>>
>> This isn't something critical. This is just a personal project I chose
>> to do as an exercise, to get familiar with Gambas. I always do stuff
>> like this whenever I'm learning a new language or (in this case) IDE, etc.
>>
>>     
>
> You get a point there: optional arguments cannot really be used in 
> constructors, unless you do not use inheritance. Because the rule is that if 
> an argument is optional, all following arguments are. Which is a contradiction 
> with the way arguments are used.
>
> Maybe I should change the way arguments are consumed by inherited 
> constructors. I mean not inverting them, i.e. inverting them on the stack, so 
> that you write New MyControl(FMain, lVal1, lVal2...). But this will uses some 
> CPU.
>
> I must think about that...
>   
Just my opinion... that may be wrong.

An overriding method (and constructors too) should take the full control 
on what happens. So, the overriding method receives the arguments it 
needs (probably a parent window too, but who knows?), does with them 
whatever it likes, and in this process calls the inherited method when 
it likes. In this point of view, it would be not correct to have some 
automatic argument consuming. It is true that the programmer will have 
to explicitly call the inherited constructor, which in turn will call 
its inherited constructor and so on, but this is the whole philosophy. 
Suppose that you write a component which can be child only of certain 
parents (don't know... vboxes)? If you pass the wrong parent when 
instantiating it, the constructor can check for this and raise an 
exception. If the argument (parent in this case, but the same applies to 
any other argument) is consumed by something else, this check is not 
possible. I think this thought is more general than this stupid example 
I can produce just now. This would solve the optional parameters too.

Regards,
Doriano




More information about the User mailing list