بسم الله الرحمن الرحيم
السلام عليكم إخواني وحمة الله وبركاته
سنتعلم اليوم سويا إن شاء الله كيفية التعامل مع مسجل النظام لتخزين إعدادات البرامج التي نصممها
ألان أولا ما هو مسجل النظام؟
هو برنامج موجود ضمن نظام التشغيل(الويندوز) ليتم حفظ قيم إعدادات البرامج فيه عند غلق البرنامج
-هذا ما سنتحاج معرفته هنا- مثلا حجم النافذة ,حالتها فربما تكون أغلقت وهى في وضع التصغير أو التكبير
أو الوضع العادي.
وأيضا حفظ إعدادات المستخدم والهدف من هذه العملية هو استرجاع هذه الإعدادات عند إعادة فتح البرنامج
وتنفيذها فيبدو البرنامج كما اغلق تماما ويتم تخزين الإعدادات الجديدة عند إغلاق البرنامج.
أتمنى أن يكون الهدف من هذا الموضوع واضح
ولان لنرى طريقة الربط بين برنامج سنقوم نحن بعمله وبين مسجل النظام
وهذا البرنامج بسيط جدا حيث انه عبارة عن نافذة خالية تماما
نبدا اولا بوضع هذه الجملة فى اول الكود
using Microsoft.Win32;
ثم لابد من تعريف كائن يسمح لنا بالوصول للمسجل عن طريقه كالتالي
private RegistryKey myRegistry;
بهذا التعريف تكون قد أنشأنا الكائن الذي سيسمح لنا بالاتصال بمسجل النظام
الخطوة التالية هي إنشاء مفتاح في فهرس السجلات ويتم بالكود التالي
myRegistry = Registry.CurrentUser.CreateSubKey("SoftwareHourse");Hourseمفتاح في مسجل النظام بهذا الاسم وبالطبع يمكنك كتابة إي اسم ألان فقد أنشأنا
ويمكنك التأكد من أن الاسم قد انشا كالتالي
Start >> Run >> regedit >> HKEY_CURRENT_USER >>Software >> Hourse
وبالطبع لن تجد إي شئ في النافذة المقابلة لأننا لم نضف إي شئ
ثم نقوم بعد ذلك بإضافة مفاتيح في مسجل النظام (تشبه إلي حد كبير المتغيرات) وتعيين قيم افتراضية له ليتم تنفيذها
أول مره ويكون الكود المطلوب كالتالى.
myRegistry = Registry.CurrentUser.OpenSubKey("SoftwareHourse", true);
if(myRegistry == null)
{
myRegistry = Registry.CurrentUser.CreateSubKey("SoftwareHourse");
//بناء الاعدادات لاول مرة
myRegistry.SetValue("Main_X", System.Convert.ToString(20));
myRegistry.SetValue("Main_Y", System.Convert.ToString(20));
myRegistry.SetValue("Main_Width", System.Convert.ToString(600));
myRegistry.SetValue("Main_Height",System.Convert.ToString(500));
myRegistry.SetValue("Main_State", "Normal");
}ألان قمنا بعمل مفاتيح للأشياء التي نريد تخزينها وهى كالتالي
Main_X نستخدم هذا المفتاح لحفظ بعد النافذة من قمة الشاشة وفرضنا له قيمة افتراضية
Main_Y" " " " " " يسار " " "
Main_Width " " " عرض الشاشة
Main_Height " " " ارتفاع الشاشة
Main_State " " "حالة الشاشة
ويمكنك إضافة مفتاح لكل قيمة تريد حفظها بنفس الطريقة
لاحظ هذه الجملة
myRegistry = Registry.CurrentUser.OpenSubKey("SoftwareHourse", true);true تستحدم لفتح المفتاح بامكانية الكتابة عليه
false تستخدم لفتح المفتاح للقراءة فقط
ويمكن كتابة الجملة بدونهما وفى هذه الحالة تكون للقراءة فقط وتبدو كالتالى
myRegistry = Registry.CurrentUser.OpenSubKey("SoftwareHourse");اما هذه الجملة
myRegistry = Registry.CurrentUser.CreateSubKey("SoftwareHourse");فلا تشتخدم الا هكذا
ويتم تخزين قيم هذه المفاتيح عند غلق النموذج بالشكل التالي(توضع فى حدث الاغلاق الخاص بالتموذج)
myRegistry.SetValue("Main_X",Form1.Left.ToString());
myRegistry.SetValue("Main_Y",Form1.Top.ToString());
myRegistry.SetValue("Main_Width",Form1.Width.ToString());
myRegistry.SetValue("Main_Height",Form1.Height.ToString());
switch (Form1.WindowState)
{
case System.Windows.Forms.FormWindowState.Normal:
{myRegistry.SetValue("Main_State", "Normal");
break;
}
case System.Windows.Forms.FormWindowState.Maximized:
{
myRegistry.SetValue("Main_State", "Maximized"); break;
}
case System.Windows.Forms.FormWindowState.Minimized:
{
myRegistry.SetValue("Main_State", "Minimized");
break;
}
}هكذا يتم حفظ القيم فى مسجل النظام من النموذج عند غلقه وبنفش الطريقة تحفظ قيم اى اعداد نريده .
ألان لنسترجع القيم المحفوظة في مسجل النظام وتطبيقها كالتالي(يمكن وضعها فى حدث بداية التحميل)
Form1.SetDesktopBounds(
System.Convert.ToInt32(myRegistry.GetValue("Main_X"))
,System.Convert.ToInt32(myRegistry.GetValue("Main_Y"))
,System.Convert.ToInt32(myRegistry.GetValue("Main_Width"))
,System.Convert.ToInt32(myRegistry.GetValue("Main_Height")));
switch (myRegistry.GetValue("Main_State").ToString())
{
case "Normal":
{
Form1.WindowState=System.Windows.Forms.FormWindowState.Normal;
break;
}
case "Maximized":
{
Form1.WindowState = System.Windows.Forms.FormWindowState.Maximized;
break;
}
case "Minimized":
{
Form1.WindowState =System.Windows.Forms.FormWindowState.Minimized;
break;
}
}بهذه الطريقة يتم اظهار النموذج حسب القيم المخزنة فى مسجل النظام ليبدو النموذج كما كان هند اغلاقه اخر مرة وهذا هو الهدف من تخزين الاعدادات فى مسجل النظام ويمكن تخزين امور اعقد من ذلك كثيرا .
اضافة اخرى على برنامجنا البسيط.
والان لناخذ مثالا اخر
لنفرض ان برنامجنا هو برنامج متعدد اللغات يعنى يدعم اكثر من لغة مثل العربية والانجليزية
لنقم بوضع 2 راديو بوطين على النموذج (مربع اختيار) ونعطيهم عناوين انجليزى وسنقوم بتخزين اختيار المستخدم عند غلق النموذج ونسترجعه عند فتحها من جديد.
نقوم بانشاء مفتاح جديدوتعيين قيمة افتراضية كالتالى
myRegistry.SetValue("Language", "arabic");public Form1()
{
//فتح المفتاح الفرعى
myRegistry = Registry.CurrentUser.OpenSubKey("SoftwareHourse", true);
if(myRegistry == null)
{
//انشاء المفتاح الفرعى فى حالة عدم وجوده وتعين قيمة مبيدئية لهذا المفتاح
myRegistry = Registry.CurrentUser.CreateSubKey("SoftwareHourse");
myRegistry.SetValue("language","arabic");
}
InitializeComponent();
}ثم نكتب هذا الكود فى هذه الدالة
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (this.arabic.Checked==true)
myRegistry.SetValue("language","arabic");
else
myRegistry.SetValue("language","english");
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}وهذا الكود فى حدث التحميل
private void Form1_Load(object sender, System.EventArgs e)
{
switch (myRegistry.GetValue("language").ToString())
{
case "arabic":
{
this.arabic.Checked=true;
break;
}
case "english":
{
this.english.Checked=true;
break;
}
}
}شغل البرنامج واختار "عربى" ثم اغلق النموذج واعد تشغليه ستجد اللغة التى حددتها مسبقا ما زالت مختاره برغم انك اغلقت النموذج وربما البرنامج
كان هذا اعزائى شرحا مبسطا لجزء من التعامل مع مسجل النظام حيث اننا تعاملنا فقط مع المفتاح
HKEY_CURRENT_USER
ويوجد اربع مفاتيح اخرى ربما نتناولها فى دروس قادمة ويمكنك ان تحصل على شرح وافى من الهلب(ام اس دى ان ) قم بعمل بحث على الكلمة الاتية
RegistryKey || Registry
وستجد انك بالفعل وقعت على كنز سيساعدك كثيرا انا شخصيا استخدمها دائما واشتفيد منها جدا فعليك بها.
والان بعض الدوال التى لم نتعرض لها فى الدرس سنمر عليها
DeleteSubKey
تحذف المفتاح الفرعى المعطى لها
//تحذف مفتاخ اللغة
myRegistry.DeleteSubKey("language");DeleteSubKeyTree
تحذف المفتاح واى مفاتيح فرعية تحته
//تحذف مفتاخ اللغة واية مفاتيح فرعية منه
myRegistry.DeleteSubKeyTree("language");مع خالص تحياتى وتمنياتى للجميع بالتوفيق وكل عام وانتم بخير
Prince of Egypt