الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

الإعدادات في VB 2005

مغلق
بدأه محمد سامر أبو سلو في 18 مارس 2006 · 5 رد · 6,385 مشاهدة · في قسم الدروس والمواضيع المتميزة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

تتمة لموضوعي السابق إعدادات التطبيق وإعدادات المستخدم سأقوم بالتطرق إلى هذه الإعدادات من وجهة نظر VB2005

في الفريموورك 2 ستلاحظ سهولة انشاء الاعدادت حيث لم يعد من الضروري فتح ملف الإعداد وإدخال إعداداتك الخاصة بدلا عن ذلك يمكنك التوجه إلى مصمم الإعدادات مباشرة وإضافة إعداداتك مهما يكن مجالها تطبيق أم مستخدم. حيث تكون الإعدادات على مستوى التطبيق للقراءة فقط وهي مشتركة بين جميع المستخدمين في التطبيق وتكون مخزنة في الملف app.config في القسم <applicationSettings> والذي يختلف عن القسم <appSettings> الموجود في الفريموورك 1 وفي وقت التشغيل سيكون الملف app.config في المجلد Bin وسوف يتم إعادة تسميته وفقا لاسم البرنامج وكمثال على إعدادات على مستوى التطبيق تعريف وصلة قاعدة البيانات أو عنوان خدمة ويب أو عنوان ملقم ... الخ

<applicationSettings>
    <MySettingsDemo.MySettings>
      <setting name="SMTPServerIP" serializeAs="String">
        <value>127.0.0.1</value>
      </setting>
      <setting name="MyServicesURL" serializeAs="String">
        <value>http://localhost/myservices.asmx</value>
      </setting>
    </MySettingsDemo.MySettings>
  </applicationSettings>

الاعدادات على مستوى المستخدم تكون مخصصة لكل مستخدم ويمكن قراءتها وإعادة ضبطها بأمان من خلال كود التطبيق وتكون مخزنة في ملف user.config ولكي نكون دقيقين هناك ملفان user.config لكل مستخدم لكل تطبيق واحد للمشاركة وواحد بدون مشاركة ومع ذلك تنص وثائق VB2005 على أن الملف user.config سيتم تسميته تبعا لاسم المستخدم ولكن هذا ليس دقيقا حيث سيتم تخزينه في المسار

<c:\Documents and Settings>\<username>\[Local Settings\]Application 

Data\<companyname>\<appdomainname>_<eid>_<hash>\<verison>

حيث

<c:\Documents and Settings> مجلد بيانات المستخدم
<username> اسم المستخدم 
<companyname> اسم الشركة 
<appdomainname> Application Domain 
<eid> معرف المستخدم
<hash> hash 
<version> رقم نسخة التطبيق

وكمثال

C:\Documents and Settings\Emad.BROKENOAK\Local Settings\Application 
Data\MySettingsDemo\MySettingsDemo_9cfe5ef1\1.0.0.0

حيث يتم إنشاء الملف user.config في أول مرة يتم فيها تشغيل التطبيق بواسطة مستخدم جديد والقيم الغير افتراضية سوف يتم وضعها في ملف على مستوى المستخدم بينما القيم الموجودة في app.config في القسم <userSettings> هي القيم الافتراضية لهذه الاعدادات وهي محددة أيضا في الملف app.config وفيمايلي كيف يمكن ان يبدو الملف app.config

  <userSettings>
    <MySettingsDemo.MySettings>
      <setting name="LastSearchedItem" serializeAs="String">
        <value />
      </setting>
      <setting name="FormSize" serializeAs="String">
        <value>400, 400</value>
      </setting>
      <setting name="FormLocation" serializeAs="String">
        <value>0, 0</value>
      </setting>
    </MySettingsDemo.MySettings>
  </userSettings>

الإعدادات على مستوى المستخدم عظيمة لتخزين إعدادات التطبيق حيث عادة ما تختلف من مستخدم لآخر وكمثال على ذلك إعدادات العرض كحجم الخط وموقع النافذة أو لائحة الملفات المفتوحة أخيرا وهكذا. وهذه البنية مرنة جدا لأنها تمكن تطبيقك من تخزين الاعدادات لتطبيقك حتى لو كنت تعمل في بيئة محدودة الصلاحيات.

