Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   checkBox ayuda (https://www.clubdelphi.com/foros/showthread.php?t=57331)

Mayacker 11-06-2008 21:20:56

checkBox ayuda
 
Hola amigos estoy haciendo un formulario donde estoy utilizando 6 checkbox y tengo uno donde tiene la opcio de Todo y quiero si seleccionan Todo que se seleccionen los demas checkbox como puedo hacer:confused: esto gracias de antemano :eek::)

jhonny 11-06-2008 21:40:56

Prueba lo siguiente y nos cuentas como te va ;):

Código:


Integer i;
 for (i = 0; i < this->ComponentCount; i++) {
  dynamic_cast<TCheckBox*>(Components[i])->Checked = True;
 }


Mayacker 11-06-2008 21:51:28

Cita:

Empezado por jhonny (Mensaje 292925)
Prueba lo siguiente y nos cuentas como te va ;):

Código:


Integer i;
 for (i = 0; i < this->ComponentCount; i++) {
  dynamic_cast<TCheckBox*>(Components[i])->Checked = True;
 }


Genial me funciono, gracias por tu pronta ayuda :cool:

jhonny 11-06-2008 22:30:09

Cita:

Empezado por Mayacker (Mensaje 292930)
Genial me funciono, gracias por tu pronta ayuda :cool:

Que bien :), me alegra... aunque mirandolo mejor, si en el futuro necesitas que al presionar dicho CheckBox también se inhabiliten los demás, podrías usarlo así:

Código:

Integer i;
 for (i = 0; i < this->ComponentCount; i++) {
  dynamic_cast<TCheckBox*>(Components[i])->Checked = CheckBox1.Checked;
 }

Donde CheckBox1 es el TCheckBox que dice "Seleccionar Todos" ;).

escafandra 11-06-2008 23:52:46

Perdonar un inciso. Puede ocurrir un error si un componente Components[i] no es del tipo TCheckBox siendo, entonces, dynamic_cast<TCheckBox*>(Components[i]) un puntero nulo. Si ocurre el resto del código no puede funcionar. Esto puede suceder si en el formulario hay mas controles en la lista de componentes que no sean TCheckBox.

Yo para evitar el error, y hacer el código mas seguro, compruebo la no nulidad del puntero:

Código:

  for (int i = 0; i < this->ComponentCount; i++) {
  TCheckBox* Check = dynamic_cast<TCheckBox*>(Components[i]);
  if(Check) Check->Checked = CheckBox1.Checked;
 }

Saludos;)

jhonny 12-06-2008 15:25:56

Cita:

Empezado por escafandra (Mensaje 292970)
Perdonar un inciso. Puede ocurrir un error si un componente Components[i] no es del tipo TCheckBox siendo, entonces, dynamic_cast<TCheckBox*>(Components[i]) un puntero nulo. Si ocurre el resto del código no puede funcionar. Esto puede suceder si en el formulario hay mas controles en la lista de componentes que no sean TListBox

Yo para evitar el error, y hacer el código mas seguro, compruebo la no nulidad del puntero:

Código:

  for (int i = 0; i < this->ComponentCount; i++) {
  TCheckBox* Check = dynamic_cast<TCheckBox*>(Components[i]);
  if(Check) Check->Checked = CheckBox1.Checked;
 }

Saludos;)


Cierto, de hecho muy interesante, yo no tenia idea que se podían declarar punteros de esa forma en C++ Builder... por otro lado... quizá también sea interesante la siguiente solución que simplemente reemplaza dynamic_cast por el reinterpret_cast, haciendo uso de los distinto tipos de cast que tiene C++ Builder:

Código:


 Integer i;
 for (i = 0; i < this->ComponentCount; i++) {
  reinterpret_cast<TCheckBox*>(Components[i])->Checked = CheckBox6->Checked;


escafandra 12-06-2008 18:47:43

Pues este tipo de conversión resulta peligroso. Se trata de una variante de conversión o cast por fuerza bruta, sin tener en cuanta si lo que convertimos es o no factible. Sería algo parecido a la conversión: *(Tipo*)(&Otrotipo)

Es decir puedo convertir un TEdit a un TComBobox por las buenas pero sólo sintácticamente, para que el compilador no proteste. La realidad es que obtendré un error en tiempo de ejecución en cuanto llame a una propiedad o función que no corresponda.

dynamic_cast y static_cast hacen la conversión de punteros, pero si realmente el tipo es erróneo (convertir TComboBox a TEdit, por ejemplo) entonces devuelven un puntero nulo.

Para usar reinterpret_cast o la clasica *(Tipo*)(&Otrotipo) debemos estar muy seguros de lo que hacemos, de lo contrario tendremos un grave error de punteros.

En este caso, creo que lo más adecuado es:
Código:

for (int i = 0; i < this->ComponentCount; i++) {
  TCheckBox* Check = dynamic_cast<TCheckBox*>(Components[i]);
  if(Check) Check->Checked = CheckBox1.Checked;
}

o, también:
Código:

for (int i = 0; i < this->ComponentCount; i++) {
  TCheckBox* Check = static_cast<TCheckBox*>(Components[i]);
  if(Check) Check->Checked = CheckBox1.Checked;
}

Mirad estas referencias: reinterpret_cast, dynamic_cast, static_cast.

Saludos.

jhonny 12-06-2008 18:58:48

mmm, entendido, muchas gracias por tu explicación escafandra :).


La franja horaria es GMT +2. Ahora son las 11:06:04.

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