Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Mausrad für nicht fokussierte Komponente (https://www.delphipraxis.net/145171-mausrad-fuer-nicht-fokussierte-komponente.html)

anse 25. Dez 2009 07:22


Mausrad für nicht fokussierte Komponente
 
Ich möchte z.B. ein TVirtualStringTree vom Mausrad scrollen lassen, was bisher nur funktioniert wenn es den Fokus hat. Gibt es Ideen wie man das auch für eine beliebige Komponente auf einer Form schafft, die sich unter der Maus befindet aber keinen Fokus hat?

kitprog 25. Dez 2009 08:44

Re: Mausrad für nicht fokussierte Komponente
 
Hallo anse,

ich habe mir gerade gestern, Folgendes zusammengetüftelt:

Delphi-Quellcode:
procedure TfrmTest.FormMouseWheel(Sender: TObject; Shift: TShiftState;
  WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin
  if PtInRect(ScrollBoxTest.ClientRect, ScrollBoxTest.ScreenToClient(Mouse.CursorPos)) then
  begin
    if WheelDelta >0 then
      ScrollBoxTest.VertScrollBar.Position := ScrollBoxTest.VertScrollBar.Position - TestGroesse;
    if WheelDelta <0 then
      ScrollBoxTest.VertScrollBar.Position := ScrollBoxTest.VertScrollBar.Position + TestGroesse;
  end;
  Handled := True;
end;
Frohe Weihnachten :xmas:

anse 26. Dez 2009 07:47

Re: Mausrad für nicht fokussierte Komponente
 
Ah, richtig, die Form bekommt den OnMouseWheel event ja zuerst. Danke für den Tip!

Jetzt zeigt das VirtualStringTree nur merkwürdige Effekte bei
Delphi-Quellcode:
VT.ScrollBy(WheelDelta)
aber das ist ein anderes Problem...

anse 27. Dez 2009 07:20

Re: Mausrad für nicht fokussierte Komponente
 
Mit VT.OffsetY klappts:
Delphi-Quellcode:
procedure TMainForm.FormMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint;
  var Handled: Boolean);
var
  Control: TWinControl;
  VT: TBaseVirtualTree;
begin
  // TODO: Does not work when a SynMemo has focus, probably related to the broken solution of this issue:
  // [url]http://sourceforge.net/tracker/index.php?func=detail&aid=1574059&group_id=3221&atid=103221[/url]
  Control := FindVCLWindow(MousePos);
  if (Control is TBaseVirtualTree) and (not Control.Focused) and PtInRect(Control.ClientRect, Control.ScreenToClient(MousePos)) then begin
    VT := Control as TBaseVirtualTree;
    VT.OffsetY := VT.OffsetY + (WheelDelta div 2); // Don't know why, but WheelDelta is twice as big as it normally appears
    VT.UpdateScrollBars(True);
    Handled := True;
  end else
    Handled := False;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:31 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