![]() |
Scrollen per Mausrad im DBGrid
Wie einige ja bemerkt haben werden, ist das Scrollen per Mausrad im TDBGrid nicht von Haus aus möglich. Da dies aber ein wenig nervig ist, wird oft die Methode MouseWheelHandler des Forms überschrieben. Um nun nicht immer den Code an die Anzahl der DBGrids und deren Namen anpassen zu müssen, habe ich mir Folgendes überlegt:
Delphi-Quellcode:
Was der Code macht: Er geht alle Komponenten auf der Form durch und und überprüft ob diese DBGrids sind, ist das der Fall, wird überprüft ob dieses DBGrid den Fokus besitzt und dann wird gescrollt. Wurde kein passendes DBGrid gefunden wird inherited aufgerufen.
procedure TForm1.MouseWheelHandler(var Message: TMessage);
var i: Integer; handled: Boolean; myDBGrid: TDBGrid; begin handled := false; // Wir kümmern uns drum, also Message erstmal einen Result zuweisen Message.Result := -1; i := 0; // alle Komponenten iterieren, solange das gesuchte Grid nicht gefunden wurde while (i < ComponentCount) and not handled do begin // aktuelle Komponenten ein DBGrid? if Components[i].ClassNameIs('TDBGrid') then begin myDBGrid := TDBGrid(Components[i]); // Hat dieses DBGrid den Fokus und hat eine DataSource zugewiesen? if myDBGrid.Focused and (myDBGrid.DataSource <> nil) then begin // "Unser" DBGrid gefunden, also den Datensatzzeiger anhand des WParams scrollen if (Message.WParam > 0) then myDBGrid.DataSource.DataSet.Prior else myDBGrid.DataSource.DataSet.Next; // wir haben unsern Job erledigt handled := true; end; end; inc(i); end; // anscheinend war keines unserer DBGrid fokussiert, oder das fokussierte DBGrid hatte keine DataSource, also geerbten MouseWheelHandler aufrufen if not handled then inherited; end; Natürlich muss diese Prozedur auch im interface der Form deklariert werden:
Delphi-Quellcode:
Das Schlüsselwort override dient wie oben bereits erwähnt zum Überschreiben des MouseWheelHandler von TForm.
procedure MouseWheelHandler(var Message: TMessage); override;
Eine mögliche Optimierung wäre im OnActivate der Form alle Komponenten zu iterieren, alle DBGrids in ein Set, ein Array oder eine List zu packen und im MousWheelHandler nur noch diese zu iterieren. Hoffe, dass der Code noch mal wem hilft außer mir ;-) //Edit wegen der min. Delphi-Version: Ich habe jetzt 5 angegeben, da ich dies nur mit Versionen >= 5 getestet habe. Sollte jemand das auch für Delphi 4 oder niedriger bestätigen können, würde ich mich über eine nachricht freuen. Auch andere Verbesserungsvorschläge und konstruktive Kritik sind natürlich willkommen :) |
Re: Scrollen per Mausrad im DBGrid
Man kann dieses Verhalten auch für die gesamte Anwendung programmieren.
Delphi-Quellcode:
Beim Programmstart muss der Message-Handler "eingeklickt" werden:
procedure THauptForm.HandleOnMessage(var Msg: TMsg; var Handled: Boolean);
begin case Msg.message of WM_MOUSEWHEEL: begin if (Screen.ActiveForm.ActiveControl <> nil) and (Screen.ActiveForm.ActiveControl.ClassName = 'TDBGrid') then begin // die Mousewheel Message wird in einen Tastendruck umgewandelt Msg.message := WM_KEYDOWN; Msg.lParam := 0; if Msg.wParam > 0 then Msg.wParam := VK_UP else Msg.wParam := VK_DOWN; // wir sind noch nicht fertig, schliesslich soll der Tastendruck ausgewertet werden Handled := False; end; end; end; end;
Delphi-Quellcode:
procedure THauptForm.CreateForm(Sender:tObject);
begin Application.OnMessage := self.HandleOnMessage; end; |
Re: Scrollen per Mausrad im DBGrid
Hui! Das nen ich mal kurz und knackig :) Und schon wieder was neues gelernt :) alleine schon ActiveControl würde meinen Code wesentlich optimieren ;-) Aber auch deine Behandlung der Message ist wohl etwas schöner, nicht so brachial wie meine Methode ;-)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:42 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz