Parameter mit Mausrad einstellen

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
KreuzBlick
Beiträge: 36
Registriert: Fr 3. Mai 2019, 17:45
OS, Lazarus, FPC: Win8.1 (L 2.2.4 FPC 3.2.2)
CPU-Target: 64Bit
Wohnort: Saarland

Parameter mit Mausrad einstellen

Beitrag von KreuzBlick »

Hallo,

ich versuche gerade einen Parameter, Faktor genannt, mit dem Mausrad einzustellen. Das soll so ablaufen, dass, wenn ich die Ctrl-Taste drücke, Mausrad nach oben den Wert vergrößert und Mausrad nach unten den Wert verkleinert. Der Wert wird in der Statuszeile angezeigt. In der Theorie funktioniert das auch wunderbar.
In der Praxis habe ich ein Fenster mit Statusbar und Scrollbox und innerhalb der Scrollbox ein Image, das in der Höhe größer ist als das Formular. Daher ist der senkrechte Scrollbalken sichtbar. Wenn ich jetzt Ctrl drücke und das Mausrad nach oben bewege, wird mein Faktor vergrößert, wie es sein soll. Bewege ich jedoch, Ctrl immer noch gedrückt, das Mausrad nach unten, so scrolle ich erst nach unten und erst wenn ich unten angekommen bin, wird mein Faktor verkleinert. Umgekehrt das gleiche. Irgendetwas schnappt sich das Mausradereignis, bevor es in meine Routine kommt.

Hier ist die überschaubare Unit meines Programms:

Code: Alles auswählen

unit Munit;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, ComCtrls,
  Types;

type

  { TForm1 }

  TForm1 = class(TForm)
    Image1: TImage;
    ScrollBox1: TScrollBox;
    StatusBar1: TStatusBar;
    procedure FormCreate(Sender: TObject);
    procedure FormMouseWheel(Sender: TObject; Shift: TShiftState;
      WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
  private

  public
    var vh:real;
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState;
  WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
var faktor:real;
begin
  if ssCtrl in Shift
    then
      with Form1 do
        begin
          if Wheeldelta>=0
            then faktor:=1.02
            else faktor:=1/1.02;
          vh:=vh*faktor;
          Statusbar1.Simpletext:='Faktor = '+Inttostr(round(vh*100));
          Handled:=true;
        end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  vh:=1;
  Statusbar1.Simpletext:='Faktor = '+inttostr(round(vh*100));
end;

end.
Was mache ich falsch, bzw. übersehe ich?

Hier ist noch das ganze Projekt als zip:
Dateianhänge
munit.zip
(3.52 KiB) 109-mal heruntergeladen
Viele Grüße
Gerold

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Parameter mit Mausrad einstellen

Beitrag von wp_xyz »

Nimm nicht das Mauswheel-Event des Formulars sondern das der ScrollBox.

Code: Alles auswählen

procedure TForm1.ScrollBox1MouseWheel(Sender: TObject; Shift: TShiftState;
  WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
var
  faktor: Real;
begin
  if ssCtrl in Shift  then
  begin
    if Wheeldelta>=0
      then faktor:=1.02
      else faktor:=1/1.02;
    vh:=vh*faktor;
    Statusbar1.Simpletext:='Faktor = '+Inttostr(round(vh*100));
    Handled:=true;
  end;
end;  

KreuzBlick
Beiträge: 36
Registriert: Fr 3. Mai 2019, 17:45
OS, Lazarus, FPC: Win8.1 (L 2.2.4 FPC 3.2.2)
CPU-Target: 64Bit
Wohnort: Saarland

Re: Parameter mit Mausrad einstellen

Beitrag von KreuzBlick »

Vielen Dank.

Das hat tatsächlich funktioniert!
Viele Grüße
Gerold

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Parameter mit Mausrad einstellen

Beitrag von Winni »

Hi!

Prinzipiell werden Ereignisse der Form an die visuelle Komponente übergeben,
über der gerade der Mauszeiger steht.

Wie Du gerade mit dem Mouse Wheely erlebt hast .

Winni

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1432
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Parameter mit Mausrad einstellen

Beitrag von fliegermichl »

Ich hab da grad mal bissi mit rumgespielt.
Was wenn ich erreichen will, daß das in jedem Fall funktioniert - egal über welchem Control die Maus steht.

Ich hab versucht TForm.wndproc zu überschreiben und da LM_MouseWheel abzufangen. Das klappt bei allen Komponenten ausser bei der Scrollbox.
Kann man sich da nicht (Form)-global reinhängen?

Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: Parameter mit Mausrad einstellen

Beitrag von Timm Thaler »

fliegermichl hat geschrieben:
Do 24. Sep 2020, 05:56
Was wenn ich erreichen will, daß das in jedem Fall funktioniert - egal über welchem Control die Maus steht.
Warum nicht jedem gewünschten Control die Prozedur zuweisen?

Bedenke allerdings, dass dann einige Objekte nicht so reagieren könnten, wie der User es erwartet.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1432
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Parameter mit Mausrad einstellen

Beitrag von fliegermichl »

Timm Thaler hat geschrieben:
Do 24. Sep 2020, 09:06
fliegermichl hat geschrieben:
Do 24. Sep 2020, 05:56
Was wenn ich erreichen will, daß das in jedem Fall funktioniert - egal über welchem Control die Maus steht.
Warum nicht jedem gewünschten Control die Prozedur zuweisen?
Weil ich in aller Regel ein fauler Mensch bin. Wenn ich festlege: "Mit Ctrl + Mausrad hat sich der Faktor zu ändern, sonst nichts.", dann will ich das normalerweise nur einmal tun müssen.

Sieben
Beiträge: 202
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
CPU-Target: i386

Re: Parameter mit Mausrad einstellen

Beitrag von Sieben »

Faulheit find ich gut. :wink:

Antworten