HomeWork_10 تمرين تطبيقي
#1
السلام عليكم و رحمة الله

التمرين التطبيقي الخاص بالدرس رقم 10 ينقسم الى ثلاثة اقسام :

1- يوجد في الدرس خطأ عمدي... ما هو ؟ تمت الاشارة اليه في رسالة لمن تتبع الدرس...

2- برمجة تطبيق يعمل بخاصية Open with، يعني يتم ربط نوع من انواع الملفات بايقونة التطبيق و يفتح هذا الملف بالتطبيق فقط.
نوع الملف : نصي و امتدادة : .D4A

3- ربط التطبيق بخيار Uninstall، يعني عند الذهاب الى Add/Remove programs في Control panel نجد اسم التطبيق هناك... مع اضافة معلومات مثل : رقم اصدار التطبيق، الشركة، رابط التحميل الخ...

بالتوفيق ان شاء الله
الرد
#2
السلام عليكم و رحمة الله و بركاته

STRELiTZIA كتب :1- يوجد في الدرس خطأ عمدي... ما هو ؟ تمت الاشارة اليه في رسالة لمن تتبع الدرس...

لم اجده ! :oops:

STRELiTZIA كتب :2- برمجة تطبيق يعمل بخاصية Open with، يعني يتم ربط نوع من انواع الملفات بايقونة التطبيق و يفتح هذا الملف بالتطبيق فقط. نوع الملف : نصي و امتدادة : .D4A

ساتركه لغيري. :tong:

STRELiTZIA كتب :3- ربط التطبيق بخيار Uninstall، يعني عند الذهاب الى Add/Remove programs في Control panel نجد اسم التطبيق هناك... مع اضافة معلومات مثل : رقم اصدار التطبيق، الشركة، رابط التحميل الخ...

[COLOR="RoyalBlue"]هذا ما عملت عليه, فكرته كالاتي:-

- يقوم البرنامج باضافة نفسه فى"Add/Remove programs" من خلال تسجيل اسم البرنامج و بعض البيانات المطلوبة (مثل رقم الاصدار و اسم الشركة و موقع الشركة) فى السجل "Registry" فى العنوان:[/COLOR]
كود :
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\
[COLOR="RoyalBlue"]- يقوم ايضا بانشاء ملف "Uninstall.bat" و اضافة مسارة فى السجل فى العنوان السابق فى مفتاح من نوع "String" يسمي "UninstallString".

بعد ذلك ستجد البرنامج فى قائمة "Add/Remove programs".

- ملحوظة: عند حذف الرنامج من قائمة "Add/Remove programs" لاول مرة, سيحذف البرنامج و لكن سيبقي اسم البرنامج فى القائمة.
لحذف اسم البرنامج, احذف البرنامج مرة اخري من القائمة.

السبب فى ذلك ان بعد حذف البرنامج لاول مرة, لا يتم حذف القيم الموجودة فى السجل الخاصة بالاصدار و اسم الشركة, الخ..

- عذرا اذا كانت الطريقة دون المستوي.[/COLOR]


الملفات المرفقة
.rar   HomeWork_10 by Goblin.rar (الحجم : 158.81 ك ب / التحميلات : 529)
الرد
#3
السلام عليكم و رحمة الله
إقتباس :لم اجده !

هذه هي الأوامر التي تحتوي على الخطأ العمدي :

PHP كود :
function TMain.WriteReg(KeyRootHKEYKeyValueNewValuestring): Boolean;
var
  
RegTRegistry;
begin
  Result 
:= False;
  
Reg := TRegistry.Create;
  
Reg.RootKey := HKEY_LOCAL_MACHINE;
  if 
