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

Post Reply
User avatar
sjingo
Posts: 229
Joined: Sat Mar 18, 2006 3:42 pm
Location: Ibarra-Ecuador

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

Post 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 _ 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


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
Last edited by sjingo on Sat Aug 30, 2008 1:42 pm, edited 1 time in total.
User avatar
wmormar
Posts: 1050
Joined: Fri Oct 07, 2005 10:41 pm
Location: México
Contact:

Re: Ayuda con creación de GETs

Post by wmormar »

Marcelo,

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

méxico.sureste
gmart1
Posts: 65
Joined: Wed Oct 24, 2007 12:48 pm
Location: Alhaurin de la Torre (MALAGA)

Re: Ayuda con creación de GETs

Post 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.
User avatar
sjingo
Posts: 229
Joined: Sat Mar 18, 2006 3:42 pm
Location: Ibarra-Ecuador

Post 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


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
gmart1
Posts: 65
Joined: Wed Oct 24, 2007 12:48 pm
Location: Alhaurin de la Torre (MALAGA)

Post 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

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.
Post Reply