PDA

Ver la Versión Completa : TCheckbox no acepta el OnClick


atirado
29-09-2004, 23:40:16
Hola de nuevo! yo dando dolores de cabeza de nuevo :p
Ahora tengo un problema muy particular que quiero plantearles: tengo un checkbox de IntraWeb (TIWCheckBox), el cual quiero que efectúe una acción al darle clic, sin embargo, no me funciona llamarlo directamente :(

chkDefinitivo := TIWCheckBox.Create(Self);
chkDefinitivo.Tag := grdDatos.RowCount - 1;
chkDefinitivo.Caption := '';
grdDatos.Cell[grdDatos.RowCount - 1, 8].Control := chkDefinitivo;
chkDefinitivo.OnClick := PonerTotales;
chkDefinitivo.Checked := false;

El error que me marca es "Incompatible types: 'Parameter lists differ'"; sin embargo, PonerTotales es un método que no utiliza parámetros, y dentro de él no manda llamar métodos con parámetros.
En las variables, está declarada como:

chkDefinitivo: TIWCheckBox;


Definitivamente en este momento no se me ocurre nada, ya que la ayuda de Delphi, sólo me dice lo obvio, que si un método tiene parámetros, debo llamarlo con parámetros, pero en este caso, PonerTotales no los tiene...

Un saludo y espero que puedan ayudarme como siempre lo han hecho :D

roman
30-09-2004, 00:11:20
sin embargo, PonerTotales es un método que no utiliza parámetros


Pues quizá este sea precisamente el problema. A no ser que IntraWeb entienda algo muy raro por OnClick, el método que le asignes debe recibir un parámetro: Sender: TObject.

Dices que la ayuda de Delphi no dice mucho pero sí te manda un mensaje "Incompatible types" lo mínimo es checar el tipo de datos involucrados en la asignación. Al menos con un CheckBox normal, al consultar el tipo de datos de la propiedad OnClick verás que es de tipo TNotifyEvent y al buscar en la ayuda acerca de este tipo verás que está declarado como


type
TNotifyEvent = procedure(Sender: TObject) of object;


de donde concluyes que hace falta un parámetro al procedimiento PonerTotales.

// Saludos

atirado
30-09-2004, 00:52:25
Hola, Román! Gracias por la aclaración, y sí tiene mucho sentido como lo dices. Me hicieron llegar un código donde ya pude resolver mi duda, pero se los explico aquí para aquellos que tengan problemas con IntraWeb, el cual veo que no hay mucha gente que lo esté utilizando en este foro :rolleyes:
En fin, mi declaración del código estaba correcta:

chkDefinitivo := TIWCheckBox.Create(Self);
chkDefinitivo.Tag := grdDatos.RowCount - 1;
chkDefinitivo.Caption := '';
grdDatos.Cell[grdDatos.RowCount - 1, 8].Control := chkDefinitivo;
chkDefinitivo.OnClick := PonerTotales;
chkDefinitivo.Checked := false;

Sin embargo, era la funcionalidad de IntraWeb la que me había hecho bolas; simplemente se deben cumplir 3 condiciones:

El procedimiento a utilizar en el OnClick, debe ser declarado de la siguiente manera:

procedure PonerTotales(Asender: TObject);

El procedimiento debe estar declarado antes de private o public y ser declarado en type.

type
TfrmConsultas = class(TIWAppForm)
txtEncabezado: TIWText;
lblFInicio: TIWLabel;
lblFFinal: TIWLabel;
edtFinicio: TIWEdit;
edtFFinal: TIWEdit;
btnConsultar: TIWButton;
grdDatos: TIWGrid;
lblTotalRegistros: TIWLabel;
procedure grdDatosRenderCell(ACell: TIWGridCell; const ARow,
AColumn: Integer);
procedure btnConsultarClick(Sender: TObject);
procedure PonerTotales(Asender: TObject);
public
private
procedure LlenarGridDatos;
.... {etc]

En el evento OnClick de un componente que se crea dinámicamente, no se llama usando el parámetro ASender, pero si se utiliza en cualquier otra parte del código, debe llamarse usando Self. Ejemplos:

...
chkDefinitivo.OnClick := PonerTotales;
...
PonerTotales(Self);
...

Así, se evita el error del compilador, tal cual yo lo veía. Si alguien utiliza IntraWeb en sus aplicaciones (se que algunos todavía recelan de él, pero creanme que es mejor de lo que parece ;)) y necesita llamar un procedimiento en el evento OnClick, espero le sirva esta aclaración :cool:

gracias de nuevo por demostrar que este sigue siendo el mejor foro de Delphi en Español :D

Salu2 desde MX
Alejandro