PDA

View Full Version : سوال: رويداد خروج از صفحه OnClose



ahmadbh
شنبه 12 شهریور 1390, 13:21 عصر
سلام
موقع خروج از فرم اگر تغييراتي صورت گرفته پيغام آيا تغييرات ذخيره شود نمايش دهد در غير اينصورت از فرم خارج شود
لطفا اگر نمونه برنامه باشد از شما متشكرم

عقاب سیاه
شنبه 12 شهریور 1390, 16:11 عصر
تغییرات در چی؟
از بانک اطلاعاتی استفاده می کنید؟

ahmadbh
یک شنبه 13 شهریور 1390, 19:37 عصر
بله
از بانك اكسس و دلفي 7 استفاده ميكنم
موقعي كه در يكي از اديتها تغييري صورت بگيرد مثلا نام شخص وارد شود

عقاب سیاه
یک شنبه 13 شهریور 1390, 19:55 عصر
در اون کاپوننت اتصال به بانک LockType را برابر ltOptimistic قرار بدید. و خاصیت CursorType را هم روی ctKeyset و یا ctStatic. واین باید قبل از فعال کردن دیتاست باشه!
من با TADOQuery استفاده کردم !
این طوری تنظیمات ذخیره نمیشه!

و می تونید با استفاده از دو متد:

ADOQuery1.UpdateBatch();
ADOQuery1.CancelBatch();

می تونید دستور ثبت یا عدم ثبت اطلاعات را صادر کنید!


من خودم این جوری استفاده کردم حالا راه درست را فکر کنم باید اساتید بگند!

عقاب سیاه
یک شنبه 13 شهریور 1390, 20:00 عصر
و یادم رفت اصلا قسمت مهمش

با اعمال فیلتر روی جدول هم میشه بررسی کرد تغییری ایجاد شده یا نه!

خاصیت FilterGroup اگر برابر fgPendingRecords باشه و خاصیت Filtered هم True اونوقت با گرفتن تعداد رکورد ها از طریق RecordCount می تونید ببینید آیا اطلاعات تغییر یافته و ذخیره نشده ای هست یا نه!
و سپس با دو تایع که گفتم تغییرات را اعمال یا حذف کنید!

ahmadbh
دوشنبه 14 شهریور 1390, 18:35 عصر
سلام
فکر کنم منظورم را متوجه نشدید
یک فرم ثبت نام دانشجویان را داریم در صورت باز شدن فرم ثبت نام اگر در ادیتها یا هر شی که بر روی فرم قرار دارد تغییری صورت نگیرد موقع بستن فرم هیچ عکس العملی یا پیغامی نشان داده نشود
ولی اگر تغییری در یکی از اشیا صورت گیرد پیغام مبتنی بر (آیا تغییرات ذخیره شود ) به ما نشان داده شود
با تشکر از شما

Mahmood_M
دوشنبه 14 شهریور 1390, 20:44 عصر
در هنگام نمایش فرم متن درون ادیتها و ... رو در متغیرهای خاصی ذخیره کنید ، در رویداد OnCloseQuery مربوط به فرم مقدار فعلی ادیت ها رو با مقادیر متغیرها مقایسه کنید ، اگر یکسان نبودند ، پیغامتون رو نمایش بدید ، اگر لازم بود که فرم بسته " نشه " ، متغیر CanClose مربوط به رویداد OnCloseQuery رو False کنید
البته راه بهتر اینه که شما درون فرمی که نمایش داده میشه یک دکمه مخصوص ثبت قرار بدید ، اگر روی اون دکمه کلیک شد ، مشخصات ثبت بشه اگر به هر دلیل فرم توسط کاربر بسته شد یعنی مایل به ثبت اطلاعات وارد شده نیست

موفق باشید ...

ahmadbh
سه شنبه 15 شهریور 1390, 10:23 صبح
سلام
اگه نمونه برنامه اي ميگذاشتيد خيلي خوب بود
با تشكر

MohsenB
سه شنبه 15 شهریور 1390, 15:23 عصر
سلام

ابتدا یه متغییر رو به این صورت بصورت عمومی تعریف کنید :


var
Changed:Boolean;



تو OnChange کادر های ورود اطلاعات و یا هر مکانی که می دونید تو اون قسمت اطلاعات تغییر میکنه بنویسید:


Changed:= True;


حالا تو رویداد OnQueryClose اینطور بنویسید :


if Changed and (MessageDlg('آیا تغییرات دخیره شوند؟' ,mtConfirmation, mbYesNoCancel,0)=mrYes) then
Save;


و در آخر هم تو رویداد ساخت فرم به این متغییر مقدار اولیه بدین . همچنین بعد از تغییر محتوای کادرهای اطلاعات بوسیله خود بانک اطلاعاتی .


Chenged:= False;



موفق و پیروز باشید

ahmadbh
سه شنبه 15 شهریور 1390, 18:42 عصر
با سلام
متغير
var
Changed:Boolean;
در كدام قسمت وارد كنم . در قسمت پيغام كليدهاي ( انصراف . بله و خير ) ميخواهم داشته باشم

pop123
سه شنبه 15 شهریور 1390, 20:47 عصر
قبل از begin تعریف کنید

MohsenB
سه شنبه 15 شهریور 1390, 23:26 عصر
با سلام
متغير
var
Changed:Boolean;
در كدام قسمت وارد كنم

یا در قسمت Public و یا Private فرم و یا اولین var بعد از کلاس فرم و یا بعد از implementation




در قسمت پيغام كليدهاي ( انصراف . بله و خير ) ميخواهم داشته باشم

کپشن دکمه های جعبه پیغام رو نمیشه عوض کرد . برا این کار باید خودتون یه جعبه پیام رو شبیه سازی کنید . فقط میشه بوسیله تغییر قسمت mbYesNoCancel به موارد دیگر نوع های ترکیب دکمه دیگر را انتخاب کنید .

master13111
یک شنبه 20 شهریور 1390, 09:57 صبح
يه راه ديگه اينه كه ببينيد آيا وقتي كه ميخايد فرم رو ببنديد كويري در حالت ويرايش هست يا نه

use db;


procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
with adoquery1 do
if (state=dsedit) or (state=dsinsert) then
case MessageDlg('آيا ميخواهيد تغييرات ذخيره شود؟',mtWarning,mbyesnocancel,0) of
mryes:
Post;
mrno: Cancel;
mrcancel: canclose:=false;
end;
end;