من می خواهم در DBGrid وقتی ردیفی Insert یا Edit شد دیگر کاربر نتواند روی ردیف دیگری برود تا زمانیکه این ردیف Post یا Cancel شود.
من می خواهم در DBGrid وقتی ردیفی Insert یا Edit شد دیگر کاربر نتواند روی ردیف دیگری برود تا زمانیکه این ردیف Post یا Cancel شود.
سلام :
کنترل کردن حرکت روی ردیف های جدول یکم سخته چون هم صفحه کلید و هم موس در کار هستند .
برای این کاری که شما می خوای انجام بدی میتونی یه متغییر داشته باشی و با اون وضعیت Insert, Edit, Post داده ها رو بررسی کنی و متناسب با اون کلید های مکان نمای صفحه کلید رو کنترل کنی .
procedure TForm1.DBGridEh1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (Edit_Or_Insert = True) and ((key = 38) or (key = 40)) then
Key:=0;
end;
ماوس را چکار باید کرد؟
فکر می کنم باید یک جوری ClientDataSet را کاری کرد که Scroll نشود.
خب در عمل هم همینطوره دیگه! وقتی رکوردی به حالت Edit\Insert میره، حرکت به رکورد بعدی به طور خودکار موجب Post شدن تغییرات میشه، و شما نمی تونید از یک رکورد به رکورد دیگه برید بدون این که تکلیف تغییرات در رکورد موجود را مشخص کنید (تغییرات را Post یا Cancel کنید).من می خواهم در DBGrid وقتی ردیفی Insert یا Edit شد دیگر کاربر نتواند روی ردیف دیگری برود تا زمانیکه این ردیف Post یا Cancel شود.
اگر میخواید قبل از اعمال تغییرات مقادیری را بررسی کنید، و نسبت به صحت آنها مطمئن بشید، و سپس اجازه حرکت به رکورد بعدی را بدید، می تونید این کار را از طریق رویداد OnBeforePost انجام بدید. نیازی نیست روی DBGrid برای این کار وقت صرف کنید.
وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.
فقط زماني که کاربر روي دکمه تاييد جهت Post يا روي دکمه لغو جهت Cancel کليک کند تغييرات ثبت يا لغو شود و اصلا کاربر روي رکورد ديگر چه با صفحه کليد يا ماوس نتواند برود.
متاسفانه از يک رکورد به رکورد ديگر راحت مي رود و تغييرات را در ClientDataSet ذخيره مي کند با نوشتن کد ClientDataSet1.Cancel يا ClientDataSet1.Post در پروسيجر ClientDataSet1BeforePost اين مشکل حل نمي شود چون نمي خواهم از يک رکورد به رکورد ديگر برود و تغييرات ذخيره / لغو شود بلکه مي خواهم کاربر از رکورد به رکورد ديگر برود بلکه فقط با کليک کردن روي دکمه تاييد يا لغو تغييرات ثبت يا لغو شده و آنگاه بتواند روي رکورد ديگري برود.
آخرین ویرایش به وسیله rezamahdizadeh : چهارشنبه 05 مرداد 1390 در 22:13 عصر
یک پیشنهاد.
چرا شما یک کار دیگه نمی کنید؟
یک panel بگذارید روی فرم و در اون یک edit باشه.
وقتی روی گرید enter زد panel رو show کنید.
روی panel هم دکمه ذخیره و انصراف بگذارید...
این برای وقتی هست که ستونها جدا جدا باید confirm شن.
برای حالتی هم که می خواهید تمام سطر یکباره confirm شه مثلا یک فرم جدا بگذارید یا روی panel چند تا edit دیگه برای سایر فیلد ها..
همون طور که جناب کشاورز فرمودند خیلی وقت صرف خود گرید نکنید..
توابع تبدیل تاریخ با دقت 5000 سال
پذیرش پروژه، کامپوننت، آموزش برنامه نویسی (دلفی، اس کیو ال، ..) -> 09123780840
دوستای گلم حمایت کنید : https://cafebazaar.ir/app/com.nikanmehr.marmarxword/
نرم افزار پخش مویرگی
اگر دیتاست ClientDataset هست، Post یا Cancel کردن از یک رکورد به رکورد دیگه چیزی رو به بانک ارسال نمیکنه. ClientDataset فقط زمانی تغییرات را به بانک اطلاعاتی ارسال میکنه که متد ApplyUpdates فراخوانی بشه. پس تا زمانی که این متد فراخوانی نشده، هر تغییری که کاربر در رکوردها اعمال کنه، فقط در حافظه سیستمش هست، و ثبت شده تلقی نمیشه.متاسفانه از يک رکورد به رکورد ديگر راحت مي رود و تغييرات را در ClientDataSet ذخيره مي کند با نوشتن کد ClientDataSet1.Cancel يا ClientDataSet1.Post در پروسيجر ClientDataSet1BeforePost اين مشکل حل نمي شود چون نمي خواهم از يک رکورد به رکورد ديگر برود و تغييرات ذخيره / لغو شود بلکه مي خواهم کاربر از رکورد به رکورد ديگر برود بلکه فقط با کليک کردن روي دکمه تاييد يا لغو تغييرات ثبت يا لغو شده و آنگاه بتواند روي رکورد ديگري برود.
اگر هم دیتاست ClientDataset نیست، همانطور که قبلا گفتم از رویداد OnBeforePost استفاده کنید. در پست قبلی هم توضیح دادم، تا زمانی که تغییرات کاربر Post یا Cancel نشه، کاربر نمیتونه به رکورد دیگه ایی بره، پس وقتی OnBeforePost فراخوانی میشه که کاربر یا خودش روی دکمه مربوطه برای ثبت تغییرات کلیک کرده باشه، یا اینکه بدون کلیک بر روی دکمه، سعی کرده باشه به رکورد دیگه ایی اسکرول کنه. در هر دو حالت اون رویداد فراخوانی میشه و شما این فرصت را دارید که شرط مورد نظر خودتان را بررسی کنید و اگر شرط مربوطه بر قرار نبود، عملیات Post را Abort کنید.
وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.
اگر بخواهم بیشتر توضیح بدهم که دو تا DBGrid داریم که یکی بصورت Master و یکی بصورت Slave است. هر کدام به یک ClientDataSet وصل شده اند و وقتی کاربر روی رکوردهای DBGrid اول حرکت می کند رکوردهای DBGrid دوم با توجه به رکورد Master بازیابی می شود. مشکل اینجاست که وقتی کاربر روی دکمه Insert یا Edit کلیک می کند و رکورد Master را وارد یا اصلاح می کند و سپس رکوردهای Detail را وارد یا اصلاح می کند و سپس روی رکورد Master می رود و اگر اشتباها روی رکورد دیگری برود چه با صفحه کلید یا ماوس داده ها از بین می رود در روال OnBeforePost مکانیزم محکمی جهت ماندن در همان رکورد تا مادامیکه خود کاربر دکمه تایید یا انصراف را بزند وجود ندارد و در واقع می خواهیم که navigation در DBGrid اول انجام نشود تا خود به خود کامپوننتها و روالهای دلفی با تغییر رکورد Post یا Cancel نکنند و می خواهیم تا زمانیکه کاربر روی دکمه تایید یا انصراف کلیک نکند(کاملا Manual) اسکرل و جابجایی رکوردی در DBGrid اول صورت نگیرد
در OnBeforePost حالت ماندن در همان رکورد وجود ندارد(حالت انصراف از Post یا Cancel و ماندن در همان رکورد) ما مجبوریم یا Post کنیم یا Cancel که این حالتها مورد نظر ما نیست حالت سومی مورد نظر ماست که گویا کاربر روی رکورد دیگری (معمولا سهوا اتفاق افتاده است) نرفته است
کاشکی در روال OnBeforeScroll مشابه با روال OnCloseForm پارامتر Cancel وجود داشت که اگر این پارامتر را True مقداردهی می کردیم در همان رکورد می ماند و هیچ navigation انجام نمیشد
آخرین ویرایش به وسیله rezamahdizadeh : پنج شنبه 06 مرداد 1390 در 11:38 صبح
گفتم که باید Abort کنید. تابع Abort رو در کد مربوط به اون رویداد فراخوانی کنید، تا اون عملیات متوقف بشه؛ هر چند استفاده مکرر از Abort در کد کار جالبی نیست. راه بهتر میتونه تغییر رابط گرافیکی کاربر اون بخش از برنامه باشه.در OnBeforePost حالت ماندن در همان رکورد وجود ندارد(حالت انصراف از Post یا Cancel و ماندن در همان رکورد) ما مجبوریم یا Post کنیم یا Cancel که این حالتها مورد نظر ما نیست حالت سومی مورد نظر ماست که گویا کاربر روی رکورد دیگری (معمولا سهوا اتفاق افتاده است) نرفته است
وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.
Abort در کدام رويداد OnBeforePost يا OnBeforeCancel يا OnBeforeScroll يا ...
فکر مي کنم اين حل مساله نيست چون که abort کردن از اجراي ادامه کدها در همان سابروتين جلوگيري مي کند و آن رويداد اتفاق افتاده است در حاليکه ما مي خواهيم رخ دادن آن رويداد را cancel کنيم
عزیز من، Abort در داخل یک Event-handler باعث میشه که کل کدی که اون Event-handler رو فراخوانی کرده از مسیر اجرا خارج بشه، یعنی اون رویداد هیچ وقت به مقصدش نمیرسه! فکر کنم اگر به جای بحث کردن در رویداد مورد نظرتون کدی مثل کد زیر نوشته بودید، تا به حال مشکل تان برطرف شده بود:فکر مي کنم اين حل مساله نيست چون که abort کردن از اجراي ادامه کدها در همان سابروتين جلوگيري مي کند و آن رويداد اتفاق افتاده است در حاليکه ما مي خواهيم رخ دادن آن رويداد را cancel کنيم
if My_Condition_Is_Not_Valid then
Abort;
وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.
تا بحال نمی دونستم که Abort کل رویداد را لغو می کند جواب لازم را گرفتم
با سلام وخسته نباشید خدمت اساتید و دوستان
چرا از متد DisableControls استفاده نمی کنید....؟
[adotabel1.DisableControls;