السلام عليكم ورحمة الله
يعتبر التحكم في القوائم الطويلة (قوائم مع scroolbar) بواسطة عجلة الماوس MouseWheel مهما جدا، ومن ضمنها طبعا DBGrid، ولكن للأسف فـ DBGrid لاتدعمه بشكل كامل، أنظر إلى الصورة :
سنتابع في هذا الشرح كيفية إصلاح المشكلة. على بركة الله :
لكي تصبح الـ DBGrid تدعم الـ MouseWheel بشكل جيد نقوم باستبدال WindowProc الخاص بـ DBGrid بإجراء آخر من أجل معالجة الرسالة WM_MOUSEWHEEL
طبعا أول شيء أضف DBGrid و DateSource و...و...
ثانيا قم بإضافة التصريحين التاليين
type TForm1 = class(TForm) DBGrid1 : TDBGrid; ... private OldWindowProc: TWndMethod; // هذا Procedure DBGridNewWindowProc(var Msg: TMessage);// و هذا ... End;
ثم قم بإضافة الكود التالي إلى الحدث OnCreate للفورم
procedure TForm1.FormCreate(Sender: TObject); begin // حفظ إجراء WndProc الحالي لـ DBGrid1. OldWindowProc := DBGrid1.WindowProc; // إسناد الإجراء الجدبد. DBGrid1.WindowProc := DBGridNewWindowProc; end;
ثم نقوم بتعريف الإجراء الجديد الذي يقوم بتنفيذ الأمر Next للتقدم في الجدول عند دوران العجلة في اتجاه
والأمر Prior عند دورانها في الاتجاه الآخر
procedure TForm1.DBGridNewWindowProc(var Msg: TMessage); begin // تمييز الرسالة WM_MOUSEWHEEL. if Msg.Msg = WM_MOUSEWHEEL then begin if (DBGrid1.DataSource.DataSet.Active) then begin if SmallInt(Msg.WParamHi) < 0 then DBGrid1.DataSource.DataSet.Next // إلى الأسفل else DBGrid1.DataSource.DataSet.Prior;// إلى الأعلى end; Exit; end; //معالجة الرسائل الأخرى بالإجراء القديم وهذا ضروري OldWindowProc(Msg); end;
الخطوة الأخيرة وهي التنفيذ :D
والآن سوف تجد الماوسويل تعمل بشكل كامل
وفقكم الله والسلام عليكم