السلام عليكم
لو تتكرمون علي وتحملون المرفق
أضيفوا عدة يوزرات ثم ابداوا بحذفها الواحد تلو الاخر سيتولد خطأ!!!!
الرجاء اعلامي بسببه
حاولت ب F7 لكنه يتولد بعد الخروج من جملة try !!
وشكرا لكم مقدما
السلام عليكم
لو تتكرمون علي وتحملون المرفق
أضيفوا عدة يوزرات ثم ابداوا بحذفها الواحد تلو الاخر سيتولد خطأ!!!!
الرجاء اعلامي بسببه
حاولت ب F7 لكنه يتولد بعد الخروج من جملة try !!
وشكرا لكم مقدما
جربت المرفق -> ِCompile -> تنفيذ -> خروج
جربت المرفق -> ِCompile -> تنفيذ -> اضافة اكثر من user -> خروج
لم يحدث اي مشكل
-
متى يحذث المشكل بالظبط ؟ وما هي رسالة الخطأ ؟
ملاحظة: لم اطلع على الكود لضيق الوقت
في 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هذا هو الخطأ
والسلام عليكم ورحمة الله
السلام عليكم
أولا أشكرك على ردك السريع
سيدي الكريم
الخطأ الذي يظهر في 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;تم تعديل هذه المشاركة بواسطة essam7 في 12 يونيو 2008 في 18:37
الخطأ في الكود الذي ذكرته فوق وبالذات هنا
for cRow:= UsersCount to MaxUsers - 1 do
فانت تحدف في LoadExistingUsers دون اتن تمرر رقم الاسم المحذوف
السلام عليكم
طيب اخي الكريم اتا عدلت الكود كما ترى !!
وحررت كل الكومبوننت كالتالي:
//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
السلام عليكم
شباب معقول ما في حل لمشكلتي؟
استخدمت طريقة متخلفة لمنع ظهور رسالة الخطأ وذلك باقحام الاجراء loadexistingusers ضمن try لأن رسالة الخطأ لا تؤثر على عمل البرنامج لكن للاسف ما زالت الرسالة !!!
الرجاء شوووو الحل؟؟؟
الرجاء اضف 1 ثم 2 ثم احذف 2 وستجد الخطأ !!!!
جربت على جهاز اخر والمشكلة ذاتها
أتوقع عرفت المشكلة !!
السبب اني أحرر الزر وأنا ما زلت داخل حدث الضغط عليه
جربت عدم حذفه ومشي الحال
الان سأجرب كيفية حذفه دون الضغط عليه