Twbrowse de Hernan

Twbrowse de Hernan

Postby Frafive » Mon Feb 12, 2007 12:41 pm

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
Frafive
 
Posts: 189
Joined: Wed Apr 05, 2006 9:48 pm

Postby sjingo » Tue Feb 13, 2007 3:25 am

Sí se puede, usando el mismo bline. En el bline colocaremos la variable que contiene los campos 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  Expand view  RUN
//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
User avatar
sjingo
 
Posts: 229
Joined: Sat Mar 18, 2006 3:42 pm
Location: Ibarra-Ecuador

Postby R.F. » Tue Feb 13, 2007 4:13 pm

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  Expand view  RUN

   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)
Saludos
R.F.
R.F.
 
Posts: 840
Joined: Thu Oct 13, 2005 7:05 pm

Postby Frafive » Thu Feb 15, 2007 11:50 am

Gracias por vuestra ayuda, ahora me funciona perfecto.
Frafive
 
Posts: 189
Joined: Wed Apr 05, 2006 9:48 pm


Return to FiveWin para Harbour/xHarbour

Who is online

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