Page 1 of 1

Ayuda con creación de GETs dinámicos (Solucionado)

PostPosted: Fri Aug 29, 2008 3:49 am
by sjingo
Hola amigos

Me ha surgido la necesidad de generar un diálogo con unos gets que se deben crear dinámicamente, es decir que bien puede tener 2 o n gets dependiendo de cuántos campos tenga una tabla. Puede alguien darme una mano por favor.

Con el siguiente código me genera bien los says, también se dibujan los gets pero parece que el valor de todos los gets creados toman el del último.

Code: Select all  Expand view

local asay:=array(nfields)        //Texto para los says
local aoget:=array(nfields)      //Variables para los objeto Get
local avarget:=array(nfields)   //Variables con el contenido del oGet

for n:=1 to nfields
   asay[n]:=ors:Fields(n-1):Name              //Asigno nombre del campo
   avarget[n]:=cvaltochar(ors:Fields(n-1):Value) //Asig el valor
next

DEFINE dialog odlgReg from 1,1 to (nfields*30)+30,150 title "Edición de registro" pixel

for n:=1 to nfields
   tmp:=n  //Si no uso esto devuelve un error al generar el get
   @fila,colum say asay[n] of odlgReg pixel  //Esto genera bien
   @fila,Colum+30 get aoget[tmp] var avarget[tmp] of odlgReg pixel update size 30,10 //<-- Aquí tengo el problema
   fila+=15
next


Parece ser por la forma en que el TGet asigna el valor mediante un codeblock bsetget......no se.

Estoy dándole vueltas a esto y no le encuentro solución.

De antemano muchas gracias.

Marcelo Jingo

Re: Ayuda con creación de GETs

PostPosted: Fri Aug 29, 2008 3:53 am
by wmormar
Marcelo,

Que error manda?
Algo más de código seria bueno para verle

Re: Ayuda con creación de GETs

PostPosted: Fri Aug 29, 2008 7:14 am
by gmart1
Hola Marcelo,
el problema es debido a que en tu bucle "for" creas los objetos gets, pero la ejecución del programa continua y la variable n cuando sale del bucle es igual a nfields + 1, entonces cuando se activa el dialogo y se ven los gets intenta asignarles el valor avarget[nfields+1], que está fuera del rango de avarget.
Si por el contrario usas la variable tmp, no da error, pero su valor cuando se activa el dialogo es el del último paso por el bucle, tmp = nfields y tendras todos los gets apuntando a avarget[nfields]

La solución es usar un codeblock "dinámico" para asiganarle el valor :

@fila,Colum+30 get aoget[tmp] var avarget[tmp] of odlgReg pixel update size 30,10 //<-- Aquí tengo el problema
aoget[n]:bSETGET := GenLocalBlock ( avarget, n )

y la funcion :

function GenLocalBlock ( aGets, n )
return bSETGET ( aGets [n] )


la definición de bSETGET () está en el archivo FiveWin.CH, por si le quieres echar un vistazo.

Espero te sirva.

PostPosted: Fri Aug 29, 2008 3:35 pm
by sjingo
gmart1

Con tu sugerencia he logrado resolver este problema, pero he tenido que crear los gets en una función que mando a llamar desde el on init del diálogo principal. asi:

Code: Select all  Expand view

DEFINE dialog odlgReg from 1,1 to (nfields*30)+50,250 title "Edición de registro" pixel

@ (nfields*15),10 button obt1 prompt "OK" of odlgReg pixel
@ (nfields*15),50 button obt2 prompt "Cancel" of odlgreg pixel

activate dialog odlgreg centered on init gendlg(odlgReg,asay,aoget,avarget,nfields)
return nil

//-------------------------------------------------------
//Función para generar los gets y says
function gendlg(odlgReg,asay,aoget,avarget,nfields,obt1,obt2)
local n ,fila:=10,colum:=10

for n:=1 to nfields
   @fila,colum say asay[n] of odlgReg pixel
   aoget[n]:=TGet():New( fila, Colum+60, GenLocalBlock(avarget,n), odlgReg,50,20,,,,,,,,.t.)
   fila+=25
next
return nil

//------------------------------------------------------
function GenLocalBlock ( aGets, n )
return bSETGET ( aGets [n] )


Si tengo más problemas estaré molestando. Gracias también Willian por tu interés.

Un saludo a todos.

Marcelo Jingo

PostPosted: Sat Aug 30, 2008 10:40 am
by gmart1
Hola de nuevo Marcelo,

Perdona que no te indicara que tenías que cambiar la declaración de los gets al formato de clase TGet:new(), yo en su día tuve que cambiarlo, ya que la solución que te di
Code: Select all  Expand view
aoget[n]:bSETGET := GenLocalBlock ( avarget, n )

requiere que el objeto exista, para poder modificar la propiedad bSETGET.
Pero con el cambio de nomenclatura que has hecho, creo que no es necesario que llames a la función en el on init, yo por lo menos lo tengo declarado antes y no me lanza ningún error.

Un saludo.