نمایش نتایج 1 تا 13 از 13

نام تاپیک: عدم رفتن به ردیف دیگر در DBGrid در حالت Insert یا Edit

  1. #1
    کاربر دائمی آواتار rezamahdizadeh
    تاریخ عضویت
    اسفند 1385
    محل زندگی
    تهران
    پست
    345

    عدم رفتن به ردیف دیگر در DBGrid در حالت Insert یا Edit

    من می خواهم در DBGrid وقتی ردیفی Insert یا Edit شد دیگر کاربر نتواند روی ردیف دیگری برود تا زمانیکه این ردیف Post یا Cancel شود.

  2. #2

    نقل قول: عدم رفتن به ردیف دیگر در DBGrid در حالت Insert یا Edit

    سلام :
    کنترل کردن حرکت روی ردیف های جدول یکم سخته چون هم صفحه کلید و هم موس در کار هستند .
    برای این کاری که شما می خوای انجام بدی میتونی یه متغییر داشته باشی و با اون وضعیت 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;

  3. #3
    کاربر دائمی آواتار rezamahdizadeh
    تاریخ عضویت
    اسفند 1385
    محل زندگی
    تهران
    پست
    345

    نقل قول: عدم رفتن به ردیف دیگر در DBGrid در حالت Insert یا Edit

    ماوس را چکار باید کرد؟
    فکر می کنم باید یک جوری ClientDataSet را کاری کرد که Scroll نشود.

  4. #4

    نقل قول: عدم رفتن به ردیف دیگر در DBGrid در حالت Insert یا Edit

    من می خواهم در DBGrid وقتی ردیفی Insert یا Edit شد دیگر کاربر نتواند روی ردیف دیگری برود تا زمانیکه این ردیف Post یا Cancel شود.
    خب در عمل هم همینطوره دیگه! وقتی رکوردی به حالت Edit\Insert میره، حرکت به رکورد بعدی به طور خودکار موجب Post شدن تغییرات میشه، و شما نمی تونید از یک رکورد به رکورد دیگه برید بدون این که تکلیف تغییرات در رکورد موجود را مشخص کنید (تغییرات را Post یا Cancel کنید).
    اگر میخواید قبل از اعمال تغییرات مقادیری را بررسی کنید، و نسبت به صحت آنها مطمئن بشید، و سپس اجازه حرکت به رکورد بعدی را بدید، می تونید این کار را از طریق رویداد OnBeforePost انجام بدید. نیازی نیست روی DBGrid برای این کار وقت صرف کنید.


    وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
    و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.

  5. #5
    کاربر دائمی آواتار rezamahdizadeh
    تاریخ عضویت
    اسفند 1385
    محل زندگی
    تهران
    پست
    345

    نقل قول: عدم رفتن به ردیف دیگر در DBGrid در حالت Insert یا Edit

    نقل قول نوشته شده توسط علی کشاورز مشاهده تاپیک
    خب در عمل هم همینطوره دیگه! وقتی رکوردی به حالت Edit\Insert میره، حرکت به رکورد بعدی به طور خودکار موجب Post شدن تغییرات میشه، و شما نمی تونید از یک رکورد به رکورد دیگه برید بدون این که تکلیف تغییرات در رکورد موجود را مشخص کنید (تغییرات را Post یا Cancel کنید).
    اگر میخواید قبل از اعمال تغییرات مقادیری را بررسی کنید، و نسبت به صحت آنها مطمئن بشید، و سپس اجازه حرکت به رکورد بعدی را بدید، می تونید این کار را از طریق رویداد OnBeforePost انجام بدید. نیازی نیست روی DBGrid برای این کار وقت صرف کنید.
    فقط زماني که کاربر روي دکمه تاييد جهت Post يا روي دکمه لغو جهت Cancel کليک کند تغييرات ثبت يا لغو شود و اصلا کاربر روي رکورد ديگر چه با صفحه کليد يا ماوس نتواند برود.
    متاسفانه از يک رکورد به رکورد ديگر راحت مي رود و تغييرات را در ClientDataSet ذخيره مي کند با نوشتن کد ClientDataSet1.Cancel يا ClientDataSet1.Post در پروسيجر ClientDataSet1BeforePost اين مشکل حل نمي شود چون نمي خواهم از يک رکورد به رکورد ديگر برود و تغييرات ذخيره / لغو شود بلکه مي خواهم کاربر از رکورد به رکورد ديگر برود بلکه فقط با کليک کردن روي دکمه تاييد يا لغو تغييرات ثبت يا لغو شده و آنگاه بتواند روي رکورد ديگري برود.
    آخرین ویرایش به وسیله rezamahdizadeh : چهارشنبه 05 مرداد 1390 در 22:13 عصر

  6. #6

    نقل قول: عدم رفتن به ردیف دیگر در DBGrid در حالت Insert یا Edit

    یک پیشنهاد.
    چرا شما یک کار دیگه نمی کنید؟
    یک panel بگذارید روی فرم و در اون یک edit باشه.
    وقتی روی گرید enter زد panel رو show کنید.
    روی panel هم دکمه ذخیره و انصراف بگذارید...
    این برای وقتی هست که ستونها جدا جدا باید confirm شن.
    برای حالتی هم که می خواهید تمام سطر یکباره confirm شه مثلا یک فرم جدا بگذارید یا روی panel چند تا edit دیگه برای سایر فیلد ها..
    همون طور که جناب کشاورز فرمودند خیلی وقت صرف خود گرید نکنید..
    توابع تبدیل تاریخ با دقت 5000 سال
    پذیرش پروژه، کامپوننت، آموزش برنامه نویسی (دلفی، اس کیو ال، ..) -> 09123780840

    دوستای گلم حمایت کنید : https://cafebazaar.ir/app/com.nikanmehr.marmarxword/


    نرم افزار پخش مویرگی

  7. #7

    نقل قول: عدم رفتن به ردیف دیگر در DBGrid در حالت Insert یا Edit

    متاسفانه از يک رکورد به رکورد ديگر راحت مي رود و تغييرات را در ClientDataSet ذخيره مي کند با نوشتن کد ClientDataSet1.Cancel يا ClientDataSet1.Post در پروسيجر ClientDataSet1BeforePost اين مشکل حل نمي شود چون نمي خواهم از يک رکورد به رکورد ديگر برود و تغييرات ذخيره / لغو شود بلکه مي خواهم کاربر از رکورد به رکورد ديگر برود بلکه فقط با کليک کردن روي دکمه تاييد يا لغو تغييرات ثبت يا لغو شده و آنگاه بتواند روي رکورد ديگري برود.
    اگر دیتاست ClientDataset هست، Post یا Cancel کردن از یک رکورد به رکورد دیگه چیزی رو به بانک ارسال نمیکنه. ClientDataset فقط زمانی تغییرات را به بانک اطلاعاتی ارسال میکنه که متد ApplyUpdates فراخوانی بشه. پس تا زمانی که این متد فراخوانی نشده، هر تغییری که کاربر در رکوردها اعمال کنه، فقط در حافظه سیستمش هست، و ثبت شده تلقی نمیشه.

    اگر هم دیتاست ClientDataset نیست، همانطور که قبلا گفتم از رویداد OnBeforePost استفاده کنید. در پست قبلی هم توضیح دادم، تا زمانی که تغییرات کاربر Post یا Cancel نشه، کاربر نمیتونه به رکورد دیگه ایی بره، پس وقتی OnBeforePost فراخوانی میشه که کاربر یا خودش روی دکمه مربوطه برای ثبت تغییرات کلیک کرده باشه، یا اینکه بدون کلیک بر روی دکمه، سعی کرده باشه به رکورد دیگه ایی اسکرول کنه. در هر دو حالت اون رویداد فراخوانی میشه و شما این فرصت را دارید که شرط مورد نظر خودتان را بررسی کنید و اگر شرط مربوطه بر قرار نبود، عملیات Post را Abort کنید.


    وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
    و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.

  8. #8
    کاربر دائمی آواتار rezamahdizadeh
    تاریخ عضویت
    اسفند 1385
    محل زندگی
    تهران
    پست
    345

    نقل قول: عدم رفتن به ردیف دیگر در DBGrid در حالت Insert یا Edit

    اگر بخواهم بیشتر توضیح بدهم که دو تا 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 صبح

  9. #9

    نقل قول: عدم رفتن به ردیف دیگر در DBGrid در حالت Insert یا Edit

    در OnBeforePost حالت ماندن در همان رکورد وجود ندارد(حالت انصراف از Post یا Cancel و ماندن در همان رکورد) ما مجبوریم یا Post کنیم یا Cancel که این حالتها مورد نظر ما نیست حالت سومی مورد نظر ماست که گویا کاربر روی رکورد دیگری (معمولا سهوا اتفاق افتاده است) نرفته است
    گفتم که باید Abort کنید. تابع Abort رو در کد مربوط به اون رویداد فراخوانی کنید، تا اون عملیات متوقف بشه؛ هر چند استفاده مکرر از Abort در کد کار جالبی نیست. راه بهتر میتونه تغییر رابط گرافیکی کاربر اون بخش از برنامه باشه.


    وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
    و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.

  10. #10
    کاربر دائمی آواتار rezamahdizadeh
    تاریخ عضویت
    اسفند 1385
    محل زندگی
    تهران
    پست
    345

    نقل قول: عدم رفتن به ردیف دیگر در DBGrid در حالت Insert یا Edit

    Abort در کدام رويداد OnBeforePost يا OnBeforeCancel يا OnBeforeScroll يا ...
    فکر مي کنم اين حل مساله نيست چون که abort کردن از اجراي ادامه کدها در همان سابروتين جلوگيري مي کند و آن رويداد اتفاق افتاده است در حاليکه ما مي خواهيم رخ دادن آن رويداد را cancel کنيم

  11. #11

    نقل قول: عدم رفتن به ردیف دیگر در DBGrid در حالت Insert یا Edit

    فکر مي کنم اين حل مساله نيست چون که abort کردن از اجراي ادامه کدها در همان سابروتين جلوگيري مي کند و آن رويداد اتفاق افتاده است در حاليکه ما مي خواهيم رخ دادن آن رويداد را cancel کنيم
    عزیز من، Abort در داخل یک Event-handler باعث میشه که کل کدی که اون Event-handler رو فراخوانی کرده از مسیر اجرا خارج بشه، یعنی اون رویداد هیچ وقت به مقصدش نمیرسه! فکر کنم اگر به جای بحث کردن در رویداد مورد نظرتون کدی مثل کد زیر نوشته بودید، تا به حال مشکل تان برطرف شده بود:

    if My_Condition_Is_Not_Valid then
    Abort;


    وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
    و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.

  12. #12
    کاربر دائمی آواتار rezamahdizadeh
    تاریخ عضویت
    اسفند 1385
    محل زندگی
    تهران
    پست
    345

    نقل قول: عدم رفتن به ردیف دیگر در DBGrid در حالت Insert یا Edit

    تا بحال نمی دونستم که Abort کل رویداد را لغو می کند جواب لازم را گرفتم

  13. #13
    کاربر دائمی آواتار firststep
    تاریخ عضویت
    مهر 1387
    محل زندگی
    ایران-خواستم از جنبه تفاهم باهم بگم
    پست
    502

    نقل قول: عدم رفتن به ردیف دیگر در DBGrid در حالت Insert یا Edit

    با سلام وخسته نباشید خدمت اساتید و دوستان

    چرا از متد DisableControls استفاده نمی کنید....؟
    [
    adotabel1.DisableControls;

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •