ورود

View Full Version : dbgrid



Sohrab_Tapar
پنج شنبه 03 اسفند 1385, 11:25 صبح
من یک dbgrid دارم و میخواهم هر وقت رکورد انتخابی در آن تغییر میکنه یک سری عملیات خاص انجام بشه،مشکل اینه که نمیتونم تشخیص بدم که رکورد انتخاب شده عوض شده یا نه
من بر روی onkeyup و oncellclick مربوط به گرید کد هامو نوشتم ولی وقتی کرید رو اسکرول میکنم هیچ کدوم از این event ها اجرا نمیشه که البته طبیعیه ،از onupdatedata مربوط به dataset هم که استفاده میکنم یک مشکل دیگه وجود داره
به طور کلی رکورد hightlight شده در گرید با رکورد فعال میتونه فرق داشته باشه
یعنی اگر گرید در حالت rowselect باشه و indicator هم داشته باشه و شما با اسکرولر موس ،جدول رو اسکرول کنید،میبینید که رکورد فعال و رکورد highlight شده میتونن متفاوت باشن و این مطلوب نیست،

mzjahromi
پنج شنبه 03 اسفند 1385, 11:56 صبح
بهترین راه استفاده از یکی از رویدادهای DataSource است. اگه اشتباه نکنم OnDataChange بود

Sohrab_Tapar
جمعه 04 اسفند 1385, 11:48 صبح
منظور شما باید datasource.onupdatedata باشه اما یک همانطور که گفتم یک مشکل وجود داره
اگر گرید focus داشته باشه و شما با اسکرولر موس،گرید رد اسکرول کنید،رکورد انتخاب شده در گرید(رکورد highlight شده)عوض میشه ولی رکورد active در database عوض نمیشه
یعنی برنامه داره اطلاعات را از یک رکورد می خونه در صورتی که رکوردی که کاربر به عنوان رکورد فعال میبینه یک چیزه دیگه است
در حقیقت این یک bug در dbgrid ‌است

darvishiali
شنبه 05 اسفند 1385, 00:49 صبح
سلام؛

بهتره برای اینکار از رویداد AfterScroll دیتاست متصل به گریدتون استفاده کنید. در اینصورت با هرگونه تغییر حرکت بر روی رکوردها (چه توسط DBGrid و چه هر ابزار یا دستوری که روی دیتاست رکوردی رو جابجا کنه، با هر رویدادی) مشاهده میشه و در نظر گرفته میشه.

در ضمن، این نکته رو بگم که DBGrid برخلاف بسیاری از کامپوننتهای Data-Aware دیگه، قدرت بسیار زیاد و شگفت انگیزی داره! ( منبع : www.delphi.about.com (http://www.delphi.about.com) )

Sohrab_Tapar
شنبه 05 اسفند 1385, 01:25 صبح
AfterScroll زمانی اجرا میشه که رکورد فعال در دیتابیس عوض شه !!!!
رکورد انتخاب شده در گرید(رکورد highlight شده)عوض میشه ولی رکورد active در database عوض نمیشه
اگر رکورد فعال عوض می شد هزار روش وجود داشت ولی مشکل اینه که عوض نمیشه

mzjahromi
شنبه 05 اسفند 1385, 07:50 صبح
همون AfterScroll که دوستمون گفتن جواب میده + OnChangeData نه OnUpdateData

Sohrab_Tapar
شنبه 05 اسفند 1385, 13:07 عصر
هر 3 تا در صورت "تغییر رکورد" اجرا میشن ،اینو میدونم ولی سوال من چیز دیگری است
به هر حال متشکر از توجهتان

darvishiali
شنبه 05 اسفند 1385, 21:01 عصر
سلام؛

آقا یه کلمه بگو می خوام مشکل Scroll در DBGrid رو حل کنم!

یه ApplicationEvents از تب Additional بذار رو فرم اصلی برنامت. بعدش کد زیر رو توی Event OnMessage اون بنویس:



procedure TForm1.ApplicationEvents1Message
(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 داری، از Scroll ماوس استفاده کن.