إنشاء إعداد

لنفترض أنه لدينا صندوق بحث في تطبيقك وأنت تريد تخزين آخر قيم تم البحث عنها

1 - في مستكشف الحل انقر نقرا مزدوجا على المشروع لعرض خصائص المشروع

2 - انقر صفحة Settings لعرض مصمم الإعدادات

3 - أدخل الاسم Name والنوع Type والمجال Scope للإعداد المطلوب

4 - في حقل القيمة Value أدهل القيمة الافتراضية لذلك الإعداد

وراء المشهد

عندما تضيف إعدادا جديدا في مصمم الإعدادات تجري عدة أشياء في الخلفية أولا يتم إضافة مدخل جديد في الملف app.config لتحديد هذا الاعداد

 <configSections>
    <sectionGroup 
name="applicationSettings"type="System.Configuration.ApplicationSettingsGroup, System, 
Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <section name="MySettingsDemo.MySettings" 
type="System.Configuration.ClientSettingsSection, System, 
Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    </sectionGroup>
  </configSections>

ثانيا تعريف الإعداد ذات نفسه يتم إضافته للملف app.config بالاعتماد على نوع Type الاعداد الذي تحدده حيث يمكنك أن ترى قسم applicationSettings أو userSettings أو connectionStrings أو أكثر من واحد منها اعتمادا على الإعدادات التي تحددها كمثال:

<userSettings>
    <MySettingsDemo.MySettings>
      <setting name="LastSearchedItem" serializeAs="String">
        <value />
      </setting>
      <setting name="FormSize" serializeAs="String">
        <value>400, 400</value>
      </setting>
      <setting name="FormLocation" serializeAs="String">
        <value>0, 0</value>
      </setting>
    </MySettingsDemo.MySettings>
  </userSettings>
  <connectionStrings>
    <add name="MySettingsDemo.MySettings.ConnectionString" 
connectionString="Server=TABLET; User ID=sa; Password=1234; 
Database=Northwind; Persist Security Info=True" 
providerName="System.Data.SqlClient" />
  </connectionStrings>
  <applicationSettings>
    <MySettingsDemo.MySettings>
      <setting name="SMTPServerIP" serializeAs="String">
        <value>192.168.2.11</value>
      </setting>
      <setting name="MyServicesURL" serializeAs="String">
        <value>http://localhost/MyServices/Service1.asmx</value>
      </setting>
    </MySettingsDemo.MySettings>
  </applicationSettings>

الوصول للإعدادات

بعد إضافة الإعداد سنحتاج لقراءته وتحديثه حيث يمكنك الوصول إليه عبر My.Settings كمثال

My.Settings.LastSearchedItem

وكطريقة أخرى للوصول لهذه الاعدادات هي ربطها بإحدى خصائص التحكم حيث من صندوق الخصائص انتقل إلى قسم Data وفيه (ApplicationSettings) ومنها (PropertyBinding) ومن الصندوق الذي يظهر لك انتقل للخاصية التير تريد ربطها مثلا Location وقم باختيار الضبط المناسب لها مثلا FormLocation أو حتى يمكنك إنشاء إعداد جديد من هناك بالنقر على New وكنتيجة لهذا الربط سيقوم المصمم بإنشاء كود في الخلف كالتالي

Me.DataBindings.Add(New System.Windows.Forms.Binding("Location", 
MySettingsDemo.MySettings.Value, "FormLocation", True, 
MySettingsDemo.MySettings.Value.LastSearchedItem, Nothing, 
System.Windows.Forms.BindingUpdateMode.OnPropertyChanged))

