FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Problema con dialogos nowait
Posts: 1364
Joined: Wed Jun 21, 2006 12:39 AM
Problema con dialogos nowait
Posted: Tue Nov 05, 2013 12:55 PM

Estoy confeccionando un dialogo nowait y lo que pretendo es que si hago click fuera de él, este se cierre. Funciona perfectamente con el método bLostFocus. Pero cuando pongo un control sobre él ( xbrowse en este caso ) no se abre. Pareciese que nunca toma el foco entonces se cierra. Este dialogo es llamado desde una buttonbar. He hecho otros que funcionan en una msgbar con el mismo control y eso no pasa. Si alguien tiene alguna punta para solucionar esto. Muchas gracias

Saludos

Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM
Re: Problema con dialogos nowait
Posted: Tue Nov 05, 2013 01:59 PM

Horacio,

Te refieres a que si el diálogo no modal contiene un xbrowse entonces no se muestra el diálogo ?

Puedes proporcionar un pequeño ejemplo de como lo estas haciendo para que lo probemos ? gracias

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 1364
Joined: Wed Jun 21, 2006 12:39 AM
Re: Problema con dialogos nowait
Posted: Tue Nov 05, 2013 03:20 PM
Aquí el ejemplo

Code (fw): Select all Collapse
#include 'fivewin.ch' 
#include 'xbrowse.ch' 
Static oWnd
Static aCat
Static oBar

/*----------------------------------------------------------------------------*/
Function Main()

    aCat := { { 'uno' }, { 'dos' }, { 'tres' } }

    Define Window oWnd MDI 
    Activate Window oWnd Maximized On Init NuevaVentana()
    Return 0
    
/*----------------------------------------------------------------------------*/
Function NuevaVentana()

    Local oBmp
    Local oChild
    
    Define Window oChild MdiChild Of oWnd
    
        Define ButtonBar oBar Size 45, 32 Of oChild _3D
        oBar : bRClicked := { || .f. }
        
        @ 05, oWnd : nWidth - 40 Bitmap oBmp File '..\bitmaps\32x32\app.bmp' Size 20, 20 Pixel  Of oBar NoBorder On Click MuestraLasCategorias( oBmp ) Adjust
        oBmp : lTransparent := .t.
        
    Activate Window oChild Maximized
    Return 0    
    
/*----------------------------------------------------------------------------*/
Function MuestraLasCategorias( oBmp )   

    Local i
    Local oDlg
    Local oFont1
    Local oBrowse
    
    Define Font oFont1 Name 'Arial' Size 0, -10
    
    
    Define Dialog oDlg From 100, 200 To 350, 300 Of oBar Pixel Style nOr( WS_POPUP ) //Color 0, CLR_HRED
    
        @ 0, 0 xBrowse oBrowse Array aCat Columns 1 Size 100, 200 Of oDlg Color 0, GetSysColor( 15 ) Pixel
    
        With Object oBrowse
            :aCols[ 1 ] : oDataFont := oFont1
            :aCols[ 1 ] : nWidth := 100
            :lHeader             := .f.
            :lRecordSelector     := .f.
            :nRowHeight          := 22
            :nRowDividerStyle    := 0
            :nColDividerStyle    := 5
                    :nMarqueeStyle       := 5
            :bGotFocus           := { || oDlg : SetFocus() }
            //:bLostFocus          := { || oDlg : End() }
            :oWnd : BKeyDown     := { | nKey | If( nKey == VK_ESCAPE, oDlg : End(), ) }
            :CreateFromCode()
        EndWith
        
        oDlg : bLostFocus := { || oDlg : End() }
    
    Activate Dialog oDlg On Init( oDlg : Move( oBmp : nBottom + 50, oBmp : nLeft - 80 ), oDlg : SetFocus() ) NoWait
    Return 0
Posts: 174
Joined: Sat Feb 23, 2013 10:04 AM
Re: Problema con dialogos nowait
Posted: Tue Nov 05, 2013 03:39 PM
Horacio,

Probablemente lo que ocurre es que el dialogo inicialmente esta tomando el foco, luego lo pierde en detrimento del xbrowse que contiene. Es el comportamiento habitual.

Desde viewtopic.php?f=3&t=25706&hilit=dlgendonlostfocus&start=30#p143679



Code shows how to hide a dialog when it loses focus. The function must be placed in the Init event.
Below pictures of a form with scrolling style touch with touch movement and without scroll bars and with automatic deployment TabTip.




