PDA

View Full Version : تحلیل علت بروز خطا در هنگام خروج از برنامه (عکس)



mohmp3
سه شنبه 13 بهمن 1388, 11:17 صبح
سلام

ممنون می شم مفهوم خطای زیر و علت ایجاد رو بفرماید.

بانک اینتربیس.

فیلدها و رکودها توسط کاربر ایجاد می شود. با ایجاد فیلد جدید و سپس انجام محاسبه بر روی رکوردها، به هنگام خروج از برنامه، پیغام زیر داده می شه !


http://img98.com/images/52bpx77ls95qbqsov3u1.jpg

حسین شهریاری
سه شنبه 13 بهمن 1388, 11:35 صبح
سلام

یک پیام آشنا هست.منظور تداخل حافظه است.یک پروسه داره از آدرس پروسه دیگری که رم هست استفاده میکنه.چرا که خود پروسه ایجاد شده ولی آدرسی به اون اختصاص داده نشده.یا این که اصطلاحا "دو پروسه همزمان وارد بخش بحرانی شده اند" و دارند یک دستورالعمل مشترک بین دو پروسه(همچنین حیاتی و تاثیر گذار را)دستکاری میکنند.

و اما از دید کاربردی احتمالا طریقه ایجاد(Create) فیلدهایی که توسط کاربر ایجاد میشن یه نقصی داره!
چرا که دو کار مختلف(بنا بر متن پیام) داره بر اساس یه آدرس انجام میشه.

موفق باشید

mohmp3
سه شنبه 13 بهمن 1388, 12:07 عصر
ممنون از پاسخ شما

برای ورود رکوردها، یه مجموعه editbox ساخته می شود. ولی خوب به درسی FreeAndNill میشن !!

من باید نحوه ایجاد فیلد و رکورد روی جدول رو چک کنم یا مشکل از ادیت هاست! تعداد ادیت باکس ها هم خیلی زیاده ! سه آرایه که هر کدان 1000 تا هستند. در مجموع سه هزار تا ادیت باکس که البته محدودیت بالای Create است. در شرایط عادی اینقدر تشکیل نمی شه.

ضمنا شاید در مجموع (به علت محاسبات پی در پی) در مجموع 20 تا آرایه (از 1 تا 1000) استفاده کردم.

mohmp3
سه شنبه 13 بهمن 1388, 12:13 عصر
مطلب دیگر

من در مجموع از 6 تا Dataset استفاده می کنم. اضافه کردن هر فیلد و رکورد، تو هر 6 تا جدول اعمال می شود. رو هر جدولی اطلاعات خوانده شده، محاسبات انجام و نتیجه به جدول بعدی منتقل می ود. dataset ها رو هم بعد از خواندن داده ها و محاسبات نمی بندم (نمیدونم مشکلی ایجاد می کنه !)

حسین شهریاری
سه شنبه 13 بهمن 1388, 12:27 عصر
خیر نبستن Dataset نمیتونه مزید بر علت باشه!!
درضمن فکر کنم شما بهتره نهوه ساختن فیلدها را مورد برسی قرار بدید و ببینید که درست انجام میشه یانه؟

در ضمن میشه بفرمایید این چه پروژه ای است که تمام کارها باید داینامیک انجام بشه؟

mohmp3
سه شنبه 13 بهمن 1388, 12:59 عصر
خیر نبستن Dataset نمیتونه مزید بر علت باشه!!
درضمن فکر کنم شما بهتره نهوه ساختن فیلدها را مورد برسی قرار بدید و ببینید که درست انجام میشه یانه؟

در ضمن میشه بفرمایید این چه پروژه ای است که تمام کارها باید داینامیک انجام بشه؟

ممنون از پاسخ شما

تو این برنامه اختیار اضافه و حذف فیلد و رکورد دست کاربر است. در واقع کاربر اطلاعات خودش رو وارد می کنه و برنامه تنها کار محاسبات رو روی داده های ورودی انجام می ده و سپس نمایش خروجی به صورت نمودار. نوع کار یه جور روش تصمیم گیری است که البته مبنای ریاضی داره و یکی از روش های operation research است. کاربر از انبوه اطلاعات وارده، تنها یک عدد رو به عنوان جواب دریافت می کنه ! وظیفه این برنامه خوندن داده ها و سپس تبدیل آنها به جواب نهایی است.

محاسبات در 9 مرحله انجام می شود و من از ابتدا خروجی تمام مراحل رو به جدول ها منتقل می کردم. اما از روز گذشته سعی کردم که یکی یکی جدول ها رو حذف کنم و تمام کار ها رو صرفا تو متغییرها انجام بدم. با این حال استفاده از سه جدول اجتناب ناپذیره !!

حسین شهریاری
سه شنبه 13 بهمن 1388, 13:11 عصر
موفق باشی!

میشه بفرمایید که مثلا یه Edit را چگونه در زمان اجرا ایجاد میکنید؟دقیقا کدشا بنویس تا ببینم آیا میتونه خطایی داشته باشه.

mohmp3
سه شنبه 13 بهمن 1388, 13:28 عصر
var
Form3: TForm3;
GB : array[1..1000] of TGroupBox;
E1: array[1..1000] of TEdit;
E2: array[1..1000] of TEdit;
E3: array[1..1000] of TEdit;
sl,sm,sh : string;
l : integer;
s1,s2 : string;

implementation
uses unit1, Unit2;
{$R *.dfm}


procedure TForm3.F3CB1Change(Sender: TObject);
var
i,u,c,d,f,h,g,kll,z,v : Integer;
b : real;

begin
button5.Enabled := true;
f := form1.CDS1.RecordCount;
c := 0; d := 0; h := 0; l := 1; v := 0; z := 0;
b := frac(f/4);

if b = 0 then
g := round(f/4)
else
g := round(f/4)+1;

For u:=1 To g Do
begin
For i:=1 To 4 Do
Begin
if h > f-1 then
break

else
begin
GB[l]:=TGroupBox.Create(SBox1);
GB[l].Parent:= SBox1;
GB[l].Width := 200;
GB[l].Height := 55;
GB[l].SendToBack;
GB[l].Font.Size := 7;
GB[l].Font.Style := Font.Style + [fsBold];
GB[l].Font.Color := clNavy;
E1[l]:=TEdit.Create(SBox1);
E2[l]:=TEdit.Create(SBox1);
E3[l]:=TEdit.Create(SBox1);
E1[l].Parent:= SBox1;
E2[l].Parent:= SBox1;
E3[l].Parent:= SBox1;
E1[l].Width := 50;
E2[l].Width := 50;
E3[l].Width := 50;
E1[l].Top:=d+40;
E2[l].Top:=d+40;
E3[l].Top:=d+40;
GB[l].Top:=z+15;
E1[l].Left:=20+c;
E2[l].Left:=90+c;
E3[l].Left:=160+c;
GB[l].Left:=15+v;
E1[l].Text := 'Min.';
E2[l].Text := 'Midd.';
E3[l].Text := 'Max.';
E1[l].onKeyPress := SGKeyPress;
E2[l].onKeyPress := SGKeyPress;
E3[l].onKeyPress := SGKeyPress;
d := d+75;
z := z+75;
h := h+1;
l := l+1
end;
end;
c := c + 250;
v := v + 250;
d := 0;
z := 0;

end;

E1[1].SetFocus;
SQLDS3.Open;
Clientdataset1.Open;

kll := 1;
while not ClientDataSet1.Eof do
begin
E1[kll].Text := ClientDataSet1.fieldbyname(F3CB1.Items[F3CB1.ItemIndex]+'_lEFT').AsString;
E2[kll].Text := ClientDataSet1.fieldbyname(F3CB1.Items[F3CB1.ItemIndex]+'_MEDDIUM').AsString;
E3[kll].Text := ClientDataSet1.fieldbyname(F3CB1.Items[F3CB1.ItemIndex]+'_HIGH').AsString;
if ClientDataSet1.fieldbyname(F3CB1.Items[F3CB1.ItemIndex]+'_lEFT').AsString = '' then
E1[kll].Text := 'Min.';
if ClientDataSet1.fieldbyname(F3CB1.Items[F3CB1.ItemIndex]+'_MEDDIUM').AsString = '' then
E2[kll].Text := 'Midd.';
if ClientDataSet1.fieldbyname(F3CB1.Items[F3CB1.ItemIndex]+'_HIGH').AsString = '' then
E3[kll].Text := 'Max.';

GB[kll].Caption := ClientDataSet1.fieldbyname('Criteria').AsString;
kll := kll + 1;
ClientDataSet1.Next;
end;
ClientDataSet1.Refresh;
end;

حلقه ها برای تشکیل ستون های چهارتایی ادیت ها در Scrolbox نوشته شده اند. مثل شکل زیر که ادیت 5 رفته ستون دوم.

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



http://f.imagehost.org/0612/untitled_18.jpg


شرمنده اگر پاسخ من طول می کشه !! متاسفانه اینترنت ADSL من قطعه و این D. up هم که استفاده می کنم، تقریبا افتضاحه !!

حسین شهریاری
سه شنبه 13 بهمن 1388, 14:02 عصر
دیدم علی الظاهر که مشکلی توی ایجاد کامپوننتها ندارید!
شما فقط روی خمون بخش ایجاد فیلد کار کنید.

موفق باشید

vcldeveloper
چهارشنبه 14 بهمن 1388, 03:28 صبح
اینکه آدرس رو دار 00000000 برمیگردونه، یعنی به احتمال زیاد دارید سعی میکنید از شی ایی استفاده کنید که هنوز Create نشده.
پیدا کردنش معمولا کار خاصی نداره، برنامه رو در داخل دلفی اجرا کنید، و وقتی خطا رخ داد، برنامه را Pause کنید، و Call Stack را نگاه کنید. اولین وروی پنجره Call Stack اسم تابع یا متدی هست که در هنگام اجرای آن، AV رخ داده.
اگر پنجره Call Stack را پیدا نکردید؛ به منوی View، گزینه Debug Windows برید، و Call Stack را انتخاب کنید.