Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Concatenar CheckBox (https://www.clubdelphi.com/foros/showthread.php?t=21833)

novice 30-05-2005 05:38:05

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.

Lepe 30-05-2005 09:38:54

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

roman 30-05-2005 16:17:11

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

novice 31-05-2005 06:10:53

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.



maeyanes 31-05-2005 16:52:55

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...

roman 31-05-2005 17:00:00

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

Lepe 31-05-2005 17:03:52

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 :confused:

Un saludo

maeyanes 31-05-2005 17:04:23

Por cierto, me di cuenta que puse Check := Components[ I ] is TCheckBox en lugar de as... :P

roman 31-05-2005 17:22:03

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

jachguate 31-05-2005 17:34:14

Cita:

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

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.

;)

roman 31-05-2005 17:38:21

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

jachguate 31-05-2005 18:38:07

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.

;)

novice 01-06-2005 06:02:14

Gracias
 
Muchas gracias a todos funciono muy bien


:D :D :D

roman 01-06-2005 06:26:47

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" :D

// Saludos

novice 01-06-2005 06:38:06

Jajajajaja, use la de maeyanes con tu modificacion en:

Check := TCheckBox(Components[i]);

todo funciono excelente gracias por el apoyo!!

:) :)

Chente(rMan) 22-08-2005 22:55:38

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

:confused: ¿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.

roman 22-08-2005 23:06:00

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

Chente(rMan) 23-08-2005 00:16:24

:) Muchas gracias lo voy a intentar.:)



Saludos.

Vicente López.

Ade 27-09-2006 02:12:31

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

jachguate 27-09-2006 02:18:50

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.

;)


La franja horaria es GMT +2. Ahora son las 03:19: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