Page 1 of 1

Twbrowse de Hernan

Posted: Mon Feb 12, 2007 12:41 pm
by Frafive
Hola Foro

Se podria montar un browse en tiempo de ejecucion ? con array le cambio el bLine y funciona perfecto pero con una dbf no me va.


Un saludo

Posted: Tue Feb 13, 2007 3:25 am
by sjingo
Sí se puede, usando el mismo bline. En el bline colocaremos la variable que contiene _ a mostrar. Yo lo he usado así y no he tenido problemas. Aquí tienes lo más principal de la función que uso, a lo mejor hay mejores formas pero al menos a mí me funciona:

Code: Select all

//ctit = titulo de la ventana con el browse
//cfile = nombre de la tabla a mostrar (archivo)
//calias = alias de la tabla
function Ed1(ctit,cfile,calias)

// bla,bla
// bla,bla

nfields:=fcount()
encabeza:=array(nfields)
ancho1:=array(nfields)
campos:=array(nfields)
justif:=array(nfields)

///campos2 es la variable que usaremos en el bline
campos2:="{"
campos3:=array(nfields)
malias:=alias()+"->"
campo_tip:=array(nfields)//tipo de dato
for i=1 to nfields
	encabeza[i]:=field(i)
	tmpvar:=&(field(i))
	campos[i]:=field(i)
	campos3[i]:=malias+campos[i]
	campo_tip[i]:=valtype(&(field(i)))
	justif[i]:=.f.
	if campo_tip[i]=="N"
		tmpvar:=str(tmpvar)
		campos2+="str("+malias+campos[i]+")"
		justif[i]:=.t.
	elseif campo_tip[i]=="D"
		tmpvar:=dtoc(tmpvar)
		campos2+="DTOC("+malias+campos[i]+")"
	elseif campo_tip[i]=="M"
		campos2+='"<MEMO>"'
		tmpvar:="<MEMO>"
	else
		campos2+=malias+campos[i]
	endif
	if i!=nfields
		campos2+=","
	endif
	fontwith:=GetFontInfo(oFont)
	ancho1[i]:=(len(tmpvar)+1)*fontwith[2]  // en pantalla
next
campos2+="}"


DEFINE FONT ofont NAME "MS Sans Serif" size 0,-12 //OF Dialog_ed
DEFINE WINDOW oWinGen MDICHILD OF oWin ;
      TITLE ctit+". Archivo: "+cfile COLOR "W+/W"

@2,175 listbox oList fields ;
	of oWinGen size 313,172 update font ofont pixel
	olist:calias=calias
	oList:ajustify:=justif
	oList:acolsizes:=ancho1
	oList:aheaders:=encabeza
	oList:lcellstyle:=.t.
	oList:nlinestyle:=1
	olist:lAdjLastCol:=.f.
	olist:lAdjBrowse:=.f.
	oList:bline:={||&campos2}

// y más bla,bla
//////////////////////////

////////////////////////////////////////////////////
// La función la llamo de la siguiente manera

lfamtr:=cGetNewAlias("lfamtr")
use &cfilefam shared alias (lfamtr) new
index on (lfamtr)->cod_fam to famt_i
(lfamtr)->(ED1("Actualizar Familias de Trabajadores",cfilefam,lfamtr))

Espero que te sirva

Un saludo

Marcelo Jingo

Posted: Tue Feb 13, 2007 4:13 pm
by R.F.
Lo que yo hago es crear el array para bLine como si fuera una cadena de caracteres, yluego la convierto en el bloque de codigo necesario para bLIne

Code: Select all


   LOCAL cArray := "{"
   FOR nContador := 1 TO LEN(aFields) // del DBSTRUCT
      DO CASE
         CASE VALTYPE(aFields[nContador,1]) = "C"
            IF LEN(aFields[nContador]) = 7
               IF aFields[nContador,7]
                  cArray += aFields[nContador,1]+","
               ENDIF
            ELSE
               IF aFields[nContador,3] <> NIL
                  cArray += "TRANSFORM("+::cAlias+"->"+aFields[nContador,1]+",'"+aFields[nContador,3]+"'),"
               ELSE
                  cArray += ::cAlias+"->"+aFields[nContador,1]+","
               ENDIF
            ENDIF
      ENDCASE
   NEXT nContador
   cArray := SUBSTR(cArray,1,LEN(cArray)-1)+"}"

/* hasta este punto tenemos el array como texto, ahora tenemos que convertilro en un bloque de codigo */

   ::oBrowse:bLine := cToBlock(cArray)

Posted: Thu Feb 15, 2007 11:50 am
by Frafive
Gracias por vuestra ayuda, ahora me funciona perfecto.