السلام عليكم ورحمة الله وبركاته
فى هذا المقال نستعرض ملفات المصادر المختلفة اتمنى ان تجدو فيه الفائدة
مقدمة:
يمكن لملفات المصادر ان تحتوى على نصوص،صور، او اى بيانات اخرى للتطبيق لتحميلها فى وقت التنفيذ.
الغاية من ملفات المصادر هو تمكينك من استبدال مجموعة مصادر باخرى بسهولة. واكثر الاستخدامات الشائعة لملفات المصادر هو تزويد التطبيق بمصادر مختلفة للغات مختلفة،ففى التطبيقات المتعددة اللغات تقوم بارفاق المصادر لجميع اللغات التى يدعمها التطبيق وبعدها يقوم التطبيق باختيار الملف المناسب اعتمادا على اعدادات الجهاز.ماتمتاز به ملفات المصادر هو امكانية تعديل بياناتها بدون اعادة ترجمة التطبيق Recompiling ،كما يمكن لملفات المصادر ان تكون مطمورة Embeeded ضمن التطبيق وفى هذه الحالة لايمكن تغييرها من دون اعادة ترجمة التطبيق.
Application Resources
لانشاء مصادر للتطبيق فى مستكشف الحلول Solution Explorer قم بالنقر المزدوج على My Project وبعدها اختار التبويب Resource وفى النافذة تجد قائمة تمكنك من تحديد نوع ملف المصادر كـString,Icon,Audio,TextFile
بالنسبة للنصوص فيمكنك ادخالها من خلال Grid فى العمود Name نضع اى اسم وهو يمثل الاسم البرمجى الذى سنتعامل معه وفى العمود Valueتوضع القيمةوفى العمود الثالث يمكنك اضافة اى ملاحظة تريدها.اما بالنسبة لـImage فعند اختيارها يمكنك انشاء ملفات صور بامتدادات مختلفة تقوم بتحريرها بنفسك. وبالنسبة للانواع الاخرى يتم عرض مربع حوارى لاختيار الملف المناسبوبالامكان اضافة اى ملف اخر باختيار Add Existing Item
عندما تقوم بانشاء ملفات مصادر للتطبيق فان بيئة التطوير تقوم تلقائيا بتوليد الكود الللازم الذى يضيف خواص المصادر الى فضاء الاسماء My.Resource ،اذا فتحت مستكشف الحلول وقمت بالنقر على الزر Show All File فسترى الملف Resource.Designer.vb تحت العنصر Resources.resx على سبيل المثال الكود التالى يبين الخاصية الموجودة فى الملفb Resource.Designer.v المولد من قبل vs.net وهو يقوم باسترجاع الصورة smile
Friend ReadOnly Property Octahedron() As System.Drawing.Bitmap Get Return CType(ResourceManager.GetObject(“smile”, _ resourceCulture),System.Drawing.Bitmap) End Get End Property
بافتراض اننا اضفنا مصدر نص حيث name تكون Test وفى الـValue وضعنا "تجربة المصادر" ولدينا صورة مضافة الى مصادر التطبيق الكود التالى يوضح كيفية جلبها من خلال My.Resouce
Private Sub Form1_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load lblTest.Text = My.Resources.Test Me.BackgroundImage = My.Resources.Smile End Sub
ولان اجراءات خواص المصادر من الاجراءات النوعية فهى مدعومة من Intellisense فبمجرد كتابتك لـMy.Resource. تجد قائمةباسماء جميع مصادر التطبيق
يمكنك ايضا استخدام الكائن ResourceManager للتواصل مع مصادر التطبيق
Private Sub Form1_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load lblTest.Text = My.Resources.ResourceManager.GetString(“Test”) Me.BackgroundImage = CType( _ My.Resources.ResourceManager.GetObject(“Smile”), _ Image) End Sub
استخدام الخواص المولدة تلقائيا فى فضاء الاسماء My.Resource افضل من هذه الطريقة
Embedded Resources
بالاضافة لتخزين المصادر فى ملف مصادر التطبيق Resource.resx بامكانك اضافة ملفات مصادر اخرى للتطبيق. افتح القائمة Project واختار AddNewItem وبعدها اختار القالب Resource File واعطى اسم معبر للملف وبعدين OK بعد اضافة هذا الملف للمشروع يمكنك فتحه من خلال مستكشف الحول بالنقر المزدوج واضافة المصادر اليه كما فى الطريقة السابقة فى التعامل مع ملف مصادر التطبيق.
فى وقت التنفيذ يمكنك استخدام الكائن Resource Manager فقط لجلب المصادر من الملف المطمور بافتراض اننا قمنا بانشاء ملفى مصادر الاول اسميناه Image.resx حيث نضع به الصور والثانى Strings.resx
ولاستجلاب الملفات فى البداية يتم تعريف متغير من الفئة ResourceMnager وبعدها يتم انشاء كائن من هذه الفئة حيث ان مشيد الفئة NEW يقبل وسيطتين الاولى نصية ونضع بها مسار ملف المصادر والثانية اسم المجمع الذى يحتوى على هذا الملف،مسار الملف يتالف من فضاء الاسماء الجذرىللمشروع root namespace ملحقا باسم الملف.
بالنسبة للنصوص استخدم الطريقة GetString والانواع الاخرى استخدم GetObject ولا تنسى استخدام دوال التحويل اذا كان الخيار Option Strict مفعلا
Private Sub Form1_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load Dim resource_manager As ResourceManager ‘ Get the Smile image from Images.resx. resource_manager = New ResourceManager( _ “EmbeddedResources.Images”, _ Me.GetType.Assembly) Me.BackgroundImage = CType( _ resource_manager.GetObject(“Smile”), _ Image) ‘ Get the Test from StringResources.resx. resource_manager = New ResourceManager( _ “EmbeddedResources.StringResources”, _ Me.GetType.Assembly) lblTest.Text = resource_manager.GetString(“Test”) End Sub
Strongly Typed Embedded Resources
يمكنك جعل بيئة التطوير تقوم بتوليد الكود الللازم والذى يقوم باضافة الخواص لجلب المصادر من الملفات المطمورة تماما مثل ما كان يفعل مع مصادر التطبيق، لعمل ذلك من مستكشف الحلول حدد ملف المصادر وبعدها افتح نافذة الخصائص لهذا الملف. غير قيمة الخاصية
file’s Custom Tool الى VbMyResourcesResXFileCodeGenerator وايضا ضع اسم فضاء الاسماء الذى تريده ان يحتوى على خواص المصادر فى الخاصية Custom Tool Namespace على سبيل المثال نضع القيمةMy.StringsResource لملف المصادر النصية وبعدها يمكنك استخدامه بسهولة وهو افضل من استخدام الكائن ResourceManager
….. lblTest.Text = My.StringsResources.Test ......
Satellite Resources
ملفات المصادر المطمورة تمكنك من تنظيم ووضع البيانات فى موقع مركزى على سبيل المثال يمكنك حفظ كل الصور المستخدمة فى ملف مصادر واحد وبعدها يمكن لكل الشاشات Forms استخدام هذه الصور من هذا الملف
ولكن كما ذكرنا فى المقدمة بان ملفات المصادر المطمورة عند استبدالها ستضطر الى اعادة ترجمة التطبيق حتى يتعامل مع الملفات الجديدة.
يمكن حل هذه المشكلة بوضع ملفات المصادر فى مجمع خاص بها Resource-only Assembly وهذا المجمع يحتوى على بيانات التطبق فقط ولا علاقة له بمنطق البرنامج وهو ما يسمى بـSattellite Assembly او المجمع التابع
ولانشاء هذا المجمع ابداء مشروع جديد واختار القالب Class Library ثم احدف الكلاس المبدئ والذى تضيفه بيئة التطوير وبعدها قم باضافة المصادر للمشروع كالمعتاد وعدها قم بترجمة المشروع والذى سينشئ منه ملف بالامتداد .DLL
والان يمكنك انشاء تطبيق نوافذ والذى يقوم بتحميل المصادر من المجمع الذى انشأناه للتو
كما ترى فى الكود فى البداية قمنا بتعريف متغير من الفئة Assembly وباستخدام الطريقة المشتركةLoadFrom والتى تاخذ مسار المجمع كوسيطة يتم تحميل كافة المعلومات حول المجمع المرسل كوسيطة لهذه الطريقة وبوضعك للملف SatelliteResources.dll فى مجلد bin لن تضطر الى كتابة السار الكامل لهذا الملف وباقى الكود تم شرحه سابقا
Private Sub Form1_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load ‘ Get the resource Assembly. Dim satellite_assembly As Assembly satellite_assembly = Assembly.LoadFrom(“SatelliteResources.dll”) ‘ Create a ResourceManager for the satellite’s ‘ main resource file. Dim resource_manager As ResourceManager resource_manager = New ResourceManager( _ “SatelliteResources.Resources”, _ satellite_assembly) ‘ Get the string resource from the satellite’s ‘ main resource file. lblTest.Text = resource_manager.GetString(“Test”) ‘ Create a ResourceManager for the satellite’s ‘ Images resource file. resource_manager = New ResourceManager( _ “SatelliteResources.Images”, _ satellite_assembly) ‘ Get the form’s background image from the satellite’s ‘ Images resource file. Me.BackgroundImage = CType( _ resource_manager.GetObject(“Smile”), Image) End Sub
والان عند تغيير قيم Value لـTest و Smile تقوم فقط بتحديث المجمع التابع واعادة ترجمته وينشئ عنه ملف .DLL جديد تقوم بنسخه الى مجلد تطبيق النوافذ والذى سيقوم بقراءة القيم الجديدة بدون اعادة ترجمته من جديد
Localization Resources
احد اهم الاسباب لابتكار ملفات المصادر هو اقلمة التطبيقات،دعم نصوص وصور واى عناصر اخرى للغات وثقافات مختلفة ويمكن اقلمة نماذج ويندوز من خلال VS.NET بسهولة.
انشى فورم وضع عليه اى من الادوات تريد وغير خواصها كالمعتاد وستكون اللغة المعد عليها جهازك هى اللغة الافتراضية،بعد ذلك غير قيمة الخاصية Localizble الى True وبعدها غير الخاصية Language الى اى لغة تريد دعمها فى تطبيقك الان غير خواص الادوات والفورم بما يلاءم اللغة الجديدة حيث سيقوم vs.net بحفظ التغييرات التى قمت بها فى ملف مصادر جديد ملحق بالفورم.
فى وقت التنفيذ سيقوم التطبيق تلقائيا بفحص اعدادات الجهاز واختيار ملف المصادر المناسب.
فى الوضع الطبيعى يجب ترك التطبيق يقوم باختيار ملف المصادر الملائم تلقائيا ولكن بامكانك تحديد ملف المصادر بنفسك لغرض التجريب مثلا لعمل ذلك من مستكشف الحلول انقر على الزر Show All File تجد ملف بلاسم Form1.Designer.vb افتحه وفى الاجراؤ new اكتب الكود التالى
Imports System.Threading Imports System.Globalization Public Class Form1 Public Sub New() MyBase.New() ‘ Set the culture and UI culture to German. Thread.CurrentThread.CurrentCulture = New CultureInfo(“ar-SA”) Thread.CurrentThread.CurrentUICulture = New CultureInfo(“ar-SA”) ‘This call is required by the Windows Form Designer. InitializeComponent() End Sub End Class
ComponentResourceManager & Localization
الفئة ResourceManager تمكننا من جلب البيانات من ملفات المصادر باستخدام الطرق GetString و GetObject ايضا الفئة ComponentResourceManager لها مثل هذه الطرق وتقوم بنفس الوظيفة.
ولكن توجد بهذه الفئة طريقة مميزة وهى ApplyResource التى تمكننا من تطبيق المصادر على الكائنات بسهولة فهى تاخذ وسيطتين الاولى اسم الكائن المراد تطبيق المصادر عليه والثانية اسم المصدر .هذه الطريقة تقوم بالبحث فى ملفات المصادر عن العناصر باستخدام اسم الكائن وبعد ذلك تقوم بتطبيق اى مصدر تجده لعى خواص هذا الكائن على سبيل المثال بامكانك استخدام الطريقة ApplyResource للبحث عن المصادر باستخدام اسم الكائن ExitButton وتطبيقها على الاداة btnExit ،فاذا كان ملف المصادر يحتوى على عنصر مسمى ExitButton.Text فسيتم تطبيقه على الخاصية Text للاداة btnExit واذا تم العثور على مصادر اخرى مثل ExitButton.Size وExitButton.Location فسيام تطبيقها على الاداة.
عندما تقوم باقلمة الفورم Localization يقوم vs.net تلقائيا بانشاء المدخلات فى ملف المصادر المناسب لادوات الففورم. مثلا اذا قمت بتغيير اللغة الى الانجليزية وغيرت الخاصية Text لـbtnExit الى Exit فسيقوم VS.NET باضافة مخل نصى بالاسم btnExit.Text مع القيمة Exit الى ملف المصادر الخاص بهذه اللغة.
Vs.net يستخدم اسم خاص لتمثيل خواص الفورم وهو $this ،مثلا اذا غيرت خاصية Text للفورم فستقوم بيئة التطوير باضافة مصدر نص بلاسم $this.Text ويحمل القيمة التى تم اذخالها الى ملف المصادر المحدد للغة المختارة
يوجد مثال مرفق يوضح كيفية استخدام هذه الفئة لتغيير لغة واجهة المستخدم فى وقت التنفيذ
بالتوفيق للجميع


![29_09_05_02_32_59_1128029579_4_13_3[_].gif](http://www.arabteam2000.com/picload/pics/29_09_05_02_32_59_1128029579_4_13_3%5B_%5D.gif)