عندما تربط الإعدادات بهذه الطريقة لن تضطر للقلق حول قراءة وكتابة هذه الإعدادات حيث سيتم ضبط الخاصية عند الحاجة وسوف يتم تخزين قيمتها تلقائيا إذا تم تغييرها ويمكنك ملاحظة أن هذا كله يتم دون اضطرارك لكتابة أي سطر من الكود كما يجدر ملاحظة أن هذه الاعدادات يتم تخزينها تلقائيا في بعض أنواع المشاريع مثل Visual Basic Windows Forms ويجب أن تستدعي الاجراء Save من My.Settings في بعضها الآخر مثل مشاريع Class Library وإذا كانت الخاصية غير مدرجة ضمن نافذة الربط يمكنك تحقيق هذا الربط باستخدام الكود حيث لبعض الأسباب الخاصية Size غير متوفرة كخاصية يمكن ربطها في النسخة التجريبية وهي متوفرة في النسخة النهائية ويمكن تحقيق الربط بإضافة Binding جديد لمجموعة DataBindings collection ضمن الفورم حيث تستخدم الفئة Binding لتحديد اسم الخاصية واسم الإعداد وطريقة التحديث كمثال يمكننا ربط الخاصية Size بالإعداد FormSize يدويا كالمثال

Me.DataBindings.Add(New System.Windows.Forms.Binding("Size", _
                    MySettingsDemo.MySettings.Value, _
                    "FormSize"))

الإعدادات المتقدمة

إذا أردت تحكما إضافيا على إعداداتك يمكنك تحديد الفئة Class الخاصة بك والتي يجب أن تشتقها من الفئة ApplicationSettingsBase التي تشكل الفئة الأب لجميع فئات الاعدادات حيث تحدد كل إعداد كخاصية لهذه الفئة و تسبقها بالخاصية ApplicationScopedSettingAttribute إذا كانت على مكستوى التطبيق أو بالخاصية UserScopedSettingAttribute إذا كانت على مستوى المستخدم وهذا ما يفعله مصمم الإعدادات بالضبط وهذا مثال من كود مولد بواسطة المصمم

Partial NotInheritable Class MySettings
    Inherits System.Configuration.ApplicationSettingsBase

    <System.Diagnostics.DebuggerNonUserCode(),  _
     System.Configuration.UserScopedSettingAttribute(),  _
     System.Configuration.DefaultSettingValueAttribute("400, 400")>  _
    Public Property FormSize() As System.Drawing.Size
        Get
            Return CType(Me("FormSize"),System.Drawing.Size)
        End Get
        Set
            Me("FormSize") = value
        End Set
    End Property
    
    <System.Diagnostics.DebuggerNonUserCode(),  _
     System.Configuration.SpecialSetting(System.Configuration.SpecialSetting.ConnectionString),  _
     System.Configuration.ApplicationScopedSettingAttribute(),  _
     System.Configuration.DefaultSettingValueAttribute("Server=TABLET; 
User ID=sa; Password=1234; Database=Northwind; Persist Security In"& _ 
        "fo=True")>  _
    Public ReadOnly Property ConnectionString() As String
        Get
            Return CType(Me("ConnectionString"),String)
        End Get
    End Property
    
    <System.Diagnostics.DebuggerNonUserCode(),  _
     System.Configuration.ApplicationScopedSettingAttribute(),  _
     System.Configuration.DefaultSettingValueAttribute("192.168.2.11")>  _
    Public ReadOnly Property SMTPServerIP() As String
        Get
            Return CType(Me("SMTPServerIP"),String)
        End Get
    End Property
...

ويمكنك ملاحظة ان الـ ConnectionString محاط بالخاصية SpecialSetting التي يكون لها قسم خاص في ملف الإعدادات كما تجدر ملاحظة Partial class في بداية التعريف مما يعني أنه يمكنك إنشاء ملف جديد في مشروعك وتضمينه جزء آخر من أحد الفئات Class في مشروعك وبهذه التقنية يمكنك تعديل إعداداتك دون تعديل الكود المنشأ بواسطة المصمم ويمكنك إضافة معالجة للأحداث في هذه الفئة والتي تمنحك دقة أكبر في التحكم بهذه الاعدادات وهذه الأحداث هي SettingChanging و SettingsSaving و PropertyChanging

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#2