Code (fw): Select all Collapse
//-------------------------------------------------------------------------//
STATIC FUNCTION DlgEndOnLostFocus(oDlg)
Local nI, o
Local bLost, aAllControls:= {}

CollectControls(oDlg, @aAllControls)

#Define lFOCUS_APPLICATION ( oWndFromHwnd(GetFocus()) != NIL )
#Define lFOCUS_NOT_DIALOG  ( AScan(aAllControls, {|o| o:hWnd == GetFocus()}) == 0 )
#Define ON_FOCUS_LOST      If(lFOCUS_APPLICATION .AND. lFOCUS_NOT_DIALOG, oDlg:End(), NIL)

FOR nI:= 1 to len(aAllControls)
   o:= aAllControls[nI]
   IF O:bLostFocus != NIL
      bLost:= o:bLostFocus
      o:bLostFocus:= {|x1, x2, x3, x| x:= Eval(bLost, x1, x2, x3),;
                                      ON_FOCUS_LOST,;
                                      x}
   ELSE
      o:bLostFocus:= {|x1, x2, x3, x| x:= NIL,;
                                      ON_FOCUS_LOST,;
                                      x}

   ENDIF

NEXT
RETURN NIL

*
//-------------------------------------------------------------------------//
FUNCTION CollectControls(oDlg , aAllControls)
LOCAL nI, nJ, Obj1 , Obj2

Aadd(aAllControls, ODLG)

FOR nI:= 1 TO Len(oDlg:aControls)
   Obj1:= oDlg:aControls[nI]
   Aadd(aAllControls, Obj1)
   IF Obj1:ClassName == "TFOLDER"
      FOR nJ:= 1 TO Len(Obj1:aDialogs)
         Obj2:= Obj1:aDialogs[nJ]
         CollectControls(Obj2 , @aAllControls)
      NEXT
   ENDIF
NEXT
RETURN



Saludos
Posts: 1364
Joined: Wed Jun 21, 2006 12:39 AM
Re: Problema con dialogos nowait
Posted: Tue Nov 05, 2013 04:04 PM

Gracias Antonio por tu respuesta, de todas maneras si el método bLostFocus lo pones en el control ( xbrowse en este caso ) en vez del dialogo sucede exactamente lo mismo.

Saludos

Posts: 174
Joined: Sat Feb 23, 2013 10:04 AM
Re: Problema con dialogos nowait
Posted: Tue Nov 05, 2013 04:35 PM
Horacio,

Creo que no me he explicado. Quiero decir el comportamiento que obtienes es el esperado porque la solucion no pasa por asignar la salida al bLostFocus del xBrowse o del Dialog, sino a todos los controles del dialogo y al dialogo en si mismo. Eso es lo que pretende la funcion DlgEndOnLostFocus()

Saludos
Posts: 1364
Joined: Wed Jun 21, 2006 12:39 AM
Re: Problema con dialogos nowait
Posted: Wed Nov 06, 2013 12:32 PM
Gracias nuevamente por responder, probaré tu solución ya que estoy urgido por resolver este tema. Donde tendría que llamar a esta función ?. De todas maneras y a título ilustrativo pongo un código que funciona como te relaté, solamente con el método bLostFocus del control xBrowse.

