PDA

View Full Version : خطای Access violation در برنامه



s-soleimani
دوشنبه 31 خرداد 1395, 10:49 صبح
در برنامه پیغام خطای "Access violation at address……" دارم، کاری که دارم انجام میدم اینه که وقتی روی یک دکمه در فرم کلیک میشه یک procedure از یک یونیت فراخوانی میشه و در اون پروسیجر یک رکورد از دیتابیس sqlite ام آپدیت میشه،
زمانی که این پروسیجر رو در رویداد کلیک دکمه ام بتنهایی فراخوانی کنم درست انجام میشه ولی کافیه قبل از فراخوانی یک دستور شرطی دیگه بنویسم (هر دستور غیر مرتبطی حتی)، خطای Access violation میده
طبق جستجو یی که کردم این خطا مربوط به این هست که فرم داره جایی free میشه ، ولی از کجا بفهمم که فرمم کجا free میشه؟
کد مربوط به فرمم :


procedure TfrmRmamor.BT_saveClick(Sender: TObject);
var
mydb:TMyDataBase;
intvar:Integer;
begin
if not(FileExists(path+ed_code.Text+'.jpg')) then
ShowMessage('no Picture!')
else
mydb.UpdateSqlite();

end;


کد مربوط به یونیت MyDataBase :
unit MyDataBase;

interface
uses
SQLiteTable3,undm,unrmamor;
const
SEARCH_MODE_FULL = 0;
SEARCH_MODE_FAST = 1;


type
TTemplate = record
FId: Integer;
FTemplate: TArrayOfByte;
FTemplateId: string;
end;

TMyDataBase = class(TObject)
private
database: TSQLiteDatabase;
count: Integer;
public
procedure UpdateSqlite();

end;
implementation
const
PathToDb = 'Database\SqliteDB.db';
procedure TMyDataBase.UpdateSqlite();
var db: String;
begin
db := PathToDb;
database := TSQLiteDatabase.Create(db);
database.ExecSQL('UPDATE Templates SET TemplateId = 33 Where Id=1 ');
end;
end.
خطایی که دریافت می کنم روی خطTSQLiteDatabase.Create(db); database := هستش

....PROJECT raised exception class EaccessViolation with message 'Access violation at address

Mahmood_M
دوشنبه 31 خرداد 1395, 14:27 عصر
طبق جستجو یی که کردم این خطا مربوط به این هست که فرم داره جایی free میشه ، ولی از کجا بفهمم که فرمم کجا free میشه؟
خطای AV به خاطر "دسترسی به فضایی که وجود نداره" اتفاق می افته و دسترسی به یک فرم Free شده هم می تونه یکی از علت هاش باشه اما مستقیما ارتباطی با فرم نداره
حدس میزنم که TMyDataBase رو Create نکردید و Procedure اون رو اجرا میکنید، مثال :


procedure TMainFrm.Button1Click(Sender: TObject);
var
MyDB : TMyDataBase;
begin
MyDB.UpdateSQLite;
end;

وقتی یک کلاس هنوز Create نشده ، فضایی براش درنظر گرفته نمیشه و نمی تونید به اجزای اون کلاس هم دسترسی داشته باشید، چون وجود ندارند
قبل از دسترسی به کلاس باید اون رو Create کنید، مثال :


procedure TMainFrm.Button1Click(Sender: TObject);
var
MyDB : TMyDataBase;
begin
MyDB := TMyDataBase.Create;
MyDB.UpdateSQLite;
end;

ابوالفضل عباسی
دوشنبه 14 تیر 1395, 09:29 صبح
میگم با اینکه پاسخ دوست عزیزم کامل بود،ولی شما برنامه رو Trace کردید ببینید از کدام فرمان به بعد پیام AV میدهد؟
اگه فرمانی که این خطا نمایان میشه رو پیدا کنید می تونید بفهمید که ممکنه یک زیر برنامه ای اجرا میشه که free رخ میده و یا بانک close میشه.
دقیقا در اجرا کدام خط از برنامه تان پیغام AV رخ میدهد؟