Scrollrad und DBGrid



  • Hallo zusammen
    ist es möglich, dass Mausrad zum Scrollen in einem DBGrid zu benutzen?
    Wenn ich das Scrollrad benutze, kann ich zwar im aktiven Bereich scrollen. Gelangt die Zeilenmarkierung aber an den oberen oder unteren Rand, passiert nix mehr...
    Was kann man da machen?

    Vielen Dank für eine Antwort
    Christian



  • Hast du damals eine Lösung gefunden??

    Wenn ja würde ich diese gerne wissen!!

    Danke!
    Gruß Ralle



  • Hi,

    WM_MOUSEWHEEL

    1. neue Komponente... TMyDBGrid (TCustomDBGrid)

    /*---------- *.h -----------*/ 
    class PACKAGE TMyDBGrid : public TCustomDBGrid
    ...
    protected:
            BEGIN_MESSAGE_MAP
                    VCL_MESSAGE_HANDLER(WM_MOUSEWHEEL, TMessage, WMMouseWheel)
            END_MESSAGE_MAP(TCustomDBGrid)
            void __fastcall WMMouseWheel(TMessage &AMsg);
    
    /*---------- *.cpp -----------*/
    
    void __fastcall TMyDBGrid::WMMouseWheel(TMessage &AMsg)
    {
     if (DataSource && DataSource->DataSet && !DataSource->DataSet->IsEmpty())
      if (AMsg.WParam < 0)
       DataSource->DataSet->Next(); 
      else
       DataSource->DataSet->Prior(); 
    }
    

    2. method WindowProc

    /*---------- *.h -----------*/ 
    
            void __fastcall FormCreate(TObject *Sender);
            void __fastcall FormDestroy(TObject *Sender);
    private:
            TWndMethod OldWndProcDBGrid;
            void __fastcall NewWndProcDBGrid(TMessage &AMsg);
    
    /*---------- *.cpp -----------*/
    
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
     OldWndProcDBGrid = DBGrid1->WindowProc;
     DBGrid1->WindowProc = NewWndProcDBGrid;
    }
    
    void __fastcall TForm1::FormDestroy(TObject *Sender)
    {
     DBGrid1->WindowProc = OldWndProcDBGrid;
    }
    
    void __fastcall TForm1::NewWndProcDBGrid(TMessage &AMsg)
    {
     switch (AMsg.Msg)
      {
       case WM_MOUSEWHEEL :
        if (DBGrid1->DataSource && DBGrid1->DataSource->DataSet && !DBGrid1->DataSource->DataSet->IsEmpty())
         {
          if (AMsg.WParam < 0)
           DBGrid1->DataSource->DataSet->Next();
          else
           DBGrid1->DataSource->DataSet->Prior();
         }
        break;
       default : OldWndProcDBGrid(AMsg);
      }
    }
    

    [ Dieser Beitrag wurde am 24.02.2003 um 10:43 Uhr von Blazek Jaroslav editiert. ]



  • Eine Alternative wäre, eine Komponente von TCustomDBGrid abzuleiten und die DoMouseWheelDown-/DoMouseWheelUp-Methoden zu überschreiben, um das DataSet zu steuern.



  • Das gehört in die FAQ oder ??

    Danke noch mal!

    Gruß Ralle


Anmelden zum Antworten