Code (fw): Select all Collapse
Function MuestraEstados()
    
    Local oDlg
    Local oBrw
    Local aEstados := { { 'TODOS' }, { 'NORMAL' }, { 'LICENCIA' }, { 'BAJA' } }
    Local aRowGrad     := { { .5, nRGB( 255, 255, 255 ), nRGB( 240, 240, 240 ) }, ; 
                           { .5, nRGB( 240, 240, 240 ), nRGB( 232, 232, 232 ) } }
   Local aSelGrad       := { { .5, RGB( 255, 255, 180 ), RGB( 255, 237, 178 ) }, ;
                           { .5, RGB( 255, 218, 103 ), RGB( 255, 233, 162 ) } }
    
    Define Dialog oDlg Of oVarCarga : oBrwC From oVarCarga : oItem[ 1 ] : oMsgBar : nBottom - 75, oVarCarga : oItem[ 1 ] : nLeft() To oVarCarga : oItem[ 1 ] : oMsgBar : nBottom, oVarCarga : oItem[ 1 ] : nLeft() + 140  Pixel Style nOr( WS_POPUP, WS_DLGFRAME ) Transparent
    
        @ 0, 0 xBrowse oBrw Size oDlg : nWidth, oDlg : nHeight Array aEstados Pixel Of oDlg NoBorder
            
        With Object oBrw               
            :lHeader           := .f.
            :lVScroll          := .f.
            :lHScroll          := .f.
            :nColDividerStyle  := 5
          :nMarqueeStyle     := 5 //MARQSTYLE_HIGHLCELL
            :nColorPen         := Rgb( 225, 225, 225 )
            :nRecSelColor      := nRGB( 240, 240, 240 )
            :bRClicked         := { || oDlg : End() }
            :bClrSel           := { || { CLR_BLACK, RGB( 255, 255, 255 ) } }
            :bClrSelFocus      := { || { CLR_BLACK, aSelGrad } }
           :bClrRowFocus      := { || { CLR_BLACK, aRowGrad } }
            :bClrGrad          := { | lInvert | If( !lInvert,  { { 0.5, nRGB( 255, 255, 255 ), nRGB( 240, 240, 240 ) }, ;
                                                                         { 0.5, nRGB( 240, 240, 240 ), nRGB( 232, 232, 232 ) } },; 
                                                             { { 0.50, 12961221, 16777215 }, { 0.50, 16777215, 12961221 } } ) }
            :bClrHeader        := {|| { CLR_BLUE, nRGB( 245, 245, 245 ) } } 
            :bClrFooter        := {|| { CLR_BLUE, 16777215 } } 
            :bKeyDown          := { | nKey | If( nKey == VK_RETURN, ( FiltraLaBaseSegunEstado( aEstados[ oBrw : nArrayAt ][ 1 ] ), oDlg : End() ), ) }
            :bLDblClick        := { || FiltraLaBaseSegunEstado( aEstados[ oBrw : nArrayAt ][ 1 ] ), oDlg : End() }
            :nStretchCol       := STRETCHCOL_LAST
            :lKinetic          := .f. 
          :lRecordSelector   := .f.
            :lColDividerComplete := .t.
          :oWnd : bKeyDown := { | nKey | If( nKey == VK_ESCAPE, oDlg : End(), ) }
        EndWith

    Activate Dialog oDlg On Init( oBrw : CreateFromCode(), oBrw : SetFocus(), oBrw : bLostFocus := { || oDlg : End() } ) NoWait
    Return 0

Gracias Antonio por tu atención.

Saludos
Posts: 1364
Joined: Wed Jun 21, 2006 12:39 AM
Re: Problema con dialogos nowait
Posted: Wed Nov 06, 2013 03:12 PM
Pude solucionarlo en parte, ahora funciona pero no ejecuta los métodos bKeyDown y bLDblClick. Si hago el dialogo modal funciona. Aquí un ejemplo autocontenido

Code (fw): Select all Collapse
#include 'fivewin.ch' 
#include 'xbrowse.ch' 
Static oWnd
Static aCat
Static oBar

/*----------------------------------------------------------------------------*/
Function Main()

    aCat := { { 'UNO' }, { 'DOS' }, { 'TRES' } }

    Define Window oWnd MDI 
    Activate Window oWnd Maximized On Init NuevaVentana()
    Return 0
    
/*----------------------------------------------------------------------------*/
Function NuevaVentana()

    Local oBmp
    Local oChild
    
    Define Window oChild MdiChild Of oWnd
    
        Define ButtonBar oBar Size 45, 32 Of oChild _3D
        oBar : bRClicked := { || .f. }
        
        @ 05, oWnd : nWidth - 40 Bitmap oBmp File '..\bitmaps\32x32\app.bmp' Size 20, 20 Pixel  Of oBar NoBorder On Click MuestraLasCategorias( oBmp ) Adjust
        oBmp : lTransparent := .t.
        
    Activate Window oChild Maximized
    Return 0    
    
