Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Cómo hacer para que muchos checkbox usen la misma función? (https://www.clubdelphi.com/foros/showthread.php?t=47636)

Shikanda 03-09-2007 17:54:53

Cómo hacer para que muchos checkbox usen la misma función?
 
Hola! No sabía bien si este hilo tenía que ponerlo en POO o en Delphi, así que he decidido ponerlo aquí y si hay que moverlo a otro sitio, pues lo busco :p

Os cuento, tengo un form con muchisimos checkbox. Por decirlo de alguna forma, hay una columna de checkbox principales y, para cada uno de éstos, tenemos 3 checkbox (secundarios, por decirlo de algún modo). Lo que quiero es que estos checkbox secundarios estén enabled false mientras que los principales no están marcados. Una vez que están checked:=true entonces pasan sus correspondientes checkbox secundarios a estar habilitados.

Pensaba hacerlo todo desde una función sencilla, que recoja el objeto que la llama y a partir de ahi, que habilite o deshabilite según sea el caso. El problema es que no sé muy bien cómo hacerlo sin nombre explícitamente a todos los objetos. Si un checkbox principal se llama CBHola, sus checkbox secundarios se llaman CB1Hola, CB2Hola y CB3Hola. El problema es que no puedo poner algo en plan Sender.Name para trabajar con la cadena.

No se si me he explicado bien. Me habeis entendido? Podríais echarme una mano??? Muchas gracias a todos!

Chris 03-09-2007 18:04:22

Lo que hago yo es relacionarlos por la propiedad Tag, por ejemplo los checkboxes de la primera columna llevaría un tag de 0 a 19, los de la segunda de 20 a 39. luego en el eventon OnClick lo utilizo un código como este:

Código Delphi [-]
Procedure Form1.CheckOnClick(Sender:TOnject);
var
I : Integer;
Begin

For i := 0 to Self.ComponentCount - 1) Do
Begin
If (Self.Components[i].ClassType = TCheckBox) and ((TCheckBox(Self.Components[i]).Tag - 20) = TCheckBox(Sender).Tag) Then
TCheckBox(Self.Components[i].Enabled := TCheckBox(Sender).Checked;
end;

end;

Espero te sirva el ejemplo. Saludos

Shikanda 03-09-2007 18:48:43

Muchas gracias!!
 
Muchísimas gracias, D&W, tu función era perfecta y he podido resumir en 2 lineas lo que quería hacer en.... demasiadas más. Me daba un pequeño problema porque no eran checkbox propiamente, sino que al trabajar con bases de datos recibian otro nombre... detalles, en definitiva.

Muchas gracias!:D

Shikanda 12-09-2007 13:54:35

Siguiendo con checkbox...
 
A propósito, y siguiendo con los checkbox. Resulta que de este mismo pelotón de checkbox quiero recoger el valor de si están marcados o no y parece que sólo guarda el valor de los checkbox que he "clickado". Vamos, que si están marcados me guarda el 1 y si los marco y desmarco, también me guarda el 0, pero si no los toco, los deja a valor nulo. ¿Cómo recojo ese cero?

eduarcol 12-09-2007 14:49:59

porq no muestras como lo haces ahorita y luego podemos sugerirte los cambios

gluglu 12-09-2007 15:09:08

Los CheckBox's son normales o asociados a BD, es decir DBCheckBox ?

Si son DBCheckBox y el valor del campo asociado es Null, porque al crear registro no hayas inicializado ese valor, entonces el DBCheckBox no muestra nada, y hasta que no haces Click una vez sobre el, no te cambia el valor de la Base de Datos.

La solución es que al crear el registro, inicialices con un valor determinado el campo asociado al DBCheckBox (bien sea booleano u otro valor tal como 0 y 1).

Espero haberte podido aclarar algo. ;)

Chris 12-09-2007 16:34:24

Asigna un valor a todos los campos
 
Lo que hago yo en estos casos es luego de ingresar un registro poner todos los campos booleanos a false.
Código Delphi [-]
miTabla.Insert;
For I := 0 to (miTabla.Fields.Count - 1) do
Begin
if (miTabla.Fields[i].DataType = ftBoolean) Then  //* más abajo te doy un comentario hacerca de esta línea.
miTabla.Fields[i].AsBoolean := False;
end;
....

//* En este caso el procedimiento se ejecturará solo si el campo es booleano, dependiendo de tu caso cambia el valor de ftBoolean. Revisa el tipo TFieldType para ver los valores posibles.

En el mejor de los caso, sería mejor que utilizaras valores por defecto, si es que tu motor de datos los soporta.

Saludos.

Shikanda 12-09-2007 17:27:48

Gracias, chicos. Efectivamente eran DBCheckBox asociados a una tabla que no inicializaba los campos a ningún valor, por eso cogía null. Ya les puse un valor por defecto al inicializar y ahora va perfecto.


La franja horaria es GMT +2. Ahora son las 18:24:16.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi