MouseWheel über jeder Komponente

Rund um die LCL und andere Komponenten
Antworten
Tasti
Beiträge: 2
Registriert: So 22. Mär 2015, 13:33

MouseWheel über jeder Komponente

Beitrag von Tasti »

Hallo Leute,

auf dem Hauptfenster liegt ein Panel, welches ich gern mit MouseWheel abfragen möchte, um zu erfahren, in welche Richtung WheelDelta orientiert werden muss.

Unter Delphi gibt es dafür die Komponente ApplicationEvents mit OnMessage, welche mit diesem Beispiel reibungslos funktioniert.
(http://www.delphifeeds.com/go/f/86745?u ... eds.com%29 )
Suche: Redirect Mouse

Lazarus 1.2.2 bietet leider nur ApplicationProperties ohne OnMessage an und moniert spätestens bei FindVCLWindow.

Gibt es bei Lazarus auch die unkomplizierte Möglichkeit, MouseWheel und WheelDelta über jeder Komponente abzufragen?

Beste Grüße
Tasti

PS: Aller Anfang ist schwer - bitte nicht gleich steinigen.
:D

Benutzeravatar
theo
Beiträge: 10873
Registriert: Mo 11. Sep 2006, 19:01

Re: MouseWheel über jeder Komponente

Beitrag von theo »

Hallo.
Verstehe grad nicht ganz, worum es dir geht. Ein Panel hat doch dein OnMouseWheel Event, wo du auch WheelDelta mitbekommst.

Code: Alles auswählen

procedure TForm1.Panel1MouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
Was fehlt denn da?

Ich denke 1.2.2 hatte das auch schon, würde aber immer die neueste Version empfehlen. Evtl. sogar 1.4 RC2
ftp://freepascal.dfmk.hu/pub/lazarus/releases/

Tasti
Beiträge: 2
Registriert: So 22. Mär 2015, 13:33

Re: MouseWheel über jeder Komponente

Beitrag von Tasti »

Hallo theo,

mit dem folgendem Code erhalte ich sofort WheelDelta auf dem Panel (getestet mit D2009)

Code: Alles auswählen

unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, AppEvnts;
 
type
  TForm1 = class(TForm)
    ApplicationEvents1: TApplicationEvents;
    Panel1: TPanel;                                       
    procedure ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean); 
    procedure FormMouseWheel(Sender: TObject; Shift: TShiftState;
      WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;var Handled: Boolean);
var   mousePos: TPoint;
  wc: TWinControl;
begin
  if Msg.message = WM_MOUSEWHEEL then
  begin
    mousePos.X := Word(Msg.lParam);
    mousePos.Y := HiWord(Msg.lParam);
    wc := FindVCLWindow(mousePos);
    if wc = nil then
      Handled := True
    else
    if wc.Handle <> Msg.hwnd then
    begin
      SendMessage(wc.Handle, WM_MOUSEWHEEL, Msg.wParam, Msg.lParam);
      Handled := True;
    end;
  end;
end;
 
procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState;
  WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin
  Label1.Caption:=Inttostr(WheelDelta);
end;
 
end.

Könntest Du mir bitte einen Hinweis geben, wie ich dieses in Lazarus umsetzen kann?


Beste Grüße
Tasti

Benutzeravatar
theo
Beiträge: 10873
Registriert: Mo 11. Sep 2006, 19:01

Re: MouseWheel über jeder Komponente

Beitrag von theo »

Ich verstehe leider gar nicht, was du eigentlich im Endeffekt erreichen willst.
Darum kann ich dir dazu leider auch nichts schlaues sagen.

Antrepolit
Beiträge: 340
Registriert: Di 12. Sep 2006, 08:57
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Re: MouseWheel über jeder Komponente

Beitrag von Antrepolit »

Was Theo damit sagen will ist vermutlich, dass du diesen Delphi-Spaghetti-Code mit Von-Hinten-Durch-Die-Brust nicht brauchst, weil das TPanel in Lazarus ein recht programmiererfreundliches Event dafür hat. Und was Events und Eventhandler sind weißt du, oder?
Grüße, Antrepolit

care only if your os is really burning

Antworten