xBrowse y SetArray(aArray) (SOLUCIONADO)

xBrowse y SetArray(aArray) (SOLUCIONADO)

Postby FranciscoA » Mon Sep 21, 2009 3:06 pm

Amigos del Foro: Solicito un pequeño ejemplo, u orientación sobre el uso de xbrowse con arrays. (ya he visto los ejemplos en samples y aquí en el foro, pero no encuentro lo que deseo)
Antes que nada, esto lo tengo resuelto con TWinbrowse, pero quiero pasarlo a TxBrowse.

El caso es el siguiente: Tengo un dialogo con algunos gets y un xbrowse desde recursos. Al crear el brow le cargo un array vacío asi: aMiArray:={{"","",""}} (pueden ser mas columnas), y todo bien. (este array lo he declarado Static)

Más adelante, al actualizar cualquiera de los gets con un VALID activo una function llamada Actualizar(oBrw)
Dentro de esta funcion recargo el array con : (con la misma estructura, solo cambio datos)
aMiArray:={}
aMiArray:={{"nvo dato","otro","otro"}}
oBrw:SetArray(aMiArray)
oBrw:Refresh()

El oBrow recarga bien el array en cuanto a los datos, pero pierde los titulos de las columnas, los footers definidos y la presentacion de los valores numéricos. (pierde los pictures "9,999,999,999.99")

Mi pregunta es: ¿Como hacer para que al refrescar el browse no se pierdan los headers, footers y los pictures?
Nota: Al refrescar el Browse, los headers aparecen asi: oCol-1,oCol-2, etc,etc. y los footers en blanco.

Agradezco de antemano cualquier ayuda al respecto.
Saludos
Last edited by FranciscoA on Sat Sep 26, 2009 3:28 am, edited 1 time in total.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2159
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: xBrowse y SetArray(aArray)

Postby pablovidal » Mon Sep 21, 2009 3:53 pm

Code: Select all  Expand view  RUN

aMiArray:={}
aMiArray:={{"nvo dato","otro","otro"}}
//oBrw:SetArray(aMiArray)
oBrw:aArrayData  := aMiArray // <- Asi es
oBrw:Refresh()
 
Saludos,

Pablo Alberto Vidal
/*
------------------------------------------------------
Harbour 3.2.0, Fivewin 17.02, BCC7
------------------------------------------------------
*/
User avatar
pablovidal
 
Posts: 401
Joined: Thu Oct 06, 2005 10:15 pm
Location: Republica Dominicana

Re: xBrowse y SetArray(aArray)

Postby FranciscoA » Mon Sep 21, 2009 5:29 pm

Pablo, Gracias por contestar. Agradezco tu interés.
Es correcto como tú indicas. Ya lo había probado así, pero sólo me presenta un registro del array. Mejor dicho, el Browse muestra tantos registros como contiene el array, pero todos con los mismos datos del primer registro.

Como dije anteriormente, si lo hago así: oBrw:SetArray(MiArray), muestra bien todos los datos, pero perdiendo los headers,footers y pictures.

¿Qué me dices tú?, o alguien más en el foro.
Gracias nuevamente.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2159
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: xBrowse y SetArray(aArray)

Postby FranciscoA » Mon Sep 21, 2009 6:30 pm

Aqui dejo un ejemplo funcional de lo que estoy haciendo. Agradeceré cualquier ayuda.
Saludos.

Code: Select all  Expand view  RUN
#include "FiveWin.ch"
#include "xBrowse.ch"

static nTotalItems:=0
Static aMiArray := { {"", "" } }

//--------------------------------------------------------------------------------------------------------------------//

