¿ Como se crea un array de checbox ? (solucionado)

Re: ¿ Como se crea un array de checbox ?

Postby jefe » Sun May 03, 2009 11:39 pm

jrestojeda wrote:Amigo,
No entiendo porque defines los Arrays de 11 posiciones en vez de 10.
Prueba eso...
Saludos,



lo he puesto por probar si estaba el error hay, pero te puedo asegurar que ni con 10 ni nada.

yo no lo entiendo.
jefe
 
Posts: 23
Joined: Thu Apr 09, 2009 10:30 pm
Location: Valladolid, españa

Re: ¿ Como se crea un array de checbox ?

Postby jrestojeda » Mon May 04, 2009 2:52 am

Es raro che lo que dices...
Yo hago bastante seguido ese tipo de Arrays de controles, nunca tuve problema!!
Saludos,
Ojeda Esteban Eduardo.
Buenos Aires - Argentina.
FWH - PellesC - DBF/CDX - ADS - Gloriosos .Bat - MySql - C# .net - FastReport
Skype: jreduojeda
User avatar
jrestojeda
 
Posts: 598
Joined: Wed Jul 04, 2007 3:51 pm
Location: Buenos Aires - Argentina

Re: ¿ Como se crea un array de checbox ?

Postby Daniel Garcia-Gil » Mon May 04, 2009 4:38 am

Jefe...

El problema lo tienes pq cuando creas los checkbox de esa forma al momento de terminar el ciclo FOR la variable "a" tendra un valor de 11, por eso imagino que debes crear los arrays con esa dimencion para que no te genere un error de acceso al array, por eso siempre tomara el ultimo valor del array el valor a usar en este caso seria siempre el que esta en la posicion 11....

Cuando creamos checkbox, get, etc, siempre se genera un codeblock bSETGET = { | u | If( PCount()==0, x, x:= u ) }, esto hara que se asigne un nuevo valor al control o mantener el actual.
Para correjir tu problema necesitas asignar la variable generando tu mismo el codeblock por medio de una funcion, pasandole como parametros el array y la posicion del mismo, por tal razon no podras usar el comando @ X,Y ya que este te general el bSETGET automaticamente

Function MakeChkBox( valor, a )
Return { | u | If( PCount()==0, valor[ a ], valor[ a ]:= u ) }

te dejo el ejemplo completo, pruebalo y nos comentas

Code: Select all  Expand view
#include "fivewin.ch"

function main()
  local oDlg
  local cId := space( 10 )
  local cPass := space( 10 )
  local oBtn
  local fila:=4
  local oCheck[10],valor[10]
  local a
 

  afill( valor, .f. )
 
  define dialog oDlg pixel size 400,400
 
  @ 01,01 Get oGetn var cId pixel of oDlg
  @ 20,01 Get oGetP var cPass Password pixel of oDlg ;
  on change( if( empty( oGetP:oGet:Buffer ), oBtn:Disable(), oBtn:Enable() ) )
 // oBtn:Disable()
 
  for a=1 to 10
     oCheck[ a ] := TCheckBox():New(fila + a, 2, "este es el elemento "+alltrim(str(a)),;
                                    MakeChkBox( valor, a ), oDlg )
  next      
 
 activate dialog oDlg
 
return nil


Function MakeChkBox( valor, a )
Return { | u | If( PCount()==0, valor[ a ], valor[ a ]:= u ) }
User avatar
Daniel Garcia-Gil
 
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita

Re: ¿ Como se crea un array de checbox ?

Postby jefe » Mon May 04, 2009 12:11 pm

gracias, acabo de llegar voy a comer vuelvo a trabajar y cuando venga a la noche lo miro


muchas gracias
jefe
 
Posts: 23
Joined: Thu Apr 09, 2009 10:30 pm
Location: Valladolid, españa

Re: ¿ Como se crea un array de checbox ?

Postby jefe » Mon May 04, 2009 6:47 pm

[quote="Daniel Garcia-Gil"]Jefe...

El problema lo tienes pq cuando creas los checkbox de esa forma al momento de terminar el ciclo FOR la variable "a" tendra un valor de 11, por eso imagino que debes crear los arrays con esa dimencion para que no te genere un error de acceso al array, por eso siempre tomara el ultimo valor del array el valor a usar en este caso seria siempre el que esta en la posicion 11....

Cuando creamos checkbox, get, etc, siempre se genera un codeblock bSETGET = { | u | If( PCount()==0, x, x:= u ) }, esto hara que se asigne un nuevo valor al control o mantener el actual.
Para correjir tu problema necesitas asignar la variable generando tu mismo el codeblock por medio de una funcion, pasandole como parametros el array y la posicion del mismo, por tal razon no podras usar el comando @ X,Y ya que este te general el bSETGET automaticamente

Function MakeChkBox( valor, a )
Return { | u | If( PCount()==0, valor[ a ], valor[ a ]:= u ) }

te dejo el ejemplo completo, pruebalo y nos comentas

[quote]

Muchas gracias ahora si que funciona bien. He puesto el botón que faltaba y la función de poner los cuatro checkbox primeros activados.

Lo que no entiendo es la función makechkbox.

Pongo el código nuevo

Code: Select all  Expand view


#include "fivewin.ch"

function main()
  local oDlg
  local cId := space( 10 )
  local cPass := space( 10 )
  local oBtn
  local fila:=4
  local oCheck[10],valor[10]
  local a
 

  afill( valor, .f. )
 
  define dialog oDlg pixel size 400,400
 
  @ 01,01 Get oGetn var cId pixel of oDlg
  @ 20,01 Get oGetP var cPass Password pixel of oDlg ;
  on change( if( empty( oGetP:oGet:Buffer ), oBtn:Disable(), oBtn:Enable() ) )
 // oBtn:Disable()
  @ 40,01 button oBtn prompt "OK" of oDlg pixel ACTION cambiacheck(ocheck,@valor)

 
  for a=1 to 10
     oCheck[ a ] := TCheckBox():New(fila + a, 2, "este es el elemento "+alltrim(str(a)),;
                                    MakeChkBox( valor, a ), oDlg )
  next      
 
 activate dialog oDlg
 
return nil


Function MakeChkBox( valor, a )
Return { | u | If( PCount()==0, valor[ a ], valor[ a ]:= u ) }


Function CambiaCheck(oCheck,Valor)
Local A
FOR A=1 TO 4
   valor[a]:=.t.
   oCheck[a]:Refresh()
NEXT    
 



Muchas gracias a todos.
jefe
 
Posts: 23
Joined: Thu Apr 09, 2009 10:30 pm
Location: Valladolid, españa

Re: ¿ Como se crea un array de checbox ? (solucionado)

Postby Horizon » Tue Dec 28, 2010 8:11 pm

Thanks for info.
Regards,

Hakan ONEMLI

Harbour & MSVC 2022 & FWH 23.04
Horizon
 
Posts: 1297
Joined: Fri May 23, 2008 1:33 pm

Previous

Return to FiveWin para Harbour/xHarbour

Who is online

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