Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 30-05-2005
novice novice is offline
Registrado
 
Registrado: may 2005
Ubicación: Cerca de la Frontera
Posts: 4
Poder: 0
novice Va por buen camino
Concatenar CheckBox

Que tal mi pregunta es la siguiente:

Tengo una forma en la cual tengo mas de 100 "CheckBox", con cada uno de ellos realizo practicamente los mismos procedimientos, no quiero que me quede un codigo enorme con practicamente lo mismo por lo tanto decidi meterla condicion " if " del CheckBox a un ciclo "for", pretendo que el ciclo cambie el numero de el "CheckBoxn.Checked" pero tengo problemas para lograrlo.

Ejemplo:
------------------------------------------
//Asi trabaja bien

if CheckBox1.Checked then
begin
//codigo de trabajo
end
------------------------------------------
//Esto es lo que pretendo

for b:= 1 to 100 do
begin
if {Componente CheckBox concatenado con el numero del ciclo for} then
begin
//codigo de trabajo
end
-------------------------------------------

Lo intente de varias formas desde meter "CheckBox" a un string y de ahi concatenarlo, pero pues uno es booleano y el otro string, utilice la funcion "strtobool()" pero no me funciono o no la supe inplementar

Espero puedan ayudarme y de antemano agradesco su ayuda.
Responder Con Cita
  #2  
Antiguo 30-05-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Código Delphi [-]
var ckeck:TcheckBox;
begin

for i:=0 to 100 do
begin
check := Findcomponent('Checkbox'+inttostr(i));
if check <> nil then
begin
  // codigo trabajo
end;
end;

Saludote
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #3  
Antiguo 30-05-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Una observación:

El método FindComponent lo que hace es recorrer toda la lista de componentes del formulario hasta encontrar uno con el nombre indicado. En un ciclo como el descrito se estaría haciendo este recorrido 100 veces, una por cada iteración.

// Saludos
Responder Con Cita
  #4  
Antiguo 31-05-2005
novice novice is offline
Registrado
 
Registrado: may 2005
Ubicación: Cerca de la Frontera
Posts: 4
Poder: 0
novice Va por buen camino
Gracias por tu respuesta Lepe pero me esta marcando incompatibilidad

[Error] Unit1.pas(35): E2010 Incompatible types: 'TCheckBox' and 'TComponent'

en la linea:

check := Findcomponent('Checkbox'+inttostr(i));

//Este es el codigo
procedure TForm1.FormCreate(Sender: TObject);
var check:TcheckBox;
var i:integer;
begin

for i:=0 to 100 do
begin
check := Findcomponent('Checkbox'+inttostr(i));
if check <> nil then
begin
// codigo trabajo
end;
end;

end;

Tendras alguna sugerencia gracias.


Responder Con Cita
  #5  
Antiguo 31-05-2005
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 23
maeyanes Va por buen camino
Trata con esto:

Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
var 
  Check: TcheckBox;
  I: Integer;

begin
  for I := 0 to ComponentCount - 1 do
    if Components[i] is TCheckBox then
    begin
      Check := Components[i] as TCheckBox;
      if Check.Checked then
        // codigo trabajo
    end
end;

Saludos...
Responder Con Cita
  #6  
Antiguo 31-05-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Una pequeña modificación:

En donde dice

Check := Components[i] as TCheckBox;

sería mejor poner

Check := TCheckBox(Components[i]);

El operador as implícitamente hace uso del operador is lo cual es innecesario porque ya se verificó antes.

Y una observación (a ver si repitiendo causa algún efecto): este código de maeyanes es mucho más recomendable que el uso de FindComponent ya que se hace el recorrido de los componentes del formulario una sólo vez y no multiplicado por 100.

// Saludos
Responder Con Cita
  #7  
Antiguo 31-05-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Gracias Roman, no sé en que estaba pensando o:

Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
var c:TComponent;
begin

c := Findcomponent('Checkbox'+inttostr(i));
if c <> nil then
begin
  Tcheckbox(c).Propiedades del checkbox
  // codigo trabajo
end;

Solo un detalle.... Estas en el OnCreate del Form, en este evento puede que los checkboxes no se hayan construido

Un saludo
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #8  
Antiguo 31-05-2005
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 23
maeyanes Va por buen camino
Por cierto, me di cuenta que puse Check := Components[ I ] is TCheckBox en lugar de as... :P

Última edición por maeyanes fecha: 31-05-2005 a las 18:36:22.
Responder Con Cita
  #9  
Antiguo 31-05-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Pues no. Veo que ni reiterando quieren omitir el uso de FindComponent.

Una de las pocas (muy pocas) cosas en las que me gustaba más VB son sus arreglos de componentes con lo cual sería mucho más fácil trabajar en estos casos.

Dicha esta barbaridad, veamos cómo podemos arreglárnoslas con Delphi.

En el formulario declaren el arreglo necesitado:

Código Delphi [-]
type
  TForm1 = class(TForm)
  private
    CheckBoxes: array of TCheckBox;
  end;

En el constructor del formulario usen el código de maeyanes pero para llenar el arreglo:

Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
var
  I: Integer; // para recorrer los componentes del formulario
  J: Integer; // para indexar el arreglo de check boxes

begin
  SetLength(CheckBoxes, 100);
  J := 0;

  for I := 0 to ComponentCount - 1 do
    if Components[i] is TCheckBox then
    begin
      CheckBoxes[J] := TCheckBox(Components[i]);
      Inc(J);
    end;
end;

Entonces, para el resto de la aplicación se dispondrá de un arreglo de check boxes mucho más fácil de manipular las veces que sea necesario:

Código Delphi [-]
var
  I: Integer;

