Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Library: VCL / WinForms / Controls (https://www.delphipraxis.net/24-library-vcl-winforms-controls/)
-   -   Delphi Scrollen per Mausrad im DBGrid (https://www.delphipraxis.net/77230-scrollen-per-mausrad-im-dbgrid.html)

Thanatos81 16. Sep 2006 17:27


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:
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:
Delphi-Quellcode:
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 :)

shmia 18. Sep 2006 15:16

Re: Scrollen per Mausrad im DBGrid
 
Man kann dieses Verhalten auch für die gesamte Anwendung programmieren.
Delphi-Quellcode:
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;
Beim Programmstart muss der Message-Handler "eingeklickt" werden:
Delphi-Quellcode:
procedure THauptForm.CreateForm(Sender:tObject);
begin
   Application.OnMessage := self.HandleOnMessage;
end;

Thanatos81 18. Sep 2006 15:22

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 00:06 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