Function Main()
local oBrw,oGet1,oGet2
local nItem:=1
local n:=0,oCol

   Local oDlg, nConsec:=0,dFecIni:=Date()


   SET DATE BRITISH
   SET CENTURY ON
   SET CONFIRM ON
   SET EPOCH TO 1990

   SET RESOURCES TO "Financ.dll"

   dFecIni  := Date()

   DEFINE DIALOG oDlg RESOURCE "INTERES"

   REDEFINE GET oGet1 VAR nConsec ID 101 OF oDlg ;
            UPDATE ;
            PICTURE "9999" ;
            VALID ( if(!empty(nConsec), (Actualice(oBrw, nConsec, dFecIni ), .T.),(MsgStop("Debe ingresar un valor.","Alto"),.f.) ) )

   oGet1:bGotFocus := {||oGet1:SetColor( CLR_WHITE, CLR_BLUE ) }
   oGet1:bLostFocus := {||oGet1:SetColor( CLR_BLACK, CLR_WHITE ) }


   REDEFINE GET oGet2 VAR dFecIni ID 102 OF oDlg ;
            UPDATE ;
            VALID ( if(!empty(dFecIni), (Actualice(oBrw, nConsec, dFecIni ), .T.),(MsgStop("Debe ingresar un valor.","Alto"),.f.) ) )

   oGet2:bGotFocus := {||oGet2:SetColor( CLR_WHITE, CLR_BLUE ) }
   oGet2:bLostFocus := {||oGet2:SetColor( CLR_BLACK, CLR_WHITE ) }


   //Para mostrar separadores de miles en TxBrowse
   xbrNumFormat( "A", .t. )  // "E" for European, "A" for American and others
                             // .t. for showing thousand separators

   oBrw := TXBrowse():New( oDlg )

      //ESTILOS DE LINEAS
   oBrw:nMarqueeStyle       := MARQSTYLE_HIGHLROW    //barra selectora
   oBrw:nColDividerStyle     := LINESTYLE_INSET
   oBrw:nRowDividerStyle     := LINESTYLE_INSET
   oBrw:lColDividerComplete  := .t.    //completa pintado hasta el footer cuando lineas no llenan todo el browse

   //HEADERS Y FOOTERS
   oBrw:nHeaderHeight        := 30   //Altura cabeceras de col
   oBrw:lFooter              := .t.  //Que tendrá footer
   oBrw:nFooterLines         := 1    //Lineas del footer
   oBrw:nFooterHeight        := 30   //Altura del  Footer
   oBrw:lRecordSelector      := .t.  //poner o no, COL de la flechita de la izq

   //COLORES (texto y fondo del texto)
   oBrw:bClrHeader    := {|| { nRGB(140,  0,  0), nRGB(229,0,0) } }  // VERDECITO
   oBrw:bClrFooter    := oBrw:bClrHeader
   oBrw:bClrStd       := {|| { nRGB(  0,  0,  0), nRGB(255,248,220) } }  // colores para lineas normales
   oBrw:bClrSel       := {|| { nRGB(  0,  0,255), nRGB(241,222,088) } }  // para barra de linea selecc cuando el control no tiene el foco
   oBrw:bClrSelFocus  := {|| { nRGB(  0,  0,  0), nRGB(248,195, 34) } }  // para barra de linea selecc cuando el control tiene el foco

   oBrw:nRowHeight   := 20  //altura entre lineas
   oBrw:lFastEdit := .f.    //.t.= edicion rapida, salta a sig col


   //COLUMNAS DEL BROWSE
   oCol = oBrw:AddCol()
   oCol:bStrData = { || Transform(aMiArray[1][1],"9999") }
   oCol:nDataStrAlign := 1
   oCol:cHeader = "Consec"
   oCol:bFooter  =  {|| TRANSFORM(nTotalItems,"999999") }
   oCol:nFootStrAlign := 1

   oCol = oBrw:AddCol()
   oCol:bStrData = { || aMiArray[1][2] }
   oCol:nDataStrAlign := 1
   oCol:cHeader = "Fecha"

   oBrw:CreateFromResource(181)
   oBrw:SetArray(aMiArray)

   ACTIVATE DIALOG oDlg CENTERED

   
   SET RESOURCES TO

Return Nil


//--------------------------------------------------------------------------------------------------------------------//

Static Function Actualice(oBrw, nConsec, dFecIni )

   Local dFecha  := dFecIni, xVeces:=nConsec

   aMiArray  := {}

   If empty(nConsec) .OR. empty(dFecha)
      Return NIL
   EndIf

   While xVeces <= ( 10 )

      AAdd( aMiArray, { xVeces++, DtoC( dFecha ) } )
      dFecha += 10

   EndDo

   nTotalItems := xVeces


//oBrw:aArrayData:=aMiArray  //este presenta todos los registros con el valor del primero
  oBrw:SetArray(aMiArray)   //presenta bien los registros, pero sin headers,footers,pictures
   oBrw:Refresh()
Return NIL
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2159
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: xBrowse y SetArray(aArray)

Postby Daniel Garcia-Gil » Mon Sep 21, 2009 6:46 pm

Francisco...

Falta el recurso para construir el ejemplo...

Pero prueba agreando esto a cada definicion de columna

oCol:nArrayCol := 1
oCol:nArrayCol := 2

y haces como te lo indica pablo
User avatar
Daniel Garcia-Gil
 
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita

Re: xBrowse y SetArray(aArray)

Postby Daniel Garcia-Gil » Mon Sep 21, 2009 7:21 pm

Francisco...

Este es un ejemplo

