Actuliza Pantalla de XBrowse

Actuliza Pantalla de XBrowse

Postby remtec » Fri May 05, 2023 5:52 pm

Hol Amigos

Tengo un Xbrowse con los datos de una Dbf, los cuales se muestran con un filtro, tengo una opcion para activar o desactivar cada profesional, para lo cual debe dar doble click.

El problema que el Xbrowse se actuliza solo si muevo el mouse sobre la lista.


Muchos Saludos

Antonio

Codigo:
Code: Select all  Expand view

     @ 00,90  SAY otitu1 PROMPT " MAESTRO PROFESIONALES MEDICOS " PIXEL OF oDlg4 COLORS RGB(12, 135, 27)   FONT oFont1

     @ 018,103 SAY "Seleccione"   SIZE 80,10 PIXEL OF oDlg4  RIGHT  FONT oFont2
     @ 018,190 ComboBox oPro Var nPro Items ArrTranspose(aProfe)[2] SIZE 70,200 PIXEL OF oDlg4  COLORS RGB(55, 255, 153)     FONT oFont5;
                         ON CHANGE ((cPro:=ArrTranspose(aProfe)[1][oPro:nAt]),IF(!Filtra_Conve(cPro),(MsgStop("TODO BIEN"),oBrw2:Setfocus(),.F.), (oBrw2:Refresh(),oBrw2:Setfocus(), .T.) ))


     @ 45,60 XBROWSE oBrw2 SIZE -10,-35 PIXEL OF oDlg4 DATASOURCE "Profe" FONT oFont6;
            HEADERS 'Código','Nombre Profesional','Espe.','R.u.t.','Estado';
            COLUMNS 'Cod_Pro','Nom_Pro','Tip_Esp','Rut_Pro','Est_Pro';
            PICTURES "@!","@!","@!","@!","@!";
            ColSizes 60,180,60,100,50;
            AUTOSORT NOBORDER FOOTERS LINES CELL
                             oBrw2:nMarqueeStyle :=MARQSTYLE_HIGHLROW
                             oBrw2:nColDividerStyle := LINESTYLE_INSET
                             oBrw2:nRowDividerStyle := LINESTYLE_INSET
                                 oBrw2:bClrHeader := {|| { nRGB(140, 0, 0), nRGB( 231, 242, 255 ), } }
                                 oBrw2:nOpacity    := 230
                                 oBrw2:nHeaderHeight      := 35
                                 oBrw2:nFreeze       := 2

                                 oBrw2:nStretchCol         := STRETCHCOL_LAST

                 oBrw2:nStretchCol         := STRETCHCOL_WIDEST

                                // oBrw2:lSeekBar:= .t.
                             oCol := oBrw2:AddCol()
                             oCol:AddResource("#10")
                             oCol:AddResource("#14")
                                 oCol:cHeader = "Agenda"
                             oCol:bBmpData   := { || IIF(Profe->Ate_Hor = "S",1,2 )}

                                 oBrw2:bClrStd  := { || If( Eval( oBrw2:bKeyNo,,oBrw2) % 2 == 0, { CLR_BLACK, RGB( 198, 255, 198 ) },;
                                          { CLR_BLACK, RGB( 232, 255, 232 ) } ) }    // Efecto Cebra
                                 oBrw2:aCols[ 1 ]:oDataFont := oFont6

                                 oBrw2:bClrStd       := {|| { nRGB(  0,  0,  0), nRGB(255,248,220) } }
                                 oBrw2:bClrSelFocus  := {|| { nRGB(  255,  255,  255), nRGB(102, 178, 255) } }
                                 oBrw2:bClrSel       := {|| { nRGB(  0,  0,255), nRGB(241,222,088) } }  // para barra de linea selecc cuando el control no tiene el foco
                                 oBrw2:lAutoSort := .t.
                                 oBrw2:nFooterLines:=1
                                 oBrw2:lFooter := .t.

                                 oBrw2:lHScroll := .f.
                             oBrw2:lIncrFilter   := .T.
                             oBrw2:lSeekWild     := .T.                   &&  .T. Busca Contenido, .F. Que comience con lo que digita
                                 oBrw2:SetStyle( 2018)
                                 oBrw2:nColorPen := CLR_RED
                     oBrw2:nRowHeight         := 18

                                 oBrw2:bChange := {|| oBrw2:Refresh() }
                                 oBrw2:aCols[1]:bClrHeader := { || { CLR_HRED,CLR_WHITE } }       // Aplico Color a Una Columna
                                 oBrw2:aCols[2]:bClrHeader := { || { CLR_HRED,CLR_WHITE } }       // Aplico Color a Una Columna
                                 oBrw2:aCols[ 1 ]:oHeaderFont :=  oFont7                  // Aplico Font a una Columna
                                 oBrw2:aCols[ 2 ]:oHeaderFont :=  oFont7                  // Aplico Font a una Columna
                                 oBrw2:aCols[ 3 ]:oHeaderFont :=  oFont7                  // Aplico Font a una Columna
                                 oBrw2:aCols[ 4 ]:oHeaderFont :=  oFont7                  // Aplico Font a una Columna
                                 oBrw2:aCols[ 5 ]:oHeaderFont :=  oFont7                  // Aplico Font a una Columna
                                 oBrw2:Seek("")
                                 oBrw2:aCols[01]:bFooter   := { || Ltrim( Str( oBrw2:KeyNo() ) ) + " / " + LTrim( Str( oBrw2:KeyCount() ) ) }
                                 oBrw2:aCols[05]:nDataStrAlign := AL_CENTER
                                 oBrw2:aCols[06]:nDataStrAlign := AL_CENTER


                    WITH OBJECT oBrw2
                                oBrw2:bLDblClick:={||Cambia(),oBrw2:Update(),oBrw2:Refresh()}

                       :CreateFromCode()
                    END



......

Static Function Cambia()
        Sele Profe
        Est:=""
        Estado:=""
        Do Case
           Case Profe->Est_Pro="S"
                        Est:="N"
                        Estado:="DESHABILITAR"
           Case Profe->Est_Pro#"S"
                        Est:="S"
                        Estado:="HABILITAR"
        EndCase
        IF MsgYesNo( " ¿ Desea "+Estado+"?","ATENCION")
                Do While .t.
                     If Rlock()
                            Repl Est_Pro with Est
                            DbCommit()
                            DbUnlock()
                            Exit
                     EndIf
                EndDo
        Endif
        Return .T.


 
FWH 22.10 - HARBOUR - PELLES C
remtec
 
Posts: 719
Joined: Fri May 12, 2017 2:50 pm

Re: Actuliza Pantalla de XBrowse

Postby leandro » Fri May 12, 2023 9:53 am

Quizás te pueda ayudar si refrescas el xbrowse cada de tome el foco
Code: Select all  Expand view

oBrw2:bGotFocus := {|| oBrw2:Refresh() }
 
Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
User avatar
leandro
 
Posts: 1676
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

Re: Actuliza Pantalla de XBrowse

Postby remtec » Fri May 12, 2023 1:27 pm

leandro wrote:Quizás te pueda ayudar si refrescas el xbrowse cada de tome el foco
Code: Select all  Expand view

oBrw2:bGotFocus := {|| oBrw2:Refresh() }
 


Hola Amigo Leandro.

Muchas gracias por responder.

Lo aplique pero no funciona.

La base entra con un filtro aplicado:
Set Filter to Est_Pro="S"
Al dar doble click sobre algun registro puedo cambiar el Est_Pro S o N, si esta con S, lo cambio a N, despues de cambiar el el estado en la base, vuelve a Xbrowse y este sigue manteniendo este registro, mostrando la ahora con N, pero al hacer click sobre el xbrowse este actuliza la pantalla sacando de la lista el registro modificado.

Muchas gracias.

Saludos

Antonio
FWH 22.10 - HARBOUR - PELLES C
remtec
 
Posts: 719
Joined: Fri May 12, 2017 2:50 pm

Re: Actuliza Pantalla de XBrowse

Postby cnavarro » Fri May 12, 2023 2:13 pm

Antonio, no sé con qué condición tienes hecho el tema del refresh del browse ( definiendo el bChange, etc. )
Si es asi, recuerda que la clase tiene una DATA lColChangeNotify ( por defecto en .F. ), que llama al bChange definido ( que habitualmente solo es ejecutado cuando cambias de posicion en el browse ), al detectar que se ha modificado un valor en una columna
Aprovecho para indicarte por si lo necesitas ( quizás no en este caso ), que tienes el metodo RefreshCurrent que solo refresca la fila en la que te encuentras, no siendo necesario hacer el refresh de todo el browse ( que en el caso que describes si será necesario evidentemente )
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: 6547
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Actuliza Pantalla de XBrowse

Postby leandro » Fri May 12, 2023 5:12 pm

Amigo pues según lo que entendí el xbrowse tiene el comportamiento correcto al igual que la dbf. Sugiero mostrar el estado del profesional en una columna, quitando el Set Filter to Est_Pro="S"

Code: Select all  Expand view

oBrw2:aCols[02]:bStrData = { || Estadoprofesional( dbf->estado) }

function Estadoprofesional( cEstd)
Local cEtd := space(0)
if cEstd="S"
   cEtd := "activo"
else
   cEtd := "bloqueado"
endif
Return cEtd
 
Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
User avatar
leandro
 
Posts: 1676
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

Re: Actuliza Pantalla de XBrowse

Postby remtec » Mon May 15, 2023 2:02 pm

cnavarro wrote:Antonio, no sé con qué condición tienes hecho el tema del refresh del browse ( definiendo el bChange, etc. )
Si es asi, recuerda que la clase tiene una DATA lColChangeNotify ( por defecto en .F. ), que llama al bChange definido ( que habitualmente solo es ejecutado cuando cambias de posicion en el browse ), al detectar que se ha modificado un valor en una columna
Aprovecho para indicarte por si lo necesitas ( quizás no en este caso ), que tienes el metodo RefreshCurrent que solo refresca la fila en la que te encuentras, no siendo necesario hacer el refresh de todo el browse ( que en el caso que describes si será necesario evidentemente )


Hola Cristobal.

Muchas gracias por responder.

Como lo muestro en el codigo de arriba, tengo un xbrowse, que entra con un filtro de todos los registros que tienen estado "S", ademas de cuenta con un combobox que puede seleccionar otras condiciones como todos los registro o los con estado "N".

En el xbrowse, tengo esta opcion que al dar click en la fila, esta manda a una rutina que puede cambiar el estado de ese registro en la DBF, que esta con el Set Filter, al volver, ese registro que se modifico su estado, debiera desaparecer de la lista al volver, pero esto no se realiza visualmente, mientras no me posecione en la pantalla o haga algun click.

Muchas gracias.

Saludos.
Antonio


Codigo de donde mando a realizar el cambio:
Code: Select all  Expand view

                    WITH OBJECT oBrw2
                                oBrw2:bLDblClick:={||Cambia(),oBrw2:RefreshCurrent()}   // <-----

                       :CreateFromCode()
                    END

........
........
Static Function Filtra_Conve(cPro2)

        Sele Profe
        Do Case
                Case cPro2="T"
                         Set Filter to
                Case cPro2="S"
                         Set Filter to Est_Pro="S"
                Case cPro2="N"
                         Set Filter to Est_Pro#"S"
        EndCase
        Go Top

        Return .t.

Static Function Cambia()
        Sele Profe
        Est:=""
        Estado:=""
        Do Case
           Case Profe->Est_Pro="S"
                        Est:="N"
                        Estado:="DESHABILITAR"
           Case Profe->Est_Pro#"S"
                        Est:="S"
                        Estado:="HABILITAR"
        EndCase
        IF MsgYesNo( " ¿ Desea "+Estado+"?","ATENCION")
                Do While .t.
                     If Rlock()
                            Repl Est_Pro with Est
                            DbCommit()
                            DbUnlock()
                            Exit
                     EndIf
                EndDo
        Endif
        Return .T.



 
FWH 22.10 - HARBOUR - PELLES C
remtec
 
Posts: 719
Joined: Fri May 12, 2017 2:50 pm

Re: Actuliza Pantalla de XBrowse

Postby remtec » Mon May 15, 2023 2:08 pm

leandro wrote:Amigo pues según lo que entendí el xbrowse tiene el comportamiento correcto al igual que la dbf. Sugiero mostrar el estado del profesional en una columna, quitando el Set Filter to Est_Pro="S"

Code: Select all  Expand view

oBrw2:aCols[02]:bStrData = { || Estadoprofesional( dbf->estado) }

function Estadoprofesional( cEstd)
Local cEtd := space(0)
if cEstd="S"
   cEtd := "activo"
else
   cEtd := "bloqueado"
endif
Return cEtd
 


Hola Leandro.

Muchas gracias por responder.

Tengo la solicitud que el usuario pueda seleccionar en el combobox el estado de los profesionales que desea visualizar, en la columna 05 se muestra el estado de cada registro, en el Combo esta la opcion de Todos, Activos y Desactivados ("S","N","T"), motivo por lo cual debo usar un set filter, claro a menos que exista otra opcion que no sepa.

Muchas gracias.

Saludos

Antonio.
FWH 22.10 - HARBOUR - PELLES C
remtec
 
Posts: 719
Joined: Fri May 12, 2017 2:50 pm


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 46 guests

cron