Hi,

> Hi Viktor, I was about to send this message to the list when I had a
> shocking vision....
> 
> In postgres.c it is NORMAL to discriminate between objects... there is
> no use in passing type X instead of type Y and it must be avoided and
> RTE is good.....
> 
> But in Qt we have a HIERARCHY !
> 
> It is perfectly normal to pass a QPushButton to a function that
> expects a QObject !!!!!!!!!! since QObject is a super-class !
> 
> Since we don't store the object hierarchy Pritpal just checks that
> ClassName() starts with a Q or HB .... and keeps the finger crossed...

That's even worse than handling everything as the base class.

> I believe it is the same at C++ level... At Harbour level we may check
> if the object has a specific class member before accepting.... At GC
> level we may differentiate destructors according to the main class:
> objects deriving from QObject have destructor D1 and use guarded
> pointers...other super-classes have other destructor so that we can
> avoid some stupid parameter mistakes.... This permits to pass a
> QPushButton where a QObject is expected and it will work.... but it
> will also permit to pass a QObject to a function expecting a
> QPushButton and this will GPF at 99%....
> 
> What do you think about it ?

First I think we need to make sure we can identify the 
class of every GC allocated objects. If we can do this, 
we may make the next step and properly filter accepted 
parameters. For this we also need to maintain the layout 
of the QT class hierarchy. This raises other issues, like 
how to keep this in sync with QT version. This information 
BTW is already maintained in HBQT on the .prg level.

So you could make sth like:

HB_FUNC( QT_SOME_METHOD )
{
   if( hbqt_par_isQPUSHBUTTON( 1 ) )
      ... pass the call to QT...
}

or

HB_FUNC( QT_SOME_METHOD_2 )
{
   if( hbqt_par_isQCONTROL_or_descendant( 1 ) )
      ... pass the call to QT...
}

Another random thought: Maybe it would be worth to 
investigate if it would be useful to merge current 
separate .prg level HBQT class wrappers with low-level 
method implementations on the .cpp level.

In Harbour it's possible to create classes purely in .c/.cpp 
code, so this may give performance and may help maintaining 
the whole thing. (see src/rtl/errapi.c)

BTW, if we could properly identify object types, current 
hack of method overloading on the wrapper level could also be 
change for a better solution. I mean code like this:
---
HB_FUNC( QT_QTRANSLATOR_TRANSLATE )
{
   hb_retc( hbqt_par_QTranslator( 1 )->translate( hbqt_par_char( 2 ), 
hbqt_par_char( 3 ), hbqt_par_char( 4 ) ).toAscii().data() );
}

HB_FUNC( QT_QTRANSLATOR_TRANSLATE_1 )
{
   hb_retc( hbqt_par_QTranslator( 1 )->translate( hbqt_par_char( 2 ), 
hbqt_par_char( 3 ), hbqt_par_char( 4 ), hb_parni( 5 ) ).toAscii().data() );
}
---
(though in this specific case it could be fixed easily even now)

Just thoughts.

I'm also forwarding this to mailing list in the hope to 
ignite interest in other contributors.

Brgds,
Viktor

_______________________________________________
Harbour mailing list (attachment size limit: 40KB)
Harbour@harbour-project.org
http://lists.harbour-project.org/mailman/listinfo/harbour

Reply via email to