AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Library: VCL / WinForms / Controls Delphi Scrollen per Mausrad im DBGrid
Thema durchsuchen
Ansicht
Themen-Optionen

Scrollen per Mausrad im DBGrid

Ein Thema von Thanatos81 · begonnen am 16. Sep 2006 · letzter Beitrag vom 18. Sep 2006
Antwort Antwort
Thanatos81
(Gast)

n/a Beiträge
 
#1

Scrollen per Mausrad im DBGrid

  Alt 16. Sep 2006, 18: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
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

Re: Scrollen per Mausrad im DBGrid

  Alt 18. Sep 2006, 16:16
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;
Andreas
  Mit Zitat antworten Zitat
Thanatos81
(Gast)

n/a Beiträge
 
#3

Re: Scrollen per Mausrad im DBGrid

  Alt 18. Sep 2006, 16:22
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
  Mit Zitat antworten Zitat
Antwort Antwort

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:49 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