Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-12-2007
[FGarcia] FGarcia is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Cordoba, Veracruz, México
Posts: 1.123
Poder: 20
FGarcia Va por buen camino
Un Evento comun, distintas variables

Hola!!
Pues tengo este procedimiento para un checkbox, ¿como evitar repetirlo para varios mas? -en este caso solo 12- considerando que el estado de cada uno de ellos se guarda en una variable. Se que debo usar Sender para verificar que componente llamo al procedimiento pero no encuentro como diferenciar la variable donde guardar el estado.


Código Delphi [-]
procedure TfrmGDatos.CheckBox1Click(Sender: TObject);
begin
  If CheckBox1.Checked = True then
     gr1_Var1 := True
  else gr1_Var1 := False;
end;

Gracias por su aporte!!
Responder Con Cita
  #2  
Antiguo 04-12-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.110
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Supongo que digo una tontería, pero, ¿no te vale ya con saber el estado de cada CheckBox? Es decir, ¿para qué una variable (si es como yo lo entiendo) que guarde el estado de cada CheckBox cuando estos ya cuentan con la propiedad "Checked"?

Fíjate que el código de arriba puede resumirse en una única instrucción:

Código Delphi [-]
gr1_Var1 := CheckBox1.Checked;
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 04-12-2007 a las 17:59:10.
Responder Con Cita
  #3  
Antiguo 04-12-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Si son 12 Checkboxes, necesitarás 12 variables; que mejor que usar un array y la propiedad Tag de cada Checkbox.

A cada Checkbox en su propiedad Tag le pones un número correlativo, desde 1 hasta 12:
Código Delphi [-]
var estados : array [1..12] of Boolean;

procedure TfrmGDatos.CheckBox1Click(Sender: TObject);
begin
{ Todos los checkboxes comparten este evento.

   Usamos el moldeo de tipo "TCheckbox(Sender)" para decirle al 
   compilador que siempre será un TCheckbox el que genere
   este evento
}

estados[TCheckbox(sender).Tag] := TCheckbox(Sender).checked;

end;

El moldeo es necesario, porque en delphi tenemos un evento TNotifyEvent que es estándar para muchos controles, por ejemplo el evento OnClick, que podríamos asignar el mismo procedimiento para un TCheckbox, Tbutton, TEdit, etc.

Nosotros somos los que asignamos el evento en el inspector de objetos, por tanto, somos los responsables de decirle a Delphi con el moldeo de tipos qué control generó el evento en cuestión.


El caso más general:
Código Delphi [-]

procedure TfrmGDatos.CheckBox1Click(Sender: TObject);
begin
  if (Sender is TCheckBox) then
  begin
     // tratar como un checkbox:  
    with TCheckBox(Sender) do
 
  end
  else if (Sender is TButton) then
  With TButton(Sender) do 


end;

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 04-12-2007 a las 12:39:43.
Responder Con Cita
  #4  
Antiguo 04-12-2007
[FGarcia] FGarcia is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Cordoba, Veracruz, México
Posts: 1.123
Poder: 20
FGarcia Va por buen camino
Hola!
Gracias por las respuestas muchachos!
De hecho he tenido que modificar la aplicacion y en un momento determinado ya no sabia ni que estaba haciendo -aun no lo se- pero ya despues de consultar la almohada traigo ideas mas frescas.

Nuevamente gracias por su dispocision a ayudar siempre!
Responder Con Cita
  #5  
Antiguo 04-12-2007
[FGarcia] FGarcia is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Cordoba, Veracruz, México
Posts: 1.123
Poder: 20
FGarcia Va por buen camino
Bueno de nuevo por aqui.

Esto es lo que he hecho a manera didactica - hasta parece que se de que hablo-

Código Delphi [-]
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;
type
  TForm1 = class(TForm)
    GroupBox1: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    Panel1: TPanel;
    Panel2: TPanel;
    CheckBox1: TCheckBox;
    CheckBox2: TCheckBox;
    CheckBox3: TCheckBox;
    CheckBox4: TCheckBox;
    CheckBox5: TCheckBox;
    CheckBox6: TCheckBox;
    CheckBox7: TCheckBox;
    CheckBox8: TCheckBox;
    Memo1: TMemo;
    Button1: TButton;
    RadioGroup1: TRadioGroup;
    procedure Button1Click(Sender: TObject);
    procedure CheckBox1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    Checados: array [1..8] of boolean;
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
 i,j: integer;
 Check: TcheckBox;