/*----------------------------------------------------------------------------*/
Function MuestraLasCategorias( oBmp )   

    Local i
    Local oDlg
    Local oFont
    Local oBrowse
    Local nPixAlto
    Local aRowGrad := { { .5, nRGB( 255, 255, 255 ), nRGB( 255, 255, 255 ) }, ; 
                        { .5, nRGB( 255, 255, 255 ), nRGB( 255, 255, 255 ) } }  
   Local aSelGrad := { { .5, RGB( 0, 191, 255 ), RGB( 0, 191, 255 ) }, ;
                          { .5, RGB( 0, 191, 255 ), RGB( 0, 191, 255 ) } }
    Memvar oVarGlobales
    
    nPixAlto := Len( aCat ) * 17
    Define Font oFont Name "Arial" Size 0, -10
    
    Define Dialog oDlg Of oBar From oBmp : nBottom + 300 - nPixAlto, oBmp : nLeft() - 100 To oBmp : nBottom + 300, oBmp : nLeft() Pixel Style nOr( WS_POPUP, WS_BORDER )    
    
        @ 0, 0 xBrowse oBrowse Size oDlg : nWidth, oDlg : nHeight Array aCat Columns 1 Pixel Of oDlg NoBorder
            
        With Object oBrowse            
            :aCols[ 1 ] : oDataFont := oFont
            :lHeader           := .f.
            :lVScroll          := .f.
            :lHScroll          := .f.
            :nColDividerStyle  := 5
          :nMarqueeStyle     := 5 //MARQSTYLE_HIGHLCELL
            :nColorPen         := Rgb( 225, 225, 225 )
            :nRecSelColor      := nRGB( 240, 240, 240 )
            :bRClicked         := { || oDlg : End() }
            :bClrSel           := { || { CLR_BLACK, RGB( 255, 255, 255 ) } }
            :bClrSelFocus      := { || { CLR_WHITE, aSelGrad } }
           :bClrRowFocus      := { || { CLR_WHITE, aRowGrad } }
            :bClrGrad          := { | lInvert | If( !lInvert,  { { 0.5, nRGB( 255, 255, 255 ), nRGB( 240, 240, 240 ) }, ;
                                                                         { 0.5, nRGB( 240, 240, 240 ), nRGB( 232, 232, 232 ) } },; 
                                                             { { 0.50, 12961221, 16777215 }, { 0.50, 16777215, 12961221 } } ) }
            :bClrHeader        := {|| { CLR_BLUE, nRGB( 245, 245, 245 ) } } 
            :bClrFooter        := {|| { CLR_BLUE, 16777215 } } 
            :bKeyDown          := { | nKey | If( nKey == VK_RETURN, ( MsgAlert( aCat[ oBrowse : nArrayAt ][ 1 ] ), oDlg : End() ), ) }
            :bLDblClick        := { || MsgAlert( aCat[ oBrowse : nArrayAt ][ 1 ] ), oDlg : End() }
            :nStretchCol       := STRETCHCOL_LAST
            :lKinetic          := .f. 
          :lRecordSelector   := .f.
            :lColDividerComplete := .t.
          :oWnd : bKeyDown := { | nKey | If( nKey == VK_ESCAPE, oDlg : End(), ) }
        EndWith
    
    Activate Dialog oDlg On Init( oBrowse : CreateFromCode(), oBrowse : SetFocus(), oBrowse : bLostFocus := { || oDlg : End() } ) Valid( oFont : End(), .t. ) NoWait
    Return 0


Alguna idea ??? Gracias.
Posts: 6755
Joined: Wed Feb 15, 2012 08:25 PM
Re: Problema con dialogos nowait
Posted: Wed Nov 06, 2013 07:43 PM
Horacio, prueba asi (para mi es OK pero no se si es exactamente lo que necesitas)

Code (fw): Select all Collapse
Function MuestraLasCategorias( oBmp, oChild )   

    Local i
    Local oDlg
    Local oFont1
    Local oBrowse


    Local lSalir   := .F.
          
    Define Font oFont1 Name 'Arial' Size 0, -10
                                                   //oBar
    Define Dialog oDlg From 100, 200 To 350, 300 Of oChild Pixel Style nOr( WS_POPUP ) //Color 0, CLR_HRED
    
        @ 0, 0 xBrowse oBrowse Array aCat Columns 1 Size 100, 200 Of oDlg Color 0, GetSysColor( 15 ) Pixel
    
        With Object oBrowse
            :aCols[ 1 ] : oDataFont := oFont1
            :aCols[ 1 ] : nWidth := 100
            :lHeader             := .f.
            :lRecordSelector     := .f.
            :nRowHeight          := 22
            :nRowDividerStyle    := 0
            :nColDividerStyle    := 5
            :nMarqueeStyle       := 5
            :bGotFocus           := { || oDlg:SetFocus(), lSalir := .T. }
            :bLostFocus       := { || if ( lSalir, oDlg:End(), oBrowse:SetFocus() ) }
            :oWnd : BKeyDown     := { | nKey | If( nKey == VK_ESCAPE, oDlg : End(), ) }
            :CreateFromCode()
        EndWith
        
   
    Activate Dialog oDlg On Init( ; 
                                  oDlg : Move( oBmp : nBottom + 50, oBmp : nLeft - 80 ) ) NOWAIT
Cristobal Navarro

Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo

El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
Posts: 1364
Joined: Wed Jun 21, 2006 12:39 AM
Re: Problema con dialogos nowait
Posted: Thu Nov 07, 2013 01:46 PM

Gracias Cristobal por responder. Probaré tu solución y comento

Saludos

Posts: 6755
Joined: Wed Feb 15, 2012 08:25 PM
Re: Problema con dialogos nowait
Posted: Thu Nov 07, 2013 01:58 PM
Horacio
Aqui tienes una pequeña modificacion "mas elegante" aunque en ambos casos se trata de no crear el bLostFocus hasta no estar seguro de que ha cogido el foco el control para que no se cierre

Code (fw): Select all Collapse
Function MuestraLasCategorias( oBmp, oChild )   

    Local i
    Local oDlg
    Local oFont1
    Local oBrowse
          
    Define Font oFont1 Name 'Arial' Size 0, -10
                                                   //oChild
    Define Dialog oDlg From 100, 200 To 350, 300 Of oBar Pixel Style nOr( WS_POPUP ) //Color 0, CLR_HRED
    
        @ 0, 0 xBrowse oBrowse Array aCat Columns 1 Size 100, 200 Of oDlg Color 0, GetSysColor( 15 ) Pixel
    
        With Object oBrowse
            :aCols[ 1 ] : oDataFont := oFont1
            :aCols[ 1 ] : nWidth := 100
            :lHeader             := .f.
            :lRecordSelector     := .f.
            :nRowHeight          := 22
            :nRowDividerStyle    := 0
            :nColDividerStyle    := 5
            :nMarqueeStyle       := 5
            :bGotFocus           := { || QuieroCerrar( oDlg, oBrowse ) }
            :oWnd : BKeyDown     := { | nKey | If( nKey == VK_ESCAPE, oDlg : End(), ) }
            :CreateFromCode()
        EndWith
        

    Activate Dialog oDlg On Init( ; 
                                  oDlg : Move( oBmp : nBottom + 50, oBmp : nLeft - 80 ) ) NOWAIT //,;
//                                  oDlg : SetFocus() ) NoWait 
    Return 0        

Function QuieroCerrar( oDlg, oBrw )
   oDlg:SetFocus()
   oBrw:bLostFocus := { || oDlg:End() }
Return .T.
Cristobal Navarro

Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo

El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
Posts: 400
Joined: Fri May 11, 2007 08:20 PM
Re: Problema con dialogos nowait
Posted: Mon Oct 24, 2016 08:20 PM

Cristobal
siguiendo este hilo como harias para que este dialog no modal, el browse me devuelva la fila seleccionada
a la funcion que la invoca?

fwh 17.12, harbour 3.2.0, pelles C, bcc7, Ms-Sql
Posts: 6755
Joined: Wed Feb 15, 2012 08:25 PM
Re: Problema con dialogos nowait
Posted: Mon Oct 24, 2016 08:41 PM

Artu

El diálogo que haces con el Browse es MODAL ?

Cristobal Navarro

Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo

El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
Posts: 400
Joined: Fri May 11, 2007 08:20 PM
Re: Problema con dialogos nowait
Posted: Mon Oct 24, 2016 08:44 PM

No es no modal y no consigo obtener lo que el usuario selecciono ya que se llama al browse de un dialog no modal y no para de ejecutarse
hasta llegar al activate dialog del dialog no modal

fwh 17.12, harbour 3.2.0, pelles C, bcc7, Ms-Sql
Posts: 6755
Joined: Wed Feb 15, 2012 08:25 PM
Re: Problema con dialogos nowait
Posted: Mon Oct 24, 2016 09:12 PM

Te he entendido lo que necesitas pero no entiendo bien tu planteamiento
El diálogo que contiene el XBrowse es MODAL o NO MODAL ( NO WAIT ) ?

Cristobal Navarro

Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo

El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces