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:
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;
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.
Natürlich muss diese Prozedur auch im interface der Form deklariert werden:
procedure MouseWheelHandler(var Message: TMessage); override;
Das Schlüsselwort override dient wie oben bereits erwähnt zum Überschreiben des MouseWheelHandler von TForm.
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