Code: Select all  Expand view  RUN
#include "FiveWin.ch"
#include "xbrowse.ch"

function Main()

  local oWnd
  local oWndDlg,;
         oBrw,;
         oCol
         
  local aArray := { }
   
  define dialog oWndDlg title "Test Blank Array on Dialog" size 500,500 pixel
           
  oBrw := TXBrowse():New( oWndDlg )
  oBrw:SetArray( aArray )
  oCol:= oBrw:addcol()
  oCol:cHeader   := "Num1"
  oCol:nWidth    := 40
  oCol:nArrayCol := 1  // it is necesary

  oCol:= oBrw:addcol()
  oCol:cHeader := "Date"
  oCol:nWidth  := 80
  oCol:nArrayCol := 2  // it is necesary

  oCol:= oBrw:addcol()
  oCol:cHeader := "Time"
  oCol:nWidth  := 80
  oCol:nArrayCol := 3  // it is necesary

  oCol:= oBrw:addcol()
  oCol:cHeader := "Extra"
  oCol:nWidth  := 80
  oCol:nArrayCol := 4  // it is necesary
 

  oBrw:lFastEdit    := .t.
  oBrw:lAutoAppend  := .t.

  if oBrw:lAutoAppend .and. oBrw:lFastEdit
     oBrw:bPastEof  := { || Actualice( oBrw, oBrw ), oBrw:GoBottom(), oBrw:Refresh() }
  endif        
  oBrw:CreateFromCode()
 
  oWndDlg:oClient := oBrw
 
  activate dialog oWndDlg on init( BtnBar( oWndDlg, oBrw ), oWndDlg:Resize() )
           
return nil

function BtnBar( oParent, oBrw )
   local oBar


   DEFINE buttonbar oBar of oParent size 80,32 2007

   define button of oBar prompt "Append" action  Actualice(oBrw, 1, date() )

   define button of oBar prompt "Delete" action DeleteRow( oBrw )

   define button of oBar prompt "Quit" action ( oParent:end() )

 
return nil

Function Actualice(oBrw, nConsec, dFecIni )

   Local dFecha  := dFecIni, xVeces:=nConsec

   aMiArray  := {}

   If empty(nConsec) .OR. empty(dFecha)
      Return NIL
   EndIf

   While xVeces <= ( 10 )

      AAdd( aMiArray, { xVeces++, DtoC( dFecha ), time(), time() + " " + DtoC( date() ) } )
      dFecha += 10

   EndDo

   nTotalItems := xVeces


oBrw:aArrayData:=aMiArray  //este presenta todos los registros con el valor del primero
//  oBrw:SetArray(aMiArray)   //presenta bien los registros, pero sin headers,footers,pictures
   oBrw:Refresh()
Return NIL

static function DeleteRow( oBrw )

  if !empty( oBrw:aArrayData )

     ADel(  oBrw:aArrayData, oBrw:nArrayAt )
     ASize( oBrw:aArrayData, Len( oBrw:aArrayData ) - 1 )

     oBrw:Refresh()
     oBrw:SetFocus()

  endif

return nil


 
User avatar
Daniel Garcia-Gil
 
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita

Re: xBrowse y SetArray(aArray)

Postby FranciscoA » Tue Sep 22, 2009 2:35 am

Daniel, muchas gracias por contestar. Aquí está el recurso (.rc)
Hice los ajustes que indicas en el primer post y sigue lo mismo. Tu ejemplo me ha dado otras ideas, y por supuesto me es útil. Continúo luchando con lo que quiero hacer. Gracias, nuevamente.
Saludos.

pd: A mi ejemplo hay que quitarle las lineas referentes a: SET RESOURCES TO...
// RESOURCE SCRIPT generated by "Pelles C for Windows, version 6.00".

LANGUAGE LANG_ENGLISH,SUBLANG_ENGLISH_US

INTERES DIALOG FIXED IMPURE 0, -29, 476, 227
STYLE WS_POPUP|DS_MODALFRAME|WS_CAPTION|WS_SYSMENU|WS_VISIBLE
CAPTION "Prueba de TxBrowse"
FONT 8, "MS Sans Serif"
{
CONTROL "", 101, "Edit", ES_RIGHT|ES_AUTOHSCROLL|WS_BORDER|WS_TABSTOP, 120, 6, 80, 12
CONTROL "", 102, "Edit", ES_RIGHT|ES_AUTOHSCROLL|WS_BORDER|WS_TABSTOP, 120, 22, 52, 12
CONTROL "", 181, "ListBox", LBS_SORT|LBS_NOTIFY|LBS_MULTICOLUMN|WS_HSCROLL|WS_VSCROLL|WS_BORDER|WS_TABSTOP, 2, 40, 472, 174
CONTROL "Consecutivo", 4003, "Static", SS_RIGHT|WS_GROUP, 6, 8, 112, 8
CONTROL "Fecha", 4004, "Static", SS_RIGHT|WS_GROUP, 6, 24, 110, 8
}
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2159
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: xBrowse y SetArray(aArray)

