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.
Hier ist noch das ganze Projekt als zip: