Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Mausrad mit Label, Scrollbar, etc. benutzen (https://www.delphipraxis.net/59169-mausrad-mit-label-scrollbar-etc-benutzen.html)

kurtm1 18. Dez 2005 17:58


Mausrad mit Label, Scrollbar, etc. benutzen
 
Also es geht darum, mit dem Mausrad verschiedenen Aktionen zu setzen.

Zum Beispiel möchte ich den Wert einer Scrollbar mit dem Mausrad verändern können.
Weiters soll eine Aktion ausgelöst werden, wenn ich mit dem Cursor über einem normalen Label bin, und micht mit dem Mausrad spiele.

Wie kann das realisiert werden?

thx

SirThornberry 18. Dez 2005 18:09

Re: Mausrad mit Label, Scrollbar, etc. benutzen
 
das Form hat entsprechende Mausradereignisse. Du musst also nur innerhalb dieses Ereignisses prüfen welches Control sich unter dem Cursor befindet und kannst dementsprechend reagieren. Wenn du selbst komponenten schreibst brauchst du auch einfach nur die Messages abfangen. Allerdings ist dort vorraussetzung dass, das control den Focus hat und somit würde das Label ausscheiden und man müsste zuvor auch erst die entsprechende Komponente anklicken oder per tab wählen damit diese den focus bekommt.

kurtm1 18. Dez 2005 19:05

Re: Mausrad mit Label, Scrollbar, etc. benutzen
 
Zitat:

Zitat von SirThornberry
das Form hat entsprechende Mausradereignisse. Du musst also nur innerhalb dieses Ereignisses prüfen welches Control sich unter dem Cursor befindet und kannst dementsprechend reagieren.

Das war mir auch klar, nur weiß ich eben nicht, wie ich abfragen kann, welches Objekt jetzt unter dem Cursor ist..

kurtm1 20. Dez 2005 12:50

Re: Mausrad mit Label, Scrollbar, etc. benutzen
 
push

hat wer eine idee/lösung?

ichbins 20. Dez 2005 12:55

Re: Mausrad mit Label, Scrollbar, etc. benutzen
 
Angeblich gibt es ja die Eigenschaften

Delphi-Quellcode:
form1.left
form1.top
scrollbar1.left
scrollbar1.top
scrollbar1.height
scrollbar1.width

mouse.x
mouse.y
wie das aussieht wenn das form selbst auch nur in ein anderes eingebettet ist weiss ich nicht :gruebel:

kurtm1 20. Dez 2005 13:10

Re: Mausrad mit Label, Scrollbar, etc. benutzen
 
ok das würde schon gehen, ist aber wohl sehr sehr umständlich..


//EDIT: Hier mal mein Code, habe jetzt alles mal in eine Funktion verpackt:

Delphi-Quellcode:
function MouseWheel (Sender:TControl;WheelDelta:Integer;MousePos:TPoint):shortint;
begin
        if (Mousepos.X-Form1.Left>=Sender.Left) and (MousePos.X-Form1.Left<=Sender.Left+Sender.Width) and
        (MousePos.Y-form1.Top>=Sender.Top) and (MousePos.Y-form1.Top<=Sender.Top+Sender.Height) then
        begin
        if WheelDelta>0 then Result:=1
        else
        Result:=-1;
        end
        else
        result:=0;
end;
Aufgerufen wird das dann im "TForm1.FormMouseWheel" Event:
Delphi-Quellcode:
procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState;
  WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin
        ScrollBar1.Position:=ScrollBar1.Position+MouseWheel(ScrollBar1,WheelDelta,MousePos);
        ScrollBar2.Position:=ScrollBar2.Position+MouseWheel(ScrollBar2,WheelDelta,MousePos);
end;
Sollte denk ich klar sein. Das einzige was man noch beachten muss: Wenn man die Funktion so verwendet wie ich sie oben habe, muss auf der Form "bsstyle=bsnone" eingestellt werden, sonst stimmen die Y Werte der Objekte nicht. (Dies hängt mit der Titelleiste zusammen)

kurtm1 26. Dez 2005 22:36

Re: Mausrad mit Label, Scrollbar, etc. benutzen
 
für alle hier nochmal die Version mit korrigierten Y Werten, daher kann die Form jetzt ganz normal mit bsSingle verwendet werden:

Delphi-Quellcode:
function MouseWheel (Sender:TControl;WheelDelta:Integer;MousePos:TPoint):shortint;
begin
        if (Mousepos.X-Form1.Left>=Sender.Left) and (MousePos.X-Form1.Left<=Sender.Left+Sender.Width) and
        (MousePos.Y-form1.Top>=Sender.Top+GetSystemMetrics(4)) and (MousePos.Y-form1.Top<=Sender.Top+Sender.Height+GetSystemMetrics(4)) then
        begin
        if WheelDelta>0 then Result:=-1
        else
        Result:=1;
        end
        else
        result:=0;
end;

Sharky 27. Dez 2005 08:22

Re: Mausrad mit Label, Scrollbar, etc. benutzen
 
Hai kurtm1,

was häst Du denn von diesem Lösungsansatz?:
Delphi-Quellcode:
procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState;
  WheelDelta: integer; MousePos: TPoint; var Handled: boolean);
const
  DeltaDiv = 20;
var
  ControlOnMouse: TControl;
begin
  ControlOnMouse := ControlAtPos(ScreenToClient(MousePos), False, True);
  if (ControlOnMouse is TScrollBar) then // Für alle Scrollbars
  begin
    with (ControlOnMouse as TScrollBar) do
    begin
      Position := Position - (WheelDelta div DeltaDiv);
    end;
  end;
  if (ControlOnMouse = Label1) then // Nur für Label1
  begin
    with (ControlOnMouse as TLabel) do
    begin
      Label1.Caption := IntToStr(StrToInt(Label1.Caption) + WheelDelta);
    end;
  end;
end;

kurtm1 27. Dez 2005 08:39

Re: Mausrad mit Label, Scrollbar, etc. benutzen
 
hmm sieht auch gut aus und funzt auch problemlos

kürzer ist es auch noch

perfekt :D


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:00 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz