From: Thefull <th...@wa...> - 2006-11-30 11:18:53
|
Sorry, but my english is bad, i post in spanish. Propuesta para eventos. Me gustaria conocer vuestra opinion sobre 2 cuestiones que me tienen bloqueado a la hora de realizar la mejor implementacion posible. ******************************************************************** 1.- Solucionar BUG de conectar señales con codeblocks. ******************************************************************** Ver: https://sourceforge.net/tracker/index.php?func=detail&aid=1594322&group_id=176396&atid=877081 Por ejemplo, ahora tenemos este codigo para controlar la señal "configure-event": gboolean OnConfigure_Event( GtkWidget *widget, GdkEventConfigure *event, gpointer data ) { PHB_ITEM pObj = g_object_get_data( G_OBJECT( widget ), "Self" ); PHB_ITEM pBlock; PHB_DYNS pMethod ; if( pObj ) { pMethod = hb_dynsymFindName( data ); if( pMethod ){ hb_vmPushSymbol( hb_dynsymSymbol( pMethod ) ); // Coloca simbolo en la pila hb_vmPush( pObj ); // Coloca objeto en pila. hb_vmPush( pObj ); // oSender hb_vmPushLong( GPOINTER_TO_UINT( event ) ); hb_vmSend( 2 ); // LLamada por Send que pasa return( hb_parl( -1 ) ); } else { g_print( "Method doesn't %s exist en OnConfigure_Event", (gchar *)data ); } } // Obtenemos el codeblock de la señal, data, que debemos evaluar... if( pObj == NULL ){ pBlock = g_object_get_data( G_OBJECT( widget ), (gchar*) data ); if( pBlock ) { hb_vmPushSymbol( &hb_symEval ); hb_vmPush( pBlock ); hb_vmPushLong( GPOINTER_TO_UINT( widget) ); hb_vmPushLong( GPOINTER_TO_UINT( event ) ); hb_vmSend( 2 ); return( hb_parl( -1 ) ); } } return FALSE; } Tal y como se detalla en el BUG, si intentamos conectar a un objeto una señal a traves de la funcion g_signal_connect() no es posible. Para ello, creo que seria interesante preguntarse primero si existe algun codeblock asignada a la señal, en tal caso, simplemente, dariamos PREFERENCIA al codeblock, en vez del method, y quedaria como: gboolean OnConfigure_Event( GtkWidget *widget, GdkEventConfigure *event, gpointer data ) { PHB_ITEM pObj = NULL; PHB_ITEM pBlock; PHB_DYNS pMethod ; // comprobamos que no exista definido un codeblock a la señal. pBlock = g_object_get_data( G_OBJECT( widget ), (gchar*) data ); if( pBlock == NULL ){ pObj = g_object_get_data( G_OBJECT( widget ), "Self" ); if( pObj ) { pMethod = hb_dynsymFindName( data ); if( pMethod ){ hb_vmPushSymbol( hb_dynsymSymbol( pMethod ) ); // Coloca simbolo en la pila hb_vmPush( pObj ); // Coloca objeto en pila. hb_vmPush( pObj ); // oSender hb_vmPushLong( GPOINTER_TO_UINT( event ) ); hb_vmSend( 2 ); // LLamada por Send que pasa return( hb_parl( -1 ) ); } else { g_print( "Method doesn't %s exist en OnConfigure_Event", (gchar *)data ); } } } // Obtenemos el codeblock de la señal, data, que debemos evaluar... if( pObj == NULL ){ if( pBlock ) { hb_vmPushSymbol( &hb_symEval ); hb_vmPush( pBlock ); hb_vmPushLong( GPOINTER_TO_UINT( widget) ); hb_vmPushLong( GPOINTER_TO_UINT( event ) ); hb_vmSend( 2 ); return( hb_parl( -1 ) ); } } return FALSE; } Esto se deberia de hacer para TODAS las señales. PREGUNTA: ¿ Estais de acuerdo con este analisis y os parece bien esta propuesta de modificacion ? ******************************************************************** 2.- Poner un codeblock en las clases por cada señal ******************************************************************** Por ejemplo, si conectamos a un objeto la señal "focus", oWidget:Connect( "focus" ), tener disponible un codeblock, oWidget:bFocus, que nos permita modificar el comportamiento de un objeto en cuestion. Para ello tendriamos que tener por cada señal , una variable de instancia equivalente y los methods que controlaran dicha señal, simplemente trataran de evaluar el codeblock asignado, como por ejemplo: METHOD OnFocus( oSender, nGtkDirectionType ) CLASS GWIDGET IF oSender:bFocus != NIL return Eval( oSender:bFocus , oSender, nGtkDirectionType ) ENDIF RETURN .F. PREGUNTA: - ¿ Creeis que es buena idea esta implementación ? Yo creo que nos ofrece una mejor flexibilidad de poder cambiar el comportamiento de cada objeto, segun nuestras necesidades. Como siempre, espero vuestras reflexiones al respecto. Saludos Rafa Carmona |