begin
  {http://www.clubdelphi.com/foros/show...light=checkbox
   Verificamos cuales CheckBox estan "checados"
  }
  { TO DO
   Falta recorrer cada panel y si dos o mas checkbox estan seleccionados en
     cada panel Habilitar el correspondiente elemento del RadioGroup.}
  for i := 0 to ComponentCount - 1 do
    if Components[i] is TCheckBox then
      begin
        Check := TCheckBox(Components[i]);
        if Check.Checked then
          Memo1.Lines.Add(Check.Name + ' = True');
      end;
end;

procedure TForm1.CheckBox1Click(Sender: TObject);
begin
  { http://www.clubdelphi.com/foros/show...d=1#post250309
   Todos los checkboxes comparten este evento.
   Usamos el moldeo de tipo "TCheckbox(Sender)" para decirle al 
    compilador que siempre será un TCheckbox el que genere
    este evento
   Usar el Inspector de Objetos para asignar valor a Tag
  }
  checados[TCheckbox(sender).Tag] := TCheckbox(Sender).checked;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  { http://www.clubdelphi.com/foros/show...7847&highlight=
          deshabilitar+radiogroup
   Al activarse el formulario estos elementos del RadioGroup
    estan Inhabilitados (Disabled)
  }
  RadioGroup1.Controls[4].Enabled := False;
  RadioGroup1.Controls[5].Enabled := False;
end;
end.

Aun quedan cosas por hacer que ando investigando. Se aceptan todas las ayudas. Añado un zip con el codigo fuente y sin ejecutable de este proyecto.

Última edición por FGarcia fecha: 05-12-2007 a las 02:49:49.
Responder Con Cita
  #6  
Antiguo 05-12-2007
[FGarcia] FGarcia is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Cordoba, Veracruz, México
Posts: 1.123
Poder: 20
FGarcia Va por buen camino
De vuelta aqui!

he modificado el procedimiento que muestro aqui del original de mi mensaje anterioR y me genera un error de Addres violation no entiendo por que pero si se en donde lo hace.

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
 i,j: integer;
 Check: TcheckBox;
begin
  {http://www.clubdelphi.com/foros/show...light=checkbox
   Verificamos cuales CheckBox estan "checados" FUNCIONA OK}
  { TO DO
    Falta recorrer cada panel y si dos o mas checkbox estan seleccionados en
     cada panel Habilitar el correspondiente elemento del RadioGroup.}
  {
  /*for i := 0 to ComponentCount - 1 do
    if Components[i] is TCheckBox then
      begin
        Check := TCheckBox(Components[i]);
        if Check.Checked then
          Memo1.Lines.Add(Check.Name + ' = True');
      end;
  */}

  //**************************************************************
  
  {/* Adaptacion de este hilo
      http://www.clubdelphi.com/foros/show...light=checkbox
  */}
  for i:= 0 to GroupBox1.ControlCount - 1 do
    if GroupBox1.Controls[i] is TPanel then
      with TPanel (GroupBox1.Controls[i]) do
        for j:= 0 to ControlCount - 1 do
          if Controls[j] is TCheckbox then
            if (Controls[j] as TCheckBox).Checked then
              {CON ESTAS LINEAS ME GENERA EL ADRESS VIOLATION
                Memo1.Lines.Add(Check.Name + ' = True');
               else
                Memo1.Lines.Add(Check.Name + ' = False');
               }
            ShowMessage('Marcado')
            else
            ShowMessage('No marcado');
end;

Nuevamente soy todo oidos!!
Responder Con Cita
Respuesta



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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
codigo comun entre distintos formularios federiconqn21 Varios 5 27-11-2007 16:22:11
exportacion de variables entre formas distintas zidfrid C++ Builder 0 02-10-2007 03:33:47
Algo un poco fuera de lo comun JerS Impresión 2 25-10-2005 18:05:28
Duda acerca del DBLookupComboBox y del Combo comun arieliten Varios 1 16-03-2005 21:52:18
¿Que tienen en comun las mujeres y los servidores web? obiwuan Humor 0 04-05-2003 12:56:38


La franja horaria es GMT +2. Ahora son las 05:03:50.


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