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 TCategoryPanelGroup, MouseWheel, Scroll? (https://www.delphipraxis.net/191873-tcategorypanelgroup-mousewheel-scroll.html)

Codehunter 27. Feb 2017 07:41


TCategoryPanelGroup, MouseWheel, Scroll?
 
Moinsen!

Ja was soll ich sagen? Die Überschrift sagt eigentlich schon alles aus: Wie bekommt man ein TCategoryPanelGroup dazu, auf ein MouseWheel hin zu reagieren?

Grüße
Cody

EDIT: Ich habe jetzt mal einen Tip aus Stackoverflow adaptiert, scheint (vorerst) zu funktionieren:
Delphi-Quellcode:
procedure TForm5.FormMouseWheel(Sender: TObject; Shift: TShiftState;
  WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
var
  I: Integer;
begin
  Handled := PtInRect(CategoryPanelGroup1.ClientRect, CategoryPanelGroup1.ScreenToClient(MousePos));
  if Handled then begin
    for I := 1 to Mouse.WheelScrollLines do
    try
      if WheelDelta > 0 then
        CategoryPanelGroup1.Perform(WM_VSCROLL, SB_LINEUP, 0)
      else
        CategoryPanelGroup1.Perform(WM_VSCROLL, SB_LINEDOWN, 0);
    finally
      CategoryPanelGroup1.Perform(WM_VSCROLL, SB_ENDSCROLL, 0);
    end;
  end;
end;

NoGAD 19. Jan 2022 14:33

AW: TCategoryPanelGroup, MouseWheel, Scroll?
 
Hallo, dieser Beitrag ist zwar schon sehr alt, nur als generische Lösung habe ich noch eine Änderung.


Statt das Ereignis in der Form auszuwerten und für jedes TCategoryPanelGroup einzeln anzusteuern, kann die Prüfung auch im Ereignis der Komponente selbst erfolgen. Wichtig ist, dass das Form-Ereignis trotzdem Priorität gegenüber diesem hier hat.

Delphi-Quellcode:
procedure TForm1.CategoryPanelGroup1MouseWheel(Sender: TObject;
  Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint;
  var Handled: Boolean);
var
  i: Integer;
  DummyComponent: TComponent;
begin
  DummyComponent := Sender as TComponent;
  if DummyComponent is TCategoryPanelGroup then
  begin
    Handled := PtInRect((DummyComponent as TCategoryPanelGroup).ClientRect,
      (DummyComponent as TCategoryPanelGroup).ScreenToClient(MousePos));
    if Handled then
    begin
      for i := 1 to Mouse.WheelScrollLines do
        try
          if WheelDelta > 0 then
            (DummyComponent as TCategoryPanelGroup)
              .Perform(WM_VSCROLL, SB_LINEUP, 0)
          else
            (DummyComponent as TCategoryPanelGroup)
              .Perform(WM_VSCROLL, SB_LINEDOWN, 0);
        finally
          (DummyComponent as TCategoryPanelGroup).Perform(WM_VSCROLL,
            SB_ENDSCROLL, 0);
        end;
    end;
  end;
end;
Hierbei könnte m.M.n sogar die Prüfung des Mauszeigers weggelassen werden, da es sich ja um das gewünschte Objekt handelt ( if DummyComponent is TCategoryPanelGroup then )
Delphi-Quellcode:
    Handled := PtInRect((DummyComponent as TCategoryPanelGroup).ClientRect,
      (DummyComponent as TCategoryPanelGroup).ScreenToClient(MousePos));

LG Mathias

himitsu 19. Jan 2022 15:25

AW: TCategoryPanelGroup, MouseWheel, Scroll?
 
Reicht es nicht das EndScroll einmal nach allen LineUp/LineDown zu machen?
(For in das Try-Finally)

NoGAD 19. Jan 2022 16:35

AW: TCategoryPanelGroup, MouseWheel, Scroll?
 
Du hast Recht. Das habe ich nicht beachtet, weil ich den vorherigen Code einfach abgeändert hatte.

Danke :-)

LG Mathias


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