Problema con dialogos nowait

Problema con dialogos nowait

Postby horacio » 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
horacio
 
Posts: 1363
Joined: Wed Jun 21, 2006 12:39 am
Location: Capital Federal Argentina

Re: Problema con dialogos nowait

Postby Antonio Linares » Tue Nov 05, 2013 1: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
User avatar
Antonio Linares
Site Admin
 
Posts: 42203
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Problema con dialogos nowait

Postby horacio » Tue Nov 05, 2013 3:20 pm

Aquí el ejemplo

Code: Select all  Expand view  RUN

#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       

 
horacio
 
Posts: 1363
Joined: Wed Jun 21, 2006 12:39 am
Location: Capital Federal Argentina

Re: Problema con dialogos nowait

Postby Antonio Mart. » Tue Nov 05, 2013 3: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.

Image
Image

Code: Select all  Expand view  RUN
//-------------------------------------------------------------------------//
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
Antonio Mart.
 
Posts: 174
Joined: Sat Feb 23, 2013 10:04 am

Re: Problema con dialogos nowait

Postby horacio » Tue Nov 05, 2013 4: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
horacio
 
Posts: 1363
Joined: Wed Jun 21, 2006 12:39 am
Location: Capital Federal Argentina

Re: Problema con dialogos nowait

Postby Antonio Mart. » Tue Nov 05, 2013 4: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
Antonio Mart.
 
Posts: 174
Joined: Sat Feb 23, 2013 10:04 am

Re: Problema con dialogos nowait

Postby horacio » 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: Select all  Expand view  RUN

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
horacio
 
Posts: 1363
Joined: Wed Jun 21, 2006 12:39 am
Location: Capital Federal Argentina

Re: Problema con dialogos nowait

Postby horacio » Wed Nov 06, 2013 3: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: Select all  Expand view  RUN

#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.
horacio
 
Posts: 1363
Joined: Wed Jun 21, 2006 12:39 am
Location: Capital Federal Argentina

Re: Problema con dialogos nowait

Postby cnavarro » Wed Nov 06, 2013 7:43 pm

Horacio, prueba asi (para mi es OK pero no se si es exactamente lo que necesitas)

Code: Select all  Expand view  RUN


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
User avatar
cnavarro
 
Posts: 6552
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Problema con dialogos nowait

Postby horacio » Thu Nov 07, 2013 1:46 pm

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

Saludos
horacio
 
Posts: 1363
Joined: Wed Jun 21, 2006 12:39 am
Location: Capital Federal Argentina

Re: Problema con dialogos nowait

Postby cnavarro » Thu Nov 07, 2013 1: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: Select all  Expand view  RUN

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
User avatar
cnavarro
 
Posts: 6552
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Problema con dialogos nowait

Postby artu01 » Mon Oct 24, 2016 8: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
artu01
 
Posts: 400
Joined: Fri May 11, 2007 8:20 pm
Location: Lima

Re: Problema con dialogos nowait

Postby cnavarro » Mon Oct 24, 2016 8: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
User avatar
cnavarro
 
Posts: 6552
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Problema con dialogos nowait

Postby artu01 » Mon Oct 24, 2016 8: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
artu01
 
Posts: 400
Joined: Fri May 11, 2007 8:20 pm
Location: Lima

Re: Problema con dialogos nowait

Postby cnavarro » Mon Oct 24, 2016 9: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
User avatar
cnavarro
 
Posts: 6552
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Next

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 50 guests