PDA

View Full Version : مشکل dbgrid با کلید وسط موس



matinebi
یک شنبه 18 مرداد 1388, 09:04 صبح
چطور میشه مشکل دی بی گرید رو با کلید وسط موس ،(که فقط تا فیلدهایی که در صفحه نشون میده میشه با کلید وسط موس پیمایش کرد و فیلدهایی که پایین تر هستند رو باید با اسکرول بار گرید دید)، حل کرد

حمیدرضاصادقیان
یک شنبه 18 مرداد 1388, 11:02 صبح
سلام.
http://www.swissdelphicenter.ch/en/showcode.php?id=2035
http://exampledelphi.com/delphi.php/tips-and-tricks/mouse-scroll-within-dbgrid/

matinebi
یک شنبه 18 مرداد 1388, 16:07 عصر
دوست عزیز بنده کد زیر رو استفاده کردم

{ - Here is tip how to scroll DBGrid -}

//...
private
OldGridProc: TWndMethod;
procedure GridWindowProc(var Message: TMessage);
//...

procedure TForm1.FormCreate(Sender: TObject);
begin
OldGridProc := DBGrid1.WindowProc;
DBGrid1.WindowProc := GridWindowProc;
end;

procedure TForm1.GridWindowProc(var Message: TMessage);
var
Pos: SmallInt;
begin
OldGridProc(Message);
if Message.Msg = WM_VSCROLL then //or WM_HSCROLL
begin
Pos := Message.WParamHi; //Scrollbox position
Table1.RecNo := Pos;
end;
end;

منتها فرقی نکرد باز هم کلید وسط موس نتوانست عمل اسکرول را انجام دهد و زمانی که روی اسکرول بار خود گرید کلید میکنم ارور زیر رو میده

Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another.

khorsandreza
دوشنبه 19 مرداد 1388, 00:28 صبح
جناب اقای صادقیان سلام
من هم تست کردم کار نمیکنه برای اسکرول با موس های غلطکی نیست برای نوعی موس قبل از این مدلها امده بود باید کلید را فشار میدادی صفحه نسبت به حرک ماوس شیفت میشد

khoshblagh
دوشنبه 19 مرداد 1388, 07:19 صبح
شما میتونید از کامپوننت dbgrideh استفاده نمائید.در این کامپوننت این مشکل وجود ندارد. موفق باشید.

حمیدرضاصادقیان
دوشنبه 19 مرداد 1388, 08:21 صبح
سلام. یک Application event روی فرم بذارید ودر رویداد onmessage کد زیر رو بنویسید.


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;

khorsandreza
دوشنبه 19 مرداد 1388, 11:49 صبح
سلام. یک Application event روی فرم بذارید ودر رویداد onmessage کد زیر رو بنویسید.


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;

اسکرول بار به مشکل خورد برای آن هم باید کار خاصی انجام داد؟

Hsimple11
دوشنبه 19 مرداد 1388, 12:47 عصر
قبلا بحث شده بود من یادمه. سوالات دیگه رو هم تاپیک جداگانه ای ایجاد کنید. البته بعد از جستجو.

matinebi
دوشنبه 19 مرداد 1388, 13:18 عصر
دوست عزیز بنده هر چی گشتم چیزی که قبلا در این ضمینه بحث شده باشه پیدا نکردم در ضمن سوالاتی که پرسیده شده در همین ضمینه بوده اند و نیازی به تاپیک جداگانه نیست
با تشکر از شما
-------------------------------------------------
دوست عزیزمان آقای حمیدرضاصادقیان مطلب بسیار خوب و مفیدی در پست 6 قرار دادند و مشکل برطرف شد ولی کاش توضیحی در مورد عملکرد این کد هم قرار میدادند تا کاملا با آن آشنا شوم

حمیدرضاصادقیان
پنج شنبه 22 مرداد 1388, 11:57 صبح
سلام.درمورد کد.
ببینید هرعملی که شما در برنامه انجام میدید به صورت یک Message به ویندوز ارسال میشه. شما وقتی داری از scroll موس استفاده میکنید پیغام wm_mousewheel ارسال میشه. ما در application event اومدیم در رویداد onmessage این message رو هندل کردیم. گه اگر این پیغام ارسال شد چه کاری انجام بده.
حالا در متغیر i مقدار wparam رو قرار میدیم.اگر بزرگتر از صفر بود یعنی به سمت بالا باید بره و اگر کوچکتر از صفر بود باید به سمت پایین بیاد.
بازم سوالی بود در خدمتم.
موفق باشید