Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Mausrad aktiv nur über einer Komponente ?


realerHanno - Do 05.05.11 09:45
Titel: Mausrad aktiv nur über einer Komponente ?
Hallo,

habe trotz vieler sehr spezieller Beiträge zum MouseWheel nichts dergleichen gefunden:
Ich möchte das Mausrad nur dann aktivieren, wenn der Mauszeiger über einer Komponente steht.
Mein sehr einfacher Code, um die Radbewegung hoch-/runterzählen zu lassen, reagiert nur auf der gesamten Form.
Ich bekomme es nicht hin, es nur innerhalb einer Komponente (zB. Shape) reagieren zu lassen.
Doch hier erst mal der Basic-Code:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
...
  protected
    procedure WndProc(var Message: TMessage); override;
...
implementation

procedure TForm1.WndProc(var Message: TMessage);
 begin
  if Message.Msg = WM_MOUSEWHEEL then
    begin;
      if Message.WParam>0 then n:=n+1 else n:=n-1;
      Edit1.Text :=IntToStr(n);
    end
  else
    inherited WndProc(Message);
 end;


Hier fehlt mir einfach der Gedankenblitz :idea: :?: zu einer einfachen Lösung.

Danke und Gruß
realerHanno

Moderiert von user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Do 05.05.2011 um 11:04


markus5766h - Do 05.05.11 14:18

Hallo,

hab gerad' kein Delphi zur Hand, daher etwas in's blaue geschossen :

zusätzlich noch das Shape.OnMouseMove abfragen, falls ein TShape diese property besitzt.


realerHanno - Do 05.05.11 14:36

Hallo markus6766h,

natürlich hat das shape (war ja auch nur als Beispiel gedacht) die onMouseMove prop. Hiermit habe ich vergeblich gebastelt.
Weil: das OnMouseMove hat eine eigene Pozedur. Ich habe also die procedure1.ShapeOnMouseMove(..) und die procedure2.FormMouseWheel(..). Ich bin einfach zu blöd, diese beiden Prozeduren zu vereinigen (war schon immer Einzelgänger). Das ist mein MainProb.
(Achtung: die Namen der beiden Prozeduren sind zur besseren Erkennbarkeit nicht identisch mit den wirklichen Namen)

Danke trotzdem und erstmal

Vielleicht kann mir hier jemand einen Kick geben...


ALF - Do 05.05.11 14:44

Schau mal http://www.delphi-forum.de/viewtopic.php?t=18546&highlight=mouse+control hier drauf.
Es gab aber noch ein besseren link für sowas, find ihn aber nicht.

Gruss Alf


jaenicke - Do 05.05.11 14:44

Schau doch einfach nach, ob die Maus gerade über der Komponente ist:

Delphi-Quelltext
1:
  if PtInRect(MyShape.ClientRect, MyShape.ScreenToClient(Mouse.CursorPos)) then                    


bummi - Do 05.05.11 14:54

Du brauchst ein fokusiertes Wincontrol, anbei ein Beispiel, vorzugsweise in eine eigene Komponente giessen und anpassen


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TMyShape=Class(TPAnel)
     Private
      FShape:TShape;
     public
     procedure WMMOUSEWHEEL(var Msg: TWMMOUSEWHEEL); message WM_MOUSEWHEEL;
  End;
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TMyShape }

procedure TMyShape.WMMOUSEWHEEL(var Msg: TWMMOUSEWHEEL);
begin
      inherited;
      if Msg.WheelDelta>0 then
        Color := clred else  Color := cllime;
      Caption := IntToStr(Msg.WheelDelta);

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  With TMyShape.Create(self) do
    begin
      Parent := self;
      left := 0;
      top := 0;
      Width := 100;
      height := 100;
      ParentColor := false;
      ParentBackground := false;
      DoubleBuffered := true;
      SetFocus;
    end;
end;

end.


realerHanno - Do 05.05.11 15:47

Hallo zusammen,

vielen Dank für die vielen Anregungen. Ich habe die von jaenicke bevorzugt, weil das die kürzeste Lösung (1 Zeile!) war.
Und weil das genau die Funktion "OnMouseOver" ist. Ist eben leider nicht so schnell zu finden...

Gruss
realerHanno