Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Go Back   Foros Club Delphi > Principal > OOP
Register FAQ Members List Calendar Guía de estilo Today's Posts

Coloboración Paypal con ClubDelphi

Reply
 
Thread Tools Search this Thread Display Modes
  #1  
Old 28/07/2005
marctonyus marctonyus is offline
Registrado
 
Join Date: Jul 2005
Posts: 3
Poder: 0
marctonyus Va por buen camino
Question deshabilitar y habilitar evento onClick de un tcheckbox

HOla a todos, esa es mi pregunta. resulta que cuando pongo en false el checked del checkbox desde el código, se dispara su evento onClick, el cual quiero que se dispare solo cuando el usuario haga click manualmente. Alguna sugerencia?
Por toda ayuda muchas gracias
Reply With Quote
  #2  
Old 28/07/2005
dec's Avatar
dec dec is offline
Moderador
 
Join Date: Dec 2004
Location: Alcobendas, Madrid, España
Posts: 13,142
Poder: 36
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Se me ocurre algo así:

Código Delphi [-]
 procedure TForm1.Button1Click(Sender: TObject);
 var
   copiaEvento: TNotifyEvent;
 begin
   // Guardamos el evento OnClick
   copiaEvento := CheckBox1.OnClick;
   // Quitamos el evento temporalmente
   CheckBox1.OnClick := nil;
 
   // Esto ya no disparará el evento OnClick
   CheckBox1.Checked := not CheckBox1.Checked;
 
   // Dejamos las cosas como estaban
   CheckBox1.OnClick := copiaEvento;
 end;
__________________
David Esperalta
www.decsoftutils.com

Last edited by dec : 28/07/2005 at 17:16. Reason: (actualización del código fuente)
Reply With Quote
  #3  
Old 28/07/2005
yusnerqui's Avatar
yusnerqui yusnerqui is offline
Miembro
 
Join Date: Mar 2004
Location: Cuba
Posts: 679
Poder: 23
yusnerqui Va por buen camino
Hola

Bueno, y si tenemos en cuenta que el evento click del check está dentro de tu código podriamos simplemnte:

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
   // Quitamos el evento temporalmente
   CheckBox1.OnClick :=nil;
 
   // Esto ya no disparará el evento OnClick
   CheckBox1.Checked :=not CheckBox1.Checked;
 
   // Dejamos las cosas como estaban
   CheckBox1.OnClick := CheckBox1Click;
 end;

Saludos
__________________
Lo importante no es llegar primero, sino saber llegar.

Para que puedas llegar mejor lee la Guia de Estilo

Reply With Quote
  #4  
Old 28/07/2005
dec's Avatar
dec dec is offline
Moderador
 
Join Date: Dec 2004
Location: Alcobendas, Madrid, España
Posts: 13,142
Poder: 36
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Gracias yusnerqui.
__________________
David Esperalta
www.decsoftutils.com
Reply With Quote
  #5  
Old 28/07/2005
marctonyus marctonyus is offline
Registrado
 
Join Date: Jul 2005
Posts: 3
Poder: 0
marctonyus Va por buen camino
muchas gracias a dec y yusnerqui
Reply With Quote
  #6  
Old 22/08/2005
Chente(rMan)'s Avatar
Chente(rMan) Chente(rMan) is offline
Miembro
 
Join Date: Aug 2005
Posts: 89
Poder: 22
Chente(rMan) Va por buen camino
Question y como le puedo hacer para esto...

Que tal, como le podría hacer para aplicarlo a n CheckBox, por ejemplo, tengo 30 CheckBox, si los deshabilito de un jalon y les cambio sus propiedades de checked, le ahago asi:

Código Delphi [-]
procedure TfrmForma.LimpiarCheckBox;
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;
Check := TCheckBox(Components[i]);
Check.OnClick := nil;
Check.Checked := False;
Check.Enabled := True;
end
end;

Después de esto hago mas cambios a los CheckBox, ahora bien, ya necesito activarlos de nuevo, como le hago?, le estado haciendo de estas formas:

Código Delphi [-]
procedure TfrmForma.HabilitarCheckBox;
var
Check: TcheckBox;
I: Integer;
Click : String;
Evento : TNotifyEvent;
begin
for I := 0 to ComponentCount - 1 do
if Components[i] is TCheckBox then
begin
Check := TCheckBox(Components[i]);
Click := 'CheckBox' + IntToStr(I) + 'Click';
Check.OnClick := (Click as TNotifyEvent);
// CheckBox13.OnClick := CheckBox13Click;
end
end;

pero nada, ¿alguien que me pueda hechar la mano?.


Saludos. Vicente López.

Last edited by Chente(rMan) : 22/08/2005 at 22:18.
Reply With Quote
  #7  
Old 23/08/2005
Crandel's Avatar
[Crandel] Crandel is offline
Miembro Premium
 
Join Date: May 2003
Location: Parana, Argentina
Posts: 1,475
Poder: 25
Crandel Va por buen camino
debes asignar el método OnClick a algun método del formulario que posea los mismos parámetros que el evento OnClick del CheckBox.

Asigna el mismo evento a todos y luego checkeas cual es.
__________________
[Crandel]
Reply With Quote
  #8  
Old 23/08/2005
Chente(rMan)'s Avatar
Chente(rMan) Chente(rMan) is offline
Miembro
 
Join Date: Aug 2005
Posts: 89
Poder: 22
Chente(rMan) Va por buen camino
Red face

Creo que de esa manera no funciona , estamos hablando de 30 cb's, por eso quería optimizarlo.


Gracias.
Reply With Quote
  #9  
Old 24/08/2005
dec's Avatar
dec dec is offline
Moderador
 
Join Date: Dec 2004
Location: Alcobendas, Madrid, España
Posts: 13,142
Poder: 36
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Creo que hay un problema de diseño en tu aplicación, porque, verás, el tema tratado en este Hilo es algo muy particular, se trata de inhabilitar el evento "OnClick" de un "TCheckBox" de forma que se pueda cambiar programáticamente la propiedad "Checked" del mismo, sin que se dispare el evento "OnClick".

Pero, de ahí, a hacer lo propio con 30 "TCheckBox"... ¿realmente te hace falta? ¿No bastaría con habilitarlos/deshabilitarlos mediante su propiedad "Enabled"? Tú mismo dices lo siguiente:

Quote:
Originally Posted by Chente(rMan)
(...) tengo 30 CheckBox, si los deshabilito de un jalon y les cambio sus propiedades de checked (...)
Pues bien, para habilitarlos/deshabilitarlos basta con recorrer los componentes y dar el valor que corresponda a su propiedad "Enabled". Pero si ya los deshabilitaste, ¿qué sentido tiene quitarles el método asociado a su evento "OnClick"? ¡Si el usuario no podrá hacer uso de los mismos!

En fin, creo que lo tratado en este Hilo no tiene que ver con lo que precisas hacer tú en tu programa, porque, de ser así, podrías hacerlo sin problemas. Así pues, creo que deberías reconsiderar el diseño de tu aplicación, dicho mal, pero pronto.

Por otro lado lo que dice Crandel es correcto, es decir, lo que te propone es que asignes un método capaz de tratar con el evento "OnClick" de los "TCheckBox", pues de otro modo no funcionará el asunto como se espera: probablemente ni compile tu programa.

Si tú dices que eso no es posible, porque en tu caso son 30 los "TCheckBox" a utilizar... piensa que servir, lo que se dice servir, sirve: no hay ningún problema en que un método esté asociado a los eventos que te sean menester y luego en el mismo discriminar qué hay que hacer en función de quién sea el objeto que disparara el evento, que a su vez ejecutó el método en cuestión.

En fin. No me enrollo más. Si das algún dato sobre lo que pretendes hacer tal vez se te pueda echar una mano, pero, creo que has pensado que es algo bueno hacer lo que se ha comentado en este Hilo y has decidido hacerlo en tu programa, sin contar que lo "bueno" también es algo particular, que, probablemente, no sea adaptable así sin más a tu aplicación.
__________________
David Esperalta
www.decsoftutils.com
Reply With Quote
  #10  
Old 24/08/2005
Chente(rMan)'s Avatar
Chente(rMan) Chente(rMan) is offline
Miembro
 
Join Date: Aug 2005
Posts: 89
Poder: 22
Chente(rMan) Va por buen camino
Tienes razón, creo que no me explique bien, pero como el titulo del post decia Deshabilitar y habilitar el onclick de un CheckBox, asumi que se entería , ahi estuvo mi error, "mia culpa" , ok. lo interare otra vez, tengo 30 ChekBox:

CheckBox1
.
.
CheckBox30

cada uno de ellos tiene codigo diferente en su evento onclick.

Cuando yo hago una busqueda sobre uno de mis reportes, la propiedad checked de estos CheckBox debe cambiar segun lo criterios que defino en mi busqueda, entonces, ya que tengo los resultados de mis busquedas, me preparo a cambiar la propiedad checked de los cb's, para ello, pongo a todos en false a su propiedad checked.

Código Delphi [-]
procedure TfrmForma.LimpiarCheckBox;
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;
end;

Con esto se dispara el evento OnClick de todos los cb's. Para ello necesito deshabilitar el onclick de estos. por lo tanto hago esto.

Código Delphi [-]
procedure TfrmForma.LimpiarCheckBox;
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.OnClick := nil;
        Check.Checked := False;
      end;
end;

Con esto logro que no se ejecute el OnClick, pero tengo entendido que debo de copiar el evento, como le puedo hacer para no tener que declarar 30 variables, uno para cada CheckBox.

Código Delphi [-]
procedure TfrmForma.LimpiarCheckBox;
var Check: TcheckBox;
     I: Integer;
     copiaEvento: TNotifyEvent;
begin
  for I := 0 to ComponentCount - 1 do
    if Components[i] is TCheckBox then
      begin
        Check := TCheckBox(Components[i]);
        copiaEvento := Check.OnClick  //aqui es donde no se como...
        Check.OnClick := nil;
        Check.Checked := False;
      end;
end;

para que despues de todas las validaciones que le hago al programa pueda voler a asignarle su evento a cada uno de ellos, algo asi.

Código Delphi [-]
procedure TfrmForma.LimpiarCheckBox;
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.OnClick := copiaEvento   //y aqui regresarle su evento.
      end;
end;


Espero que me puedan ayudar y gracias por contestar.


Saludos.

Vicente López.
Reply With Quote
  #11  
Old 24/08/2005
Crandel's Avatar
[Crandel] Crandel is offline
Miembro Premium
 
Join Date: May 2003
Location: Parana, Argentina
Posts: 1,475
Poder: 25
Crandel Va por buen camino
Aclaraste un poco mas pero no tanto,

queres ejecutar el mismo evento OnClick para todos los checkBox's o queres uno para cada uno?
__________________
[Crandel]
Reply With Quote
  #12  
Old 24/08/2005
Chente(rMan)'s Avatar
Chente(rMan) Chente(rMan) is offline
Miembro
 
Join Date: Aug 2005
Posts: 89
Poder: 22
Chente(rMan) Va por buen camino
Uno para cada uno.

Cada CheckBox tiene su evento onclick, entonces tendria que grabar cada evento en una variable diferente para después regresarlelos.

ejemplo:

Código Delphi [-]
var Check: TcheckBox;
     I: Integer;
     copiaEvento1, copiaEvento2 .....  copiaEvento30: TNotifyEvent;
begin
  for I := 0 to ComponentCount - 1 do
    if Components[i] is TCheckBox then
      begin
        Check := TCheckBox(Components[i]);
        copiaEvento1 := Check.OnClick  //aqui es donde no se como...
//      copiaEvento {como irle cambiando los numeros} := Check.OnClick  
        Check.OnClick := nil;
        Check.Checked := False;
      end;


y de regreso pues lo mismo.

Saludos.

Vicente López.
Reply With Quote
  #13  
Old 24/08/2005
Lepe's Avatar
[Lepe] Lepe is offline
Miembro Premium
 
Join Date: May 2003
Posts: 7,424
Poder: 31
Lepe Va por buen camino
Código Delphi [-]
TForm1 = class(Tform)
private
  Copias : array [1..30] of TNotifyEvent;

...
end;

var Check:Tcheckbox;
     I: Integer;
     contador:integer;
begin
  contador := 0;
  for I := 0 to ComponentCount - 1 do
    if Components[i] is TCheckBox then
      begin
        Check:=  TCheckbox(Components[i]);
        inc(contador);
        copias[contador] :=  check.Onclick;

        Check.OnClick := nil;
        Check.Checked := False;
      end;

al regresar los eventos funciona exactamente igual, siempre y cuando no agregues Checkboxes en tiempo de ejecución entre un guardado y una restauración.

Para restaurarlo, es ese mismo bucle pero usando:

check.Onclick := copias[contador]
y eliminando las 2 lineas siguientes.

Un saludo
Reply With Quote
  #14  
Old 24/08/2005
Chente(rMan)'s Avatar
Chente(rMan) Chente(rMan) is offline
Miembro
 
Join Date: Aug 2005
Posts: 89
Poder: 22
Chente(rMan) Va por buen camino
Thumbs up

Genial Lepe, un arreglo, lo intentare y te aviso.


Editado: Listo, esta funcionando a la perfeción. Gracias a todos...



Saludos.

Vicente López.

Last edited by Chente(rMan) : 24/08/2005 at 21:03.
Reply With Quote
  #15  
Old 24/08/2005
Lepe's Avatar
[Lepe] Lepe is offline
Miembro Premium
 
Join Date: May 2003
Posts: 7,424
Poder: 31
Lepe Va por buen camino
Edito: jajaja, ahora que está todo listo llego yo a rematarlo

Despues de todo el rollo, he creado un TcheckBox que no tiene ese comportamiento. Ha sido más facil de lo que creía. Os dejo la unidad.

Código Delphi [-]
unit CheckBoxNoClick;

interface

uses
  Windows, Messages, SysUtils, Classes, Controls, StdCtrls;

type
  TCheckBoxNoClick = class(tcheckBox)
  private
    { Private declarations }
  protected
    { Protected declarations }
  public
    { Public declarations }
  published
    { Published declarations }
    procedure SetChecked(Value:Boolean);
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Standard', [TCheckBoxNoClick]);
end;

