Autor Beitrag
realerHanno
Hält's aus hier
Beiträge: 13

Win XP
Delphi Enterprise V7.0
BeitragVerfasst: Do 05.05.11 09:45 
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:

ausblenden 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
Hält's aus hier
Beiträge: 11

XP, W7 Ult. 64-bit, Linux (als Rettung)
D7.0 Enterprise
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 13

Win XP
Delphi Enterprise V7.0
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: Do 05.05.11 14:44 
Schau mal www.delphi-forum.de/...hlight=mouse+control hier drauf.
Es gab aber noch ein besseren link für sowas, find ihn aber nicht.

Gruss Alf

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19338
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 05.05.11 14:44 
Schau doch einfach nach, ob die Maus gerade über der Komponente ist:
ausblenden Delphi-Quelltext
1:
  if PtInRect(MyShape.ClientRect, MyShape.ScreenToClient(Mouse.CursorPos)) then					
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Do 05.05.11 14:54 
Du brauchst ein fokusiertes Wincontrol, anbei ein Beispiel, vorzugsweise in eine eigene Komponente giessen und anpassen

ausblenden volle Höhe 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.

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
realerHanno Threadstarter
Hält's aus hier
Beiträge: 13

Win XP
Delphi Enterprise V7.0
BeitragVerfasst: 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