Page 1 of 2

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

PostPosted: Sun May 03, 2009 11:51 am
by jefe
Buenos días a todos.

Bueno pues sigo investigando con esta librería de FWH.

Me encuentro con un problema y no se como resolverlo, vereis quiero crear un array con 10 checkbox y no se como se hace.

Code: Select all  Expand view


#include "fivewin.ch"

function main()
  local oDlg
  local cId := space( 10 )
  local cPass := space( 10 )
  local oBtn
  local fila:=5
  local oCheck,valor,a
 
  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() ) )
  @ 40,01 button oBtn prompt "OK" of oDlg pixel ACTION MsgInfo( "click" )
 
  oBtn:Disable()
 
  for a=1 to 10
     
     @ fila+a, 2 checkbox oCheck var valor prompt "este es el elemento "+alltrim(str(a))

  next      
 
     
 
  for a=1 to 1
      valor:=.t.
      oCheck:refresh()
  next    
 
  activate dialog oDlg
 
return nil

 




Me podeis ayudar, no se como seguir


Gracias de antemano.

Re: ¿ Como se crea un array de checbox ?

PostPosted: Sun May 03, 2009 12:11 pm
by jefe
He probado este cambio, pero no me funciona.

como se observa en el último FOR NEXT intento activar los cuatro primeros pero nada de nada.

Code: Select all  Expand view


#include "fivewin.ch"

function main()
  local oDlg
  local cId := space( 10 )
  local cPass := space( 10 )
  local oBtn
  local fila:=5
  local oCheck[11],valor[11],a
 
  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() ) )
  @ 40,01 button oBtn prompt "OK" of oDlg pixel ACTION MsgInfo( "click" )
 
  oBtn:Disable()
 
  for a=1 to 10
     
     @ fila+a, 2 checkbox oCheck[a] var valor[a] prompt "este es el elemento "+alltrim(str(a))

  next      
 
     
 
  for a=1 to 4
      valor[a]:=.t.
      oCheck[a]:refresh()
  next    
 
  activate dialog oDlg
 
return nil

Re: ¿ Como se crea un array de checbox ?

PostPosted: Sun May 03, 2009 3:23 pm
by jrestojeda
Prueba lo siguiente...
Ya que no son tantos los Check definir los 10 es una posibilidad.

Code: Select all  Expand view

#include "fivewin.ch"

Function main()
Local oDlg
Local cId  :=Space(10)
Local cPass:=Space(10)
Local fila :=5
Local oBtn
Local oCheck[10],valor[10],A
 
FOR A=1 TO 4
   Valor[A]:=.t.
NEXT

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() ) )
   @ 40,01 button oBtn prompt "OK" of oDlg pixel ACTION MsgInfo( "click" )
 
   oBtn:Disable()
 
   @ fila+1 , 2 checkbox oCheck[ 1] var valor[ 1] prompt "este es el elemento "+alltrim(str(1))  
   @ fila+2 , 2 checkbox oCheck[ 2] var valor[ 2] prompt "este es el elemento "+alltrim(str(2))
   @ fila+3 , 2 checkbox oCheck[ 3] var valor[ 3] prompt "este es el elemento "+alltrim(str(3))
   @ fila+4 , 2 checkbox oCheck[ 4] var valor[ 4] prompt "este es el elemento "+alltrim(str(4))
   @ fila+5 , 2 checkbox oCheck[ 5] var valor[ 5] prompt "este es el elemento "+alltrim(str(5))
   @ fila+6 , 2 checkbox oCheck[ 6] var valor[ 6] prompt "este es el elemento "+alltrim(str(6))
   @ fila+7 , 2 checkbox oCheck[ 7] var valor[ 7] prompt "este es el elemento "+alltrim(str(7))
   @ fila+8 , 2 checkbox oCheck[ 8] var valor[ 8] prompt "este es el elemento "+alltrim(str(8))
   @ fila+9 , 2 checkbox oCheck[ 9] var valor[ 9] prompt "este es el elemento "+alltrim(str(9))
   @ fila+10, 2 checkbox oCheck[10] var valor[10] prompt "este es el elemento "+alltrim(str(10))