begin
  for I := Low(CheckBoxes) to High(CheckBoxes) do
    // código para CheckBoxes[i]
end;

// Saludos
Responder Con Cita
  #10  
Antiguo 31-05-2005
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Cool

Cita:
Empezado por Lepe
Solo un detalle.... Estas en el OnCreate del Form, en este evento puede que los checkboxes no se hayan construido
Cuando el evento onCreate se dispara, ya todo lo que se dejó en el form en tiempo de diseño existe, incluso los apuntadores entre iguales están correctamente establecidos: los datasources apuntaran a los datasets, los dbedits a los fields, etc, etc. suponiendo que todo está en el mismo formulario.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #11  
Antiguo 31-05-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por jachguate
Cuando el evento onCreate se dispara, ya todo lo que se dejó en el form en tiempo de diseño existe, incluso los apuntadores entre iguales están correctamente establecidos: los datasources apuntaran a los datasets, los dbedits a los fields, etc, etc.
Suponiendo, si no mal recuerdo, que estamos hablando de Delphi > 3 y que la propiedad OldCreateOrder del formulario no ha sido cambiada a true.

// Saludos
Responder Con Cita
  #12  
Antiguo 31-05-2005
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Cool

Cita:
Empezado por roman
Suponiendo, si no mal recuerdo, que estamos hablando de Delphi > 3 y que la propiedad OldCreateOrder del formulario no ha sido cambiada a true.

// Saludos
Buen punto. En d3 e inferiores, OnCreate se llama dentro del constructor de la forma, y en ese momento ninguno de los componentes contenidos en ella existe.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #13  
Antiguo 01-06-2005
novice novice is offline
Registrado
 
Registrado: may 2005
Ubicación: Cerca de la Frontera
Posts: 4
Poder: 0
novice Va por buen camino
Gracias

Muchas gracias a todos funciono muy bien


Responder Con Cita
  #14  
Antiguo 01-06-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por novice
Muchas gracias a todos funciono muy bien
Pues de nada. Pero sería agradable que dijeras finalmente qué opción tomaste. Si usaste FindComponent prometo no "regañarte"

// Saludos
Responder Con Cita
  #15  
Antiguo 01-06-2005
novice novice is offline
Registrado
 
Registrado: may 2005
Ubicación: Cerca de la Frontera
Posts: 4
Poder: 0
novice Va por buen camino
Jajajajaja, use la de maeyanes con tu modificacion en:

Check := TCheckBox(Components[i]);

todo funciono excelente gracias por el apoyo!!

Responder Con Cita
  #16  
Antiguo 22-08-2005
Avatar de Chente(rMan)
Chente(rMan) Chente(rMan) is offline
Miembro
 
Registrado: ago 2005
Posts: 89
Poder: 19
Chente(rMan) Va por buen camino
Question Una mas...

Gracias, ya lo estoy aplicando en uno de mis códigos, este código me pone en false la propiedad checked de mis checkbox, que son como 30.

Código Delphi [-]
var
  Check: TcheckBox;
  I: Integer;
begin
  for I := 0 to ComponentCount - 1 do
    if Components[i] is TCheckBox then
      begin
        Check := TCheckBox(Components[i]);
        Check.Checked := False;
      end

¿Como le hago para decirle que quiero que solamente lo aplique del checkbox16 al checkbox24?, para no tener que utilizar el FindComponent.


Saludos.

Vicente López.
Responder Con Cita
  #17  
Antiguo 23-08-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Podrías asignar a cada CheckBox el número que le corresponda en su propiedad Tag (esto en el inspector de objetos) y cambiar la condición a:

Código Delphi [-]
if (Components[i] is TCheckBox) and (Components[i].Tag in [16..24]) then

// Saludos
Responder Con Cita
  #18  
Antiguo 23-08-2005
Avatar de Chente(rMan)
Chente(rMan) Chente(rMan) is offline
Miembro
 
Registrado: ago 2005
Posts: 89
Poder: 19
Chente(rMan) Va por buen camino
Muchas gracias lo voy a intentar.



Saludos.

Vicente López.
Responder Con Cita
  #19  
Antiguo 27-09-2006
Ade Ade is offline
Miembro
 
Registrado: jul 2006
Ubicación: Murcia
Posts: 70
Poder: 18
Ade Va por buen camino
Hola a todos, tenia el mismo problema, no conseguia limpiar los checkbox que estaban en un GroupBox con un bucle, y al ver este hilo halle la solucion, dejo mi funcion por si alguien la necesitara:
Código Delphi [-]
procedure TProveedores.LimpiarCheckbox(OpcionesGroupBox: TGroupBox);
var
   I:integer;
   ChildControl: TControl;
begin
     for I:=0 to  OpcionesGroupBox.ControlCount-1 do
          begin
          ChildControl := OpcionesGroupBox.Controls[i];
           if ChildControl is TCheckBox then
             //cambio la propiedas checked del tcheckbox
             TCheckBox(ChildControl).checked:=false;
     end;
end;
si alguien ve algun error o mejoria por favor me lo comente
gracias
Responder Con Cita
  #20  
Antiguo 27-09-2006
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Puede abreviarse de este modo, ya que la variable ChildControl está de mas:
Código Delphi [-]
procedure TProveedores.LimpiarCheckbox(OpcionesGroupBox: TGroupBox);
var
  I:integer;
begin
  for I := 0 to OpcionesGroupBox.ControlCount - 1 do
    if OpcionesGroupBox.Controls[i] is TCheckBox then
      TCheckBox(OpcionesGroupBox.Controls[i]).Checked := False;
end;

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 03:53:44.


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
Copyright 1996-2007 Club Delphi