From 914f285220b04d6b17087df0ee10ff20d27096cd Mon Sep 17 00:00:00 2001 From: Pritpal Bedi Date: Sat, 12 May 2012 01:54:41 +0000 Subject: [PATCH] 2012-05-11 18:45 UTC-0800 Pritpal Bedi (bedipritpal@hotmail.com) * contrib/hbide/idefunctions.prg * contrib/hbide/ideharbourhelp.prg * contrib/hbide/idemain.prg * contrib/hbide/idemisc.prg * contrib/hbide/ideshortcuts.prg * Optimized: to avoid repeated QApplication() object creation and destruction. * contrib/hbqt/qtcore/hbqt_hbqslots.cpp * contrib/hbqt/qtcore/hbqt_misc.prg * contrib/hbqt/qtcore/hbqt_pointer.cpp * Changed: the way :connect()/disConnect() could been applied to an object. Now programmer cannot make a mistake, controlling one more pitfall. * contrib/hbqt/qtcore/qth/QUrl.qth * contrib/hbqt/qtgui/qth/QListWidgetItem.qth - Inherits = QObject * contrib/hbqt/qtgui/qth/QWidget.qth - PainEvent = YES ; NOTE: still "Reference to freed block" messages at EXIT are unresolved and very much reproducable. --- harbour/ChangeLog | 26 +++++++ harbour/contrib/hbide/idefunctions.prg | 9 ++- harbour/contrib/hbide/ideharbourhelp.prg | 5 +- harbour/contrib/hbide/idemain.prg | 2 - harbour/contrib/hbide/idemisc.prg | 2 - harbour/contrib/hbide/ideshortcuts.prg | 3 +- harbour/contrib/hbqt/qtcore/hbqt_hbqslots.cpp | 7 +- harbour/contrib/hbqt/qtcore/hbqt_misc.prg | 70 +++++++++++++++---- harbour/contrib/hbqt/qtcore/hbqt_pointer.cpp | 9 ++- harbour/contrib/hbqt/qtcore/qth/QUrl.qth | 2 +- .../hbqt/qtgui/qth/QListWidgetItem.qth | 2 +- harbour/contrib/hbqt/qtgui/qth/QWidget.qth | 2 - 12 files changed, 108 insertions(+), 31 deletions(-) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 3613775667..f67f99e009 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -16,6 +16,32 @@ The license applies to all entries newer than 2009-04-28. */ +2012-05-11 18:45 UTC-0800 Pritpal Bedi (bedipritpal@hotmail.com) + * contrib/hbide/idefunctions.prg + * contrib/hbide/ideharbourhelp.prg + * contrib/hbide/idemain.prg + * contrib/hbide/idemisc.prg + * contrib/hbide/ideshortcuts.prg + * Optimized: to avoid repeated QApplication() object creation + and destruction. + + * contrib/hbqt/qtcore/hbqt_hbqslots.cpp + * contrib/hbqt/qtcore/hbqt_misc.prg + * contrib/hbqt/qtcore/hbqt_pointer.cpp + * Changed: the way :connect()/disConnect() could been + applied to an object. Now programmer cannot make + a mistake, controlling one more pitfall. + + * contrib/hbqt/qtcore/qth/QUrl.qth + * contrib/hbqt/qtgui/qth/QListWidgetItem.qth + - Inherits = QObject + + * contrib/hbqt/qtgui/qth/QWidget.qth + - PainEvent = YES + + ; NOTE: still "Reference to freed block" messages at EXIT + are unresolved and very much reproducable. + 2012-05-11 01:45 UTC-0800 Pritpal Bedi (bedipritpal@hotmail.com) * contrib/hbqt/hbmk2_qt.hb + Applied: concept forwarded by Francessco a few days back, diff --git a/harbour/contrib/hbide/idefunctions.prg b/harbour/contrib/hbide/idefunctions.prg index 97b893f01b..f448b0e9b2 100644 --- a/harbour/contrib/hbide/idefunctions.prg +++ b/harbour/contrib/hbide/idefunctions.prg @@ -440,6 +440,7 @@ METHOD IdeFunctions:enableControls( lEnable ) METHOD IdeFunctions:loadTags( aProjects ) LOCAL cProjectTitle, cProjFile, cTagFile, aTags, n, a_ LOCAL lPopulate := .f. + LOCAL qApp := QApplication() DEFAULT aProjects TO ::getMarkedProjects() @@ -468,7 +469,7 @@ METHOD IdeFunctions:loadTags( aProjects ) ENDIF ENDIF - QApplication():processEvents() + qApp:processEvents() IF ::lQuitting EXIT ENDIF @@ -508,6 +509,7 @@ METHOD IdeFunctions:tagProject( cProjectTitle ) LOCAL aSumData := "" LOCAL cComments, aSummary, cPath, cSource, cExt, aTags, aText, aFuncList, aLines LOCAL cProjFile, cRoot, aCTags, aSources, cSrc, a_, n + LOCAL qApp := QApplication() IF !( ::inAction ) ::enableControls( .f. ) @@ -541,7 +543,7 @@ METHOD IdeFunctions:tagProject( cProjectTitle ) ENDIF ENDIF - QApplication():processEvents() + qApp:processEvents() IF ::lQuitting EXIT ENDIF @@ -603,6 +605,7 @@ METHOD IdeFunctions:consolidateList() METHOD IdeFunctions:populateTable() LOCAL oTbl, qItm, a_, n + LOCAL qApp := QApplication() ::clear( .t. ) ::buildHeader() @@ -619,7 +622,7 @@ METHOD IdeFunctions:populateTable() oTbl:setItem( n, 0, qItm ) oTbl:setRowHeight( n, 16 ) - QApplication():processEvents() + qApp:processEvents() IF ::lQuitting EXIT ENDIF diff --git a/harbour/contrib/hbide/ideharbourhelp.prg b/harbour/contrib/hbide/ideharbourhelp.prg index c9b9104c48..60c938473a 100644 --- a/harbour/contrib/hbide/ideharbourhelp.prg +++ b/harbour/contrib/hbide/ideharbourhelp.prg @@ -1422,7 +1422,8 @@ METHOD IdeHarbourHelp:exportAsPdf() METHOD IdeHarbourHelp:exportAsPdfAll() LOCAL cPdf, qPrinter, cExt, cPath, cFile, aItems - + LOCAL qApp := QApplication() + IF empty( ::aNodes ) RETURN Self ENDIF @@ -1433,7 +1434,7 @@ METHOD IdeHarbourHelp:exportAsPdfAll() FOR EACH aItems IN ::aNodes ::oUI:q_treeDoc:setCurrentItem( aItems[ 1 ], 0 ) - QApplication():processEvents() + qApp:processEvents() IF ::lQuitting EXIT ENDIF diff --git a/harbour/contrib/hbide/idemain.prg b/harbour/contrib/hbide/idemain.prg index dba47cb075..0f512bd4f8 100644 --- a/harbour/contrib/hbide/idemain.prg +++ b/harbour/contrib/hbide/idemain.prg @@ -140,10 +140,8 @@ FUNCTION Main( ... ) #if 0 oTmp:create() oTmp:destroy() - oTmp := NIL #else oTmp:create() - oTmp := NIL #endif RETURN NIL diff --git a/harbour/contrib/hbide/idemisc.prg b/harbour/contrib/hbide/idemisc.prg index 80c95d1551..2bf3f26dbe 100644 --- a/harbour/contrib/hbide/idemisc.prg +++ b/harbour/contrib/hbide/idemisc.prg @@ -245,8 +245,6 @@ FUNCTION hbide_getYesNo( cMsg, cInfo, cTitle ) oMB:setInformativeText( cInfo ) ENDIF oMB:setIcon( QMessageBox_Information ) - oMB:setParent( SetAppWindow():oWidget ) - oMB:setWindowFlags( Qt_Dialog ) oMB:setWindowTitle( cTitle ) oMB:setStandardButtons( QMessageBox_Yes + QMessageBox_No ) diff --git a/harbour/contrib/hbide/ideshortcuts.prg b/harbour/contrib/hbide/ideshortcuts.prg index b6642aac73..4ae22cf6a6 100644 --- a/harbour/contrib/hbide/ideshortcuts.prg +++ b/harbour/contrib/hbide/ideshortcuts.prg @@ -649,6 +649,7 @@ METHOD IdeShortcuts:clearDftSCuts() METHOD IdeShortcuts:populateDftSCuts() LOCAL a_, nRow LOCAL oTbl := ::oUI:q_tableMacros + LOCAL qApp := QApplication() oTbl:setRowCount( len( ::aDftSCuts ) ) @@ -657,7 +658,7 @@ METHOD IdeShortcuts:populateDftSCuts() nRow++ aadd( ::aDftSCutsItms, array( 6 ) ) ::array2table( nRow, a_ ) - QApplication():processEvents() + qApp:processEvents() IF ::lQuitting EXIT ENDIF diff --git a/harbour/contrib/hbqt/qtcore/hbqt_hbqslots.cpp b/harbour/contrib/hbqt/qtcore/hbqt_hbqslots.cpp index 7df84e4888..9e91ec3eb0 100644 --- a/harbour/contrib/hbqt/qtcore/hbqt_hbqslots.cpp +++ b/harbour/contrib/hbqt/qtcore/hbqt_hbqslots.cpp @@ -117,15 +117,17 @@ HBQSlots::HBQSlots( PHB_ITEM pObj ) : QObject() HBQSlots::~HBQSlots() { int i; - + HB_TRACE( HB_TR_DEBUG, ( "Destroying: HBQSlots Size = %i", listBlock.size() ) ); for( i = listBlock.size() - 1; i >= 0 ; i-- ) { if( listBlock[ i ] != NULL ) { + HB_TRACE( HB_TR_DEBUG, ( "HBQSlots::~HBQSlots() item %d", i ) ); hb_itemRelease( listBlock.at( i ) ); listBlock[ i ] = NULL; } } + listBlock.clear(); } int HBQSlots::hbConnect( PHB_ITEM pObj, char * pszSignal, PHB_ITEM bBlock ) @@ -226,7 +228,10 @@ int HBQSlots::hbDisconnect( PHB_ITEM pObj, char * pszSignal ) if( signalId != -1 ) { if( QMetaObject::disconnect( object, signalId, 0, 0 ) ) + { + HB_TRACE( HB_TR_DEBUG, ( "HBQSlots::hbDisconnect( %s )", pszSignal ) ); nResult = 0; + } else nResult = 5; } diff --git a/harbour/contrib/hbqt/qtcore/hbqt_misc.prg b/harbour/contrib/hbqt/qtcore/hbqt_misc.prg index e49c7e286d..725db319ce 100644 --- a/harbour/contrib/hbqt/qtcore/hbqt_misc.prg +++ b/harbour/contrib/hbqt/qtcore/hbqt_misc.prg @@ -62,18 +62,20 @@ CREATE CLASS HbQtObjectHandler VAR pPtr /* TODO: Rename to __pPtr */ - VAR __pSlots PROTECTED - VAR __pEvents PROTECTED + VAR __pSlots PROTECTED + VAR __pEvents PROTECTED + VAR hEvents INIT {=>} + METHOD hasValidPointer() METHOD connect( cnEvent, bBlock ) METHOD disconnect( cnEvent ) + DESTRUCTOR _destroy() - ERROR HANDLER onError() -ENDCLASS + ENDCLASS /*----------------------------------------------------------------------*/ @@ -112,13 +114,25 @@ METHOD HbQtObjectHandler:onError() METHOD HbQtObjectHandler:connect( cnEvent, bBlock ) LOCAL nResult + IF ! __objDerivedFrom( Self, "QOBJECT" ) + RETURN .f. + ENDIF + IF ! hb_isBlock( bBlock ) RETURN .f. ENDIF + IF hb_hHasKey( ::hEvents, cnEvent ) + IF hb_isNumeric( ::hEvents[ cnEvent ] ) + ::__pEvents:hbDisconnect( Self, cnEvent ) + ELSE + ::__pSlots:hbDisconnect( Self, cnEvent ) + ENDIF + ::hEvents[ cnEvent ] := NIL + ENDIF + SWITCH ValType( cnEvent ) CASE "C" - IF Empty( ::__pSlots ) ::__pSlots := HBQSlots( Self ) ENDIF @@ -126,6 +140,7 @@ METHOD HbQtObjectHandler:connect( cnEvent, bBlock ) SWITCH nResult CASE 0 + ::hEvents[ cnEvent ] := cnEvent RETURN .T. CASE 8 /* QT connect call failure */ RETURN .F. @@ -148,6 +163,7 @@ METHOD HbQtObjectHandler:connect( cnEvent, bBlock ) SWITCH nResult CASE 0 + ::hEvents[ cnEvent ] := cnEvent RETURN .T. CASE -3 /* bBlock not supplied */ RETURN .F. @@ -157,27 +173,36 @@ METHOD HbQtObjectHandler:connect( cnEvent, bBlock ) OTHERWISE nResult := 99 + ENDSWITCH __hbqt_error( 1200 + nResult ) - RETURN .F. /*----------------------------------------------------------------------*/ METHOD HbQtObjectHandler:disconnect( cnEvent ) - LOCAL nResult := 0 + + IF ! __objDerivedFrom( Self, "QOBJECT" ) + RETURN .f. + ENDIF + + IF ! hb_hHasKey( ::hEvents, cnEvent ) + RETURN .f. + ENDIF + SWITCH ValType( cnEvent ) CASE "C" IF ! empty( ::__pSlots ) - nResult := ::__pSlots:hbdisconnect( Self, cnEvent ) + nResult := ::__pSlots:hbDisconnect( Self, cnEvent ) ENDIF SWITCH nResult CASE 0 CASE 4 /* signal not found in object */ CASE 5 /* disconnect failure */ + ::hEvents[ cnEvent ] := NIL RETURN .T. CASE 1 /* wrong slot container, no connect was called yet */ CASE 2 /* object has been already freed */ @@ -193,6 +218,7 @@ METHOD HbQtObjectHandler:disconnect( cnEvent ) SWITCH nResult CASE 0 + ::hEvents[ cnEvent ] := NIL RETURN .T. CASE -3 /* event not found */ CASE -2 /* event not found */ @@ -203,6 +229,7 @@ METHOD HbQtObjectHandler:disconnect( cnEvent ) OTHERWISE nResult := 99 + ENDSWITCH __hbqt_error( 1300 + nResult ) @@ -211,14 +238,31 @@ METHOD HbQtObjectHandler:disconnect( cnEvent ) /*----------------------------------------------------------------------*/ METHOD HbQtObjectHandler:_destroy() + LOCAL cnEvent - IF __objDerivedFrom( Self, "HB_OBJECT" ) - ::disconnect() - ENDIF - + IF ! __objDerivedFrom( Self, "QOBJECT" ) + RETURN NIL + ENDIF + + HB_TRACE( HB_TR_DEBUG, " _destroy()", __objDerivedFrom( Self, "QOBJECT" ), "pSlots", valtype( ::__pSlots ), "pEvents", valtype( ::__pEvents ) ) + + FOR EACH cnEvent IN ::hEvents + IF hb_isNumeric( cnEvent ) .AND. ! empty( ::__pEvents ) + HB_TRACE( HB_TR_DEBUG, " _destroy()", "N", cnEvent ) + ::__pEvents:hbDisconnect( Self, cnEvent ) + ELSEIF hb_isChar( cnEvent ) .AND. ! empty( ::__pSlots ) + HB_TRACE( HB_TR_DEBUG, " _destroy()", "C", cnEvent ) + ::__pSlots:hbDisconnect( Self, cnEvent ) + ENDIF + NEXT + + ::hEvents := {=>} + ::__pSlots := NIL ::__pEvents := NIL - + + HB_TRACE( HB_TR_DEBUG, " _destroy()", "Exiting..." ) + RETURN NIL /*----------------------------------------------------------------------*/ diff --git a/harbour/contrib/hbqt/qtcore/hbqt_pointer.cpp b/harbour/contrib/hbqt/qtcore/hbqt_pointer.cpp index 6ad3c974b8..9d74878370 100644 --- a/harbour/contrib/hbqt/qtcore/hbqt_pointer.cpp +++ b/harbour/contrib/hbqt/qtcore/hbqt_pointer.cpp @@ -443,7 +443,7 @@ PHB_ITEM hbqt_create_object( void * pObject, const char * pszObjectName ) PHB_ITEM pRetVal; PHB_ITEM pItem; - HB_TRACE( HB_TR_DEBUG, ( "create_object %s", pszObjectName ) ); + HB_TRACE( HB_TR_ALWAYS, ( "create_object %s", pszObjectName ) ); hb_vmPushDynSym( hb_dynsymGet( pszObjectName ) ); hb_vmPushNil(); @@ -462,19 +462,22 @@ PHB_ITEM hbqt_create_objectGC( void * pObject, const char * pszObjectName ) { PHB_ITEM pItem, pRetVal; - HB_TRACE( HB_TR_DEBUG, ( "create_object_GC %s", pszObjectName ) ); + //HB_TRACE( HB_TR_ALWAYS, ( "create_object_GC %s", pszObjectName ) ); hb_vmPushDynSym( hb_dynsymGet( pszObjectName ) ); hb_vmPushNil(); hb_vmDo( 0 ); pRetVal = hb_itemNew( hb_stackReturnItem() ); - + pItem = hb_itemPutPtrGC( NULL, pObject ); hb_objSendMsg( pRetVal, "_PPTR", 1, pItem ); hb_itemReturnRelease( pRetVal ); + //hb_itemReturn( pRetVal ); hb_itemRelease( pItem ); + //HB_TRACE( HB_TR_ALWAYS, ( ".............................create_object_GC %s", pszObjectName ) ); + return hb_stackReturnItem(); } diff --git a/harbour/contrib/hbqt/qtcore/qth/QUrl.qth b/harbour/contrib/hbqt/qtcore/qth/QUrl.qth index c3f092bc12..711230ac4d 100644 --- a/harbour/contrib/hbqt/qtcore/qth/QUrl.qth +++ b/harbour/contrib/hbqt/qtcore/qth/QUrl.qth @@ -13,7 +13,7 @@ QObject = no -Inherits = QObject +Inherits = New = pParent diff --git a/harbour/contrib/hbqt/qtgui/qth/QListWidgetItem.qth b/harbour/contrib/hbqt/qtgui/qth/QListWidgetItem.qth index e3dc976e5f..d73a29d709 100644 --- a/harbour/contrib/hbqt/qtgui/qth/QListWidgetItem.qth +++ b/harbour/contrib/hbqt/qtgui/qth/QListWidgetItem.qth @@ -13,7 +13,7 @@ QObject = no -Inherit = QWidget +Inherit = New = pParent diff --git a/harbour/contrib/hbqt/qtgui/qth/QWidget.qth b/harbour/contrib/hbqt/qtgui/qth/QWidget.qth index 2abb671504..a8d1c62b3b 100644 --- a/harbour/contrib/hbqt/qtgui/qth/QWidget.qth +++ b/harbour/contrib/hbqt/qtgui/qth/QWidget.qth @@ -14,8 +14,6 @@ Inherit = QObject, QPaintDevice New = pParent, nFlags - -PaintEvent = YES