delphi4arab منتديات دلفي للعرب
التعامل مع DBGrid بإستخدام زر الماوس الاوسط - نسخة قابلة للطباعة

+- delphi4arab منتديات دلفي للعرب (https://delphi4arab.net/forum)
+-- قسم : منتديات دلفي للعرب التعليمية (https://delphi4arab.net/forum/forumdisplay.php?fid=3)
+--- قسم : سؤال و جواب حول دلفي (https://delphi4arab.net/forum/forumdisplay.php?fid=15)
+--- الموضوع : التعامل مع DBGrid بإستخدام زر الماوس الاوسط (/showthread.php?tid=3028)

الصفحات: 1 2


التعامل مع DBGrid بإستخدام زر الماوس الاوسط - abdelmalek - 24-04-2011

السلام عليكم ورحمة الله وبركاته

ماهو الحدث المجود في الـ DBGrid الذي يتعامل مع زر الماوس الاوسط ؟؟!
بارك الله فيكم وسلام عليكم



التعامل مع DBGrid بإستخدام زر الماوس الاوسط - kachwahed - 24-04-2011

وعليكم السلام ورحمة الله وبركاته
الحدث OnMouseWheel من رسالة ويندوز WM_MOUSEWHEEL
يمكنك صنعه بنفسك، مثال:
PHP كود :
Author: Zarko Gajic

{
Mouse wheel behaves strangely with dbgrids - this code handler will correct this
behavior
.
Just drop a TApplication component on a form
}

procedure Application1.OnMessage
  
(var Msg: TMsg; var Handled: Boolean);
var
  
i: SmallInt;
begin
  
if Msg.message = WM_MOUSEWHEEL then
  begin
    Msg
.message := WM_KEYDOWN;
    
Msg.lParam := 0;
    
i := HiWord(Msg.wParam);
    if 
i > 0 then
      Msg
.wParam := VK_UP
    
else
      
Msg.wParam := VK_DOWN;

    
Handled := False;
  
end;
end; 
هناك مواضيع في المنتدى حول ذلك...
بالتوفيق.



التعامل مع DBGrid بإستخدام زر الماوس الاوسط - abdelmalek - 24-04-2011

بارك الله فيك أستاذي الكريم

لكن لم تعمل معي.
قمت بوضع هذا الكود داخل الحدث OnMouseWheel لكن كان شيئا لم يحدث

PHP كود :
TC.Filter:='TC_TG_ID='+inttostr(TGTG_ID.AsInteger);
  
TC.Filtered:=True;

  
edt1.Text:=TGTG_NOM.Value;
  
sbtn1.Caption:='Modifier';
  
sbtn1.ImageIndex:=1;
  
sbtn3.Enabled:=True; 

إين الخلل ؟؟
لتوضيح : اقصد بزر الماوس الاوسط هو ذلك الدي يدور



التعامل مع DBGrid بإستخدام زر الماوس الاوسط - وليد - 24-04-2011

السلام عليكم
إذا كنت تقصد استعمال زر الماوس الوسط للإنتقال بين السجلات ففي المرفقات مثال على ذلك وإن كنت تقصد غير ذلك فلا أدري
PHP كود :
procedure TForm1.DBGrid1MouseWheelDown(Sender: TObject; Shift: TShiftState;
  
MousePos: TPoint; var Handled: Boolean);
begin
adotable1
.Next;
end; 
وفق الله الجميع


التعامل مع DBGrid بإستخدام زر الماوس الاوسط - kachwahed - 24-04-2011

إقتباس :قمت بوضع هذا الكود داخل الحدث OnMouseWheel لكن كان شيئا لم يحدث
هذا الحدث غير متوفر في المكون TDBGrid الأصلي، عليك برمجته بنفسك

طريقة أخرى للتأثير على كامل المشروع:
عرف في القسم public لأي نموذج، وليكن TForm1 مثلا:
PHP كود :
public
  
procedure OnMessage(var Msg: TMsg; var Handled: Boolean); 
مضمون الحدث:
PHP كود :
procedure TForm1.OnMessage(var Msg: TMsg; var Handled: Boolean);
var
  
i: SmallInt;
begin
  
if Msg.message = WM_MOUSEWHEEL then begin
    Msg
.message := WM_KEYDOWN;
    
Msg.lParam := 0;
    
i := HiWord(Msg.wParam);
    if 
i > 0 then
      Msg
.wParam := VK_UP
    
else
      
Msg.wParam := VK_DOWN;
    
Handled := False;
  
end;
end; 
ثم أضف في ملف المشروع (dpr.*) الآتي:
كود :
Application.Initialize; [color=Blue] Application.OnMessage := Form1.OnMessage;[/color] Application.CreateForm(TForm1, Form1);
باختصار، ما فعلناه هو اقتناص حدث تدوير عجلة الماوس إلى الأعلى وإلى الأسفل
وإرسال حدثين بدلا من ذلك هما ضغط المفتاح "فوق" (VK_UP) و"تحت" (VK_DOWN) على التوالي

أما إن كنت تقصد حدث النقر على الزر الأوسط (وليس تدوير العجلة)
فهذا ممكن باستخدام Button: TMouseButton من خلال OnMouseDown أو OnMouseUp
كود :
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Button = mbMiddle then ShowMessage('Mouse Middle button clicked!'); end;
ولا أنصح بذلك...
بالتوفيق.



التعامل مع DBGrid بإستخدام زر الماوس الاوسط - abdelmalek - 24-04-2011

أستاذي يوجد عندي الحدث (استعمل sdbgrid التابع لي alphaskin)
[صورة: attachment.php?attachmentid=2611&stc=1&d=1272129212]
توقف اللسان عن التعبير(الله ينورك)


التعامل مع DBGrid بإستخدام زر الماوس الاوسط - abdelmalek - 24-04-2011

أستاذي لقد قمت بتعامل مع الاحداث التالية :

PHP كود :
procedure TStockFrm.sDBGrid1KeyDown(Sender: TObject; var Key: Word;
  
Shift: TShiftState);
begin
  TC
.Filter:='TC_TG_ID='+inttostr(TGTG_ID.AsInteger);
  
TC.Filtered:=True;

  
edt1.Text:=TGTG_NOM.Value;
  
sbtn1.Caption:='Modifier G';
  
sbtn1.ImageIndex:=1;
  
sbtn3.Enabled:=True;
end; 
PHP كود :
procedure TStockFrm.sDBGrid1KeyUp(Sender: TObject; var Key: Word;
  
Shift: TShiftState);
begin
  TC
.Filter:='TC_TG_ID='+inttostr(TGTG_ID.AsInteger);
  
TC.Filtered:=True;

  
edt1.Text:=TGTG_NOM.Value;
  
sbtn1.Caption:='Modifier G';
  
sbtn1.ImageIndex:=1;
  
sbtn3.Enabled:=True;
end; 
PHP كود :
procedure TStockFrm.sDBGrid1MouseWheel(Sender: TObject; Shift: TShiftState;
  
WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin
  TC
.Filter:='TC_TG_ID='+inttostr(TGTG_ID.AsInteger);
  
TC.Filtered:=True;

  
edt1.Text:=TGTG_NOM.Value;
  
sbtn1.Caption:='Modifier G';
  
sbtn1.ImageIndex:=1;
  
sbtn3.Enabled:=True;
end; 

الحمد الله عملت لكن خرج لي مشكل اخر وهو :
-عند تدوير الزر الى الاسفل يصبح يشير الى السجل الثاني لكن العملية تجرا على السجل الاول و العكس صحيح هههههههه هبلني :angry:



التعامل مع DBGrid بإستخدام زر الماوس الاوسط - abdelmalek - 24-04-2011

في المرفق فيديو يظهر المشكلة


التعامل مع DBGrid بإستخدام زر الماوس الاوسط - kachwahed - 24-04-2011

إقتباس :أستاذي يوجد عندي الحدث (استعمل sdbgrid التابع لي alphaskin)
قلت المكون TDBGrid الأصلي، هذا معدّل
لم تقل في البداية ذلك، وإلا لكان هناك ربما حل آخر...

إقتباس :إذا كنت تقصد استعمال زر الماوس الوسط للإنتقال بين السجلات
تم إصلاح هذا الخلل في إصدارات دلفي الأخيرة فلا داعي لذلك (2009 فما فوق -على الأقل-)

إقتباس :الحمد الله عملت لكن خرج لي مشكل اخر وهو :
لا تستخدم هذه الأحداث sDBGrid1KeyUp، sDBGrid1KeyDown خاصة sDBGrid1MouseWheelUp



التعامل مع DBGrid بإستخدام زر الماوس الاوسط - abdelmalek - 24-04-2011

أستاذي لقد قمت بتعديل المشاركة السابقة وهل رئية الفيديو
وما هو الحل ؟؟؟؟