الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

عند الخروج من try يحدث خطأ

بدأه essam7 في 10 يونيو 2008 · 7 رد · 1,309 مشاهدة · في لغة Delphi
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

لو تتكرمون علي وتحملون المرفق

أضيفوا عدة يوزرات ثم ابداوا بحذفها الواحد تلو الاخر سيتولد خطأ!!!!

الرجاء اعلامي بسببه

حاولت ب F7 لكنه يتولد بعد الخروج من جملة try !!

وشكرا لكم مقدما

test.rar

test_exe.rar

#2

جربت المرفق -> ِCompile -> تنفيذ -> خروج

جربت المرفق -> ِCompile -> تنفيذ -> اضافة اكثر من user -> خروج

لم يحدث اي مشكل

-

متى يحذث المشكل بالظبط ؟ وما هي رسالة الخطأ ؟

ملاحظة: لم اطلع على الكود لضيق الوقت

d4baa0.gif
#3

في LoadExistingUsers انت كاتب

if StList.Count > MaxUsers then
   MaxUsers:= StList.Count;
UsersCount:= StList.Count;

وفي نهايتها كاتب

	//Free old components if i delete users
	for cRow:= UsersCount to MaxUsers - 1 do
	begin
	  if fmMain.FindComponent('edName'+ IntToStr(cRow)) <> nil then
		fmMain.FindComponent('edName'+ IntToStr(cRow)).Free;
		.....
	end; //cRow

هذا هو الخطأ

والسلام عليكم ورحمة الله

d4baa0.gif
#4

السلام عليكم

أولا أشكرك على ردك السريع

سيدي الكريم

الخطأ الذي يظهر في Design time :

Project test.exe raised exception class EAccessViolation with message Access violation at address xxx n module test.exe read of address xxx

وهو في Run time:

Access violation at address xxx in module test.exe read of address xxx

أنا عدلت الكود والمشكلة تظهر عند الخروج من LOADEXISTING USERS

هذا الاجراء يستدعى عند FORM.SHOW

وعند اضافة مستخدم

وعند حذف مستخدم

المشكلة تظهر عند الحذف فقط وعلى التجلي اي دون ضابط !!!

للعلم الاجراء بقوم بحذف العناصر داخل الاطار ثم يقوم بتوليدها حسب عدد اليوزرز الموجودة في الرجستري

جرب اضافة يوزر باسم 1 ثم اخر باسم 2 ثم ثالث باسم 3

ثم مباشرة دون اغلاق البرنامج احذف 3 عندي تولد الخطأ!!!!

الاجراء لقراءته بسرعة:

procedure LoadExistingUsers;
var
  ed: TEdit;
  bt: TButton;
  cRow, cColumn: integer;
  reg: TRegistry;
  StList: TStringList;
  Name: String;
  RemTotDur, RemNetDur: Integer;
