Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Problema capturar Mensajes (https://www.clubdelphi.com/foros/showthread.php?t=72377)

NEG1414 15-02-2011 15:54:47

Problema capturar Mensajes
 
Buenas... He creado un componente (Heredado de un TCustomControl) en el que capturo dentro de el , el Mensage "Pulsar boton Izquierdo" de la manera


Código:

void __fastcall  WMLbuttonDown (TMessage Message);
 
  BEGIN_MESSAGE_MAP
     
    VCL_MESSAGE_HANDLER(WM_LBUTTONDOWN, TMessage,WMLbuttonDown);

  END_MESSAGE_MAP (TCustomControl);

ademas he heredado el Evento onClick

Código:

__published

  __property OnClick;

Cuando utilizo el componente en una Aplicacion y hago click con el boton derecho del raton sobre el, en tiempo de ejecucion, observo que no accedo al evento Onclick de este

Sin Embargo si elimino la captura del mensage "Pulsar boton Izquierdo" que he descrito anteriormente del componente, y hago click sobre el en tiempo de Ejecucion y si me accede al Evento OnClick.

Mi pregunta es:
¿son incompatibles el evento OnClick Heredado y la captura de Mensage "Pulsar boton Izquierdo", o es posible utilizar los dos (uno dentro del mismo componente y el otro en la Aplicacion) al con un Click del raton sobre el componente.

Espero Haberme Explicado Bien Gracias

roman 15-02-2011 17:03:05

No sé qué tanto pueda ayudarte porque para mi la sintaxis de C++ Builder es prácticamente ininteligible :o.

Pero, basándome en lo que sé al respecto en Delphi, podría decirte que quizá en tu manejador del mensaje no estás llamando al manejador ancestro. Por ejemplo, el equivalente en delphi sería:

Código Delphi [-]
procedure TMiControl.WMLButtonDown(Message: TWMLButtonDown);
begin
  inherited; // Llamada al manejador de la clase ancestra

  {
    Aquí el código personal
  }
end;

// Saludos

_cero_ 15-02-2011 18:50:08

mmm hice una prueba rápida y al menos a mí me va bien en rad 2010, ahora bien al código que publicas le faltan un par de cosas (quizás ya las tengas y no es eso).

1 un puntero a una función si es OnClick podría ser del tipo “void … (TObject* obj)”.

2 en el property “OnClick” debe leer y escribir en el puntero que declaramos anteriormente.

3 cuando llegue el mensaje, nosotros llamamos a “FOnClick” desde “WMLbuttonDown”.

Te dejo como quedaría el .h y la función “WMLbuttonDown”, para que funcione el OnClick.

h.
Código:

typedef void __fastcall (__closure* OnObject)(TObject* val);
class PACKAGE TCustomControl1 : public TCustomControl
{
private:
    OnObject FOnClick;//FOnClicke es un puntero del tipo void … (TObject* val), aunque tú puedes cambiarle a uno del tipo que quieras.
    void __fastcall  WMLbuttonDown (TMessage Message);

public:
    __fastcall TCustomControl1(TComponent* Owner);

  BEGIN_MESSAGE_MAP
    VCL_MESSAGE_HANDLER(WM_LBUTTONDOWN, TMessage,WMLbuttonDown);
  END_MESSAGE_MAP (TCustomControl);

__published://Leemos y escribimos en FOnClick       
  __property OnObject OnClick={read=FOnClick, write=FOnClick};
};

funcion.
Código:

void __fastcall  TCustomControl1::WMLbuttonDown (TMessage Message)
{
/**/
    if (FOnClick) {//Vemos si fue asignado         
        FOnClick(this);//Llamamos a la función que fue asignada
    }
}



La franja horaria es GMT +2. Ahora son las 12:49:51.

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