Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Eventos del Mouse en un Componente. (https://www.clubdelphi.com/foros/showthread.php?t=91743)

FENIXadr 11-04-2017 23:17:46

Eventos del Mouse en un Componente.
 
Hola gente .. una consulta.. estoy haciendo un componente donde quiero capturar los eventos del Mouse para que los use el usuario y para que los use el componente mismo.. mi problema es que mientras que el usuario no le asigne ningún procedimiento al evento, éste puede ser utilizado por el componente sin nigún problema.. pero si el usuario necesita hacer su propia llamada para el evento entonces, ese evento, deja de funcionar para el componente y solo funciona para el usuario..



Definiendolo de esta manera funciona para el componente hasta que el usuario define su propio procedimiento..

Código Delphi [-]
 ...
 .....
 ...
 published
    ......
    ...
    .....
    property OnMouseDown;
    property OnMouseMove;
    property OnMouseUp;

  end;

  ....
  ...
  ....



constructor TMiClase.Create (AOwner : TComponent);

begin
  Inherited Create (AOwner);

  ....
  ..
  .....
  ....

  OnMouseDown := MiClaseOnMouseDown;
  OnMouseMove := MiClaseOnMouseMove;
  OnMouseUp := MiClaseOnMouseUp;

  ...
  ....
  ..
  .....

Lo cual es lógico porque al valor inicial que le puse lo cambia por el del usuario..




definiendolo de esta otra manera no funciona para nadie .. ni usuario ni componente...

Código Delphi [-]
  
    ...
    ....
 private
    .....
    ....
    ......
    ...
    FOnMouseDown : TMouseEvent;
    FOnMouseMove : TMouseMoveEvent;
    FOnMouseUp : TMouseEvent;

    ....
    ......
    ...
    ....
 published
    property OnMouseDown : TMouseEvent read FOnMouseDown write FOnMouseDown;
    property OnMouseMove : TMouseMoveEvent read FOnMouseMove write FOnMouseMove;
    property OnMouseUp : TMouseEvent read FOnMouseUp write FOnMouseUp;

 end;


Cómo debería hacer para que me funcione para ambos??

desde ya muchas gracias..

FENIXadr 11-04-2017 23:58:37

Gente lo pude solucionar de una manera tal vez no muy elegante.. diganme si hay una manera mejor porfavor..

Hice lo siguiente:
Código Delphi [-]

    ... ..
    ..
 private
    .....
    ....
    ......
    ...
    FOnMouseDown : TMouseEvent;
    FOnMouseMove : TMouseMoveEvent;
    FOnMouseUp : TMouseEvent;
    
    procedure MiClaseOnMouseDown (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure MiClaseOnMouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer);
    procedure MiClaseOnMouseUp (Sender: TObject; Button: TMouseButton;
    ...
    .. .
    ... ..
    ..

 protected
   ...
   .....
   ...
    property OnMouseDown;
    property OnMouseMove;
    property OnMouseUp;
   ...
   .....
   ...
 published
    ......
    ...
    .....
    property MouseDown : TMouseEvent read FOnMouseDown write FOnMouseDown;      //Estos son los 
    property MouseMove : TMouseMoveEvent read FOnMouseMove write FOnMouseMove;  //Eventos que 
    property MouseUp : TMouseEvent read FOnMouseUp write FOnMouseUp;            //el usuario ve.

  end;

  ....
  ...
  ....



constructor TMiClase.Create (AOwner : TComponent);

begin
  Inherited Create (AOwner);

  ....
  ..
  .....
  ....

  OnMouseDown := MiClaseOnMouseDown;
  OnMouseMove := MiClaseOnMouseMove;
  OnMouseUp := MiClaseOnMouseUp;

  ...
  ....
  ..
  .....
 
end;

...
....
.
....

procedure TMiClase.MiClaseOnMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  .....
  ...
  .....
  ..
 
  if Assigned (FOnMouseMove) then
    FOnMouseMove(Sender, Shift, X, Y);  // Aqui llama al procedimiento definido por el usuario.
end;

....
..
....

AgustinOrtu 12-04-2017 01:47:44

De que componente estas heredando? Lo idiomatico es dejar los eventos al usuario del componente. Deberia haber metodos protegidos y virtuales llamados DoMouseUp, DoMouseDown, DoMouseMove, etc

Redefines esos metodos y ahi pones el codigo que necesitas. Recuerda invocar a inherited en algun momento

FENIXadr 12-04-2017 02:30:14

Estoy haciendo un componente propio derivado de TCustomControl pero si dejo esos eventos para el usuario, no los puedo utilizar en el componente, se que renombrarlos no es lo optimo, pero de esa manera los usa el componente y el usuario y con respecto a los eventos "DOMouseXXX" no existen o almenos no los encuentro..

AgustinOrtu 12-04-2017 03:42:05

Estan definidos en TControl

Vcl.Controls.TControl.MouseActivate

Vcl.Controls.TControl.MouseDown

Vcl.Controls.TControl.MouseMove

Vcl.Controls.TControl.MouseUp

Vcl.Controls.TControl.DoMouseWheel

Vcl.Controls.TControl.DoMouseWheelDown

Vcl.Controls.TControl.DoMouseWheelUp

FENIXadr 12-04-2017 04:47:11

Excelente AgustinOrtu.. es justo lo que necesitaba... muchisimas gracias..


La franja horaria es GMT +2. Ahora son las 11:14:56.

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