Einzelnen Beitrag anzeigen

Thanatos81
(Gast)

n/a Beiträge
 
#1

Scrollen per Mausrad im DBGrid

  Alt 16. Sep 2006, 17:27
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
  Mit Zitat antworten Zitat