FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour xBrowse y SetArray(aArray) (SOLUCIONADO)
Posts: 2170
Joined: Fri Jul 18, 2008 01:24 AM
xBrowse y SetArray(aArray) (SOLUCIONADO)
Posted: Mon Sep 21, 2009 03: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

Francisco J. Alegría P.

Chinandega, Nicaragua.



Fwxh-MySql-TMySql
Posts: 401
Joined: Thu Oct 06, 2005 10:15 PM
Re: xBrowse y SetArray(aArray)
Posted: Mon Sep 21, 2009 03:53 PM
Code (fw): Select all Collapse
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

------------------------------------------------------

*/
Posts: 2170
Joined: Fri Jul 18, 2008 01:24 AM
Re: xBrowse y SetArray(aArray)
Posted: Mon Sep 21, 2009 05: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
Posts: 2170
Joined: Fri Jul 18, 2008 01:24 AM
Re: xBrowse y SetArray(aArray)
Posted: Mon Sep 21, 2009 06:30 PM
Aqui dejo un ejemplo funcional de lo que estoy haciendo. Agradeceré cualquier ayuda.
Saludos.

Code (fw): Select all Collapse
#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
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 PM
Re: xBrowse y SetArray(aArray)
Posted: Mon Sep 21, 2009 06: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

Posts: 2365
Joined: Wed Nov 02, 2005 11:46 PM
Re: xBrowse y SetArray(aArray)
Posted: Mon Sep 21, 2009 07:21 PM
Francisco...

Este es un ejemplo

Code (fw): Select all Collapse
#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
Posts: 2170
Joined: Fri Jul 18, 2008 01:24 AM
Re: xBrowse y SetArray(aArray)
Posted: Tue Sep 22, 2009 02: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
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 PM
Re: xBrowse y SetArray(aArray)
Posted: Tue Sep 22, 2009 03:02 AM

Francisco

El ejemplo que he publicado funciona perfectamente... voy a subir un ejecutable

Posts: 2365
Joined: Wed Nov 02, 2005 11:46 PM
Re: xBrowse y SetArray(aArray)
Posted: Tue Sep 22, 2009 03:06 AM
Francisco...

aqui dejo el ejecutable como he prometido


http://www.sitasoft.com/fivewin/test/xbrarra2.rar
Posts: 2170
Joined: Fri Jul 18, 2008 01:24 AM
Re: xBrowse y SetArray(aArray)
Posted: Tue Sep 22, 2009 04: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
Posts: 2170
Joined: Fri Jul 18, 2008 01:24 AM
Re: xBrowse y SetArray(aArray) (SOLUCIONADO)
Posted: Sat Sep 26, 2009 03: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:= aWidthCols[oCol:nArrayCol] ,;
oCol:cEditPicture:= aPictCols[oCol:nArrayCol] } )

oBrw:Refresh()


Return NIL
Francisco J. Alegría P.

Chinandega, Nicaragua.



Fwxh-MySql-TMySql
Posts: 1074
Joined: Fri Oct 07, 2005 01:56 PM
Re: xBrowse y SetArray(aArray) (SOLUCIONADO)
Posted: Fri Oct 08, 2010 08: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
Posts: 336
Joined: Wed May 16, 2007 09:40 PM
Re: xBrowse y SetArray(aArray) (SOLUCIONADO)
Posted: Sun Oct 10, 2010 03:35 AM

una consulta, como puedo sumar una columna del xbrowse en el footer

Fivewin-Xharbour 24.09, Iquique, Chile

Continue the discussion