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

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

Postby sjingo » Fri Aug 29, 2008 3:49 am

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  RUN

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

Re: Ayuda con creación de GETs

Postby wmormar » Fri Aug 29, 2008 3:53 am

Marcelo,

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

méxico.sureste
User avatar
wmormar
 
Posts: 1074
Joined: Fri Oct 07, 2005 10:41 pm
Location: México

Re: Ayuda con creación de GETs

Postby gmart1 » Fri Aug 29, 2008 7:14 am

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

Postby sjingo » Fri Aug 29, 2008 3:35 pm

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  RUN

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

Postby gmart1 » Sat Aug 30, 2008 10:40 am

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


Return to FiveWin para Harbour/xHarbour

Who is online

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