Postby Daniel Garcia-Gil » Tue Sep 22, 2009 3:02 am

Francisco

El ejemplo que he publicado funciona perfectamente... voy a subir un ejecutable
User avatar
Daniel Garcia-Gil
 
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita

Re: xBrowse y SetArray(aArray)

Postby Daniel Garcia-Gil » Tue Sep 22, 2009 3:06 am

Francisco...

aqui dejo el ejecutable como he prometido


http://www.sitasoft.com/fivewin/test/xbrarra2.rar
User avatar
Daniel Garcia-Gil
 
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita

Re: xBrowse y SetArray(aArray)

Postby FranciscoA » Tue Sep 22, 2009 4:13 am

Daniel, efectivamente tu ejecutable funciona bien.
El ejemplo compila y ejecuta sin ningún problema, pero al "clickear" en el boton append o delete no hace nada.
Estoy pensando que es cuestión de versión de FWH (uso 901) :roll:
Muchísimas gracias.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2159
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: xBrowse y SetArray(aArray) (SOLUCIONADO)

Postby FranciscoA » Sat Sep 26, 2009 3:18 am

Hola Daniel.
Comprobado, es cuestión de versión. He leído varios post en los cuales se describe este inconveniente.
Sin embargo, he logrado solucionarlo de la manera siguiente. Dejo el ejemplo por si alguien tiene el mismo problema que yo.
Decidí no tocar la Classe TxBrowse. El recurso está posteado un poco más arriba.


#include "FiveWin.ch"
#include "xBrowse.ch"

static aTitCols:={}
static aFootCols:={}
static aWidthCols:={}
static aPictCols:={}

static nValores:=0

//--------------------------------------------------------------------------------------------------------------------//

Function Main()
local oBrw,oGet1,oGet2
local n:=0,oCol

Local oDlg, nConsec:=0,dFecIni:=Date()
local aMiArray:={{"","","",""}}

SET DATE BRITISH
SET CENTURY ON
SET CONFIRM ON
SET EPOCH TO 1990

dFecIni := Date()

DEFINE DIALOG oDlg RESOURCE "INTERES" TITLE "PRUEBA DE TXBROWSE CON ARRAY"

REDEFINE GET oGet1 VAR nConsec ID 101 OF oDlg ;
UPDATE ;
PICTURE "9999" ;
VALID ( if(!empty(nConsec), (Actualice(oBrw, nConsec, dFecIni ), .T.),(MsgStop("Debe ingresar un valor.","Alto"),.f.) ) )

oGet1:bGotFocus := {||oGet1:SetColor( CLR_WHITE, CLR_BLUE ) }
oGet1:bLostFocus := {||oGet1:SetColor( CLR_BLACK, CLR_WHITE ) }


REDEFINE GET oGet2 VAR dFecIni ID 102 OF oDlg ;
UPDATE ;
VALID ( if(!empty(dFecIni), (Actualice(oBrw, nConsec, dFecIni ), .T.),(MsgStop("Debe ingresar un valor.","Alto"),.f.) ) )

oGet2:bGotFocus := {||oGet2:SetColor( CLR_WHITE, CLR_BLUE ) }
oGet2:bLostFocus := {||oGet2:SetColor( CLR_BLACK, CLR_WHITE ) }


oBrw := TXBrowse():New( oDlg )

//ESTILOS DE LINEAS
oBrw:nMarqueeStyle := MARQSTYLE_HIGHLROW //barra selectora
oBrw:nColDividerStyle := LINESTYLE_INSET
oBrw:nRowDividerStyle := LINESTYLE_INSET
oBrw:lColDividerComplete := .t. //completa pintado hasta el footer cuando lineas no llenan todo el browse

//HEADERS Y FOOTERS
oBrw:nHeaderHeight := 30 //Altura cabeceras de col
oBrw:lFooter := .t. //Que tendrá footer
oBrw:nFooterLines := 1 //Lineas del footer
oBrw:nFooterHeight := 30 //Altura del Footer
oBrw:lRecordSelector := .t. //poner o no, COL de la flechita de la izq

//COLORES (texto y fondo del texto)
oBrw:bClrHeader := {|| { nRGB(140, 0, 0), nRGB(229,0,0) } } // VERDECITO
oBrw:bClrFooter := oBrw:bClrHeader
oBrw:bClrStd := {|| { nRGB( 0, 0, 0), nRGB(255,248,220) } } // colores para lineas normales
oBrw:bClrSel := {|| { nRGB( 0, 0,255), nRGB(241,222,088) } } // para barra de linea selecc cuando el control no tiene el foco
oBrw:bClrSelFocus := {|| { nRGB( 0, 0, 0), nRGB(248,195, 34) } } // para barra de linea selecc cuando el control tiene el foco

oBrw:nRowHeight := 20 //altura entre lineas

//COLUMNAS DEL BROWSE
oCol = oBrw:AddCol()
oCol:bStrData = { || Transform(aMiArray[1][1],"9999") }
oCol:nDataStrAlign := 1
oCol:cHeader = "Consec"
oCol:bFooter = {|| "Hola" }
oCol:nFootStrAlign := 1
oCol:nWidth = 44
oCol:cEditPicture := NumPict( 4, 0, .F., .f. )


oCol = oBrw:AddCol()
oCol:bStrData = { || aMiArray[1][2] }
oCol:nDataStrAlign := 1
oCol:cHeader = "Fecha"
oCol:bFooter = {|| "Hola" }
oCol:nWidth = 88

oCol = oBrw:AddCol()
oCol:bStrData = { || aMiArray[1][3] }
oCol:nDataStrAlign := 1
oCol:cHeader = "Hora"
oCol:nWidth = 88

oCol = oBrw:AddCol()
oCol:bStrData = { || aMiArray[1][4] }
oCol:nDataStrAlign := 1
oCol:cHeader = "Valores"
oCol:bFooter = {|| TRANSFORM(nValores,"9,999,999,999.99") }
oCol:nWidth = 100
oCol:cEditPicture := NumPict( 14, 2, .F., .t. )


For n:=1 to len(oBrw:aCols)
aadd(aTitCols,oBrw:aCols[n]:cHeader)
aadd(aFootCols,oBrw:aCols[n]:bFooter)
aadd(aWidthCols,oBrw:aCols[n]:nWidth)
aadd(aPictCols,oBrw:aCols[n]:cEditPicture)
Next


oBrw:CreateFromResource(181)
oBrw:SetArray(aMiArray)


ACTIVATE DIALOG oDlg CENTERED

Return Nil


//--------------------------------------------------------------------------------------------------------------------//

Static Function Actualice(oBrw, nConsec, dFecIni )

Local dFecha := dFecIni, xVeces:=1, nValor:=1000
local aMiArray := {}

If empty(nConsec) .OR. empty(dFecha)
Return NIL
EndIf

nValores:=0

While xVeces <= nConsec

AAdd( aMiArray, { xVeces++, DtoC( dFecha ), time(), nValor } )
dFecha += 10
nValores+=nValor
nValor ++

EndDo


oBrw:SetArray(aMiArray)
AEval( oBrw:aCols, {|oCol| oCol:cHeader := aTitCols[oCol:nArrayCol] ,;
oCol:bFooter := aFootCols[oCol:nArrayCol] ,;
oCol:nWidth:= aWidthCols[oCol:nArrayCol] ,;
oCol:cEditPicture:= aPictCols[oCol:nArrayCol] } )

oBrw:Refresh()


Return NIL
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2159
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: xBrowse y SetArray(aArray) (SOLUCIONADO)

Postby Patricio Avalos Aguirre » Fri Oct 08, 2010 8:14 pm

Estimados

El ejemplo que propone Daniel sale una columna fantasma "Col1", a mi una columna "A"
como se soluciona esto?
Saludos
Patricio

__________________________________________________________________
Version: Harbour 3.2.0dev (r1307082134),Compiler: Borland C++ 5.8.2 (32-bit)
PCode version: 0.3, FWH 13.2
http://www.sialm.cl
User avatar
Patricio Avalos Aguirre
 
Posts: 1060
Joined: Fri Oct 07, 2005 1:56 pm
Location: La Serena, Chile

Re: xBrowse y SetArray(aArray) (SOLUCIONADO)

Postby elmoiquique » Sun Oct 10, 2010 3:35 am

una consulta, como puedo sumar una columna del xbrowse en el footer
Fivewin-Xharbour 24.09, Iquique, Chile
elmoiquique
 
Posts: 316
Joined: Wed May 16, 2007 9:40 pm
Location: Region de Ñuble, Chile


Return to FiveWin para Harbour/xHarbour

Who is online

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