PDA

View Full Version : پیغام Access Violation بعد از چند بار باز کردن فرم



arezoo_sh
شنبه 27 فروردین 1390, 03:24 صبح
با سلام

در هنگام اجرای برنامه بعد از 2یا3 مرتبه که فرم رو باز میکنم ؛ در مرتبه بعدی که فرم رو میخوام باز کنم پیغام Access Violation رو مشاهده میکنم

کدهای فراخوانی فرم:


frm_havale_az_cust:=Tfrm_havale_az_cust.Create( Self ) ;
frm_havale_az_cust.ShowModal;
FreeAndNil(frm_havale_az_cust);



کدهای OnCreat فرم :

procedure Tfrm_havale_az_cust.FormCreate(Sender: TObject);
begin
frm_dm_accmmn.qry_bank.Open;
frm_dm_accmmn.qry_customer.Open;
frm_dm_accmmn.qry_bank_acc.Open;
end;


کدهای OnClose فرم :


frm_dm_accmmn.qry_bank.close;
frm_dm_accmmn.qry_customer.close;
frm_dm_accmmn.qry_bank_acc.close;





کدهای OnShow فرم :
procedure Tfrm_havale_az_cust.FormShow(Sender: TObject);
begin
ed_date_sanad.Text:=GetPersianDate;
ed_code.Text:=FloatToStr(MaxSandMali);
ed_price.Text:='0';
ed_shobe.Clear;
ed_fish.Clear;
ed_exp.Clear;
cmb_bank.KeyValue:=Null;
cmb_bank_acc.KeyValue:=Null;
cmb_cust.KeyValue:=Null;
ed_date_sanad.SetFocus;
ed_price.Color:=clWindow;
if Tag=1 then fill;
end;



لازم هست بگم اگه فرم رو Auto Create کنم . دیگه با پیغام Access Violation روبرو نمیشم

؟؟؟؟؟؟؟؟؟؟؟؟؟؟


با تشکر ...
منتظرم ...
موفق باشید ...

Felony
شنبه 27 فروردین 1390, 09:51 صبح
frm_havale_az_cust:=Tfrm_havale_az_cust.Create( Self ) ;
frm_havale_az_cust.ShowModal;
FreeAndNil(frm_havale_az_cust);
این کد یعنی چی ؟ فرم رو میسازی ، بعد همون موقع آزادش میکنی ؟!

arezoo_sh
شنبه 27 فروردین 1390, 14:34 عصر
frm_havale_az_cust:=Tfrm_havale_az_cust.Create( Self ) ; این خط فرم رو میسازه
frm_havale_az_cust.ShowModal; این خط هم باعث میشه فرم نمایش داده بشه و میره داخل فرم یعنی خط بعدی اجرا نمیشه و بعد از این که فرم close شد . این خط اجرا میشه FreeAndNil(frm_havale_az_cust);
به عبارتی بعد از اینکه فرم بسته شد free میشه

vcldeveloper
شنبه 27 فروردین 1390, 14:54 عصر
این کد یعنی چی ؟ فرم رو میسازی ، بعد همون موقع آزادش میکنی ؟! فرم ShowModal شده، پس مشکلی نداره.
البته برای اینکه اجرای FreeAndNil تضمین شده باشه، باید کد در داخل بلوک try-finally قرار بگیره، و همچنین به دلیل اینکه فرم به صورت ShowModal نمایش داده میشه و به دفعات ساخته میشه، برای افزایش کارایی، بهتره که به متد Create اون فرم پارامتر nil به عنوان Owner پاس داده بشه، نه شی Application.


در مرتبه بعدی که فرم رو میخوام باز کنم پیغام Access Violation رو مشاهده میکنمخب، وقتی خطا داد، اجرای برنامه رو break کنید، ببینید روی چه خطی از کد متوقف میشه. توی کد مربوط به رویداد OnShow توابعی فراخوانی شدند که کدشون اینجا درج نشده، و معلوم نیست آیا خطا از اونها هست یا از چیز دیگه.

Felony
شنبه 27 فروردین 1390, 17:08 عصر
فرم ShowModal شده، پس مشکلی نداره.
به اون خط وسطی دقت نکردم ...

tdkhakpur
یک شنبه 28 فروردین 1390, 01:27 صبح
در هنگام اجرای برنامه بعد از 2یا3 مرتبه که فرم رو باز میکنم ؛ در مرتبه بعدی که فرم رو میخوام باز کنم پیغام Access Violation رو مشاهده میکنم

نوشتن کد اصلی داخل onshow باید به دقت انجام بشه نمیتونید کد رو در این event همینطوری به حال خود برای اجرا قرار بدید.
معمولا برای این ایونت کدها باید داخل یک شرط init شده قرار بگیره تا اجرای مجدد در این event باعث دسترسی های غیر مجاز به منابع نشه.
اگه کدهای داخل onshow ایرادی درش نباشن به این شکلی اصلاح کنید.



var sw:boolean; // مقدار اولیه رو برابر 0 قرار بدید.
procedure Tfrm_havale_az_cust.FormShow(Sender: TObject);
begin
if sw<>ture then
begin
sw := true;
ed_date_sanad.Text:=GetPersianDate;
ed_code.Text:=FloatToStr(MaxSandMali);

ed_price.Text:='0';
ed_shobe.Clear;
ed_fish.Clear;
ed_exp.Clear;
cmb_bank.KeyValue:=Null;
cmb_bank_acc.KeyValue:=Null;
cmb_cust.KeyValue:=Null;
ed_date_sanad.SetFocus;
ed_price.Color:=clWindow;
if Tag=1 then fill;
end;
end;

vcldeveloper
یک شنبه 28 فروردین 1390, 17:03 عصر
معمولا برای این ایونت کدها باید داخل یک شرط init شده قرار بگیره تا اجرای مجدد در این event باعث دسترسی های غیر مجاز به منابع نشه.
نیازی به همچین کاری نیست. OnShow یک فرم یک بار فراخوانی میشه، مگه این که فرم Close بشه، و دوباره Show بشه. از اونجایی که فرم این کاربر Modal هست، و بعد از هر بار Close شدن، هم Free میشه، اون شرط اضافی شما هیچ کارکردی نداره.

arezoo_sh
یک شنبه 28 فروردین 1390, 17:21 عصر
با تشکر از همه دوستان
امروز واسه تست کدها یه پروژه جدید ایجاد کردم و دیدم اصلا با کدهام مشکلی نداره و پیغام access violation نمیده

حالا بگین اشکال از کجا بود ؟؟؟
من تو برنامه ام از یک کامپوننت به اسم dxFroum Library و از dfxBackground برای فرم هام استفاده کرده بودم که با برداشتن این کامپوننت از روی فرمم مشکل حل شد .

کسی نمیدونه چرا این کامپوننت وقتی که ازش استفاده میشه پیغام access violation در باز شدن فرم ها ایجاد میشه ؟؟؟؟

کامپوننت :

http://devexpress.com/Support/Center/p/Q30917.aspx

A.Nemati
دوشنبه 29 فروردین 1390, 14:18 عصر
احتمالا این کامپوننت یه جورایی می خواسته به فرم دسترسی داشته باشه (مثلا ظاهر فرم رو مدیریت کنه) ولی شما فرم رو آزاد کرده بودی.
اگر بخواهی به شیی که وجود نداره (ایجاد نشده یا آزاد شده)، دسترسی پیدا کنی، یا کاری روش انجام بدی این خطا رو می گیری.