PDA

View Full Version : خنثی کردن عمل Scrollدر یک DBGrid؟



SYNDROME
جمعه 29 تیر 1386, 09:07 صبح
با سلام
دوستان من یک Gridدر یک صفحه قرار داده ام و آن را به یک ADOوصل کردم ام و حالا می خواهم کاربر را در Reccord شماره 10 نگه دارم و اجازه حرکت به آن بر روی سطری ندهم ولی بتواند در ستونها آن رکورد بخصوص حرکت کند؟(یعنب عملاً Scrollدر یک ADOخثنی شود)
با تشکر از دوستان
منتظر راهنمایی شما هستم.

vcldeveloper
جمعه 29 تیر 1386, 10:21 صبح
در رویداد BeforeScroll اون DataSet بنویسید Abort;

SYNDROME
جمعه 29 تیر 1386, 12:10 عصر
با سلام
دستتون درد نکنه مشکل حل شد.
فقط می توانید کاری را که دستور Abortمی کند توضیح دهید.
با تشکر

ghabil
جمعه 29 تیر 1386, 14:45 عصر
Abort مثل یک Exception خاموش هست ، یعنی Stack دستورات رو بجز Finally ها خالی میکنه و بعدش دیگه هیچ دستوری اجرا نمیشه ، در این مورد کار تو هم موجب میشه که دستورات بعدی که توی کد دلفی برای جابجا شدن هستند انجام نشوند .
اما به طور کلی و بقول معروف استفاده از Abort در بین کدهایی که ازشون خبر نداریم "خطرناکه حسن" برای اینکه معلوم نیست جلوی انجام چه اتفاقاتی رو میگیریم که ممکنه اصلا به کاری که ما میخواهیم انجام بدیم هم ربطی نداشته باشند و برای کامل کردن سایر قعالیتها باشند، البته در این مورد خاص فکر نمیکنم مشکلی پیش بیاد و این کد برای تو کامل جواب میده ، اما مثلا میتونی از یک کد اینطوری ساده هم استفاده کنی : روی OnAfterScroll دیتاست بنویسی :


DataSet.RecNo := LockNo;

که توی LockNo هم شماره رکوردی که میخوای روش قفل کنی رو نشون بدی....

vcldeveloper
شنبه 30 تیر 1386, 03:10 صبح
Abort مثل یک Exception خاموش هست ، یعنی Stack دستورات رو بجز Finally ها خالی میکنه و بعدش دیگه هیچ دستوری اجرا نمیشه ، در این مورد کار تو هم موجب میشه که دستورات بعدی که توی کد دلفی برای جابجا شدن هستند انجام نشوند .
کاملا درسته.

مثلا میتونی از یک کد اینطوری ساده هم استفاده کنی : روی OnAfterScroll دیتاست بنویسی :
کد:
DataSet.RecNo := LockNo;
که توی LockNo هم شماره رکوردی که میخوای روش قفل کنی رو نشون بدی....

اما نوشتن کد در OnAfterScroll به اون صورت موجب ایجاد یک حلقه بی پایان میشه.

ghabil
شنبه 30 تیر 1386, 18:35 عصر
نه عزیز به خاطر کد (Value <> RecNo) توی SetRecNo توی لوپ نمیفته ، اما اگر هم میفتاد راه حلش یک Flag پرایویت بود ، خودت که اینکاره ای دیگه ;)

vcldeveloper
یک شنبه 31 تیر 1386, 03:40 صبح
نه عزیز به خاطر کد (Value <> RecNo) توی SetRecNo توی لوپ نمیفته
میافته. باعث میشه که AfterScroll مرتبا فراخوانی بشه و در گرید پرش بوجود میاره.

اه حلش یک Flag پرایویت بود
درسته، منظور این بود که هر تغییری در RecNo در داخل AfterScroll موجب فراخوانی مجدد AfterScroll میشه.

ghabil
یک شنبه 31 تیر 1386, 10:41 صبح
عجیبه من که تست هم کردم نیفتاد! کدش رو نگاه کن :



این BDE
procedure TBDEDataSet.SetRecNo(Value: Integer);
begin
CheckBrowseMode;
if (FRecNoStatus = rnParadox) and (Value <> RecNo) then
begin
DoBeforeScroll;
if DbiSetToSeqNo(Handle, Value) = DBIERR_NONE then
begin
Resync([rmCenter]);
DoAfterScroll;
end;
end;
end;

و این ADO

procedure TCustomADODataSet.SetRecNo(Value: Integer);
begin
if RecNo <> Value then
begin
DoBeforeScroll;
Recordset.AbsolutePosition := Value;
Resync([rmCenter]);
DoAfterScroll;
end;
end;


دفعه اول که RecNo رو ست میکنی مثلا عدد 2 ، دوباره AfterScroll صدا زده میشه و دوباره ست میکندشبه 2 ، اما اینبار چون RecNo با Value که قبلا ست شده برابر هست پس دیگه شرط برقرار نیست و صدا زده نمیشه .

vcldeveloper
یک شنبه 31 تیر 1386, 12:40 عصر
درسته، من وقتی داشتم تست می کردم از ترکیب BeforeScroll و AfterScroll به شکل نادرستی استفاده کردم که موجب Freeze شدن برنامه شد. بخاطر همین هم گفتم که تغییر RecNo در AfterScroll موجب ایجاد Infinitive Loop میشه، اما الان که دوباره تست کردم دیدم درسته و مشکل از کد قبلی من بود.
مرسی