Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   TCheckbox no acepta el OnClick (https://www.clubdelphi.com/foros/showthread.php?t=14759)

atirado 29-09-2004 23:40:16

TCheckbox no acepta el OnClick
 
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 :(
Código Delphi [-]
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:
Código Delphi [-]
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

Cita:

Empezado por atirado
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

Código Delphi [-]
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:
Código Delphi [-]
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:
  1. El procedimiento a utilizar en el OnClick, debe ser declarado de la siguiente manera:
    Código Delphi [-]
    procedure PonerTotales(Asender: TObject);
  2. El procedimiento debe estar declarado antes de private o public y ser declarado en type.
    Código Delphi [-]
    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]
  3. 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:
    Código Delphi [-]
    ...
    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


La franja horaria es GMT +2. Ahora son las 15:10:25.

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