Reg.OpenKey(KeyTruethen
  begin
    
if not (Reg.ReadString(Value) = NewValuethen
    begin
      Reg
.WriteString(ValueNewValue);
      
Result := True;
    
end;
  
end
  
else
  
begin
    Result 
:= False;
  
end;
  
Reg.CloseKey;
  
Reg.Free;
end;
 
function 
TMain.ReadReg(KeyRootHKEYKeyValuestring): string;
var
  
RegTRegistry;
begin
  Reg 
:= TRegistry.Create;
  
Reg.RootKey := HKEY_LOCAL_MACHINE;
  if 
Reg.OpenKey(KeyFalsethen
    
if Reg.ValueExists(Valuethen
    begin
      Result 
:= Reg.ReadString(Value);
    
end
    
else
    
begin
      Result 
:= 'Error: ' Value ' not found';
    
end;
  
Reg.CloseKey;
  
Reg.Free;
end

هذه طريقة الاستدعاء :
PHP كود :
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 + ' [COLOR=red]Uninstall[/COLOR]');
اضافة Parameter ليتم التفاعل معه عند تشغيل التطبيق

كود :
if ParamStr([COLOR=red]1[/COLOR]) = '[COLOR=red]Uninstall[/COLOR]' 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 [COLOR=red]ParamCount[/COLOR] do
  begin
    if paramStr([COLOR=red]x[/COLOR]) = 'Uninstall' then
    begin

    end;
  end;


يمكن ايضا استعمال ملف خارجي يحتوي على التعليمات التي يجب عملها للالغاء التنصيب بنجاح و دون اخطاء، هذه التعليمات تكون منظمة تحت اقسام واضحة او مشفرة...

إقتباس :عذرا اذا كانت الطريقة دون المستوي.
لا يا اخي Goblin حلك جيد Smile

---
هيا... هل من حلول... الأمور اصبحت اكثر وضوحا Smile
الرد
#4
[COLOR="RoyalBlue"]استاذ STRELiTZIA

لقد حاولت تطبيق تلك الطريقة, لكن لم استطع جعل البرنامج يحذف نفسه.[/COLOR]
الرد
#5
Goblin كتب :[COLOR="RoyalBlue"]استاذ STRELiTZIA

لقد حاولت تطبيق تلك الطريقة, لكن لم استطع جعل البرنامج يحذف نفسه.[/COLOR]

اذا كنت تريد استعمال ملف BATCH يجب وضع امر الحذف في حدث OnDestroy لكي يستطيع حذف البرنامج و من الأفضل انشاء ملف الــ Batch في مجلد الــ Temp ليقوم بتنظيف المجلد الفارغ ايضا...

وضع الأمر في حدث OnDestroy يجب ان يتأثر بنتيجة الــ Parameter الممرر للتطبيق لكي لا ينفذ امر الحذف في كل حالات OnDestroy.

و اذا اردت ان تستعمل الرجيستري، يكفي الاطلاع على المشاركة التالية :
http://www.delphi4arab.net/forum/showthr...p?tid=1699

او استعمال مفتاح : RunOnce ليتم تشغيل محتواه مرة واحدة عن تشغيل النظام...
الرد
#6
السلام عليكم
ممكن ... الخطأ :
1-
كود :
KeyRoot: HKEY;
معرف بدون أن يستخدم .
- لأن RootKey خاصية لها نفس إسم المتغير (للضليل ؟؟؟) .
كود :
property RootKey: HKEY read FRootKey write SetRootKey;
الرد
#7
و عليكم السلام و رحمة الله
طالت غيبتك اخي TF6M Smile

نعم... ملاحظة جيدة : الخطأ العمدي خاص بالمتغير : Rootkey
حيث الدالة يجب ان تتاثر بالقيمة التي تمرر اليها...

في حالة التمرين :
كود :
function TMain.WriteReg([color=Red]KeyRoot[/color]: HKEY; Key, Value, NewValue: string): Boolean;
var
  Reg: TRegistry;
begin
  Result := False;
  Reg := TRegistry.Create;
  Reg.RootKey := [color=red]HKEY_LOCAL_MACHINE[/color];
  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([color=red]KeyRoot[/color]: HKEY; Key, Value, NewValue: string): Boolean;
var
  Reg: TRegistry;
begin
  Result := False;
  Reg := TRegistry.Create;
  Reg.RootKey := [color=red]KeyRoot[/color];
  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 الموجودة في النظام و معالجتها...

بالتوفيق ان شاء الله
الرد
#8
بارك الله فيك أستاذ ...
في ما يخص السؤال التاني تم الإجابة عنه + يبقى السؤال التالث أتركه للبقية :bye1:
(الحل مرفق تحت )
ملاحظة : يجب ان يكون البرنامج ثابت مثلا في C:\
بالتوفيق ,,


الملفات المرفقة
.rar   TF6M[Answer 02].rar (الحجم : 1.45 ك ب / التحميلات : 111)
الرد
#9
[color="royalblue"]السلام عليكم و رحمة الله و بركاته

Goblin كتب :ساتركه لغيري. :tong:
غيرت رأيي ! :tong:

- التطبيق عبارة عن مفكرة بسيطة تقوم بقراءة و كتابة ملفات نصية ذات امتداد "D4A", ثم يعطيها ايقونة مميزة.
--
لمزيد من التفاصيل, حمل المرفقات.[/color]


الملفات المرفقة
.rar   HomeWork_10(Notepad).rar (الحجم : 184.31 ك ب / التحميلات : 318)
الرد


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم