Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   deshabilitar y habilitar evento onClick de un tcheckbox (https://www.clubdelphi.com/foros/showthread.php?t=23789)

dec 26-08-2005 02:24:39

Hola,

Hombre, roman, si preguntaba es porque esa instrucción que refieres no me funciona (no sé porqué)...

Me dice aquello de "Undeclared identifier: 'ClicksDisabled'"...

Actualización: Está bien. Si hago uso de la interposición de la clase "TCheckBox" entonces no hay problema en usar la instrucción de marras.

roman 26-08-2005 05:10:16

Cita:

Empezado por dec
Está bien. Si hago uso de la interposición de la clase "TCheckBox" entonces no hay problema en usar la instrucción de marras.

¿Interposición? ¿Qué es eso?

ClicksDisabled es una propiedad protegida en TCheckBox, pero recordemos la accesibilidad de propiedades y métodos protegidos:

Cita:

Empezado por Delphi
Accessible to code in the unit(s) where the class and its descendants are defined.

Como en la unidad del formulario TCheckBox es un descendiente de StdCtrls.TCheckBox, tal propiedad puede accederse libremente.

// Saludos

dec 26-08-2005 06:19:15

Hola,

Sin duda no supe decir lo que quería decir. Muchas gracias roman.

roman 26-08-2005 06:21:51

Cita:

Empezado por dec
Sin duda no supe decir lo que quería decir

¿y qué es lo que querías decir? :confused:

¿Te funcionó o no?

// Saludos

dec 26-08-2005 06:42:56

Hola,

Lo que quería decir (a ver si me sale ahora) es lo siguiente. Si yo no hago uso de la clase ("TCheckBox") interpuesta antes de la declaración del tipo del formulario, no puedo acceder a la propiedad "ClicksDisabled". Pero, como dije antes:

Cita:

Empezado por dec
Actualización: Está bien. Si hago uso de la interposición de la clase "TCheckBox" entonces no hay problema en usar la instrucción de marras.

Si hago uso de la clase interpuesta tal y como proponías entonces puedo acceder a la propiedad "ClicksDisabled" sin problemas. Si ahora resulta que no es tanto porque se hiciera uso de la clase interpuesta, sino que se trata de lo que dices:

Cita:

Empezado por roman
Como en la unidad del formulario TCheckBox es un descendiente de StdCtrls.TCheckBox, tal propiedad puede accederse libremente.

... porque, según Delphi:

Cita:

Empezado por Ayuda de Delphi
Accessible to code in the unit(s) where the class and its descendants are defined.

Y sí, roman, ya sí puedo, como digo, hacer uso de la propiedad "ClicksDisabled", esto es, por lo que has comentado. Así que otra vez he vuelto a confundirme, puesto que no podía acceder a dicha propiedad no tanto por hacer o no hacer uso de la clase interpuesta, sino por lo que se refiere arriba que dice la ayuda de Delphi y tú transcribiste oportunamente.

(Esto si no es que puedo acceder a dicha propiedad precisamente por haber "redeclarado" la clase "TCheckBox", pues de otro modo acaso no fuera posible, de hecho no es posible si no lo hago así, como ya dije más arriba)

Crandel 26-08-2005 07:17:37

Cuantas vueltas para explicar algo tan simple :eek:

ClicksDisabled esta declarado en la clase TButtonControl como una propiedad protected (protegida), por lo que sólo puede ser accedida desde la misma clase o sus descendientes.

Hay varias formas de poder acceder a ella

como lo hizo Lepe, creando un nuevo componente que agrega una nueva propiedad para poder modificarlo.

Como lo hizo roman, redefieniendo la clase y desabilitando directamente la propiedad, pero lo bueno es que no hay instalar ningún componente :).

y ahora para resumir doy la mia

Código Delphi [-]
TCheckBox = class(StdCtrls.TCheckBox)
public
   property ClicksDisabled;
end;
simplemente hago pública la propiedad y ahora que cada uno la cambie a su antojo cuando quiera :D y como quiera, sin tener que instalar nada. Eso si debe estar antes de la declaración del formulario (igual que el de roman).

Si quieren crear un componente que ya lo tenga, para no tener que agregar este código en cada proyecto, cambian el public por published, cambian el nombre de la clase y lo registran.

Espero no haber liado más :p

roman 26-08-2005 07:28:44

Cita:

Empezado por Crandel
Código Delphi [-]
TCheckBox = class(StdCtrls.TCheckBox)
public
   property ClicksDisabled;
end;

Je, je. Esto fue lo primero que pensé. Pero tiene un ligero inconveniente, al menos tomando en cuenta lo que originó este hilo.

Creo (porque el hilo es ya muy largo y no pretendo revisarlo desde el principio), que el deshabilitar los clicks se requiere para 30 checkboxes y de ahí que pensaron lo de un ciclo que los recorriera todos.

Haciendo que el constructor desactive los clicks se olvida uno del ciclo y de tener que hacerlo individualmente para cada control.

// Saludos

dec 26-08-2005 07:39:48

Hola,

Pues al comenzar este Hilo el tema era cómo deshabilitar el evento "OnClick" de un solo "TCheckBox"... porque cuando se cambiaba la propiedad "Checked" de este programáticamente se disparaba dicho evento "OnClick", sin que se pretendiera tal cosa... el objetivo era hacer lo dicho y poder después recuperar el evento "OnClick" también programáticamente...