begin
  //Free components before create new one
  cRow:= 0;
  while (fmMain.FindComponent('edName'+ IntToStr(cRow)) <> nil) do
  begin
	if fmMain.FindComponent('edName'+ IntToStr(cRow)) <> nil then
	  fmMain.FindComponent('edName'+ IntToStr(cRow)).Free;
	if fmMain.FindComponent('edTD'+ IntToStr(cRow)) <> nil then
	  fmMain.FindComponent('edTD'+ IntToStr(cRow)).Free;
	if fmMain.FindComponent('edND'+ IntToStr(cRow)) <> nil then
	  fmMain.FindComponent('edND'+ IntToStr(cRow)).Free;
	if fmMain.FindComponent('edK'+ IntToStr(cRow)) <> nil then
	  fmMain.FindComponent('edK'+ IntToStr(cRow)).Free;
	if fmMain.FindComponent('edTO'+ IntToStr(cRow)) <> nil then
	  fmMain.FindComponent('edTO'+ IntToStr(cRow)).Free;
	if fmMain.FindComponent('edRTD'+ IntToStr(cRow)) <> nil then
	  fmMain.FindComponent('edRTD'+ IntToStr(cRow)).Free;
	if fmMain.FindComponent('edRND'+ IntToStr(cRow)) <> nil then
	  fmMain.FindComponent('edRND'+ IntToStr(cRow)).Free;
	if fmMain.FindComponent('btDel'+ IntToStr(cRow)) <> nil then
	  fmMain.FindComponent('btDel'+ IntToStr(cRow)).Free;
	cRow:= cRow+ 1
  end;

  reg:= TRegistry.Create;
  with reg do
	try
	  RootKey:= HKEY_LOCAL_MACHINE;
	  if OpenKeyReadOnly(ConfigPath) then
	  begin
		StList:= TStringList.Create;
		try
		  GetKeyNames(StList);
		  if StList.Count = 0 then //No users found
		  begin
			PutNoUsersFound;
			Exit;
		  end;
		  if fmMain.FindComponent('lbNoUsers') <> nil then
			fmMain.FindComponent('lbNoUsers').Free;
		  for cRow:= 0 to StList.Count - 1 do
		  begin
			Name:= '';
			RemTotDur:= 0;
			RemNetDur:= 0;
			if OpenKeyReadOnly(ConfigPath+ '\'+ StList[cRow]) then
			  for cColumn:= 0 to 7 do //each row
			  begin
				case cColumn of
				  0: begin
					   ed:= TEdit.Create(fmMain);
					   ed.Parent:= fmMain.frameUsers;
					   ed.Name:= 'edName'+ IntToStr(cRow);
					   ed.Width:= 75;
					   ed.Left:= 10;
					   ed.ReadOnly:= True;
					   ed.Top:= 10+ (cRow * 25);
					   if ValueExists('Name') then
					   begin
						 ed.Text:= ReadString('Name');
						 Name:= ReadString('Name');
					   end
					   else ed.Text:= 'Error';
					 end;
				  1: begin
					   ed:= TEdit.Create(fmMain);
					   ed.Parent:= fmMain.frameUsers;
					   ed.Name:= 'edTD'+ IntToStr(cRow);
					   ed.Width:= 35;
					   ed.Left:= 95;
					   ed.ReadOnly:= True;
					   ed.Top:= 10+ (cRow * 25);
					   if ValueExists('TD') then
						 ed.Text:= IntToStr(ReadInteger('TD'))
					   else ed.Text:= 'Error';
					 end;
				  2: begin
					   ed:= TEdit.Create(fmMain);
					   ed.Parent:= fmMain.frameUsers;
					   ed.Name:= 'edND'+ IntToStr(cRow);
					   ed.Width:= 35;
					   ed.Left:= 140;
					   ed.ReadOnly:= True;
					   ed.Top:= 10+ (cRow * 25);
					   if ValueExists('ND') then
						 ed.Text:= IntToStr(ReadInteger('ND'))
					   else ed.Text:= 'Error';
					 end;
				  3: begin
					   ed:= TEdit.Create(fmMain);
					   ed.Parent:= fmMain.frameUsers;
					   ed.Name:= 'edK'+ IntToStr(cRow);
					   ed.Width:= 45;
					   ed.Left:= 185;
					   ed.ReadOnly:= True;
					   ed.Top:= 10+ (cRow * 25);
					   if ValueExists('K') then
						 if ReadInteger('K') = 0 then
						   ed.Text:= 'Daily'
						 else ed.Text:= 'Weekly'
					   else ed.Text:= 'Error';
					 end;
				  4: begin
					   ed:= TEdit.Create(fmMain);
					   ed.Parent:= fmMain.frameUsers;
					   ed.Name:= 'edTO'+ IntToStr(cRow);
					   ed.Width:= 30;
					   ed.Left:= 240;
					   ed.ReadOnly:= True;
					   ed.Top:= 10+ (cRow * 25);
					   if ValueExists('TO') then
						 if ReadInteger('TO') = 0 then
						   ed.Text:= 'No'
						 else ed.Text:= 'Yes'
					   else ed.Text:= 'Error';
					 end;
				  5: begin
					   ed:= TEdit.Create(fmMain);
					   ed.Parent:= fmMain.frameUsers;
					   ed.Name:= 'edRTD'+ IntToStr(cRow);
					   ed.Width:= 35;
					   ed.Left:= 280;
					   ed.ReadOnly:= True;
					   ed.Top:= 10+ (cRow * 25);
					   if GetRemainder_HKU(Name, RemTotDur, RemNetDur) then
						 ed.Text:= IntToStr(RemTotDur)
					   else if ValueExists('TD') then
							  ed.Text:= IntToStr(ReadInteger('TD'));
					 end;
				  6: begin
					   ed:= TEdit.Create(fmMain);
					   ed.Parent:= fmMain.frameUsers;
					   ed.Name:= 'edRND'+ IntToStr(cRow);
					   ed.Width:= 35;
					   ed.Left:= 325;
					   ed.ReadOnly:= True;
					   ed.Top:= 10+ (cRow * 25);
					   if GetRemainder_HKU(Name, RemTotDur, RemNetDur) then
						 ed.Text:= IntToStr(RemNetDur)
					   else if ValueExists('ND') then
							  ed.Text:= IntToStr(ReadInteger('ND'));
					 end;
				  7: begin
					   bt:= TButton.Create(fmMain);
					   bt.Parent:= fmMain.frameUsers;
					   bt.Name:= 'btDel'+ IntToStr(cRow);
					   bt.Left:= 370;
					   bt.Top:= 10+ (cRow * 25);
					   bt.Height:= 21;
					   bt.Caption:= 'Delete';
					   bt.Tag:= cRow;
					   bt.OnClick:=  fmMain.btDelClick;
					 end;
				end; //case
			  end; //for cColumn
		  end; //for  cRow
		finally
		  StList.Free;
		end;
	  end; //open key
	finally
	  Free; //reg
	end;
end;

test.rar

تم تعديل هذه المشاركة بواسطة essam7 في 12 يونيو 2008 في 18:37

#5

الخطأ في الكود الذي ذكرته فوق وبالذات هنا

 for cRow:= UsersCount to MaxUsers - 1 do

فانت تحدف في LoadExistingUsers دون اتن تمرر رقم الاسم المحذوف

d4baa0.gif
#6

السلام عليكم

طيب اخي الكريم اتا عدلت الكود كما ترى !!

وحررت كل الكومبوننت كالتالي:

//Free components before create new one
  cRow:= 0;
  while (fmMain.FindComponent('edName'+ IntToStr(cRow)) <> nil) do
  begin
	if fmMain.FindComponent('edName'+ IntToStr(cRow)) <> nil then
	  fmMain.FindComponent('edName'+ IntToStr(cRow)).Free;
	if fmMain.FindComponent('edTD'+ IntToStr(cRow)) <> nil then
	  fmMain.FindComponent('edTD'+ IntToStr(cRow)).Free;
	if fmMain.FindComponent('edND'+ IntToStr(cRow)) <> nil then
	  fmMain.FindComponent('edND'+ IntToStr(cRow)).Free;
	if fmMain.FindComponent('edK'+ IntToStr(cRow)) <> nil then
	  fmMain.FindComponent('edK'+ IntToStr(cRow)).Free;
	if fmMain.FindComponent('edTO'+ IntToStr(cRow)) <> nil then
	  fmMain.FindComponent('edTO'+ IntToStr(cRow)).Free;
	if fmMain.FindComponent('edRTD'+ IntToStr(cRow)) <> nil then
	  fmMain.FindComponent('edRTD'+ IntToStr(cRow)).Free;
	if fmMain.FindComponent('edRND'+ IntToStr(cRow)) <> nil then
	  fmMain.FindComponent('edRND'+ IntToStr(cRow)).Free;
	if fmMain.FindComponent('btDel'+ IntToStr(cRow)) <> nil then
	  fmMain.FindComponent('btDel'+ IntToStr(cRow)).Free;
	cRow:= cRow+ 1
  end;

البرنامج يضيف المستخدمين كمفاتيح بالرجستري والبرنامج يقوم بعمله على اكمل وجه اي ان رسالة الخطا لا توثر على عمل البرنامج وهذا ما يحيرني

عموما حتى احصر الخطا انشات يوزر واحد باسم 1 ثم حذفته ولا يوجد خطا

انشات يوزرين 1 ثم 2 بالترتيب ثم حذفت 1 ثم 2 ولا خطا لكن لما خذفت 2 اولا نتج الخطا

الان جربت شيء يحط العقل بالكف :

انشات 1 ثم 2 ثم 3

حذفت 1 ثم 2ثم 3 لا مشكلة

مباشرة انشات 1 ثم 2 ثم 3 ثم حذفت 1 فنشا خطا جديد وهو abstract eror

والله مو عرفان شو المشكلة

وكما قلت يتولد الخطا دون ضابط فقط عند حذف اليوزر فصراحة لم اطرح الموضوع الا بعد ان عجزت تماااما

رجاء فالاجراء لا ارى به اي مشكل

تم تعديل هذه المشاركة بواسطة essam7 في 12 يونيو 2008 في 18:28

#7

السلام عليكم

شباب معقول ما في حل لمشكلتي؟

استخدمت طريقة متخلفة لمنع ظهور رسالة الخطأ وذلك باقحام الاجراء loadexistingusers ضمن try لأن رسالة الخطأ لا تؤثر على عمل البرنامج لكن للاسف ما زالت الرسالة !!!

الرجاء شوووو الحل؟؟؟

الرجاء اضف 1 ثم 2 ثم احذف 2 وستجد الخطأ !!!!

جربت على جهاز اخر والمشكلة ذاتها

#8

أتوقع عرفت المشكلة !!

السبب اني أحرر الزر وأنا ما زلت داخل حدث الضغط عليه

جربت عدم حذفه ومشي الحال

الان سأجرب كيفية حذفه دون الضغط عليه

مواضيع مشابهة