FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour VALID EN DIALOGO NOWAIT NO funciona con telca ESC (Soluciona
Posts: 1789
Joined: Tue Oct 11, 2005 05:01 PM
Re: VALID EN DIALOGO NOWAIT NO funciona con telca ESC
Posted: Mon Apr 03, 2017 09:40 PM

umm, usualmente el folder en si en FWH no toma foco, ya que es un contenedor, yo creo que ni eso, ya que lo que contiene son dialogos child, quienes son lo que contiene controles, quienes son los que llaman al valid.
que quien toma foco es el primer control contenido en el primer dialogo child.
prueba poniendo un control en el primer page del folder.

Salu2

Carlos Vargas

Desde Managua, Nicaragua (CA)
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: VALID EN DIALOGO NOWAIT NO funciona con telca ESC
Posted: Tue Apr 04, 2017 06:17 AM

Prueba si te sirve esta soluci贸n:

viewtopic.php?f=18t=33874p=200274#p200274

&&

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 203
Joined: Tue Oct 11, 2005 02:17 PM
Re: VALID EN DIALOGO NOWAIT NO funciona con telca ESC
Posted: Tue Apr 04, 2017 07:15 PM
Gracias, pero no funciona

Sigo investigando y ahora he comprobado que este comportamiento s贸lo ocurre si el folder no tiene controles (lo que no suele suceder) o de los controles que tiene, no hay ninguno activo, Si hay un control activo la validaci贸n se ejecuta correctamente y el dialogo no se cierra pero si no tiene controles o todos los controles del di谩logo estan desactivados (lo que me sucede constantemente, por ejemplo cuando estamos en modo consulta) el dialogo se cierra siempre despues de ejecutar el valid

he modificado el ejemplo para comprobar lo que digo

Code (fw): Select all Collapse
STATIC FUNCTION Prueba1(oWnd)
Local oDlg, oFld, oGet1, cGet1, oGet3, cGet3, oBtn

DEFINE DIALOG oDlg TITLE "Dialogo"

@ 1,1 FOLDER oFld 聽PROMPT "Uno", "Dos", "Tres", "Cuatro" OF oDlg 

cGet1 := SPACE(10)
@ 1,1 GET oGet1 VAR cGet1 OF oFld:aDialogs[1]

cGet3 := SPACE(10)
@ 1,1 GET oGet3 VAR cGet3 OF oFld:aDialogs[3]
oGet3:Disable()

@ 1,1 BUTTON oBtn 聽OF oFld:aDialogs[4]

ACTIVATE DIALOG oDlg NOWAIT CENTER;
聽 聽 聽 聽 聽VALID MsgYesNo("Salir")

RETURN NIL

En esta modificacion del ejemplo, si se pulsa escape cuando estamos en el primer o en el cuarto folder, el valid se ejecuta correctamente; sin embargo, si se pulsa en el segundo o en el tercero, el dialogo se cierra.
驴Habria alguna forma de modificar la CLASE para que busque alg煤n control activo del dialogo en el que se encuentra el folder para pasarle el foco y que de esta forma no se me cierre el dialogo?

Gracias
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: VALID EN DIALOGO NOWAIT NO funciona con telca ESC
Posted: Wed Apr 05, 2017 06:34 AM
Parece que este comportamiento y el reportado por Enrico estan basados en el mismo bug:

viewtopic.php?p=200302

He encontrado una soluci贸n para este error. En la clase TDialog estas l铆neas deben ser a帽adidas en el m茅todo Command()

Code (fw): Select all Collapse
 聽 聽 聽case nID == IDCANCEL .and. ! ::lModal
聽 聽 聽 聽 聽 聽if ::lValid()
聽 聽 聽 聽 聽 聽 聽 ::bValid = nil 
聽 聽 聽 聽 聽 聽 聽 ::End()
聽 聽 聽 聽 聽 聽 聽 return .T.
聽 聽 聽 聽 聽 聽endif 聽 
聽 聽 聽 聽 聽 聽return .F.


justo encima de case nID != 0

Te agradezco si lo pruebas puesto que es dificil saber que efectos colaterales pueda tener por lo que debe ser probado por muchos usuarios antes de que pueda ser incluido en FWH
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 203
Joined: Tue Oct 11, 2005 02:17 PM
Re: VALID EN DIALOGO NOWAIT NO funciona con telca ESC
Posted: Wed Apr 05, 2017 04:22 PM
Funciona

A continuaci贸n pongo el codigo que he implementado

Code (fw): Select all Collapse
#include "FiveWin.ch"
#include "Constant.ch"

#define CBN_SELCHANGE 聽 聽 聽1
#define CBN_CLOSEUP 聽 聽 聽 聽8

#include "xhb.ch"
#include "xhbcls.ch"

//----------------------------------------------------------------------------//
FUNCTION OverrideAndExtend()
聽 聽OVERRIDE METHOD Command 聽IN CLASS TDialog WITH MiTDialogCommand
RETURN NIL


//----------------------------------------------------------------------------//
FUNCTION MiTDialogCommand(nWParam, nLParam)
//METHOD Command( nWParam, nLParam ) CLASS TDialog

聽 聽local oWnd, nNotifyCode, nID, hWndCtl

聽 聽LOCAL Self := HB_QSelf()

聽 聽nNotifyCode = nHiWord( nWParam )
聽 聽nID 聽 聽 聽 聽 = nLoWord( nWParam )
聽 聽hWndCtl 聽 聽 = nLParam

聽 聽do case
聽 聽 聽 case ::oPopup != nil
聽 聽 聽 聽 聽 聽::oPopup:Command( nID )

聽 聽 聽 case hWndCtl == 0 .and. ::oMenu != nil .and. ;
聽 聽 聽 聽 聽 聽If( nNotifyCode == BN_CLICKED, nID != IDCANCEL, .f. )
聽 聽 聽 聽 聽 聽::oMenu:Command( nID )

聽 聽 聽 case GetClassName( hWndCtl ) == "ToolbarWindow32"
聽 聽 聽 聽 聽 聽oWndFromHwnd( hWndCtl ):Command( nWParam, nLParam )
聽 聽 聽 聽 聽 聽return .T. // otherwise a child dialog gets closed

聽 聽 聽 case ::oMenu != nil .and. nId != 2 .and. nNotifyCode != BN_CLICKED
聽 聽 聽 聽 聽 聽if nNotifyCode == 1
聽 聽 聽 聽 聽 聽 聽 ::oMenu:Command( nID )
聽 聽 聽 聽 聽 聽endif

聽 聽 聽 case nID == IDCANCEL .and. ! ::lModal
聽 聽 聽 聽 聽 聽if ::lValid()
聽 聽 聽 聽 聽 聽 聽 ::bValid = nil
聽 聽 聽 聽 聽 聽 聽 ::End()
聽 聽 聽 聽 聽 聽 聽 return .T.
聽 聽 聽 聽 聽 聽endif
聽 聽 聽 聽 聽 聽return .F.

聽 聽 聽 case nID != 0
聽 聽 聽 聽 聽 聽do case
聽 聽 聽 聽 聽 聽 聽 case nNotifyCode == BN_CLICKED
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽if hWndCtl != 0 .and. nID != IDCANCEL
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 oWnd := oWndFromhWnd( hWndCtl )
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 if ValType( ::nResult ) == "O" // latest control which had focus
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽// There is a pending Valid, it is not a clicked button
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽if oWnd != nil
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 if ! oWnd:lCancel
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽if ::nResult:nID != nID .and. ! ::nResult:lValid()
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 return nil
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽endif
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 endif
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽else
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 if ::nResult:nID != nID .and. ! ::nResult:lValid()
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽return nil
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 endif
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽endif
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 endif

聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 if AScan( ::aControls, { |o| o:nID == nID } ) > 0
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽#ifdef __XPP__
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 PostMessage( hWndCtl, FM_CLICK, 0, 0 )
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽#else
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 SendMessage( hWndCtl, FM_CLICK, 0, 0 )
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽#endif
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 elseif nID == IDOK
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽::End( IDOK )
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 endif
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽else
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 if nID == IDOK
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽::GoNextCtrl( GetFocus() )
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽if ! ::lModal
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 return 0
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽endif
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 elseif hWndCtl != 0 .and. ; // There is a control for IDCANCEL
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽AScan( ::aControls, { |o| o:nID == nID } ) > 0
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽SendMessage( hWndCtl, FM_CLICK, 0, 0 )
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽return .F.
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 else
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽::End( IDCANCEL )
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 endif
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽endif

聽 聽 聽 聽 聽 聽 聽 case nNotifyCode == CBN_SELCHANGE
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽SendMessage( hWndCtl, FM_CHANGE, 0, 0 )

聽 聽 聽 聽 聽 聽 聽 case nNotifyCode == CBN_CLOSEUP
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽SendMessage( hWndCtl, FM_CLOSEUP, 0, 0 )

聽 聽 聽 聽 聽 聽endcase
聽 聽endcase

return nil


He creado una funcion que sobreescribe el metodo command de la clase TDialogo y aparentemente funciona. Si detecto algun problema lo comunicar茅.

Gracias a todos

Continue the discussion