Activate Dialog oDlg
 


Nota: No estaría bien que definas el Array de 11 posiciones, si lo que quieres es que tenga 10 posiciones debes crearlo de 10 no de 11.

Espero te sirva.
Saludos,

Re: ¿ Como se crea un array de checbox ?

PostPosted: Sun May 03, 2009 3:58 pm
by jefe
ante todo muchas gracias por contestar, pero no lo entiendo.

Esta vez son sólo 10 elementos pero si son 100 ¿hay que escribir uno a uno ?

he cambiado el código sólo el final que es lo mismo que has echo tu, pero luego no muestra los cuatro elementos marcados.

Code: Select all  Expand view


#include "fivewin.ch"

function main()
  local oDlg
  local cId := space( 10 )
  local cPass := space( 10 )
  local oBtn
  local fila:=5
  local oCheck[10],valor[10],a
 
  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() ) )
  @ 40,01 button oBtn prompt "OK" of oDlg pixel ACTION MsgInfo( "click" )
 
  oBtn:Disable()
 
  for a=1 to 10
     valor[a]=.f.
     @ fila+a, 2 checkbox oCheck[a] var valor[a] prompt "este es el elemento "+alltrim(str(a))
  next      
 
     
 
  for a=1 to 4
      valor[a]:=.t.
  next    
 
  activate dialog oDlg
 
return nil

Re: ¿ Como se crea un array de checbox ?

PostPosted: Sun May 03, 2009 4:33 pm
by jrestojeda
Amigo,
El FOR que pone los primeros 4 elementos en .t. va antes del DEFINE DIALOG.
Prueba ponerlo antes...
Saludos,

Re: ¿ Como se crea un array de checbox ?

PostPosted: Sun May 03, 2009 4:40 pm
by Armando
Jefe (Sí que es raro tu nombre)

Creo que la activación de los cuatro check que quieres poner a .T. debes ponerlo en el ON INIT del dialogo

Code: Select all  Expand view

ACTIVATE DIALOG oDlg ON INIT (Valor[1] := .T. ,Valor[2] := .T. ,Valor[3] := .T. , Valor[4] := .T.)
 


Ojalá te ayude

Re: ¿ Como se crea un array de checbox ?

PostPosted: Sun May 03, 2009 4:43 pm
by jefe
jrestojeda wrote:Amigo,
El FOR que pone los primeros 4 elementos en .t. va antes del DEFINE DIALOG.
Prueba ponerlo antes...
Saludos,



si, pero si lo que quiero es mostrar primero los checkbox y luego que al pulsar un botón muestre los cuatro primeros como marcados .t.


un saludo y gracias, perdona por la chapa que te estoy dando.

Re: ¿ Como se crea un array de checbox ?

PostPosted: Sun May 03, 2009 5:09 pm
by jrestojeda
Ok!
Entonces debes ponerle un ACTION a ese boton con una función que los marque!

Code: Select all  Expand view

   @ 40,01 button oBtn prompt "OK" of oDlg pixel ACTION CambiaCheck(oCheck,@Valor)
 


Code: Select all  Expand view

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


Espero te sirva.
Saludos,

Re: ¿ Como se crea un array de checbox ?

PostPosted: Sun May 03, 2009 6:43 pm
by jefe
Muchas gracias a todos.

Por fin funciona.

Un saludo a todos, no se lo que haria sin vosotros.

Re: ¿ Como se crea un array de checbox ?

PostPosted: Sun May 03, 2009 6:45 pm
by jefe
Armando wrote:Jefe (Sí que es raro tu nombre)




Bueno jefe es José Félix Estébanez de forma abreviada.


un saludo.

Re: ¿ Como se crea un array de checbox ?

PostPosted: Sun May 03, 2009 6:56 pm
by jrestojeda
Me alegro que haya funcionado.
Cuál fue la solución??
Saludos,

Re: ¿ Como se crea un array de checbox ?

PostPosted: Sun May 03, 2009 7:09 pm
by jefe
Pues no lo entiendo, porque antes funcionaba y ahora sin hacer nada lo he vuelto a compilar y ya no funciona, por ejemplo le das al botón y no pasa nada, marcas unos cuantos check, dos por ejemplo le das al botón y te marca los cuatro primeros.

