Page 1 of 2
¿ Como se crea un array de checbox ? (solucionado)
Posted: 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
#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 ?
Posted: 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
#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 ?
Posted: 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
#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 ?
Posted: 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
#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 ?
Posted: 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 ?
Posted: 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
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 ?
Posted: 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 ?
Posted: 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
@ 40,01 button oBtn prompt "OK" of oDlg pixel ACTION CambiaCheck(oCheck,@Valor)
Code: Select all
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 ?
Posted: 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 ?
Posted: 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 ?
Posted: 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 ?
Posted: 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
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 ?
Posted: 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 ?
Posted: Sun May 03, 2009 10:41 pm
by jefe
He realizado _ 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
#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 ?
Posted: 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,