PDA

Ver la Versión Completa : Problema capturar Mensajes


NEG1414
15-02-2011, 15:54:47
Buenas... He creado un componente (Heredado de un TCustomControl) en el que capturo dentro de el , el Mensage "Pulsar boton Izquierdo" de la manera


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

__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:


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.

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.

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