FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour xBrowse y TDatabase - reforma
Posts: 593
Joined: Sat May 12, 2007 11:47 AM
xBrowse y TDatabase - reforma
Posted: Sun Sep 08, 2013 02:28 PM
Buen día,

Comparto un problema que sucede cuando intento cerrar un dialog que contiene un xBrowse.

El Problema se dá si se cierra el dialog cuando se está editando un campo dentro de la xBrowse como puede verse en el video que subí a SoftLatinoxBase:

http://softlatinoxbase.idomyweb.com/foro/viewtopic.php?f=2&t=37&p=58&sid=b192f6fb2cfaa50d1549a7a65c1d6a23#p58

No se si el problema es por mi código que muestro a continuación:

Code (fw): Select all Collapse
oCol            := oBrw:AddCol()
oCol:cHeader        := "ELEMENTO"
oCol:bStrData       := { || oDbf:ELEMENTO }
oCol:nHeadStrAlign  := AL_CENTER
oCol:nDataStrAlign  := AL_LEFT
oCol:nWidth         := 140                          
oCol:cSortOrder    := "GRELENOM"
oBrw:aCols[ 4 ]:nEditType := EDIT_GET          
oBrw:aCols[ 4 ]:bOnPostEdit := {|oCol, xVal, nKey| iif( nKey != VK_ESCAPE, ;
                            (oDbf:ELEMENTO:=xVal , oDbf:save() , oBrw:refresh() ) , ) }
oBrw:aCols[4]:cEditPicture := "@!"
oBrw:aCols[4]:cTooltip:="Clickear una vez con el izquierdo para ordenar por ELEMENTO"


Pero lo solucioné reformando apenas el "METHOD _FieldPut( nPos, uValue ) CLASS TDataBase"

Code (fw): Select all Collapse
METHOD _FieldPut( nPos, uValue ) CLASS TDataBase

local lLocked  := .f.
local lCalcCol := ( nPos > ( ::nArea )->( FCount() ) )

if ::lBuffer
   if lCalcCol
      
//   ( ::nArea )->( Eval( ::aStruct[ nPos ][ DBS_BLOCK ], Self, uValue ) )
      
   try                                        //   
     ( ::nArea )->( Eval( ::aStruct[ nPos ][ DBS_BLOCK ], Self, uValue ) )   // by RolandoCerella 07092013
   catch                                                                        // evita que de error al cerrar
     return nil                                                                 // el dialog estando en edición
   end                                                                          // de un campo
 
      
   else
      ::aBuffer[ nPos ] := uValue
   endif
   else
   
   ...


Espero sea de utilidad.

Rolando :-)
Posts: 817
Joined: Sun Jun 15, 2008 07:47 PM
Re: xBrowse y TDatabase - reforma
Posted: Sun Sep 08, 2013 03:19 PM
Esa es una mala idea.
Te explico:
has encerrado la escritura del valor del campo en la DBF en un try catch por lo que si algún día eso diera un error diferente simplemente se saldría del programa sin avisos ni nada lo cual será un crebadero de cabeza.

La solución es que antes cerrar el dialog cierres el objeto TDataBase:
oDbf:Close()

Posiblemente tendrás que destruir antes el Browse que hace referencia al objeto TDataBase, creo que deberías poner esto:

oBrw:Destroy()
oDbf:Close()

Espero que sea de tu utilidad :-)
______________________________________________________________________________

Sevilla - Andalucía
Posts: 593
Joined: Sat May 12, 2007 11:47 AM
Re: xBrowse y TDatabase - reforma
Posted: Sun Sep 08, 2013 03:39 PM
xmanuel,

Gracias por responder.

Ya hice antes la prueba colocando lo que mencionas en el valid, pero hace lo mismo :-)

Además, te comento que debí implementar una función para cerrar la oDbf porque si "clickeo" sobre la "X" para cerrar el dialog cuando se está ejecutando un kinetic scroll, también dá error (ver post http://forums.fivetechsupport.com/viewtopic.php?f=6&t=18866&p=99018&hilit=kinetic#p99018)

Comento además que estos dialogs en los que dá problemas son NOWAIT, en los dialogs que no son NOWAIT, lo que tu comentas cierra bien el dialog.

De todos modos y, a mi modesto entender, no creo que esta reforma dé tanto problema. A los sumo no guarda el cambio en el campo, pero sólo lo hace si hay un error y, si lo dejo como está, tampoco guarda el cambio y la aplicación se cierra, lo cual sí es muy molesto.

A lo agregado, se le podría implementar un
Code (fw): Select all Collapse
msginfo("No se guardaron los datos cambiados, se cerró el diálogo estando en edición","ATENCION")
y con esto quedaría un aviso del error.

Si se te ocurre otra solución (usando dialogs NOWAIT), por favor hazla conocer. Gracias.

Rolando :-)
Posts: 817
Joined: Sun Jun 15, 2008 07:47 PM
Re: xBrowse y TDatabase - reforma
Posted: Sun Sep 08, 2013 06:27 PM

Jajaja sigo pensando que esa solución no me gusta :oops: pero bueno cada uno sabe lo que tiene que hacer...

Tampoco me gusta que para eso se use la clausula VALID, ya que debería ser solo para la validación de expresiones logicas.

Antonio debería incluir una clausla ON CLOSE en la clase TWindows y TDialog que procese el mensaje de windows WM_CLOSE aunque se use el aspa de la ventana o un botón para salir. El evento onClose de la ventana es el que tiene que procesar eso y el que puede enviar un método ::Close() o no para que la ventana se cierre o no pero nunca una clausula VALID que, para mi gusto lo que tiene que hacer es asegurar que el valor introducido o seleccionado de un cotrol visible es correcto o no.

Seguro que Antonio toma nota... mientras tanto prueba:

oBrw:CancelEdit()
oDbf:Close()

______________________________________________________________________________

Sevilla - Andalucía
Posts: 593
Joined: Sat May 12, 2007 11:47 AM
Re: xBrowse y TDatabase - reforma
Posted: Sun Sep 08, 2013 08:39 PM

La clausula ON CLOSE, como bien dices, No Existe. Hasta ahora, en dialogos NOWAIT siempre procedí finalizando objetos y demás dentro del valid (no sé de otra forma para hacerlo).

Por otra parte, lo que sugieres:

oBrw:CancelEdit()
oDbf:Close()

Tampoco da resultado. se sigue cerrando dando un error.

Rolando :D

Continue the discussion