¡La cosa se fue un tanto de madre! ¿Verdad? ;)

Crandel 26-08-2005 07:45:07

con esta cantidad de mensajes, de que estamos hablando? que queremos resolver? :confused: :confused: :D :D

dec 26-08-2005 07:54:16

Hola,

Cita:

Empezado por Crandel
con esta cantidad de mensajes, de que estamos hablando? que queremos resolver? :confused: :confused: :D :D

Bueno... si aquello de que no hay libro malo (que dice Miguel de Cervantes) se puede aplicar a los Hilos de un foro, es de suponer que algo se saque en claro. Sin embargo a mí personalmente no me disgusta que se traten temas separados en Hilos separados. Creo que beneficia al conjunto de usuarios. ¡Y no digo más! ;)

Ohcan 26-08-2005 09:10:59

Artículo
 
Vaya, precisamente ayer estuve leyendo un artículo de Ian Marteens sobre Clases Interpuestas:
http://www.marteens.com/trick46.htm
Aquí os dejo el link.

Saludos.

Lepe 26-08-2005 11:40:00

Vaya, me descuido un poco y se monta un pollo :D

En El Checkbox que yo propuse, para hacer que se dispare el Onclick por código, usamos Checkbox.Checked := true /false

Cuando no queremos que se dispare el evento, simplemente usamos checkbox.SetChecked(true/false)

Y no tiene más historia.

Un saludo

FGarcia 07-12-2007 22:08:17

Hola!

Aqui reviviendo este hilo. A ver no entendi. Estoy tratando de implementar el codigo de Roman:

Código Delphi [-]
unit UGeneralDatos;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, DBCtrls, Grids, DBGrids, ComCtrls, StdCtrls, Buttons,
  DateUtils;
 
 {Redefinimos el componente TCheckBox para evitar el evento OnClick}
type
  TCheckBox = class(StdCtrls.TCheckBox)
  public
    constructor Create(AOwner: TComponent); override;
  end;
 
{ 
constructor TCheckBox.Create(AOwner: TComponent);
begin
  inherited;
  ClicksDisabled := true;
end;
 }

type
  TfrmGDatos = class(TForm)
    DBGrid1: TDBGrid;
    DBNavigator1: TDBNavigator;
    CheckBox1: TCheckBox;
    CheckBox2: TCheckBox;
    CheckBox3: TCheckBox;
    CheckBox4: TCheckBox;
    CheckBox5: TCheckBox;
    CheckBox6: TCheckBox;
    CheckBox7: TCheckBox;
    CheckBox8: TCheckBox;
    StringGrid1: TStringGrid;
    procedure RadioGroup1Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
    procedure bbtnOKClick(Sender: TObject);
    procedure CheckBox1Click(Sender: TObject);
    procedure CheckBox5Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  private
    { Private declarations }
      public
    { Public declarations }
  end;
 
var
  frmGDatos: TfrmGDatos;
 
implementation
 
uses UCnx, UHoraFecha, UVarios;
 
{$R *.dfm}
 
{Definimos el constructor del TCheckBox sin evento OnClick}
constructor TCheckBox.Create(AOwner: TComponent);
begin
  inherited;
  ClicksDisabled := true;
end;
 
procedure TfrmGDatos.FormCreate(Sender: TObject);
begin
  
  checkbox1.Checked := true;
  checkbox2.Checked := true;
  checkbox3.Checked := false;
  checkbox4.Checked := false;
  checkbox5.Checked := false;
  checkbox6.Checked := false;
  checkbox7.Checked := true;
  checkbox8.Checked := true;
end;

La pregunta: ¿esta correcto donde implemente el constructor?
La duda: Se sigue comportando igual, el evento OnClick se dispara de todos modos. ¿Donde me perdi?

jachguate 07-12-2007 23:24:36

¿Esto compila?

NO veo donde está declarada la clase TCheckBox... ni creo que tus componentes sean de esa nuev aclase... ¿me equivoco?

FGarcia 08-12-2007 14:34:19

Compila perfectamente, no registra error ni lanza algun aviso, solo que el comportamiento no es el que segun el incio del hilo menciona: Evitar el evento OnClick al asignar la propiedad checked por codigo.

p.d. El codigo no esta completo solo puse lo relevante a la redeclaracion del checkbox.

Lepe 08-12-2007 19:50:07

Prueba a instalar mi componente, dicho en el mensaje nº 15 y después me comentas ;).

No voy a mirar las otras formas, porque hay varias, lo cierto, es que mi CheckboxNoclick si funciona porque lo he utilizado en algunos proyectos.

Las demás opiniones, no sé, no las he probado.

Con Gexperts.org no tendrás problemas en cambiar todos los checkbox por TcheckboxNoClick.

Creo recordar vagamente que había problemas colaterales al dejar ClicksDisabled a true.

Saludos

FGarcia 08-12-2007 20:20:17

Gracias !!

Voy a probarlo y despues comento.

P.D. Probado, hasta el momento no he encontrado ningun efecto colateral.


La franja horaria es GMT +2. Ahora son las 18:49:46.

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