مشاهدة النسخة كاملة : HomeWork_10 تمرين تطبيقي
STRELiTZIA
28-10-2009, 05:58 PM
السلام عليكم و رحمة الله
التمرين التطبيقي الخاص بالدرس رقم 10 ينقسم الى ثلاثة اقسام :
1- يوجد في الدرس خطأ عمدي... ما هو ؟ تمت الاشارة اليه في رسالة لمن تتبع الدرس...
2- برمجة تطبيق يعمل بخاصية Open with، يعني يتم ربط نوع من انواع الملفات بايقونة التطبيق و يفتح هذا الملف بالتطبيق فقط.
نوع الملف : نصي و امتدادة : .D4A
3- ربط التطبيق بخيار Uninstall، يعني عند الذهاب الى Add/Remove programs في Control panel نجد اسم التطبيق هناك... مع اضافة معلومات مثل : رقم اصدار التطبيق، الشركة، رابط التحميل الخ...
بالتوفيق ان شاء الله
Goblin
29-10-2009, 07:43 PM
السلام عليكم و رحمة الله و بركاته
1- يوجد في الدرس خطأ عمدي... ما هو ؟ تمت الاشارة اليه في رسالة لمن تتبع الدرس...
لم اجده ! :oops:
2- برمجة تطبيق يعمل بخاصية Open with، يعني يتم ربط نوع من انواع الملفات بايقونة التطبيق و يفتح هذا الملف بالتطبيق فقط. نوع الملف : نصي و امتدادة : .D4A
ساتركه لغيري. :tong:
3- ربط التطبيق بخيار Uninstall، يعني عند الذهاب الى Add/Remove programs في Control panel نجد اسم التطبيق هناك... مع اضافة معلومات مثل : رقم اصدار التطبيق، الشركة، رابط التحميل الخ...
هذا ما عملت عليه, فكرته كالاتي:-
- يقوم البرنامج باضافة نفسه فى"Add/Remove programs" من خلال تسجيل اسم البرنامج و بعض البيانات المطلوبة (مثل رقم الاصدار و اسم الشركة و موقع الشركة) فى السجل "Registry" فى العنوان:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Curr entVersion\Uninstall\
- يقوم ايضا بانشاء ملف "Uninstall.bat" و اضافة مسارة فى السجل فى العنوان السابق فى مفتاح من نوع "String" يسمي "UninstallString".
بعد ذلك ستجد البرنامج فى قائمة "Add/Remove programs".
- ملحوظة: عند حذف الرنامج من قائمة "Add/Remove programs" لاول مرة, سيحذف البرنامج و لكن سيبقي اسم البرنامج فى القائمة.
لحذف اسم البرنامج, احذف البرنامج مرة اخري من القائمة.
السبب فى ذلك ان بعد حذف البرنامج لاول مرة, لا يتم حذف القيم الموجودة فى السجل الخاصة بالاصدار و اسم الشركة, الخ..
- عذرا اذا كانت الطريقة دون المستوي.
STRELiTZIA
30-10-2009, 10:59 AM
السلام عليكم و رحمة الله
لم اجده !
هذه هي الأوامر التي تحتوي على الخطأ العمدي :
function TMain.WriteReg(KeyRoot: HKEY; Key, Value, NewValue: string): Boolean;
var
Reg: TRegistry;
begin
Result := False;
Reg := TRegistry.Create;
Reg.RootKey := HKEY_LOCAL_MACHINE;
if Reg.OpenKey(Key, True) then
begin
if not (Reg.ReadString(Value) = NewValue) then
begin
Reg.WriteString(Value, NewValue);
Result := True;
end;
end
else
begin
Result := False;
end;
Reg.CloseKey;
Reg.Free;
end;
function TMain.ReadReg(KeyRoot: HKEY; Key, Value: string): string;
var
Reg: TRegistry;
begin
Reg := TRegistry.Create;
Reg.RootKey := HKEY_LOCAL_MACHINE;
if Reg.OpenKey(Key, False) then
if Reg.ValueExists(Value) then
begin
Result := Reg.ReadString(Value);
end
else
begin
Result := 'Error: ' + Value + ' not found';
end;
Reg.CloseKey;
Reg.Free;
end;
هذه طريقة الاستدعاء :
ReportMmo.Lines.Add(ReadReg(HKEY_LOCAL_MACHINE, '\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon', 'Shell'));
WriteReg(HKEY_LOCAL_MACHINE, '\SOFTWARE\D4A', 'File Name', Application.ExeName);
لملاحظة الخطأ يتطلب فقط بعض التركيز البسيط :brow:
السبب فى ذلك ان بعد حذف البرنامج لاول مرة, لا يتم حذف القيم الموجودة فى السجل الخاصة بالاصدار و اسم الشركة, الخ..
الفكرة التي وضعتها اخي Goblin هي المعمول بها مع بعض الاضافات الخفيفة :
Reg.WriteString('UninstallString', Application.ExeName + ' Uninstall');
اضافة Parameter ليتم التفاعل معه عند تشغيل التطبيق
if ParamStr(1) = 'Uninstall' then
begin
Action 01 = Stop and delete installed files... (Location 'Current folder' and 'System folder' and...)
Action 02 = Delete all Registry values...
Action 04 = ....
Action 05 = ....
Action 06 = ....
Action 07 = Make and run 'Suicide.bat' to delete last file and empty folder or
tell system to delete on reboot last file.
end;
اوامر الفحص عن التشغيل، في حالة التقاط Parameter يتم قراءته و ان تطابق مع الشرط التطبيق يقوم بعمل اللازم...
هذه الأوامر تخص التقاط براميتر واحد فقط و تتجاهل البرامترات الأخرى، في حالة ارادة معالجة كل البرامترات الممررة على التطبيق نقوم بعمل حلقة تلتقط كل ما يمرر للتطبيق ليتم معالجته..
var
x: integer;
begin
for x := 1 to ParamCount do
begin
if paramStr(x) = 'Uninstall' then
begin
end;
end;
يمكن ايضا استعمال ملف خارجي يحتوي على التعليمات التي يجب عملها للالغاء التنصيب بنجاح و دون اخطاء، هذه التعليمات تكون منظمة تحت اقسام واضحة او مشفرة...
عذرا اذا كانت الطريقة دون المستوي.
لا يا اخي Goblin حلك جيد :)
---
هيا... هل من حلول... الأمور اصبحت اكثر وضوحا :)
Goblin
30-10-2009, 01:54 PM
استاذ STRELiTZIA
لقد حاولت تطبيق تلك الطريقة, لكن لم استطع جعل البرنامج يحذف نفسه.
STRELiTZIA
30-10-2009, 03:04 PM
استاذ STRELiTZIA
لقد حاولت تطبيق تلك الطريقة, لكن لم استطع جعل البرنامج يحذف نفسه.
اذا كنت تريد استعمال ملف BATCH يجب وضع امر الحذف في حدث OnDestroy لكي يستطيع حذف البرنامج و من الأفضل انشاء ملف الــ Batch في مجلد الــ Temp ليقوم بتنظيف المجلد الفارغ ايضا...
وضع الأمر في حدث OnDestroy يجب ان يتأثر بنتيجة الــ Parameter الممرر للتطبيق لكي لا ينفذ امر الحذف في كل حالات OnDestroy.
و اذا اردت ان تستعمل الرجيستري، يكفي الاطلاع على المشاركة التالية :
http://www.delphi4arab.com/forum/showthread.php?t=1699
او استعمال مفتاح : RunOnce ليتم تشغيل محتواه مرة واحدة عن تشغيل النظام...
السلام عليكم
ممكن ... الخطأ :
1- KeyRoot: HKEY; معرف بدون أن يستخدم .
- لأن RootKey خاصية لها نفس إسم المتغير (للضليل ؟؟؟) .
property RootKey: HKEY read FRootKey write SetRootKey;
STRELiTZIA
02-11-2009, 03:11 PM
و عليكم السلام و رحمة الله
طالت غيبتك اخي TF6M :)
نعم... ملاحظة جيدة : الخطأ العمدي خاص بالمتغير : Rootkey
حيث الدالة يجب ان تتاثر بالقيمة التي تمرر اليها...
في حالة التمرين :
function TMain.WriteReg(KeyRoot: HKEY; Key, Value, NewValue: string): Boolean;
var
Reg: TRegistry;
begin
Result := False;
Reg := TRegistry.Create;
Reg.RootKey := HKEY_LOCAL_MACHINE;
if Reg.OpenKey(Key, True) then
begin
if not (Reg.ReadString(Value) = NewValue) then
begin
Reg.WriteString(Value, NewValue);
Result := True;
end;
end
else
begin
Result := False;
end;
Reg.CloseKey;
Reg.Free;
end;
الكتابة الصحيحة :
function TMain.WriteReg(KeyRoot: HKEY; Key, Value, NewValue: string): Boolean;
var
Reg: TRegistry;
begin
Result := False;
Reg := TRegistry.Create;
Reg.RootKey := KeyRoot;
if Reg.OpenKey(Key, True) then
begin
if not (Reg.ReadString(Value) = NewValue) then
begin
Reg.WriteString(Value, NewValue);
Result := True;
end;
end
else
begin
Result := False;
end;
Reg.CloseKey;
Reg.Free;
end;
يعني في الحالة الأولى اننا مهما غيرنا القيمة الممررة للمتغير فانه يعالج فقط الــ Hive الخاص بــ Local machine لانه موجود داخل الدالة بصفة قيمة ثابتة...
و الحالة الثانية تعطي القابلية التامة لتمرير كل انواع الــ Hive الموجودة في النظام و معالجتها...
بالتوفيق ان شاء الله
بارك الله فيك أستاذ ...
في ما يخص السؤال التاني تم الإجابة عنه + يبقى السؤال التالث أتركه للبقية :bye1:
(الحل مرفق تحت )
ملاحظة : يجب ان يكون البرنامج ثابت مثلا في C:\
بالتوفيق ,,
Goblin
02-11-2009, 08:46 PM
السلام عليكم و رحمة الله و بركاته
ساتركه لغيري. :tong:
غيرت رأيي ! :tong:
- التطبيق عبارة عن مفكرة بسيطة تقوم بقراءة و كتابة ملفات نصية ذات امتداد "D4A", ثم يعطيها ايقونة مميزة.
--
لمزيد من التفاصيل, حمل المرفقات.
vBulletin® , Copyright ©2008-2012