ممتاز اخوي الكريم

سؤال لوسمجت

كيف يمكن ان اجعل الاعدادات هنا تغير على كل البرنامج بأمر واحد يعني لو غيرت حجم الفورم هل يجب اني في كل فورم اقوم باستدعاء القيمة واعمل لها اعدادات في نفس النموذج

او يمكن ان اقراها مرة واحده واجعل القيمة مطبقة على مستوى كل النموذج؟؟

مثل اختيار اللغة للبرنامج !!

<span style='color:green'>سؤل ابن عباس عن علمه كيف جمعه فقال :( أوتيت لسانا سؤولا وقلبا عقولا)</span>

#3

اخ Romantic_touch

ما بعرف إذا فهمت قصدك

بس وقت بتربط أي خاصية مع إعداد من Property Binding بشكل عام فإنك عندما تغير قيمة هذه الخاصية فإن قيمة الخاصية الجديدة يتم تخزينها تلقائيا بشكل عام واستعادتها تلقائيا عند تحميل الفورم

جرب اعمل مشروع Windows Application و ضع عليه Text Box ثم اربط الخاصية Text مع Setting معين من اختيارك من نافذة Properties ثم ApplicationSettins ثم Property binding ولا تكتب أي سطر كود في البرنامج نهائيا

شغل المشروع و اكتب أي شئ في text box الموجود ثم أغلق البرنامج وارجاع شغله بتلاحظ أن صندوق النصوص دائما يعيد لك آخر شئ كتبته فيه يعني الخصائص المرتبطة بالتحكمات بتنحفظ و بتتحمل تلقائيا بدون ما تعمل شي

بس ما جربت اربط نفس الاعداد لأكثر من تحكم على كل حال لا يوجد شئ يمنعك من التجربة

تم تعديل هذه المشاركة بواسطة samerselo في 21 مارس 2006 في 22:10

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#4

شوف المثال المرفق

نفس الاقتراح الأخير حول تجربة صندوق النصوص

طبعا بتضل بتقدر تستخدم الاعداد برمجيا مع انو مربوط اوتوماتيك مع الخاصية وبينحفظ وبيتحمل لوحده وبدون ما تأثر على ما قلناه سابقا عند الحاجة مثال

        ' تغيير القيمة
        My.Settings.Text_Text = "Some Thing"
        ' حفظ القيمة
        My.Settings.Save()
        ' قراءة القيمة
        MsgBox(My.Settings.Text_Text)

أرجو أن أكون قد وفقت لإجابتك

TestText.zip

تم تعديل هذه المشاركة بواسطة samerselo في 21 مارس 2006 في 22:14

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#5

أشكرك أستاذنا الكريم على هذا الشرح الوافي

و أو أن أستفسر

لدي قاعدة بيانات و يختلف مسارها من جهاز إلى آخر و لكن بالنسبة للمستخدمين على نفس الجهاز سيكون نفس المسار

و في بداية البرنامج إذل لم يجد قاعدة البيانات في المسار الإفتراضي فإنه ينبه المستخدم لتحديد مسار قاعدة البيانات و من المفترض أن يقوم البرنامج بحفظ المسار الجديد ليكون هو الإفتراضي الجديد و سؤالي:

- لو حفظت هذه الإعدادات على مستوى المستخدم فسوف يسأل كل مستخدم جديد عن المسار و هذا ما لا أريده.

- لا أستطيع أن أحفظ على مستوى التطبيق لأنه للقراءة فقط.

- لا أستطيع أن أحفظ على الريجستري لأني غير متمكن من التعامل معها حتى الآن.

شكرا و أعتذر عن الإطالة.

اللهم اغفر لي و لوالدي و للمؤمنين يوم يقوم الحساب

لا إله إلا الله عدد ما كان و عدد ما يكون و عدد الحركات و السكون

#6

ماشاء الله على هذه المعلومات القيمة بانتظار المزيد

1

هذا الموضوع مغلق.

مواضيع مشابهة