Estoy desesperado, no acabo de comprender el funcionamiento de todo esto, pues aunque se lo que hace el código nunca lo hace como debe

me tiene desconcertado.

este es el codigo

Code: Select all  Expand view



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

 
 
  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() ) )
 // @ 40,01 button oBtn prompt "OK" of oDlg pixel ACTION MsgInfo( "click" )
   
     @ 40,01 button oBtn prompt "OK" of oDlg pixel ACTION CambiaCheck(oCheck,@Valor)

 // oBtn:Disable()
 
  for a=1 to 10
     valor[a]=.f.
     @ fila+a, 2 checkbox oCheck[a] var valor[a] prompt "este es el elemento "+alltrim(str(a))

  next      
 
     
 
  for a=1 to 9                  // si quito este bucle da error al ejecutar
      valor[a]:=.t.              
      oCheck[a]:refresh()          
  next                            
 
  activate dialog oDlg
 
return nil


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

Re: ¿ Como se crea un array de checbox ?

PostPosted: Sun May 03, 2009 9:42 pm
by jrestojeda
Hola amigo...
Yo te reomendaría que antes del DEFINE DIALOG ejecutes un FOR que ponga todas las variables de los Check en .f., de esa forma ya podrías sacar el FOR que tienes más abajo, te está dando error porque al momento de activar el Dialogo, los Check tienen nil, deben tener .t. o .f., luego con el botón llamas la función que active los primeros 4.
Asi deberia funcionar correctamente. No debes olvidarte del "@" en la llamada de la función de activación de los CHECK ya que como son variables locales para que tomen el valor al volver de la ejecución de la función que los activa deben tener el "@", caso contrario para no poner el "@" en la llamada las variables deben ser STATIC.

Prueba asi a ver si funciona corretamente.
Espero te sirva.
Saludos,

Re: ¿ Como se crea un array de checbox ?

PostPosted: Sun May 03, 2009 10:41 pm
by jefe
He realizado los cambios que me has mencionado, pero es que ni se ejecuta da este error.:

Application
===========
Path and name: C:\PRUEBAS\ventana.exe (32 bits)
Size: 1,336,832 bytes
Time from start: 0 hours 0 mins 0 secs
Error occurred at: 05/04/09, 00:39:02
Error description: Error BASE/1066 Argument error: conditional
Args:
[ 1] = U

Stack Calls
===========
Called from: CHECKBOX.PRG => (b)TCHECKBOX:TCHECKBOX(0)
Called from: => TCHECKBOX:INITIATE(0)
Called from: => __OBJSENDMSG(0)
Called from: HARBOUR.PRG => OSEND(0)
Called from: HARBOUR.PRG => ASEND(0)
Called from: DIALOG.PRG => TDIALOG:INITIATE(0)
Called from: DIALOG.PRG => TDIALOG:HANDLEEVENT(0)
Called from: => DIALOGBOXINDIRECT(0)
Called from: DIALOG.PRG => TDIALOG:ACTIVATE(0)
Called from: ventana.prg => MAIN(34)




El código

Code: Select all  Expand view


#include "fivewin.ch"

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

   for a=1 to 10                  
     valor[a]:=.F.            
   next  
 
  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() ) )
 // @ 40,01 button oBtn prompt "OK" of oDlg pixel ACTION MsgInfo( "click" )
   
     @ 40,01 button oBtn prompt "OK" of oDlg pixel ACTION CambiaCheck(oCheck,@Valor)

 // oBtn:Disable()
 
  for a=1 to 10
     
     @ fila+a, 2 checkbox oCheck[a] var valor[a] prompt "este es el elemento "+alltrim(str(a)) of oDlg

  next      
 
 activate dialog oDlg
 
return nil



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




Ya siento la paliza que te estoy dando

un saludo.

Re: ¿ Como se crea un array de checbox ?

PostPosted: Sun May 03, 2009 11:31 pm
by jrestojeda
Amigo,
No entiendo porque defines los Arrays de 11 posiciones en vez de 10.
Prueba eso...
Saludos,