{ TCheckBoxNoClick }

procedure TCheckBoxNoClick.SetChecked(Value: Boolean);
begin
  try
    clicksdisabled := True;
    inherited;
  finally
    ClicksDisabled:= False;
  end;
end;
end.

Cuando se quiera por código modificar el checked, se llama a SetChecked, que tiene el truco de inhabilitar el evento Click.

Saludos

Last edited by Lepe : 24/08/2005 at 21:06.
Reply With Quote
  #16  
Old 25/08/2005
Chente(rMan)'s Avatar
Chente(rMan) Chente(rMan) is offline
Miembro
 
Join Date: Aug 2005
Posts: 89
Poder: 22
Chente(rMan) Va por buen camino
Angry

Que tal Lepe, pues te cuento que todavia no he probado la unidad, porque estoy algon intrigado con esto.


te cuento, es te es el procedimiento que me inhabilita los clicks de los checkBox...

Código Delphi [-]
procedure TfrmExpediente.LimpiarCheckBox; //Limpia los checkBox y Deshabilita el click...
var
Check: TcheckBox;
I, j: Integer;
begin
j := 0;
for I := 0 to ComponentCount - 1 do
if Components[i] is TCheckBox then 
begin
Check := TCheckBox(Components[i]);
inc(j);
CopiarEvento[j] := Check.OnClick;
Check.OnClick := nil;
Check.Checked := False;
Check.Enabled := True;
end;
end;

despues de que mando llamar este procedimiento, me dispongo a marcar los check Box que deben estar prendido segun unas condiciones, tomadas de una sentencia que ejecuto, pero ahora resulta que la sentencia me arroja 0 resultados, esta muy raro, ¿no cree?, ¿que podra estar sucediendo? .

Edito:
Ya instale la unidad, ya realize unas pruebas y no le entiendo, se supone que me deshabilita los click's ¿cierto?, este es el código que puse.

Código Delphi [-]
procedure TfrmExpediente.LimpiarCheckBox;
var I: Integer;
begin
  for I := 0 to ComponentCount - 1 do
    if Components[i] is TCheckBoxNoClick then      begin
        Check := TCheckBoxNoClick(Components[i]);
        Check.SetChecked(False);
        Check.Checked := False;
        Check.Enabled := True;
      end;

y después pongo CheckBoxNoClick1.Checked := True; y si me ejecuta el click.

Saludos.

Last edited by Chente(rMan) : 25/08/2005 at 22:51.
Reply With Quote
  #17  
Old 25/08/2005
Chente(rMan)'s Avatar
Chente(rMan) Chente(rMan) is offline
Miembro
 
Join Date: Aug 2005
Posts: 89
Poder: 22
Chente(rMan) Va por buen camino
Talking

que tal, creo que al fin quedo solucionado, muy bueno por cierto, encontre este artículo.


http://www.delphi3000.com/articles/a...sp?SK=checkbox




Saludos.

Vicente López.
Reply With Quote
  #18  
Old 26/08/2005
roman's Avatar
roman roman is offline
Moderador
 
Join Date: May 2003
Location: 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
Quote:
Originally Posted by Chente(rMan)
¡Vaya que hay gente complicada!

En el formulario donde uses tus CheckBox coloca esto antes de la declaración del formulario:


Código Delphi [-]
type
  TCheckBox = class(StdCtrls.TCheckBox)
  public
    constructor Create(AOwner: TComponent); override;
  end;

e implementa este constructor así:


Código Delphi [-]
constructor TCheckBox.Create(AOwner: TComponent);
begin
  inherited;
  ClicksDisabled := true;
end;

Eso es todo. Los CheckBox no dispararán el evento OnClick cuando se asigne Checked por código.

// Saludos
Reply With Quote
  #19  
Old 26/08/2005
dec's Avatar
dec dec is offline
Moderador
 
Join Date: Dec 2004
Location: Alcobendas, Madrid, España
Posts: 13,142
Poder: 36
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Una pregunta obligada, si se sigue el tema de este Hilo desde un principio: ¿cómo podría volverse a habilitar el Click programáticamente según tu propuesta roman? Tal vez ya no tenga mucho sentido hacerlo, puesto que no se quiera, pero, repito que sigo en la pregunta el tema de este Hilo.
__________________
David Esperalta
www.decsoftutils.com
Reply With Quote
  #20  
Old 26/08/2005
roman's Avatar
roman roman is offline
Moderador
 
Join Date: May 2003
Location: 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
Quote:
Originally Posted by dec
¿cómo podría volverse a habilitar el Click programáticamente según tu propuesta roman?
CheckBox1.ClicksDisabled := false;

// Saludos
Reply With Quote
Reply



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump


All times are GMT +2. The time now is 01:52.


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